From 88fc960c3c2674b2d03f1b19357f85ba4551d1ab Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Wed, 23 Feb 2022 12:32:26 +0100 Subject: [PATCH] Gestion de l'installation : - il faut creer une cle des auth si besoin - on utilise la fonction auth_spip_modifier_pass() pour changer le pass du webmestre que l'on cree - si on a perdu le fichier config/cle.php on demande a ce que l'installation se fasse par un webmestre qui a un backup des cles, avec son mot de passe actuel - et on restaure les cles a l'installation --- ecrire/install/etape_3b.php | 77 +++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 25 deletions(-) diff --git a/ecrire/install/etape_3b.php b/ecrire/install/etape_3b.php index 461b727cfb..718b0d08f4 100644 --- a/ecrire/install/etape_3b.php +++ b/ecrire/install/etape_3b.php @@ -49,14 +49,7 @@ function install_etape_3b_dist() { $echec = _T('form_email_non_valide'); } if ($echec) { - echo minipres( - 'AUTO', - info_progression_etape(3, 'etape_', 'install/', true) . - "<div class='error'><h3>$echec</h3>\n" . - '<p>' . _T('avis_connexion_echec_2') . '</p>' . - '</div>' - ); - exit; + echouer_etape_3b($echec); } } @@ -84,12 +77,8 @@ function install_etape_3b_dist() { # pour le passwd, bizarrement il faut le convertir comme s'il avait # ete tape en iso-8859-1 ; car c'est en fait ce que voit md5.js $pass = unicode2charset(utf_8_to_unicode($pass), 'iso-8859-1'); - include_spip('auth/sha256.inc'); - include_spip('inc/acces'); - $htpass = generer_htpass($pass); - $alea_actuel = creer_uniqid(); - $alea_futur = creer_uniqid(); - $shapass = spip_sha256($alea_actuel . $pass); + + include_spip('auth/spip'); // prelablement, creer le champ webmestre si il n'existe pas (install neuve // sur une vieille base $t = sql_showtable('spip_auteurs', true); @@ -97,32 +86,59 @@ function install_etape_3b_dist() { @sql_alter("TABLE spip_auteurs ADD webmestre varchar(3) DEFAULT 'non' NOT NULL"); } + // il faut avoir une cle des auth valide pour creer un nouvel auteur webmestre + include_spip('inc/chiffrer'); + $cles = Spip\Core\Chiffrer\SpipCles::instance(); + $secret = $cles->getSecretAuth(); + $id_auteur = sql_getfetsel('id_auteur', 'spip_auteurs', 'login=' . sql_quote($login)); if ($id_auteur !== null) { + // c'est un auteur connu : si on a pas de secret il faut absolument qu'il se reconnecte avec le meme mot de passe + // pour restaurer la copie des cles + if (!$secret and !auth_spip_initialiser_secret()) { + $row = sql_fetsel('backup_cles, pass', 'spip_auteurs', 'id_auteur='.intval($id_auteur)); + if (empty($row['backup_cles']) or !$cles->restore($row['backup_cles'], $pass, $row['pass'], $id_auteur)) { + $echec = _L('L\'installation doit être faite par un webmestre avec un backup des cles et son mot de passe'); + echouer_etape_3b($echec); + } + spip_log("Les cles secretes ont ete restaurées avec le backup du webmestre #$id_auteur", "auth"._LOG_INFO_IMPORTANTE); + $cles->save(); + } + sql_updateq('spip_auteurs', [ 'nom' => $nom, 'email' => $email, 'login' => $login, - 'pass' => $shapass, - 'alea_actuel' => $alea_actuel, - 'alea_futur' => $alea_futur, - 'htpass' => $htpass, 'statut' => '0minirezo' - ], "id_auteur=$id_auteur"); + ], "id_auteur=".intval($id_auteur)); + // le passer webmestre separement du reste, au cas ou l'alter n'aurait pas fonctionne + @sql_updateq('spip_auteurs', ['webmestre' => 'oui'], "id_auteur=$id_auteur"); + if (!auth_spip_modifier_pass($login, $pass, $id_auteur)) { + $echec = _L('Echec lors de l\'initialisation de l\'acces'); + echouer_etape_3b($echec); + } } else { + + // Si on a pas de cle et qu'on ne sait pas la creer, on ne peut pas creer de nouveau compte : + // il faut qu'un webmestre avec un backup fasse l'install + if (!$secret and !auth_spip_initialiser_secret()) { + $echec = _L('L\'installation doit être faite par un webmestre avec un backup des cles'); + echouer_etape_3b($echec); + } + $id_auteur = sql_insertq('spip_auteurs', [ 'nom' => $nom, 'email' => $email, 'login' => $login, - 'pass' => $shapass, - 'htpass' => $htpass, - 'alea_actuel' => $alea_actuel, - 'alea_futur' => $alea_futur, 'statut' => '0minirezo' ]); + // le passer webmestre separrement du reste, au cas ou l'alter n'aurait pas fonctionne + @sql_updateq('spip_auteurs', ['webmestre' => 'oui'], "id_auteur=$id_auteur"); + if (!auth_spip_modifier_pass($login, $pass, $id_auteur)) { + $echec = _L('Echec lors de l\'initialisation de l\'acces'); + echouer_etape_3b($echec); + } } - // le passer webmestre separrement du reste, au cas ou l'alter n'aurait pas fonctionne - @sql_updateq('spip_auteurs', ['webmestre' => 'oui'], "id_auteur=$id_auteur"); // inserer email comme email webmaster principal // (sauf s'il est vide: cas de la re-installation) @@ -155,3 +171,14 @@ function install_etape_3b_dist() { include_spip('inc/distant'); redirige_par_entete(parametre_url(self(), 'etape', '4', '&')); } + +function echouer_etape_3b($echec) { + echo minipres( + 'AUTO', + info_progression_etape(3, 'etape_', 'install/', true) . + "<div class='error'><h3>$echec</h3>\n" . + '<p>' . _T('avis_connexion_echec_2') . '</p>' . + '</div>' + ); + exit; +} -- GitLab