[ Index ] |
|
Code source de SPIP 1.8.3 |
1 <?php 2 3 /***************************************************************************\ 4 * SPIP, Systeme de publication pour l'internet * 5 * * 6 * Copyright (c) 2001-2005 * 7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * 8 * * 9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * 10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * 11 \***************************************************************************/ 12 13 // 14 // Ce fichier ne sera execute qu'une fois 15 if (defined("_ECRIRE_INC_SESSION")) return; 16 define("_ECRIRE_INC_SESSION", "1"); 17 18 19 /* 20 * Gestion de l'authentification par sessions 21 * a utiliser pour valider l'acces (bloquant) 22 * ou pour reconnaitre un utilisateur (non bloquant) 23 * 24 */ 25 26 $GLOBALS['auteur_session'] = ''; 27 28 29 // 30 // On verifie l'IP et le nom du navigateur 31 // 32 function hash_env() { 33 global $_SERVER; 34 return md5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']); 35 } 36 37 38 // 39 // Calcule le nom du fichier session 40 // 41 function fichier_session($id_session, $alea) { 42 if (ereg("^([0-9]+_)", $id_session, $regs)) 43 $id_auteur = $regs[1]; 44 return _DIR_SESSIONS . 'session_'.$id_auteur.md5($id_session.' '.$alea).'.php3'; 45 46 } 47 48 // 49 // Ajouter une session pour l'auteur specifie 50 // 51 function ajouter_session($auteur, $id_session) { 52 $fichier_session = fichier_session($id_session, lire_meta('alea_ephemere')); 53 $vars = array('id_auteur', 'nom', 'login', 'email', 'statut', 'lang', 'ip_change', 'hash_env'); 54 55 $texte = "<"."?php\n"; 56 reset($vars); 57 while (list(, $var) = each($vars)) { 58 $texte .= "\$GLOBALS['auteur_session']['$var'] = '".addslashes($auteur[$var])."';\n"; 59 } 60 $texte .= "?".">\n"; 61 62 if ($f = @fopen($fichier_session, "wb")) { 63 fputs($f, $texte); 64 fclose($f); 65 } else { 66 redirige_par_entete(lire_meta("adresse_site") . 67 "/spip_test_dirs.php3"); 68 } 69 } 70 71 // 72 // Verifier et inclure une session 73 // 74 function verifier_session($id_session) { 75 76 // Tester avec alea courant 77 $ok = false; 78 if ($id_session) { 79 $fichier_session = fichier_session($id_session, lire_meta('alea_ephemere')); 80 if (@file_exists($fichier_session)) { 81 include($fichier_session); 82 $ok = true; 83 } 84 else { 85 // Sinon, tester avec alea precedent 86 $fichier_session = fichier_session($id_session, lire_meta('alea_ephemere_ancien')); 87 if (@file_exists($fichier_session)) { 88 // Renouveler la session (avec l'alea courant) 89 include($fichier_session); 90 supprimer_session($id_session); 91 ajouter_session($GLOBALS['auteur_session'], $id_session); 92 $ok = true; 93 } 94 } 95 } 96 97 // marquer la session comme "ip-change" si le cas se presente 98 if ($ok AND (hash_env() != $GLOBALS['auteur_session']['hash_env']) AND !$GLOBALS['auteur_session']['ip_change']) { 99 $GLOBALS['auteur_session']['ip_change'] = true; 100 ajouter_session($GLOBALS['auteur_session'], $id_session); 101 } 102 103 return $ok; 104 } 105 106 // 107 // Supprimer une session 108 // 109 function supprimer_session($id_session) { 110 $fichier_session = fichier_session($id_session, lire_meta('alea_ephemere')); 111 if (@file_exists($fichier_session)) { 112 @unlink($fichier_session); 113 } 114 $fichier_session = fichier_session($id_session, lire_meta('alea_ephemere_ancien')); 115 if (@file_exists($fichier_session)) { 116 @unlink($fichier_session); 117 } 118 } 119 120 // 121 // Creer une session et retourne le cookie correspondant (a poser) 122 // 123 function creer_cookie_session($auteur) { 124 if ($id_auteur = $auteur['id_auteur']) { 125 $id_session = $id_auteur.'_'.md5(creer_uniqid()); 126 $auteur['hash_env'] = hash_env(); 127 ajouter_session($auteur, $id_session); 128 return $id_session; 129 } 130 } 131 132 // 133 // Creer un identifiant aleatoire 134 // 135 function creer_uniqid() { 136 static $seeded; 137 138 if (!$seeded) { 139 $seed = (double) (microtime() + 1) * time(); 140 mt_srand($seed); 141 srand($seed); 142 $seeded = true; 143 } 144 145 $s = mt_rand(); 146 if (!$s) $s = rand(); 147 return uniqid($s, 1); 148 } 149 150 151 // 152 // Cette fonction efface toutes les sessions appartenant a l'auteur 153 // On en profite pour effacer toutes les sessions creees il y a plus de 48 h 154 // 155 function zap_sessions ($id_auteur, $zap) { 156 157 // ne pas se zapper soi-meme 158 if ($s = $GLOBALS['spip_session']) 159 $fichier_session = fichier_session($s, lire_meta('alea_ephemere')); 160 161 $dir = opendir(_DIR_SESSIONS); 162 $t = time(); 163 while(($item = readdir($dir)) != '') { 164 $chemin = _DIR_SESSIONS . $item; 165 if (ereg("^session_([0-9]+_)?([a-z0-9]+)\.php3$", $item, $regs)) { 166 167 // Si c'est une vieille session, on jette 168 if (($t - filemtime($chemin)) > 48 * 3600) 169 @unlink($chemin); 170 171 // sinon voir si c'est une session du meme auteur 172 else if ($regs[1] == $id_auteur.'_') { 173 $zap_num ++; 174 if ($zap) 175 @unlink($chemin); 176 } 177 178 } 179 } 180 181 return $zap_num; 182 } 183 184 // 185 // reconnaitre un utilisateur authentifie en php_auth 186 // 187 function verifier_php_auth() { 188 global $_SERVER, $ignore_auth_http; 189 if ($_SERVER['PHP_AUTH_USER'] && $_SERVER['PHP_AUTH_PW'] 190 && !$ignore_auth_http) { 191 $login = addslashes($_SERVER['PHP_AUTH_USER']); 192 $result = spip_query("SELECT * FROM spip_auteurs WHERE login='$login'"); 193 $row = spip_fetch_array($result); 194 $auth_mdpass = md5($row['alea_actuel'] . $_SERVER['PHP_AUTH_PW']); 195 if ($auth_mdpass != $row['pass']) { 196 return false; 197 } else { 198 $GLOBALS['auteur_session']['id_auteur'] = $row['id_auteur']; 199 $GLOBALS['auteur_session']['nom'] = $row['nom']; 200 $GLOBALS['auteur_session']['login'] = $row['login']; 201 $GLOBALS['auteur_session']['email'] = $row['email']; 202 $GLOBALS['auteur_session']['statut'] = $row['statut']; 203 $GLOBALS['auteur_session']['lang'] = $row['lang']; 204 $GLOBALS['auteur_session']['hash_env'] = hash_env(); 205 return true; 206 } 207 } 208 } 209 210 // 211 // entete php_auth 212 // 213 function ask_php_auth($pb, $raison, $retour, $url='', $re='', $lien='') { 214 @Header("WWW-Authenticate: Basic realm=\"espace prive\""); 215 @Header("HTTP/1.0 401 Unauthorized"); 216 echo "<b>$pb</b><p>$raison</p>[<a href='./'>$retour</a>] ", 217 (!$url ? '' : 218 "[<a href='spip_cookie.php3?essai_auth_http=oui&$url'>$re</a>]"), 219 (!$lien ? '' : " [<a href='" . _DIR_RESTREINT_ABS . "'>"._T('login_espace_prive')."</a>]"); 220 exit; 221 } 222 223 // 224 // verifie si on a un cookie de session ou un auth_php correct 225 // et charge ses valeurs dans $GLOBALS['auteur_session'] 226 // 227 function verifier_visiteur() { 228 if (verifier_session($GLOBALS['_COOKIE']['spip_session'])) 229 return true; 230 if (verifier_php_auth()) 231 return true; 232 return false; 233 } 234 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Thu Feb 22 22:27:47 2007 | par Balluche grâce à PHPXref 0.7 |