diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f0260a5e94404fe6ddbf5d540461d019fd2f95a..0099f0ec3f6aa0cd64b6b3dc6813d59eab718c94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # CHANGELOG +## Version 2.9.5 + - `Fixed` Mauvais affichage dans la liste de sélection des services versants pour la recherche dans le registre + - `Fixed` Erreur dans la la XSLT SEDA 0.2 vers 2.1 produisant des structures AppraisalRule et AccessRule multiples dans l'en tête du bordereau + - `Added` Prise en compte dans le contrôleur de réception des transferts SEDA 2 des algorithmes de condensat dans un format URI (exemple http://www.w3.org/2001/04/xmlenc#sha256) + - `Added` Action de changement de service producteur depuis la liste de résultats du registre, liée au droits de l'utilisateur + +## Version 2.9.4 + - `Changed` La recherche dans le registre des entrées n'affiche désormais plus les archives de journaux, accessibles dans l'écran de recherche dédié. + - `Changed` Evolutions à la XSLT SEDA 0.2 vers 2.1 afin de prendre en compte les métadonnées de gestion au niveau du paquet d'information + - `Changed` Dans la liste de résultats de recherche du registre des entrées, seules les archives à terme de leur DUA et dont le sort final est la destruction sont surlignées en rouge. +Les archives dont le sort final est la conservation ne sont plus indiquées, même si elles nécessitent un transfert vers un SAE définitif. + - `Changed` Ajout du messages de détection de format des SIP SEDA 2 + - `Changed` Ajout du nom de fichier dans les messages de détection et validation de format des SIP SEDA 1 et 2 + - `Fixed` Fichier de profil non trouvé lorsqu'un autre fichier du même nom mais d'extension différente était présent dans le répertoire + ## Version 2.9.3 - `Fixed` Description de règle de communicabilité absente pour durée illimitée (AR062) diff --git a/MIGRATION.md b/MIGRATION.md index d30158821f523cf60b0adb27adf7b9827d9d5a4d..c6ae880b4d31d26c427e883b6d7a9fd12d4c099e 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -1,3 +1,18 @@ +# Migration 2.8 vers 2.9.4 + +Dans la section [medona], modification de la directive `packageSchemas` afin d'utiliser l'espace de nom SEDA 2.1 au lieu de SEDA 1 : + +``` +packageSchemas = "{ + 'seda2' : { + 'label' : 'SEDA 2.1', + 'xmlNamespace' : 'fr:gouv:culture:archivesdefrance:seda:v2.1', + 'phpNamespace' : 'seda2', + 'presenter' : 'seda2/message' + } +}" +``` + # Migration 2.7 vers 2.8 ## Vhost diff --git a/bundle/archivesPubliques/Controller/content.php b/bundle/archivesPubliques/Controller/content.php index c2988eb5a9f1a11ff94ece9900380c99cffac777..456b7e67e7f6290f03bda8901f58cf80016c87d4 100644 --- a/bundle/archivesPubliques/Controller/content.php +++ b/bundle/archivesPubliques/Controller/content.php @@ -517,7 +517,7 @@ class content implements \bundle\recordsManagement\Controller\archiveDescription $term, $keyword ); - + $jsonContentDescriptions = $this->sdoFactory->find("recordsManagement/archive", $jsonQueryString, $jsonQueryParams, '>depositDate', 0, $maxResults); return array_merge($tableContentDescriptions, $jsonContentDescriptions); @@ -848,7 +848,7 @@ class content implements \bundle\recordsManagement\Controller\archiveDescription $keyword = array() ) { //$queryParts['json'] = "(descriptionClass = 'seda2' || descriptionClass = 'seda2/Content')"; - $queryParts['json'] = "(descriptionClass != 'archivesPubliques/content' || descriptionClass = null)"; + $queryParts['json'] = "(descriptionClass != 'archivesPubliques/content' && descriptionClass != 'recordsManagement/log')"; if (is_array($keyword) && !empty($keyword)) { foreach ($keyword as $keywordObj) { diff --git a/bundle/archivesPubliques/Resources/xslt/restitution_v02totransfer_v20.xsl b/bundle/archivesPubliques/Resources/xslt/restitution_v02totransfer_v20.xsl index e014ac209777da7e0f4276a673c8a6db1dca9ce1..8c683ccc68c46cf4276e24d0d7f0959ae195f5cb 100644 --- a/bundle/archivesPubliques/Resources/xslt/restitution_v02totransfer_v20.xsl +++ b/bundle/archivesPubliques/Resources/xslt/restitution_v02totransfer_v20.xsl @@ -39,16 +39,16 @@ </Signature> </xsl:if> - <xsl:if test="seda:Contains/seda:ArchivalAgreement"> + <xsl:if test="seda:Archive/seda:ArchivalAgreement"> <ArchivalAgreement> <xsl:attribute name="schemeAgencyName"> <xsl:value-of - select="seda:Contains/seda:ArchivalAgreement/@schemeAgencyName"/> + select="seda:Archive/seda:ArchivalAgreement/@schemeAgencyName"/> </xsl:attribute> <xsl:attribute name="schemeName"> - <xsl:value-of select="seda:Contains/seda:ArchivalAgreement/@schemeName"/> + <xsl:value-of select="seda:Archive/seda:ArchivalAgreement/@schemeName"/> </xsl:attribute> - <xsl:value-of select="seda:Contains/seda:ArchivalAgreement"/> + <xsl:value-of select="seda:Archive/seda:ArchivalAgreement"/> </ArchivalAgreement> </xsl:if> @@ -60,25 +60,19 @@ <xsl:apply-templates select="//seda:ArchiveRestitution/seda:Archive"/> </DescriptiveMetadata> <ManagementMetadata> - <xsl:if test="seda:Contains/seda:ArchivalProfile"> + <xsl:if test="seda:Archive/seda:ArchivalProfile"> <ArchivalProfile> <xsl:attribute name="schemeAgencyName"> <xsl:value-of - select="seda:Contains/seda:ArchivalProfile/@schemeAgencyName"/> + select="seda:Archive/seda:ArchivalProfile/@schemeAgencyName"/> </xsl:attribute> <xsl:attribute name="schemeName"> <xsl:value-of - select="seda:Contains/seda:ArchivalProfile/@schemeName"/> + select="seda:Archive/seda:ArchivalProfile/@schemeName"/> </xsl:attribute> - <xsl:value-of select="seda:Contains/seda:ArchivalProfile"/> + <xsl:value-of select="seda:Archive/seda:ArchivalProfile"/> </ArchivalProfile> </xsl:if> - <xsl:if test="seda:Contains/seda:Appraisal"> - <xsl:apply-templates select="seda:Contains/seda:Appraisal"/> - </xsl:if> - <xsl:if test="seda:Contains/seda:AccessRestriction"> - <xsl:apply-templates select="seda:Contains/seda:AccessRestriction"/> - </xsl:if> </ManagementMetadata> </DataObjectPackage> <ArchivalAgency> diff --git a/bundle/seda/Controller/ArchiveTransfer.php b/bundle/seda/Controller/ArchiveTransfer.php index 33b8aad1af03d5b8c9eb3fb9cc962863d399e1df..a6ba733cac9baa2bb916fa791e00dba10cecb9fb 100644 --- a/bundle/seda/Controller/ArchiveTransfer.php +++ b/bundle/seda/Controller/ArchiveTransfer.php @@ -177,6 +177,7 @@ class ArchiveTransfer extends abstractMessage implements \bundle\medona\Controll public function validate($message, $archivalAgreement = null) { $this->errors = array(); + $this->infos = array(); $this->replyCode = null; $this->loadMessage($message); @@ -277,72 +278,46 @@ class ArchiveTransfer extends abstractMessage implements \bundle\medona\Controll protected function validateProfile($message, $archivalProfileReference) { - /*if (!isset($message->object->archive[0]->archivalProfile) || $message->object->archive[0]->archivalProfile->value == "") { - $this->sendError("203", "Le profil d'archive n'est pas renseigné"); - - return; - }*/ $errors = array(); - $profileFiles = glob($this->profilesDirectory.DIRECTORY_SEPARATOR.$archivalProfileReference.'.*'); - if (count($profileFiles) == 0) { - $this->sendError("203", "Le profil d'archive identifié par '$archivalProfileReference' n'est pas référencé dans le système."); - - return; - } - - foreach ($profileFiles as $profileFile) { - $extension = pathinfo($profileFile, \PATHINFO_EXTENSION); + $profilePath = $this->profilesDirectory.DIRECTORY_SEPARATOR.$archivalProfileReference; - switch ($extension) { - case 'rng': - //if ($validationMode == 'jing') { - if (true) { - $jing = \laabs::newService('dependency/xml/plugins/jing/jing'); - $xmlFile = $this->message->path; - $valid = $jing->validate($profileFile, $xmlFile); - if (!$valid) { - $this->sendError("203"); + if (file_exists($profilePath . '.rng')) { + //if ($validationMode == 'jing') { + //if (true) { + $jing = \laabs::newService('dependency/xml/plugins/jing/jing'); + $valid = $jing->validate($profilePath.'.rng', $this->message->path); + if (!$valid) { + $this->sendError("203"); - foreach ($jing->getErrors() as $errorMessage) { - $this->errors[] = new \core\Error($errorMessage); - } - } - } else { - libxml_use_internal_errors(true); - $valid = $message->xml->relaxNGValidate($profileFile); - if ($valid == false) { - $this->sendError("203"); - foreach (libxml_get_errors() as $libxmlError) { - $this->errors[] = new \core\Error($libxmlError->message, null, $libxmlError->code); - } - } - libxml_clear_errors(); - libxml_use_internal_errors(false); + foreach ($jing->getErrors() as $errorMessage) { + $this->errors[] = new \core\Error($errorMessage); } - break; - - case 'xsd': - libxml_use_internal_errors(true); - $valid = $message->xml->schemaValidate($profileFile); - if ($valid == false) { - foreach (libxml_get_errors() as $libxmlError) { - $this->errors[] = new \core\Error($libxmlError->message, null, $libxmlError->code); - } - } - libxml_clear_errors(); - libxml_use_internal_errors(false); - break; - - default: - $path = $this->profilesDirectory.DIRECTORY_SEPARATOR.$archivalprofileReference; - // if a profile were previously saved without extension - if (empty($extension) && (file_exists($path . '.rng') || file_exists($path . '.xsd'))) { - break; + } + /*} else { + libxml_use_internal_errors(true); + $valid = $message->xml->relaxNGValidate($profileFile); + if ($valid == false) { + $this->sendError("203"); + foreach (libxml_get_errors() as $libxmlError) { + $this->errors[] = new \core\Error($libxmlError->message, null, $libxmlError->code); } - $this->sendError("203", "Le profil d'archive identifié par '$archivalProfileReference' est dans un format non géré par le système."); - break; + } + libxml_clear_errors(); + libxml_use_internal_errors(false); + }*/ + } elseif (file_exists($profilePath . '.xsd')) { + libxml_use_internal_errors(true); + $valid = $message->xml->schemaValidate($profilePath.'.xsd'); + if ($valid == false) { + foreach (libxml_get_errors() as $libxmlError) { + $this->errors[] = new \core\Error($libxmlError->message, null, $libxmlError->code); + } } + libxml_clear_errors(); + libxml_use_internal_errors(false); + } else { + $this->sendError("203", "Le fichier de profil d'archive identifié par '$archivalProfileReference' n'existe pas."); } } @@ -441,14 +416,14 @@ class ArchiveTransfer extends abstractMessage implements \bundle\medona\Controll $fileInfo->format = $format; if (isset($sentPuid) && $format->puid != $sentPuid) { - $this->sendError("205", "Format de document '$filename' non conforme au format déclaré."); + $this->sendError("205", "Format de document '".$filename."' non conforme au format déclaré."); } } } catch (\Exception $e) { - $this->sendError("205", "Le format du document '$filename' n'a pas pu être déterminé"); + $this->sendError("205", "Le format du document '".$filename."' n'a pas pu être déterminé"); } - $this->infos[] = (string)\laabs::newDateTime() . ": Détection du format par Maarch FID"; + $this->infos[] = "Détection du format du document '".$filename."'' par Maarch FID"; } else { if (isset($attachment->format)) { $puid = $attachment->format; @@ -461,15 +436,15 @@ class ArchiveTransfer extends abstractMessage implements \bundle\medona\Controll $validation = $formatController->validateFormat($filepath); if (!$validation !== true && is_array($validation)) { $message = implode(', ', reset($validation)); - $this->sendError("307", "Le format du document '$filename' n'est pas valide : " . $message); + $this->sendError("307", "Le format du document '".$filename."' n'est pas valide : " . $message); } - $this->infos[] = (string)\laabs::newDateTime() . ": Validation du format par JHOVE 1.11"; + $this->infos[] = "Validation du format du document '".$filename."'' par JHOVE 1.11"; } if (isset($allowedFormats) && (count($allowedFormats) && isset($puid) && !in_array($puid, $allowedFormats))) { - $this->sendError("307", "Le format du document '$filename' (" . $puid . ") n'est pas autorisé par l'accord de versement."); + $this->sendError("307", "Le format du document '".$filename."' (".$puid.") n'est pas autorisé par l'accord de versement."); } $attachmentId++; diff --git a/bundle/seda2/Controller/ArchiveTransferReceptionTrait.php b/bundle/seda2/Controller/ArchiveTransferReceptionTrait.php index d161e289e572b0d4d1213e614129077faf65a9d4..d06a36d1554d1210e2fe0235635c21047cd18121 100644 --- a/bundle/seda2/Controller/ArchiveTransferReceptionTrait.php +++ b/bundle/seda2/Controller/ArchiveTransferReceptionTrait.php @@ -170,6 +170,10 @@ trait ArchiveTransferReceptionTrait // Validate hash $messageDigest = $binaryDataObject->messageDigest; + if (strpos($messageDigest->algorithm, "#") !== false) { + $messageDigest->algorithm = substr($messageDigest->algorithm, strrpos($messageDigest->algorithm, '#') + 1); + } + if (!in_array($messageDigest->algorithm, ['sha3-224', 'sha3-256', 'sha3-384', 'sha3-512'])) { $messageDigest->algorithm = str_replace('-', '', $messageDigest->algorithm); } diff --git a/bundle/seda2/Controller/ArchiveTransferValidationTrait.php b/bundle/seda2/Controller/ArchiveTransferValidationTrait.php index 40394fe538bd293c1b46359f1275ceb20baeb149..e397cbcf5a2770f9a280269fa24a3ebee84db2f9 100644 --- a/bundle/seda2/Controller/ArchiveTransferValidationTrait.php +++ b/bundle/seda2/Controller/ArchiveTransferValidationTrait.php @@ -37,6 +37,7 @@ trait ArchiveTransferValidationTrait public function validate($message, $archivalAgreement = null) { $this->errors = array(); + $this->infos = array(); $this->replyCode = null; $this->loadMessage($message); @@ -312,6 +313,8 @@ trait ArchiveTransferValidationTrait } else { $puid = $format->puid; $binaryDataObject->formatIdentification->formatId = $puid; + + $this->infos[] = "Détection du format du document '".$binaryDataObject->uri."'' par Maarch FID"; } } @@ -326,7 +329,7 @@ trait ArchiveTransferValidationTrait if (!$validation !== true && is_array($validation)) { $this->sendError("307", "Le format du document '".$binaryDataObject->uri."' n'est pas valide : ".implode(', ', $validation)); } - $this->infos[] = (string) \laabs::newDateTime().": Validation du format par JHOVE 1.11"; + $this->infos[] = "Validation du format du document '".$binaryDataObject->uri."'' par JHOVE 1.11"; } } } diff --git a/data/conf/configuration.ini.default b/data/conf/configuration.ini.default index abe1ee4573028217432b2a83416b9c1e25513dfa..05d67b872541dbe114be5ad8e8ccde6907eee009 100644 --- a/data/conf/configuration.ini.default +++ b/data/conf/configuration.ini.default @@ -208,7 +208,7 @@ packageSchemas = "{ }, 'seda2' : { 'label' : 'SEDA 2.1', - 'xmlNamespace' : 'fr:gouv:culture:archivesdefrance:seda:v2.0', + 'xmlNamespace' : 'fr:gouv:culture:archivesdefrance:seda:v2.1', 'phpNamespace' : 'seda2', 'presenter' : 'seda2/message' } @@ -987,7 +987,22 @@ conversionServices = "[ 'softwareVersion' : '10.0', 'inputFormats' : ['fmt/14', 'fmt/15', 'fmt/16', 'fmt/17', 'fmt/18', 'fmt/19', 'fmt/20', 'fmt/276', 'fmt/1129'], 'outputFormats' : { - 'fmt/95' : {} + 'fmt/95' : { + '-dPDFSETTINGS' : '/prepress', + '-dNOOUTERSAVE' : null, + '-sColorConversionStrategy' : 'UseDeviceIndependentColor', + '-sProcessColorModel' : 'DeviceRGB', + '-dPDFA' : null, + '-sPDFACompatibilityPolicy' : '1' + }, + 'fmt/480' : { + '-dPDFSETTINGS' : '/prepress', + '-dNOOUTERSAVE' : null, + '-sColorConversionStrategy' : 'UseDeviceIndependentColor', + '-sProcessColorModel' : 'DeviceRGB', + '-dPDFA' : '3', + '-sPDFACompatibilityPolicy' : '1' + } } } ]" diff --git a/data/sql/pgsql/default.sql b/data/sql/pgsql/default.sql index 128ed8363aa8be446d4f8271e5a61ad203c3dbe9..68b636d29d28ed41ec750c5d2c0688fc784b45f1 100644 --- a/data/sql/pgsql/default.sql +++ b/data/sql/pgsql/default.sql @@ -98,7 +98,7 @@ INSERT INTO "lifeCycle"."eventFormat" ("type", "format", "notification", "messag ('recordsManagement/unfreeze', 'resId hashAlgorithm hash address originatorOrgRegNumber archiverOrgRegNumber originatorArchiveId', FALSE, 'Dégel de l''archive %6$s'), ('recordsManagement/resourceDestruction', 'resId hashAlgorithm hash address originatorOrgRegNumber archiverOrgRegNumber originatorArchiveId', FALSE, 'Destruction de la ressource %9$s'), ('recordsManagement/depositNewResource', 'resId hashAlgorithm hash address originatorOrgRegNumber depositorOrgRegNumber archiverOrgRegNumber format size originatorArchiveId', FALSE, 'Dépôt d''une nouvelle ressource dans l''archive %6$s'), - ('recordsManagement/completenessCheck', 'lastCheckedResId lastCheckedResCreated repositoryReference resourcesToCheck checkedResources failed timeout timeoutError', 'Contrôle d''exhaustivité des ressources', false) + ('recordsManagement/completenessCheck', 'lastCheckedResId lastCheckedResCreated repositoryReference resourcesToCheck checkedResources failed timeout timeoutError', 'Contrôle d''exhaustivité des ressources', false), ('medona/sending', 'type senderOrgRegNumber senderOrgName recipientOrgRegNumber recipientOrgName reference code info', FALSE, 'Envoi du message %14$s de type %9$s de %11$s (%10$s) à %13$s (%12$s)'), ('medona/reception', 'type senderOrgRegNumber senderOrgName recipientOrgRegNumber recipientOrgName reference', FALSE, 'Réception du message %14$s de type %9$s de %11$s (%10$s) par %13$s (%12$s)'), diff --git a/presentation/maarchRM/Presenter/archivesPubliques/content.php b/presentation/maarchRM/Presenter/archivesPubliques/content.php index 6f6bd1f1e9924e39baadd25ff93ce0774c2f0d16..e6504ad4c4a3758ca982a05a0edccfe8da68a5fc 100644 --- a/presentation/maarchRM/Presenter/archivesPubliques/content.php +++ b/presentation/maarchRM/Presenter/archivesPubliques/content.php @@ -221,10 +221,10 @@ class content $userOrgs[(string) $orgObject->orgId] = new \stdClass(); $userOrgs[(string) $orgObject->orgId]->displayName = $orgObject->displayName; - $userOrgs[(string) $orgObject->orgId]->originators = []; + $userOrgs[(string) $orgObject->orgId]->{$role} = []; } - if (!in_array($orgUnit, $userOrgs[(string) $orgObject->orgId]->originators)) { - $userOrgs[(string)$orgObject->orgId]->originators[] = $orgUnit; + if (!in_array($orgUnit, $userOrgs[(string) $orgObject->orgId]->{$role})) { + $userOrgs[(string)$orgObject->orgId]->{$role}[] = $orgUnit; } } } @@ -304,7 +304,7 @@ class content if ($archive->status == 'disposed' || $archive->status == 'error' || $archive->status == 'restituted' || $archive->status == 'transfered') { $archive->statusModif = true; } - if (!empty($archive->disposalDate) && $archive->disposalDate <= $currentDate) { + if (!empty($archive->disposalDate) && $archive->disposalDate <= $currentDate && $archive->finalDisposition == 'destruction') { $archive->disposable = true; } if (isset($originators[$archive->originatorOrgRegNumber])) { @@ -437,6 +437,7 @@ class content $hasDeliveryPrivilege = \laabs::callService('auth/userAccount/readHasprivilege', "delivery/deliveryRequest"); $hasTransferPrivilege = \laabs::callService('auth/userAccount/readHasprivilege', "definitiveTransfer/outgoingTransferSend"); $hasModificationRequestPrivilege = \laabs::callService('auth/userAccount/readHasprivilege', "archiveManagement/modificationRequestSend"); + $hasModificationOriginatorPrivilege = \laabs::callService('auth/userAccount/readHasprivilege', "archiveManagement/adminOriginator"); $this->view->setSource('hasModificationPrivilege', $hasModificationPrivilege); $this->view->setSource('hasIntegrityCheckPrivilege', $hasIntegrityCheckPrivilege); @@ -446,6 +447,7 @@ class content $this->view->setSource('hasDeliveryPrivilege', $hasDeliveryPrivilege); $this->view->setSource('hasTransferPrivilege', $hasTransferPrivilege); $this->view->setSource('hasModificationRequestPrivilege', $hasModificationRequestPrivilege); + $this->view->setSource('hasModificationOriginatorPrivilege', $hasModificationOriginatorPrivilege); } /**