| [ Index ] |
|
Code source de SPIP 1.9.2c |
1 <?php 2 3 /***************************************************************************\ 4 * SPIP, Systeme de publication pour l'internet * 5 * * 6 * Copyright (c) 2001-2007 * 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 if (!defined("_ECRIRE_INC_VERSION")) return; 14 15 16 // 17 // Fonctions de gestion de l'acces restreint aux rubriques 18 // 19 20 // http://doc.spip.org/@acces_restreint_rubrique 21 function acces_restreint_rubrique($id_rubrique) { 22 global $connect_id_rubrique; 23 global $connect_statut; 24 25 return (isset($connect_id_rubrique[$id_rubrique])); 26 } 27 28 // http://doc.spip.org/@auteurs_article 29 function auteurs_article($id_article, $cond='') 30 { 31 return spip_query("SELECT id_auteur FROM spip_auteurs_articles WHERE id_article=$id_article". ($cond ? " AND $cond" : '')); 32 } 33 34 // Retourne les droits de publication d'un auteur selon le codage suivant: 35 // - le tableau de ses rubriques si c'est un admin restreint 36 // - 0 si c'est un admin de plein droit 37 // - la chaine indiquant son statut s'il n'est pas admin 38 39 // http://doc.spip.org/@auth_rubrique 40 function auth_rubrique($id_auteur, $statut) 41 { 42 if ($statut != '0minirezo') return $statut; 43 44 $result = spip_query("SELECT id_rubrique FROM spip_auteurs_rubriques WHERE id_auteur=$id_auteur AND id_rubrique!='0'"); 45 46 if (!spip_num_rows($result)) { 47 $GLOBALS['connect_toutes_rubriques'] = true; 48 return 0; 49 } 50 51 $rubriques = array(); 52 for (;;) { 53 $r = array(); 54 while ($row = spip_fetch_array($result)) { 55 $id_rubrique = $row['id_rubrique']; 56 $r[]= $rubriques[$id_rubrique] = $id_rubrique; 57 } 58 if (!$r) return $rubriques; 59 $r = join(',', $r); 60 61 $result = spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent IN ($r) AND id_rubrique NOT IN ($r)"); 62 } 63 } 64 65 // Un nouvel inscrit prend son statut definitif a la 1ere connexion 66 // Le statut a ete memorise dans bio (cf formulaire_inscription) 67 // Si vide se rabattre sur le mode d'inscription 68 // (compatibilite vieille version ou redac/forum etait mutuellement exclusif) 69 70 // http://doc.spip.org/@acces_statut 71 function acces_statut($id_auteur, $statut, $bio) 72 { 73 if ($statut == 'nouveau') { 74 $statut = ($bio ? ($bio == 'redac' ? '1comite' : '6forum'): 75 (($GLOBALS['meta']['accepter_inscriptions'] == 'oui') ? '1comite' : '6forum')); 76 spip_query("UPDATE spip_auteurs SET bio='', statut='$statut' WHERE id_auteur=$id_auteur"); 77 } 78 return $statut; 79 } 80 81 // Fonction d'authentification 82 // retourne -1 si authentification impossible a cause du serveur SQL 83 // retourne une chaine vide si authentification reussie 84 // retourne une chaine non vide expliquant l'echec sinon: 85 // "rien" ==> nouvel arrivant, envoyer le formulaire 86 // autre ==> statut incompatible 87 88 // http://doc.spip.org/@inc_auth_dist 89 function inc_auth_dist() { 90 global $auth_can_disconnect, $ignore_auth_http, $ignore_remote_user; 91 global $connect_id_auteur, $connect_login, $connect_quand; 92 global $connect_statut, $connect_toutes_rubriques, $connect_id_rubrique; 93 // 94 // Initialiser variables (eviter hacks par URL) 95 // 96 97 $connect_login = ''; 98 $connect_id_auteur = NULL; 99 $auth_can_disconnect = false; 100 101 // 102 // Recuperer les donnees d'identification 103 // 104 105 // Session valide en cours ? 106 if (isset($_COOKIE['spip_session'])) { 107 $session = charger_fonction('session', 'inc'); 108 if ($connect_id_auteur = $session()) { 109 $auth_can_disconnect = true; 110 } else unset($_COOKIE['spip_session']); 111 } 112 113 // Essayer auth http si significatif 114 // (ignorer les login d'intranet independants de spip) 115 if (!$ignore_auth_http AND !$connect_id_auteur) { 116 if (isset($_SERVER['PHP_AUTH_USER']) 117 AND isset($_SERVER['PHP_AUTH_PW'])) { 118 include_spip('inc/actions'); 119 if (verifier_php_auth()) { 120 $connect_login = $GLOBALS['auteur_session']['login']; 121 $_SERVER['PHP_AUTH_PW'] = ''; 122 $auth_can_disconnect = true; 123 } 124 } else if (isset($_SERVER['REMOTE_USER'])) 125 126 // Authentification .htaccess old style, car .htaccess semble 127 // souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW 128 129 $connect_login = $_SERVER['REMOTE_USER']; 130 } 131 132 $where = (is_numeric($connect_id_auteur)) ? 133 "id_auteur=$connect_id_auteur" : 134 (!$connect_login ? '' : "login=" . _q($connect_login)); 135 136 // pas authentifie par cookie ni http_auth: 137 138 if (!$where) return "inconnu"; 139 140 // Trouver les autres infos dans la table auteurs. 141 142 $result = @spip_query("SELECT *, UNIX_TIMESTAMP(en_ligne) AS quand FROM spip_auteurs WHERE $where AND statut!='5poubelle'"); 143 144 if (!$row = spip_fetch_array($result)) { 145 146 // il n'est PLUS connu. c'est SQL qui est desyncrho 147 auth_areconnecter($connect_login); 148 return -1; 149 } 150 151 // connu. Mais avec quels droits ? 152 $connect_quand = $row['quand']; 153 $connect_id_auteur = $row['id_auteur']; 154 $connect_statut = acces_statut($connect_id_auteur, $row['statut'], $row['bio']); 155 $droits = auth_rubrique($connect_id_auteur, $connect_statut); 156 157 // rajouter les sessions meme en mode auth_http 158 // pour permettre les connexions multiples et identifier les visiteurs 159 if (!$_COOKIE['spip_session']) { 160 $session = charger_fonction('session', 'inc'); 161 if ($spip_session = $session($row)) { 162 preg_match(',^[^/]*//[^/]*(.*)/$,', 163 url_de_base(), 164 $r); 165 include_spip('inc/cookie'); 166 spip_setcookie('spip_session', $spip_session, time() + 3600 * 24 * 14, $r[1]); 167 } 168 } 169 170 // Indiquer la connexion. A la minute pres ca suffit. 171 if ((time() - $connect_quand) >= 60) { 172 @spip_query("UPDATE spip_auteurs SET en_ligne=NOW() WHERE id_auteur='$connect_id_auteur'"); 173 } 174 175 // Le tableau global auteur_session contient toutes les infos pertinentes 176 // et a jour (tandis que $auteur_session peut avoir des valeurs un peu datees 177 // s'il est pris dans le fichier de session) 178 // Les plus utiles sont aussi dans les variables simples ci-dessus 179 $GLOBALS['auteur_session'] = array_merge($GLOBALS['auteur_session'], $row); 180 // au cas ou : ne pas memoriser les champs sensibles 181 unset($GLOBALS['auteur_session']['pass']); 182 unset($GLOBALS['auteur_session']['htpass']); 183 unset($GLOBALS['auteur_session']['alea_actuel']); 184 unset($GLOBALS['auteur_session']['alea_futur']); 185 186 if (is_string($droits)) { 187 // ordres mineurs: redac, visiteur ou indefini 188 if ($droits != '1comite') return $droits; 189 } elseif (is_array($droits)) 190 $connect_id_rubrique = $droits; 191 else $connect_toutes_rubriques = true; 192 193 $connect_login = $row['login']; 194 // vide = pas de message d'erreur (cf exit(0) Unix) 195 return ""; 196 } 197 198 // Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui 199 // C'est soit parce que le serveur MySQL ne repond pas, 200 // soit parce que la table des auteurs a changee (restauration etc) 201 // Pas la peine d'insister. Envoyer un message clair au client. 202 203 // http://doc.spip.org/@auth_areconnecter 204 function auth_areconnecter($auth_login) 205 { 206 include_spip('inc/minipres'); 207 if (!spip_connect()) { 208 spip_log("Erreur base de donnees"); 209 210 echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'). "<p><tt>".spip_sql_errno()." ".spip_sql_error()."</tt></p>"); 211 } else { 212 echo minipres(_T('avis_erreur_connexion'), "<br /><br /><p>" . _T('texte_inc_auth_1', array('auth_login' => $auth_login)). " <a href='". generer_url_action('logout', "logout=prive"). "'>". _T('texte_inc_auth_2'). "</a>"._T('texte_inc_auth_3')); 213 } 214 } 215 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
| Généré le : Wed Nov 21 10:20:27 2007 | par Balluche grâce à PHPXref 0.7 |
|