SysPass Update 2.0.0.17021302

De EjnTricks

Cet article présente la mise à jour de sysPass en version 2.0.0.17021302.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Bug-icon.png Erreur installation

Une tentative d'installation de cette version a été réalisée par la mise à jour d'une instance 1.2.0.21. Cependant, des erreurs de mises à jour se sont produites sur la base de données. Des contraintes sont ajoutées sur les tables et rentraient en conflit avec les données existantes, qui pointaient sur des références d'utilisateurs ou comptes inexistants. Lors des tentatives de mises à jour, la page présentait le message d'erreur suivant.


Des opérations manuelles ont été nécessaires.


Download-icon.png Téléchargement

L'application est téléchargée, en version 2.0.0.17021302, dans le répertoire /var/opt/syspass.


System-Install-icon.png Installation

L'application va être installée sous /var/opt/syspass, avec modification de l'emplacement racine pour être 2.0.0.17021302.

#sudo tar --transform 's/^sysPass-2.0.0.17021302/2.0.0.17021302/' -C /var/opt/syspass -xzvf /var/opt/syspass/2.0.0.17021302.tar.gz

Le fichier téléchargé peut être supprimé.

#sudo rm /var/opt/syspass/2.0.0.17021302.tar.gz


Icon File Owner.png Propriétaire fichiers

L'installation a été réalisée avec le compte root. Il est préférable de donner la propriété au compte de démarrage du serveur web, soit www-data dans le cadre de cette installation.

#sudo chown -R www-data:www-data /var/opt/syspass/2.0.0.17021302


Icon ACL.png Sécurisation

Les droits mis en place seront uniquement pour le compte d'exécution du serveur Web, soit www-data dans le cadre de cette installation.

#sudo chmod -R go-rwx /var/opt/syspass/2.0.0.17021302

Warning-icon.png Attention, les configurations passent au format XML, dans le répertoire config. Or ceci implique qu'elles sont disponibles par simple URL. Il serait donc possible d'accéder aux configurations de l'application, comme le compte MySQL par exemple.

Ce point est abordé sur la documentation officielle afin d'interdire l'accès. Dans le cadre de cette installation, un fichier .htaccess a été mis en place dans le répertoire config avec le contenu suivant.

# line below if for Apache 2.4
<ifModule mod_authz_core.c>
Require all denied
</ifModule>

# line below if for Apache 2.2
<ifModule !mod_authz_core.c>
deny from all
</ifModule>

# section for Apache 2.2 and 2.4
IndexIgnore *


Icon-Configuration-Settings.png Configuration

Lors de l'installation, le fichier de configuration a été externalisé dans le répertoire /var/opt/syspass/common/config. Il faut référencer cette configuration dans la nouvelle version.

#sudo rm -rf /var/opt/syspass/2.0.0.17021302/config
#sudo ln -s /var/opt/syspass/common/config /var/opt/syspass/2.0.0.17021302/config
#sudo chown -h www-data:www-data /var/opt/syspass/2.0.0.17021302/config


Lock-icon.png Permissions compte base de données

Suite à l'installation, les droits d'accès du compte MySql ont été réduits. Afin de s'assurer qu'aucun problème n'aura lieu, les permissions sont temporairement augmentées pour la mise à jour, en cas de modification du schéma.

mysql> REVOKE ALL ON syspass.* FROM 'syspass'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON syspass.* TO 'syspass'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)


Configuration-icon.png Publication Apache

Run-icon.png Publication

Puis le lien /var/opt/syspass/installed doit être mis à jour afin de pointer sur cette nouvelle version.

#sudo rm /var/opt/syspass/installed
#sudo ln -s /var/opt/syspass/2.0.0.17021302 /var/opt/syspass/installed
#sudo chown -h www-data:www-data /var/opt/syspass/installed

Lors du premier accès, l'utilisateur doit déclencher la mise à jour.


A noter, un nouveau fichier de configuration est créé config/config.xml, ainsi que le fichier config/pubkey.pem. Cependant les permissions mises en place sont trop permissive car elle donne un droit de lecture à tous les comptes de la plateforme.

#sudo chmod 640 /var/opt/syspass/installed/config/*

Il faut cliquer sur le lien Mis à jour pour déclencher la mise à jour. La première étape va modifier la base de données.


Il est demandé de renseigner le code de sécurité, qui est généré dans le fichier config.xml au niveau de la balise upgradeKey. Il faut également s'assurer de cocher la case en dessous de la zone de saisie, afin de confirmer qu'une sauvegarde complète a bien été réalisée.


A noter qu'il est obligatoire de cocher la case, sinon la mise à jour n'est pas déclenchée. En fin d'exécution résussie, l'utilisateur est redirigée vers la page de connection avec un message de confirmation.


Browser Icon.png Paramètres affichage

Jusqu'à cette version, il existait deux modes de navigation, classic et material-blue. Or seul le mode material-blue est conservé et il faut s'assurer que tous les utiliteurs déclarés utilisent bien ce thème.

Il est possible de consulter les paramètres des utilisateurs à partir de la colonne user_preferences de la table usrData.

Icon Personnalisation.png Modification script

Lors de cette mise à jour sur l'instance utilisée, un index est supprimé sur la table accounts. Ceci est réalisé dans le fichier inc/sql/1316011001.sql

ALTER TABLE `accounts` DROP INDEX `IDX_searchTxt`;

Or cet index n'existait pas et la mise à jour n'aboutit pas, avec les messages suivants dans la log du serveur.

#0  SP\\Storage\\DB->prepareQueryData() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Storage/DB.class.php:150]\n
#1  SP\\Storage\\DB->doQuery() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Storage/DB.class.php:347]\n
#2  SP\\Storage\\DB::getQuery() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Core/Upgrade.class.php:109]\n
#3  SP\\Core\\Upgrade::upgradeDB() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Core/Upgrade.class.php:64]\n
#4  SP\\Core\\Upgrade::doUpgrade() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Core/Init.class.php:647]\n
#5  SP\\Core\\Init::checkDbVersion() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Core/Init.class.php:166]\n
#6  SP\\Core\\Init::start() called at [/var/opt/syspass/2.0.0.17021302/inc/Base.php:109]\n
#7  require(/var/opt/syspass/2.0.0.17021302/inc/Base.php) called at [/var/opt/syspass/2.0.0.17021302/index.php:31]\n, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade
Error en la consulta\nSQLSTATE[42000]: Syntax error or access violation: 1091 
Can't DROP 'IDX_searchTxt'; check that column/key exists (42000), referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade
Caller 1: SP\\Storage\\DB\\logDBException, referer: ...
Caller 2: SP\\Storage\\DB\\getQuery, referer: ...
Caller 3: SP\\Core\\Upgrade\\upgradeDB, referer: ...
Caller 4: SP\\Core\\Upgrade\\doUpgrade, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade
Caller 5: SP\\Core\\Init\\checkDbVersion, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade
Caller 6: SP\\Core\\Init\\start, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade
Caller 7: \\require, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade
SQL : 'ALTER TABLE `accounts` DROP INDEX `IDX_searchTxt`', referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade

Cette instruction est tout simplement supprimé du fichier.


Icon-database-process.png Mise à jour base de données

De la même façon, des contraintes sont ajoutées sur la base de données. Or en fonction des données, ces ajouts ne peuvent aboutir et des erreurs sont constatées dans les log du serveur, comme l'exemple suivant.

Error en la consulta\nSQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint
fails (`syspass`.`#sql-3b3_164d4`, CONSTRAINT `fk_accHistory_users_edit_id` FOREIGN KEY (`acchistory_userEditId`) REFERENCES `usrData`
(`user_id`)) (23000), referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade
SQL : 'ALTER TABLE `accHistory`  ADD CONSTRAINT `fk_accHistory_users_edit_id`FOREIGN KEY (`acchistory_userEditId`)
REFERENCES `usrData` (`user_id`)  ON DELETE RESTRICT  ON UPDATE RESTRICT', referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade
initError, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade
Error al aplicar la actualizaci\xc3\xb3n de la Base de Datos, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade

Afin de corriger cette anoamlie de mise à jour, il a été nécessaire de modifier les données manuellement avant exécution de la mise à jour. Cela a été fait au fur et à mesure des tentatives en consultant les logs. Il est également possible de repérer les ajouts de contraintes dans les scripts de mise à jour, et de s'assurer que les modifications n'entraîneraient pas d'erreur.

Dans le fichier inc/sql/13161000601.sql, la commande suivante est exécutée.

ALTER TABLE `accHistory`
  ADD CONSTRAINT `fk_accHistory_users_edit_id`
FOREIGN KEY (`acchistory_userEditId`)
REFERENCES `usrData` (`user_id`)
  ON DELETE RESTRICT
  ON UPDATE RESTRICT;

Les données ont été corrigées en forçant la valeur de acchistory_userEditId avec la donnée dans la colonne acchistory_userId.

UPDATE accHistory set acchistory_userEditId = acchistory_userId 
WHERE acchistory_userEditId NOT IN (SELECT user_id FROM usrData) or acchistory_userEditId IS NULL;

De la même façon, l'instruction suivante posait problème.

ALTER TABLE `accHistory`
  ADD CONSTRAINT `fk_accHistory_customer_id`
FOREIGN KEY (`acchistory_customerId`)
REFERENCES `customers` (`customer_id`)
  ON DELETE RESTRICT
  ON UPDATE RESTRICT;

Les valeurs de la colonne account_id, de la table accounts, ont été injectées dans la colonne acchistory_accountId de accHistory quand cela était nécessaire.

UPDATE accHistory join (
SELECT account_customerId, account_id 
    FROM accounts
) as accounts
ON accHistory.acchistory_accountId = accounts.account_id
SET accHistory.acchistory_customerId = accounts.account_customerId
WHERE  (accHistory.acchistory_customerId NOT IN (SELECT customer_id FROM customers) OR accHistory.acchistory_customerId IS NULL);

Enfin, une dernière mise à jour entraînait problème.

ALTER TABLE `accounts`
  ADD CONSTRAINT `fk_accounts_user_edit_id`
FOREIGN KEY (`account_userEditId`)
REFERENCES `usrData` (`user_id`)
  ON DELETE RESTRICT
  ON UPDATE RESTRICT;

Cela a été corrigé en injectant dans la colonne account_userEditId la valeur de la colonne account_userId, quand cela était nécessaire.

UPDATE accounts SET account_userEditId = account_userId 
WHERE account_userEditId NOT IN (SELECT user_id FROM usrData) or account_userEditId IS NULL;


Lock-icon.png Permissions compte base de données post install

La mise à jour étant en échec les droits du compte sur la base de données sont diminués, après avoir restauré les fichiers de configuration. Dans le cadre de cette mise à jour, cela n'était pas nécessaire. Les commandes suivantes sont exécutées.

mysql> REVOKE ALL ON syspass.* FROM 'syspass'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON syspass.* TO 'syspass'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)


Viewer icon.png Voir aussi

Documentation officielle: https://github.com/nuxsmin/sysPass/releases/tag/2.0.0.17021302