3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
13 if (!defined("_ECRIRE_INC_VERSION")) return; #securite
15 include_spip('base/abstract_sql');
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'));
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})]
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]);
34 // http://doc.spip.org/@balise_LOGIN_PUBLIC_dyn
35 function balise_LOGIN_PUBLIC_dyn($url, $login) {
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
40 $url = str_replace('&', '&', self());
42 return login_explicite($login, $url, true
);
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;
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','','&');
55 $cible = parametre_url($cible, 'var_erreur', '', '&');
56 $cible = parametre_url($cible, 'var_login', '', '&');
58 if (ereg("[?&]url=([^&]*)", $action, $m))
59 $cible = rawurldecode($m[1]);
61 $cible = _DIR_RESTREINT
;
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');
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);
81 include_spip('inc/minipres');
82 return http_href($cible, _T('login_par_ici'));
85 return ''; # on est arrive on bon endroit, et logue'...
89 return login_pour_tous($login ?
$login : _request('var_login'), $cible, $action);
92 // http://doc.spip.org/@login_pour_tous
93 function login_pour_tous($login, $cible, $action) {
94 global $ignore_auth_http, $_SERVER, $_COOKIE;
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 = '';
104 // hack grossier pour changer le message en cas d'echec d'un visiteur(6forum) sur ecrire/
105 $echec_visiteur = _request('var_echec_visiteur')?
' ':'';
108 $pose_cookie = generer_url_public('spip_cookie');
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;
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']))
121 // Le login est memorise dans le cookie d'admin eventuel
123 if (ereg("^@(.*)$", $_COOKIE['spip_admin'], $regs))
125 } else if ($login == '-1')
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'");
135 $login_alt = $login; # afficher ce qu'on a tape
136 $login = $row['login'];
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)));
147 include_spip('inc/cookie');
148 spip_setcookie("spip_admin", "", time() - 3600);
150 // on laisse le menu decider de la langue
156 // afficher "erreur de mot de passe" si &var_erreur=pass
157 if (_request('var_erreur') == 'pass')
158 $erreur = _T('login_erreur_pass');
160 // Appeler le squelette formulaire_login
161 return array('formulaires/login', $GLOBALS['delais'],
163 array_map('texte_script', $row),
165 'action2' => ($login ?
$pose_cookie: $action),
169 'auth_http' => $auth_http,
170 'echec_cookie' => ($echec_cookie ?
' ' : ''),
171 'echec_visiteur' => $echec_visiteur,
173 'login_alt' => (isset($login_alt) ?
$login_alt : $login),
174 'self' => str_replace('&', '&', self())
181 // Bouton duree de connexion
183 // http://doc.spip.org/@filtre_rester_connecte
184 function filtre_rester_connecte($prefs) {
185 $prefs = unserialize(stripslashes($prefs));
186 return $prefs['cnx'] == 'perma' ?
' ' : '';