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

refactor: une fonction pour lire et valider le cookie session et eviter de...

refactor: une fonction pour lire et valider le cookie session et eviter de l'adresser partout dans le code directement + l'utiliser au lieu d'adresser la globale
parent 7c693b27
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -151,7 +151,7 @@ function auth_mode() { ...@@ -151,7 +151,7 @@ function auth_mode() {
// //
include_spip('inc/session'); include_spip('inc/session');
// Session valide en cours ? // Session valide en cours ?
if (isset($_COOKIE['spip_session'])) { if ($cookie = lire_cookie_session()) {
$session = charger_fonction('session', 'inc'); $session = charger_fonction('session', 'inc');
if ( if (
($id_auteur = $session()) || $id_auteur === 0 // reprise sur restauration ($id_auteur = $session()) || $id_auteur === 0 // reprise sur restauration
...@@ -250,7 +250,8 @@ function auth_init_droits($row) { ...@@ -250,7 +250,8 @@ function auth_init_droits($row) {
$GLOBALS['visiteur_session'] = auth_desensibiliser_session($GLOBALS['visiteur_session']); $GLOBALS['visiteur_session'] = auth_desensibiliser_session($GLOBALS['visiteur_session']);
// creer la session au besoin // creer la session au besoin
if (!isset($_COOKIE['spip_session'])) { include_spip('inc/session');
if (!lire_cookie_session()) {
$session = charger_fonction('session', 'inc'); $session = charger_fonction('session', 'inc');
$spip_session = $session($row); $spip_session = $session($row);
} }
......
...@@ -175,14 +175,12 @@ function caracteriser_auteur($id_auteur = null) { ...@@ -175,14 +175,12 @@ function caracteriser_auteur($id_auteur = null) {
static $caracterisation = []; static $caracterisation = [];
if (is_null($id_auteur) && !isset($GLOBALS['visiteur_session']['id_auteur'])) { if (is_null($id_auteur) && !isset($GLOBALS['visiteur_session']['id_auteur'])) {
include_spip('inc/session');
// si l'auteur courant n'est pas connu alors qu'il peut demander une action // si l'auteur courant n'est pas connu alors qu'il peut demander une action
// c'est une connexion par php_auth ou 1 instal, on se rabat sur le cookie. // c'est une connexion par php_auth ou 1 instal, on se rabat sur le cookie.
// S'il n'avait pas le droit de realiser cette action, le hash sera faux. // S'il n'avait pas le droit de realiser cette action, le hash sera faux.
if ( if ($cookie = lire_cookie_session()) {
isset($_COOKIE['spip_session']) return [intval($cookie), ''];
&& preg_match('/^(\d+)/', $_COOKIE['spip_session'], $r)
) {
return [$r[1], ''];
// Necessaire aux forums anonymes. // Necessaire aux forums anonymes.
// Pour le reste, ca echouera. // Pour le reste, ca echouera.
} else { } else {
......
...@@ -157,10 +157,10 @@ function ajouter_session($auteur) { ...@@ -157,10 +157,10 @@ function ajouter_session($auteur) {
// Si après ça la session est vide alors on supprime l'éventuel fichier et on arrête là // Si après ça la session est vide alors on supprime l'éventuel fichier et on arrête là
if (!$auteur_verif) { if (!$auteur_verif) {
if (isset($_COOKIE['spip_session']) && isset($_SESSION[$_COOKIE['spip_session']])) { if ($cookie = lire_cookie_session()) {
unset($_SESSION[$_COOKIE['spip_session']]); if (isset($_SESSION[$cookie])) {
} unset($_SESSION[$cookie]);
if (isset($_COOKIE['spip_session'])) { }
unset($_COOKIE['spip_session']); unset($_COOKIE['spip_session']);
} }
...@@ -168,10 +168,9 @@ function ajouter_session($auteur) { ...@@ -168,10 +168,9 @@ function ajouter_session($auteur) {
} }
} }
if ( if ((!$cookie = lire_cookie_session()) || intval($cookie) !== $id_auteur
!isset($_COOKIE['spip_session']) || !preg_match(',^' . $id_auteur . '_,', $_COOKIE['spip_session'])
) { ) {
$_COOKIE['spip_session'] = $id_auteur . '_' . md5(uniqid(random_int(0, mt_getrandmax()), true)); $cookie = $_COOKIE['spip_session'] = $id_auteur . '_' . md5(uniqid(random_int(0, mt_getrandmax()), true));
} }
// Maintenant on sait qu'on a des choses à écrire // Maintenant on sait qu'on a des choses à écrire
...@@ -200,7 +199,7 @@ function ajouter_session($auteur) { ...@@ -200,7 +199,7 @@ function ajouter_session($auteur) {
// les sessions anonymes sont stockees dans $_SESSION // les sessions anonymes sont stockees dans $_SESSION
if (!$id_auteur) { if (!$id_auteur) {
spip_php_session_start(); spip_php_session_start();
$_SESSION[$_COOKIE['spip_session']] = preparer_ecriture_session($auteur); $_SESSION[$cookie] = preparer_ecriture_session($auteur);
} else { } else {
$fichier_session = fichier_session('alea_ephemere'); $fichier_session = fichier_session('alea_ephemere');
if (!ecrire_fichier_session($fichier_session, $auteur)) { if (!ecrire_fichier_session($fichier_session, $auteur)) {
...@@ -217,7 +216,7 @@ function ajouter_session($auteur) { ...@@ -217,7 +216,7 @@ function ajouter_session($auteur) {
// poser le cookie de session SPIP // poser le cookie de session SPIP
include_spip('inc/cookie'); include_spip('inc/cookie');
$duree = definir_duree_cookie_session($auteur); $duree = definir_duree_cookie_session($auteur);
spip_setcookie('spip_session', $_COOKIE['spip_session'], time() + $duree, httponly: true); spip_setcookie('spip_session', $cookie, time() + $duree, httponly: true);
spip_log("ajoute session $fichier_session cookie $duree", 'session'); spip_log("ajoute session $fichier_session cookie $duree", 'session');
// Si on est admin, poser le cookie de correspondance // Si on est admin, poser le cookie de correspondance
...@@ -239,7 +238,7 @@ function ajouter_session($auteur) { ...@@ -239,7 +238,7 @@ function ajouter_session($auteur) {
# on en profite pour purger les vieilles sessions anonymes abandonnees # on en profite pour purger les vieilles sessions anonymes abandonnees
# supprimer_sessions(0, true, false); # supprimer_sessions(0, true, false);
return $_COOKIE['spip_session']; return $cookie;
} }
/** /**
...@@ -270,6 +269,27 @@ function definir_duree_cookie_session($auteur) { ...@@ -270,6 +269,27 @@ function definir_duree_cookie_session($auteur) {
return (int)(_RENOUVELLE_ALEA * $coef); return (int)(_RENOUVELLE_ALEA * $coef);
} }
function lire_cookie_session() {
static $cookie_valide = [];
// pas de cookie ?
if (!isset($_COOKIE['spip_session'])) {
return false;
}
if (!isset($cookie_valide[$_COOKIE['spip_session']])) {
// cookie invalide ?
if (!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'];
}
return $cookie_valide[$_COOKIE['spip_session']];
}
/** /**
* Vérifie si le cookie spip_session indique une session valide * Vérifie si le cookie spip_session indique une session valide
* *
...@@ -288,19 +308,19 @@ function definir_duree_cookie_session($auteur) { ...@@ -288,19 +308,19 @@ function definir_duree_cookie_session($auteur) {
*/ */
function verifier_session($change = false) { function verifier_session($change = false) {
// si pas de cookie, c'est fichu // si pas de cookie, c'est fichu
if (!isset($_COOKIE['spip_session'])) { if (!$cookie = lire_cookie_session()) {
return false; return false;
} }
$fichier_session = ''; $fichier_session = '';
// est-ce une session anonyme ? // est-ce une session anonyme ?
if (!intval($_COOKIE['spip_session'])) { if (!intval($cookie)) {
spip_php_session_start(); spip_php_session_start();
if (!isset($_SESSION[$_COOKIE['spip_session']]) || !is_array($_SESSION[$_COOKIE['spip_session']])) { if (!isset($_SESSION[$cookie]) || !is_array($_SESSION[$cookie])) {
return false; return false;
} }
$GLOBALS['visiteur_session'] = $_SESSION[$_COOKIE['spip_session']]; $GLOBALS['visiteur_session'] = $_SESSION[$cookie];
} else { } else {
// Tester avec alea courant // Tester avec alea courant
$fichier_session = fichier_session('alea_ephemere', true); $fichier_session = fichier_session('alea_ephemere', true);
...@@ -347,7 +367,7 @@ function verifier_session($change = false) { ...@@ -347,7 +367,7 @@ function verifier_session($change = false) {
} }
} else { } else {
if ($change) { if ($change) {
spip_log("rejoue session $fichier_session " . $_COOKIE['spip_session'], 'session'); spip_log("rejoue session $fichier_session $cookie", 'session');
if ($fichier_session) { if ($fichier_session) {
spip_unlink($fichier_session); spip_unlink($fichier_session);
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter