Bonjour,
Je rencontre un problème sur mon CI/CD suite à l'ajout d'un packet pour encrypter les données dans ma base de donnée. J'utilise doctrine-encryption-bundle qui fonctionne en local mais lorsque je lance ma commande pour jouer les tests unitaires, j'ai une erreur phpunit.
Schema-Tool failed with Error 'An exception occurred while executing a query: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "COMMENT"
Comme l'indique la documentation, j'ajoute le type encrypte sur la colonne où j'en ai besoin
#[ORM\Column(type: Encrypted::ENCRYPTED)]
#[Groups(['patient:read', 'patient:write', 'patient:full-read'])]
private ?string $firstname = null;
Lorsque je fais un make migration, j'avais ça
$this->addSql('ALTER TABLE patient ALTER firstname TYPE TEXT COMMENT \'(DC2Type:encrypted)\'');
Que j'ai transformé en
$this->addSql('ALTER TABLE patient ALTER firstname TYPE TEXT');
$this->addSql('COMMENT ON COLUMN "patient".firstname IS \'(DC2Type:encrypted)\'');
Sur la première version, lorsque je lançais le d:m:m j'avais une erreur de syntax donc je l'ai modifié.
SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "COMMENT"
LINE 1: ALTER TABLE patient ALTER firstname TYPE TEXT COMMENT '(DC2T...
Dans le deuxième cas, je lance les migrations, ça fonctionne et l'ajout des fixtures également. Mes données sont bien chiffrées et si je fais un
$patient->getFirstname();
J'ai bien une donnée déchiffrée.
Je me demande si cette lib est compatible avec postgresql.
D'ailleurs j'ai oublié de dire que je suis sur symfony6 et postgresql 15
Mon seul problème est de passer mon CI/CD et phpunit...
J'utilisais une autre lib pour le chiffrement mais ça m'a posé pas mal de problème de stabilité en prod donc j'essaie de trouver une autre alternative. Si vous en avez une, je serais intéressé !
---UPDATE---
Bon en cherchant de mon côté, je pense que la lib n'est pas prévue pour fonctionner sous postgres.
J'ai regardé le fichier Encrypted.php
<?php
namespace Gracious\DoctrineEncryptionBundle\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;
class Encrypted extends Type
{
const ENCRYPTED = 'encrypted';
/**
* Gets the SQL declaration snippet for a field of this type.
*
* @param array $fieldDeclaration The field declaration.
* @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform The currently used database platform.
*
* @return string
*/
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform): string
{
return 'TEXT COMMENT \'(DC2Type:encrypted)\'';
}
/**
* Gets the name of this type.
*
* @return string
*/
public function getName()
{
return self::ENCRYPTED;
}
/**
* @param mixed $value
* @param AbstractPlatform $platform
* @return string
*/
public function convertToPHPValue($value, AbstractPlatform $platform) : string
{
if (empty($value)) {
return '';
}
if (!isset($_ENV['ENABLE_ENCRYPTION']) || $_ENV['ENABLE_ENCRYPTION'] === 'false') {
return $value;
}
[$nonce, $encryptedValue] = explode('|', $value);
return sodium_crypto_secretbox_open(sodium_hex2bin($encryptedValue), sodium_hex2bin($nonce), sodium_hex2bin($_ENV['ENCRYPTION_KEY']));
}
/**
* @param mixed $value
* @param AbstractPlatform $platform
* @return mixed
* @throws \Exception
*/
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if (!isset($_ENV['ENABLE_ENCRYPTION']) || $_ENV['ENABLE_ENCRYPTION'] === 'false') {
return $value;
}
if (empty($value)) {
return '';
}
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$key = sodium_hex2bin($_ENV['ENCRYPTION_KEY']);
$encryptedValue = sodium_crypto_secretbox($value, $nonce, $key);
return sodium_bin2hex($nonce).'|'.sodium_bin2hex($encryptedValue);
}
}
La fonction getSQLDeclaration() ne fonctionne pas dans mon cas.
J'ai 2 possibilités, soit je modifie le fonctionnement de cette lib, soit j'en trouve une autre !
J'aimerais partir sur la première, sauf que je ne sais pas comment faire pour dire : Lorsque tu fais un make:migration et que tu as un type Encrypted, ajoute ce code
$this->addSql('COMMENT ON COLUMN patient.firstname IS \'(DC2Type:encrypted)\'');
Est-ce qu'il y a un eventSubscriber pour la génération d'une migration ? Je n'ai pas trouvé une fonction dans la class Type, qui me permettrait de le faire... Pourtant j'ai vu que pour un type DateTimeImmutable le commentaire est bien généré. Il y a sûrement moyen de faire la même chose non ?
Merci d'avance :)