From 7fe2172f050dceec1ae5a5851935ac01f4d45ee4 Mon Sep 17 00:00:00 2001 From: Marc Ducobu Date: Fri, 5 Nov 2021 14:53:51 +0100 Subject: [PATCH 01/12] DocGeneratorTemplate use StoredObject for storign the template --- .../Entity/DocGeneratorTemplate.php | 13 ++++--- .../Form/DocGeneratorTemplateType.php | 14 ++++++- .../Admin/DocGeneratorTemplate/edit.html.twig | 9 +++++ .../DocGeneratorTemplate/index.html.twig | 8 +++- .../Admin/DocGeneratorTemplate/new.html.twig | 9 +++++ .../migrations/Version20211103111010.php | 39 +++++++++++++++++++ 6 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 src/Bundle/ChillDocGeneratorBundle/migrations/Version20211103111010.php diff --git a/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php b/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php index 75edbcbdf..753ca9cd5 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php +++ b/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php @@ -13,6 +13,7 @@ namespace Chill\DocGeneratorBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Serializer\Annotation as Serializer; +use Chill\DocStoreBundle\Entity\StoredObject; /** * @ORM\Entity @@ -46,9 +47,9 @@ class DocGeneratorTemplate private array $entities = []; /** - * @ORM\Column(type="string", length=255) + * @ORM\ManyToOne(targetEntity=StoredObject::class, cascade={"persist"}).) */ - private string $file; + private ?StoredObject $file = null; /** * @ORM\Id @@ -57,6 +58,7 @@ class DocGeneratorTemplate * @Serializer\Groups({"read"}) */ private int $id; + /** * @ORM\Column(type="json") @@ -79,7 +81,7 @@ class DocGeneratorTemplate return $this->entities; } - public function getFile(): ?string + public function getFile(): ?StoredObject { return $this->file; } @@ -89,10 +91,11 @@ class DocGeneratorTemplate return $this->id; } - public function getName(): ?array + public function getName(): ?array { return $this->name; } + public function setContext(string $context): self { @@ -115,7 +118,7 @@ class DocGeneratorTemplate return $this; } - public function setFile(string $file): self + public function setFile(StoredObject $file): self { $this->file = $file; diff --git a/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php b/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php index 75d33d0e5..3da397be9 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php +++ b/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php @@ -14,8 +14,10 @@ namespace Chill\DocGeneratorBundle\Form; use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate; use Chill\MainBundle\Form\Type\TranslatableStringFormType; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use Chill\DocStoreBundle\Form\StoredObjectType; class DocGeneratorTemplateType extends AbstractType { @@ -25,8 +27,18 @@ class DocGeneratorTemplateType extends AbstractType ->add('name', TranslatableStringFormType::class, [ 'label' => 'Nom', ]) + ->add('context') + ->add('entities', ChoiceType::class, [ + 'multiple' => true, + 'choices' => [ + 'AccompanyingPeriod' => 'Chill\PersonBundle\Entity\AccompanyingPeriod', + 'SocialWork\SocialAction' => 'Chill\PersonBundle\Entity\SocialWork\SocialAction' + ]]) ->add('description') - ->add('file'); + ->add('file', StoredObjectType::class, [ + 'error_bubbling' => true + ]) + ; } public function configureOptions(OptionsResolver $resolver) diff --git a/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/edit.html.twig b/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/edit.html.twig index 040dea1c0..81af0037d 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/edit.html.twig +++ b/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/edit.html.twig @@ -10,3 +10,12 @@ {% block content_form_actions_save_and_show %}{% endblock %} {% endembed %} {% endblock %} + +{% block js %} + {{ parent() }} + {{ encore_entry_script_tags('mod_async_upload') }} +{% endblock %} + +{% block css %} + {{ encore_entry_link_tags('mod_async_upload') }} +{% endblock %} diff --git a/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/index.html.twig b/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/index.html.twig index c601b8836..2cedff190 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/index.html.twig +++ b/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/index.html.twig @@ -5,7 +5,7 @@ {% block table_entities_thead_tr %} {{ 'Title'|trans }} - {{ 'File'|trans }} + {{ 'Edit'|trans }} {% endblock %} {% block table_entities_tbody %} @@ -13,7 +13,11 @@ {{ entity.id }} {{ entity.name | localize_translatable_string }} - {{ entity.file }} + + + {{ 'Edit'|trans }} + + {% endfor %} {% endblock %} diff --git a/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/new.html.twig b/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/new.html.twig index f31ac39c9..064d45418 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/new.html.twig +++ b/src/Bundle/ChillDocGeneratorBundle/Resources/views/Admin/DocGeneratorTemplate/new.html.twig @@ -9,3 +9,12 @@ {% block content_form_actions_save_and_show %}{% endblock %} {% endembed %} {% endblock %} + +{% block js %} + {{ parent() }} + {{ encore_entry_script_tags('mod_async_upload') }} +{% endblock %} + +{% block css %} + {{ encore_entry_link_tags('mod_async_upload') }} +{% endblock %} diff --git a/src/Bundle/ChillDocGeneratorBundle/migrations/Version20211103111010.php b/src/Bundle/ChillDocGeneratorBundle/migrations/Version20211103111010.php new file mode 100644 index 000000000..f3f6b32d0 --- /dev/null +++ b/src/Bundle/ChillDocGeneratorBundle/migrations/Version20211103111010.php @@ -0,0 +1,39 @@ +addSql('ALTER TABLE chill_docgen_template ADD file_id INT DEFAULT NULL'); + $this->addSql('ALTER TABLE chill_docgen_template DROP file'); + $this->addSql('ALTER TABLE chill_docgen_template ALTER entities SET NOT NULL'); + $this->addSql('ALTER TABLE chill_docgen_template ALTER context SET NOT NULL'); + $this->addSql('ALTER TABLE chill_docgen_template ADD CONSTRAINT FK_49A347E893CB796C FOREIGN KEY (file_id) REFERENCES chill_doc.stored_object (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('CREATE INDEX IDX_49A347E893CB796C ON chill_docgen_template (file_id)'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE chill_docgen_template DROP CONSTRAINT FK_49A347E893CB796C'); + $this->addSql('DROP INDEX IDX_49A347E893CB796C'); + $this->addSql('ALTER TABLE chill_docgen_template ADD file VARCHAR(255) NOT NULL'); + $this->addSql('ALTER TABLE chill_docgen_template DROP file_id'); + $this->addSql('ALTER TABLE chill_docgen_template ALTER entities DROP NOT NULL'); + $this->addSql('ALTER TABLE chill_docgen_template ALTER context DROP NOT NULL'); + } +} From a3333c33021a3b4d6cc61d7a646696d6d2243d8e Mon Sep 17 00:00:00 2001 From: Marc Ducobu Date: Fri, 19 Nov 2021 11:06:29 +0100 Subject: [PATCH 02/12] Fix LoadDocGeneratorTemplate (using docstore obj) --- .../ORM/LoadDocGeneratorTemplate.php | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php b/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php index 082605fd7..293978718 100644 --- a/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php +++ b/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php @@ -14,7 +14,6 @@ namespace Chill\DocGeneratorBundle\DataFixtures\ORM; use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate; use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation; use Doctrine\Common\DataFixtures\AbstractFixture; - use Doctrine\Persistence\ObjectManager; /** @@ -28,13 +27,23 @@ class LoadDocGeneratorTemplate extends AbstractFixture [ 'name' => ['fr' => 'FORMULAIRE AEB'], 'desc' => 'stocké sur openstack comedienbe', - 'file' => 'FORMULAIRE_AEB_WITH_DATA_INJ.docx', + 'file' => [ + 'filename' => 'mg01Dz3Cn2Erhi1zK8ACN2', + 'key' => '{"alg":"A256CBC","ext":true,"k":"xTd3HIVeFv2Hm7zdkJ4F6XjCO_e-_7Vg9G07s475hX8","key_ops":["encrypt","decrypt"],"kty":"oct"}', + 'iv' => '[178,160,11,24,15,224,208,42,93,171,74,253,78,105,238,136]', + 'type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' + ], 'context' => 'Chill\DocGeneratorBundle\Context\HouseholdMemberSelectionContext', 'entities' => [AccompanyingPeriodWorkEvaluation::class], ], [ 'name' => ['fr' => 'AIDE ALIMENTAIRE'], 'desc' => 'stocké sur openstack comedienbe', - 'file' => 'AIDE_ALIMENTAIRE.docx', + 'file' => [ + 'filename' => 'pKNlhCrQDCRsAuC8vYHDKa', + 'key' => '{"alg":"A256CBC","ext":true,"k":"_VihnD41-VDHlpS-ouwtbMPnu-OXVdtA7ENQWWtAQYM","key_ops":["encrypt","decrypt"],"kty":"oct"}', + 'iv' => '[86,231,83,148,117,107,149,173,130,19,105,194,224,145,8,48]', + 'type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' + ], 'context' => 'Chill\DocGeneratorBundle\Context\HouseholdMemberSelectionContext', 'entities' => ['Chill\PersonBundle\Entity\AccompanyingPeriod', 'Chill\PersonBundle\Entity\SocialWork\SocialAction', AccompanyingPeriodWorkEvaluation::class], ], @@ -43,10 +52,19 @@ class LoadDocGeneratorTemplate extends AbstractFixture foreach ($templates as $template) { echo 'Adding doc generator templates ' . $template['file'] . ")\n"; + $newStoredObj = (new StoredObject()) + ->setFilename($template['file']['filename']) + ->setKeyInfos(json_decode($template['file']['key'], true)) + ->setIv(json_decode($template['file']['iv'], true)) + ->setCreationDate(new \DateTime('today')) + ->setType($template['file']['type']); + + $manager->persist($newStoredObj); + $newTemplate = (new DocGeneratorTemplate()) ->setName($template['name']) ->setDescription($template['desc']) - ->setFile($template['file']) + ->setFile($newStoredObj) ->setContext($template['context']) ->setEntities($template['entities']); From 1bf595334e4835d28a7e34cb0706cbe4c289d8bb Mon Sep 17 00:00:00 2001 From: Marc Ducobu Date: Fri, 19 Nov 2021 11:08:28 +0100 Subject: [PATCH 03/12] Adding AccompanyingPeriodWorkEvaluation in the choices of DocGenerator config form (admin) --- .../ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php b/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php index 3da397be9..f1f587d76 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php +++ b/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php @@ -18,6 +18,7 @@ use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Chill\DocStoreBundle\Form\StoredObjectType; +use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation; class DocGeneratorTemplateType extends AbstractType { @@ -32,7 +33,8 @@ class DocGeneratorTemplateType extends AbstractType 'multiple' => true, 'choices' => [ 'AccompanyingPeriod' => 'Chill\PersonBundle\Entity\AccompanyingPeriod', - 'SocialWork\SocialAction' => 'Chill\PersonBundle\Entity\SocialWork\SocialAction' + 'SocialWork\SocialAction' => 'Chill\PersonBundle\Entity\SocialWork\SocialAction', + 'AccompanyingPeriod\AccompanyingPeriodWorkEvaluation' => AccompanyingPeriodWorkEvaluation::class ]]) ->add('description') ->add('file', StoredObjectType::class, [ From a7af7e7874d38d0e00181102380c685dc600e830 Mon Sep 17 00:00:00 2001 From: Marc Ducobu Date: Fri, 19 Nov 2021 14:19:41 +0100 Subject: [PATCH 04/12] php-decrypt data crypted using js --- .../DocGeneratorTemplateController.php | 55 +++++++++++++++---- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php index f517a7cc6..803da218e 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php +++ b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php @@ -26,6 +26,10 @@ use PhpOffice\PhpWord\TemplateProcessor; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\HeaderUtils; +use ChampsLibres\AsyncUploaderBundle\TempUrl\TempUrlOpenstackGenerator; +use Jose\Component\Core\JWK; +use Base64Url\Base64Url; // TODO à mettre dans services use Symfony\Component\HttpFoundation\Response; @@ -48,11 +52,39 @@ class DocGeneratorTemplateController extends AbstractController ): Response { $getUrlGen = $tempUrlGenerator->generate( 'GET', - $template->getFile() - ); + $template->getFile()->getFilename()); - $tmpfname = tempnam(sys_get_temp_dir(), 'DOC_TEMPLATE'); - file_put_contents($tmpfname, file_get_contents($getUrlGen->url)); + $data = file_get_contents($getUrlGen->url); + + $iv = $template->getFile()->getIv(); // iv as an Array + $ivGoodFormat = pack('C*', ...$iv); // iv as a String (ok for openssl_decrypt) + + $method = 'AES-256-CBC'; + + $key = $template->getFile()->getKeyInfos()['k']; + $keyGoodFormat = Base64Url::decode($key); + + $dataDecrypted = openssl_decrypt($data, $method, $keyGoodFormat, 1, $ivGoodFormat); + + if ($dataDecrypted === FALSE) { + throw new \Exception("Error during Decrypt ", 1); + } + + $tmpfnameDeCrypted = tempnam(sys_get_temp_dir(), 'DECRYPT_DOC_TEMPLATE'); + + if (!$handle = fopen($tmpfnameDeCrypted, 'a')) { + echo "Cannot open file ($tmpfnameDeCrypted)"; + exit; + } + + if (fwrite($handle, $dataDecrypted) === FALSE) { + echo "Cannot write to file ($tmpfnameDeCrypted)"; + exit; + } + + dump("Success, wrote ($dataDecrypted) to file ($tmpfnameDeCrypted)"); + + fclose($handle); $entity = $this->getDoctrine()->getRepository($entityClassName)->find($entityId); @@ -63,7 +95,7 @@ class DocGeneratorTemplateController extends AbstractController throw new Exception('Not implemented', 1); } - $templateProcessor = new TemplateProcessor($tmpfname); + $templateProcessor = new TemplateProcessor($tmpfnameDeCrypted); foreach ($datas['setValues'] as $setValuesConf) { $templateProcessor->setValues($setValuesConf); @@ -73,12 +105,10 @@ class DocGeneratorTemplateController extends AbstractController $templateProcessor->cloneRowAndSetValues($cloneRowAndSetValues[0], $cloneRowAndSetValues[1]); } - $tmpfname2 = tempnam(sys_get_temp_dir(), 'DOC_GENERATED'); - $templateProcessor->saveAs($tmpfname2); + $tmpfnameGenerated = tempnam(sys_get_temp_dir(), 'DOC_GENERATED'); + $templateProcessor->saveAs($tmpfnameGenerated); - unlink($tmpfname); - - $fileContent = fopen($tmpfname2, 'rb'); // the generated file content + $fileContent = fopen($tmpfnameGenerated, 'rb'); // the generated file content $genDocName = 'doc_' . sprintf('%010d', mt_rand()) . '.docx'; @@ -87,7 +117,8 @@ class DocGeneratorTemplateController extends AbstractController $genDocName ); - unlink($tmpfname2); + unlink($tmpfnameDeCrypted); + unlink($tmpfnameGenerated); $client = new Client(); @@ -128,7 +159,7 @@ class DocGeneratorTemplateController extends AbstractController } throw new Exception('Unable to generate document.'); - } + } /** * @Route( From 847e610362a93a5cf1764997d139bfde2b4438ea Mon Sep 17 00:00:00 2001 From: Marc Ducobu Date: Fri, 19 Nov 2021 14:20:12 +0100 Subject: [PATCH 05/12] Good values to point to a doc file --- .../DataFixtures/ORM/LoadDocGeneratorTemplate.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php b/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php index 293978718..cb7e7b027 100644 --- a/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php +++ b/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php @@ -28,9 +28,9 @@ class LoadDocGeneratorTemplate extends AbstractFixture 'name' => ['fr' => 'FORMULAIRE AEB'], 'desc' => 'stocké sur openstack comedienbe', 'file' => [ - 'filename' => 'mg01Dz3Cn2Erhi1zK8ACN2', - 'key' => '{"alg":"A256CBC","ext":true,"k":"xTd3HIVeFv2Hm7zdkJ4F6XjCO_e-_7Vg9G07s475hX8","key_ops":["encrypt","decrypt"],"kty":"oct"}', - 'iv' => '[178,160,11,24,15,224,208,42,93,171,74,253,78,105,238,136]', + 'filename' => 'pKNlhCrQDCRsAuC8vYHDKa', + 'key' => '{"alg":"A256CBC","ext":true,"k":"_VihnD41-VDHlpS-ouwtbMPnu-OXVdtA7ENQWWtAQYM","key_ops":["encrypt","decrypt"],"kty":"oct"}', + 'iv' => '[86,231,83,148,117,107,149,173,130,19,105,194,224,145,8,48]', 'type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ], 'context' => 'Chill\DocGeneratorBundle\Context\HouseholdMemberSelectionContext', From 2b01179967abaaafff997794ab4d699bf6867aef Mon Sep 17 00:00:00 2001 From: Marc Ducobu Date: Fri, 5 Nov 2021 14:53:51 +0100 Subject: [PATCH 06/12] DocGeneratorTemplate use StoredObject for storign the template --- .../ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php | 5 +++++ .../Form/DocGeneratorTemplateType.php | 1 + 2 files changed, 6 insertions(+) diff --git a/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php b/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php index 753ca9cd5..c1cdeca74 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php +++ b/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php @@ -66,6 +66,11 @@ class DocGeneratorTemplate */ private array $name = []; + /** + * @ORM\ManyToOne(targetEntity=StoredObject::class, cascade={"persist"}).) + */ + private ?StoredObject $file = null; + public function getContext(): ?string { return $this->context; diff --git a/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php b/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php index f1f587d76..6323d8ebf 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php +++ b/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php @@ -19,6 +19,7 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Chill\DocStoreBundle\Form\StoredObjectType; use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation; +use Chill\MainBundle\Form\Type\TranslatableStringFormType; class DocGeneratorTemplateType extends AbstractType { From 4e56075fdcb8a6e741333749d25238d5c311fd26 Mon Sep 17 00:00:00 2001 From: Marc Ducobu Date: Fri, 19 Nov 2021 14:24:37 +0100 Subject: [PATCH 07/12] Removing unused deps --- .../Controller/DocGeneratorTemplateController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php index 803da218e..d609995da 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php +++ b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php @@ -18,9 +18,9 @@ use Chill\DocGeneratorBundle\Repository\DocGeneratorTemplateRepository; use Chill\DocStoreBundle\Entity\StoredObject; use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation; use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument; -use Chill\PersonBundle\Entity\SocialWork\Evaluation; -use Exception; + use GuzzleHttp\Client; + use GuzzleHttp\Exception\TransferException; use PhpOffice\PhpWord\TemplateProcessor; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; @@ -92,7 +92,7 @@ class DocGeneratorTemplateController extends AbstractController $context = new HouseholdMemberSelectionContext(); $datas = $context->getData($entity); } else { - throw new Exception('Not implemented', 1); + throw new \Exception('Not implemented', 1); } $templateProcessor = new TemplateProcessor($tmpfnameDeCrypted); From 9fa2e80d8162a6cfda081d03555973d54177e575 Mon Sep 17 00:00:00 2001 From: marcu Date: Fri, 26 Nov 2021 17:25:21 +0100 Subject: [PATCH 08/12] Debug : redeclaration of a varaible --- .../ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php b/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php index c1cdeca74..753ca9cd5 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php +++ b/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php @@ -66,11 +66,6 @@ class DocGeneratorTemplate */ private array $name = []; - /** - * @ORM\ManyToOne(targetEntity=StoredObject::class, cascade={"persist"}).) - */ - private ?StoredObject $file = null; - public function getContext(): ?string { return $this->context; From 59a0b692ac18872d2aa209daa549e7bf4361a56d Mon Sep 17 00:00:00 2001 From: marcu Date: Fri, 26 Nov 2021 17:39:51 +0100 Subject: [PATCH 09/12] Fix load fixtures (LoadDocGeneratorTemplates) --- .../DataFixtures/ORM/LoadDocGeneratorTemplate.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php b/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php index cb7e7b027..af8915df7 100644 --- a/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php +++ b/src/Bundle/ChillDocGeneratorBundle/DataFixtures/ORM/LoadDocGeneratorTemplate.php @@ -15,6 +15,7 @@ use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate; use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation; use Doctrine\Common\DataFixtures\AbstractFixture; use Doctrine\Persistence\ObjectManager; +use Chill\DocStoreBundle\Entity\StoredObject; /** * Load DocGeneratorTemplate. From d026be3041dcedfd219e9bf99af3b23a5215babb Mon Sep 17 00:00:00 2001 From: marcu Date: Tue, 30 Nov 2021 10:42:54 +0100 Subject: [PATCH 10/12] Create new layer + convert in good crs --- .../Controller/DocGeneratorTemplateController.php | 13 +++++++++++-- .../ChillDocGeneratorBundle/config/services.yaml | 5 +++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php index d609995da..35ea454d2 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php +++ b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php @@ -31,12 +31,21 @@ use ChampsLibres\AsyncUploaderBundle\TempUrl\TempUrlOpenstackGenerator; use Jose\Component\Core\JWK; use Base64Url\Base64Url; +use Symfony\Component\HttpKernel\HttpKernelInterface; + // TODO à mettre dans services use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class DocGeneratorTemplateController extends AbstractController { + protected $kernel; + + public function __construct(HttpKernelInterface $kernel) + { + $this->kernel = $kernel; + } + /** * @Route( * "{_locale}/doc/gen/generate/from/{template}/for/{entityClassName}/{entityId}", @@ -70,7 +79,7 @@ class DocGeneratorTemplateController extends AbstractController throw new \Exception("Error during Decrypt ", 1); } - $tmpfnameDeCrypted = tempnam(sys_get_temp_dir(), 'DECRYPT_DOC_TEMPLATE'); + $tmpfnameDeCrypted = tempnam($this->kernel->getCacheDir(), 'DECRYPT_DOC_TEMPLATE'); // plus ou moins if (!$handle = fopen($tmpfnameDeCrypted, 'a')) { echo "Cannot open file ($tmpfnameDeCrypted)"; @@ -105,7 +114,7 @@ class DocGeneratorTemplateController extends AbstractController $templateProcessor->cloneRowAndSetValues($cloneRowAndSetValues[0], $cloneRowAndSetValues[1]); } - $tmpfnameGenerated = tempnam(sys_get_temp_dir(), 'DOC_GENERATED'); + $tmpfnameGenerated = tempnam($this->kernel->getCacheDir(), 'DOC_GENERATED'); $templateProcessor->saveAs($tmpfnameGenerated); $fileContent = fopen($tmpfnameGenerated, 'rb'); // the generated file content diff --git a/src/Bundle/ChillDocGeneratorBundle/config/services.yaml b/src/Bundle/ChillDocGeneratorBundle/config/services.yaml index 6d87dbd25..6e66115fc 100644 --- a/src/Bundle/ChillDocGeneratorBundle/config/services.yaml +++ b/src/Bundle/ChillDocGeneratorBundle/config/services.yaml @@ -15,3 +15,8 @@ services: resource: '../Serializer/Normalizer/' tags: - { name: 'serializer.normalizer', priority: -152 } + + Chill\DocGeneratorBundle\Controller\: + resource: "../Controller" + autowire: true + autoconfigure: true From 2993dab3f7b19274a1cd23a1315a405643e9a64f Mon Sep 17 00:00:00 2001 From: marcu Date: Tue, 30 Nov 2021 12:30:04 +0100 Subject: [PATCH 11/12] Debug using KernelInterface instead HttpKernelInterface --- .../Controller/DocGeneratorTemplateController.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php index 35ea454d2..510d5a483 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php +++ b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php @@ -31,17 +31,17 @@ use ChampsLibres\AsyncUploaderBundle\TempUrl\TempUrlOpenstackGenerator; use Jose\Component\Core\JWK; use Base64Url\Base64Url; -use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Component\HttpKernel\KernelInterface; // TODO à mettre dans services use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; -class DocGeneratorTemplateController extends AbstractController +final class DocGeneratorTemplateController extends AbstractController { - protected $kernel; + private KernelInterface $kernel; - public function __construct(HttpKernelInterface $kernel) + public function __construct(KernelInterface $kernel) { $this->kernel = $kernel; } From 0e88d7c549a4a46dd69f4148c16033858220e25f Mon Sep 17 00:00:00 2001 From: marcu Date: Tue, 30 Nov 2021 14:46:21 +0100 Subject: [PATCH 12/12] Using HttpClientInterface instead of file_get_contents --- .../Controller/DocGeneratorTemplateController.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php index 510d5a483..fc494390e 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php +++ b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php @@ -37,13 +37,17 @@ use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; +use Symfony\Contracts\HttpClient\HttpClientInterface; + final class DocGeneratorTemplateController extends AbstractController { private KernelInterface $kernel; + private HttpClientInterface $client; - public function __construct(KernelInterface $kernel) + public function __construct(KernelInterface $kernel, HttpClientInterface $client) { $this->kernel = $kernel; + $this->client = $client; } /** @@ -63,7 +67,7 @@ final class DocGeneratorTemplateController extends AbstractController 'GET', $template->getFile()->getFilename()); - $data = file_get_contents($getUrlGen->url); + $data = $this->client->request('GET', $getUrlGen->url); $iv = $template->getFile()->getIv(); // iv as an Array $ivGoodFormat = pack('C*', ...$iv); // iv as a String (ok for openssl_decrypt) @@ -73,7 +77,7 @@ final class DocGeneratorTemplateController extends AbstractController $key = $template->getFile()->getKeyInfos()['k']; $keyGoodFormat = Base64Url::decode($key); - $dataDecrypted = openssl_decrypt($data, $method, $keyGoodFormat, 1, $ivGoodFormat); + $dataDecrypted = openssl_decrypt($data->getContent(), $method, $keyGoodFormat, 1, $ivGoodFormat); if ($dataDecrypted === FALSE) { throw new \Exception("Error during Decrypt ", 1);