Commit | Line | Data |
---|---|---|
c495c100 P |
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; #securite | |
14 | ||
15 | include_spip('base/abstract_sql'); | |
16 | spip_connect(); | |
17 | ||
18 | // http://doc.spip.org/@balise_LOGIN_PUBLIC | |
19 | function balise_LOGIN_PUBLIC ($p, $nom='LOGIN_PUBLIC') { | |
20 | return calculer_balise_dynamique($p, $nom, array('url')); | |
21 | } | |
22 | ||
23 | # retourner: | |
24 | # 1. l'url collectee ci-dessus (args0) ou donnee en filtre (filtre0) | |
25 | # 2. l'eventuel parametre de la balise (args1) fournie par | |
26 | # calculer_balise_dynamique, en l'occurence le #LOGIN courant si l'on | |
27 | # programme une <boucle(AUTEURS)>[(#LOGIN_PUBLIC{#LOGIN})] | |
28 | ||
29 | // http://doc.spip.org/@balise_LOGIN_PUBLIC_stat | |
30 | function balise_LOGIN_PUBLIC_stat ($args, $filtres) { | |
31 | return array($filtres[0] ? $filtres[0] : $args[0], $args[1], $args[2]); | |
32 | } | |
33 | ||
34 | // http://doc.spip.org/@balise_LOGIN_PUBLIC_dyn | |
35 | function balise_LOGIN_PUBLIC_dyn($url, $login) { | |
36 | ||
37 | if (!$url # pas d'url passee en filtre ou dans le contexte | |
38 | AND !$url = _request('url') # ni d'url passee par l'utilisateur | |
39 | ){ | |
40 | $url = str_replace('&', '&', self()); | |
41 | } | |
42 | return login_explicite($login, $url, true); | |
43 | } | |
44 | ||
45 | // cette fonction est commune a la balise #LOGIN_PUBLIC et #LOGIN_PRIVE | |
46 | // elle doit accepter les visiteurs dans le premier cas, mais pas dans le second | |
47 | // http://doc.spip.org/@login_explicite | |
48 | function login_explicite($login, $cible, $accepter_visiteurs = false) { | |
49 | global $auteur_session; | |
50 | ||
51 | // passer $action dans parametre_url pour avoir une chance que $cible == $action | |
52 | // et pas faire de boulce infinie de redirection | |
53 | $action = parametre_url(str_replace('&', '&', self()),'var_dummy','','&'); | |
54 | if ($cible) { | |
55 | $cible = parametre_url($cible, 'var_erreur', '', '&'); | |
56 | $cible = parametre_url($cible, 'var_login', '', '&'); | |
57 | } else { | |
58 | if (ereg("[?&]url=([^&]*)", $action, $m)) | |
59 | $cible = rawurldecode($m[1]); | |
60 | else | |
61 | $cible = _DIR_RESTREINT ; | |
62 | } | |
63 | ||
64 | verifier_visiteur(); | |
65 | ||
66 | // Si on est connecte, envoyer vers la destination | |
67 | // sauf si on y est deja | |
68 | if ($auteur_session AND | |
69 | ($auteur_session['statut']=='0minirezo' | |
70 | OR $auteur_session['statut']=='1comite' | |
71 | OR ($accepter_visiteurs && ($auteur_session['statut']=='6forum')))) { | |
72 | $auth = charger_fonction('auth','inc'); | |
73 | $auth = $auth(); | |
74 | if (($auth==="") | |
75 | OR ($accepter_visiteurs && ($auth=='6forum'))) { | |
76 | if ($cible != $action) { | |
77 | if (!headers_sent() AND !$_GET['var_mode']) { | |
78 | include_spip('inc/headers'); | |
79 | redirige_par_entete($cible); | |
80 | } else { | |
81 | include_spip('inc/minipres'); | |
82 | return http_href($cible, _T('login_par_ici')); | |
83 | } | |
84 | } else | |
85 | return ''; # on est arrive on bon endroit, et logue'... | |
86 | } | |
87 | } | |
88 | ||
89 | return login_pour_tous($login ? $login : _request('var_login'), $cible, $action); | |
90 | } | |
91 | ||
92 | // http://doc.spip.org/@login_pour_tous | |
93 | function login_pour_tous($login, $cible, $action) { | |
94 | global $ignore_auth_http, $_SERVER, $_COOKIE; | |
95 | ||
96 | // en cas d'echec de cookie, inc_auth a renvoye vers le script de | |
97 | // pose de cookie ; s'il n'est pas la, c'est echec cookie | |
98 | // s'il est la, c'est probablement un bookmark sur bonjour=oui, | |
99 | // et pas un echec cookie. | |
100 | if (_request('var_echec_cookie')) | |
101 | $echec_cookie = ($_COOKIE['spip_session'] != 'test_echec_cookie'); | |
102 | else $echec_cookie = ''; | |
103 | ||
104 | // hack grossier pour changer le message en cas d'echec d'un visiteur(6forum) sur ecrire/ | |
105 | $echec_visiteur = _request('var_echec_visiteur')?' ':''; | |
106 | ||
107 | ||
108 | $pose_cookie = generer_url_public('spip_cookie'); | |
109 | $auth_http = ''; | |
110 | if ($echec_cookie AND !$ignore_auth_http) { | |
111 | if (($GLOBALS['flag_sapi_name'] | |
112 | AND eregi("apache", @php_sapi_name())) | |
113 | OR ereg("^Apache.* PHP", $_SERVER['SERVER_SOFTWARE'])) | |
114 | $auth_http = $pose_cookie; | |
115 | } | |
116 | // Attention dans le cas 'intranet' la proposition de se loger | |
117 | // par auth_http peut conduire a l'echec. | |
118 | if (isset($_SERVER['PHP_AUTH_USER']) AND isset($_SERVER['PHP_AUTH_PW'])) | |
119 | $auth_http = ''; | |
120 | ||
121 | // Le login est memorise dans le cookie d'admin eventuel | |
122 | if (!$login) { | |
123 | if (ereg("^@(.*)$", $_COOKIE['spip_admin'], $regs)) | |
124 | $login = $regs[1]; | |
125 | } else if ($login == '-1') | |
126 | $login = ''; | |
127 | ||
128 | $erreur = ''; | |
129 | if ($login) { | |
130 | $row = spip_abstract_fetsel('*', 'spip_auteurs', "login=" . _q($login)); | |
131 | // Retrouver ceux qui signent de leur nom ou email | |
132 | if (!$row AND !$GLOBALS['ldap_present']) { | |
133 | $row = spip_abstract_fetsel('*', 'spip_auteurs', "(nom = " . _q($login) . " OR email = " . _q($login) . ") AND login<>'' AND statut<>'5poubelle'"); | |
134 | if ($row) { | |
135 | $login_alt = $login; # afficher ce qu'on a tape | |
136 | $login = $row['login']; | |
137 | } | |
138 | } | |
139 | ||
140 | if ((!$row AND !$GLOBALS['ldap_present']) OR | |
141 | ($row['statut'] == '5poubelle') OR | |
142 | (($row['source'] == 'spip') AND $row['pass'] == '')) { | |
143 | $erreur = _T('login_identifiant_inconnu', | |
144 | array('login' => htmlspecialchars($login))); | |
145 | $row = array(); | |
146 | $login = ''; | |
147 | include_spip('inc/cookie'); | |
148 | spip_setcookie("spip_admin", "", time() - 3600); | |
149 | } else { | |
150 | // on laisse le menu decider de la langue | |
151 | unset($row['lang']); | |
152 | } | |
153 | } | |
154 | if (!$row) | |
155 | $row = array(); | |
156 | // afficher "erreur de mot de passe" si &var_erreur=pass | |
157 | if (_request('var_erreur') == 'pass') | |
158 | $erreur = _T('login_erreur_pass'); | |
159 | ||
160 | // Appeler le squelette formulaire_login | |
161 | return array('formulaires/login', $GLOBALS['delais'], | |
162 | array_merge( | |
163 | array_map('texte_script', $row), | |
164 | array( | |
165 | 'action2' => ($login ? $pose_cookie: $action), | |
166 | 'erreur' => $erreur, | |
167 | 'action' => $action, | |
168 | 'url' => $cible, | |
169 | 'auth_http' => $auth_http, | |
170 | 'echec_cookie' => ($echec_cookie ? ' ' : ''), | |
171 | 'echec_visiteur' => $echec_visiteur, | |
172 | 'login' => $login, | |
173 | 'login_alt' => (isset($login_alt) ? $login_alt : $login), | |
174 | 'self' => str_replace('&', '&', self()) | |
175 | ) | |
176 | ) | |
177 | ); | |
178 | ||
179 | } | |
180 | ||
181 | // Bouton duree de connexion | |
182 | ||
183 | // http://doc.spip.org/@filtre_rester_connecte | |
184 | function filtre_rester_connecte($prefs) { | |
185 | $prefs = unserialize(stripslashes($prefs)); | |
186 | return $prefs['cnx'] == 'perma' ? ' ' : ''; | |
187 | } | |
188 | ||
189 | ?> |