@@ -19,7 +19,7 @@ discard block |
||
| 19 | 19 | */ |
| 20 | 20 | |
| 21 | 21 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 22 | - return; |
|
| 22 | + return; |
|
| 23 | 23 | } |
| 24 | 24 | |
| 25 | 25 | |
@@ -40,15 +40,15 @@ discard block |
||
| 40 | 40 | * @return bool|null|void |
| 41 | 41 | */ |
| 42 | 42 | function inc_session_dist($auteur = false) { |
| 43 | - if (is_numeric($auteur)) { |
|
| 44 | - return supprimer_sessions($auteur, $auteur > 0); |
|
| 45 | - } else { |
|
| 46 | - if (is_array($auteur)) { |
|
| 47 | - return ajouter_session($auteur); |
|
| 48 | - } else { |
|
| 49 | - return verifier_session($auteur); |
|
| 50 | - } |
|
| 51 | - } |
|
| 43 | + if (is_numeric($auteur)) { |
|
| 44 | + return supprimer_sessions($auteur, $auteur > 0); |
|
| 45 | + } else { |
|
| 46 | + if (is_array($auteur)) { |
|
| 47 | + return ajouter_session($auteur); |
|
| 48 | + } else { |
|
| 49 | + return verifier_session($auteur); |
|
| 50 | + } |
|
| 51 | + } |
|
| 52 | 52 | } |
| 53 | 53 | |
| 54 | 54 | |
@@ -77,36 +77,36 @@ discard block |
||
| 77 | 77 | */ |
| 78 | 78 | function supprimer_sessions($id_auteur, $toutes = true, $actives = true) { |
| 79 | 79 | |
| 80 | - $nb_files = 0; |
|
| 81 | - $nb_max_files = (defined('_MAX_NB_SESSIONS_OUVERTES') ? _MAX_NB_SESSIONS_OUVERTES : 1000); |
|
| 82 | - spip_log("supprimer sessions auteur $id_auteur", 'session'); |
|
| 83 | - if ($toutes or $id_auteur !== $GLOBALS['visiteur_session']['id_auteur']) { |
|
| 84 | - if ($dir = opendir(_DIR_SESSIONS)) { |
|
| 85 | - $t = $_SERVER['REQUEST_TIME'] - (4 * _RENOUVELLE_ALEA); // 48h par defaut |
|
| 86 | - $t_short = $_SERVER['REQUEST_TIME'] - max(_RENOUVELLE_ALEA / 4, 3 * 3600); // 3h par defaut |
|
| 87 | - $t = time() - (4 * _RENOUVELLE_ALEA); |
|
| 88 | - while (($f = readdir($dir)) !== false) { |
|
| 89 | - $nb_files++; |
|
| 90 | - if (preg_match(',^[^\d-]*(-?\d+)_\w{32}\.php[3]?$,', $f, $regs)) { |
|
| 91 | - $f = _DIR_SESSIONS . $f; |
|
| 92 | - if (($actives and $regs[1] == $id_auteur) or ($t > filemtime($f))) { |
|
| 93 | - spip_unlink($f); |
|
| 94 | - } |
|
| 95 | - // si il y a trop de sessions ouvertes, on purge les sessions anonymes de plus de 3H |
|
| 96 | - // cf http://core.spip.org/issues/3276 |
|
| 97 | - elseif ($nb_files > $nb_max_files and !intval($regs[1]) and ($t_short > filemtime($f))) { |
|
| 98 | - spip_unlink($f); |
|
| 99 | - } |
|
| 100 | - } |
|
| 101 | - } |
|
| 102 | - } |
|
| 103 | - } else { |
|
| 104 | - verifier_session(); |
|
| 105 | - spip_unlink(fichier_session('alea_ephemere', true)); |
|
| 106 | - } |
|
| 107 | - |
|
| 108 | - // forcer le recalcul de la session courante |
|
| 109 | - spip_session(true); |
|
| 80 | + $nb_files = 0; |
|
| 81 | + $nb_max_files = (defined('_MAX_NB_SESSIONS_OUVERTES') ? _MAX_NB_SESSIONS_OUVERTES : 1000); |
|
| 82 | + spip_log("supprimer sessions auteur $id_auteur", 'session'); |
|
| 83 | + if ($toutes or $id_auteur !== $GLOBALS['visiteur_session']['id_auteur']) { |
|
| 84 | + if ($dir = opendir(_DIR_SESSIONS)) { |
|
| 85 | + $t = $_SERVER['REQUEST_TIME'] - (4 * _RENOUVELLE_ALEA); // 48h par defaut |
|
| 86 | + $t_short = $_SERVER['REQUEST_TIME'] - max(_RENOUVELLE_ALEA / 4, 3 * 3600); // 3h par defaut |
|
| 87 | + $t = time() - (4 * _RENOUVELLE_ALEA); |
|
| 88 | + while (($f = readdir($dir)) !== false) { |
|
| 89 | + $nb_files++; |
|
| 90 | + if (preg_match(',^[^\d-]*(-?\d+)_\w{32}\.php[3]?$,', $f, $regs)) { |
|
| 91 | + $f = _DIR_SESSIONS . $f; |
|
| 92 | + if (($actives and $regs[1] == $id_auteur) or ($t > filemtime($f))) { |
|
| 93 | + spip_unlink($f); |
|
| 94 | + } |
|
| 95 | + // si il y a trop de sessions ouvertes, on purge les sessions anonymes de plus de 3H |
|
| 96 | + // cf http://core.spip.org/issues/3276 |
|
| 97 | + elseif ($nb_files > $nb_max_files and !intval($regs[1]) and ($t_short > filemtime($f))) { |
|
| 98 | + spip_unlink($f); |
|
| 99 | + } |
|
| 100 | + } |
|
| 101 | + } |
|
| 102 | + } |
|
| 103 | + } else { |
|
| 104 | + verifier_session(); |
|
| 105 | + spip_unlink(fichier_session('alea_ephemere', true)); |
|
| 106 | + } |
|
| 107 | + |
|
| 108 | + // forcer le recalcul de la session courante |
|
| 109 | + spip_session(true); |
|
| 110 | 110 | } |
| 111 | 111 | |
| 112 | 112 | /** |
@@ -124,125 +124,125 @@ discard block |
||
| 124 | 124 | * @return bool|string |
| 125 | 125 | */ |
| 126 | 126 | function ajouter_session($auteur) { |
| 127 | - // Si le client a deja une session valide pour son id_auteur |
|
| 128 | - // on conserve le meme fichier |
|
| 129 | - |
|
| 130 | - // Attention un visiteur peut avoir une session et un id=0, |
|
| 131 | - // => ne pas melanger les sessions des differents visiteurs |
|
| 132 | - $id_auteur = isset($auteur['id_auteur']) ? intval($auteur['id_auteur']) : 0; |
|
| 133 | - |
|
| 134 | - // Si ce n'est pas un inscrit (les inscrits ont toujours des choses en session) |
|
| 135 | - // on va vérifier s'il y a vraiment des choses à écrire |
|
| 136 | - if (!$id_auteur) { |
|
| 137 | - // On supprime les données de base pour voir le contenu réel de la session |
|
| 138 | - $auteur_verif = $auteur; |
|
| 139 | - if (isset($auteur_verif['id_auteur'])) { |
|
| 140 | - unset($auteur_verif['id_auteur']); |
|
| 141 | - } |
|
| 142 | - if (isset($auteur_verif['hash_env'])) { |
|
| 143 | - unset($auteur_verif['hash_env']); |
|
| 144 | - } |
|
| 145 | - if (isset($auteur_verif['ip_change'])) { |
|
| 146 | - unset($auteur_verif['ip_change']); |
|
| 147 | - } |
|
| 148 | - if (isset($auteur_verif['date_session'])) { |
|
| 149 | - unset($auteur_verif['date_session']); |
|
| 150 | - } |
|
| 151 | - |
|
| 152 | - // Les variables vraiment nulle ne sont pas à prendre en compte non plus |
|
| 153 | - foreach ($auteur_verif as $variable => $valeur) { |
|
| 154 | - if ($valeur === null) { |
|
| 155 | - unset($auteur_verif[$variable]); |
|
| 156 | - } |
|
| 157 | - } |
|
| 158 | - |
|
| 159 | - // Si après ça la session est vide alors on supprime l'éventuel fichier et on arrête là |
|
| 160 | - if (!$auteur_verif) { |
|
| 161 | - if (isset($_COOKIE['spip_session']) and isset($_SESSION[$_COOKIE['spip_session']])) { |
|
| 162 | - unset($_SESSION[$_COOKIE['spip_session']]); |
|
| 163 | - } |
|
| 164 | - if (isset($_COOKIE['spip_session'])) { |
|
| 165 | - unset($_COOKIE['spip_session']); |
|
| 166 | - } |
|
| 167 | - |
|
| 168 | - return false; |
|
| 169 | - } |
|
| 170 | - } |
|
| 171 | - |
|
| 172 | - if ( |
|
| 173 | - !isset($_COOKIE['spip_session']) |
|
| 174 | - or !preg_match(',^' . $id_auteur . '_,', $_COOKIE['spip_session']) |
|
| 175 | - ) { |
|
| 176 | - $_COOKIE['spip_session'] = $id_auteur . '_' . md5(uniqid(rand(), true)); |
|
| 177 | - } |
|
| 178 | - |
|
| 179 | - // Maintenant on sait qu'on a des choses à écrire |
|
| 180 | - // On s'assure d'avoir au moins ces valeurs |
|
| 181 | - $auteur['id_auteur'] = $id_auteur; |
|
| 182 | - if (!isset($auteur['hash_env'])) { |
|
| 183 | - $auteur['hash_env'] = hash_env(); |
|
| 184 | - } |
|
| 185 | - if (!isset($auteur['ip_change'])) { |
|
| 186 | - $auteur['ip_change'] = false; |
|
| 187 | - } |
|
| 188 | - |
|
| 189 | - if (!isset($auteur['date_session'])) { |
|
| 190 | - $auteur['date_session'] = time(); |
|
| 191 | - } |
|
| 192 | - if ( |
|
| 193 | - isset($auteur['prefs']) |
|
| 194 | - and is_string($auteur['prefs']) |
|
| 195 | - and $prefs = @unserialize($auteur['prefs']) |
|
| 196 | - ) { |
|
| 197 | - $auteur['prefs'] = $prefs; |
|
| 198 | - } |
|
| 199 | - |
|
| 200 | - $fichier_session = ''; |
|
| 201 | - |
|
| 202 | - // les sessions anonymes sont stockees dans $_SESSION |
|
| 203 | - if (!$id_auteur) { |
|
| 204 | - spip_php_session_start(); |
|
| 205 | - $_SESSION[$_COOKIE['spip_session']] = preparer_ecriture_session($auteur); |
|
| 206 | - } else { |
|
| 207 | - $fichier_session = fichier_session('alea_ephemere'); |
|
| 208 | - if (!ecrire_fichier_session($fichier_session, $auteur)) { |
|
| 209 | - spip_log('Echec ecriture fichier session ' . $fichier_session, 'session' . _LOG_HS); |
|
| 210 | - include_spip('inc/minipres'); |
|
| 211 | - echo minipres(); |
|
| 212 | - exit; |
|
| 213 | - } |
|
| 214 | - // verifier et limiter le nombre maxi de sessions |
|
| 215 | - // https://core.spip.net/issues/3807 |
|
| 216 | - lister_sessions_auteur($id_auteur); |
|
| 217 | - } |
|
| 218 | - |
|
| 219 | - // poser le cookie de session SPIP |
|
| 220 | - include_spip('inc/cookie'); |
|
| 221 | - $duree = definir_duree_cookie_session($auteur); |
|
| 222 | - spip_setcookie('spip_session', $_COOKIE['spip_session'], [ |
|
| 223 | - 'expires' => time() + $duree |
|
| 224 | - ]); |
|
| 225 | - spip_log("ajoute session $fichier_session cookie $duree", 'session'); |
|
| 226 | - |
|
| 227 | - // Si on est admin, poser le cookie de correspondance |
|
| 228 | - if (!function_exists('autoriser')) { |
|
| 229 | - include_spip('inc/autoriser'); |
|
| 230 | - } |
|
| 231 | - if (autoriser('ecrire', '', '', $auteur) and _DUREE_COOKIE_ADMIN) { |
|
| 232 | - spip_setcookie('spip_admin', '@' . ($auteur['email'] ?: $auteur['login']), [ |
|
| 233 | - 'expires' => time() + max(_DUREE_COOKIE_ADMIN, $duree) |
|
| 234 | - ]); |
|
| 235 | - } // sinon le supprimer ... |
|
| 236 | - else { |
|
| 237 | - spip_setcookie('spip_admin', '', [ |
|
| 238 | - 'expires' => 1 |
|
| 239 | - ]); |
|
| 240 | - } |
|
| 241 | - |
|
| 242 | - # on en profite pour purger les vieilles sessions anonymes abandonnees |
|
| 243 | - # supprimer_sessions(0, true, false); |
|
| 244 | - |
|
| 245 | - return $_COOKIE['spip_session']; |
|
| 127 | + // Si le client a deja une session valide pour son id_auteur |
|
| 128 | + // on conserve le meme fichier |
|
| 129 | + |
|
| 130 | + // Attention un visiteur peut avoir une session et un id=0, |
|
| 131 | + // => ne pas melanger les sessions des differents visiteurs |
|
| 132 | + $id_auteur = isset($auteur['id_auteur']) ? intval($auteur['id_auteur']) : 0; |
|
| 133 | + |
|
| 134 | + // Si ce n'est pas un inscrit (les inscrits ont toujours des choses en session) |
|
| 135 | + // on va vérifier s'il y a vraiment des choses à écrire |
|
| 136 | + if (!$id_auteur) { |
|
| 137 | + // On supprime les données de base pour voir le contenu réel de la session |
|
| 138 | + $auteur_verif = $auteur; |
|
| 139 | + if (isset($auteur_verif['id_auteur'])) { |
|
| 140 | + unset($auteur_verif['id_auteur']); |
|
| 141 | + } |
|
| 142 | + if (isset($auteur_verif['hash_env'])) { |
|
| 143 | + unset($auteur_verif['hash_env']); |
|
| 144 | + } |
|
| 145 | + if (isset($auteur_verif['ip_change'])) { |
|
| 146 | + unset($auteur_verif['ip_change']); |
|
| 147 | + } |
|
| 148 | + if (isset($auteur_verif['date_session'])) { |
|
| 149 | + unset($auteur_verif['date_session']); |
|
| 150 | + } |
|
| 151 | + |
|
| 152 | + // Les variables vraiment nulle ne sont pas à prendre en compte non plus |
|
| 153 | + foreach ($auteur_verif as $variable => $valeur) { |
|
| 154 | + if ($valeur === null) { |
|
| 155 | + unset($auteur_verif[$variable]); |
|
| 156 | + } |
|
| 157 | + } |
|
| 158 | + |
|
| 159 | + // Si après ça la session est vide alors on supprime l'éventuel fichier et on arrête là |
|
| 160 | + if (!$auteur_verif) { |
|
| 161 | + if (isset($_COOKIE['spip_session']) and isset($_SESSION[$_COOKIE['spip_session']])) { |
|
| 162 | + unset($_SESSION[$_COOKIE['spip_session']]); |
|
| 163 | + } |
|
| 164 | + if (isset($_COOKIE['spip_session'])) { |
|
| 165 | + unset($_COOKIE['spip_session']); |
|
| 166 | + } |
|
| 167 | + |
|
| 168 | + return false; |
|
| 169 | + } |
|
| 170 | + } |
|
| 171 | + |
|
| 172 | + if ( |
|
| 173 | + !isset($_COOKIE['spip_session']) |
|
| 174 | + or !preg_match(',^' . $id_auteur . '_,', $_COOKIE['spip_session']) |
|
| 175 | + ) { |
|
| 176 | + $_COOKIE['spip_session'] = $id_auteur . '_' . md5(uniqid(rand(), true)); |
|
| 177 | + } |
|
| 178 | + |
|
| 179 | + // Maintenant on sait qu'on a des choses à écrire |
|
| 180 | + // On s'assure d'avoir au moins ces valeurs |
|
| 181 | + $auteur['id_auteur'] = $id_auteur; |
|
| 182 | + if (!isset($auteur['hash_env'])) { |
|
| 183 | + $auteur['hash_env'] = hash_env(); |
|
| 184 | + } |
|
| 185 | + if (!isset($auteur['ip_change'])) { |
|
| 186 | + $auteur['ip_change'] = false; |
|
| 187 | + } |
|
| 188 | + |
|
| 189 | + if (!isset($auteur['date_session'])) { |
|
| 190 | + $auteur['date_session'] = time(); |
|
| 191 | + } |
|
| 192 | + if ( |
|
| 193 | + isset($auteur['prefs']) |
|
| 194 | + and is_string($auteur['prefs']) |
|
| 195 | + and $prefs = @unserialize($auteur['prefs']) |
|
| 196 | + ) { |
|
| 197 | + $auteur['prefs'] = $prefs; |
|
| 198 | + } |
|
| 199 | + |
|
| 200 | + $fichier_session = ''; |
|
| 201 | + |
|
| 202 | + // les sessions anonymes sont stockees dans $_SESSION |
|
| 203 | + if (!$id_auteur) { |
|
| 204 | + spip_php_session_start(); |
|
| 205 | + $_SESSION[$_COOKIE['spip_session']] = preparer_ecriture_session($auteur); |
|
| 206 | + } else { |
|
| 207 | + $fichier_session = fichier_session('alea_ephemere'); |
|
| 208 | + if (!ecrire_fichier_session($fichier_session, $auteur)) { |
|
| 209 | + spip_log('Echec ecriture fichier session ' . $fichier_session, 'session' . _LOG_HS); |
|
| 210 | + include_spip('inc/minipres'); |
|
| 211 | + echo minipres(); |
|
| 212 | + exit; |
|
| 213 | + } |
|
| 214 | + // verifier et limiter le nombre maxi de sessions |
|
| 215 | + // https://core.spip.net/issues/3807 |
|
| 216 | + lister_sessions_auteur($id_auteur); |
|
| 217 | + } |
|
| 218 | + |
|
| 219 | + // poser le cookie de session SPIP |
|
| 220 | + include_spip('inc/cookie'); |
|
| 221 | + $duree = definir_duree_cookie_session($auteur); |
|
| 222 | + spip_setcookie('spip_session', $_COOKIE['spip_session'], [ |
|
| 223 | + 'expires' => time() + $duree |
|
| 224 | + ]); |
|
| 225 | + spip_log("ajoute session $fichier_session cookie $duree", 'session'); |
|
| 226 | + |
|
| 227 | + // Si on est admin, poser le cookie de correspondance |
|
| 228 | + if (!function_exists('autoriser')) { |
|
| 229 | + include_spip('inc/autoriser'); |
|
| 230 | + } |
|
| 231 | + if (autoriser('ecrire', '', '', $auteur) and _DUREE_COOKIE_ADMIN) { |
|
| 232 | + spip_setcookie('spip_admin', '@' . ($auteur['email'] ?: $auteur['login']), [ |
|
| 233 | + 'expires' => time() + max(_DUREE_COOKIE_ADMIN, $duree) |
|
| 234 | + ]); |
|
| 235 | + } // sinon le supprimer ... |
|
| 236 | + else { |
|
| 237 | + spip_setcookie('spip_admin', '', [ |
|
| 238 | + 'expires' => 1 |
|
| 239 | + ]); |
|
| 240 | + } |
|
| 241 | + |
|
| 242 | + # on en profite pour purger les vieilles sessions anonymes abandonnees |
|
| 243 | + # supprimer_sessions(0, true, false); |
|
| 244 | + |
|
| 245 | + return $_COOKIE['spip_session']; |
|
| 246 | 246 | } |
| 247 | 247 | |
| 248 | 248 | /** |
@@ -262,15 +262,15 @@ discard block |
||
| 262 | 262 | * Durée en secondes |
| 263 | 263 | **/ |
| 264 | 264 | function definir_duree_cookie_session($auteur) { |
| 265 | - $coef = 2; |
|
| 266 | - if (isset($auteur['cookie'])) { |
|
| 267 | - if (is_numeric($auteur['cookie'])) { |
|
| 268 | - $coef = $auteur['cookie']; |
|
| 269 | - } else { |
|
| 270 | - $coef = 20; |
|
| 271 | - } |
|
| 272 | - } |
|
| 273 | - return (int)(_RENOUVELLE_ALEA * $coef); |
|
| 265 | + $coef = 2; |
|
| 266 | + if (isset($auteur['cookie'])) { |
|
| 267 | + if (is_numeric($auteur['cookie'])) { |
|
| 268 | + $coef = $auteur['cookie']; |
|
| 269 | + } else { |
|
| 270 | + $coef = 20; |
|
| 271 | + } |
|
| 272 | + } |
|
| 273 | + return (int)(_RENOUVELLE_ALEA * $coef); |
|
| 274 | 274 | } |
| 275 | 275 | |
| 276 | 276 | /** |
@@ -290,91 +290,91 @@ discard block |
||
| 290 | 290 | * @return bool|int|null |
| 291 | 291 | */ |
| 292 | 292 | function verifier_session($change = false) { |
| 293 | - // si pas de cookie, c'est fichu |
|
| 294 | - if (!isset($_COOKIE['spip_session'])) { |
|
| 295 | - return false; |
|
| 296 | - } |
|
| 297 | - |
|
| 298 | - $fichier_session = ''; |
|
| 299 | - |
|
| 300 | - // est-ce une session anonyme ? |
|
| 301 | - if (!intval($_COOKIE['spip_session'])) { |
|
| 302 | - spip_php_session_start(); |
|
| 303 | - if (!isset($_SESSION[$_COOKIE['spip_session']]) or !is_array($_SESSION[$_COOKIE['spip_session']])) { |
|
| 304 | - return false; |
|
| 305 | - } |
|
| 306 | - $GLOBALS['visiteur_session'] = $_SESSION[$_COOKIE['spip_session']]; |
|
| 307 | - } else { |
|
| 308 | - // Tester avec alea courant |
|
| 309 | - $fichier_session = fichier_session('alea_ephemere', true); |
|
| 310 | - if ($fichier_session and @file_exists($fichier_session)) { |
|
| 311 | - include($fichier_session); |
|
| 312 | - } else { |
|
| 313 | - // Sinon, tester avec alea precedent |
|
| 314 | - $fichier_session = fichier_session('alea_ephemere_ancien', true); |
|
| 315 | - if (!$fichier_session or !@file_exists($fichier_session)) { |
|
| 316 | - return false; |
|
| 317 | - } |
|
| 318 | - |
|
| 319 | - // Renouveler la session avec l'alea courant |
|
| 320 | - include($fichier_session); |
|
| 321 | - spip_log('renouvelle session ' . $GLOBALS['visiteur_session']['id_auteur'], 'session'); |
|
| 322 | - spip_unlink($fichier_session); |
|
| 323 | - ajouter_session($GLOBALS['visiteur_session']); |
|
| 324 | - } |
|
| 325 | - } |
|
| 326 | - |
|
| 327 | - // Compatibilite ascendante : auteur_session est visiteur_session si |
|
| 328 | - // c'est un auteur SPIP authentifie (tandis qu'un visiteur_session peut |
|
| 329 | - // n'etre qu'identifie, sans aucune authentification). |
|
| 330 | - |
|
| 331 | - if (isset($GLOBALS['visiteur_session']['id_auteur']) and $GLOBALS['visiteur_session']['id_auteur']) { |
|
| 332 | - $GLOBALS['auteur_session'] = &$GLOBALS['visiteur_session']; |
|
| 333 | - } |
|
| 334 | - |
|
| 335 | - |
|
| 336 | - // Si l'adresse IP change, inc/presentation mettra une balise image |
|
| 337 | - // avec un URL de rappel demandant a changer le nom de la session. |
|
| 338 | - // Seul celui qui a l'IP d'origine est rejoue |
|
| 339 | - // ainsi un eventuel voleur de cookie ne pourrait pas deconnecter |
|
| 340 | - // sa victime, mais se ferait deconnecter par elle. |
|
| 341 | - if (hash_env() != $GLOBALS['visiteur_session']['hash_env']) { |
|
| 342 | - if (!$GLOBALS['visiteur_session']['ip_change']) { |
|
| 343 | - define('_SESSION_REJOUER', true); |
|
| 344 | - $GLOBALS['visiteur_session']['ip_change'] = true; |
|
| 345 | - ajouter_session($GLOBALS['visiteur_session']); |
|
| 346 | - } else { |
|
| 347 | - if ($change) { |
|
| 348 | - spip_log('session non rejouee, vol de cookie ?', 'session'); |
|
| 349 | - } |
|
| 350 | - } |
|
| 351 | - } else { |
|
| 352 | - if ($change) { |
|
| 353 | - spip_log("rejoue session $fichier_session " . $_COOKIE['spip_session'], 'session'); |
|
| 354 | - if ($fichier_session) { |
|
| 355 | - spip_unlink($fichier_session); |
|
| 356 | - } |
|
| 357 | - $GLOBALS['visiteur_session']['ip_change'] = false; |
|
| 358 | - unset($_COOKIE['spip_session']); |
|
| 359 | - ajouter_session($GLOBALS['visiteur_session']); |
|
| 360 | - } |
|
| 361 | - } |
|
| 362 | - |
|
| 363 | - // Si la session a ete initiee il y a trop longtemps, elle est annulee |
|
| 364 | - if ( |
|
| 365 | - isset($GLOBALS['visiteur_session']) |
|
| 366 | - and defined('_AGE_SESSION_MAX') |
|
| 367 | - and _AGE_SESSION_MAX > 0 |
|
| 368 | - and time() - @$GLOBALS['visiteur_session']['date_session'] > _AGE_SESSION_MAX |
|
| 369 | - ) { |
|
| 370 | - unset($GLOBALS['visiteur_session']); |
|
| 371 | - |
|
| 372 | - return false; |
|
| 373 | - } |
|
| 374 | - |
|
| 375 | - return is_numeric($GLOBALS['visiteur_session']['id_auteur']) |
|
| 376 | - ? $GLOBALS['visiteur_session']['id_auteur'] |
|
| 377 | - : null; |
|
| 293 | + // si pas de cookie, c'est fichu |
|
| 294 | + if (!isset($_COOKIE['spip_session'])) { |
|
| 295 | + return false; |
|
| 296 | + } |
|
| 297 | + |
|
| 298 | + $fichier_session = ''; |
|
| 299 | + |
|
| 300 | + // est-ce une session anonyme ? |
|
| 301 | + if (!intval($_COOKIE['spip_session'])) { |
|
| 302 | + spip_php_session_start(); |
|
| 303 | + if (!isset($_SESSION[$_COOKIE['spip_session']]) or !is_array($_SESSION[$_COOKIE['spip_session']])) { |
|
| 304 | + return false; |
|
| 305 | + } |
|
| 306 | + $GLOBALS['visiteur_session'] = $_SESSION[$_COOKIE['spip_session']]; |
|
| 307 | + } else { |
|
| 308 | + // Tester avec alea courant |
|
| 309 | + $fichier_session = fichier_session('alea_ephemere', true); |
|
| 310 | + if ($fichier_session and @file_exists($fichier_session)) { |
|
| 311 | + include($fichier_session); |
|
| 312 | + } else { |
|
| 313 | + // Sinon, tester avec alea precedent |
|
| 314 | + $fichier_session = fichier_session('alea_ephemere_ancien', true); |
|
| 315 | + if (!$fichier_session or !@file_exists($fichier_session)) { |
|
| 316 | + return false; |
|
| 317 | + } |
|
| 318 | + |
|
| 319 | + // Renouveler la session avec l'alea courant |
|
| 320 | + include($fichier_session); |
|
| 321 | + spip_log('renouvelle session ' . $GLOBALS['visiteur_session']['id_auteur'], 'session'); |
|
| 322 | + spip_unlink($fichier_session); |
|
| 323 | + ajouter_session($GLOBALS['visiteur_session']); |
|
| 324 | + } |
|
| 325 | + } |
|
| 326 | + |
|
| 327 | + // Compatibilite ascendante : auteur_session est visiteur_session si |
|
| 328 | + // c'est un auteur SPIP authentifie (tandis qu'un visiteur_session peut |
|
| 329 | + // n'etre qu'identifie, sans aucune authentification). |
|
| 330 | + |
|
| 331 | + if (isset($GLOBALS['visiteur_session']['id_auteur']) and $GLOBALS['visiteur_session']['id_auteur']) { |
|
| 332 | + $GLOBALS['auteur_session'] = &$GLOBALS['visiteur_session']; |
|
| 333 | + } |
|
| 334 | + |
|
| 335 | + |
|
| 336 | + // Si l'adresse IP change, inc/presentation mettra une balise image |
|
| 337 | + // avec un URL de rappel demandant a changer le nom de la session. |
|
| 338 | + // Seul celui qui a l'IP d'origine est rejoue |
|
| 339 | + // ainsi un eventuel voleur de cookie ne pourrait pas deconnecter |
|
| 340 | + // sa victime, mais se ferait deconnecter par elle. |
|
| 341 | + if (hash_env() != $GLOBALS['visiteur_session']['hash_env']) { |
|
| 342 | + if (!$GLOBALS['visiteur_session']['ip_change']) { |
|
| 343 | + define('_SESSION_REJOUER', true); |
|
| 344 | + $GLOBALS['visiteur_session']['ip_change'] = true; |
|
| 345 | + ajouter_session($GLOBALS['visiteur_session']); |
|
| 346 | + } else { |
|
| 347 | + if ($change) { |
|
| 348 | + spip_log('session non rejouee, vol de cookie ?', 'session'); |
|
| 349 | + } |
|
| 350 | + } |
|
| 351 | + } else { |
|
| 352 | + if ($change) { |
|
| 353 | + spip_log("rejoue session $fichier_session " . $_COOKIE['spip_session'], 'session'); |
|
| 354 | + if ($fichier_session) { |
|
| 355 | + spip_unlink($fichier_session); |
|
| 356 | + } |
|
| 357 | + $GLOBALS['visiteur_session']['ip_change'] = false; |
|
| 358 | + unset($_COOKIE['spip_session']); |
|
| 359 | + ajouter_session($GLOBALS['visiteur_session']); |
|
| 360 | + } |
|
| 361 | + } |
|
| 362 | + |
|
| 363 | + // Si la session a ete initiee il y a trop longtemps, elle est annulee |
|
| 364 | + if ( |
|
| 365 | + isset($GLOBALS['visiteur_session']) |
|
| 366 | + and defined('_AGE_SESSION_MAX') |
|
| 367 | + and _AGE_SESSION_MAX > 0 |
|
| 368 | + and time() - @$GLOBALS['visiteur_session']['date_session'] > _AGE_SESSION_MAX |
|
| 369 | + ) { |
|
| 370 | + unset($GLOBALS['visiteur_session']); |
|
| 371 | + |
|
| 372 | + return false; |
|
| 373 | + } |
|
| 374 | + |
|
| 375 | + return is_numeric($GLOBALS['visiteur_session']['id_auteur']) |
|
| 376 | + ? $GLOBALS['visiteur_session']['id_auteur'] |
|
| 377 | + : null; |
|
| 378 | 378 | } |
| 379 | 379 | |
| 380 | 380 | /** |
@@ -389,7 +389,7 @@ discard block |
||
| 389 | 389 | * Valeur, si trouvée, `null` sinon. |
| 390 | 390 | */ |
| 391 | 391 | function session_get($nom) { |
| 392 | - return isset($GLOBALS['visiteur_session'][$nom]) ? $GLOBALS['visiteur_session'][$nom] : null; |
|
| 392 | + return isset($GLOBALS['visiteur_session'][$nom]) ? $GLOBALS['visiteur_session'][$nom] : null; |
|
| 393 | 393 | } |
| 394 | 394 | |
| 395 | 395 | |
@@ -405,32 +405,32 @@ discard block |
||
| 405 | 405 | * @return void|array |
| 406 | 406 | */ |
| 407 | 407 | function session_set($nom, $val = null) { |
| 408 | - static $remove = []; |
|
| 409 | - static $actualiser_sessions = false; |
|
| 410 | - if ($nom === false) { |
|
| 411 | - return $remove; |
|
| 412 | - } |
|
| 413 | - if (is_null($val)) { |
|
| 414 | - // rien a faire |
|
| 415 | - if (!isset($GLOBALS['visiteur_session'][$nom])) { |
|
| 416 | - return; |
|
| 417 | - } |
|
| 418 | - unset($GLOBALS['visiteur_session'][$nom]); |
|
| 419 | - $remove[] = $nom; |
|
| 420 | - } else { |
|
| 421 | - // On ajoute la valeur dans la globale |
|
| 422 | - $GLOBALS['visiteur_session'][$nom] = $val; |
|
| 423 | - if ($remove) { |
|
| 424 | - $remove = array_diff($remove, [$nom]); |
|
| 425 | - } |
|
| 426 | - } |
|
| 427 | - if (!$actualiser_sessions) { |
|
| 428 | - // il faut creer la session si on en a pas, la premiere fois |
|
| 429 | - ajouter_session($GLOBALS['visiteur_session']); |
|
| 430 | - // in register la fonction qui mettra a jour toutes les sessions en fin de hit |
|
| 431 | - register_shutdown_function('terminer_actualiser_sessions'); |
|
| 432 | - $actualiser_sessions = true; |
|
| 433 | - } |
|
| 408 | + static $remove = []; |
|
| 409 | + static $actualiser_sessions = false; |
|
| 410 | + if ($nom === false) { |
|
| 411 | + return $remove; |
|
| 412 | + } |
|
| 413 | + if (is_null($val)) { |
|
| 414 | + // rien a faire |
|
| 415 | + if (!isset($GLOBALS['visiteur_session'][$nom])) { |
|
| 416 | + return; |
|
| 417 | + } |
|
| 418 | + unset($GLOBALS['visiteur_session'][$nom]); |
|
| 419 | + $remove[] = $nom; |
|
| 420 | + } else { |
|
| 421 | + // On ajoute la valeur dans la globale |
|
| 422 | + $GLOBALS['visiteur_session'][$nom] = $val; |
|
| 423 | + if ($remove) { |
|
| 424 | + $remove = array_diff($remove, [$nom]); |
|
| 425 | + } |
|
| 426 | + } |
|
| 427 | + if (!$actualiser_sessions) { |
|
| 428 | + // il faut creer la session si on en a pas, la premiere fois |
|
| 429 | + ajouter_session($GLOBALS['visiteur_session']); |
|
| 430 | + // in register la fonction qui mettra a jour toutes les sessions en fin de hit |
|
| 431 | + register_shutdown_function('terminer_actualiser_sessions'); |
|
| 432 | + $actualiser_sessions = true; |
|
| 433 | + } |
|
| 434 | 434 | } |
| 435 | 435 | |
| 436 | 436 | /** |
@@ -439,12 +439,12 @@ discard block |
||
| 439 | 439 | * @uses actualiser_sessions() |
| 440 | 440 | */ |
| 441 | 441 | function terminer_actualiser_sessions() { |
| 442 | - // se remettre dans le dossier de travail au cas ou Apache a change |
|
| 443 | - chdir(_ROOT_CWD); |
|
| 444 | - // recuperer les variables a effacer |
|
| 445 | - $remove = session_set(false); |
|
| 446 | - // mettre a jour toutes les sessions |
|
| 447 | - actualiser_sessions($GLOBALS['visiteur_session'], $remove); |
|
| 442 | + // se remettre dans le dossier de travail au cas ou Apache a change |
|
| 443 | + chdir(_ROOT_CWD); |
|
| 444 | + // recuperer les variables a effacer |
|
| 445 | + $remove = session_set(false); |
|
| 446 | + // mettre a jour toutes les sessions |
|
| 447 | + actualiser_sessions($GLOBALS['visiteur_session'], $remove); |
|
| 448 | 448 | } |
| 449 | 449 | |
| 450 | 450 | |
@@ -469,83 +469,83 @@ discard block |
||
| 469 | 469 | */ |
| 470 | 470 | function actualiser_sessions($auteur, $supprimer_cles = []) { |
| 471 | 471 | |
| 472 | - $id_auteur = isset($auteur['id_auteur']) ? intval($auteur['id_auteur']) : 0; |
|
| 473 | - $id_auteur_courant = isset($GLOBALS['visiteur_session']['id_auteur']) ? intval($GLOBALS['visiteur_session']['id_auteur']) : 0; |
|
| 474 | - |
|
| 475 | - // si l'auteur est celui de la session courante, verifier/creer la session si besoin |
|
| 476 | - $fichier_session_courante = ''; |
|
| 477 | - if ($id_auteur == $id_auteur_courant) { |
|
| 478 | - $auteur = array_merge($GLOBALS['visiteur_session'], $auteur); |
|
| 479 | - ajouter_session($auteur); |
|
| 480 | - if ($id_auteur) { |
|
| 481 | - $fichier_session_courante = fichier_session('alea_ephemere'); |
|
| 482 | - } |
|
| 483 | - } |
|
| 484 | - |
|
| 485 | - // si session anonyme on ne fait rien d'autre ici : les sessions anonymes sont non partagees |
|
| 486 | - if (!$id_auteur) { |
|
| 487 | - return; |
|
| 488 | - } |
|
| 489 | - |
|
| 490 | - // les préférences sont désérialisées, toujours. |
|
| 491 | - // [fixme] Le champ 'prefs' sert aussi à l’inscription |
|
| 492 | - if (isset($auteur['prefs']) and is_string($auteur['prefs'])) { |
|
| 493 | - $auteur['prefs'] = @unserialize($auteur['prefs']); |
|
| 494 | - if (!is_array($auteur['prefs'])) { |
|
| 495 | - $auteur['prefs'] = []; |
|
| 496 | - } |
|
| 497 | - } |
|
| 498 | - |
|
| 499 | - // memoriser l'auteur courant (celui qui modifie la fiche) |
|
| 500 | - $sauve = $GLOBALS['visiteur_session']; |
|
| 501 | - |
|
| 502 | - // .. mettre a jour les sessions de l'auteur cible |
|
| 503 | - // attention au $ final pour ne pas risquer d'embarquer un .php.jeton temporaire |
|
| 504 | - // cree par une ecriture concurente d'une session (fichier atomique temporaire) |
|
| 505 | - $sessions = lister_sessions_auteur($id_auteur); |
|
| 506 | - |
|
| 507 | - // 1ere passe : lire et fusionner les sessions |
|
| 508 | - foreach ($sessions as $session) { |
|
| 509 | - $GLOBALS['visiteur_session'] = []; |
|
| 510 | - // a pu etre supprime entre le preg initial et le moment ou l'on arrive la (concurrence) |
|
| 511 | - if ( |
|
| 512 | - $session !== $fichier_session_courante |
|
| 513 | - and @file_exists($session) |
|
| 514 | - ) { |
|
| 515 | - include $session; # $GLOBALS['visiteur_session'] est alors l'auteur cible |
|
| 516 | - |
|
| 517 | - $auteur = array_merge($GLOBALS['visiteur_session'], $auteur); |
|
| 518 | - } |
|
| 519 | - } |
|
| 520 | - |
|
| 521 | - // supprimer les eventuelles cles dont on ne veut plus |
|
| 522 | - foreach ($supprimer_cles as $cle) { |
|
| 523 | - unset($auteur[$cle]); |
|
| 524 | - } |
|
| 525 | - |
|
| 526 | - $auteur_session = preparer_ecriture_session($auteur); |
|
| 527 | - |
|
| 528 | - // seconde passe : ecrire les sessions qui ne sont pas a jour |
|
| 529 | - foreach ($sessions as $session) { |
|
| 530 | - $GLOBALS['visiteur_session'] = []; |
|
| 531 | - // a pu etre supprime entre le preg initial et le moment ou l'on arrive la (concurrence) |
|
| 532 | - if (@file_exists($session)) { |
|
| 533 | - include $session; # $GLOBALS['visiteur_session'] est alors l'auteur cible |
|
| 534 | - |
|
| 535 | - // est-ce que cette session est a mettre a jour ? |
|
| 536 | - if ($auteur_session != $GLOBALS['visiteur_session']) { |
|
| 537 | - ecrire_fichier_session($session, $auteur); |
|
| 538 | - } |
|
| 539 | - } |
|
| 540 | - } |
|
| 541 | - |
|
| 542 | - if ($id_auteur == $id_auteur_courant) { |
|
| 543 | - $GLOBALS['visiteur_session'] = $auteur; |
|
| 544 | - $GLOBALS['auteur_session'] = &$GLOBALS['visiteur_session']; |
|
| 545 | - } else { |
|
| 546 | - // restaurer l'auteur courant |
|
| 547 | - $GLOBALS['visiteur_session'] = $sauve; |
|
| 548 | - } |
|
| 472 | + $id_auteur = isset($auteur['id_auteur']) ? intval($auteur['id_auteur']) : 0; |
|
| 473 | + $id_auteur_courant = isset($GLOBALS['visiteur_session']['id_auteur']) ? intval($GLOBALS['visiteur_session']['id_auteur']) : 0; |
|
| 474 | + |
|
| 475 | + // si l'auteur est celui de la session courante, verifier/creer la session si besoin |
|
| 476 | + $fichier_session_courante = ''; |
|
| 477 | + if ($id_auteur == $id_auteur_courant) { |
|
| 478 | + $auteur = array_merge($GLOBALS['visiteur_session'], $auteur); |
|
| 479 | + ajouter_session($auteur); |
|
| 480 | + if ($id_auteur) { |
|
| 481 | + $fichier_session_courante = fichier_session('alea_ephemere'); |
|
| 482 | + } |
|
| 483 | + } |
|
| 484 | + |
|
| 485 | + // si session anonyme on ne fait rien d'autre ici : les sessions anonymes sont non partagees |
|
| 486 | + if (!$id_auteur) { |
|
| 487 | + return; |
|
| 488 | + } |
|
| 489 | + |
|
| 490 | + // les préférences sont désérialisées, toujours. |
|
| 491 | + // [fixme] Le champ 'prefs' sert aussi à l’inscription |
|
| 492 | + if (isset($auteur['prefs']) and is_string($auteur['prefs'])) { |
|
| 493 | + $auteur['prefs'] = @unserialize($auteur['prefs']); |
|
| 494 | + if (!is_array($auteur['prefs'])) { |
|
| 495 | + $auteur['prefs'] = []; |
|
| 496 | + } |
|
| 497 | + } |
|
| 498 | + |
|
| 499 | + // memoriser l'auteur courant (celui qui modifie la fiche) |
|
| 500 | + $sauve = $GLOBALS['visiteur_session']; |
|
| 501 | + |
|
| 502 | + // .. mettre a jour les sessions de l'auteur cible |
|
| 503 | + // attention au $ final pour ne pas risquer d'embarquer un .php.jeton temporaire |
|
| 504 | + // cree par une ecriture concurente d'une session (fichier atomique temporaire) |
|
| 505 | + $sessions = lister_sessions_auteur($id_auteur); |
|
| 506 | + |
|
| 507 | + // 1ere passe : lire et fusionner les sessions |
|
| 508 | + foreach ($sessions as $session) { |
|
| 509 | + $GLOBALS['visiteur_session'] = []; |
|
| 510 | + // a pu etre supprime entre le preg initial et le moment ou l'on arrive la (concurrence) |
|
| 511 | + if ( |
|
| 512 | + $session !== $fichier_session_courante |
|
| 513 | + and @file_exists($session) |
|
| 514 | + ) { |
|
| 515 | + include $session; # $GLOBALS['visiteur_session'] est alors l'auteur cible |
|
| 516 | + |
|
| 517 | + $auteur = array_merge($GLOBALS['visiteur_session'], $auteur); |
|
| 518 | + } |
|
| 519 | + } |
|
| 520 | + |
|
| 521 | + // supprimer les eventuelles cles dont on ne veut plus |
|
| 522 | + foreach ($supprimer_cles as $cle) { |
|
| 523 | + unset($auteur[$cle]); |
|
| 524 | + } |
|
| 525 | + |
|
| 526 | + $auteur_session = preparer_ecriture_session($auteur); |
|
| 527 | + |
|
| 528 | + // seconde passe : ecrire les sessions qui ne sont pas a jour |
|
| 529 | + foreach ($sessions as $session) { |
|
| 530 | + $GLOBALS['visiteur_session'] = []; |
|
| 531 | + // a pu etre supprime entre le preg initial et le moment ou l'on arrive la (concurrence) |
|
| 532 | + if (@file_exists($session)) { |
|
| 533 | + include $session; # $GLOBALS['visiteur_session'] est alors l'auteur cible |
|
| 534 | + |
|
| 535 | + // est-ce que cette session est a mettre a jour ? |
|
| 536 | + if ($auteur_session != $GLOBALS['visiteur_session']) { |
|
| 537 | + ecrire_fichier_session($session, $auteur); |
|
| 538 | + } |
|
| 539 | + } |
|
| 540 | + } |
|
| 541 | + |
|
| 542 | + if ($id_auteur == $id_auteur_courant) { |
|
| 543 | + $GLOBALS['visiteur_session'] = $auteur; |
|
| 544 | + $GLOBALS['auteur_session'] = &$GLOBALS['visiteur_session']; |
|
| 545 | + } else { |
|
| 546 | + // restaurer l'auteur courant |
|
| 547 | + $GLOBALS['visiteur_session'] = $sauve; |
|
| 548 | + } |
|
| 549 | 549 | } |
| 550 | 550 | |
| 551 | 551 | /** |
@@ -559,48 +559,48 @@ discard block |
||
| 559 | 559 | */ |
| 560 | 560 | function lister_sessions_auteur($id_auteur, $nb_max = null) { |
| 561 | 561 | |
| 562 | - if (is_null($nb_max)) { |
|
| 563 | - if (!defined('_NB_SESSIONS_MAX')) { |
|
| 564 | - define('_NB_SESSIONS_MAX', 100); |
|
| 565 | - } |
|
| 566 | - $nb_max = _NB_SESSIONS_MAX; |
|
| 567 | - } |
|
| 568 | - |
|
| 569 | - // liste des sessions |
|
| 570 | - $sessions = preg_files(_DIR_SESSIONS, '/' . $id_auteur . '_.*\.php$'); |
|
| 571 | - |
|
| 572 | - // si on en a plus que la limite, supprimer les plus vieilles |
|
| 573 | - // si ce ne sont pas des sessions anonymes car elles sont alors chacune differentes |
|
| 574 | - if ( |
|
| 575 | - $id_auteur |
|
| 576 | - and count($sessions) > $nb_max |
|
| 577 | - ) { |
|
| 578 | - // limiter le nombre de sessions ouvertes par un auteur |
|
| 579 | - // filemtime sur les sessions |
|
| 580 | - $sessions = array_flip($sessions); |
|
| 581 | - |
|
| 582 | - // 1ere passe : lire les filemtime |
|
| 583 | - foreach ($sessions as $session => $z) { |
|
| 584 | - if ( |
|
| 585 | - $d = @filemtime($session) |
|
| 586 | - ) { |
|
| 587 | - $sessions[$session] = $d; |
|
| 588 | - } else { |
|
| 589 | - $sessions[$session] = 0; |
|
| 590 | - } |
|
| 591 | - } |
|
| 592 | - |
|
| 593 | - // les plus anciennes en premier |
|
| 594 | - asort($sessions); |
|
| 595 | - |
|
| 596 | - $sessions = array_keys($sessions); |
|
| 597 | - while (count($sessions) > $nb_max) { |
|
| 598 | - $session = array_shift($sessions); |
|
| 599 | - @unlink($session); |
|
| 600 | - } |
|
| 601 | - } |
|
| 602 | - |
|
| 603 | - return $sessions; |
|
| 562 | + if (is_null($nb_max)) { |
|
| 563 | + if (!defined('_NB_SESSIONS_MAX')) { |
|
| 564 | + define('_NB_SESSIONS_MAX', 100); |
|
| 565 | + } |
|
| 566 | + $nb_max = _NB_SESSIONS_MAX; |
|
| 567 | + } |
|
| 568 | + |
|
| 569 | + // liste des sessions |
|
| 570 | + $sessions = preg_files(_DIR_SESSIONS, '/' . $id_auteur . '_.*\.php$'); |
|
| 571 | + |
|
| 572 | + // si on en a plus que la limite, supprimer les plus vieilles |
|
| 573 | + // si ce ne sont pas des sessions anonymes car elles sont alors chacune differentes |
|
| 574 | + if ( |
|
| 575 | + $id_auteur |
|
| 576 | + and count($sessions) > $nb_max |
|
| 577 | + ) { |
|
| 578 | + // limiter le nombre de sessions ouvertes par un auteur |
|
| 579 | + // filemtime sur les sessions |
|
| 580 | + $sessions = array_flip($sessions); |
|
| 581 | + |
|
| 582 | + // 1ere passe : lire les filemtime |
|
| 583 | + foreach ($sessions as $session => $z) { |
|
| 584 | + if ( |
|
| 585 | + $d = @filemtime($session) |
|
| 586 | + ) { |
|
| 587 | + $sessions[$session] = $d; |
|
| 588 | + } else { |
|
| 589 | + $sessions[$session] = 0; |
|
| 590 | + } |
|
| 591 | + } |
|
| 592 | + |
|
| 593 | + // les plus anciennes en premier |
|
| 594 | + asort($sessions); |
|
| 595 | + |
|
| 596 | + $sessions = array_keys($sessions); |
|
| 597 | + while (count($sessions) > $nb_max) { |
|
| 598 | + $session = array_shift($sessions); |
|
| 599 | + @unlink($session); |
|
| 600 | + } |
|
| 601 | + } |
|
| 602 | + |
|
| 603 | + return $sessions; |
|
| 604 | 604 | } |
| 605 | 605 | |
| 606 | 606 | |
@@ -614,26 +614,26 @@ discard block |
||
| 614 | 614 | * @return array |
| 615 | 615 | */ |
| 616 | 616 | function preparer_ecriture_session($auteur) { |
| 617 | - $row = $auteur; |
|
| 618 | - |
|
| 619 | - // ne pas enregistrer ces elements de securite |
|
| 620 | - // dans le fichier de session |
|
| 621 | - unset($auteur['pass']); |
|
| 622 | - unset($auteur['htpass']); |
|
| 623 | - unset($auteur['low_sec']); |
|
| 624 | - unset($auteur['alea_actuel']); |
|
| 625 | - unset($auteur['alea_futur']); |
|
| 626 | - |
|
| 627 | - $auteur = pipeline('preparer_fichier_session', ['args' => ['row' => $row], 'data' => $auteur]); |
|
| 628 | - |
|
| 629 | - // ne pas enregistrer les valeurs vraiment nulle dans le fichier |
|
| 630 | - foreach ($auteur as $variable => $valeur) { |
|
| 631 | - if ($valeur === null) { |
|
| 632 | - unset($auteur[$variable]); |
|
| 633 | - } |
|
| 634 | - } |
|
| 635 | - |
|
| 636 | - return $auteur; |
|
| 617 | + $row = $auteur; |
|
| 618 | + |
|
| 619 | + // ne pas enregistrer ces elements de securite |
|
| 620 | + // dans le fichier de session |
|
| 621 | + unset($auteur['pass']); |
|
| 622 | + unset($auteur['htpass']); |
|
| 623 | + unset($auteur['low_sec']); |
|
| 624 | + unset($auteur['alea_actuel']); |
|
| 625 | + unset($auteur['alea_futur']); |
|
| 626 | + |
|
| 627 | + $auteur = pipeline('preparer_fichier_session', ['args' => ['row' => $row], 'data' => $auteur]); |
|
| 628 | + |
|
| 629 | + // ne pas enregistrer les valeurs vraiment nulle dans le fichier |
|
| 630 | + foreach ($auteur as $variable => $valeur) { |
|
| 631 | + if ($valeur === null) { |
|
| 632 | + unset($auteur[$variable]); |
|
| 633 | + } |
|
| 634 | + } |
|
| 635 | + |
|
| 636 | + return $auteur; |
|
| 637 | 637 | } |
| 638 | 638 | |
| 639 | 639 | /** |
@@ -645,17 +645,17 @@ discard block |
||
| 645 | 645 | */ |
| 646 | 646 | function ecrire_fichier_session($fichier, $auteur) { |
| 647 | 647 | |
| 648 | - $auteur = preparer_ecriture_session($auteur); |
|
| 648 | + $auteur = preparer_ecriture_session($auteur); |
|
| 649 | 649 | |
| 650 | - // enregistrer les autres donnees du visiteur |
|
| 651 | - $texte = '<' . "?php\n"; |
|
| 652 | - foreach ($auteur as $var => $val) { |
|
| 653 | - $texte .= '$GLOBALS[\'visiteur_session\'][' . var_export($var, true) . '] = ' |
|
| 654 | - . var_export($val, true) . ";\n"; |
|
| 655 | - } |
|
| 656 | - $texte .= '?' . ">\n"; |
|
| 650 | + // enregistrer les autres donnees du visiteur |
|
| 651 | + $texte = '<' . "?php\n"; |
|
| 652 | + foreach ($auteur as $var => $val) { |
|
| 653 | + $texte .= '$GLOBALS[\'visiteur_session\'][' . var_export($var, true) . '] = ' |
|
| 654 | + . var_export($val, true) . ";\n"; |
|
| 655 | + } |
|
| 656 | + $texte .= '?' . ">\n"; |
|
| 657 | 657 | |
| 658 | - return ecrire_fichier($fichier, $texte); |
|
| 658 | + return ecrire_fichier($fichier, $texte); |
|
| 659 | 659 | } |
| 660 | 660 | |
| 661 | 661 | |
@@ -668,23 +668,23 @@ discard block |
||
| 668 | 668 | */ |
| 669 | 669 | function fichier_session($alea, $tantpis = false) { |
| 670 | 670 | |
| 671 | - include_spip('inc/acces'); |
|
| 672 | - charger_aleas(); |
|
| 671 | + include_spip('inc/acces'); |
|
| 672 | + charger_aleas(); |
|
| 673 | 673 | |
| 674 | - if (empty($GLOBALS['meta'][$alea])) { |
|
| 675 | - if (!$tantpis) { |
|
| 676 | - spip_log("fichier session ($tantpis): $alea indisponible", 'session'); |
|
| 677 | - include_spip('inc/minipres'); |
|
| 678 | - echo minipres(); |
|
| 679 | - } |
|
| 674 | + if (empty($GLOBALS['meta'][$alea])) { |
|
| 675 | + if (!$tantpis) { |
|
| 676 | + spip_log("fichier session ($tantpis): $alea indisponible", 'session'); |
|
| 677 | + include_spip('inc/minipres'); |
|
| 678 | + echo minipres(); |
|
| 679 | + } |
|
| 680 | 680 | |
| 681 | - return ''; // echec mais $tanpis |
|
| 682 | - } else { |
|
| 683 | - $repertoire = sous_repertoire(_DIR_SESSIONS, '', false, $tantpis); |
|
| 684 | - $c = $_COOKIE['spip_session']; |
|
| 681 | + return ''; // echec mais $tanpis |
|
| 682 | + } else { |
|
| 683 | + $repertoire = sous_repertoire(_DIR_SESSIONS, '', false, $tantpis); |
|
| 684 | + $c = $_COOKIE['spip_session']; |
|
| 685 | 685 | |
| 686 | - return $repertoire . intval($c) . '_' . md5($c . ' ' . $GLOBALS['meta'][$alea]) . '.php'; |
|
| 687 | - } |
|
| 686 | + return $repertoire . intval($c) . '_' . md5($c . ' ' . $GLOBALS['meta'][$alea]) . '.php'; |
|
| 687 | + } |
|
| 688 | 688 | } |
| 689 | 689 | |
| 690 | 690 | |
@@ -701,7 +701,7 @@ discard block |
||
| 701 | 701 | * @return string |
| 702 | 702 | */ |
| 703 | 703 | function rejouer_session() { |
| 704 | - return '<img src="' . generer_url_action('cookie', 'change_session=oui', true) . '" width="0" height="0" alt="" />'; |
|
| 704 | + return '<img src="' . generer_url_action('cookie', 'change_session=oui', true) . '" width="0" height="0" alt="" />'; |
|
| 705 | 705 | } |
| 706 | 706 | |
| 707 | 707 | |
@@ -711,12 +711,12 @@ discard block |
||
| 711 | 711 | * @return string |
| 712 | 712 | */ |
| 713 | 713 | function hash_env() { |
| 714 | - static $res = ''; |
|
| 715 | - if ($res) { |
|
| 716 | - return $res; |
|
| 717 | - } |
|
| 714 | + static $res = ''; |
|
| 715 | + if ($res) { |
|
| 716 | + return $res; |
|
| 717 | + } |
|
| 718 | 718 | |
| 719 | - return $res = md5($GLOBALS['ip'] . (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '')); |
|
| 719 | + return $res = md5($GLOBALS['ip'] . (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '')); |
|
| 720 | 720 | } |
| 721 | 721 | |
| 722 | 722 | |
@@ -728,11 +728,11 @@ discard block |
||
| 728 | 728 | * @return bool True si une session PHP est ouverte. |
| 729 | 729 | **/ |
| 730 | 730 | function spip_php_session_start() { |
| 731 | - if (!is_php_session_started()) { |
|
| 732 | - return session_start(); |
|
| 733 | - } |
|
| 731 | + if (!is_php_session_started()) { |
|
| 732 | + return session_start(); |
|
| 733 | + } |
|
| 734 | 734 | |
| 735 | - return true; |
|
| 735 | + return true; |
|
| 736 | 736 | } |
| 737 | 737 | |
| 738 | 738 | /** |
@@ -742,9 +742,9 @@ discard block |
||
| 742 | 742 | * @return bool true si une session PHP est active |
| 743 | 743 | **/ |
| 744 | 744 | function is_php_session_started() { |
| 745 | - if (php_sapi_name() !== 'cli') { |
|
| 746 | - return session_status() === PHP_SESSION_ACTIVE ? true : false; |
|
| 747 | - } |
|
| 745 | + if (php_sapi_name() !== 'cli') { |
|
| 746 | + return session_status() === PHP_SESSION_ACTIVE ? true : false; |
|
| 747 | + } |
|
| 748 | 748 | |
| 749 | - return false; |
|
| 749 | + return false; |
|
| 750 | 750 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | include_spip('inc/texte_mini'); |
@@ -34,7 +34,7 @@ discard block |
||
| 34 | 34 | * @return array Tablea ('','') |
| 35 | 35 | */ |
| 36 | 36 | function definir_raccourcis_alineas() { |
| 37 | - return ['', '']; |
|
| 37 | + return ['', '']; |
|
| 38 | 38 | } |
| 39 | 39 | |
| 40 | 40 | |
@@ -47,7 +47,7 @@ discard block |
||
| 47 | 47 | * @return string |
| 48 | 48 | */ |
| 49 | 49 | function traiter_tableau($bloc) { |
| 50 | - return $bloc; |
|
| 50 | + return $bloc; |
|
| 51 | 51 | } |
| 52 | 52 | |
| 53 | 53 | |
@@ -61,7 +61,7 @@ discard block |
||
| 61 | 61 | * @return string |
| 62 | 62 | */ |
| 63 | 63 | function traiter_listes($texte) { |
| 64 | - return $texte; |
|
| 64 | + return $texte; |
|
| 65 | 65 | } |
| 66 | 66 | |
| 67 | 67 | /** |
@@ -77,16 +77,16 @@ discard block |
||
| 77 | 77 | */ |
| 78 | 78 | function traiter_raccourcis($letexte) { |
| 79 | 79 | |
| 80 | - // Appeler les fonctions de pre_traitement |
|
| 81 | - $letexte = pipeline('pre_propre', $letexte); |
|
| 80 | + // Appeler les fonctions de pre_traitement |
|
| 81 | + $letexte = pipeline('pre_propre', $letexte); |
|
| 82 | 82 | |
| 83 | - // APPELER ICI UN PIPELINE traiter_raccourcis ? |
|
| 84 | - // $letexte = pipeline('traiter_raccourcis', $letexte); |
|
| 83 | + // APPELER ICI UN PIPELINE traiter_raccourcis ? |
|
| 84 | + // $letexte = pipeline('traiter_raccourcis', $letexte); |
|
| 85 | 85 | |
| 86 | - // Appeler les fonctions de post-traitement |
|
| 87 | - $letexte = pipeline('post_propre', $letexte); |
|
| 86 | + // Appeler les fonctions de post-traitement |
|
| 87 | + $letexte = pipeline('post_propre', $letexte); |
|
| 88 | 88 | |
| 89 | - return $letexte; |
|
| 89 | + return $letexte; |
|
| 90 | 90 | } |
| 91 | 91 | |
| 92 | 92 | /************************************************************************************************************************* |
@@ -102,22 +102,22 @@ discard block |
||
| 102 | 102 | * @return string |
| 103 | 103 | */ |
| 104 | 104 | function echappe_js($t, $class = ' class = "echappe-js"') { |
| 105 | - foreach (['script', 'iframe'] as $tag) { |
|
| 106 | - if ( |
|
| 107 | - stripos($t, "<$tag") !== false |
|
| 108 | - and preg_match_all(',<' . $tag . '.*?($|</' . $tag . '.),isS', $t, $r, PREG_SET_ORDER) |
|
| 109 | - ) { |
|
| 110 | - foreach ($r as $regs) { |
|
| 111 | - $t = str_replace( |
|
| 112 | - $regs[0], |
|
| 113 | - "<code$class>" . nl2br(spip_htmlspecialchars($regs[0])) . '</code>', |
|
| 114 | - $t |
|
| 115 | - ); |
|
| 116 | - } |
|
| 117 | - } |
|
| 118 | - } |
|
| 119 | - |
|
| 120 | - return $t; |
|
| 105 | + foreach (['script', 'iframe'] as $tag) { |
|
| 106 | + if ( |
|
| 107 | + stripos($t, "<$tag") !== false |
|
| 108 | + and preg_match_all(',<' . $tag . '.*?($|</' . $tag . '.),isS', $t, $r, PREG_SET_ORDER) |
|
| 109 | + ) { |
|
| 110 | + foreach ($r as $regs) { |
|
| 111 | + $t = str_replace( |
|
| 112 | + $regs[0], |
|
| 113 | + "<code$class>" . nl2br(spip_htmlspecialchars($regs[0])) . '</code>', |
|
| 114 | + $t |
|
| 115 | + ); |
|
| 116 | + } |
|
| 117 | + } |
|
| 118 | + } |
|
| 119 | + |
|
| 120 | + return $t; |
|
| 121 | 121 | } |
| 122 | 122 | |
| 123 | 123 | |
@@ -146,55 +146,55 @@ discard block |
||
| 146 | 146 | * Code protégé |
| 147 | 147 | **/ |
| 148 | 148 | function interdire_scripts($arg, $mode_filtre = null) { |
| 149 | - // on memorise le resultat sur les arguments non triviaux |
|
| 150 | - static $dejavu = []; |
|
| 151 | - |
|
| 152 | - // Attention, si ce n'est pas une chaine, laisser intact |
|
| 153 | - if (!$arg or !is_string($arg) or !strstr($arg, '<')) { |
|
| 154 | - return $arg; |
|
| 155 | - } |
|
| 156 | - |
|
| 157 | - if (is_null($mode_filtre) or !in_array($mode_filtre, [-1, 0, 1])) { |
|
| 158 | - $mode_filtre = $GLOBALS['filtrer_javascript']; |
|
| 159 | - } |
|
| 160 | - |
|
| 161 | - if (isset($dejavu[$mode_filtre][$arg])) { |
|
| 162 | - return $dejavu[$mode_filtre][$arg]; |
|
| 163 | - } |
|
| 164 | - |
|
| 165 | - // echapper les tags asp/php |
|
| 166 | - $t = str_replace('<' . '%', '<%', $arg); |
|
| 167 | - |
|
| 168 | - // echapper le php |
|
| 169 | - $t = str_replace('<' . '?', '<?', $t); |
|
| 170 | - |
|
| 171 | - // echapper le < script language=php > |
|
| 172 | - $t = preg_replace(',<(script\b[^>]+\blanguage\b[^\w>]+php\b),UimsS', '<\1', $t); |
|
| 173 | - |
|
| 174 | - // Pour le js, trois modes : parano (-1), prive (0), ok (1) |
|
| 175 | - switch ($mode_filtre) { |
|
| 176 | - case 0: |
|
| 177 | - if (!_DIR_RESTREINT) { |
|
| 178 | - $t = echappe_js($t); |
|
| 179 | - } |
|
| 180 | - break; |
|
| 181 | - case -1: |
|
| 182 | - $t = echappe_js($t); |
|
| 183 | - break; |
|
| 184 | - } |
|
| 185 | - |
|
| 186 | - // pas de <base href /> svp ! |
|
| 187 | - $t = preg_replace(',<(base\b),iS', '<\1', $t); |
|
| 188 | - |
|
| 189 | - // Reinserer les echappements des modeles |
|
| 190 | - if (defined('_PROTEGE_JS_MODELES')) { |
|
| 191 | - $t = echappe_retour($t, 'javascript' . _PROTEGE_JS_MODELES); |
|
| 192 | - } |
|
| 193 | - if (defined('_PROTEGE_PHP_MODELES')) { |
|
| 194 | - $t = echappe_retour($t, 'php' . _PROTEGE_PHP_MODELES); |
|
| 195 | - } |
|
| 196 | - |
|
| 197 | - return $dejavu[$mode_filtre][$arg] = $t; |
|
| 149 | + // on memorise le resultat sur les arguments non triviaux |
|
| 150 | + static $dejavu = []; |
|
| 151 | + |
|
| 152 | + // Attention, si ce n'est pas une chaine, laisser intact |
|
| 153 | + if (!$arg or !is_string($arg) or !strstr($arg, '<')) { |
|
| 154 | + return $arg; |
|
| 155 | + } |
|
| 156 | + |
|
| 157 | + if (is_null($mode_filtre) or !in_array($mode_filtre, [-1, 0, 1])) { |
|
| 158 | + $mode_filtre = $GLOBALS['filtrer_javascript']; |
|
| 159 | + } |
|
| 160 | + |
|
| 161 | + if (isset($dejavu[$mode_filtre][$arg])) { |
|
| 162 | + return $dejavu[$mode_filtre][$arg]; |
|
| 163 | + } |
|
| 164 | + |
|
| 165 | + // echapper les tags asp/php |
|
| 166 | + $t = str_replace('<' . '%', '<%', $arg); |
|
| 167 | + |
|
| 168 | + // echapper le php |
|
| 169 | + $t = str_replace('<' . '?', '<?', $t); |
|
| 170 | + |
|
| 171 | + // echapper le < script language=php > |
|
| 172 | + $t = preg_replace(',<(script\b[^>]+\blanguage\b[^\w>]+php\b),UimsS', '<\1', $t); |
|
| 173 | + |
|
| 174 | + // Pour le js, trois modes : parano (-1), prive (0), ok (1) |
|
| 175 | + switch ($mode_filtre) { |
|
| 176 | + case 0: |
|
| 177 | + if (!_DIR_RESTREINT) { |
|
| 178 | + $t = echappe_js($t); |
|
| 179 | + } |
|
| 180 | + break; |
|
| 181 | + case -1: |
|
| 182 | + $t = echappe_js($t); |
|
| 183 | + break; |
|
| 184 | + } |
|
| 185 | + |
|
| 186 | + // pas de <base href /> svp ! |
|
| 187 | + $t = preg_replace(',<(base\b),iS', '<\1', $t); |
|
| 188 | + |
|
| 189 | + // Reinserer les echappements des modeles |
|
| 190 | + if (defined('_PROTEGE_JS_MODELES')) { |
|
| 191 | + $t = echappe_retour($t, 'javascript' . _PROTEGE_JS_MODELES); |
|
| 192 | + } |
|
| 193 | + if (defined('_PROTEGE_PHP_MODELES')) { |
|
| 194 | + $t = echappe_retour($t, 'php' . _PROTEGE_PHP_MODELES); |
|
| 195 | + } |
|
| 196 | + |
|
| 197 | + return $dejavu[$mode_filtre][$arg] = $t; |
|
| 198 | 198 | } |
| 199 | 199 | |
| 200 | 200 | |
@@ -223,66 +223,66 @@ discard block |
||
| 223 | 223 | * Texte transformé |
| 224 | 224 | **/ |
| 225 | 225 | function typo($letexte, $echapper = true, $connect = null, $env = []) { |
| 226 | - // Plus vite ! |
|
| 227 | - if (!$letexte) { |
|
| 228 | - return $letexte; |
|
| 229 | - } |
|
| 230 | - |
|
| 231 | - // les appels directs a cette fonction depuis le php de l'espace |
|
| 232 | - // prive etant historiquement ecrit sans argment $connect |
|
| 233 | - // on utilise la presence de celui-ci pour distinguer les cas |
|
| 234 | - // ou il faut passer interdire_script explicitement |
|
| 235 | - // les appels dans les squelettes (de l'espace prive) fournissant un $connect |
|
| 236 | - // ne seront pas perturbes |
|
| 237 | - $interdire_script = false; |
|
| 238 | - if (is_null($connect)) { |
|
| 239 | - $connect = ''; |
|
| 240 | - $interdire_script = true; |
|
| 241 | - $env['espace_prive'] = test_espace_prive(); |
|
| 242 | - } |
|
| 243 | - |
|
| 244 | - // Echapper les codes <html> etc |
|
| 245 | - if ($echapper) { |
|
| 246 | - $letexte = echappe_html($letexte, 'TYPO'); |
|
| 247 | - } |
|
| 248 | - |
|
| 249 | - // |
|
| 250 | - // Installer les modeles, notamment images et documents ; |
|
| 251 | - // |
|
| 252 | - // NOTE : propre() ne passe pas par ici mais directement par corriger_typo |
|
| 253 | - // cf. inc/lien |
|
| 254 | - |
|
| 255 | - $letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO' : '', $connect, null, $env); |
|
| 256 | - if ($letexte != $mem) { |
|
| 257 | - $echapper = true; |
|
| 258 | - } |
|
| 259 | - unset($mem); |
|
| 260 | - |
|
| 261 | - $letexte = corriger_typo($letexte); |
|
| 262 | - $letexte = echapper_faux_tags($letexte); |
|
| 263 | - |
|
| 264 | - // reintegrer les echappements |
|
| 265 | - if ($echapper) { |
|
| 266 | - $letexte = echappe_retour($letexte, 'TYPO'); |
|
| 267 | - } |
|
| 268 | - |
|
| 269 | - // Dans les appels directs hors squelette, securiser ici aussi |
|
| 270 | - if ($interdire_script) { |
|
| 271 | - $letexte = interdire_scripts($letexte); |
|
| 272 | - } |
|
| 273 | - |
|
| 274 | - // Dans l'espace prive on se mefie de tout contenu dangereux |
|
| 275 | - // https://core.spip.net/issues/3371 |
|
| 276 | - // et aussi dans l'espace public si la globale filtrer_javascript = -1 |
|
| 277 | - // https://core.spip.net/issues/4166 |
|
| 278 | - if ( |
|
| 279 | - $GLOBALS['filtrer_javascript'] == -1 |
|
| 280 | - or (isset($env['espace_prive']) and $env['espace_prive'] and $GLOBALS['filtrer_javascript'] <= 0) |
|
| 281 | - ) { |
|
| 282 | - $letexte = echapper_html_suspect($letexte); |
|
| 283 | - } |
|
| 284 | - |
|
| 285 | - return $letexte; |
|
| 226 | + // Plus vite ! |
|
| 227 | + if (!$letexte) { |
|
| 228 | + return $letexte; |
|
| 229 | + } |
|
| 230 | + |
|
| 231 | + // les appels directs a cette fonction depuis le php de l'espace |
|
| 232 | + // prive etant historiquement ecrit sans argment $connect |
|
| 233 | + // on utilise la presence de celui-ci pour distinguer les cas |
|
| 234 | + // ou il faut passer interdire_script explicitement |
|
| 235 | + // les appels dans les squelettes (de l'espace prive) fournissant un $connect |
|
| 236 | + // ne seront pas perturbes |
|
| 237 | + $interdire_script = false; |
|
| 238 | + if (is_null($connect)) { |
|
| 239 | + $connect = ''; |
|
| 240 | + $interdire_script = true; |
|
| 241 | + $env['espace_prive'] = test_espace_prive(); |
|
| 242 | + } |
|
| 243 | + |
|
| 244 | + // Echapper les codes <html> etc |
|
| 245 | + if ($echapper) { |
|
| 246 | + $letexte = echappe_html($letexte, 'TYPO'); |
|
| 247 | + } |
|
| 248 | + |
|
| 249 | + // |
|
| 250 | + // Installer les modeles, notamment images et documents ; |
|
| 251 | + // |
|
| 252 | + // NOTE : propre() ne passe pas par ici mais directement par corriger_typo |
|
| 253 | + // cf. inc/lien |
|
| 254 | + |
|
| 255 | + $letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO' : '', $connect, null, $env); |
|
| 256 | + if ($letexte != $mem) { |
|
| 257 | + $echapper = true; |
|
| 258 | + } |
|
| 259 | + unset($mem); |
|
| 260 | + |
|
| 261 | + $letexte = corriger_typo($letexte); |
|
| 262 | + $letexte = echapper_faux_tags($letexte); |
|
| 263 | + |
|
| 264 | + // reintegrer les echappements |
|
| 265 | + if ($echapper) { |
|
| 266 | + $letexte = echappe_retour($letexte, 'TYPO'); |
|
| 267 | + } |
|
| 268 | + |
|
| 269 | + // Dans les appels directs hors squelette, securiser ici aussi |
|
| 270 | + if ($interdire_script) { |
|
| 271 | + $letexte = interdire_scripts($letexte); |
|
| 272 | + } |
|
| 273 | + |
|
| 274 | + // Dans l'espace prive on se mefie de tout contenu dangereux |
|
| 275 | + // https://core.spip.net/issues/3371 |
|
| 276 | + // et aussi dans l'espace public si la globale filtrer_javascript = -1 |
|
| 277 | + // https://core.spip.net/issues/4166 |
|
| 278 | + if ( |
|
| 279 | + $GLOBALS['filtrer_javascript'] == -1 |
|
| 280 | + or (isset($env['espace_prive']) and $env['espace_prive'] and $GLOBALS['filtrer_javascript'] <= 0) |
|
| 281 | + ) { |
|
| 282 | + $letexte = echapper_html_suspect($letexte); |
|
| 283 | + } |
|
| 284 | + |
|
| 285 | + return $letexte; |
|
| 286 | 286 | } |
| 287 | 287 | |
| 288 | 288 | // Correcteur typographique |
@@ -307,57 +307,57 @@ discard block |
||
| 307 | 307 | */ |
| 308 | 308 | function corriger_typo($letexte, $lang = '') { |
| 309 | 309 | |
| 310 | - // Plus vite ! |
|
| 311 | - if (!$letexte) { |
|
| 312 | - return $letexte; |
|
| 313 | - } |
|
| 314 | - |
|
| 315 | - $letexte = pipeline('pre_typo', $letexte); |
|
| 316 | - |
|
| 317 | - // Caracteres de controle "illegaux" |
|
| 318 | - $letexte = corriger_caracteres($letexte); |
|
| 319 | - |
|
| 320 | - // Proteger les caracteres typographiques a l'interieur des tags html |
|
| 321 | - if (preg_match_all(_TYPO_BALISE, $letexte, $regs, PREG_SET_ORDER)) { |
|
| 322 | - foreach ($regs as $reg) { |
|
| 323 | - $insert = $reg[0]; |
|
| 324 | - // hack: on transforme les caracteres a proteger en les remplacant |
|
| 325 | - // par des caracteres "illegaux". (cf corriger_caracteres()) |
|
| 326 | - $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR); |
|
| 327 | - $letexte = str_replace($reg[0], $insert, $letexte); |
|
| 328 | - } |
|
| 329 | - } |
|
| 330 | - |
|
| 331 | - // trouver les blocs idiomes et les traiter à part |
|
| 332 | - $letexte = extraire_idiome($ei = $letexte, $lang, true); |
|
| 333 | - $ei = ($ei !== $letexte); |
|
| 334 | - |
|
| 335 | - // trouver les blocs multi et les traiter a part |
|
| 336 | - $letexte = extraire_multi($em = $letexte, $lang, true); |
|
| 337 | - $em = ($em !== $letexte); |
|
| 338 | - |
|
| 339 | - // Charger & appliquer les fonctions de typographie |
|
| 340 | - $typographie = charger_fonction(lang_typo($lang), 'typographie'); |
|
| 341 | - $letexte = $typographie($letexte); |
|
| 342 | - |
|
| 343 | - // Les citations en une autre langue, s'il y a lieu |
|
| 344 | - if ($em) { |
|
| 345 | - $letexte = echappe_retour($letexte, 'multi'); |
|
| 346 | - } |
|
| 347 | - if ($ei) { |
|
| 348 | - $letexte = echappe_retour($letexte, 'idiome'); |
|
| 349 | - } |
|
| 350 | - |
|
| 351 | - // Retablir les caracteres proteges |
|
| 352 | - $letexte = strtr($letexte, _TYPO_PROTECTEUR, _TYPO_PROTEGER); |
|
| 353 | - |
|
| 354 | - // pipeline |
|
| 355 | - $letexte = pipeline('post_typo', $letexte); |
|
| 356 | - |
|
| 357 | - # un message pour abs_url - on est passe en mode texte |
|
| 358 | - $GLOBALS['mode_abs_url'] = 'texte'; |
|
| 359 | - |
|
| 360 | - return $letexte; |
|
| 310 | + // Plus vite ! |
|
| 311 | + if (!$letexte) { |
|
| 312 | + return $letexte; |
|
| 313 | + } |
|
| 314 | + |
|
| 315 | + $letexte = pipeline('pre_typo', $letexte); |
|
| 316 | + |
|
| 317 | + // Caracteres de controle "illegaux" |
|
| 318 | + $letexte = corriger_caracteres($letexte); |
|
| 319 | + |
|
| 320 | + // Proteger les caracteres typographiques a l'interieur des tags html |
|
| 321 | + if (preg_match_all(_TYPO_BALISE, $letexte, $regs, PREG_SET_ORDER)) { |
|
| 322 | + foreach ($regs as $reg) { |
|
| 323 | + $insert = $reg[0]; |
|
| 324 | + // hack: on transforme les caracteres a proteger en les remplacant |
|
| 325 | + // par des caracteres "illegaux". (cf corriger_caracteres()) |
|
| 326 | + $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR); |
|
| 327 | + $letexte = str_replace($reg[0], $insert, $letexte); |
|
| 328 | + } |
|
| 329 | + } |
|
| 330 | + |
|
| 331 | + // trouver les blocs idiomes et les traiter à part |
|
| 332 | + $letexte = extraire_idiome($ei = $letexte, $lang, true); |
|
| 333 | + $ei = ($ei !== $letexte); |
|
| 334 | + |
|
| 335 | + // trouver les blocs multi et les traiter a part |
|
| 336 | + $letexte = extraire_multi($em = $letexte, $lang, true); |
|
| 337 | + $em = ($em !== $letexte); |
|
| 338 | + |
|
| 339 | + // Charger & appliquer les fonctions de typographie |
|
| 340 | + $typographie = charger_fonction(lang_typo($lang), 'typographie'); |
|
| 341 | + $letexte = $typographie($letexte); |
|
| 342 | + |
|
| 343 | + // Les citations en une autre langue, s'il y a lieu |
|
| 344 | + if ($em) { |
|
| 345 | + $letexte = echappe_retour($letexte, 'multi'); |
|
| 346 | + } |
|
| 347 | + if ($ei) { |
|
| 348 | + $letexte = echappe_retour($letexte, 'idiome'); |
|
| 349 | + } |
|
| 350 | + |
|
| 351 | + // Retablir les caracteres proteges |
|
| 352 | + $letexte = strtr($letexte, _TYPO_PROTECTEUR, _TYPO_PROTEGER); |
|
| 353 | + |
|
| 354 | + // pipeline |
|
| 355 | + $letexte = pipeline('post_typo', $letexte); |
|
| 356 | + |
|
| 357 | + # un message pour abs_url - on est passe en mode texte |
|
| 358 | + $GLOBALS['mode_abs_url'] = 'texte'; |
|
| 359 | + |
|
| 360 | + return $letexte; |
|
| 361 | 361 | } |
| 362 | 362 | |
| 363 | 363 | |
@@ -373,7 +373,7 @@ discard block |
||
| 373 | 373 | * @return string |
| 374 | 374 | */ |
| 375 | 375 | function paragrapher($letexte, $forcer = true) { |
| 376 | - return $letexte; |
|
| 376 | + return $letexte; |
|
| 377 | 377 | } |
| 378 | 378 | |
| 379 | 379 | /** |
@@ -385,11 +385,11 @@ discard block |
||
| 385 | 385 | * @return string Texte |
| 386 | 386 | **/ |
| 387 | 387 | function traiter_retours_chariots($letexte) { |
| 388 | - $letexte = preg_replace(",\r\n?,S", "\n", $letexte); |
|
| 389 | - $letexte = preg_replace(',<p[>[:space:]],iS', "\n\n\\0", $letexte); |
|
| 390 | - $letexte = preg_replace(',</p[>[:space:]],iS', "\\0\n\n", $letexte); |
|
| 388 | + $letexte = preg_replace(",\r\n?,S", "\n", $letexte); |
|
| 389 | + $letexte = preg_replace(',<p[>[:space:]],iS', "\n\n\\0", $letexte); |
|
| 390 | + $letexte = preg_replace(',</p[>[:space:]],iS', "\\0\n\n", $letexte); |
|
| 391 | 391 | |
| 392 | - return $letexte; |
|
| 392 | + return $letexte; |
|
| 393 | 393 | } |
| 394 | 394 | |
| 395 | 395 | |
@@ -415,39 +415,39 @@ discard block |
||
| 415 | 415 | * Texte transformé |
| 416 | 416 | **/ |
| 417 | 417 | function propre($t, $connect = null, $env = []) { |
| 418 | - // les appels directs a cette fonction depuis le php de l'espace |
|
| 419 | - // prive etant historiquement ecrits sans argment $connect |
|
| 420 | - // on utilise la presence de celui-ci pour distinguer les cas |
|
| 421 | - // ou il faut passer interdire_script explicitement |
|
| 422 | - // les appels dans les squelettes (de l'espace prive) fournissant un $connect |
|
| 423 | - // ne seront pas perturbes |
|
| 424 | - $interdire_script = false; |
|
| 425 | - if (is_null($connect)) { |
|
| 426 | - $connect = ''; |
|
| 427 | - $interdire_script = true; |
|
| 428 | - } |
|
| 429 | - |
|
| 430 | - if (!$t) { |
|
| 431 | - return strval($t); |
|
| 432 | - } |
|
| 433 | - |
|
| 434 | - // Dans l'espace prive on se mefie de tout contenu dangereux |
|
| 435 | - // avant echappement des balises <html> |
|
| 436 | - // https://core.spip.net/issues/3371 |
|
| 437 | - // et aussi dans l'espace public si la globale filtrer_javascript = -1 |
|
| 438 | - // https://core.spip.net/issues/4166 |
|
| 439 | - if ( |
|
| 440 | - $interdire_script |
|
| 441 | - or $GLOBALS['filtrer_javascript'] == -1 |
|
| 442 | - or (isset($env['espace_prive']) and $env['espace_prive'] and $GLOBALS['filtrer_javascript'] <= 0) |
|
| 443 | - or (isset($env['wysiwyg']) and $env['wysiwyg'] and $GLOBALS['filtrer_javascript'] <= 0) |
|
| 444 | - ) { |
|
| 445 | - $t = echapper_html_suspect($t, false); |
|
| 446 | - } |
|
| 447 | - $t = echappe_html($t); |
|
| 448 | - $t = expanser_liens($t, $connect, $env); |
|
| 449 | - $t = traiter_raccourcis($t); |
|
| 450 | - $t = echappe_retour_modeles($t, $interdire_script); |
|
| 451 | - |
|
| 452 | - return $t; |
|
| 418 | + // les appels directs a cette fonction depuis le php de l'espace |
|
| 419 | + // prive etant historiquement ecrits sans argment $connect |
|
| 420 | + // on utilise la presence de celui-ci pour distinguer les cas |
|
| 421 | + // ou il faut passer interdire_script explicitement |
|
| 422 | + // les appels dans les squelettes (de l'espace prive) fournissant un $connect |
|
| 423 | + // ne seront pas perturbes |
|
| 424 | + $interdire_script = false; |
|
| 425 | + if (is_null($connect)) { |
|
| 426 | + $connect = ''; |
|
| 427 | + $interdire_script = true; |
|
| 428 | + } |
|
| 429 | + |
|
| 430 | + if (!$t) { |
|
| 431 | + return strval($t); |
|
| 432 | + } |
|
| 433 | + |
|
| 434 | + // Dans l'espace prive on se mefie de tout contenu dangereux |
|
| 435 | + // avant echappement des balises <html> |
|
| 436 | + // https://core.spip.net/issues/3371 |
|
| 437 | + // et aussi dans l'espace public si la globale filtrer_javascript = -1 |
|
| 438 | + // https://core.spip.net/issues/4166 |
|
| 439 | + if ( |
|
| 440 | + $interdire_script |
|
| 441 | + or $GLOBALS['filtrer_javascript'] == -1 |
|
| 442 | + or (isset($env['espace_prive']) and $env['espace_prive'] and $GLOBALS['filtrer_javascript'] <= 0) |
|
| 443 | + or (isset($env['wysiwyg']) and $env['wysiwyg'] and $GLOBALS['filtrer_javascript'] <= 0) |
|
| 444 | + ) { |
|
| 445 | + $t = echapper_html_suspect($t, false); |
|
| 446 | + } |
|
| 447 | + $t = echappe_html($t); |
|
| 448 | + $t = expanser_liens($t, $connect, $env); |
|
| 449 | + $t = traiter_raccourcis($t); |
|
| 450 | + $t = echappe_retour_modeles($t, $interdire_script); |
|
| 451 | + |
|
| 452 | + return $t; |
|
| 453 | 453 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | |
@@ -47,24 +47,24 @@ discard block |
||
| 47 | 47 | * - false si l'arbre xml ne peut être créé ou est vide |
| 48 | 48 | **/ |
| 49 | 49 | function spip_xml_load($fichier, $strict = true, $clean = true, $taille_max = 1048576, $datas = '', $profondeur = -1) { |
| 50 | - $contenu = ''; |
|
| 51 | - if (tester_url_absolue($fichier)) { |
|
| 52 | - include_spip('inc/distant'); |
|
| 53 | - $contenu = recuperer_url($fichier, ['taille_max' => $taille_max, 'datas' => $datas]); |
|
| 54 | - $contenu = $contenu['page'] ?? ''; |
|
| 55 | - } else { |
|
| 56 | - lire_fichier($fichier, $contenu); |
|
| 57 | - } |
|
| 58 | - $arbre = []; |
|
| 59 | - if ($contenu) { |
|
| 60 | - $arbre = spip_xml_parse($contenu, $strict, $clean, $profondeur); |
|
| 61 | - } |
|
| 50 | + $contenu = ''; |
|
| 51 | + if (tester_url_absolue($fichier)) { |
|
| 52 | + include_spip('inc/distant'); |
|
| 53 | + $contenu = recuperer_url($fichier, ['taille_max' => $taille_max, 'datas' => $datas]); |
|
| 54 | + $contenu = $contenu['page'] ?? ''; |
|
| 55 | + } else { |
|
| 56 | + lire_fichier($fichier, $contenu); |
|
| 57 | + } |
|
| 58 | + $arbre = []; |
|
| 59 | + if ($contenu) { |
|
| 60 | + $arbre = spip_xml_parse($contenu, $strict, $clean, $profondeur); |
|
| 61 | + } |
|
| 62 | 62 | |
| 63 | - return count($arbre) ? $arbre : false; |
|
| 63 | + return count($arbre) ? $arbre : false; |
|
| 64 | 64 | } |
| 65 | 65 | |
| 66 | 66 | if (!defined('_SPIP_XML_TAG_SPLIT')) { |
| 67 | - define('_SPIP_XML_TAG_SPLIT', '{<([^:>][^>]*?)>}sS'); |
|
| 67 | + define('_SPIP_XML_TAG_SPLIT', '{<([^:>][^>]*?)>}sS'); |
|
| 68 | 68 | } |
| 69 | 69 | |
| 70 | 70 | /** |
@@ -83,153 +83,153 @@ discard block |
||
| 83 | 83 | * - false si l'arbre xml ne peut être créé ou est vide |
| 84 | 84 | **/ |
| 85 | 85 | function spip_xml_parse(&$texte, $strict = true, $clean = true, $profondeur = -1) { |
| 86 | - $out = []; |
|
| 87 | - // enlever les commentaires |
|
| 88 | - $charset = 'AUTO'; |
|
| 89 | - if ($clean === true) { |
|
| 90 | - if (preg_match(",<\?xml\s(.*?)encoding=['\"]?(.*?)['\"]?(\s(.*))?\?>,im", $texte, $regs)) { |
|
| 91 | - $charset = $regs[2]; |
|
| 92 | - } |
|
| 93 | - $texte = preg_replace(',<!--(.*?)-->,is', '', $texte); |
|
| 94 | - $texte = preg_replace(',<\?(.*?)\?>,is', '', $texte); |
|
| 95 | - include_spip('inc/charsets'); |
|
| 96 | - $clean = $charset; |
|
| 97 | - //$texte = importer_charset($texte,$charset); |
|
| 98 | - } |
|
| 99 | - if (is_string($clean)) { |
|
| 100 | - $charset = $clean; |
|
| 101 | - } |
|
| 102 | - $txt = $texte; |
|
| 86 | + $out = []; |
|
| 87 | + // enlever les commentaires |
|
| 88 | + $charset = 'AUTO'; |
|
| 89 | + if ($clean === true) { |
|
| 90 | + if (preg_match(",<\?xml\s(.*?)encoding=['\"]?(.*?)['\"]?(\s(.*))?\?>,im", $texte, $regs)) { |
|
| 91 | + $charset = $regs[2]; |
|
| 92 | + } |
|
| 93 | + $texte = preg_replace(',<!--(.*?)-->,is', '', $texte); |
|
| 94 | + $texte = preg_replace(',<\?(.*?)\?>,is', '', $texte); |
|
| 95 | + include_spip('inc/charsets'); |
|
| 96 | + $clean = $charset; |
|
| 97 | + //$texte = importer_charset($texte,$charset); |
|
| 98 | + } |
|
| 99 | + if (is_string($clean)) { |
|
| 100 | + $charset = $clean; |
|
| 101 | + } |
|
| 102 | + $txt = $texte; |
|
| 103 | 103 | |
| 104 | - // tant qu'il y a des tags |
|
| 105 | - $chars = preg_split(_SPIP_XML_TAG_SPLIT, $txt, 2, PREG_SPLIT_DELIM_CAPTURE); |
|
| 106 | - while (count($chars) >= 2) { |
|
| 107 | - // tag ouvrant |
|
| 108 | - //$chars = preg_split("{<([^>]*?)>}s",$txt,2,PREG_SPLIT_DELIM_CAPTURE); |
|
| 104 | + // tant qu'il y a des tags |
|
| 105 | + $chars = preg_split(_SPIP_XML_TAG_SPLIT, $txt, 2, PREG_SPLIT_DELIM_CAPTURE); |
|
| 106 | + while (count($chars) >= 2) { |
|
| 107 | + // tag ouvrant |
|
| 108 | + //$chars = preg_split("{<([^>]*?)>}s",$txt,2,PREG_SPLIT_DELIM_CAPTURE); |
|
| 109 | 109 | |
| 110 | - // $before doit etre vide ou des espaces uniquements! |
|
| 111 | - $before = trim($chars[0]); |
|
| 110 | + // $before doit etre vide ou des espaces uniquements! |
|
| 111 | + $before = trim($chars[0]); |
|
| 112 | 112 | |
| 113 | - if (strlen($before) > 0) { |
|
| 114 | - return importer_charset($texte, $charset); |
|
| 115 | - }//$texte; // before non vide, donc on est dans du texte |
|
| 113 | + if (strlen($before) > 0) { |
|
| 114 | + return importer_charset($texte, $charset); |
|
| 115 | + }//$texte; // before non vide, donc on est dans du texte |
|
| 116 | 116 | |
| 117 | - $tag = rtrim($chars[1]); |
|
| 118 | - $txt = $chars[2]; |
|
| 117 | + $tag = rtrim($chars[1]); |
|
| 118 | + $txt = $chars[2]; |
|
| 119 | 119 | |
| 120 | - if (strncmp($tag, '![CDATA[', 8) == 0) { |
|
| 121 | - return importer_charset($texte, $charset); |
|
| 122 | - }//$texte; |
|
| 123 | - if (substr($tag, -1) == '/') { // self closing tag |
|
| 124 | - $tag = rtrim(substr($tag, 0, strlen($tag) - 1)); |
|
| 125 | - $out[$tag][] = ''; |
|
| 126 | - } else { |
|
| 127 | - $closing_tag = preg_split(",\s|\t|\n|\r,", trim($tag)); |
|
| 128 | - $closing_tag = reset($closing_tag); |
|
| 129 | - // tag fermant |
|
| 130 | - $ncclos = strlen("</$closing_tag>"); |
|
| 131 | - $p = strpos($txt, "</$closing_tag>"); |
|
| 132 | - if ($p !== false and (strpos($txt, '<') < $p)) { |
|
| 133 | - $nclose = 0; |
|
| 134 | - $nopen = 0; |
|
| 135 | - $d = 0; |
|
| 136 | - while ( |
|
| 137 | - $p !== false |
|
| 138 | - and ($morceau = substr($txt, $d, $p - $d)) |
|
| 139 | - and (($nopen += preg_match_all( |
|
| 140 | - '{<' . preg_quote($closing_tag) . '(\s*>|\s[^>]*[^/>]>)}is', |
|
| 141 | - $morceau, |
|
| 142 | - $matches, |
|
| 143 | - PREG_SET_ORDER |
|
| 144 | - )) > $nclose) |
|
| 145 | - ) { |
|
| 146 | - $nclose++; |
|
| 147 | - $d = $p + $ncclos; |
|
| 148 | - $p = strpos($txt, "</$closing_tag>", $d); |
|
| 149 | - } |
|
| 150 | - } |
|
| 151 | - if ($p === false) { |
|
| 152 | - if ($strict) { |
|
| 153 | - $out[$tag][] = "erreur : tag fermant $tag manquant::$txt"; |
|
| 120 | + if (strncmp($tag, '![CDATA[', 8) == 0) { |
|
| 121 | + return importer_charset($texte, $charset); |
|
| 122 | + }//$texte; |
|
| 123 | + if (substr($tag, -1) == '/') { // self closing tag |
|
| 124 | + $tag = rtrim(substr($tag, 0, strlen($tag) - 1)); |
|
| 125 | + $out[$tag][] = ''; |
|
| 126 | + } else { |
|
| 127 | + $closing_tag = preg_split(",\s|\t|\n|\r,", trim($tag)); |
|
| 128 | + $closing_tag = reset($closing_tag); |
|
| 129 | + // tag fermant |
|
| 130 | + $ncclos = strlen("</$closing_tag>"); |
|
| 131 | + $p = strpos($txt, "</$closing_tag>"); |
|
| 132 | + if ($p !== false and (strpos($txt, '<') < $p)) { |
|
| 133 | + $nclose = 0; |
|
| 134 | + $nopen = 0; |
|
| 135 | + $d = 0; |
|
| 136 | + while ( |
|
| 137 | + $p !== false |
|
| 138 | + and ($morceau = substr($txt, $d, $p - $d)) |
|
| 139 | + and (($nopen += preg_match_all( |
|
| 140 | + '{<' . preg_quote($closing_tag) . '(\s*>|\s[^>]*[^/>]>)}is', |
|
| 141 | + $morceau, |
|
| 142 | + $matches, |
|
| 143 | + PREG_SET_ORDER |
|
| 144 | + )) > $nclose) |
|
| 145 | + ) { |
|
| 146 | + $nclose++; |
|
| 147 | + $d = $p + $ncclos; |
|
| 148 | + $p = strpos($txt, "</$closing_tag>", $d); |
|
| 149 | + } |
|
| 150 | + } |
|
| 151 | + if ($p === false) { |
|
| 152 | + if ($strict) { |
|
| 153 | + $out[$tag][] = "erreur : tag fermant $tag manquant::$txt"; |
|
| 154 | 154 | |
| 155 | - return $out; |
|
| 156 | - } else { |
|
| 157 | - return importer_charset($texte, $charset); |
|
| 158 | - }//$texte // un tag qui constitue du texte a reporter dans $before |
|
| 159 | - } |
|
| 160 | - $content = substr($txt, 0, $p); |
|
| 161 | - $txt = substr($txt, $p + $ncclos); |
|
| 162 | - if ($profondeur == 0 or strpos($content, '<') === false) { // eviter une recursion si pas utile |
|
| 163 | - $out[$tag][] = importer_charset($content, $charset); |
|
| 164 | - }//$content; |
|
| 165 | - else { |
|
| 166 | - $out[$tag][] = spip_xml_parse($content, $strict, $clean, $profondeur - 1); |
|
| 167 | - } |
|
| 168 | - } |
|
| 169 | - $chars = preg_split(_SPIP_XML_TAG_SPLIT, $txt, 2, PREG_SPLIT_DELIM_CAPTURE); |
|
| 170 | - } |
|
| 171 | - if (count($out) && (strlen(trim($txt)) == 0)) { |
|
| 172 | - return $out; |
|
| 173 | - } else { |
|
| 174 | - return importer_charset($texte, $charset); |
|
| 175 | - }//$texte; |
|
| 155 | + return $out; |
|
| 156 | + } else { |
|
| 157 | + return importer_charset($texte, $charset); |
|
| 158 | + }//$texte // un tag qui constitue du texte a reporter dans $before |
|
| 159 | + } |
|
| 160 | + $content = substr($txt, 0, $p); |
|
| 161 | + $txt = substr($txt, $p + $ncclos); |
|
| 162 | + if ($profondeur == 0 or strpos($content, '<') === false) { // eviter une recursion si pas utile |
|
| 163 | + $out[$tag][] = importer_charset($content, $charset); |
|
| 164 | + }//$content; |
|
| 165 | + else { |
|
| 166 | + $out[$tag][] = spip_xml_parse($content, $strict, $clean, $profondeur - 1); |
|
| 167 | + } |
|
| 168 | + } |
|
| 169 | + $chars = preg_split(_SPIP_XML_TAG_SPLIT, $txt, 2, PREG_SPLIT_DELIM_CAPTURE); |
|
| 170 | + } |
|
| 171 | + if (count($out) && (strlen(trim($txt)) == 0)) { |
|
| 172 | + return $out; |
|
| 173 | + } else { |
|
| 174 | + return importer_charset($texte, $charset); |
|
| 175 | + }//$texte; |
|
| 176 | 176 | } |
| 177 | 177 | |
| 178 | 178 | // https://code.spip.net/@spip_xml_aplatit |
| 179 | 179 | function spip_xml_aplatit($arbre, $separateur = ' ') { |
| 180 | - $s = ''; |
|
| 181 | - if (is_array($arbre)) { |
|
| 182 | - foreach ($arbre as $tag => $feuille) { |
|
| 183 | - if (is_array($feuille)) { |
|
| 184 | - if ($tag !== intval($tag)) { |
|
| 185 | - $f = spip_xml_aplatit($feuille, $separateur); |
|
| 186 | - if (strlen($f)) { |
|
| 187 | - $tagf = explode(' ', $tag); |
|
| 188 | - $tagf = $tagf[0]; |
|
| 189 | - $s .= "<$tag>$f</$tagf>"; |
|
| 190 | - } else { |
|
| 191 | - $s .= "<$tag />"; |
|
| 192 | - } |
|
| 193 | - } else { |
|
| 194 | - $s .= spip_xml_aplatit($feuille); |
|
| 195 | - } |
|
| 196 | - $s .= $separateur; |
|
| 197 | - } else { |
|
| 198 | - $s .= "$feuille$separateur"; |
|
| 199 | - } |
|
| 200 | - } |
|
| 201 | - } |
|
| 180 | + $s = ''; |
|
| 181 | + if (is_array($arbre)) { |
|
| 182 | + foreach ($arbre as $tag => $feuille) { |
|
| 183 | + if (is_array($feuille)) { |
|
| 184 | + if ($tag !== intval($tag)) { |
|
| 185 | + $f = spip_xml_aplatit($feuille, $separateur); |
|
| 186 | + if (strlen($f)) { |
|
| 187 | + $tagf = explode(' ', $tag); |
|
| 188 | + $tagf = $tagf[0]; |
|
| 189 | + $s .= "<$tag>$f</$tagf>"; |
|
| 190 | + } else { |
|
| 191 | + $s .= "<$tag />"; |
|
| 192 | + } |
|
| 193 | + } else { |
|
| 194 | + $s .= spip_xml_aplatit($feuille); |
|
| 195 | + } |
|
| 196 | + $s .= $separateur; |
|
| 197 | + } else { |
|
| 198 | + $s .= "$feuille$separateur"; |
|
| 199 | + } |
|
| 200 | + } |
|
| 201 | + } |
|
| 202 | 202 | |
| 203 | - return strlen($separateur) ? substr($s, 0, -strlen($separateur)) : $s; |
|
| 203 | + return strlen($separateur) ? substr($s, 0, -strlen($separateur)) : $s; |
|
| 204 | 204 | } |
| 205 | 205 | |
| 206 | 206 | // https://code.spip.net/@spip_xml_tagname |
| 207 | 207 | function spip_xml_tagname($tag) { |
| 208 | - if (preg_match(',^([a-z][\w:]*),i', $tag, $reg)) { |
|
| 209 | - return $reg[1]; |
|
| 210 | - } |
|
| 208 | + if (preg_match(',^([a-z][\w:]*),i', $tag, $reg)) { |
|
| 209 | + return $reg[1]; |
|
| 210 | + } |
|
| 211 | 211 | |
| 212 | - return ''; |
|
| 212 | + return ''; |
|
| 213 | 213 | } |
| 214 | 214 | |
| 215 | 215 | // https://code.spip.net/@spip_xml_decompose_tag |
| 216 | 216 | function spip_xml_decompose_tag($tag) { |
| 217 | - $tagname = spip_xml_tagname($tag); |
|
| 218 | - $liste = []; |
|
| 219 | - $tag = ltrim(strpbrk($tag, " \n\t")); |
|
| 220 | - $p = strpos($tag, '='); |
|
| 221 | - while ($p !== false) { |
|
| 222 | - $attr = trim(substr($tag, 0, $p)); |
|
| 223 | - $tag = ltrim(substr($tag, $p + 1)); |
|
| 224 | - $quote = $tag[0]; |
|
| 225 | - $p = strpos($tag, $quote, 1); |
|
| 226 | - $cont = substr($tag, 1, $p - 1); |
|
| 227 | - $liste[$attr] = $cont; |
|
| 228 | - $tag = substr($tag, $p + 1); |
|
| 229 | - $p = strpos($tag, '='); |
|
| 230 | - } |
|
| 217 | + $tagname = spip_xml_tagname($tag); |
|
| 218 | + $liste = []; |
|
| 219 | + $tag = ltrim(strpbrk($tag, " \n\t")); |
|
| 220 | + $p = strpos($tag, '='); |
|
| 221 | + while ($p !== false) { |
|
| 222 | + $attr = trim(substr($tag, 0, $p)); |
|
| 223 | + $tag = ltrim(substr($tag, $p + 1)); |
|
| 224 | + $quote = $tag[0]; |
|
| 225 | + $p = strpos($tag, $quote, 1); |
|
| 226 | + $cont = substr($tag, 1, $p - 1); |
|
| 227 | + $liste[$attr] = $cont; |
|
| 228 | + $tag = substr($tag, $p + 1); |
|
| 229 | + $p = strpos($tag, '='); |
|
| 230 | + } |
|
| 231 | 231 | |
| 232 | - return [$tagname, $liste]; |
|
| 232 | + return [$tagname, $liste]; |
|
| 233 | 233 | } |
| 234 | 234 | |
| 235 | 235 | /** |
@@ -252,21 +252,21 @@ discard block |
||
| 252 | 252 | * false si aucun élément ne valide l'expression régulière, true sinon. |
| 253 | 253 | **/ |
| 254 | 254 | function spip_xml_match_nodes($regexp, &$arbre, &$matches, $init = true) { |
| 255 | - if ($init) { |
|
| 256 | - $matches = []; |
|
| 257 | - } |
|
| 258 | - if (is_array($arbre) && count($arbre)) { |
|
| 259 | - foreach (array_keys($arbre) as $tag) { |
|
| 260 | - if (preg_match($regexp, $tag)) { |
|
| 261 | - $matches[$tag] = &$arbre[$tag]; |
|
| 262 | - } |
|
| 263 | - if (is_array($arbre[$tag])) { |
|
| 264 | - foreach (array_keys($arbre[$tag]) as $occurences) { |
|
| 265 | - spip_xml_match_nodes($regexp, $arbre[$tag][$occurences], $matches, false); |
|
| 266 | - } |
|
| 267 | - } |
|
| 268 | - } |
|
| 269 | - } |
|
| 255 | + if ($init) { |
|
| 256 | + $matches = []; |
|
| 257 | + } |
|
| 258 | + if (is_array($arbre) && count($arbre)) { |
|
| 259 | + foreach (array_keys($arbre) as $tag) { |
|
| 260 | + if (preg_match($regexp, $tag)) { |
|
| 261 | + $matches[$tag] = &$arbre[$tag]; |
|
| 262 | + } |
|
| 263 | + if (is_array($arbre[$tag])) { |
|
| 264 | + foreach (array_keys($arbre[$tag]) as $occurences) { |
|
| 265 | + spip_xml_match_nodes($regexp, $arbre[$tag][$occurences], $matches, false); |
|
| 266 | + } |
|
| 267 | + } |
|
| 268 | + } |
|
| 269 | + } |
|
| 270 | 270 | |
| 271 | - return (count($matches)); |
|
| 271 | + return (count($matches)); |
|
| 272 | 272 | } |
@@ -18,206 +18,206 @@ |
||
| 18 | 18 | */ |
| 19 | 19 | |
| 20 | 20 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 21 | - return; |
|
| 21 | + return; |
|
| 22 | 22 | } |
| 23 | 23 | |
| 24 | 24 | $GLOBALS['codes_langues'] = [ |
| 25 | - 'aa' => 'Afar', |
|
| 26 | - 'ab' => 'Abkhazian', |
|
| 27 | - 'af' => 'Afrikaans', |
|
| 28 | - 'am' => 'Amharic', |
|
| 29 | - 'an' => 'Aragonés', |
|
| 30 | - 'ar' => 'عربي', |
|
| 31 | - 'as' => 'Assamese', |
|
| 32 | - 'ast' => 'asturianu', |
|
| 33 | - 'ay' => 'Aymara', |
|
| 34 | - 'az' => 'Azərbaycan dili', |
|
| 35 | - 'ba' => 'Bashkir', |
|
| 36 | - 'be' => 'Беларуская', |
|
| 37 | - 'ber_tam' => 'Tamazigh', |
|
| 38 | - 'ber_tam_tfng' => 'Tamazigh tifinagh', |
|
| 39 | - 'bg' => 'български', |
|
| 40 | - 'bh' => 'Bihari', |
|
| 41 | - 'bi' => 'Bislama', |
|
| 42 | - 'bm' => 'Bambara', |
|
| 43 | - 'bn' => 'Bengali; Bangla', |
|
| 44 | - 'bo' => 'Tibetan', |
|
| 45 | - 'br' => 'brezhoneg', |
|
| 46 | - 'bs' => 'bosanski', |
|
| 47 | - 'ca' => 'català', |
|
| 48 | - 'co' => 'corsu', |
|
| 49 | - 'cpf' => 'Kréol réyoné', |
|
| 50 | - 'cpf_dom' => 'Kreyòl', |
|
| 51 | - 'cpf_hat' => 'Kreyòl (Peyi Dayiti)', |
|
| 52 | - 'cs' => 'čeština', |
|
| 53 | - 'cy' => 'Cymraeg', # welsh, gallois |
|
| 54 | - 'da' => 'dansk', |
|
| 55 | - 'de' => 'Deutsch', |
|
| 56 | - 'dz' => 'Bhutani', |
|
| 57 | - 'el' => 'ελληνικά', |
|
| 58 | - 'en' => 'English', |
|
| 59 | - 'en_hx' => 'H4ck3R', |
|
| 60 | - 'en_sm' => 'Smurf', |
|
| 61 | - 'eo' => 'Esperanto', |
|
| 62 | - 'es' => 'Español', |
|
| 63 | - 'es_co' => 'Colombiano', |
|
| 64 | - 'es_mx_pop' => 'Mexicano a lo güey', |
|
| 65 | - 'et' => 'eesti', |
|
| 66 | - 'eu' => 'euskara', |
|
| 67 | - 'fa' => 'فارسى', |
|
| 68 | - 'ff' => 'Fulah', // peul |
|
| 69 | - 'fi' => 'suomi', |
|
| 70 | - 'fj' => 'Fiji', |
|
| 71 | - 'fo' => 'føroyskt', |
|
| 72 | - 'fon' => 'fongbè', |
|
| 73 | - 'fr' => 'français', |
|
| 74 | - 'fr_fem' => 'français féminin', |
|
| 75 | - 'fr_sc' => 'schtroumpf', |
|
| 76 | - 'fr_lpc' => 'langue parlée complétée', |
|
| 77 | - 'fr_lsf' => 'langue des signes française', |
|
| 78 | - 'fr_spl' => 'français simplifié', |
|
| 79 | - 'fr_tu' => 'français copain', |
|
| 80 | - 'fy' => 'Frisian', |
|
| 81 | - 'ga' => 'Irish', |
|
| 82 | - 'gd' => 'Scots Gaelic', |
|
| 83 | - 'gl' => 'galego', |
|
| 84 | - 'gn' => 'Guarani', |
|
| 85 | - 'grc' => 'Ἀρχαία Ἑλληνική', // grec ancien |
|
| 86 | - 'gu' => 'Gujarati', |
|
| 87 | - 'ha' => 'Hausa', |
|
| 88 | - 'hac' => 'ک-هۆرامی', //"Kurdish-Horami" |
|
| 89 | - 'hbo' => 'עברית־התנך', // hebreu classique ou biblique |
|
| 90 | - 'haz' => 'هزاره گی', |
|
| 91 | - 'he' => 'עברית', |
|
| 92 | - 'hi' => 'हिंदी', |
|
| 93 | - 'hr' => 'hrvatski', |
|
| 94 | - 'hu' => 'magyar', |
|
| 95 | - 'hy' => 'Հայերեն',// Arménien |
|
| 96 | - 'ia' => 'Interlingua', |
|
| 97 | - 'id' => 'Indonesia', |
|
| 98 | - 'ie' => 'Interlingue', |
|
| 99 | - 'ik' => 'Inupiak', |
|
| 100 | - 'is' => 'íslenska', |
|
| 101 | - 'it' => 'italiano', |
|
| 102 | - 'it_fem' => 'italiana', |
|
| 103 | - 'iu' => 'Inuktitut', |
|
| 104 | - 'ja' => '日本語', |
|
| 105 | - 'jv' => 'Javanese', |
|
| 106 | - 'ka' => 'ქართული', |
|
| 107 | - 'kk' => 'қазақ тілі', // Kazakh |
|
| 108 | - 'kl' => 'kalaallisut', |
|
| 109 | - 'km' => 'ភាសាខ្មែរ',// Khmer |
|
| 110 | - 'kn' => 'Kannada', |
|
| 111 | - 'ko' => '한국어', |
|
| 112 | - 'kok' => 'कोंकणी', |
|
| 113 | - 'ks' => 'Kashmiri', |
|
| 114 | - 'ku' => 'کوردی', |
|
| 115 | - 'ky' => 'Kirghiz', |
|
| 116 | - 'la' => 'lingua latina', |
|
| 117 | - 'lb' => 'Lëtzebuergesch', |
|
| 118 | - 'ln' => 'Lingala', |
|
| 119 | - 'lo' => 'ພາສາລາວ', # lao |
|
| 120 | - 'lt' => 'lietuvių', |
|
| 121 | - 'lu' => 'luba-katanga', |
|
| 122 | - 'lv' => 'latviešu', |
|
| 123 | - 'man' => 'mandingue', # a traduire en mandingue |
|
| 124 | - 'mfv' => 'manjak', # ISO-639-3 |
|
| 125 | - 'mg' => 'Malagasy', |
|
| 126 | - 'mi' => 'Maori', |
|
| 127 | - 'mk' => 'македонски јазик', |
|
| 128 | - 'ml' => 'Malayalam', |
|
| 129 | - 'mn' => 'Монгол хэл', |
|
| 130 | - 'mo' => 'Moldavian', |
|
| 131 | - 'mos' => 'Moré', |
|
| 132 | - 'mr' => 'मराठी', |
|
| 133 | - 'ms' => 'Bahasa Malaysia', |
|
| 134 | - 'mt' => 'Maltese', |
|
| 135 | - 'my' => 'Burmese', |
|
| 136 | - 'na' => 'Nauru', |
|
| 137 | - 'nap' => 'napulitano', |
|
| 138 | - 'ne' => 'Nepali', |
|
| 139 | - 'nqo' => "N'ko", // www.manden.org |
|
| 140 | - 'nl' => 'Nederlands', |
|
| 141 | - 'no' => 'norsk', |
|
| 142 | - 'nb' => 'norsk bokmål', |
|
| 143 | - 'nn' => 'norsk nynorsk', |
|
| 144 | - 'oc' => 'òc', |
|
| 145 | - 'oc_lnc' => 'òc lengadocian', |
|
| 146 | - 'oc_ni' => 'òc niçard', |
|
| 147 | - 'oc_ni_la' => 'òc niçard (larg)', |
|
| 148 | - 'oc_ni_mis' => 'òc nissart (mistralenc)', |
|
| 149 | - 'oc_prv' => 'òc provençau', |
|
| 150 | - 'oc_gsc' => 'òc gascon', |
|
| 151 | - 'oc_lms' => 'òc lemosin', |
|
| 152 | - 'oc_auv' => 'òc auvernhat', |
|
| 153 | - 'oc_va' => 'òc vivaroaupenc', |
|
| 154 | - 'om' => '(Afan) Oromo', |
|
| 155 | - 'or' => 'Oriya', |
|
| 156 | - 'pa' => 'Punjabi', |
|
| 157 | - 'pbb' => 'Nasa Yuwe', |
|
| 158 | - 'pl' => 'polski', |
|
| 159 | - 'prs' => 'دری', // ISO-639-3 Dari (Afghanistan) |
|
| 160 | - 'ps' => 'پښتو', |
|
| 161 | - 'pt' => 'Português', |
|
| 162 | - 'pt_br' => 'Português do Brasil', |
|
| 163 | - 'qu' => 'Quechua', |
|
| 164 | - 'rm' => 'Rhaeto-Romance', |
|
| 165 | - 'rn' => 'Kirundi', |
|
| 166 | - 'ro' => 'română', |
|
| 167 | - 'roa' => "ch'ti", |
|
| 168 | - 'ru' => 'русский', |
|
| 169 | - 'rw' => 'Kinyarwanda', |
|
| 170 | - 'sa' => 'संस्कृत', |
|
| 171 | - 'sc' => 'sardu', |
|
| 172 | - 'scn' => 'sicilianu', |
|
| 173 | - 'sd' => 'Sindhi', |
|
| 174 | - 'sg' => 'Sangho', |
|
| 175 | - 'sh' => 'srpskohrvastski', |
|
| 176 | - 'sh_latn' => 'srpskohrvastski', |
|
| 177 | - 'sh_cyrl' => 'Српскохрватски', |
|
| 178 | - 'si' => 'Sinhalese', |
|
| 179 | - 'sk' => 'slovenčina', // (Slovakia) |
|
| 180 | - 'sl' => 'slovenščina', // (Slovenia) |
|
| 181 | - 'sm' => 'Samoan', |
|
| 182 | - 'sn' => 'Shona', |
|
| 183 | - 'so' => 'Somali', |
|
| 184 | - 'sq' => 'shqip', |
|
| 185 | - 'sr' => 'српски', |
|
| 186 | - 'src' => 'sardu logudorésu', // sarde cf 'sc' |
|
| 187 | - 'sro' => 'sardu campidanésu', |
|
| 188 | - 'ss' => 'Siswati', |
|
| 189 | - 'st' => 'Sesotho', |
|
| 190 | - 'su' => 'Sundanese', |
|
| 191 | - 'sv' => 'svenska', |
|
| 192 | - 'sw' => 'Kiswahili', |
|
| 193 | - 'ta' => 'தமிழ்', // Tamil |
|
| 194 | - 'te' => 'Telugu', |
|
| 195 | - 'tg' => 'Tajik', |
|
| 196 | - 'th' => 'ไทย', |
|
| 197 | - 'ti' => 'Tigrinya', |
|
| 198 | - 'tk' => 'Turkmen', |
|
| 199 | - 'tl' => 'Tagalog', |
|
| 200 | - 'tn' => 'Setswana', |
|
| 201 | - 'to' => 'Tonga', |
|
| 202 | - 'tr' => 'Türkçe', |
|
| 203 | - 'ts' => 'Tsonga', |
|
| 204 | - 'tt' => 'Татар', |
|
| 205 | - 'tw' => 'Twi', |
|
| 206 | - 'ty' => 'reo mā`ohi', // tahitien |
|
| 207 | - 'ug' => 'Uighur', |
|
| 208 | - 'uk' => 'українська', |
|
| 209 | - 'ur' => 'ٱردو', |
|
| 210 | - 'uz' => "O'zbekcha", |
|
| 211 | - 'vi' => 'Tiếng Việt', |
|
| 212 | - 'vo' => 'Volapuk', |
|
| 213 | - 'wa' => 'walon', |
|
| 214 | - 'wo' => 'Wolof', |
|
| 215 | - 'xh' => 'Xhosa', |
|
| 216 | - 'yi' => 'Yiddish', |
|
| 217 | - 'yo' => 'Yoruba', |
|
| 218 | - 'za' => 'Zhuang', |
|
| 219 | - 'zh' => '中文', // chinois (ecriture simplifiee) |
|
| 220 | - 'zh_tw' => '台灣中文', // chinois taiwan (ecr. traditionnelle) |
|
| 221 | - 'zu' => 'Zulu' |
|
| 25 | + 'aa' => 'Afar', |
|
| 26 | + 'ab' => 'Abkhazian', |
|
| 27 | + 'af' => 'Afrikaans', |
|
| 28 | + 'am' => 'Amharic', |
|
| 29 | + 'an' => 'Aragonés', |
|
| 30 | + 'ar' => 'عربي', |
|
| 31 | + 'as' => 'Assamese', |
|
| 32 | + 'ast' => 'asturianu', |
|
| 33 | + 'ay' => 'Aymara', |
|
| 34 | + 'az' => 'Azərbaycan dili', |
|
| 35 | + 'ba' => 'Bashkir', |
|
| 36 | + 'be' => 'Беларуская', |
|
| 37 | + 'ber_tam' => 'Tamazigh', |
|
| 38 | + 'ber_tam_tfng' => 'Tamazigh tifinagh', |
|
| 39 | + 'bg' => 'български', |
|
| 40 | + 'bh' => 'Bihari', |
|
| 41 | + 'bi' => 'Bislama', |
|
| 42 | + 'bm' => 'Bambara', |
|
| 43 | + 'bn' => 'Bengali; Bangla', |
|
| 44 | + 'bo' => 'Tibetan', |
|
| 45 | + 'br' => 'brezhoneg', |
|
| 46 | + 'bs' => 'bosanski', |
|
| 47 | + 'ca' => 'català', |
|
| 48 | + 'co' => 'corsu', |
|
| 49 | + 'cpf' => 'Kréol réyoné', |
|
| 50 | + 'cpf_dom' => 'Kreyòl', |
|
| 51 | + 'cpf_hat' => 'Kreyòl (Peyi Dayiti)', |
|
| 52 | + 'cs' => 'čeština', |
|
| 53 | + 'cy' => 'Cymraeg', # welsh, gallois |
|
| 54 | + 'da' => 'dansk', |
|
| 55 | + 'de' => 'Deutsch', |
|
| 56 | + 'dz' => 'Bhutani', |
|
| 57 | + 'el' => 'ελληνικά', |
|
| 58 | + 'en' => 'English', |
|
| 59 | + 'en_hx' => 'H4ck3R', |
|
| 60 | + 'en_sm' => 'Smurf', |
|
| 61 | + 'eo' => 'Esperanto', |
|
| 62 | + 'es' => 'Español', |
|
| 63 | + 'es_co' => 'Colombiano', |
|
| 64 | + 'es_mx_pop' => 'Mexicano a lo güey', |
|
| 65 | + 'et' => 'eesti', |
|
| 66 | + 'eu' => 'euskara', |
|
| 67 | + 'fa' => 'فارسى', |
|
| 68 | + 'ff' => 'Fulah', // peul |
|
| 69 | + 'fi' => 'suomi', |
|
| 70 | + 'fj' => 'Fiji', |
|
| 71 | + 'fo' => 'føroyskt', |
|
| 72 | + 'fon' => 'fongbè', |
|
| 73 | + 'fr' => 'français', |
|
| 74 | + 'fr_fem' => 'français féminin', |
|
| 75 | + 'fr_sc' => 'schtroumpf', |
|
| 76 | + 'fr_lpc' => 'langue parlée complétée', |
|
| 77 | + 'fr_lsf' => 'langue des signes française', |
|
| 78 | + 'fr_spl' => 'français simplifié', |
|
| 79 | + 'fr_tu' => 'français copain', |
|
| 80 | + 'fy' => 'Frisian', |
|
| 81 | + 'ga' => 'Irish', |
|
| 82 | + 'gd' => 'Scots Gaelic', |
|
| 83 | + 'gl' => 'galego', |
|
| 84 | + 'gn' => 'Guarani', |
|
| 85 | + 'grc' => 'Ἀρχαία Ἑλληνική', // grec ancien |
|
| 86 | + 'gu' => 'Gujarati', |
|
| 87 | + 'ha' => 'Hausa', |
|
| 88 | + 'hac' => 'ک-هۆرامی', //"Kurdish-Horami" |
|
| 89 | + 'hbo' => 'עברית־התנך', // hebreu classique ou biblique |
|
| 90 | + 'haz' => 'هزاره گی', |
|
| 91 | + 'he' => 'עברית', |
|
| 92 | + 'hi' => 'हिंदी', |
|
| 93 | + 'hr' => 'hrvatski', |
|
| 94 | + 'hu' => 'magyar', |
|
| 95 | + 'hy' => 'Հայերեն',// Arménien |
|
| 96 | + 'ia' => 'Interlingua', |
|
| 97 | + 'id' => 'Indonesia', |
|
| 98 | + 'ie' => 'Interlingue', |
|
| 99 | + 'ik' => 'Inupiak', |
|
| 100 | + 'is' => 'íslenska', |
|
| 101 | + 'it' => 'italiano', |
|
| 102 | + 'it_fem' => 'italiana', |
|
| 103 | + 'iu' => 'Inuktitut', |
|
| 104 | + 'ja' => '日本語', |
|
| 105 | + 'jv' => 'Javanese', |
|
| 106 | + 'ka' => 'ქართული', |
|
| 107 | + 'kk' => 'қазақ тілі', // Kazakh |
|
| 108 | + 'kl' => 'kalaallisut', |
|
| 109 | + 'km' => 'ភាសាខ្មែរ',// Khmer |
|
| 110 | + 'kn' => 'Kannada', |
|
| 111 | + 'ko' => '한국어', |
|
| 112 | + 'kok' => 'कोंकणी', |
|
| 113 | + 'ks' => 'Kashmiri', |
|
| 114 | + 'ku' => 'کوردی', |
|
| 115 | + 'ky' => 'Kirghiz', |
|
| 116 | + 'la' => 'lingua latina', |
|
| 117 | + 'lb' => 'Lëtzebuergesch', |
|
| 118 | + 'ln' => 'Lingala', |
|
| 119 | + 'lo' => 'ພາສາລາວ', # lao |
|
| 120 | + 'lt' => 'lietuvių', |
|
| 121 | + 'lu' => 'luba-katanga', |
|
| 122 | + 'lv' => 'latviešu', |
|
| 123 | + 'man' => 'mandingue', # a traduire en mandingue |
|
| 124 | + 'mfv' => 'manjak', # ISO-639-3 |
|
| 125 | + 'mg' => 'Malagasy', |
|
| 126 | + 'mi' => 'Maori', |
|
| 127 | + 'mk' => 'македонски јазик', |
|
| 128 | + 'ml' => 'Malayalam', |
|
| 129 | + 'mn' => 'Монгол хэл', |
|
| 130 | + 'mo' => 'Moldavian', |
|
| 131 | + 'mos' => 'Moré', |
|
| 132 | + 'mr' => 'मराठी', |
|
| 133 | + 'ms' => 'Bahasa Malaysia', |
|
| 134 | + 'mt' => 'Maltese', |
|
| 135 | + 'my' => 'Burmese', |
|
| 136 | + 'na' => 'Nauru', |
|
| 137 | + 'nap' => 'napulitano', |
|
| 138 | + 'ne' => 'Nepali', |
|
| 139 | + 'nqo' => "N'ko", // www.manden.org |
|
| 140 | + 'nl' => 'Nederlands', |
|
| 141 | + 'no' => 'norsk', |
|
| 142 | + 'nb' => 'norsk bokmål', |
|
| 143 | + 'nn' => 'norsk nynorsk', |
|
| 144 | + 'oc' => 'òc', |
|
| 145 | + 'oc_lnc' => 'òc lengadocian', |
|
| 146 | + 'oc_ni' => 'òc niçard', |
|
| 147 | + 'oc_ni_la' => 'òc niçard (larg)', |
|
| 148 | + 'oc_ni_mis' => 'òc nissart (mistralenc)', |
|
| 149 | + 'oc_prv' => 'òc provençau', |
|
| 150 | + 'oc_gsc' => 'òc gascon', |
|
| 151 | + 'oc_lms' => 'òc lemosin', |
|
| 152 | + 'oc_auv' => 'òc auvernhat', |
|
| 153 | + 'oc_va' => 'òc vivaroaupenc', |
|
| 154 | + 'om' => '(Afan) Oromo', |
|
| 155 | + 'or' => 'Oriya', |
|
| 156 | + 'pa' => 'Punjabi', |
|
| 157 | + 'pbb' => 'Nasa Yuwe', |
|
| 158 | + 'pl' => 'polski', |
|
| 159 | + 'prs' => 'دری', // ISO-639-3 Dari (Afghanistan) |
|
| 160 | + 'ps' => 'پښتو', |
|
| 161 | + 'pt' => 'Português', |
|
| 162 | + 'pt_br' => 'Português do Brasil', |
|
| 163 | + 'qu' => 'Quechua', |
|
| 164 | + 'rm' => 'Rhaeto-Romance', |
|
| 165 | + 'rn' => 'Kirundi', |
|
| 166 | + 'ro' => 'română', |
|
| 167 | + 'roa' => "ch'ti", |
|
| 168 | + 'ru' => 'русский', |
|
| 169 | + 'rw' => 'Kinyarwanda', |
|
| 170 | + 'sa' => 'संस्कृत', |
|
| 171 | + 'sc' => 'sardu', |
|
| 172 | + 'scn' => 'sicilianu', |
|
| 173 | + 'sd' => 'Sindhi', |
|
| 174 | + 'sg' => 'Sangho', |
|
| 175 | + 'sh' => 'srpskohrvastski', |
|
| 176 | + 'sh_latn' => 'srpskohrvastski', |
|
| 177 | + 'sh_cyrl' => 'Српскохрватски', |
|
| 178 | + 'si' => 'Sinhalese', |
|
| 179 | + 'sk' => 'slovenčina', // (Slovakia) |
|
| 180 | + 'sl' => 'slovenščina', // (Slovenia) |
|
| 181 | + 'sm' => 'Samoan', |
|
| 182 | + 'sn' => 'Shona', |
|
| 183 | + 'so' => 'Somali', |
|
| 184 | + 'sq' => 'shqip', |
|
| 185 | + 'sr' => 'српски', |
|
| 186 | + 'src' => 'sardu logudorésu', // sarde cf 'sc' |
|
| 187 | + 'sro' => 'sardu campidanésu', |
|
| 188 | + 'ss' => 'Siswati', |
|
| 189 | + 'st' => 'Sesotho', |
|
| 190 | + 'su' => 'Sundanese', |
|
| 191 | + 'sv' => 'svenska', |
|
| 192 | + 'sw' => 'Kiswahili', |
|
| 193 | + 'ta' => 'தமிழ்', // Tamil |
|
| 194 | + 'te' => 'Telugu', |
|
| 195 | + 'tg' => 'Tajik', |
|
| 196 | + 'th' => 'ไทย', |
|
| 197 | + 'ti' => 'Tigrinya', |
|
| 198 | + 'tk' => 'Turkmen', |
|
| 199 | + 'tl' => 'Tagalog', |
|
| 200 | + 'tn' => 'Setswana', |
|
| 201 | + 'to' => 'Tonga', |
|
| 202 | + 'tr' => 'Türkçe', |
|
| 203 | + 'ts' => 'Tsonga', |
|
| 204 | + 'tt' => 'Татар', |
|
| 205 | + 'tw' => 'Twi', |
|
| 206 | + 'ty' => 'reo mā`ohi', // tahitien |
|
| 207 | + 'ug' => 'Uighur', |
|
| 208 | + 'uk' => 'українська', |
|
| 209 | + 'ur' => 'ٱردو', |
|
| 210 | + 'uz' => "O'zbekcha", |
|
| 211 | + 'vi' => 'Tiếng Việt', |
|
| 212 | + 'vo' => 'Volapuk', |
|
| 213 | + 'wa' => 'walon', |
|
| 214 | + 'wo' => 'Wolof', |
|
| 215 | + 'xh' => 'Xhosa', |
|
| 216 | + 'yi' => 'Yiddish', |
|
| 217 | + 'yo' => 'Yoruba', |
|
| 218 | + 'za' => 'Zhuang', |
|
| 219 | + 'zh' => '中文', // chinois (ecriture simplifiee) |
|
| 220 | + 'zh_tw' => '台灣中文', // chinois taiwan (ecr. traditionnelle) |
|
| 221 | + 'zu' => 'Zulu' |
|
| 222 | 222 | |
| 223 | 223 | ]; |
@@ -11,7 +11,7 @@ discard block |
||
| 11 | 11 | \***************************************************************************/ |
| 12 | 12 | |
| 13 | 13 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 14 | - return; |
|
| 14 | + return; |
|
| 15 | 15 | } |
| 16 | 16 | |
| 17 | 17 | |
@@ -23,12 +23,12 @@ discard block |
||
| 23 | 23 | * @return array |
| 24 | 24 | */ |
| 25 | 25 | function inc_simplexml_to_array_dist($u, $utiliser_namespace = false) { |
| 26 | - // decoder la chaine en SimpleXML si pas deja fait |
|
| 27 | - if (is_string($u)) { |
|
| 28 | - $u = simplexml_load_string($u); |
|
| 29 | - } |
|
| 26 | + // decoder la chaine en SimpleXML si pas deja fait |
|
| 27 | + if (is_string($u)) { |
|
| 28 | + $u = simplexml_load_string($u); |
|
| 29 | + } |
|
| 30 | 30 | |
| 31 | - return ['root' => @xmlObjToArr($u, $utiliser_namespace)]; |
|
| 31 | + return ['root' => @xmlObjToArr($u, $utiliser_namespace)]; |
|
| 32 | 32 | } |
| 33 | 33 | |
| 34 | 34 | |
@@ -43,66 +43,66 @@ discard block |
||
| 43 | 43 | **/ |
| 44 | 44 | function xmlObjToArr($obj, $utiliser_namespace = false) { |
| 45 | 45 | |
| 46 | - $tableau = []; |
|
| 46 | + $tableau = []; |
|
| 47 | 47 | |
| 48 | - // Cette fonction getDocNamespaces() est longue sur de gros xml. On permet donc |
|
| 49 | - // de l'activer ou pas suivant le contenu supposé du XML |
|
| 50 | - if (is_object($obj)) { |
|
| 51 | - if (is_array($utiliser_namespace)) { |
|
| 52 | - $namespace = $utiliser_namespace; |
|
| 53 | - } else { |
|
| 54 | - if ($utiliser_namespace) { |
|
| 55 | - $namespace = $obj->getDocNamespaces(true); |
|
| 56 | - } |
|
| 57 | - $namespace[null] = null; |
|
| 58 | - } |
|
| 48 | + // Cette fonction getDocNamespaces() est longue sur de gros xml. On permet donc |
|
| 49 | + // de l'activer ou pas suivant le contenu supposé du XML |
|
| 50 | + if (is_object($obj)) { |
|
| 51 | + if (is_array($utiliser_namespace)) { |
|
| 52 | + $namespace = $utiliser_namespace; |
|
| 53 | + } else { |
|
| 54 | + if ($utiliser_namespace) { |
|
| 55 | + $namespace = $obj->getDocNamespaces(true); |
|
| 56 | + } |
|
| 57 | + $namespace[null] = null; |
|
| 58 | + } |
|
| 59 | 59 | |
| 60 | - $name = strtolower((string)$obj->getName()); |
|
| 61 | - $text = trim((string)$obj); |
|
| 62 | - if (strlen($text) <= 0) { |
|
| 63 | - $text = null; |
|
| 64 | - } |
|
| 60 | + $name = strtolower((string)$obj->getName()); |
|
| 61 | + $text = trim((string)$obj); |
|
| 62 | + if (strlen($text) <= 0) { |
|
| 63 | + $text = null; |
|
| 64 | + } |
|
| 65 | 65 | |
| 66 | - $children = []; |
|
| 67 | - $attributes = []; |
|
| 66 | + $children = []; |
|
| 67 | + $attributes = []; |
|
| 68 | 68 | |
| 69 | - // get info for all namespaces |
|
| 70 | - foreach ($namespace as $ns => $nsUrl) { |
|
| 71 | - // attributes |
|
| 72 | - $objAttributes = $obj->attributes($ns, true); |
|
| 73 | - foreach ($objAttributes as $attributeName => $attributeValue) { |
|
| 74 | - $attribName = strtolower(trim((string)$attributeName)); |
|
| 75 | - $attribVal = trim((string)$attributeValue); |
|
| 76 | - if (!empty($ns)) { |
|
| 77 | - $attribName = $ns . ':' . $attribName; |
|
| 78 | - } |
|
| 79 | - $attributes[$attribName] = $attribVal; |
|
| 80 | - } |
|
| 69 | + // get info for all namespaces |
|
| 70 | + foreach ($namespace as $ns => $nsUrl) { |
|
| 71 | + // attributes |
|
| 72 | + $objAttributes = $obj->attributes($ns, true); |
|
| 73 | + foreach ($objAttributes as $attributeName => $attributeValue) { |
|
| 74 | + $attribName = strtolower(trim((string)$attributeName)); |
|
| 75 | + $attribVal = trim((string)$attributeValue); |
|
| 76 | + if (!empty($ns)) { |
|
| 77 | + $attribName = $ns . ':' . $attribName; |
|
| 78 | + } |
|
| 79 | + $attributes[$attribName] = $attribVal; |
|
| 80 | + } |
|
| 81 | 81 | |
| 82 | - // children |
|
| 83 | - $objChildren = $obj->children($ns, true); |
|
| 84 | - foreach ($objChildren as $childName => $child) { |
|
| 85 | - $childName = strtolower((string)$childName); |
|
| 86 | - if (!empty($ns)) { |
|
| 87 | - $childName = $ns . ':' . $childName; |
|
| 88 | - } |
|
| 89 | - $children[$childName][] = xmlObjToArr($child, $namespace); |
|
| 90 | - } |
|
| 91 | - } |
|
| 82 | + // children |
|
| 83 | + $objChildren = $obj->children($ns, true); |
|
| 84 | + foreach ($objChildren as $childName => $child) { |
|
| 85 | + $childName = strtolower((string)$childName); |
|
| 86 | + if (!empty($ns)) { |
|
| 87 | + $childName = $ns . ':' . $childName; |
|
| 88 | + } |
|
| 89 | + $children[$childName][] = xmlObjToArr($child, $namespace); |
|
| 90 | + } |
|
| 91 | + } |
|
| 92 | 92 | |
| 93 | - $tableau = [ |
|
| 94 | - 'name' => $name, |
|
| 95 | - ]; |
|
| 96 | - if ($text) { |
|
| 97 | - $tableau['text'] = $text; |
|
| 98 | - } |
|
| 99 | - if ($attributes) { |
|
| 100 | - $tableau['attributes'] = $attributes; |
|
| 101 | - } |
|
| 102 | - if ($children) { |
|
| 103 | - $tableau['children'] = $children; |
|
| 104 | - } |
|
| 105 | - } |
|
| 93 | + $tableau = [ |
|
| 94 | + 'name' => $name, |
|
| 95 | + ]; |
|
| 96 | + if ($text) { |
|
| 97 | + $tableau['text'] = $text; |
|
| 98 | + } |
|
| 99 | + if ($attributes) { |
|
| 100 | + $tableau['attributes'] = $attributes; |
|
| 101 | + } |
|
| 102 | + if ($children) { |
|
| 103 | + $tableau['children'] = $children; |
|
| 104 | + } |
|
| 105 | + } |
|
| 106 | 106 | |
| 107 | - return $tableau; |
|
| 107 | + return $tableau; |
|
| 108 | 108 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | /** |
@@ -50,19 +50,19 @@ discard block |
||
| 50 | 50 | * @return array|string |
| 51 | 51 | */ |
| 52 | 52 | function inc_securiser_action_dist($action = '', $arg = '', $redirect = '', $mode = false, $att = '', $public = false) { |
| 53 | - if ($action) { |
|
| 54 | - return securiser_action_auteur($action, $arg, $redirect, $mode, $att, $public); |
|
| 55 | - } else { |
|
| 56 | - $arg = _request('arg'); |
|
| 57 | - $hash = _request('hash'); |
|
| 58 | - $action = _request('action') ? _request('action') : _request('formulaire_action'); |
|
| 59 | - if ($a = verifier_action_auteur("$action-$arg", $hash)) { |
|
| 60 | - return $arg; |
|
| 61 | - } |
|
| 62 | - include_spip('inc/minipres'); |
|
| 63 | - echo minipres(); |
|
| 64 | - exit; |
|
| 65 | - } |
|
| 53 | + if ($action) { |
|
| 54 | + return securiser_action_auteur($action, $arg, $redirect, $mode, $att, $public); |
|
| 55 | + } else { |
|
| 56 | + $arg = _request('arg'); |
|
| 57 | + $hash = _request('hash'); |
|
| 58 | + $action = _request('action') ? _request('action') : _request('formulaire_action'); |
|
| 59 | + if ($a = verifier_action_auteur("$action-$arg", $hash)) { |
|
| 60 | + return $arg; |
|
| 61 | + } |
|
| 62 | + include_spip('inc/minipres'); |
|
| 63 | + echo minipres(); |
|
| 64 | + exit; |
|
| 65 | + } |
|
| 66 | 66 | } |
| 67 | 67 | |
| 68 | 68 | /** |
@@ -81,29 +81,29 @@ discard block |
||
| 81 | 81 | */ |
| 82 | 82 | function demander_confirmation_avant_action($titre, $titre_bouton, $url_action = null) { |
| 83 | 83 | |
| 84 | - if (!$url_action) { |
|
| 85 | - $url_action = self(); |
|
| 86 | - $action = _request('action'); |
|
| 87 | - $url_action = parametre_url($url_action, 'action', $action, '&'); |
|
| 88 | - } |
|
| 89 | - else { |
|
| 90 | - $action = parametre_url($url_action, 'action'); |
|
| 91 | - } |
|
| 92 | - |
|
| 93 | - $arg = parametre_url($url_action, 'arg'); |
|
| 94 | - $confirm = md5("$action:$arg:" . realpath(__FILE__)); |
|
| 95 | - if (_request('confirm_action') === $confirm) { |
|
| 96 | - return true; |
|
| 97 | - } |
|
| 98 | - |
|
| 99 | - $url_confirm = parametre_url($url_action, 'confirm_action', $confirm, '&'); |
|
| 100 | - include_spip('inc/filtres'); |
|
| 101 | - $bouton_action = bouton_action($titre_bouton, $url_confirm); |
|
| 102 | - $corps = "<div style='text-align:center;'>$bouton_action</div>"; |
|
| 103 | - |
|
| 104 | - include_spip('inc/minipres'); |
|
| 105 | - echo minipres($titre, $corps); |
|
| 106 | - exit; |
|
| 84 | + if (!$url_action) { |
|
| 85 | + $url_action = self(); |
|
| 86 | + $action = _request('action'); |
|
| 87 | + $url_action = parametre_url($url_action, 'action', $action, '&'); |
|
| 88 | + } |
|
| 89 | + else { |
|
| 90 | + $action = parametre_url($url_action, 'action'); |
|
| 91 | + } |
|
| 92 | + |
|
| 93 | + $arg = parametre_url($url_action, 'arg'); |
|
| 94 | + $confirm = md5("$action:$arg:" . realpath(__FILE__)); |
|
| 95 | + if (_request('confirm_action') === $confirm) { |
|
| 96 | + return true; |
|
| 97 | + } |
|
| 98 | + |
|
| 99 | + $url_confirm = parametre_url($url_action, 'confirm_action', $confirm, '&'); |
|
| 100 | + include_spip('inc/filtres'); |
|
| 101 | + $bouton_action = bouton_action($titre_bouton, $url_confirm); |
|
| 102 | + $corps = "<div style='text-align:center;'>$bouton_action</div>"; |
|
| 103 | + |
|
| 104 | + include_spip('inc/minipres'); |
|
| 105 | + echo minipres($titre, $corps); |
|
| 106 | + exit; |
|
| 107 | 107 | } |
| 108 | 108 | |
| 109 | 109 | /** |
@@ -135,34 +135,34 @@ discard block |
||
| 135 | 135 | */ |
| 136 | 136 | function securiser_action_auteur($action, $arg, $redirect = '', $mode = false, $att = '', $public = false) { |
| 137 | 137 | |
| 138 | - // mode URL ou array |
|
| 139 | - if (!is_string($mode)) { |
|
| 140 | - $hash = calculer_action_auteur("$action-$arg", is_numeric($att) ? $att : null); |
|
| 141 | - |
|
| 142 | - $r = rawurlencode($redirect); |
|
| 143 | - if ($mode === -1) { |
|
| 144 | - return ['action' => $action, 'arg' => $arg, 'hash' => $hash]; |
|
| 145 | - } else { |
|
| 146 | - return generer_url_action( |
|
| 147 | - $action, |
|
| 148 | - 'arg=' . rawurlencode($arg) . "&hash=$hash" . (!$r ? '' : "&redirect=$r"), |
|
| 149 | - $mode, |
|
| 150 | - $public |
|
| 151 | - ); |
|
| 152 | - } |
|
| 153 | - } |
|
| 154 | - |
|
| 155 | - // mode formulaire |
|
| 156 | - $hash = calculer_action_auteur("$action-$arg"); |
|
| 157 | - $att .= " style='margin: 0px; border: 0px'"; |
|
| 158 | - if ($redirect) { |
|
| 159 | - $redirect = "\n\t\t<input name='redirect' type='hidden' value='" . str_replace("'", ''', $redirect) . "' />"; |
|
| 160 | - } |
|
| 161 | - $mode .= $redirect . " |
|
| 138 | + // mode URL ou array |
|
| 139 | + if (!is_string($mode)) { |
|
| 140 | + $hash = calculer_action_auteur("$action-$arg", is_numeric($att) ? $att : null); |
|
| 141 | + |
|
| 142 | + $r = rawurlencode($redirect); |
|
| 143 | + if ($mode === -1) { |
|
| 144 | + return ['action' => $action, 'arg' => $arg, 'hash' => $hash]; |
|
| 145 | + } else { |
|
| 146 | + return generer_url_action( |
|
| 147 | + $action, |
|
| 148 | + 'arg=' . rawurlencode($arg) . "&hash=$hash" . (!$r ? '' : "&redirect=$r"), |
|
| 149 | + $mode, |
|
| 150 | + $public |
|
| 151 | + ); |
|
| 152 | + } |
|
| 153 | + } |
|
| 154 | + |
|
| 155 | + // mode formulaire |
|
| 156 | + $hash = calculer_action_auteur("$action-$arg"); |
|
| 157 | + $att .= " style='margin: 0px; border: 0px'"; |
|
| 158 | + if ($redirect) { |
|
| 159 | + $redirect = "\n\t\t<input name='redirect' type='hidden' value='" . str_replace("'", ''', $redirect) . "' />"; |
|
| 160 | + } |
|
| 161 | + $mode .= $redirect . " |
|
| 162 | 162 | <input name='hash' type='hidden' value='$hash' /> |
| 163 | 163 | <input name='arg' type='hidden' value='$arg' />"; |
| 164 | 164 | |
| 165 | - return generer_form_action($action, $mode, $att, $public); |
|
| 165 | + return generer_form_action($action, $mode, $att, $public); |
|
| 166 | 166 | } |
| 167 | 167 | |
| 168 | 168 | /** |
@@ -172,48 +172,48 @@ discard block |
||
| 172 | 172 | * @return array |
| 173 | 173 | */ |
| 174 | 174 | function caracteriser_auteur($id_auteur = null) { |
| 175 | - static $caracterisation = []; |
|
| 176 | - |
|
| 177 | - if (is_null($id_auteur) and !isset($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 178 | - // si l'auteur courant n'est pas connu alors qu'il peut demander une action |
|
| 179 | - // c'est une connexion par php_auth ou 1 instal, on se rabat sur le cookie. |
|
| 180 | - // S'il n'avait pas le droit de realiser cette action, le hash sera faux. |
|
| 181 | - if ( |
|
| 182 | - isset($_COOKIE['spip_session']) |
|
| 183 | - and (preg_match('/^(\d+)/', $_COOKIE['spip_session'], $r)) |
|
| 184 | - ) { |
|
| 185 | - return [$r[1], '']; |
|
| 186 | - // Necessaire aux forums anonymes. |
|
| 187 | - // Pour le reste, ca echouera. |
|
| 188 | - } else { |
|
| 189 | - return ['0', '']; |
|
| 190 | - } |
|
| 191 | - } |
|
| 192 | - // Eviter l'acces SQL si le pass est connu de PHP |
|
| 193 | - if (is_null($id_auteur)) { |
|
| 194 | - $id_auteur = isset($GLOBALS['visiteur_session']['id_auteur']) ? $GLOBALS['visiteur_session']['id_auteur'] : 0; |
|
| 195 | - if (isset($GLOBALS['visiteur_session']['pass']) and $GLOBALS['visiteur_session']['pass']) { |
|
| 196 | - return $caracterisation[$id_auteur] = [$id_auteur, $GLOBALS['visiteur_session']['pass']]; |
|
| 197 | - } |
|
| 198 | - } |
|
| 199 | - |
|
| 200 | - if (isset($caracterisation[$id_auteur])) { |
|
| 201 | - return $caracterisation[$id_auteur]; |
|
| 202 | - } |
|
| 203 | - |
|
| 204 | - if ($id_auteur) { |
|
| 205 | - include_spip('base/abstract_sql'); |
|
| 206 | - $t = sql_fetsel('id_auteur, pass', 'spip_auteurs', "id_auteur=$id_auteur"); |
|
| 207 | - if ($t) { |
|
| 208 | - return $caracterisation[$id_auteur] = [$t['id_auteur'], $t['pass']]; |
|
| 209 | - } |
|
| 210 | - include_spip('inc/minipres'); |
|
| 211 | - echo minipres(); |
|
| 212 | - exit; |
|
| 213 | - } // Visiteur anonyme, pour ls forums par exemple |
|
| 214 | - else { |
|
| 215 | - return ['0', '']; |
|
| 216 | - } |
|
| 175 | + static $caracterisation = []; |
|
| 176 | + |
|
| 177 | + if (is_null($id_auteur) and !isset($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 178 | + // si l'auteur courant n'est pas connu alors qu'il peut demander une action |
|
| 179 | + // c'est une connexion par php_auth ou 1 instal, on se rabat sur le cookie. |
|
| 180 | + // S'il n'avait pas le droit de realiser cette action, le hash sera faux. |
|
| 181 | + if ( |
|
| 182 | + isset($_COOKIE['spip_session']) |
|
| 183 | + and (preg_match('/^(\d+)/', $_COOKIE['spip_session'], $r)) |
|
| 184 | + ) { |
|
| 185 | + return [$r[1], '']; |
|
| 186 | + // Necessaire aux forums anonymes. |
|
| 187 | + // Pour le reste, ca echouera. |
|
| 188 | + } else { |
|
| 189 | + return ['0', '']; |
|
| 190 | + } |
|
| 191 | + } |
|
| 192 | + // Eviter l'acces SQL si le pass est connu de PHP |
|
| 193 | + if (is_null($id_auteur)) { |
|
| 194 | + $id_auteur = isset($GLOBALS['visiteur_session']['id_auteur']) ? $GLOBALS['visiteur_session']['id_auteur'] : 0; |
|
| 195 | + if (isset($GLOBALS['visiteur_session']['pass']) and $GLOBALS['visiteur_session']['pass']) { |
|
| 196 | + return $caracterisation[$id_auteur] = [$id_auteur, $GLOBALS['visiteur_session']['pass']]; |
|
| 197 | + } |
|
| 198 | + } |
|
| 199 | + |
|
| 200 | + if (isset($caracterisation[$id_auteur])) { |
|
| 201 | + return $caracterisation[$id_auteur]; |
|
| 202 | + } |
|
| 203 | + |
|
| 204 | + if ($id_auteur) { |
|
| 205 | + include_spip('base/abstract_sql'); |
|
| 206 | + $t = sql_fetsel('id_auteur, pass', 'spip_auteurs', "id_auteur=$id_auteur"); |
|
| 207 | + if ($t) { |
|
| 208 | + return $caracterisation[$id_auteur] = [$t['id_auteur'], $t['pass']]; |
|
| 209 | + } |
|
| 210 | + include_spip('inc/minipres'); |
|
| 211 | + echo minipres(); |
|
| 212 | + exit; |
|
| 213 | + } // Visiteur anonyme, pour ls forums par exemple |
|
| 214 | + else { |
|
| 215 | + return ['0', '']; |
|
| 216 | + } |
|
| 217 | 217 | } |
| 218 | 218 | |
| 219 | 219 | /** |
@@ -228,28 +228,28 @@ discard block |
||
| 228 | 228 | * @return string |
| 229 | 229 | */ |
| 230 | 230 | function _action_auteur($action, $id_auteur, $pass, $alea) { |
| 231 | - static $sha = []; |
|
| 232 | - if (!isset($sha[$id_auteur . $pass . $alea])) { |
|
| 233 | - if (!isset($GLOBALS['meta'][$alea])) { |
|
| 234 | - if (!$exec = _request('exec') or !autoriser_sans_cookie($exec)) { |
|
| 235 | - include_spip('inc/acces'); |
|
| 236 | - charger_aleas(); |
|
| 237 | - if (empty($GLOBALS['meta'][$alea])) { |
|
| 238 | - include_spip('inc/minipres'); |
|
| 239 | - echo minipres(); |
|
| 240 | - spip_log("$alea indisponible"); |
|
| 241 | - exit; |
|
| 242 | - } |
|
| 243 | - } |
|
| 244 | - } |
|
| 245 | - include_spip('auth/sha256.inc'); |
|
| 246 | - $sha[$id_auteur . $pass . $alea] = spip_sha256($id_auteur . $pass . @$GLOBALS['meta'][$alea]); |
|
| 247 | - } |
|
| 248 | - if (function_exists('sha1')) { |
|
| 249 | - return sha1($action . $sha[$id_auteur . $pass . $alea]); |
|
| 250 | - } else { |
|
| 251 | - return md5($action . $sha[$id_auteur . $pass . $alea]); |
|
| 252 | - } |
|
| 231 | + static $sha = []; |
|
| 232 | + if (!isset($sha[$id_auteur . $pass . $alea])) { |
|
| 233 | + if (!isset($GLOBALS['meta'][$alea])) { |
|
| 234 | + if (!$exec = _request('exec') or !autoriser_sans_cookie($exec)) { |
|
| 235 | + include_spip('inc/acces'); |
|
| 236 | + charger_aleas(); |
|
| 237 | + if (empty($GLOBALS['meta'][$alea])) { |
|
| 238 | + include_spip('inc/minipres'); |
|
| 239 | + echo minipres(); |
|
| 240 | + spip_log("$alea indisponible"); |
|
| 241 | + exit; |
|
| 242 | + } |
|
| 243 | + } |
|
| 244 | + } |
|
| 245 | + include_spip('auth/sha256.inc'); |
|
| 246 | + $sha[$id_auteur . $pass . $alea] = spip_sha256($id_auteur . $pass . @$GLOBALS['meta'][$alea]); |
|
| 247 | + } |
|
| 248 | + if (function_exists('sha1')) { |
|
| 249 | + return sha1($action . $sha[$id_auteur . $pass . $alea]); |
|
| 250 | + } else { |
|
| 251 | + return md5($action . $sha[$id_auteur . $pass . $alea]); |
|
| 252 | + } |
|
| 253 | 253 | } |
| 254 | 254 | |
| 255 | 255 | /** |
@@ -260,9 +260,9 @@ discard block |
||
| 260 | 260 | * @return string |
| 261 | 261 | */ |
| 262 | 262 | function calculer_action_auteur($action, $id_auteur = null) { |
| 263 | - list($id_auteur, $pass) = caracteriser_auteur($id_auteur); |
|
| 263 | + list($id_auteur, $pass) = caracteriser_auteur($id_auteur); |
|
| 264 | 264 | |
| 265 | - return _action_auteur($action, $id_auteur, $pass, 'alea_ephemere'); |
|
| 265 | + return _action_auteur($action, $id_auteur, $pass, 'alea_ephemere'); |
|
| 266 | 266 | } |
| 267 | 267 | |
| 268 | 268 | |
@@ -275,15 +275,15 @@ discard block |
||
| 275 | 275 | * @return bool |
| 276 | 276 | */ |
| 277 | 277 | function verifier_action_auteur($action, $hash) { |
| 278 | - list($id_auteur, $pass) = caracteriser_auteur(); |
|
| 279 | - if ($hash == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere')) { |
|
| 280 | - return true; |
|
| 281 | - } |
|
| 282 | - if ($hash == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien')) { |
|
| 283 | - return true; |
|
| 284 | - } |
|
| 285 | - |
|
| 286 | - return false; |
|
| 278 | + list($id_auteur, $pass) = caracteriser_auteur(); |
|
| 279 | + if ($hash == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere')) { |
|
| 280 | + return true; |
|
| 281 | + } |
|
| 282 | + if ($hash == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien')) { |
|
| 283 | + return true; |
|
| 284 | + } |
|
| 285 | + |
|
| 286 | + return false; |
|
| 287 | 287 | } |
| 288 | 288 | |
| 289 | 289 | // |
@@ -299,29 +299,29 @@ discard block |
||
| 299 | 299 | * @return string |
| 300 | 300 | */ |
| 301 | 301 | function secret_du_site() { |
| 302 | - if (!isset($GLOBALS['meta']['secret_du_site'])) { |
|
| 303 | - include_spip('base/abstract_sql'); |
|
| 304 | - $GLOBALS['meta']['secret_du_site'] = sql_getfetsel('valeur', 'spip_meta', "nom='secret_du_site'"); |
|
| 305 | - } |
|
| 306 | - if ( |
|
| 307 | - !isset($GLOBALS['meta']['secret_du_site']) |
|
| 308 | - or (strlen($GLOBALS['meta']['secret_du_site']) < 64) |
|
| 309 | - ) { |
|
| 310 | - include_spip('inc/acces'); |
|
| 311 | - include_spip('auth/sha256.inc'); |
|
| 312 | - ecrire_meta( |
|
| 313 | - 'secret_du_site', |
|
| 314 | - spip_sha256( |
|
| 315 | - $_SERVER['DOCUMENT_ROOT'] |
|
| 316 | - . (isset($_SERVER['SERVER_SIGNATURE']) ? $_SERVER['SERVER_SIGNATURE'] : '') |
|
| 317 | - . creer_uniqid() |
|
| 318 | - ), |
|
| 319 | - 'non' |
|
| 320 | - ); |
|
| 321 | - lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas |
|
| 322 | - } |
|
| 323 | - |
|
| 324 | - return $GLOBALS['meta']['secret_du_site']; |
|
| 302 | + if (!isset($GLOBALS['meta']['secret_du_site'])) { |
|
| 303 | + include_spip('base/abstract_sql'); |
|
| 304 | + $GLOBALS['meta']['secret_du_site'] = sql_getfetsel('valeur', 'spip_meta', "nom='secret_du_site'"); |
|
| 305 | + } |
|
| 306 | + if ( |
|
| 307 | + !isset($GLOBALS['meta']['secret_du_site']) |
|
| 308 | + or (strlen($GLOBALS['meta']['secret_du_site']) < 64) |
|
| 309 | + ) { |
|
| 310 | + include_spip('inc/acces'); |
|
| 311 | + include_spip('auth/sha256.inc'); |
|
| 312 | + ecrire_meta( |
|
| 313 | + 'secret_du_site', |
|
| 314 | + spip_sha256( |
|
| 315 | + $_SERVER['DOCUMENT_ROOT'] |
|
| 316 | + . (isset($_SERVER['SERVER_SIGNATURE']) ? $_SERVER['SERVER_SIGNATURE'] : '') |
|
| 317 | + . creer_uniqid() |
|
| 318 | + ), |
|
| 319 | + 'non' |
|
| 320 | + ); |
|
| 321 | + lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas |
|
| 322 | + } |
|
| 323 | + |
|
| 324 | + return $GLOBALS['meta']['secret_du_site']; |
|
| 325 | 325 | } |
| 326 | 326 | |
| 327 | 327 | /** |
@@ -331,11 +331,11 @@ discard block |
||
| 331 | 331 | * @return string |
| 332 | 332 | */ |
| 333 | 333 | function calculer_cle_action($action) { |
| 334 | - if (function_exists('sha1')) { |
|
| 335 | - return sha1($action . secret_du_site()); |
|
| 336 | - } else { |
|
| 337 | - return md5($action . secret_du_site()); |
|
| 338 | - } |
|
| 334 | + if (function_exists('sha1')) { |
|
| 335 | + return sha1($action . secret_du_site()); |
|
| 336 | + } else { |
|
| 337 | + return md5($action . secret_du_site()); |
|
| 338 | + } |
|
| 339 | 339 | } |
| 340 | 340 | |
| 341 | 341 | /** |
@@ -346,7 +346,7 @@ discard block |
||
| 346 | 346 | * @return bool |
| 347 | 347 | */ |
| 348 | 348 | function verifier_cle_action($action, $cle) { |
| 349 | - return ($cle == calculer_cle_action($action)); |
|
| 349 | + return ($cle == calculer_cle_action($action)); |
|
| 350 | 350 | } |
| 351 | 351 | |
| 352 | 352 | |
@@ -363,19 +363,19 @@ discard block |
||
| 363 | 363 | * @return string Token, de la forme "{id}*{hash}" |
| 364 | 364 | */ |
| 365 | 365 | function calculer_token_previsu($url, $id_auteur = null, $alea = 'alea_ephemere') { |
| 366 | - if (is_null($id_auteur)) { |
|
| 367 | - if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 368 | - $id_auteur = $GLOBALS['visiteur_session']['id_auteur']; |
|
| 369 | - } |
|
| 370 | - } |
|
| 371 | - if (!$id_auteur = intval($id_auteur)) { |
|
| 372 | - return ''; |
|
| 373 | - } |
|
| 374 | - // On nettoie l’URL de tous les var_. |
|
| 375 | - $url = nettoyer_uri_var($url); |
|
| 376 | - |
|
| 377 | - $token = _action_auteur('previsualiser-' . $url, $id_auteur, null, $alea); |
|
| 378 | - return "$id_auteur-$token"; |
|
| 366 | + if (is_null($id_auteur)) { |
|
| 367 | + if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 368 | + $id_auteur = $GLOBALS['visiteur_session']['id_auteur']; |
|
| 369 | + } |
|
| 370 | + } |
|
| 371 | + if (!$id_auteur = intval($id_auteur)) { |
|
| 372 | + return ''; |
|
| 373 | + } |
|
| 374 | + // On nettoie l’URL de tous les var_. |
|
| 375 | + $url = nettoyer_uri_var($url); |
|
| 376 | + |
|
| 377 | + $token = _action_auteur('previsualiser-' . $url, $id_auteur, null, $alea); |
|
| 378 | + return "$id_auteur-$token"; |
|
| 379 | 379 | } |
| 380 | 380 | |
| 381 | 381 | |
@@ -393,31 +393,31 @@ discard block |
||
| 393 | 393 | * + Tableau (id auteur, type d’objet, id_objet) sinon. |
| 394 | 394 | */ |
| 395 | 395 | function verifier_token_previsu($token) { |
| 396 | - // retrouver auteur / hash |
|
| 397 | - $e = explode('-', $token, 2); |
|
| 398 | - if (count($e) == 2 and is_numeric(reset($e))) { |
|
| 399 | - $id_auteur = intval(reset($e)); |
|
| 400 | - } else { |
|
| 401 | - return false; |
|
| 402 | - } |
|
| 403 | - |
|
| 404 | - // calculer le type et id de l’url actuelle |
|
| 405 | - include_spip('inc/urls'); |
|
| 406 | - include_spip('inc/filtres_mini'); |
|
| 407 | - $url = url_absolue(self()); |
|
| 408 | - |
|
| 409 | - // verifier le token |
|
| 410 | - $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere'); |
|
| 411 | - if (!$_token or $token !== $_token) { |
|
| 412 | - $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere_ancien'); |
|
| 413 | - if (!$_token or $token !== $_token) { |
|
| 414 | - return false; |
|
| 415 | - } |
|
| 416 | - } |
|
| 417 | - |
|
| 418 | - return [ |
|
| 419 | - 'id_auteur' => $id_auteur, |
|
| 420 | - ]; |
|
| 396 | + // retrouver auteur / hash |
|
| 397 | + $e = explode('-', $token, 2); |
|
| 398 | + if (count($e) == 2 and is_numeric(reset($e))) { |
|
| 399 | + $id_auteur = intval(reset($e)); |
|
| 400 | + } else { |
|
| 401 | + return false; |
|
| 402 | + } |
|
| 403 | + |
|
| 404 | + // calculer le type et id de l’url actuelle |
|
| 405 | + include_spip('inc/urls'); |
|
| 406 | + include_spip('inc/filtres_mini'); |
|
| 407 | + $url = url_absolue(self()); |
|
| 408 | + |
|
| 409 | + // verifier le token |
|
| 410 | + $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere'); |
|
| 411 | + if (!$_token or $token !== $_token) { |
|
| 412 | + $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere_ancien'); |
|
| 413 | + if (!$_token or $token !== $_token) { |
|
| 414 | + return false; |
|
| 415 | + } |
|
| 416 | + } |
|
| 417 | + |
|
| 418 | + return [ |
|
| 419 | + 'id_auteur' => $id_auteur, |
|
| 420 | + ]; |
|
| 421 | 421 | } |
| 422 | 422 | |
| 423 | 423 | /** |
@@ -426,13 +426,13 @@ discard block |
||
| 426 | 426 | * @return bool|array |
| 427 | 427 | */ |
| 428 | 428 | function decrire_token_previsu() { |
| 429 | - static $desc = null; |
|
| 430 | - if (is_null($desc)) { |
|
| 431 | - if ($token = _request('var_previewtoken')) { |
|
| 432 | - $desc = verifier_token_previsu($token); |
|
| 433 | - } else { |
|
| 434 | - $desc = false; |
|
| 435 | - } |
|
| 436 | - } |
|
| 437 | - return $desc; |
|
| 429 | + static $desc = null; |
|
| 430 | + if (is_null($desc)) { |
|
| 431 | + if ($token = _request('var_previewtoken')) { |
|
| 432 | + $desc = verifier_token_previsu($token); |
|
| 433 | + } else { |
|
| 434 | + $desc = false; |
|
| 435 | + } |
|
| 436 | + } |
|
| 437 | + return $desc; |
|
| 438 | 438 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | include_spip('inc/filtres'); |
@@ -46,56 +46,56 @@ discard block |
||
| 46 | 46 | **/ |
| 47 | 47 | function inc_selectionner_dist($sel, $idom = '', $exclus = 0, $aff_racine = false, $recur = true, $do = 'aff') { |
| 48 | 48 | |
| 49 | - if ($recur) { |
|
| 50 | - $recur = mini_hier($sel); |
|
| 51 | - } else { |
|
| 52 | - $sel = 0; |
|
| 53 | - } |
|
| 54 | - |
|
| 55 | - if ($aff_racine) { |
|
| 56 | - $info = generer_url_ecrire('informer', "type=rubrique&rac=$idom&do=$do&id="); |
|
| 57 | - $idom3 = $idom . '_selection'; |
|
| 58 | - |
|
| 59 | - $onClick = "jQuery(this).parent().addClass('on');jQuery('#choix_parent_principal .on').removeClass('on'); aff_selection(0, '$idom3', '$info', event);return false;"; |
|
| 60 | - |
|
| 61 | - $ondbClick = strtr( |
|
| 62 | - str_replace( |
|
| 63 | - "'", |
|
| 64 | - '’', |
|
| 65 | - str_replace( |
|
| 66 | - '"', |
|
| 67 | - '"', |
|
| 68 | - textebrut(_T('info_racine_site')) |
|
| 69 | - ) |
|
| 70 | - ), |
|
| 71 | - "\n\r", |
|
| 72 | - ' ' |
|
| 73 | - ); |
|
| 74 | - |
|
| 75 | - $js_func = $do . '_selection_titre'; |
|
| 76 | - $ondbClick = "$js_func('$ondbClick',0,'selection_rubrique','id_parent');"; |
|
| 77 | - |
|
| 78 | - $aff_racine = "<div class='petit-item petite-racine item'>" |
|
| 79 | - . "<a href='#'" |
|
| 80 | - . 'onclick="' |
|
| 81 | - . $onClick |
|
| 82 | - . "\"\nondbclick=\"" |
|
| 83 | - . $ondbClick |
|
| 84 | - . $onClick |
|
| 85 | - . '">' |
|
| 86 | - . _T('info_racine_site') |
|
| 87 | - . '</a></div>'; |
|
| 88 | - } |
|
| 89 | - |
|
| 90 | - $url_init = generer_url_ecrire('plonger', "rac=$idom&exclus=$exclus&id=0&col=1&do=$do"); |
|
| 91 | - |
|
| 92 | - $plonger = charger_fonction('plonger', 'inc'); |
|
| 93 | - $plonger_r = $plonger($sel, $idom, $recur, 1, $exclus, $do); |
|
| 94 | - |
|
| 95 | - // url completee par la fonction JS onkeypress_rechercher |
|
| 96 | - $url = generer_url_ecrire('rechercher', "exclus=$exclus&rac=$idom&do=$do&type="); |
|
| 97 | - |
|
| 98 | - return construire_selectionner_hierarchie($idom, $plonger_r, $aff_racine, $url, 'id_parent', $url_init); |
|
| 49 | + if ($recur) { |
|
| 50 | + $recur = mini_hier($sel); |
|
| 51 | + } else { |
|
| 52 | + $sel = 0; |
|
| 53 | + } |
|
| 54 | + |
|
| 55 | + if ($aff_racine) { |
|
| 56 | + $info = generer_url_ecrire('informer', "type=rubrique&rac=$idom&do=$do&id="); |
|
| 57 | + $idom3 = $idom . '_selection'; |
|
| 58 | + |
|
| 59 | + $onClick = "jQuery(this).parent().addClass('on');jQuery('#choix_parent_principal .on').removeClass('on'); aff_selection(0, '$idom3', '$info', event);return false;"; |
|
| 60 | + |
|
| 61 | + $ondbClick = strtr( |
|
| 62 | + str_replace( |
|
| 63 | + "'", |
|
| 64 | + '’', |
|
| 65 | + str_replace( |
|
| 66 | + '"', |
|
| 67 | + '"', |
|
| 68 | + textebrut(_T('info_racine_site')) |
|
| 69 | + ) |
|
| 70 | + ), |
|
| 71 | + "\n\r", |
|
| 72 | + ' ' |
|
| 73 | + ); |
|
| 74 | + |
|
| 75 | + $js_func = $do . '_selection_titre'; |
|
| 76 | + $ondbClick = "$js_func('$ondbClick',0,'selection_rubrique','id_parent');"; |
|
| 77 | + |
|
| 78 | + $aff_racine = "<div class='petit-item petite-racine item'>" |
|
| 79 | + . "<a href='#'" |
|
| 80 | + . 'onclick="' |
|
| 81 | + . $onClick |
|
| 82 | + . "\"\nondbclick=\"" |
|
| 83 | + . $ondbClick |
|
| 84 | + . $onClick |
|
| 85 | + . '">' |
|
| 86 | + . _T('info_racine_site') |
|
| 87 | + . '</a></div>'; |
|
| 88 | + } |
|
| 89 | + |
|
| 90 | + $url_init = generer_url_ecrire('plonger', "rac=$idom&exclus=$exclus&id=0&col=1&do=$do"); |
|
| 91 | + |
|
| 92 | + $plonger = charger_fonction('plonger', 'inc'); |
|
| 93 | + $plonger_r = $plonger($sel, $idom, $recur, 1, $exclus, $do); |
|
| 94 | + |
|
| 95 | + // url completee par la fonction JS onkeypress_rechercher |
|
| 96 | + $url = generer_url_ecrire('rechercher', "exclus=$exclus&rac=$idom&do=$do&type="); |
|
| 97 | + |
|
| 98 | + return construire_selectionner_hierarchie($idom, $plonger_r, $aff_racine, $url, 'id_parent', $url_init); |
|
| 99 | 99 | } |
| 100 | 100 | |
| 101 | 101 | /** |
@@ -113,58 +113,58 @@ discard block |
||
| 113 | 113 | **/ |
| 114 | 114 | function construire_selectionner_hierarchie($idom, $liste, $racine, $url, $name, $url_init = '') { |
| 115 | 115 | |
| 116 | - $idom1 = $idom . '_champ_recherche'; |
|
| 117 | - $idom2 = $idom . '_principal'; |
|
| 118 | - $idom3 = $idom . '_selection'; |
|
| 119 | - $idom4 = $idom . '_col_1'; |
|
| 120 | - $idom5 = 'img_' . $idom4; |
|
| 121 | - $idom6 = $idom . '_fonc'; |
|
| 122 | - |
|
| 123 | - return "<div id='$idom'>" |
|
| 124 | - . "<a id='$idom6' style='visibility: hidden;'" |
|
| 125 | - . ($url_init ? "\nhref='$url_init'" : '') |
|
| 126 | - . '></a>' |
|
| 127 | - . "<div class='recherche_rapide_parent formulaire_recherche'>" |
|
| 128 | - . http_img_pack( |
|
| 129 | - 'loader.svg', |
|
| 130 | - '', |
|
| 131 | - "class='loader' style='visibility: hidden;float:" . $GLOBALS['spip_lang_right'] . "' id='$idom5'" |
|
| 132 | - ) |
|
| 133 | - . '' |
|
| 134 | - . "<input style='width: 10em;float:" . $GLOBALS['spip_lang_right'] . ";' type='text' class='text search' id='$idom1' placeholder='" . _T('info_rechercher') . "'" |
|
| 135 | - // eliminer Return car il provoque la soumission (balise unique) |
|
| 136 | - // et eliminer Tab pour la navigation au clavier |
|
| 137 | - // ce serait encore mieux de ne le faire que s'il y a encore plusieurs |
|
| 138 | - // resultats retournes par la recherche |
|
| 139 | - . "\nonkeypress=\"k=event.keyCode;if (k==13 || k==3 || k==9){return false;}\"" |
|
| 140 | - // lancer la recherche apres le filtrage ci-dessus sauf sur le tab (navigation au clavier) |
|
| 141 | - . "\nonkeyup=\"if(event.keyCode==9){return false;};return onkey_rechercher(this.value," |
|
| 142 | - // la destination de la recherche |
|
| 143 | - . "'$idom4'" |
|
| 116 | + $idom1 = $idom . '_champ_recherche'; |
|
| 117 | + $idom2 = $idom . '_principal'; |
|
| 118 | + $idom3 = $idom . '_selection'; |
|
| 119 | + $idom4 = $idom . '_col_1'; |
|
| 120 | + $idom5 = 'img_' . $idom4; |
|
| 121 | + $idom6 = $idom . '_fonc'; |
|
| 122 | + |
|
| 123 | + return "<div id='$idom'>" |
|
| 124 | + . "<a id='$idom6' style='visibility: hidden;'" |
|
| 125 | + . ($url_init ? "\nhref='$url_init'" : '') |
|
| 126 | + . '></a>' |
|
| 127 | + . "<div class='recherche_rapide_parent formulaire_recherche'>" |
|
| 128 | + . http_img_pack( |
|
| 129 | + 'loader.svg', |
|
| 130 | + '', |
|
| 131 | + "class='loader' style='visibility: hidden;float:" . $GLOBALS['spip_lang_right'] . "' id='$idom5'" |
|
| 132 | + ) |
|
| 133 | + . '' |
|
| 134 | + . "<input style='width: 10em;float:" . $GLOBALS['spip_lang_right'] . ";' type='text' class='text search' id='$idom1' placeholder='" . _T('info_rechercher') . "'" |
|
| 135 | + // eliminer Return car il provoque la soumission (balise unique) |
|
| 136 | + // et eliminer Tab pour la navigation au clavier |
|
| 137 | + // ce serait encore mieux de ne le faire que s'il y a encore plusieurs |
|
| 138 | + // resultats retournes par la recherche |
|
| 139 | + . "\nonkeypress=\"k=event.keyCode;if (k==13 || k==3 || k==9){return false;}\"" |
|
| 140 | + // lancer la recherche apres le filtrage ci-dessus sauf sur le tab (navigation au clavier) |
|
| 141 | + . "\nonkeyup=\"if(event.keyCode==9){return false;};return onkey_rechercher(this.value," |
|
| 142 | + // la destination de la recherche |
|
| 143 | + . "'$idom4'" |
|
| 144 | 144 | # . "this.parentNode.parentNode.parentNode.parentNode.nextSibling.firstChild.id" |
| 145 | - . ",'" |
|
| 146 | - // l'url effectuant la recherche |
|
| 147 | - . $url |
|
| 148 | - . "'," |
|
| 149 | - // le noeud contenant un gif anime |
|
| 150 | - // . "'idom5'" |
|
| 151 | - . 'this.parentNode.previousSibling.firstChild' |
|
| 152 | - . ",'" |
|
| 153 | - // la valeur de l'attribut Name a remplir |
|
| 154 | - . $name |
|
| 155 | - . "','" |
|
| 156 | - // noeud invisible memorisant l'URL initiale (pour re-initialisation) |
|
| 157 | - . $idom6 |
|
| 158 | - . "')\"" |
|
| 159 | - . ' />' |
|
| 160 | - . "\n</div>" |
|
| 161 | - . ($racine ? "<div>$racine</div>" : '') |
|
| 162 | - . "<div id='" |
|
| 163 | - . $idom2 |
|
| 164 | - . "'><div id='$idom4'" |
|
| 165 | - . " class=''>" |
|
| 166 | - . $liste |
|
| 167 | - . "</div></div>\n<div id='$idom3'></div></div>\n"; |
|
| 145 | + . ",'" |
|
| 146 | + // l'url effectuant la recherche |
|
| 147 | + . $url |
|
| 148 | + . "'," |
|
| 149 | + // le noeud contenant un gif anime |
|
| 150 | + // . "'idom5'" |
|
| 151 | + . 'this.parentNode.previousSibling.firstChild' |
|
| 152 | + . ",'" |
|
| 153 | + // la valeur de l'attribut Name a remplir |
|
| 154 | + . $name |
|
| 155 | + . "','" |
|
| 156 | + // noeud invisible memorisant l'URL initiale (pour re-initialisation) |
|
| 157 | + . $idom6 |
|
| 158 | + . "')\"" |
|
| 159 | + . ' />' |
|
| 160 | + . "\n</div>" |
|
| 161 | + . ($racine ? "<div>$racine</div>" : '') |
|
| 162 | + . "<div id='" |
|
| 163 | + . $idom2 |
|
| 164 | + . "'><div id='$idom4'" |
|
| 165 | + . " class=''>" |
|
| 166 | + . $liste |
|
| 167 | + . "</div></div>\n<div id='$idom3'></div></div>\n"; |
|
| 168 | 168 | } |
| 169 | 169 | |
| 170 | 170 | /** |
@@ -176,11 +176,11 @@ discard block |
||
| 176 | 176 | **/ |
| 177 | 177 | function mini_hier($id_rubrique) { |
| 178 | 178 | |
| 179 | - $liste = $id_rubrique; |
|
| 180 | - $id_rubrique = intval($id_rubrique); |
|
| 181 | - while ($id_rubrique = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique = ' . $id_rubrique)) { |
|
| 182 | - $liste = $id_rubrique . ",$liste"; |
|
| 183 | - } |
|
| 179 | + $liste = $id_rubrique; |
|
| 180 | + $id_rubrique = intval($id_rubrique); |
|
| 181 | + while ($id_rubrique = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique = ' . $id_rubrique)) { |
|
| 182 | + $liste = $id_rubrique . ",$liste"; |
|
| 183 | + } |
|
| 184 | 184 | |
| 185 | - return explode(',', "0,$liste"); |
|
| 185 | + return explode(',', "0,$liste"); |
|
| 186 | 186 | } |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Notifications |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | |
@@ -33,16 +33,16 @@ discard block |
||
| 33 | 33 | */ |
| 34 | 34 | function inc_notifications_dist($quoi, $id = 0, $options = []) { |
| 35 | 35 | |
| 36 | - // charger les fichiers qui veulent ajouter des definitions |
|
| 37 | - // ou faire des trucs aussi dans le pipeline, ca fait deux api pour le prix d'une ... |
|
| 38 | - pipeline('notifications', ['args' => ['quoi' => $quoi, 'id' => $id, 'options' => $options]]); |
|
| 36 | + // charger les fichiers qui veulent ajouter des definitions |
|
| 37 | + // ou faire des trucs aussi dans le pipeline, ca fait deux api pour le prix d'une ... |
|
| 38 | + pipeline('notifications', ['args' => ['quoi' => $quoi, 'id' => $id, 'options' => $options]]); |
|
| 39 | 39 | |
| 40 | - if ($notification = charger_fonction($quoi, 'notifications', true)) { |
|
| 41 | - spip_log("$notification($quoi,$id" |
|
| 42 | - . ($options ? ',' . serialize($options) : '') |
|
| 43 | - . ')', 'notifications'); |
|
| 44 | - $notification($quoi, $id, $options); |
|
| 45 | - } |
|
| 40 | + if ($notification = charger_fonction($quoi, 'notifications', true)) { |
|
| 41 | + spip_log("$notification($quoi,$id" |
|
| 42 | + . ($options ? ',' . serialize($options) : '') |
|
| 43 | + . ')', 'notifications'); |
|
| 44 | + $notification($quoi, $id, $options); |
|
| 45 | + } |
|
| 46 | 46 | } |
| 47 | 47 | |
| 48 | 48 | /** |
@@ -56,14 +56,14 @@ discard block |
||
| 56 | 56 | * @param array $exclure |
| 57 | 57 | */ |
| 58 | 58 | function notifications_nettoyer_emails(&$emails, $exclure = []) { |
| 59 | - // filtrer et unifier |
|
| 60 | - $emails = array_unique(array_filter(array_map('email_valide', array_map('trim', $emails)))); |
|
| 61 | - if ($exclure and count($exclure)) { |
|
| 62 | - // nettoyer les exclusions d'abord |
|
| 63 | - notifications_nettoyer_emails($exclure); |
|
| 64 | - // faire un diff |
|
| 65 | - $emails = array_diff($emails, $exclure); |
|
| 66 | - } |
|
| 59 | + // filtrer et unifier |
|
| 60 | + $emails = array_unique(array_filter(array_map('email_valide', array_map('trim', $emails)))); |
|
| 61 | + if ($exclure and count($exclure)) { |
|
| 62 | + // nettoyer les exclusions d'abord |
|
| 63 | + notifications_nettoyer_emails($exclure); |
|
| 64 | + // faire un diff |
|
| 65 | + $emails = array_diff($emails, $exclure); |
|
| 66 | + } |
|
| 67 | 67 | } |
| 68 | 68 | |
| 69 | 69 | /** |
@@ -78,90 +78,90 @@ discard block |
||
| 78 | 78 | * @param string $headers |
| 79 | 79 | */ |
| 80 | 80 | function notifications_envoyer_mails($emails, $texte, $sujet = '', $from = '', $headers = '') { |
| 81 | - // rien a faire si pas de texte ! |
|
| 82 | - if (!strlen($texte)) { |
|
| 83 | - return; |
|
| 84 | - } |
|
| 85 | - |
|
| 86 | - // si on ne specifie qu'un email, le mettre dans un tableau |
|
| 87 | - if (!is_array($emails)) { |
|
| 88 | - $emails = explode(',', $emails); |
|
| 89 | - } |
|
| 90 | - |
|
| 91 | - notifications_nettoyer_emails($emails); |
|
| 92 | - |
|
| 93 | - // tester si le mail est deja en html |
|
| 94 | - if ( |
|
| 95 | - strpos($texte, '<') !== false // eviter les tests suivants si possible |
|
| 96 | - and $ttrim = trim($texte) |
|
| 97 | - and substr($ttrim, 0, 1) == '<' |
|
| 98 | - and substr($ttrim, -1, 1) == '>' |
|
| 99 | - and stripos($ttrim, '</html>') !== false |
|
| 100 | - ) { |
|
| 101 | - if (!strlen($sujet)) { |
|
| 102 | - // dans ce cas on ruse un peu : extraire le sujet du title |
|
| 103 | - if (preg_match(',<title>(.*)</title>,Uims', $texte, $m)) { |
|
| 104 | - $sujet = $m[1]; |
|
| 105 | - } else { |
|
| 106 | - // fallback, on prend le body si on le trouve |
|
| 107 | - if (preg_match(',<body[^>]*>(.*)</body>,Uims', $texte, $m)) { |
|
| 108 | - $ttrim = $m[1]; |
|
| 109 | - } |
|
| 110 | - |
|
| 111 | - // et on extrait la premiere ligne de vrai texte... |
|
| 112 | - // nettoyer le html et les retours chariots |
|
| 113 | - $ttrim = textebrut($ttrim); |
|
| 114 | - $ttrim = str_replace("\r\n", "\r", $ttrim); |
|
| 115 | - $ttrim = str_replace("\r", "\n", $ttrim); |
|
| 116 | - // decouper |
|
| 117 | - $ttrim = explode("\n", trim($ttrim)); |
|
| 118 | - // extraire la premiere ligne de texte brut |
|
| 119 | - $sujet = array_shift($ttrim); |
|
| 120 | - } |
|
| 121 | - } |
|
| 122 | - |
|
| 123 | - // si besoin on ajoute le content-type dans les headers |
|
| 124 | - if (stripos($headers, 'Content-Type') === false) { |
|
| 125 | - $headers .= "Content-Type: text/html\n"; |
|
| 126 | - } |
|
| 127 | - } |
|
| 128 | - |
|
| 129 | - // si le sujet est vide, extraire la premiere ligne du corps |
|
| 130 | - // du mail qui est donc du texte |
|
| 131 | - if (!strlen($sujet)) { |
|
| 132 | - // nettoyer un peu les retours chariots |
|
| 133 | - $texte = str_replace("\r\n", "\r", $texte); |
|
| 134 | - $texte = str_replace("\r", "\n", $texte); |
|
| 135 | - // decouper |
|
| 136 | - $texte = explode("\n", trim($texte)); |
|
| 137 | - // extraire la premiere ligne |
|
| 138 | - $sujet = array_shift($texte); |
|
| 139 | - $texte = trim(implode("\n", $texte)); |
|
| 140 | - } |
|
| 141 | - |
|
| 142 | - $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); |
|
| 143 | - foreach ($emails as $email) { |
|
| 144 | - // passer dans un pipeline qui permet un ajout eventuel |
|
| 145 | - // (url de suivi des notifications par exemple) |
|
| 146 | - $envoi = pipeline( |
|
| 147 | - 'notifications_envoyer_mails', |
|
| 148 | - [ |
|
| 149 | - 'email' => $email, |
|
| 150 | - 'sujet' => $sujet, |
|
| 151 | - 'texte' => $texte, |
|
| 152 | - 'from' => $from, |
|
| 153 | - 'headers' => $headers, |
|
| 154 | - ] |
|
| 155 | - ); |
|
| 156 | - $email = $envoi['email']; |
|
| 157 | - |
|
| 158 | - job_queue_add( |
|
| 159 | - 'envoyer_mail', |
|
| 160 | - ">$email : " . $envoi['sujet'], |
|
| 161 | - [$email, $envoi['sujet'], $envoi['texte'], $envoi['from'], $envoi['headers']], |
|
| 162 | - 'inc/' |
|
| 163 | - ); |
|
| 164 | - } |
|
| 81 | + // rien a faire si pas de texte ! |
|
| 82 | + if (!strlen($texte)) { |
|
| 83 | + return; |
|
| 84 | + } |
|
| 85 | + |
|
| 86 | + // si on ne specifie qu'un email, le mettre dans un tableau |
|
| 87 | + if (!is_array($emails)) { |
|
| 88 | + $emails = explode(',', $emails); |
|
| 89 | + } |
|
| 90 | + |
|
| 91 | + notifications_nettoyer_emails($emails); |
|
| 92 | + |
|
| 93 | + // tester si le mail est deja en html |
|
| 94 | + if ( |
|
| 95 | + strpos($texte, '<') !== false // eviter les tests suivants si possible |
|
| 96 | + and $ttrim = trim($texte) |
|
| 97 | + and substr($ttrim, 0, 1) == '<' |
|
| 98 | + and substr($ttrim, -1, 1) == '>' |
|
| 99 | + and stripos($ttrim, '</html>') !== false |
|
| 100 | + ) { |
|
| 101 | + if (!strlen($sujet)) { |
|
| 102 | + // dans ce cas on ruse un peu : extraire le sujet du title |
|
| 103 | + if (preg_match(',<title>(.*)</title>,Uims', $texte, $m)) { |
|
| 104 | + $sujet = $m[1]; |
|
| 105 | + } else { |
|
| 106 | + // fallback, on prend le body si on le trouve |
|
| 107 | + if (preg_match(',<body[^>]*>(.*)</body>,Uims', $texte, $m)) { |
|
| 108 | + $ttrim = $m[1]; |
|
| 109 | + } |
|
| 110 | + |
|
| 111 | + // et on extrait la premiere ligne de vrai texte... |
|
| 112 | + // nettoyer le html et les retours chariots |
|
| 113 | + $ttrim = textebrut($ttrim); |
|
| 114 | + $ttrim = str_replace("\r\n", "\r", $ttrim); |
|
| 115 | + $ttrim = str_replace("\r", "\n", $ttrim); |
|
| 116 | + // decouper |
|
| 117 | + $ttrim = explode("\n", trim($ttrim)); |
|
| 118 | + // extraire la premiere ligne de texte brut |
|
| 119 | + $sujet = array_shift($ttrim); |
|
| 120 | + } |
|
| 121 | + } |
|
| 122 | + |
|
| 123 | + // si besoin on ajoute le content-type dans les headers |
|
| 124 | + if (stripos($headers, 'Content-Type') === false) { |
|
| 125 | + $headers .= "Content-Type: text/html\n"; |
|
| 126 | + } |
|
| 127 | + } |
|
| 128 | + |
|
| 129 | + // si le sujet est vide, extraire la premiere ligne du corps |
|
| 130 | + // du mail qui est donc du texte |
|
| 131 | + if (!strlen($sujet)) { |
|
| 132 | + // nettoyer un peu les retours chariots |
|
| 133 | + $texte = str_replace("\r\n", "\r", $texte); |
|
| 134 | + $texte = str_replace("\r", "\n", $texte); |
|
| 135 | + // decouper |
|
| 136 | + $texte = explode("\n", trim($texte)); |
|
| 137 | + // extraire la premiere ligne |
|
| 138 | + $sujet = array_shift($texte); |
|
| 139 | + $texte = trim(implode("\n", $texte)); |
|
| 140 | + } |
|
| 141 | + |
|
| 142 | + $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); |
|
| 143 | + foreach ($emails as $email) { |
|
| 144 | + // passer dans un pipeline qui permet un ajout eventuel |
|
| 145 | + // (url de suivi des notifications par exemple) |
|
| 146 | + $envoi = pipeline( |
|
| 147 | + 'notifications_envoyer_mails', |
|
| 148 | + [ |
|
| 149 | + 'email' => $email, |
|
| 150 | + 'sujet' => $sujet, |
|
| 151 | + 'texte' => $texte, |
|
| 152 | + 'from' => $from, |
|
| 153 | + 'headers' => $headers, |
|
| 154 | + ] |
|
| 155 | + ); |
|
| 156 | + $email = $envoi['email']; |
|
| 157 | + |
|
| 158 | + job_queue_add( |
|
| 159 | + 'envoyer_mail', |
|
| 160 | + ">$email : " . $envoi['sujet'], |
|
| 161 | + [$email, $envoi['sujet'], $envoi['texte'], $envoi['from'], $envoi['headers']], |
|
| 162 | + 'inc/' |
|
| 163 | + ); |
|
| 164 | + } |
|
| 165 | 165 | } |
| 166 | 166 | |
| 167 | 167 | /** |
@@ -177,10 +177,10 @@ discard block |
||
| 177 | 177 | * @return string |
| 178 | 178 | */ |
| 179 | 179 | function email_notification_objet($id_objet, $type_objet, $modele) { |
| 180 | - $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); // pour nettoyer_titre_email |
|
| 181 | - $id_type = id_table_objet($type_objet); |
|
| 180 | + $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); // pour nettoyer_titre_email |
|
| 181 | + $id_type = id_table_objet($type_objet); |
|
| 182 | 182 | |
| 183 | - return recuperer_fond($modele, [$id_type => $id_objet, 'id' => $id_objet]); |
|
| 183 | + return recuperer_fond($modele, [$id_type => $id_objet, 'id' => $id_objet]); |
|
| 184 | 184 | } |
| 185 | 185 | |
| 186 | 186 | /** |
@@ -195,7 +195,7 @@ discard block |
||
| 195 | 195 | * @return string |
| 196 | 196 | */ |
| 197 | 197 | function email_notification_article($id_article, $modele) { |
| 198 | - $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); // pour nettoyer_titre_email |
|
| 198 | + $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); // pour nettoyer_titre_email |
|
| 199 | 199 | |
| 200 | - return recuperer_fond($modele, ['id_article' => $id_article]); |
|
| 200 | + return recuperer_fond($modele, ['id_article' => $id_article]); |
|
| 201 | 201 | } |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Mail |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | |
@@ -31,27 +31,27 @@ discard block |
||
| 31 | 31 | * - la normalisation de la dernière adresse donnée sinon |
| 32 | 32 | **/ |
| 33 | 33 | function inc_email_valide_dist($adresses) { |
| 34 | - // eviter d'injecter n'importe quoi dans preg_match |
|
| 35 | - if (!is_string($adresses)) { |
|
| 36 | - return false; |
|
| 37 | - } |
|
| 38 | - |
|
| 39 | - // Si c'est un spammeur autant arreter tout de suite |
|
| 40 | - if (preg_match(",[\n\r].*(MIME|multipart|Content-),i", $adresses)) { |
|
| 41 | - spip_log("Tentative d'injection de mail : $adresses"); |
|
| 42 | - |
|
| 43 | - return false; |
|
| 44 | - } |
|
| 45 | - |
|
| 46 | - foreach (explode(',', $adresses) as $v) { |
|
| 47 | - // nettoyer certains formats |
|
| 48 | - // "Marie Toto <[email protected]>" |
|
| 49 | - $adresse = trim(preg_replace(',^[^<>"]*<([^<>"]+)>$,i', "\\1", $v)); |
|
| 50 | - // RFC 822 |
|
| 51 | - if (!preg_match('#^[^()<>@,;:\\"/[:space:]]+(@([-_0-9a-z]+\.)*[-_0-9a-z]+)$#i', $adresse)) { |
|
| 52 | - return false; |
|
| 53 | - } |
|
| 54 | - } |
|
| 55 | - |
|
| 56 | - return $adresse; |
|
| 34 | + // eviter d'injecter n'importe quoi dans preg_match |
|
| 35 | + if (!is_string($adresses)) { |
|
| 36 | + return false; |
|
| 37 | + } |
|
| 38 | + |
|
| 39 | + // Si c'est un spammeur autant arreter tout de suite |
|
| 40 | + if (preg_match(",[\n\r].*(MIME|multipart|Content-),i", $adresses)) { |
|
| 41 | + spip_log("Tentative d'injection de mail : $adresses"); |
|
| 42 | + |
|
| 43 | + return false; |
|
| 44 | + } |
|
| 45 | + |
|
| 46 | + foreach (explode(',', $adresses) as $v) { |
|
| 47 | + // nettoyer certains formats |
|
| 48 | + // "Marie Toto <[email protected]>" |
|
| 49 | + $adresse = trim(preg_replace(',^[^<>"]*<([^<>"]+)>$,i', "\\1", $v)); |
|
| 50 | + // RFC 822 |
|
| 51 | + if (!preg_match('#^[^()<>@,;:\\"/[:space:]]+(@([-_0-9a-z]+\.)*[-_0-9a-z]+)$#i', $adresse)) { |
|
| 52 | + return false; |
|
| 53 | + } |
|
| 54 | + } |
|
| 55 | + |
|
| 56 | + return $adresse; |
|
| 57 | 57 | } |