From 64f631488883108460b54ef79e682fa0f96d1e4f Mon Sep 17 00:00:00 2001 From: Quentin RIBAC <quentin.ribac@xelians.fr> Date: Mon, 10 Oct 2022 15:30:22 +0200 Subject: [PATCH] FIX #22030 TIME 0:30 allow multisign with RGS** timestamped --- .../CertificateSignatureController.php | 8 +++---- .../DigitalSignatureController.php | 6 +++--- .../controllers/DocumentController.php | 21 ++++++++++++------- src/app/workflow/models/WorkflowModel.php | 17 +++++++++++++++ 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/app/document/controllers/CertificateSignatureController.php b/src/app/document/controllers/CertificateSignatureController.php index d1965716ab..6b82469702 100755 --- a/src/app/document/controllers/CertificateSignatureController.php +++ b/src/app/document/controllers/CertificateSignatureController.php @@ -264,10 +264,10 @@ class CertificateSignatureController ]); } - if ($args['lastStep']) { - if ($args['signatureMode'] == 'rgs_2stars_timestamped') { - DigitalSignatureController::terminate(['config' => $config, 'transactionId' => $document['digital_signature_transaction_id']]); - } + if ($args['lastUserStep'] && $args['lastWorkflowStep'] && $args['signatureMode'] == 'rgs_2stars_timestamped') { + DigitalSignatureController::terminate(['config' => $config, 'transactionId' => $document['digital_signature_transaction_id']]); + } + if ($args['lastUserStep'] || $args['signatureMode'] == 'rgs_2stars_timestamped') { $storeInfos = DocserverController::storeResourceOnDocServer([ 'encodedFile' => base64_encode(file_get_contents($signedDocumentPath)), 'format' => 'pdf', diff --git a/src/app/document/controllers/DigitalSignatureController.php b/src/app/document/controllers/DigitalSignatureController.php index b240981878..5c64a46c1f 100755 --- a/src/app/document/controllers/DigitalSignatureController.php +++ b/src/app/document/controllers/DigitalSignatureController.php @@ -34,7 +34,7 @@ class DigitalSignatureController $nbSignatories = 0; foreach ($args['workflow'] as $key => $currentUserId) { - if (in_array($currentUserId['signature_mode'], ['eidas', 'inca_card_eidas'])) { + if (in_array($currentUserId['signature_mode'], ['eidas', 'inca_card_eidas', 'rgs_2stars_timestamped'])) { $nbSignatories++; } else { unset($args['workflow'][$key]); @@ -279,8 +279,8 @@ class DigitalSignatureController $workflow = WorkflowModel::get([ 'select' => [1], - 'where' => ['mode = ?', 'main_document_id = ?', 'digital_signature_id != ?', 'process_date is null'], - 'data' => ['sign', $args['documentId'], $args['signatureId']] + 'where' => ['mode = ?', 'main_document_id = ?', "(digital_signature_id in ('1', '2') or digital_signature_id != ?)", 'process_date is null', 'id != ?'], + 'data' => ['sign', $args['documentId'], $args['signatureId'], $args['workflowId']] ]); if (empty($workflow) && $args['isLastSignature']) { diff --git a/src/app/document/controllers/DocumentController.php b/src/app/document/controllers/DocumentController.php index 61d48e6cc6..462216f71d 100755 --- a/src/app/document/controllers/DocumentController.php +++ b/src/app/document/controllers/DocumentController.php @@ -992,9 +992,9 @@ class DocumentController } if (DocumentController::ACTIONS[$args['actionId']] == 'VAL' && in_array($workflow['signature_mode'], ['rgs_2stars', 'rgs_2stars_timestamped', 'inca_card', 'inca_card_eidas'])) { - $lastStep = false; + $lastUserStep = false; if (empty($body['signatures']) || count($body['signatures']) == 1) { - $lastStep = true; + $lastUserStep = true; } $return = CertificateSignatureController::signDocument([ 'id' => $args['id'], @@ -1004,14 +1004,15 @@ class DocumentController 'hashSignature' => $body['hashSignature'], 'signatureMode' => $workflow['signature_mode'], 'tmpUniqueId' => $body['tmpUniqueId'] ?? null, - 'lastStep' => $lastStep + 'lastUserStep' => $lastUserStep, + 'lastWorkflowStep' => WorkflowModel::isLastStep(['id' => $workflow['id']]) ]); if (!empty($return['errors'])) { return $response->withStatus(400)->withJson($return); } - if (!$lastStep) { + if (!$lastUserStep) { return $response->withStatus(206)->withJson(['tmpUniqueId' => $body['tmpUniqueId']]); - } elseif ($lastStep && !empty($body['signatures'])) { + } elseif (!empty($body['signatures'])) { $storeInfos = DocserverController::storeResourceOnDocServer([ 'encodedFile' => base64_encode(file_get_contents("{$tmpPath}tmpSignatureDoc_{$GLOBALS['id']}_{$body['tmpUniqueId']}.pdf")), 'format' => 'pdf', @@ -1099,7 +1100,8 @@ class DocumentController 'filePath' => $imageTmpPath, 'signWidth' => $signWidth ], - 'isLastSignature' => !isset($body['signatures'][$key + 1]) + 'isLastSignature' => !isset($body['signatures'][$key + 1]), + 'workflowId' => $workflow['id'] ]); if (!empty($return['errors'])) { return $response->withStatus(400)->withJson($return); @@ -1110,7 +1112,12 @@ class DocumentController } } if (!$imageSignature) { - $return = DigitalSignatureController::signHashes(['signatureId' => $workflow['digital_signature_id'], 'documentId' => $args['id'], 'isLastSignature' => true]); + $return = DigitalSignatureController::signHashes([ + 'signatureId' => $workflow['digital_signature_id'], + 'documentId' => $args['id'], + 'isLastSignature' => true, + 'workflowId' => $workflow['id'] + ]); if (!empty($return['errors'])) { return $response->withStatus(400)->withJson($return); } diff --git a/src/app/workflow/models/WorkflowModel.php b/src/app/workflow/models/WorkflowModel.php index dbea2341ca..88d0ffee47 100755 --- a/src/app/workflow/models/WorkflowModel.php +++ b/src/app/workflow/models/WorkflowModel.php @@ -102,6 +102,23 @@ class WorkflowModel return $currentStep[0]; } + public static function isLastStep(array $args) + { + ValidatorModel::notEmpty($args, ['id']); + ValidatorModel::intVal($args, ['id']); + + $return = DatabaseModel::select([ + 'select' => [1], + 'table' => ['workflows ws1', 'workflows ws2'], + 'left_join' => ['ws1.main_document_id = ws2.main_document_id'], + 'where' => ['ws1.id = ?', 'ws2.order > ws1.order'], + 'data' => [$args['id']], + 'limit' => 1 + ]); + + return empty($return); + } + public static function getWorkflowWithExternalInfo(array $aArgs) { ValidatorModel::arrayType($aArgs, ['select', 'orderBy', 'where', 'data']); -- GitLab