diff --git a/ecrire/auth/spip.php b/ecrire/auth/spip.php index fde4f565afe2a003d168b3dfeef057d4e60c8071..5705a146c052cac9e3967cf16a63ac2cf457c80d 100644 --- a/ecrire/auth/spip.php +++ b/ecrire/auth/spip.php @@ -43,6 +43,7 @@ function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) { $md5pass = ''; $shapass = $shanext = ''; + $auteur_peut_sauver_cles = false; if ($pass) { $row = sql_fetsel( @@ -55,6 +56,11 @@ function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) { '', $serveur ); + + // lever un flag si cet auteur peut sauver les cles + if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) { + $auteur_peut_sauver_cles = true; + } } // login inexistant ou mot de passe vide @@ -66,13 +72,6 @@ function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) { $cles = SpipCles::instance(); $secret = $cles->getSecretAuth(); - // Créer la clé si besoin (en verifiant la presence ou non d'un backup chez un webmestre) - if (!$secret) { - if (auth_spip_initialiser_secret()) { - $secret = $cles->getSecretAuth(); - } - } - switch (strlen($row['pass'])) { case 32: // tres anciens mots de passe encodes en md5(alea.pass) @@ -96,7 +95,7 @@ function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) { // doit-on restaurer un backup des cles ? if ( !$secret - and $row['webmestre'] === 'oui' + and $auteur_peut_sauver_cles and !empty($row['backup_cles']) ) { if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) { @@ -108,12 +107,23 @@ function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) { sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); } } - if (!Password::verifier($pass, $row['pass'], $secret)) { + + if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) { unset($row); } break; } + // Migration depuis ancienne version : si on a pas encore de cle + // ET si c'est le login d'un auteur qui peut sauver la cle + // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php) + // si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre + if (!$secret and $auteur_peut_sauver_cles) { + if (auth_spip_initialiser_secret()) { + $secret = $cles->getSecretAuth(); + } + } + // login/mot de passe incorrect if (empty($row)) { return []; @@ -130,8 +140,8 @@ function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) { 'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1 'pass' => sql_quote($pass_hash_next, $serveur, 'text'), ]; - // a chaque login de webmestre : sauvegarde chiffree des clé du site (avec les pass du webmestre) - if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) { + // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre) + if ($auteur_peut_sauver_cles) { $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text'); }