From 571cc8961f45533dcb8c3f8ca427e50cb33f5a46 Mon Sep 17 00:00:00 2001 From: "florian.azizian" <florian.azizian@maarch.org> Date: Tue, 13 Oct 2020 15:24:19 +0200 Subject: [PATCH] FEAT #15052 TIME 1 action check reply and check acknowledgement (Record management) --- .../controllers/ExportSEDATrait.php | 101 ++++++++++++++++++ .../controllers/PreProcessActionSEDATrait.php | 8 +- 2 files changed, 105 insertions(+), 4 deletions(-) diff --git a/src/app/external/exportSeda/controllers/ExportSEDATrait.php b/src/app/external/exportSeda/controllers/ExportSEDATrait.php index c4b667fc7b9..fa5a1089077 100644 --- a/src/app/external/exportSeda/controllers/ExportSEDATrait.php +++ b/src/app/external/exportSeda/controllers/ExportSEDATrait.php @@ -12,6 +12,11 @@ namespace ExportSeda\controllers; +use Attachment\models\AttachmentModel; +use Docserver\models\DocserverModel; +use Docserver\models\DocserverTypeModel; +use MessageExchange\models\MessageExchangeModel; +use Resource\controllers\StoreController; use SrcCore\models\ValidatorModel; trait ExportSEDATrait @@ -40,4 +45,100 @@ trait ExportSEDATrait return ['encodedFile' => $encodedFile]; } + + public static function checkAcknowledgmentRecordManagement(array $args) + { + ValidatorModel::notEmpty($args, ['resId']); + ValidatorModel::intVal($args, ['resId']); + + $acknowledgement = AttachmentModel::get([ + 'select' => ['res_id_master', 'path', 'filename', 'docserver_id', 'fingerprint'], + 'where' => ['res_id_master = ?', 'attachment_type = ?', 'status = ?'], + 'data' => [$args['resId'], 'acknowledgement_record_management', 'TRA'] + ])[0]; + if (empty($acknowledgement)) { + return ['errors' => ['No acknowledgement found']]; + } + + $docserver = DocserverModel::getByDocserverId(['docserverId' => $acknowledgement['docserver_id'], 'select' => ['path_template', 'docserver_type_id']]); + if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) { + return ['errors' => ['Docserver does not exists']]; + } + + $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $acknowledgement['path']) . $acknowledgement['filename']; + if (!file_exists($pathToDocument)) { + return ['errors' => ['File does not exists']]; + } + + $docserverType = DocserverTypeModel::getById(['id' => $docserver['docserver_type_id'], 'select' => ['fingerprint_mode']]); + $fingerprint = StoreController::getFingerPrint(['filePath' => $pathToDocument, 'mode' => $docserverType['fingerprint_mode']]); + if (!empty($acknowledgement['fingerprint']) && $acknowledgement['fingerprint'] != $fingerprint) { + return ['errors' => ['Fingerprint does not match']]; + } + + $acknowledgementXml = @simplexml_load_file($pathToDocument); + if (empty($acknowledgementXml)) { + return ['errors' => ['Acknowledgement is not readable']]; + } + + $messageExchange = MessageExchangeModel::getMessageByReference(['select' => ['message_id'], 'reference' => (string)$acknowledgementXml->MessageReceivedIdentifier]); + if (empty($messageExchange)) { + return ['errors' => ['No acknowledgement found with this reference']]; + } + + $unitIdentifier = MessageExchangeModel::getUnitIdentifierByResId(['select' => ['message_id'], 'resId' => $args['resId']]); + if ($unitIdentifier['message_id'] != $messageExchange['message_id']) { + return ['errors' => ['Wrong acknowledgement']]; + } + + return true; + } + + public static function checkReplyRecordManagement(array $args) + { + ValidatorModel::notEmpty($args, ['resId']); + ValidatorModel::intVal($args, ['resId']); + + $reply = AttachmentModel::get([ + 'select' => ['res_id_master', 'path', 'filename', 'docserver_id', 'fingerprint'], + 'where' => ['res_id_master = ?', 'attachment_type = ?', 'status = ?'], + 'data' => [$args['resId'], 'reply_record_management', 'TRA'] + ])[0]; + if (empty($reply)) { + return ['errors' => ['No reply found']]; + } + + $docserver = DocserverModel::getByDocserverId(['docserverId' => $reply['docserver_id'], 'select' => ['path_template', 'docserver_type_id']]); + if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) { + return ['errors' => ['Docserver does not exists']]; + } + + $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $reply['path']) . $reply['filename']; + if (!file_exists($pathToDocument)) { + return ['errors' => ['File does not exists']]; + } + + $docserverType = DocserverTypeModel::getById(['id' => $docserver['docserver_type_id'], 'select' => ['fingerprint_mode']]); + $fingerprint = StoreController::getFingerPrint(['filePath' => $pathToDocument, 'mode' => $docserverType['fingerprint_mode']]); + if (!empty($reply['fingerprint']) && $reply['fingerprint'] != $fingerprint) { + return ['errors' => ['Fingerprint does not match']]; + } + + $replyXml = @simplexml_load_file($pathToDocument); + if (empty($replyXml)) { + return ['errors' => ['Reply is not readable']]; + } + + $messageExchange = MessageExchangeModel::getMessageByReference(['select' => ['message_id'], 'reference' => (string)$replyXml->MessageReceivedIdentifier]); + if (empty($messageExchange)) { + return ['errors' => ['No reply found with this reference']]; + } + + $unitIdentifier = MessageExchangeModel::getUnitIdentifierByResId(['select' => ['message_id'], 'resId' => $args['resId']]); + if ($unitIdentifier['message_id'] != $messageExchange['message_id']) { + return ['errors' => ['Wrong reply']]; + } + + return true; + } } diff --git a/src/app/external/exportSeda/controllers/PreProcessActionSEDATrait.php b/src/app/external/exportSeda/controllers/PreProcessActionSEDATrait.php index e3ada08628d..25c8ce8b2e3 100644 --- a/src/app/external/exportSeda/controllers/PreProcessActionSEDATrait.php +++ b/src/app/external/exportSeda/controllers/PreProcessActionSEDATrait.php @@ -89,7 +89,7 @@ trait PreProcessActionSEDATrait continue; } - $acknowledgementXml = simplexml_load_file($pathToDocument); + $acknowledgementXml = @simplexml_load_file($pathToDocument); if (empty($acknowledgementXml)) { $resourcesInformations['errors'][] = ['alt_identifier' => $altIdentifiers[$resId], 'res_id' => $resId, 'reason' => 'recordManagement_acknowledgementNotReadable']; continue; @@ -107,7 +107,7 @@ trait PreProcessActionSEDATrait continue; } - $resourcesInformation['success'][] = ['alt_identifier' => $altIdentifiers[$resId], 'res_id' => $resId]; + $resourcesInformations['success'][] = $resId; } return $response->withJson(['resourcesInformations' => $resourcesInformations]); @@ -175,7 +175,7 @@ trait PreProcessActionSEDATrait continue; } - $replyXml = simplexml_load_file($pathToDocument); + $replyXml = @simplexml_load_file($pathToDocument); if (empty($replyXml)) { $resourcesInformations['errors'][] = ['alt_identifier' => $altIdentifiers[$resId], 'res_id' => $resId, 'reason' => 'recordManagement_replyNotReadable']; continue; @@ -193,7 +193,7 @@ trait PreProcessActionSEDATrait continue; } - $resourcesInformation['success'][] = ['alt_identifier' => $altIdentifiers[$resId]['alt_identifier'], 'res_id' => $resId]; + $resourcesInformations['success'][] = $resId; } return $response->withJson(['resourcesInformations' => $resourcesInformations]); -- GitLab