Browse Source

fix(auth): En cas d'echec lors de l'écriture du fichier des clés ignorer la clé générée et provoquer une minipres fatale pour corriger le problème

Fix: #5206
pull/5207/head
Cerdic 10 months ago committed by Matthieu Marcillaud
parent
commit
5512ce374b
  1. 10
      ecrire/auth/spip.php
  2. 8
      ecrire/src/Chiffrer/Cles.php
  3. 9
      ecrire/src/Chiffrer/SpipCles.php

10
ecrire/auth/spip.php

@ -214,13 +214,17 @@ function auth_spip_initialiser_secret(bool $force = false): bool {
$has_backup = array_column($has_backup, 'id_auteur');
if (empty($has_backup)) {
spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
$secret = $cles->getSecretAuth(true);
return true;
if ($secret = $cles->getSecretAuth(true)) {
return true;
}
spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
// et on echoue car on ne veut pas que la situation reste telle quelle
raler_fichier(_DIR_ETC . 'cles.php');
}
else {
spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
return false;
}
return false;
}
/**

8
ecrire/src/Chiffrer/Cles.php

@ -42,6 +42,14 @@ class Cles implements \Countable /* , ContainerInterface */ {
$this->keys[$name] = $key;
}
public function delete(string $name): bool {
if (isset($this->keys[$name])) {
unset($this->keys[$name]);
return true;
};
return false;
}
public function count(): int {
return count($this->keys);
}

9
ecrire/src/Chiffrer/SpipCles.php

@ -140,8 +140,13 @@ final class SpipCles {
}
if ($autoInit) {
$this->cles->generate($name);
$this->save();
return $this->cles->get($name);
// si l'ecriture de fichier a bien marche on peut utiliser la cle
if ($this->save()) {
return $this->cles->get($name);
}
// sinon loger et annule la cle generee car il ne faut pas l'utiliser
spip_log("Echec ecriture du fichier cle ".$this->file." ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR);
$this->cles->delete($name);
}
return null;
}

Loading…
Cancel
Save