diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index 9958012e7c8..5d1acdfdfbf 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -3170,8 +3170,16 @@ function recuperer_fond($fond, $contexte = array(), $options = array(), $connect $GLOBALS['_INC_PUBLIC']++; + // fix #4235 + // On mémorise l'état initial du sessionnement du contexte incluant + $cache_utilise_session_appelant = (isset($GLOBALS['cache_utilise_session']) ? $GLOBALS['cache_utilise_session'] : null); + foreach (is_array($fond) ? $fond : array($fond) as $f) { + + unset($GLOBALS['cache_utilise_session']); // fix #4235 : Chaque inclusion commence sans sessionnement préallable + + $page = evaluer_fond($f, $contexte, $connect); if ($page === '') { $c = isset($options['compil']) ? $options['compil'] : ''; @@ -3207,8 +3215,18 @@ function recuperer_fond($fond, $contexte = array(), $options = array(), $connect } else { $texte .= $options['trim'] ? rtrim($page['texte']) : $page['texte']; } + + // fix #4235 : contamination de la session appelante, pour les inclusions statiques + if (isset($options['sessionnement_contaminant']) + and isset($page['invalideurs']['session'])) + $cache_utilise_session_appelant = $page['invalideurs']['session']; } + // fix #4235 : restaurer le sessionnement du contexte appelant, + // éventuellement contaminé si on vient de récupérer une inclusion statique sessionnée + $GLOBALS['cache_utilise_session'] + = (isset($cache_utilise_session_appelant) ? $cache_utilise_session_appelant : null); + $GLOBALS['_INC_PUBLIC']--; if ($lang_select) { @@ -3491,4 +3509,4 @@ function array_column($input = null, $columnKey = null, $indexKey = null) } } -} \ No newline at end of file +} diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php index df923a7beb2..961bff818a2 100644 --- a/ecrire/public/assembler.php +++ b/ecrire/public/assembler.php @@ -569,7 +569,8 @@ function inclure_modele($type, $id, $params, $lien, $connect = '', $env = array( $contexte = array_merge($contexte, $arg_list); // Appliquer le modele avec le contexte - $retour = recuperer_fond($fond, $contexte, array(), $connect); + // et provoquer le sessionnement du squelette appelant si le modèle et sessionné + $retour = recuperer_fond($fond, $contexte, array('sessionnement_contaminant'=>true), $connect); // Regarder si le modele tient compte des liens (il *doit* alors indiquer // spip_lien_ok dans les classes de son conteneur de premier niveau ; diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php index c235f01c12c..bf36b08be37 100644 --- a/ecrire/public/balises.php +++ b/ecrire/public/balises.php @@ -1988,6 +1988,10 @@ function balise_INCLURE_dist($p) { } $_options = array(); + + // Fix #4235 : sessionner le contexte appelant si cette inclusion statique est sessionnée + $_options[] = "'sessionnement_contaminant'=>true"; + if (isset($_contexte['ajax'])) { $_options[] = preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']); unset($_contexte['ajax']); @@ -2045,7 +2049,7 @@ function balise_MODELE_dist($p) { // erreur de syntaxe = fond absent // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP if (!$_contexte) { - $contexte = array(); + $_contexte = array(); } if (!isset($_contexte[1])) { @@ -2084,7 +2088,9 @@ function balise_MODELE_dist($p) { } $_options = memoriser_contexte_compil($p); - $_options = "'compil'=>array($_options), 'trim'=>true"; + // Fix #4235 : sessionner le contexte appelant si ce modèle est sessionné + $_options = "'compil'=>array($_options), 'trim'=>true, 'sessionnement_contaminant'=>true"; + if (isset($_contexte['ajax'])) { $_options .= ", " . preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']); unset($_contexte['ajax']);