Skip to content
Extraits de code Groupes Projets
Valider a9734a89 rédigé par marcimat's avatar marcimat Validation de marcimat
Parcourir les fichiers

refactor: Ajout d’une fonction `effacer_cookie_session()` et typages plus strict

parent 8a900076
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -72,7 +72,7 @@ function action_logout_dist() { ...@@ -72,7 +72,7 @@ function action_logout_dist() {
if (isset($_COOKIE['spip_session'])) { if (isset($_COOKIE['spip_session'])) {
$session = charger_fonction('session', 'inc'); $session = charger_fonction('session', 'inc');
$session($GLOBALS['visiteur_session']['id_auteur']); $session($GLOBALS['visiteur_session']['id_auteur']);
set_cookie_session(false); effacer_cookie_session();
} }
// si authentification http, et que la personne est loge, // si authentification http, et que la personne est loge,
// pour se deconnecter, il faut proposer un nouveau formulaire de connexion http // pour se deconnecter, il faut proposer un nouveau formulaire de connexion http
......
...@@ -170,7 +170,9 @@ function ajouter_session($auteur) { ...@@ -170,7 +170,9 @@ function ajouter_session($auteur) {
} }
} }
if ((!$cookie = lire_cookie_session()) || intval($cookie) !== $id_auteur if (
(!$cookie = lire_cookie_session())
|| intval($cookie) !== $id_auteur
) { ) {
$cookie = $id_auteur . '_' . md5(uniqid(random_int(0, mt_getrandmax()), true)); $cookie = $id_auteur . '_' . md5(uniqid(random_int(0, mt_getrandmax()), true));
} }
...@@ -232,8 +234,8 @@ function ajouter_session($auteur) { ...@@ -232,8 +234,8 @@ function ajouter_session($auteur) {
time() + max(_DUREE_COOKIE_ADMIN, $duree), time() + max(_DUREE_COOKIE_ADMIN, $duree),
httponly: true httponly: true
); );
} // sinon le supprimer ... } else {
else { // sinon le supprimer ...
spip_setcookie('spip_admin', '', 1, httponly: true); spip_setcookie('spip_admin', '', 1, httponly: true);
} }
...@@ -273,62 +275,65 @@ function definir_duree_cookie_session($auteur) { ...@@ -273,62 +275,65 @@ function definir_duree_cookie_session($auteur) {
/** /**
* Lire le cookie de session et le valider de façon centralisée * Lire le cookie de session et le valider de façon centralisée
* @return false|string
*/ */
function lire_cookie_session($accepter_test = false) { function lire_cookie_session(bool $accepter_test = false): ?string {
static $cookie_valide = []; static $cookie_valide = [];
// pas de cookie ? // pas de cookie ?
if (!isset($_COOKIE['spip_session'])) { if (!isset($_COOKIE['spip_session'])) {
return false; return null;
} }
if (!isset($cookie_valide[$_COOKIE['spip_session']])) { if (array_key_exists($_COOKIE['spip_session'], $cookie_valide)) {
// cookie de test ? return $cookie_valide[$_COOKIE['spip_session']];
if ($accepter_test && $_COOKIE['spip_session'] === 'test_echec_cookie') { }
return 'test_echec_cookie';
} if ($accepter_test && $_COOKIE['spip_session'] === 'test_echec_cookie') {
return 'test_echec_cookie';
}
if (!preg_match(",^\d+_[0-9a-f]{32}$,", $_COOKIE['spip_session'])) {
// cookie invalide ? // cookie invalide ?
elseif (!preg_match(",^\d+_[0-9a-f]{32}$,", $_COOKIE['spip_session'])) { effacer_cookie_session();
$cookie_valide[$_COOKIE['spip_session']] = false; return null;
unset($_COOKIE['spip_session']);
return false;
}
// ok
$cookie_valide[$_COOKIE['spip_session']] = $_COOKIE['spip_session'];
} }
return $cookie_valide[$_COOKIE['spip_session']]; // ok
$cookie_valide[$_COOKIE['spip_session']] = $_COOKIE['spip_session'];
return $_COOKIE['spip_session'];
}
/** Annuler le cookie de session */
function effacer_cookie_session(): void {
// supprimer le cookie
if (isset($_COOKIE['spip_session'])) {
spip_setcookie('spip_session', '', time() - 24 * 3600, httponly: true);
unset($_COOKIE['spip_session']);
}
} }
/** /**
* Prolonger/Changer la valeur/annuler le cookie de session * Prolonger / Changer la valeur du cookie de session
* *
* @param string|false|null $valeur_cookie * @param string|null $valeur_cookie
* nouveau cookie (string), reset (false), prolonger le cookie existant (null) * nouveau cookie (string), prolonger le cookie existant (null)
* @param int $expires * @param int $expires
* timestamp d'expiration * timestamp d'expiration
* @return false|string
*/ */
function set_cookie_session($valeur_cookie = null, int $expires = 0) { function set_cookie_session(?string $valeur_cookie = null, int $expires = 0): ?string {
if (is_null($valeur_cookie)) { if ($valeur_cookie !== null) {
$valeur_cookie = lire_cookie_session(); // vérifié par lire_cookie_session()
}
else {
// verifier que la valeur est bien valide
$_COOKIE['spip_session'] = $valeur_cookie; $_COOKIE['spip_session'] = $valeur_cookie;
$valeur_cookie = lire_cookie_session();
}
if (!$valeur_cookie) {
// supprimer le cookie
if (isset($_COOKIE['spip_session'])) {
spip_setcookie('spip_session', '', time() - 24 * 3600, httponly: true);
}
unset($_COOKIE['spip_session']);
} }
else {
// set le cookie $valeur_cookie = lire_cookie_session();
if ($valeur_cookie === null) {
effacer_cookie_session();
} else {
spip_setcookie('spip_session', $valeur_cookie, $expires, httponly: true); spip_setcookie('spip_session', $valeur_cookie, $expires, httponly: true);
} }
return $valeur_cookie; return $valeur_cookie;
} }
...@@ -460,7 +465,7 @@ function session_get($nom) { ...@@ -460,7 +465,7 @@ function session_get($nom) {
* @uses terminer_actualiser_sessions() Ajoute la fonction en fin de hit. * @uses terminer_actualiser_sessions() Ajoute la fonction en fin de hit.
* *
* @param string $nom * @param string $nom
* @param null $val * @param mixed $val
* @return void|array * @return void|array
*/ */
function session_set($nom, $val = null) { function session_set($nom, $val = null) {
...@@ -536,7 +541,7 @@ function actualiser_sessions($auteur, $supprimer_cles = []) { ...@@ -536,7 +541,7 @@ function actualiser_sessions($auteur, $supprimer_cles = []) {
if ($id_auteur == $id_auteur_courant) { if ($id_auteur == $id_auteur_courant) {
$auteur = array_merge($GLOBALS['visiteur_session'], $auteur); $auteur = array_merge($GLOBALS['visiteur_session'], $auteur);
ajouter_session($auteur); ajouter_session($auteur);
if ($id_auteur and $cookie = lire_cookie_session()) { if ($id_auteur && ($cookie = lire_cookie_session())) {
$fichier_session_courante = chemin_fichier_session('alea_ephemere', $cookie); $fichier_session_courante = chemin_fichier_session('alea_ephemere', $cookie);
} }
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter