From a9734a89c651fb2c28ea12cca0df58f93fb90f6c Mon Sep 17 00:00:00 2001
From: Matthieu Marcillaud <marcimat@rezo.net>
Date: Mon, 3 Jul 2023 18:59:25 +0200
Subject: [PATCH] =?UTF-8?q?refactor:=20Ajout=20d=E2=80=99une=20fonction=20?=
 =?UTF-8?q?`effacer=5Fcookie=5Fsession()`=20et=20typages=20plus=20strict?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 action/logout.php |  2 +-
 inc/session.php   | 87 +++++++++++++++++++++++++----------------------
 2 files changed, 47 insertions(+), 42 deletions(-)

diff --git a/action/logout.php b/action/logout.php
index 60077c260..698690ddf 100644
--- a/action/logout.php
+++ b/action/logout.php
@@ -72,7 +72,7 @@ function action_logout_dist() {
 		if (isset($_COOKIE['spip_session'])) {
 			$session = charger_fonction('session', 'inc');
 			$session($GLOBALS['visiteur_session']['id_auteur']);
-			set_cookie_session(false);
+			effacer_cookie_session();
 		}
 		// si authentification http, et que la personne est loge,
 		// pour se deconnecter, il faut proposer un nouveau formulaire de connexion http
diff --git a/inc/session.php b/inc/session.php
index 0d0d19630..46fb9558b 100644
--- a/inc/session.php
+++ b/inc/session.php
@@ -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));
 	}
@@ -232,8 +234,8 @@ function ajouter_session($auteur) {
 			time() + max(_DUREE_COOKIE_ADMIN, $duree),
 			httponly: true
 		);
-	} // sinon le supprimer ...
-	else {
+	} else {
+		// sinon le supprimer ...
 		spip_setcookie('spip_admin', '', 1, httponly: true);
 	}
 
@@ -273,62 +275,65 @@ function definir_duree_cookie_session($auteur) {
 
 /**
  * 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 = [];
 	// pas de cookie ?
 	if (!isset($_COOKIE['spip_session'])) {
-		return false;
+		return null;
 	}
 
-	if (!isset($cookie_valide[$_COOKIE['spip_session']])) {
-		// cookie de test ?
-		if ($accepter_test && $_COOKIE['spip_session'] === 'test_echec_cookie') {
-			return 'test_echec_cookie';
-		}
+	if (array_key_exists($_COOKIE['spip_session'], $cookie_valide)) {
+		return $cookie_valide[$_COOKIE['spip_session']];
+	}
+
+	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 ?
-		elseif (!preg_match(",^\d+_[0-9a-f]{32}$,", $_COOKIE['spip_session'])) {
-			$cookie_valide[$_COOKIE['spip_session']] = false;
-			unset($_COOKIE['spip_session']);
-			return false;
-		}
-		// ok
-		$cookie_valide[$_COOKIE['spip_session']] = $_COOKIE['spip_session'];
+		effacer_cookie_session();
+		return null;
 	}
 
-	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
- *   nouveau cookie (string), reset (false), prolonger le cookie existant (null)
+ * @param string|null $valeur_cookie
+ *   nouveau cookie (string), prolonger le cookie existant (null)
  * @param int $expires
  *   timestamp d'expiration
- * @return false|string
  */
-function set_cookie_session($valeur_cookie = null, int $expires = 0) {
-	if (is_null($valeur_cookie)) {
-		$valeur_cookie = lire_cookie_session();
-	}
-	else {
-		// verifier que la valeur est bien valide
+function set_cookie_session(?string $valeur_cookie = null, int $expires = 0): ?string {
+	if ($valeur_cookie !== null) {
+		// vérifié par lire_cookie_session()
 		$_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);
 	}
+
 	return $valeur_cookie;
 }
 
@@ -460,7 +465,7 @@ function session_get($nom) {
  * @uses terminer_actualiser_sessions() Ajoute la fonction en fin de hit.
  *
  * @param string $nom
- * @param null $val
+ * @param mixed $val
  * @return void|array
  */
 function session_set($nom, $val = null) {
@@ -536,7 +541,7 @@ function actualiser_sessions($auteur, $supprimer_cles = []) {
 	if ($id_auteur == $id_auteur_courant) {
 		$auteur = array_merge($GLOBALS['visiteur_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);
 		}
 	}
-- 
GitLab