Skip to content
Extraits de code Groupes Projets
Valider a34efe58 rédigé par esj's avatar esj
Parcourir les fichiers

C'était dispendieux de reconstruire à chaque appel (15 par pages en moyenne)...

C'était dispendieux de reconstruire à chaque appel (15 par pages en moyenne) le tableau des raccourcis, juste parce que la puce peut changer de sens.

Par ailleurs, depuis [9649], il n'est plus nécessaire de vérifier que les variables de personnalisation n'ont pas été passées par l'URL, sauf s'il est explicitement dit que c'est fait pour cause de compatibilité php3.

En conséquence:

	* on met le tableau des raccourcis en statique;
	* on déporte l'init de ces variables dans inc_version;
	* on enrichit la fonction de contrôle d'URL avec cette liste de variables;
	* on met cette fonction de contrôle dans un fichier à part pour alléger le fichier d'init qui ne l'appelle qu'en mode register_global=on donc rarement.
parent 89eb1ed4
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -316,6 +316,7 @@ ecrire/inc/msiefix.php -text ...@@ -316,6 +316,7 @@ ecrire/inc/msiefix.php -text
ecrire/inc/nfslock.php -text ecrire/inc/nfslock.php -text
ecrire/inc/notifications.php -text ecrire/inc/notifications.php -text
ecrire/inc/petitionner.php -text ecrire/inc/petitionner.php -text
ecrire/inc/php3.php -text
ecrire/inc/plonger.php -text ecrire/inc/plonger.php -text
ecrire/inc/plugin.php -text ecrire/inc/plugin.php -text
ecrire/inc/prepare_recherche.php -text ecrire/inc/prepare_recherche.php -text
......
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2008 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// Gestion ou simulation du register_globals a 'On' (PHP < 4.1.x)
// Code a l'agonie, heureusement.
// NB: c'est une fonction de maniere a ne pas pourrir $GLOBALS
// http://doc.spip.org/@spip_register_globals
function spip_register_globals($type='') {
spip_log("spip_register_globals($type)");
// Liste des variables dont on refuse qu'elles puissent provenir du client
$refuse_gpc = array (
# inc-public
'fond', 'delais' /*,
# ecrire/inc_auth (ceux-ci sont bien verifies dans $_SERVER)
'REMOTE_USER',
'PHP_AUTH_USER', 'PHP_AUTH_PW'
*/
);
// Liste des variables (contexte) dont on refuse qu'elles soient cookie
// (histoire que personne ne vienne fausser le cache)
$refuse_c = array (
# inc-calcul
'id_parent', 'id_rubrique', 'id_article',
'id_auteur', 'id_breve', 'id_forum', 'id_secteur',
'id_syndic', 'id_syndic_article', 'id_mot', 'id_groupe',
'id_document', 'date', 'lang',
// et celles relatives aux raccourcis (cf inc/texte)
'class_spip', 'class_spip_plus',
'toujours_paragrapher', 'ligne_horizontale',
'spip_raccourcis_typo',
'puce', 'puce_prive', 'puce_rtl', 'puce_prive_rtl',
'debut_intertitre', 'fin_intertitre',
'debut_gras', 'fin_gras', 'debut_italique', 'fin_italique',
'ouvre_note', 'ferme_note', 'les_notes', 'compt_note',
'ouvre_ref', 'ferme_ref'
);
// Si les variables sont passees en global par le serveur, il faut
// faire quelques verifications de base
if ($type) {
foreach ($refuse_gpc as $var) {
if (isset($GLOBALS[$var])) {
if (
// demande par le client
$_REQUEST[$var] !== NULL
// et pas modifie par les fichiers d'appel
AND $GLOBALS[$var] == $_REQUEST[$var]
) // Alors on ne sait pas si c'est un hack
die ("register_globals: $var interdite");
}
}
foreach ($refuse_c as $var) {
if (isset($GLOBALS[$var])) {
if (
isset ($_COOKIE[$var])
AND $_COOKIE[$var] == $GLOBALS[$var]
)
define ('spip_interdire_cache', true);
}
}
}
// sinon il faut les passer nous-memes, a l'exception des interdites.
// (A changer en une liste des variables admissibles...)
else {
foreach (array('_SERVER', '_COOKIE', '_POST', '_GET') as $_table) {
foreach ($GLOBALS[$_table] as $var => $val) {
if (!isset($GLOBALS[$var]) # indispensable securite
AND isset($GLOBALS[$_table][$var])
AND ($_table == '_SERVER' OR !in_array($var, $refuse_gpc))
AND ($_table <> '_COOKIE' OR !in_array($var, $refuse_c)))
$GLOBALS[$var] = $val;
}
}
}
}
?>
...@@ -16,45 +16,23 @@ include_spip('inc/filtres'); ...@@ -16,45 +16,23 @@ include_spip('inc/filtres');
include_spip('inc/lang'); include_spip('inc/lang');
include_spip('inc/lien'); include_spip('inc/lien');
// // init du tableau principal des raccourcis
// Gerer les variables de personnalisation, qui peuvent provenir
// des fichiers d'appel, en verifiant qu'elles n'ont pas ete passees
// par le visiteur (sinon, pas de cache)
//
// http://doc.spip.org/@tester_variable
function tester_variable($var, $val){
if (!isset($GLOBALS[$var]))
return $GLOBALS[$var] = $val;
if (
isset($_REQUEST[$var])
AND $GLOBALS[$var] == $_REQUEST[$var]
)
die ("tester_variable: $var interdite");
return $GLOBALS[$var];
}
// Init des globales reglant la typo de propre
// voir aussi traiter_raccourci_glossaire et traiter_raccourci_notes
// Retourne aussi un double tableau raccourci / texte-clair les utilisant.
// http://doc.spip.org/@traiter_variables_sales function definir_raccourcis()
function traiter_variables_sales() { {
global $class_spip, $class_spip_plus; global $class_spip, $class_spip_plus, $ligne_horizontale, $debut_intertitre, $fin_intertitre, $debut_gras, $fin_gras, $debut_italique, $fin_italique;
// class_spip : savoir si on veut class="spip" sur p i strong & li static $spip_raccourcis_typo = array();
// class_spip_plus : class="spip" sur les ul ol h3 hr quote table... $x = _DIR_RESTREINT ? lang_dir() : lang_dir($GLOBALS['spip_lang']);
// la difference c'est que des css specifiques existent pour les seconds if (!isset($spip_raccourcis_typo[$x])) {
tester_variable('class_spip', ''); /*' class="spip"'*/
tester_variable('class_spip_plus', ' class="spip"'); $spip_raccourcis_typo[$x] = array(
tester_variable('toujours_paragrapher', true); array(
return array(array(
/* 0 */ "/\n(----+|____+)/S", /* 0 */ "/\n(----+|____+)/S",
/* 1 */ "/\n-- */S", /* 1 */ "/\n-- */S",
/* 2 */ "/\n- */S", /* DOIT rester a cette position */ /* 2 */ "/\n- */S", /* DOIT rester a cette position */
/* 3 */ "/\n_ +/S", /* 3 */ "/\n_ +/S",
/* 4 */ "/(^|[^{])[{][{][{]/S", /* 4 */ "/(^|[^{])[{][{][{]/S",
/* 5 */ "/[}][}][}]($|[^}])/S", /* 5 */ "/[}][}][}]($|[^}])/S",
/* 6 */ "/(( *)\n){2,}(<br\s*\/?".">)?/S", /* 6 */ "/(( *)\n){2,}(<br\s*\/?".">)?/S",
/* 7 */ "/[{][{]/S", /* 7 */ "/[{][{]/S",
/* 8 */ "/[}][}]/S", /* 8 */ "/[}][}]/S",
...@@ -66,25 +44,27 @@ function traiter_variables_sales() { ...@@ -66,25 +44,27 @@ function traiter_variables_sales() {
/* 14 */ "/<\/quote>/S", /* 14 */ "/<\/quote>/S",
/* 15 */ "/<\/?intro>/S" /* 15 */ "/<\/?intro>/S"
), ),
array( array(
/* 0 */ "\n\n" . tester_variable('ligne_horizontale', "\n<hr$class_spip_plus />\n") . "\n\n", /* 0 */ "\n\n" . $ligne_horizontale . "\n\n",
/* 1 */ "\n<br />&mdash;&nbsp;", /* 1 */ "\n<br />&mdash;&nbsp;",
/* 2 */ "\n<br />".definir_puce()."&nbsp;", /* 2 */ "\n<br />".definir_puce()."&nbsp;",
/* 3 */ "\n<br />", /* 3 */ "\n<br />",
/* 4 */ "\$1\n\n" . tester_variable('debut_intertitre', "\n<h3$class_spip_plus>"), /* 4 */ "\$1\n\n" . $debut_intertitre,
/* 5 */ tester_variable('fin_intertitre', "</h3>\n") ."\n\n\$1", /* 5 */ $fin_intertitre ."\n\n\$1",
/* 6 */ "<p>", /* 6 */ "<p>",
/* 7 */ tester_variable('debut_gras', "<strong$class_spip>"), /* 7 */ $debut_gras,
/* 8 */ tester_variable('fin_gras', '</strong>'), /* 8 */ $fin_gras,
/* 9 */ tester_variable('debut_italique', "<i$class_spip>"), /* 9 */ $debut_italique,
/* 10 */ tester_variable('fin_italique', '</i>'), /* 10 */ $fin_italique,
/* 11 */ "<p>", /* 11 */ "<p>",
/* 12 */ "<p>", /* 12 */ "<p>",
/* 13 */ "<blockquote$class_spip_plus><p>", /* 13 */ "<blockquote$class_spip_plus><p>",
/* 14 */ "</blockquote><p>", /* 14 */ "</blockquote><p>",
/* 15 */ "" /* 15 */ ""
) )
); );
}
return $spip_raccourcis_typo[$x];
} }
// On initialise la puce pour eviter find_in_path() a chaque rencontre de \n- // On initialise la puce pour eviter find_in_path() a chaque rencontre de \n-
...@@ -101,21 +81,14 @@ function definir_puce() { ...@@ -101,21 +81,14 @@ function definir_puce() {
$p = 'puce' . (test_espace_prive() ? '_prive' : ''); $p = 'puce' . (test_espace_prive() ? '_prive' : '');
if ($dir == 'rtl') $p .= '_rtl'; if ($dir == 'rtl') $p .= '_rtl';
tester_variable($p, 'AUTO'); if (!isset($GLOBALS[$p])) {
if ($GLOBALS[$p] == 'AUTO') {
$img = find_in_path($p.'.gif'); $img = find_in_path($p.'.gif');
list(,,,$size) = @getimagesize($img); list(,,,$size) = @getimagesize($img);
$GLOBALS[$p] = '<img src="'.$img.'" ' $GLOBALS[$p] = '<img src="'.$img.'" '.$size.' alt="-" />';
.$size.' alt="-" />';
} }
return $GLOBALS[$p]; return $GLOBALS[$p];
} }
//
// Diverses fonctions essentielles
//
// XHTML - Preserver les balises-bloc : on liste ici tous les elements // XHTML - Preserver les balises-bloc : on liste ici tous les elements
// dont on souhaite qu'ils provoquent un saut de paragraphe // dont on souhaite qu'ils provoquent un saut de paragraphe
define('_BALISES_BLOCS', define('_BALISES_BLOCS',
...@@ -124,8 +97,6 @@ define('_BALISES_BLOCS', ...@@ -124,8 +97,6 @@ define('_BALISES_BLOCS',
.'form|object|center|marquee|address|' .'form|object|center|marquee|address|'
.'d[ltd]|script|noscript|map|button|fieldset'); .'d[ltd]|script|noscript|map|button|fieldset');
// //
// Echapper les les elements perilleux en les passant en base64 // Echapper les les elements perilleux en les passant en base64
// //
...@@ -861,10 +832,10 @@ function traiter_poesie($letexte) ...@@ -861,10 +832,10 @@ function traiter_poesie($letexte)
{ {
if (preg_match_all(",<(poesie|poetry)>(.*)<\/(poesie|poetry)>,UimsS", if (preg_match_all(",<(poesie|poetry)>(.*)<\/(poesie|poetry)>,UimsS",
$letexte, $regs, PREG_SET_ORDER)) { $letexte, $regs, PREG_SET_ORDER)) {
$u = $GLOBALS['meta']['pcre_u']; $u = "/\n[\s]*\n/S" . $GLOBALS['meta']['pcre_u'];
foreach ($regs as $reg) { foreach ($regs as $reg) {
$lecode = preg_replace(",\r\n?,S", "\n", $reg[2]); $lecode = preg_replace(",\r\n?,S", "\n", $reg[2]);
$lecode = preg_replace("/\n[\s]*\n/S".$u, "\n&nbsp;\n",$lecode); $lecode = preg_replace($u, "\n&nbsp;\n",$lecode);
$lecode = "<blockquote class=\"spip_poesie\">\n<div>" $lecode = "<blockquote class=\"spip_poesie\">\n<div>"
.preg_replace("/\n+/", "</div>\n<div>", trim($lecode)) .preg_replace("/\n+/", "</div>\n<div>", trim($lecode))
."</div>\n</blockquote>\n\n"; ."</div>\n</blockquote>\n\n";
...@@ -894,10 +865,6 @@ function traiter_raccourcis($letexte) { ...@@ -894,10 +865,6 @@ function traiter_raccourcis($letexte) {
// Gerer les notes (ne passe pas dans le pipeline) // Gerer les notes (ne passe pas dans le pipeline)
list($letexte, $mes_notes) = traite_raccourci_notes($letexte); list($letexte, $mes_notes) = traite_raccourci_notes($letexte);
// A present on introduit des attributs class_spip*
// Init de leur valeur et connexes au premier appel
$remplace = traiter_variables_sales();
// //
// Tableaux // Tableaux
// //
...@@ -933,8 +900,9 @@ function traiter_raccourcis($letexte) { ...@@ -933,8 +900,9 @@ function traiter_raccourcis($letexte) {
} }
} }
// autres raccourcis // Introduction des attributs class_spip* et autres raccourcis
$letexte = preg_replace($remplace[0], $remplace[1], $letexte); list($a,$b) = definir_raccourcis();
$letexte = preg_replace($a, $b, $letexte);
$letexte = preg_replace('@^\n<br />@S', '', $letexte); $letexte = preg_replace('@^\n<br />@S', '', $letexte);
// Retablir les caracteres proteges // Retablir les caracteres proteges
...@@ -960,17 +928,6 @@ function traite_raccourci_notes($letexte) ...@@ -960,17 +928,6 @@ function traite_raccourci_notes($letexte)
{ {
global $compt_note, $marqueur_notes, $les_notes, $notes_vues; global $compt_note, $marqueur_notes, $les_notes, $notes_vues;
global $ouvre_ref, $ferme_ref, $ouvre_note, $ferme_note; #static ok global $ouvre_ref, $ferme_ref, $ouvre_note, $ferme_note; #static ok
static $init = 0;
if (!$init++) {
$ouvre_ref = tester_variable('ouvre_ref', '&nbsp;[');
$ferme_ref = tester_variable('ferme_ref', ']');
$ouvre_note = tester_variable('ouvre_note', '[');
$ferme_note = tester_variable('ferme_note', '] ');
$les_notes = tester_variable('les_notes', '');
$compt_note = tester_variable('compt_note', 0);
$notes_vues === array();
}
$mes_notes = ''; $mes_notes = '';
if (preg_match_all(', *\[\[(.*?)\]\],msS', $letexte, $matches, PREG_SET_ORDER)) if (preg_match_all(', *\[\[(.*?)\]\],msS', $letexte, $matches, PREG_SET_ORDER))
...@@ -992,7 +949,7 @@ function traite_raccourci_notes($letexte) ...@@ -992,7 +949,7 @@ function traite_raccourci_notes($letexte)
// preparer la note // preparer la note
if ($num_note) { if ($num_note) {
if ($marqueur_notes) // quand il y a plusieurs series if ($marqueur_notes) // quand il y a plusieurs series
// de notes sur une meme page // de notes sur une meme page
$mn = $marqueur_notes.'-'; $mn = $marqueur_notes.'-';
// pas de '%' dans les attributs name // pas de '%' dans les attributs name
$ancre = $mn.str_replace('%','_',rawurlencode($num_note)); $ancre = $mn.str_replace('%','_',rawurlencode($num_note));
......
...@@ -790,8 +790,7 @@ function generer_url_entite_absolue($id='', $entite='', $args='', $ancre='', $co ...@@ -790,8 +790,7 @@ function generer_url_entite_absolue($id='', $entite='', $args='', $ancre='', $co
// http://doc.spip.org/@test_valeur_serveur // http://doc.spip.org/@test_valeur_serveur
function test_valeur_serveur($truc) { function test_valeur_serveur($truc) {
if (!$truc) return false; if (!$truc) return false;
if (strtolower($truc) == 'off') return false; return (strtolower($truc) !== 'off');
return true;
} }
// //
...@@ -973,76 +972,6 @@ function generer_url_action($script, $args="", $no_entities=false , $public = fa ...@@ -973,76 +972,6 @@ function generer_url_action($script, $args="", $no_entities=false , $public = fa
} }
// Dirty hack contre le register_globals a 'Off' (PHP 4.1.x)
// A remplacer (bientot ?) par une gestion propre des variables admissibles ;-)
// NB: c'est une fonction de maniere a ne pas pourrir $GLOBALS
// http://doc.spip.org/@spip_register_globals
function spip_register_globals() {
define('_FEED_GLOBALS', false); // si ca marche on simplifiera tout ca
// Liste des variables dont on refuse qu'elles puissent provenir du client
$refuse_gpc = array (
# inc-public
'fond', 'delais' /*,
# ecrire/inc_auth (ceux-ci sont bien verifies dans $_SERVER)
'REMOTE_USER',
'PHP_AUTH_USER', 'PHP_AUTH_PW'
*/
);
// Liste des variables (contexte) dont on refuse qu'elles soient cookie
// (histoire que personne ne vienne fausser le cache)
$refuse_c = array (
# inc-calcul
'id_parent', 'id_rubrique', 'id_article',
'id_auteur', 'id_breve', 'id_forum', 'id_secteur',
'id_syndic', 'id_syndic_article', 'id_mot', 'id_groupe',
'id_document', 'date', 'lang'
);
// Si les variables sont passees en global par le serveur, il faut
// faire quelques verifications de base
if (test_valeur_serveur(@ini_get('register_globals'))) {
foreach ($refuse_gpc as $var) {
if (isset($GLOBALS[$var])) {
if (
// demande par le client
$_REQUEST[$var] !== NULL
// et pas modifie par les fichiers d'appel
AND $GLOBALS[$var] == $_REQUEST[$var]
) // Alors on ne sait pas si c'est un hack
die ("register_globals: $var interdite");
}
}
foreach ($refuse_c as $var) {
if (isset($GLOBALS[$var])) {
if (
isset ($_COOKIE[$var])
AND $_COOKIE[$var] == $GLOBALS[$var]
)
define ('spip_interdire_cache', true);
}
}
}
// sinon il faut les passer nous-memes, a l'exception des interdites.
// (A changer en une liste des variables admissibles...)
else if (_FEED_GLOBALS) {
foreach (array('_SERVER', '_COOKIE', '_POST', '_GET') as $_table) {
foreach ($GLOBALS[$_table] as $var => $val) {
if (!isset($GLOBALS[$var]) # indispensable securite
AND isset($GLOBALS[$_table][$var])
AND ($_table == '_SERVER' OR !in_array($var, $refuse_gpc))
AND ($_table <> '_COOKIE' OR !in_array($var, $refuse_c)))
$GLOBALS[$var] = $val;
}
}
}
}
/** /**
* Fonction d'initialisation groupee pour compatibilite ascendante * Fonction d'initialisation groupee pour compatibilite ascendante
* *
...@@ -1176,9 +1105,15 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) { ...@@ -1176,9 +1105,15 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
// Par ailleurs on ne veut pas de magic_quotes au cours de l'execution // Par ailleurs on ne veut pas de magic_quotes au cours de l'execution
@set_magic_quotes_runtime(0); @set_magic_quotes_runtime(0);
// Remplir $GLOBALS avec $_GET et $_POST // Si les variables sont passees en global par le serveur,
spip_register_globals(); // ou si on veut la compatibilite php3
// il faut faire quelques verifications de base
if ($x = test_valeur_serveur(@ini_get('register_globals'))
OR _FEED_GLOBALS) {
include_spip('inc/php3');
spip_register_globals($x);
}
// appliquer le cookie_prefix // appliquer le cookie_prefix
if ($GLOBALS['cookie_prefix'] != 'spip') { if ($GLOBALS['cookie_prefix'] != 'spip') {
include_spip('inc/cookie'); include_spip('inc/cookie');
......
...@@ -21,6 +21,8 @@ error_reporting(E_ALL ^ E_NOTICE); ...@@ -21,6 +21,8 @@ error_reporting(E_ALL ^ E_NOTICE);
# ne concerne que le fichier mes_options.php3 # ne concerne que le fichier mes_options.php3
define('_EXTENSION_PHP', '.php3'); define('_EXTENSION_PHP', '.php3');
#define('_EXTENSION_PHP', ''); #define('_EXTENSION_PHP', '');
#mettre a true pour compatibilite PHP3
define('_FEED_GLOBALS', false);
# le nom du repertoire ecrire/ # le nom du repertoire ecrire/
define('_DIR_RESTREINT_ABS', 'ecrire/'); define('_DIR_RESTREINT_ABS', 'ecrire/');
...@@ -201,6 +203,30 @@ $formats_logos = array ('gif', 'jpg', 'png'); ...@@ -201,6 +203,30 @@ $formats_logos = array ('gif', 'jpg', 'png');
// Controler les dates des item dans les flux RSS ? // Controler les dates des item dans les flux RSS ?
$controler_dates_rss = true; $controler_dates_rss = true;
// bardee de variables de personnalisation pour la typo (cf inc/texte)
// class_spip : savoir si on veut class="spip" sur p i strong & li
// class_spip_plus : class="spip" sur les ul ol h3 hr quote table...
// la difference c'est que des css specifiques existent pour les seconds
//
$class_spip = ''; /*' class="spip"'*/
$class_spip_plus = ' class="spip"';
$toujours_paragrapher = true;
$ligne_horizontale = "\n<hr$class_spip_plus />\n";
$debut_intertitre = "\n<h3$class_spip_plus>";
$fin_intertitre = "</h3>\n";
$debut_gras = "<strong$class_spip>";
$fin_gras = '</strong>';
$debut_italique = "<i$class_spip>";
$fin_italique = '</i>';
$ouvre_ref = '&nbsp;[';
$ferme_ref = ']';
$ouvre_note = '[';
$ferme_note = '] ';
$les_notes = '';
$compt_note = 0;
$notes_vues = array();
// //
// Pipelines & plugins // Pipelines & plugins
// //
......
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