Verified Commit 0ddbbc55 authored by Alexandre Morin's avatar Alexandre Morin

Merge branch 'develop'

parents 9d9fdd31 4041ec9e
Pipeline #7006 canceled with stages
services:
- postgres:9.4
image: docker:19.03.1
services:
- docker:19.03.1-dind
stages:
- build
- tests
- push
variables:
POSTGRES_DB: "maarchRMtest"
POSTGRES_USER: maarch
POSTGRES_PASSWORD: ""
npm_config_cache: /builds/cypress-io/cypress-example-docker-gitlab/.npm
CYPRESS_CACHE_FOLDER: /builds/cypress-io/cypress-example-docker-gitlab/cache/Cypress
before_script:
- docker info
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
......@@ -21,119 +24,141 @@ cache:
- node_modules
- vendor/
unit-tests:php-7.2:
image: php:7.2-apache
stage: tests
before_script:
- apt-get update > /dev/null
- mkdir -p /usr/share/man/man1
- mkdir -p /usr/share/man/man7
- apt-get install cron -yqq > /dev/null
- bash tests/ci/docker_install_php.sh > /dev/null
- bash tests/ci/docker_install_database.sh > /dev/null
- curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
build:
stage: build
script:
- useradd -m -g www-data maarch
- echo "export APACHE_RUN_USER=maarch" >> /etc/apache2/envvars
- mkdir -p /var/www/html/
- cp -R /builds/maarch/maarchRM/ /var/www/maarchRM/
- mv /var/www/maarchRM/ /var/www/laabs/
- cd /var/www/laabs
- cp data/maarchRM/conf/vhost.conf.default data/maarchRM/conf/vhost.conf
- cp data/maarchRM/conf/configuration.ini.default data/maarchRM/conf/configuration.ini
- cp data/maarchRM/conf/confvars.ini.default data/maarchRM/conf/confvars.ini
- sed -i -e 's!localhost!postgres!' data/maarchRM/conf/confvars.ini
- sed -i -e 's!maarchRM!maarchRMtest!' data/maarchRM/conf/confvars.ini
- mkdir -p /var/www/laabs/data/maarchRM/repository/archives_1 /var/www/laabs/data/maarchRM/repository/archives_2
- chown -R maarch:www-data /var/www
- chmod -R 777 /var/www
- cd /etc/apache2/sites-available/
- touch maarchRM.conf
- echo "Include /var/www/laabs/data/maarchRM/conf/vhost.conf" >> maarchRM.conf
- echo "127.0.0.1 maarchrm" >> /etc/hosts
- a2ensite maarchRM.conf
- a2dissite 000-default.conf
- a2enmod rewrite
- a2enmod env
- service apache2 start
- cd /var/www/laabs
- composer install
- sed -i -e 's!pgsql:host=localhost;dbname=maarchRMtest;port=5432!pgsql:host=postgres;dbname=maarchRMtest;port=5432!' /var/www/laabs/codeception.yml
- vendor/bin/codecept run
artifacts:
paths:
- tests/codeception/_output/
expire_in: 1 week
when: always
functional-test:cypress:
image: cypress/base:10
stage: tests
script:
- mv /builds/maarch/maarchRM/cypress.json /builds/maarch/maarchRM/cypress.json.old
- mv /builds/maarch/maarchRM/cypress.json.ci /builds/maarch/maarchRM/cypress.json
- npm install
- npm ci
- $(npm bin)/cypress verify
- $(npm bin)/cypress run
only:
- schedules
artifacts:
expire_in: 1 week
when: always
paths:
- tests/cypress/screenshots
- tests/cypress/videos
syntax-test:php-metrics:
image: jakzal/phpqa
stage: tests
script: phpmetrics --report-html=var/php-metrics src
- docker build --build-arg APP_VERSION=${CI_COMMIT_REF_NAME} --build-arg CACHE_DATE="$(date)" $CI_DOCKERFILE -t "$CI_REGISTRY_IMAGE_TEST"
- docker push "$CI_REGISTRY_IMAGE_TEST"
except:
- schedules
only:
- develop
artifacts:
paths:
- var/php-metrics/
allow_failure: true
syntax-test:php-phpmd:
image: jakzal/phpqa
tests:
stage: tests
script:
- mkdir var/
- phpmd src html phpmd.xml --reportfile var/phpmd.html --exclude --ignore-violations-on-exit
except:
- schedules
only:
- develop
- docker pull "$CI_REGISTRY_IMAGE_TEST"
- docker run $CI_REGISTRY_IMAGE_TEST bash -c "echo \"127.0.0.1 maarchrm\" >> /etc/hosts
&& service apache2 start
&& service postgresql start
&& cd /var/www/laabs/
&& composer install
&& vendor/bin/codecept run"
artifacts:
paths:
- var/phpmd.html
allow_failure: true
- tests/codeception/_output/
expire_in: 1 week
when: always
syntax-test:php-deprecation-detector:
image: jakzal/phpqa
stage: tests
push:
stage: push
script:
- deprecation-detector check src vendor/
- docker pull "$CI_REGISTRY_IMAGE_TEST"
- docker tag "$CI_REGISTRY_IMAGE_TEST" "$CI_REGISTRY_IMAGE"
- docker push "$CI_REGISTRY_IMAGE"
only:
- master
except:
- schedules
only:
- develop
allow_failure: true
#build-dockerhub:
# stage: push
#unit-tests:php-7.2:
# image: php:7.2-apache
# stage: tests
# before_script:
# - apt-get update > /dev/null
# - mkdir -p /usr/share/man/man1
# - mkdir -p /usr/share/man/man7
# - apt-get install cron -yqq > /dev/null
# - bash tests/ci/docker_install_php.sh > /dev/null
# - bash tests/ci/docker_install_database.sh > /dev/null
# - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# script:
# - useradd -m -g www-data maarch
# - echo "export APACHE_RUN_USER=maarch" >> /etc/apache2/envvars
# - mkdir -p /var/www/html/
# - cp -R /builds/maarch/maarchRM/ /var/www/maarchRM/
# - mv /var/www/maarchRM/ /var/www/laabs/
# - cd /var/www/laabs
# - cp data/maarchRM/conf/vhost.conf.default data/maarchRM/conf/vhost.conf
# - cp data/maarchRM/conf/configuration.ini.default data/maarchRM/conf/configuration.ini
# - cp data/maarchRM/conf/confvars.ini.default data/maarchRM/conf/confvars.ini
# - sed -i -e 's!localhost!postgres!' data/maarchRM/conf/confvars.ini
# - sed -i -e 's!maarchRM!maarchRMtest!' data/maarchRM/conf/confvars.ini
# - mkdir -p /var/www/laabs/data/maarchRM/repository/archives_1 /var/www/laabs/data/maarchRM/repository/archives_2
# - chown -R maarch:www-data /var/www
# - chmod -R 777 /var/www
# - cd /etc/apache2/sites-available/
# - touch maarchRM.conf
# - echo "Include /var/www/laabs/data/maarchRM/conf/vhost.conf" >> maarchRM.conf
# - echo "127.0.0.1 maarchrm" >> /etc/hosts
# - a2ensite maarchRM.conf
# - a2dissite 000-default.conf
# - a2enmod rewrite
# - a2enmod env
# - service apache2 start
# - cd /var/www/laabs
# - composer install
# - sed -i -e 's!pgsql:host=localhost;dbname=maarchRMtest;port=5432!pgsql:host=postgres;dbname=maarchRMtest;port=5432!' /var/www/laabs/codeception.yml
# - vendor/bin/codecept run
# artifacts:
# paths:
# - tests/codeception/_output/
# expire_in: 1 week
# when: always
#
#functional-test:cypress:
# image: cypress/base:10
# stage: tests
# script:
# - mv /builds/maarch/maarchRM/cypress.json /builds/maarch/maarchRM/cypress.json.old
# - mv /builds/maarch/maarchRM/cypress.json.ci /builds/maarch/maarchRM/cypress.json
# - npm install
# - npm ci
# - $(npm bin)/cypress verify
# - $(npm bin)/cypress run
# only:
# - schedules
# artifacts:
# expire_in: 1 week
# when: always
# paths:
# - tests/cypress/screenshots
# - tests/cypress/videos
#
#syntax-test:php-metrics:
# image: jakzal/phpqa
# stage: tests
# script: phpmetrics --report-html=var/php-metrics src
# except:
# - schedules
# only:
# - develop
# artifacts:
# paths:
# - var/php-metrics/
# allow_failure: true
#
#syntax-test:php-phpmd:
# image: jakzal/phpqa
# stage: tests
# script:
# - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin
# - docker build tests/dockerfile/ -t "$CI_REGISTRY_IMAGE"
# - docker tag "$CI_REGISTRY_IMAGE"
# - docker push "$CI_REGISTRY_IMAGE"
# - mkdir var/
# - phpmd src html phpmd.xml --reportfile var/phpmd.html --exclude --ignore-violations-on-exit
# except:
# - schedules
# only:
# - feat/codeception
# - develop
# artifacts:
# paths:
# - var/phpmd.html
# allow_failure: true
#
#
#syntax-test:php-deprecation-detector:
# image: jakzal/phpqa
# stage: tests
# script:
# - deprecation-detector check src vendor/
# except:
# - schedules
\ No newline at end of file
# - schedules
# only:
# - develop
# allow_failure: true
# CHANGELOG
## Version 2.6
### Externalisation des fonctions Coffre-Fort Numérique
- `Changed` Le bundle `digitalSafe` a été déplacé vers la nouvelle extension éponyme, disponible dans le projet GitLab ![lien](https://labs.maarch.org/maarch/digitalSafe)
### Sécurité
- `Fixed` Erreur courante `Attemp to access without a valid token` du module de protection CSRF, et traduction du message en français
- `Fixed` Impossibilité de rattacher un compte de service de niveau Administrateur fonctionnel à une organisation (au lieu d'un service)
- `Fixed` Faille XSS en faux positif sur la modale 404 "La page demandée n'existe pas"
- `Added` Gestion renforcée de la sécurité (option de configuration) : Gestion de niveaux de sécurité sur les rôles et privilèges, en lien avec les niveaux d'utilisateur
- `Changed` Filtrage des comptes d'utilisateurs et comptes de service en fonction du niveau de sécurité, notamment pour le compte utilisé dans le planificateur de tâches (si activé)
### Import et export de référentiels
- `Added` Fonctions d'import de référentiels par téléversement de CSV, avec option de remise à blanc ou de modification/fusion
- `Added` Fonctions d'export de référentiels par téléchargement de CSV
### Echanges transactionnels, versement, ressortie d'archive
- `Fixed` Traitements concurrents sur les mêmes bordereaux (hors versement, déjà corrigé en V2.5)
- `Fixed` Impossibilité de transmettre des chemins de fichiers ou URI pour les données transmises
- `Added` Possibilité de verser des archives compressées d'arborescence de dossiers sans nommage particulier (lien avec profil) pour le vrac numérique
### Traitement des binaires
- `Changed` Réécriture complète des macanismes de traitement des contenus binaires reçus et transmis, afin de permettre la gestion de document numériques de grande taille (sup. à 1Go) sans dépassament de la mémoire
- `Changed` Dans l'adaptateur `FileSystem`, création des répertoires de stockage après résolution des parties variables et non plus récursivement pour améliorer les performances lors du stockage CEPH sur interface POSIX
- `Changed` Suppression de fichiers temporaires utilisés lors de versement et ressorties, tous modes (à l'exlusion de la consultation)
### Description
- `Added` Option pour activer la valeur par défaut à la date du jour pour les métadonnées de type date et date+heure
### Classement
- `Fixed` Impossibilité de déplacer les services à la racine de l'organisation
- `Fixed` Erreur lorsqu'un service/une activité n'avait pas de rôle
- `Added` Fonction pour activer/désaciver des services/activités et ainsi empêcher les versements
### Traçabilité
- `Fixed` Recherche par terme impossible dans le journal de l'application
- `Fixed` Absence des données de règle de conservation avant modification dans le détail de l'événement
- `Fixed` Absence des noms d'organisation et services acteurs dans le détail des événements d'échange transactionnel
- `Added` Ajout d'un champ organisation dans la recherche d'évènement de journal, il assistera l'utilisateur avec une autocompletion regroupant l'ensemble des services et des organisations auxquels l'utilisateur est rattaché.
- `Added` Ajout de la possibilité de rechercher selon l'identifiant métier (renseigné par le client) en plus de l'identifiant technique dans la recherche d'évènement de journal.
- `Added` Information de résultat d'opération dans le tableau des événement des objets (archive et messages d'échange)
- `Changed` Téléchagrement des attestations depuis le détail des événements et non plus depuis la liste
### IHM
- `Fixed` Bouton de validation du formulaire de modification de règle de conservation qui se déplaçait au survol du curseur
- `Fixed` Effacement de la date déjà renseignée dans la zone de saisie, lorsque la même date était sélectionnée dans le sélecteur de date
- `Fixed` Fichier sans extension ni nom lors du téléchargement de fichier de profil d'archivage (SEDA par exemple)
- `Fixed` Affichage du point de menu "Echanges transactionnels" même lorsque l'utilisateur n'a accès à aucune transaction
- `Fixed` Erreur lors du classement de plusieurs archives das un dossier virtuel, après versement ou modification des métadonnées de l'une des archives de la liste de résultat
- `Fixed` Mauvaise gestion de l'activation/désactivation du bouton de validation de la modale de confirmation avant envoi d'un message transactionnel (modification, communication...)
- `Added` Fonction pour déplier/replier toute un branche de l'organigramme des services
- `Added` Fonction de téléchargement des données de liste de résultat dans l'écran de gestion de l'Archive
- `Added` Mode de vue en liste pour la gestion de l'organisation (option de configuration) pour gérer les grands tableaux de gestion (milliers d'entrées)
### Pérennisation
- `Fixed` Erreur non interceptée lors de la détection de format lorsqu'un outil tiers appelé en ligne de commande (7z en l'occurence) se terminait en erreur
- `Changed` Mise à jour des fichiers de signature DROID pour ladétection de format (V96 - 2020-01-21)
___
## Version 2.5.3
- `Fixed` Contenu binaire corrompu lors du dépôt direct d'objet numérique dans les archives
- `Fixed` Erreur à l'initialisation du plugin `dataTable`
- `Fixed` Actions impossibles sur les éléments de liste de résultat au-delà de la première page
___
## Version 2.5.2
- `Fixed` Correctif concernant les demandes de restitution d'archives.
- `Fixed` Rétablissement des demandes de restitution d'archives.
- `Fixed` Les valeurs par défaut des paramètres de fonction dans JavaScript ont été retirées pour compatibilité à Internet Explorer 11.
- `Fixed` Les tableaux s'initialisent correctement lorsqu'un nombre important d'entrées doit être affiché.
- `Fixed` Rétablissement de la navigation entre archives liées.
### Thesaurus
- `Added` Ajout de la possiblité d'utiliser des fichiers CSV ou SKOS personnalisés comme référentiels de thesaurus (fonctionnalité de l'extension *archives publiques*).
___
## Version 2.5.1
- `Fixed` Correctif sur la vérification de validité du token de 'Mot de passe oublié'
___
## Version 2.5
### Sécurité
......@@ -73,6 +153,8 @@
- `Added` Ajout de plusieurs index afin d'améliorer les performances de l'application.
___
## Version 2.4.4
### IHM
......
# Migration 2.5 vers 2.6
## Configuration des instances publiées (hôte(s) virtuel(s) http et scripts en ligne de commande)
### Externalisation du bundle `digitalSafe`
Le bundle `digitalSafe` qui présente les fonctions relatives à l'usage du produit
comme composant de coffre-fort numérique, ajouté en V2.5, a été déplacé dans une nouvelle
extension du même nom.
Les instances ne doivent plus faire référence à ce bundle si l'extension `digitalSafe` n'est pas installée.
Socle SAE seul :
```
SetEnv LAABS_BUNDLES audit;auth;batchProcessing;contact;digitalResource;lifeCycle;organization;recordsManagement;filePlan;medona;mades
```
Avec l'usage CCFN :
```
SetEnv LAABS_BUNDLES audit;auth;batchProcessing;contact;digitalResource;lifeCycle;organization;recordsManagement;filePlan;medona;mades;digitalSafe
SetEnv LAABS_EXTENSIONS digitalSafe
```
### Nouvelle dépendance technique CSV
Les fonctions d'import et d'export de référentiel utilisent une nouvelle dépendance qui
gère les conversions en CSV. Ladépendance `csv` doit être ajoutée à l'instance :
```
SetEnv LAABS_DEPENDENCIES repository;xml;html;localisation;datasource;sdo;json;fileSystem;notification;PDF;csrf;timestamp;csv
```
## Configuration
### Protection CSRF
Il faut ajouter des routes en liste blanche pour la protection contre les requêtes en Cross-Site Forgery:
```
csrfWhiteList = "['user/login', 'user/password', 'user/prompt', 'user/logout', 'user/generateResetToken']"
```
### Mise à jour des fichiers de signature DROID
Mise à jour des fichiers signature et container permettant la détection du format des fichiers
```
signatureFile = "%laabsDirectory%/data/maarchRM/droidSignatureFiles/DROID_SignatureFile_V96.xml"
containerSignatureFile = "%laabsDirectory%/data/maarchRM/droidSignatureFiles/container-signature-20200121.xml"
```
## Schéma SQL
Voir le fichier spécifique
laabs/data/maarchRM/sql/pgsql/migrationV2.5_V2.6.sql
___
# Migration 2.4 vers 2.5
## Présentation et fonctionnalités orientées "archives publiques"
......@@ -244,6 +297,8 @@ Lors de la saisie d'une archive, un typeahead viendra aider l'opérateur dans la
Ajout du plugin dateTimePicker, permettant la saisie simultanée d'une date et d'un horaire au sein d'un même champ (au format DD-MM-YYYY HH:mm:ss par défaut) via une interface.
___
# Migration 2.3 vers 2.4
## Evenement
......@@ -293,6 +348,8 @@ Voir le fichier spécifique
laabs/data/maarchRM/sql/pgsql/migrationV2.3_V2.4.sql
___
# Migration 2.2 vers 2.3
## Configuration
......
Description
===========
MaarchRM is an open source software that allows you to store, find and display
your digital resources in compliance with international regulation ISO. It’s a
full featured PHP PostgresSQL software.
MaarchRM is an open source software that allows you to store, find and display your digital resources in compliance with international regulation ISO. It’s a full featured PHP PostgresSQL software.
Maarch RM est un logiciel d'archivage électronique (SAE) libre et Open Source permettant de stocker, de rechercher et de consulter vos ressources numériques, dans le respect des réglementations internationales ISO concernant la conservation d'archives électroniques et de documents engageants.
Licence
=======
MaarchRM is released under the GPL v3 (or later) license, see
[LICENCE.txt](https://labs.maarch.org/maarch/maarchRM/blob/master/LICENCE.txt)
\ No newline at end of file
Maarch RM est publié sous la licence GPL v3, consultable ici : [LICENCE.txt](https://labs.maarch.org/maarch/maarchRM/blob/master/LICENCE.txt)
Liens utiles
============
Retrouvez ici l'ensemble des espaces Maarch RM vous permettant de vous familiariser complètement avec nos outils..
* Environnement de démonstration en ligne, accompagnée du guide de visite et du jeu de données associé (**Attention** cette démonstration est remise à 0 toutes les 4 heures) : https://demo.maarchrm.com/
* Téléchargement des images Docker (déploiement d’instances pour les démonstrations) : https://hub.docker.com/u/maarch
* Documentation fonctionnelle et technique : https://docs.maarch.org/maarchRM/
* Forum/espace communautaire de discussion autour du produit : https://community.maarch.org/c/maarch-rm
* Product Backlog (+ versions) : https://forge.maarch.org/projects/maarch-rm/roadmap
Références normatives
=====================
Maarch RM a été conçu sur la base des spécifications définies au sein des normes et référentiels impactants l'archivage électronique en France et à l'international.
Ainsi, ce SAE s'appuie sur :
* Norme NF Z42-13 : Spécifications relatives à la conception et à l’exploitation de systèmes informatiques en vue d’assurer la conservation et l’intégrité des documents stockés dans ces systèmes
* Guide d'Application Z42-019 : Guide d'application de la norme NF Z42-013
* Règles de certification NF 461 : Système d'archivage électronique
* Norme NF Z44-022 – Modélisation des Échanges de Données pour l'Archivage (MEDONA)
* ISO 15489-1 : Information et documentation « Records Management »
* ISO 14721 : Systèmes de transfert des informations et données spatiales - Système ouvert d'archivage d'information (SOAI, OAIS)
* Archivage sécurisé – Cahier des charges SAE – 16 mai 2006 (SGDN / DCSSI / SDO / BCS)
Norme NF Z42-020 : Spécifications fonctionnelles d’un composant Coffre-Fort Numérique destiné à la conservation d’informations numériques dans des conditions de nature à en garantir leur intégrité dans le temps.
\ No newline at end of file
......@@ -22,10 +22,10 @@ settings:
modules:
enabled:
- Db:
dsn: 'pgsql:host=localhost;dbname=maarchRMtest;port=5432'
dsn: 'pgsql:host=localhost;dbname=maarchRM;port=5432'
user: 'maarch'
password: 'maarch'
dump: 'tests/codeception/_data/dump.sql'
cleanup: false # run populator before each test
populate: true # run populator before all test
populator: 'psql -U $user -h $host -d $dbname < $dump'
\ No newline at end of file
populator: 'PGPASSWORD=maarch psql -U $user -h $host -d $dbname < $dump'
\ No newline at end of file
# suite config
suites:
api:
actor: ApiTester
path: .
modules:
enabled:
- REST:
url: http://maarchrm
depends: PhpBrowser
paths:
tests: tests/codeception
output: tests/codeception/_output
data: tests/codeception/_data
support: tests/codeception/_support
settings:
shuffle: false
lint: true
modules:
enabled:
- Db:
dsn: 'pgsql:host=postgres;dbname=maarchRMtest;port=5432'
user: 'maarch'
password: 'maarch'
dump: 'tests/codeception/_data/dump.sql'
cleanup: false # run populator before each test
populate: true # run populator before all test
populator: 'psql -U $user -h $host -d $dbname < $dump'
\ No newline at end of file
<?php
/*
* Copyright (C) 2015 Maarch
*
* This file is part of Laabs.
*
* Laabs is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Laabs is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Laabs. If not, see <http://www.gnu.org/licenses/>.
*/
namespace core\Encoding;
/**
* Base64 encoder/decoder
*
* @package Laabs
* @author Cyril Vazquez (Maarch) <cyril.vazquez@maarch.org>
*/
class Base64
{
/**
* Encode stream
*/
public static function decode($value)
{
if (is_scalar($value)) {
return base64_decode($value);
}
if (is_resource($value)) {
$stream = fopen('php://temp', 'w+');
while (!feof($value)) {
$chunk = fread($value, 1024*1024*2);
fwrite($stream, base64_decode($chunk));
}
rewind($stream);
return $stream;
}
}
}
<?php
class JsonParser
{
function parse($stream, $threshold = 2097152)
{
$tokenizer = new JsonTokenizer($stream, $threshold);
$stack = [];
$keys = [];
$result = null;
while ($token = $tokenizer->next()) {
switch ($token['token']) {
case JsonTokenizer::TOKEN_OBJECT_START:
if (isset($token['key'])) {
$keys[] = $token['key'];
}
$stack[] = new stdClass();