Commit | Line | Data |
---|---|---|
c495c100 P |
1 | <?php |
2 | #-----------------------------------------------------# | |
3 | # Plugin : Couteau Suisse - Licence : GPL # | |
4 | # Auteur : Patrice Vanneufville, 2006 # | |
5 | # Contact : patrice¡.!vanneufville¡@!laposte¡.!net # | |
6 | # Infos : http://www.spip-contrib.net/?article2166 # | |
7 | #-----------------------------------------------------# | |
8 | # Fichier contenant les fonctions utilisees pendant # | |
9 | # l'execution du plugin. # | |
10 | # Seulement s'il y a lieu, on va inclure ici # | |
11 | # cout_utils.php et compiler les outils. # | |
12 | #-----------------------------------------------------# | |
13 | ||
14 | cs_log("inclusion des fonctions de cout_lancement.php pour initialisation"); | |
15 | ||
16 | // compatibilite avec les plugins de version anterieure a 1.7.0.0 | |
17 | function tweak_choix($s) { if ($p = strpos($s, '(')) return substr($s, 0, $p); return ''; } | |
18 | ||
19 | // Echapper les elements perilleux en les passant en base64 | |
20 | // Creer un bloc base64 correspondant a $rempl ; au besoin en marquant | |
21 | // une $source differente ; optimisation du code spip ! | |
22 | // echappe_retour() permet de revenir en arriere | |
23 | function cs_code_echappement($rempl, $source='') { | |
24 | // Convertir en base64 | |
25 | $base64 = base64_encode($rempl); | |
26 | // guillemets simple dans la balise pour simplifier l'outil 'guillemets' | |
27 | return "<span class='base64$source' title='$base64'></span>"; | |
28 | } | |
29 | ||
30 | function cs_preg_quote(&$item) { | |
31 | $item = preg_quote($item, ','); | |
32 | } | |
33 | ||
34 | // lit ecrit les metas et initialise $cs_metas_pipelines | |
35 | // cette fonction est appellee par cout_options a chaque hit de la page | |
36 | function cs_initialisation($forcer=false) { | |
37 | global $cs_metas_pipelines, $metas_outils; | |
38 | $rand = sprintf('[#%04x] ', rand()); | |
39 | static $deja_passe_ici; | |
40 | $mysql=function_exists('mysql_get_client_info')?' - MYSQL v'.mysql_get_client_info():''; | |
41 | if (!intval($deja_passe_ici)) | |
42 | cs_log("#### 1er PASSAGE $rand################################# - \$forcer = ".intval($forcer) | |
43 | . "\n{$rand}PHP v".phpversion()."$mysql - base SPIP v$GLOBALS[spip_version] - code SPIP v$GLOBALS[spip_version_code]"); | |
44 | $deja_passe_ici++; | |
45 | // si les metas ne sont pas lus, on les lit | |
46 | cs_log("{$rand}cs_initialisation($forcer) : Passage #$deja_passe_ici"); | |
47 | if (isset($GLOBALS['meta']['tweaks_pipelines'])) { | |
48 | $cs_metas_pipelines = unserialize($GLOBALS['meta']['tweaks_pipelines']); | |
49 | ||
50 | cs_log("$rand -- cs_metas_pipelines = ".(is_array($cs_metas_pipelines)?join(', ',array_keys($cs_metas_pipelines)):'')); | |
51 | ||
52 | // liste des actifs & definition des constantes attestant qu'un outil est bien actif : define('_CS_monoutil', 'oui'); | |
53 | $liste = array(); | |
54 | foreach($metas_outils as $nom=>$o) if($o['actif']) { $liste[]=$nom; @define('_CS_'.$nom, 'oui'); } | |
55 | $liste2 = join(', ', $liste); | |
56 | cs_log("$rand -- ".count($liste).' outil(s) actif(s)'.(strlen($liste2)?" = ".$liste2:'')); | |
57 | // Vanter notre art de la compilation... | |
58 | // La globale $spip_header_silencieux permet de rendre le header absent pour raisons de securite | |
59 | if (!headers_sent()) if (!isset($GLOBALS['spip_header_silencieux']) OR !$GLOBALS['spip_header_silencieux']) | |
60 | @header('X-Outils-CS: '.$liste2); | |
61 | cs_log($rand.($forcer?"\$forcer = true":"cs_initialisation($forcer) : Sortie car les metas sont presents")); | |
62 | // Les pipelines sont en meta, tout va bien on peut partir d'ici. | |
63 | if (!$forcer) return; | |
64 | } | |
65 | // ici on commence l'initialisation de tous les outils | |
66 | $GLOBALS['cs_init'] = 1; | |
67 | global $outils, $metas_vars, $metas_outils; | |
68 | include_spip('inc/meta'); | |
69 | include_spip('cout_utils'); | |
70 | // remplir $outils (et aussi $cs_variables qu'on n'utilise pas ici); | |
71 | include_spip('config_outils'); | |
72 | // verifier que tous les outils actives sont bien presents | |
73 | foreach($metas_outils as $nom=>$o) if($o['actif']) { if(!isset($outils[$nom])) unset($metas_outils[$nom]); } | |
74 | ecrire_meta('tweaks_actifs', serialize($metas_outils)); | |
75 | ecrire_metas(); | |
76 | // nettoyage des versions anterieures | |
77 | cs_compatibilite_ascendante(); | |
78 | // stocker les types de variables declarees | |
79 | global $cs_variables; | |
80 | $metas_vars['_chaines'] = $cs_variables['_chaines']; | |
81 | $metas_vars['_nombres'] = $cs_variables['_nombres']; | |
82 | // au cas ou un outil manipule des variables | |
83 | $description_outil = charger_fonction('description_outil', 'inc'); | |
84 | // completer les variables manquantes et incorporer l'activite lue dans les metas | |
85 | cs_log("$rand -- foreach(\$outils) : cs_initialisation_d_un_outil()"); | |
86 | ||
87 | // initialiser chaque outil et construire la liste des contribs | |
88 | $contribs = array(); | |
89 | include_spip('inc/cs_outils'); | |
90 | foreach($outils as $outil) { | |
91 | cs_initialisation_d_un_outil($id = $outil['id'], $description_outil, false); | |
92 | if(isset($outil['contrib']) && isset($metas_outils[$id]['actif'])) | |
93 | $contribs[] = '<br/> • [@@couteauprive:'.$outil['id'].':nom@@->http://www.spip-contrib.net/?article'.$outil['contrib'].']'; | |
94 | } | |
95 | // installer $cs_metas_pipelines | |
96 | $cs_metas_pipelines = array(); | |
97 | cs_log("$rand -- cs_initialise_includes()... cout_fonctions.php sera probablement inclus."); | |
98 | // creer les includes (mes_options et mes_fonctions) et le fichier de controle pipelines.php | |
99 | cs_initialise_includes(count($metas_outils)); | |
100 | // sauver la configuration | |
101 | cs_sauve_configuration(); | |
102 | // en metas : outils actifs | |
103 | cs_log("$rand -- ecriture metas"); | |
104 | ecrire_meta('tweaks_actifs', serialize($metas_outils)); | |
105 | // en metas : variables d'outils | |
106 | ecrire_meta('tweaks_variables', serialize($metas_vars)); | |
107 | // en metas : code inline pour les pipelines, mes_options et mes_fonctions; | |
108 | ecrire_meta('tweaks_pipelines', serialize($cs_metas_pipelines)); | |
109 | // en metas : les liens sur spip-contrib | |
110 | ecrire_meta('tweaks_contribs', serialize($contribs)); | |
111 | ecrire_metas(); | |
112 | $GLOBALS['cs_init'] = 0; | |
113 | cs_log("{$rand}cs_initialisation($forcer) : Sortie"); | |
114 | } | |
115 | ||
116 | /* | |
117 | function qui determine si $texte est de type Block (true) ou Inline (false) | |
118 | _BALISES_BLOCS est defini dans texte.php : | |
119 | define('_BALISES_BLOCS', | |
120 | 'div|pre|ul|ol|li|blockquote|h[1-6r]|' | |
121 | .'t(able|[rdh]|body|foot|extarea)|' | |
122 | .'form|object|center|marquee|address|' | |
123 | .'d[ltd]|script|noscript|map|button|fieldset'); | |
124 | */ | |
125 | function cs_block($texte) { | |
126 | return preg_match(',(\n\n|\r\n\r\n|\r\r),', $texte) | |
127 | || preg_match(',</?(p|'._BALISES_BLOCS.')[>[:space:]],iS', $texte); | |
128 | } | |
129 | ||
130 | // evite les transformations typo dans les balises $balises | |
131 | // par exemple pour <html>, <cadre>, <code>, <frame>, <script>, <acronym> et <cite>, $balises = 'html|code|cadre|frame|script|acronym|cite' | |
132 | // $fonction est la fonction prevue pour transformer $texte | |
133 | // $texte est le texte d'origine | |
134 | // si $balises = '' alors la protection par defaut est : html|code|cadre|frame|script | |
135 | function cs_echappe_balises($balises, $fonction, $texte, $arg=NULL){ | |
136 | if(!strlen($texte)) return ''; | |
137 | if (!function_exists($fonction)) { | |
138 | spip_log("Erreur - cs_echappe_balises() : $fonction() non definie !"); | |
139 | return $texte; | |
140 | } | |
141 | if(!strlen($balises)) $balises = 'html|code|cadre|frame|script'; | |
142 | $balises = ',<('.$balises.')(\s[^>]*)?>(.*)</\1>,UimsS'; | |
143 | include_spip('inc/texte'); | |
144 | $texte = echappe_html($texte, 'CS', true, $balises); | |
145 | $texte = echappe_retour($arg==NULL?$fonction($texte):$fonction($texte, $arg), 'CS'); | |
146 | return $texte; | |
147 | } | |
148 | ||
149 | // retourne un chemin canonique a partir d'un chemin contenant des ../ | |
150 | function cs_canonicalize($address) { | |
151 | $address = str_replace('\\', '/', str_replace('//', '/', $address)); | |
152 | $address = explode('/', $address); | |
153 | $keys = array_keys($address, '..'); | |
154 | foreach($keys as $keypos => $key) array_splice($address, $key - ($keypos * 2 + 1), 2); | |
155 | $address = implode('/', $address); | |
156 | return preg_replace(',([^.])\./,', '\1', $address); | |
157 | } | |
158 | ||
159 | ?> |