From a7af7e7874d38d0e00181102380c685dc600e830 Mon Sep 17 00:00:00 2001 From: Marc Ducobu Date: Fri, 19 Nov 2021 14:19:41 +0100 Subject: [PATCH] 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(