4 |
david |
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 |
include ("ecrire/inc_version.php3");
|
|
|
15 |
include_ecrire ("inc_session.php3");
|
|
|
16 |
|
|
|
17 |
|
|
|
18 |
// gerer l'auth http
|
|
|
19 |
function auth_http($url, $essai_auth_http) {
|
|
|
20 |
global $_SERVER;
|
|
|
21 |
if ($essai_auth_http == 'oui') {
|
|
|
22 |
if (verifier_php_auth())
|
|
|
23 |
redirige_par_entete($url);
|
|
|
24 |
else {
|
|
|
25 |
$url = quote_amp(urlencode($url));
|
|
|
26 |
ask_php_auth(_T('login_connexion_refusee'),
|
|
|
27 |
_T('login_login_pass_incorrect'), _T('login_retour_site'),
|
|
|
28 |
"url=$url", _T('login_nouvelle_tentative'),
|
|
|
29 |
(ereg(_DIR_RESTREINT_ABS, $url)));
|
|
|
30 |
exit;
|
|
|
31 |
}
|
|
|
32 |
}
|
|
|
33 |
// si demande logout auth_http
|
|
|
34 |
else if ($essai_auth_http == 'logout') {
|
|
|
35 |
ask_php_auth(_T('login_deconnexion_ok'),
|
|
|
36 |
_T('login_verifiez_navigateur'), _T('login_retour_public'),
|
|
|
37 |
"redirect="._DIR_RESTREINT_ABS, _T('login_test_navigateur'), true);
|
|
|
38 |
exit;
|
|
|
39 |
}
|
|
|
40 |
}
|
|
|
41 |
|
|
|
42 |
// rejoue le cookie pour renouveler spip_session
|
|
|
43 |
if ($change_session == 'oui') {
|
|
|
44 |
if (verifier_session($spip_session)) {
|
|
|
45 |
// Attention : seul celui qui a le bon IP a le droit de rejouer,
|
|
|
46 |
// ainsi un eventuel voleur de cookie ne pourrait pas deconnecter
|
|
|
47 |
// sa victime, mais se ferait deconnecter par elle.
|
|
|
48 |
if ($auteur_session['hash_env'] == hash_env()) {
|
|
|
49 |
$auteur_session['ip_change'] = false;
|
|
|
50 |
$cookie = creer_cookie_session($auteur_session);
|
|
|
51 |
supprimer_session($spip_session);
|
|
|
52 |
spip_setcookie('spip_session', $cookie);
|
|
|
53 |
}
|
|
|
54 |
@header('Content-Type: image/gif');
|
|
|
55 |
@header('Expires: 0');
|
|
|
56 |
@header("Cache-Control: no-store, no-cache, must-revalidate");
|
|
|
57 |
@header('Pragma: no-cache');
|
|
|
58 |
@header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
|
|
|
59 |
@readfile(_DIR_IMG_PACK . 'rien.gif');
|
|
|
60 |
exit;
|
|
|
61 |
}
|
|
|
62 |
}
|
|
|
63 |
|
|
|
64 |
if ($url) $url = urldecode($url);
|
|
|
65 |
|
|
|
66 |
// tentative de connexion en auth_http
|
|
|
67 |
if ($essai_auth_http AND !$ignore_auth_http) {
|
|
|
68 |
auth_http(($url ? $url : _DIR_RESTREINT_ABS), $essai_auth_http);
|
|
|
69 |
exit;
|
|
|
70 |
}
|
|
|
71 |
|
|
|
72 |
// cas particulier, logout dans l'espace public
|
|
|
73 |
if ($logout_public) {
|
|
|
74 |
$logout = $logout_public;
|
|
|
75 |
if (!$url)
|
|
|
76 |
$url = 'index.php3';
|
|
|
77 |
}
|
|
|
78 |
// tentative de logout
|
|
|
79 |
if ($logout) {
|
|
|
80 |
verifier_visiteur();
|
|
|
81 |
if ($auteur_session['login'] == $logout) {
|
|
|
82 |
spip_query("UPDATE spip_auteurs SET en_ligne = DATE_SUB(NOW(),INTERVAL 6 MINUTE) WHERE id_auteur = ".$auteur_session['id_auteur']);
|
|
|
83 |
if ($spip_session) {
|
|
|
84 |
zap_sessions($auteur_session['id_auteur'], true);
|
|
|
85 |
spip_setcookie('spip_session', $spip_session, time() - 3600 * 24);
|
|
|
86 |
}
|
|
|
87 |
|
|
|
88 |
if ($_SERVER['PHP_AUTH_USER']
|
|
|
89 |
AND !$ignore_auth_http
|
|
|
90 |
AND verifier_php_auth()) {
|
|
|
91 |
auth_http(($url ? $url : _DIR_RESTREINT_ABS), 'logout');
|
|
|
92 |
}
|
|
|
93 |
unset ($auteur_session);
|
|
|
94 |
}
|
|
|
95 |
|
|
|
96 |
redirige_par_entete($url ? $url : "spip_login.php3");
|
|
|
97 |
}
|
|
|
98 |
|
|
|
99 |
// en cas de login sur bonjour=oui, on tente de poser un cookie
|
|
|
100 |
// puis de passer a spip_login qui diagnostiquera l'echec de cookie
|
|
|
101 |
// le cas echeant.
|
|
|
102 |
if ($test_echec_cookie == 'oui') {
|
|
|
103 |
spip_setcookie('spip_session', 'test_echec_cookie');
|
|
|
104 |
redirige_par_entete("spip_login.php3?var_echec_cookie=oui&url="
|
|
|
105 |
. ($url ? $url : _DIR_RESTREINT_ABS));
|
|
|
106 |
}
|
|
|
107 |
|
|
|
108 |
// Tentative de login
|
|
|
109 |
unset ($cookie_session);
|
|
|
110 |
$redirect = ($url ? $url : _DIR_RESTREINT_ABS);
|
|
|
111 |
if ($essai_login == "oui") {
|
|
|
112 |
// Recuperer le login en champ hidden
|
|
|
113 |
if ($session_login_hidden AND !$session_login)
|
|
|
114 |
$session_login = $session_login_hidden;
|
|
|
115 |
|
|
|
116 |
$login = $session_login;
|
|
|
117 |
$pass = $session_password;
|
|
|
118 |
|
|
|
119 |
// Essayer differentes methodes d'authentification
|
|
|
120 |
$auths = array('spip');
|
|
|
121 |
include_local(_FILE_CONNECT); // pour savoir si ldap est present
|
|
|
122 |
if ($ldap_present) $auths[] = 'ldap';
|
|
|
123 |
$ok = false;
|
|
|
124 |
foreach ($auths as $nom_auth) {
|
|
|
125 |
include_ecrire("inc_auth_".$nom_auth.".php3");
|
|
|
126 |
$classe_auth = "Auth_".$nom_auth;
|
|
|
127 |
$auth = new $classe_auth;
|
|
|
128 |
if ($auth->init()) {
|
|
|
129 |
// Essayer les mots de passe md5
|
|
|
130 |
$ok = $auth->verifier_challenge_md5($login, $session_password_md5, $next_session_password_md5);
|
|
|
131 |
// Sinon essayer avec le mot de passe en clair
|
|
|
132 |
if (!$ok && $session_password) $ok = $auth->verifier($login, $session_password);
|
|
|
133 |
if ($ok) { $auth->lire(); break; }
|
|
|
134 |
}
|
|
|
135 |
}
|
|
|
136 |
|
|
|
137 |
// Si la connexion a reussi
|
|
|
138 |
if ($ok) {
|
|
|
139 |
// Nouveau redacteur ou visiteur inscrit par mail :
|
|
|
140 |
// 'nouveau' -> '1comite' ou '6forum'
|
|
|
141 |
// Si LDAP : importer l'utilisateur vers la base SPIP
|
|
|
142 |
$auth->activer();
|
|
|
143 |
|
|
|
144 |
if ($auth->login AND $auth->statut == '0minirezo') // force le cookie pour les admins
|
|
|
145 |
$cookie_admin = "@".$auth->login;
|
|
|
146 |
|
|
|
147 |
// On est connecte : recuperer les donnees auteurs
|
|
|
148 |
// poser le cookie session, puis le cas echeant
|
|
|
149 |
// verifier que le statut correspond au minimum requis,
|
|
|
150 |
$query = "SELECT * FROM spip_auteurs WHERE login='".addslashes($auth->login)."'";
|
|
|
151 |
$result = spip_query($query);
|
|
|
152 |
if ($row_auteur = spip_fetch_array($result)) {
|
|
|
153 |
$cookie_session = creer_cookie_session($row_auteur);
|
|
|
154 |
} else
|
|
|
155 |
$ok = false;
|
|
|
156 |
|
|
|
157 |
// Si on se connecte dans l'espace prive, ajouter "bonjour" (inutilise)
|
|
|
158 |
if ($ok AND ereg(_DIR_RESTREINT_ABS, $redirect)) {
|
|
|
159 |
$redirect .= (strpos($redirect, "?") ? "&" : "?") . 'bonjour=oui';
|
|
|
160 |
}
|
|
|
161 |
}
|
|
|
162 |
|
|
|
163 |
if (!$ok) {
|
|
|
164 |
if (ereg(_DIR_RESTREINT_ABS, $redirect))
|
|
|
165 |
$redirect = "spip_login.php3";
|
|
|
166 |
$redirect .= (strpos($redirect, "?") ? "&" : "?") . "var_login=$login";
|
|
|
167 |
if ($session_password || $session_password_md5)
|
|
|
168 |
$redirect .= '&var_erreur=pass';
|
|
|
169 |
$redirect .= '&url=' . urlencode($url);
|
|
|
170 |
}
|
|
|
171 |
}
|
|
|
172 |
|
|
|
173 |
// cookie d'admin ?
|
|
|
174 |
if ($cookie_admin == "non") {
|
|
|
175 |
if (!$retour)
|
|
|
176 |
$retour = 'spip_login.php3?var_url='.urlencode($url);
|
|
|
177 |
|
|
|
178 |
spip_setcookie('spip_admin', $spip_admin, time() - 3600 * 24);
|
|
|
179 |
$redirect = ereg_replace("([?&])var_login=[^&]*", '\1', urldecode($retour));
|
|
|
180 |
$redirect .= (strpos($redirect, "?") ? "&" : "?") . "var_login=-1";
|
|
|
181 |
}
|
|
|
182 |
else if ($cookie_admin AND $spip_admin != $cookie_admin) {
|
|
|
183 |
spip_setcookie('spip_admin', $cookie_admin, time() + 3600 * 24 * 14);
|
|
|
184 |
}
|
|
|
185 |
|
|
|
186 |
// cookie de session ?
|
|
|
187 |
if ($cookie_session) {
|
|
|
188 |
if ($session_remember == 'oui')
|
|
|
189 |
spip_setcookie('spip_session', $cookie_session, time() + 3600 * 24 * 14);
|
|
|
190 |
else
|
|
|
191 |
spip_setcookie('spip_session', $cookie_session);
|
|
|
192 |
|
|
|
193 |
$prefs = ($row_auteur['prefs']) ? unserialize($row_auteur['prefs']) : array();
|
|
|
194 |
$prefs['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
|
|
|
195 |
spip_query ("UPDATE spip_auteurs SET prefs = '".addslashes(serialize($prefs))."' WHERE id_auteur = ".$row_auteur['id_auteur']);
|
|
|
196 |
|
|
|
197 |
}
|
|
|
198 |
|
|
|
199 |
// changement de langue espace public
|
|
|
200 |
if ($var_lang) {
|
|
|
201 |
include_ecrire('inc_lang.php3');
|
|
|
202 |
|
|
|
203 |
if (changer_langue($var_lang)) {
|
|
|
204 |
spip_setcookie('spip_lang', $var_lang, time() + 365 * 24 * 3600);
|
|
|
205 |
$redirect = ereg_replace("[?&]lang=[^&]*", '', $redirect);
|
|
|
206 |
$redirect .= (strpos($redirect, "?") ? "&" : "?") . "lang=$var_lang";
|
|
|
207 |
}
|
|
|
208 |
}
|
|
|
209 |
|
|
|
210 |
// changer de langue espace prive (ou login)
|
|
|
211 |
if ($var_lang_ecrire) {
|
|
|
212 |
include_ecrire('inc_lang.php3');
|
|
|
213 |
verifier_visiteur();
|
|
|
214 |
|
|
|
215 |
if (changer_langue($var_lang_ecrire)) {
|
|
|
216 |
spip_setcookie('spip_lang_ecrire', $var_lang_ecrire, time() + 365 * 24 * 3600);
|
|
|
217 |
spip_setcookie('spip_lang', $var_lang_ecrire, time() + 365 * 24 * 3600);
|
|
|
218 |
|
|
|
219 |
if (_FILE_CONNECT) {
|
|
|
220 |
include_ecrire('inc_admin.php3');
|
|
|
221 |
if (verifier_action_auteur('var_lang_ecrire', $valeur, $id_auteur)) {
|
|
|
222 |
spip_query ("UPDATE spip_auteurs SET lang = '".addslashes($var_lang_ecrire)."' WHERE id_auteur = ".$id_auteur);
|
|
|
223 |
$auteur_session['lang'] = $var_lang_ecrire;
|
|
|
224 |
ajouter_session($auteur_session, $spip_session); // enregistrer dans le fichier de session
|
|
|
225 |
}
|
|
|
226 |
}
|
|
|
227 |
|
|
|
228 |
$redirect = ereg_replace("[?&]lang=[^&]*", '', $redirect);
|
|
|
229 |
$redirect .= (strpos($redirect, "?") ? "&" : "?") . "lang=$var_lang_ecrire";
|
|
|
230 |
}
|
|
|
231 |
}
|
|
|
232 |
|
|
|
233 |
// Redirection
|
|
|
234 |
// Sous Apache, les cookies avec une redirection fonctionnent
|
|
|
235 |
// Sinon, on fait un refresh HTTP
|
|
|
236 |
|
|
|
237 |
if (ereg("^Apache", $SERVER_SOFTWARE)) {
|
|
|
238 |
redirige_par_entete($redirect);
|
|
|
239 |
}
|
|
|
240 |
else {
|
|
|
241 |
@header("Refresh: 0; url=" . $redirect);
|
|
|
242 |
echo "<html><head>";
|
|
|
243 |
echo "<meta http-equiv='Refresh' content='0; url=".$redirect."'>";
|
|
|
244 |
echo "</head>\n";
|
|
|
245 |
echo "<body><a href='".$redirect."'>"._T('navigateur_pas_redirige')."</a></body></html>";
|
|
|
246 |
}
|
|
|
247 |
|
|
|
248 |
?>
|