From b452d2ec4f376f039a5c9a592bdde34db8cc0931 Mon Sep 17 00:00:00 2001 From: Fil <fil@rezo.net> Date: Fri, 24 Aug 2007 23:22:24 +0000 Subject: [PATCH] la balise #SESSION cette balise provoque l'invalidation du cache si la session du visiteur a change : elle garantit donc que le cache est calcule pour ce visiteur et pas un autre (les anonymes partageant la meme session). son contenu est un tableau (serialize comme #ENV) contenant a ce jour les champs suivants : id_auteur nom login email statut lang ip_change hash_env les deux derniers n'ont pas d'interet, ils sauteront probablement ; il manque la bio, a voir si on l'ajoute ; a noter aucun filtre n'est applique (sauf interdire_scripts pour la securite) : pour afficher proprement Hello World il faut faire [Hello (#SESSION{nom}|typo)] n'importe quelle balise peut declencher l'invalideur en invoquant $p->desc['session'] = true; --- ecrire/inc/utils.php | 22 ++++++++++++++++++++++ ecrire/public/balises.php | 25 +++++++++++++++++++++++-- ecrire/public/cacher.php | 9 +++++++++ ecrire/public/references.php | 6 ++++++ 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index 321efffb22..5410e761e7 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -1389,6 +1389,28 @@ function lang_select ($lang=NULL) { changer_langue($lang); return $lang; } + + +// Renvoie une chaine qui decrit la session courante pour savoir si on peut +// utiliser un cache enregistre pour cette session. +// Par convention cette chaine ne doit pas contenir de caracteres [^0-9A-Za-z] +// Attention on ne peut *pas* inferer id_auteur a partir de la session, qui +// pourrait etre une chaine arbitraire -- ce n'est pas le cas pour l'instant +// http://doc.spip.org/@spip_session +function spip_session() { + static $session; + if (!isset($session)) { + $session = $GLOBALS['auteur_session'] + ? 'session' + .$GLOBALS['auteur_session']['id_auteur'] + .'_' + .$_COOKIE['spip_session'] + : ''; + } + #spip_log('session: '.$session); + return $session; +} + // // Aide, aussi depuis l'espace prive a present. // Surchargeable mais pas d'ereur fatale si indisponible. diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php index c2b44d5d4c..8660652853 100644 --- a/ecrire/public/balises.php +++ b/ecrire/public/balises.php @@ -998,6 +998,8 @@ function balise_CHEMIN_dist($p) { // // La syntaxe #ENV{toto, rempl} renverra 'rempl' si $toto est vide // +// Si le tableau est vide on renvoie '' (utile pour #SESSION) +// // http://doc.spip.org/@balise_ENV_dist function balise_ENV_dist($p, $src = NULL) { // le tableau de base de la balise (cf #META ci-dessous) @@ -1009,13 +1011,15 @@ function balise_ENV_dist($p, $src = NULL) { if (!$_nom) { // cas de #ENV sans argument : on retourne le serialize() du tableau // une belle fonction [(#ENV|affiche_env)] serait pratique - $p->code = 'serialize('.$src.')'; + $p->code = "($src ? serialize($src) : '')"; } else { // admet deux arguments : nom de variable, valeur par defaut si vide - $p->code = $src."[$_nom]"; + $p->code = 'is_array('.$src.') ? '.$src.'['.$_nom.'] : ""'; if ($_sinon) $p->code = 'sinon('. $p->code.",$_sinon)"; + else + $p->code = '('.$p->code.')'; } #$p->interdire_scripts = true; @@ -1039,6 +1043,23 @@ function balise_CONFIG_dist($p) { return balise_ENV_dist($p, '$GLOBALS["meta"]'); } +// +// #SESSION +// Cette balise est un tableau des donnees du visiteur (nom, email etc) +// Si elle est invoquee, elle leve un drapeau dans le fichier cache, qui +// permet a public/cacher d'invalider le cache si le visiteur suivant n'a +// pas la meme session +function balise_SESSION_dist($p) { + $p->descr['session'] = true; + + $f = function_exists('balise_ENV') + ? 'balise_ENV' + : 'balise_ENV_dist'; + + $p = $f($p, '$GLOBALS["auteur_session"]'); + return $p; +} + // // #EVAL{...} diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php index 3987807fa0..57bdf404a2 100644 --- a/ecrire/public/cacher.php +++ b/ecrire/public/cacher.php @@ -99,6 +99,15 @@ function cache_valide(&$page, $date) { return 1; } + // Si la page a un invalideur de session 'zz', on ignore le cache + // si le visiteur n'a pas la meme session 'zz' + if (isset($page['invalideurs']) + AND isset($page['invalideurs']['session']) + AND $page['invalideurs']['session'] != spip_session()) { + #spip_log('Session: \''.$page['invalideurs']['session'] . '\' != \''.spip_session().'\''); + return 1; + } + // Sinon comparer l'age du fichier a sa duree de cache $duree = intval($page['entetes']['X-Spip-Cache']); if ($duree == 0) #CACHE{0} diff --git a/ecrire/public/references.php b/ecrire/public/references.php index abae7b3670..df8fde1a02 100644 --- a/ecrire/public/references.php +++ b/ecrire/public/references.php @@ -439,6 +439,12 @@ function applique_filtres($p) { if ($p->param) $code = compose_filtres($p, $code); + // S'il y a un lien avec la session, ajouter un code qui levera + // un drapeau dans la structure d'invalidation $Cache + if ($p->descr['session']) + $code = "$code + . (!\$Cache['session']=true) // invalideur session\n "; + // ramasser les images intermediaires inutiles et graver l'image finale if ($p->ramasser_miettes) $code = "filtrer('image_graver',$code)"; -- GitLab