From c9efeb09ecf5e16ae4e77f4ec3a1718069ed87bf Mon Sep 17 00:00:00 2001
From: Jean-Laurent <jean-laurent.duzant@xelians.fr>
Date: Wed, 28 Sep 2022 15:00:48 +0200
Subject: [PATCH] FIX #20175 TIME 0:45 document can be signed by any signature
 method depending of workflow

---
 .../controllers/DocumentController.php        | 51 ++++++++++---------
 1 file changed, 27 insertions(+), 24 deletions(-)

diff --git a/src/app/document/controllers/DocumentController.php b/src/app/document/controllers/DocumentController.php
index 071bb7218e..61f1f22b2a 100755
--- a/src/app/document/controllers/DocumentController.php
+++ b/src/app/document/controllers/DocumentController.php
@@ -460,6 +460,7 @@ class DocumentController
 
 
         $hasEidas = false;
+        $hasMetaSignSignature = false;
         $hasElectronicSignature = false;
         foreach ($body['workflow'] as $key => $workflow) {
             $processingUser = null;
@@ -516,17 +517,22 @@ class DocumentController
                     }
                 }
             }
-            if (in_array($workflow['signatureMode'], ['eidas', 'eidas_metasign', 'rgs_2stars_timestamped', 'inca_card_eidas'])) {
+            if (in_array($workflow['signatureMode'], ['eidas', 'rgs_2stars_timestamped', 'inca_card_eidas'])) {
                 $hasEidas = true;
             }
+            if ($workflow['signatureMode'] == 'eidas_metasign' && $workflow['mode'] == 'sign') {
+                $hasMetaSignSignature = true;
+            }
             if ($workflow['signatureMode'] != 'stamp' && $workflow['mode'] == 'sign') {
                 $hasElectronicSignature = true;
             }
         }
 
+
         $libDir    = CoreConfigModel::getLibrariesDirectory();
         $loadedXml = CoreConfigModel::getConfig();
-        if ($loadedXml->docaposteSignature->enable == 'true' && $hasEidas && (empty($libDir) || !is_file($libDir . 'SetaPDF-Signer/library/SetaPDF/Autoload.php'))) {
+        if (($loadedXml->docaposteSignature->enable == 'true' || $loadedXml->metaSignSignature->enable == 'true') && 
+            ($hasEidas || $hasMetaSignSignature) && (empty($libDir) || !is_file($libDir . 'SetaPDF-Signer/library/SetaPDF/Autoload.php'))) {
             return $response->withStatus(500)->withJson(['errors' => 'SetaPDF-Signer library is not installed', 'lang' => 'setAPdfSignerError']);
         }
 
@@ -763,14 +769,18 @@ class DocumentController
             'orderBy' => ['"order" asc']
         ]);
 
-        $workflowSignatureMode = array_column($workflow, 'signature_mode');
-
-        if ($loadedXml->docaposteSignature->enable == 'true' && $hasEidas && !in_array('eidas_metasign', $workflowSignatureMode)) {
+        if ($loadedXml->docaposteSignature->enable == 'true' && $hasEidas) {
             $result = DigitalSignatureController::createTransaction(['documentId' => $id, 'workflow' => $workflow, 'encodedDocument' => $encodedDocument['encodedDocument']]);
             if (!empty($result['errors'])) {
                 return $response->withStatus(500)->withJson(['errors' => $result['errors']]);
             }
         }
+        if ($loadedXml->metaSignSignature->enable == 'true' && $hasMetaSignSignature) {
+            $metaSignInit = MetaSignSignatureController::init();
+            if (!empty($metaSignInit['errors'])) {
+                return $response->withStatus($metaSignInit['code'])->withJson(['errors' => $metaSignInit['errors']]);
+            }
+        }
 
         if (empty($body['workflow'][0]['userId'])) {
             if ($body['workflow'][0]['externalInformations']['type'] == 'yousign') {
@@ -815,7 +825,7 @@ class DocumentController
             }
             require_once($libDir . 'SetaPDF-Signer/library/SetaPDF/Autoload.php');
 
-            if (DocumentController::ACTIONS[$args['actionId']] == 'VAL' && $workflow['signature_mode'] != 'eidas') {
+            if (DocumentController::ACTIONS[$args['actionId']] == 'VAL' && !in_array($workflow['signature_mode'], ['eidas', 'eidas_metasign'])) {
                 $url = UrlController::getCoreUrl();
                 if (strpos($url, 'https://') !== 0) {
                     return $response->withStatus(400)->withJson(['errors' => 'Url is not secured (https needed)', 'lang' => 'securedUrlNeeded']);
@@ -823,19 +833,11 @@ class DocumentController
             }
         }
 
-        if (in_array($workflow['signature_mode'], ['eidas', 'inca_card_eidas'])) {
-            if ($loadedXml->docaposteSignature->enable != 'true') {
-                return $response->withStatus(400)->withJson(['errors' => 'docaposteSignature is disabled', 'lang' => 'docaposteSignatureDisabled']);
-            }
-        } elseif ($workflow['signature_mode'] == 'eidas_metasign') {
-            if ($loadedXml->metaSignSignature->enable != 'true') {
-                return $response->withStatus(400)->withJson(['errors' => 'metaSignSignature is disabled', 'lang' => 'metaSignSignatureDisabled']);
-            }
-
-            $metaSignInit = MetaSignSignatureController::init();
-            if (!empty($metaSignInit['errors'])) {
-                return $response->withStatus($metaSignInit['code'])->withJson(['errors' => $metaSignInit['errors']]);
-            }
+        if (in_array($workflow['signature_mode'], ['eidas', 'inca_card_eidas']) && $loadedXml->docaposteSignature->enable != 'true') {
+            return $response->withStatus(400)->withJson(['errors' => 'docaposteSignature is disabled', 'lang' => 'docaposteSignatureDisabled']);
+        }
+        if ($workflow['signature_mode'] == 'eidas_metasign' && $loadedXml->metaSignSignature->enable != 'true') {
+            return $response->withStatus(400)->withJson(['errors' => 'metaSignSignature is disabled', 'lang' => 'metaSignSignatureDisabled']);
         }
 
         $body = $request->getParsedBody();
@@ -1112,7 +1114,7 @@ class DocumentController
                                     $signPosX  = ($signature['positionX'] * $format['width']) / 100;
                                     $signPosY  = ($signature['positionY'] * $format['height']) / 100;
                                 }
-                                if ($loadedXml->docaposteSignature->enable == 'true' && in_array($workflow['signature_mode'], ['eidas', 'inca_card_eidas'])) {
+                                if ($loadedXml->docaposteSignature->enable == 'true') {
                                     $return = DigitalSignatureController::signHashes([
                                         'signatureId'   => $workflow['digital_signature_id'],
                                         'documentId'    => $args['id'],
@@ -1125,7 +1127,7 @@ class DocumentController
                                         ],
                                         'isLastSignature' => !isset($body['signatures'][$key + 1])
                                     ]);
-                                } else if ($loadedXml->metaSignSignature->enable == 'true' && $workflow['signature_mode'] == 'eidas_metasign') {
+                                } else if ($loadedXml->metaSignSignature->enable == 'true') {
                                     $return = MetaSignSignatureController::signDocument([
                                         'documentId'    => (int) $args['id'],
                                         'signatureInfo' => [
@@ -1146,18 +1148,19 @@ class DocumentController
                         }
                     }
                 }
-                if (!$imageSignature && $loadedXml->docaposteSignature->enable == 'true' && in_array($workflow['signature_mode'], ['eidas', 'inca_card_eidas'])) {
+                if (!$imageSignature && $loadedXml->docaposteSignature->enable == 'true') {
                     $return = DigitalSignatureController::signHashes(['signatureId' => $workflow['digital_signature_id'], 'documentId' => $args['id'], 'isLastSignature' => true]);
                     if (!empty($return['errors'])) {
                         return $response->withStatus(400)->withJson($return);
                     }
-                } else if (!$imageSignature && $loadedXml->metaSignSignature->enable == 'true' && $workflow['signature_mode'] == 'eidas_metasign') {
+                }
+                if (!$imageSignature && $loadedXml->metaSignSignature->enable == 'true') {
                     $return = MetaSignSignatureController::signDocument(['documentId' => (int) $args['id'], 'isLastSignature' => true]);
                     if (!empty($return['errors'])) {
                         return $response->withStatus($return['code'])->withJson(['errors' => $return['errors']]);
                     }
                 }
-            } elseif (DocumentController::ACTIONS[$args['actionId']] == 'REF' && $workflow['mode'] == 'sign' && $loadedXml->docaposteSignature->enable == 'true' && in_array($workflow['signature_mode'], ['eidas', 'inca_card_eidas'])) {
+            } elseif (DocumentController::ACTIONS[$args['actionId']] == 'REF' && $workflow['mode'] == 'sign' && $loadedXml->docaposteSignature->enable == 'true') {
                 $return = DigitalSignatureController::abort(['signatureId' => $workflow['digital_signature_id'], 'documentId' => $args['id']]);
                 if (!empty($return['errors'])) {
                     return $response->withStatus(400)->withJson($return);
-- 
GitLab