source: spip-zone/_plugins_/plugin-thelia/formulaires/login.php @ 88169

Last change on this file since 88169 was 88169, checked in by cedric@…, 5 years ago

Indentation et suppresion du ?> final

File size: 9.5 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2009                                                *
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
13if (!defined("_ECRIRE_INC_VERSION")) return;  #securite
14
15include_spip('base/abstract_sql');
16
17function is_url_prive($cible){
18        $parse = parse_url($cible);
19        return strncmp(substr($parse['path'], -strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS))==0;
20}
21
22function formulaires_login_charger_dist($cible = "", $login = "", $prive = null){
23        $erreur = _request('var_erreur');
24
25        if (!$login) $login = _request('var_login');
26        if (!$login){
27                if (isset($_COOKIE['spip_admin'])
28                        AND preg_match(",^@(.*)$,", $_COOKIE['spip_admin'], $regs)
29                )
30                        $login = $regs[1];
31        }
32
33        $row = informer_login($login);
34
35        // Construire l'environnement du squelette
36        // Ne pas proposer de "rester connecte quelques jours"
37        // si la duree de l'alea est inferieure a 12 h (valeur par defaut)
38
39        $valeurs = array(
40                'var_login' => $login,
41                'editable' => !$row,
42                'cnx' => $row['cnx'],
43                'auth_http' => login_auth_http(),
44                'rester_connecte' => ((_RENOUVELLE_ALEA<12*3600) ? '' : ' '),
45                '_logo' => $row['logo'],
46                '_alea_actuel' => isset($row['alea_actuel']) ? $row['alea_actuel'] : '',
47                '_alea_futur' => isset($row['alea_futur']) ? $row['alea_futur'] : '',
48                '_hidden' => '<input type="hidden" name="session_password_md5" value="" /><input type="hidden" name="next_session_password_md5" value="" />'
49        );
50
51        if ($erreur OR !$GLOBALS['visiteur_session']['id_auteur'])
52                $valeurs['editable'] = true;
53
54        if (is_null($prive) ? is_url_prive($cible) : $prive){
55                include_spip('inc/autoriser');
56                $loge = autoriser('ecrire');
57        } else  $loge = ($GLOBALS['visiteur_session']['auth']!='');
58
59        // Si on est connecte, appeler traiter()
60        // et lancer la redirection si besoin
61        if (!$valeurs['editable'] AND $loge){
62                $traiter = charger_fonction('traiter', 'formulaires/login');
63                $res = $traiter($cible, $login, $prive);
64                $valeurs = array_merge($valeurs, $res);
65
66                if ($res['redirect']){
67                        include_spip('inc/headers');
68                        $m = redirige_formulaire($res['redirect']);
69                        # quand la redirection 302 ci-dessus ne fonctionne pas
70                        $valeurs['_deja_loge'] =
71                                "<a href='$cible'>" . _T('login_par_ici') . "</a>$m";
72                }
73        }
74        // en cas d'echec de cookie, inc_auth a renvoye vers le script de
75        // pose de cookie ; s'il n'est pas la, c'est echec cookie
76        // s'il est la, c'est probablement un bookmark sur bonjour=oui,
77        // et pas un echec cookie.
78        if ($erreur=='cookie') $valeurs['echec_cookie'] = ' ';
79        elseif ($erreur) {
80                // une erreur d'un SSO indique dans la redirection vers ici
81                // mais il faut se proteger de toute tentative d'injection malveilante
82                include_spip('inc/texte');
83                $valeurs['message_erreur'] = safehtml($erreur);
84        }
85
86        return $valeurs;
87}
88
89// Cette fonction sert a 2 squelettes: login et informer_auteur
90// Ce dernier transmet le tableau ci-dessous a la fonction JS informer_auteur
91// Il est invoque par la fonction JS actualise_auteur via la globale JS
92// page_auteur=#URL_PAGE{informer_auteur} dans le squelette login
93// N'y aurait-il pas plus simple ?
94
95// http://doc.spip.org/@informer_login
96function informer_login($login){
97        if (!$login) return array();
98        $row = retrouver_login($login);
99        if (!$row) return array();
100        // desactiver le hash md5 si pas auteur spip ?
101        if ($row['source']!=='spip'){
102                $row['alea_actuel'] = '';
103                $row['alea_futur'] = '';
104        }
105        $prefs = unserialize($row['prefs']);
106        $row['cnx'] = ($prefs['cnx']=='perma') ? '1' : '0';
107        $row['logo'] = recuperer_fond('formulaires/inc-logo_auteur', $row);
108        unset($row['prefs']);
109        unset($row['source']);
110        verifier_visiteur();
111        return $row;
112}
113
114// Gerer le cas ou un utilisateur ne souhaite pas de cookie
115// on propose alors un formulaire pour s'authentifier via http
116
117function login_auth_http(){
118        if (!$GLOBALS['ignore_auth_http']
119                AND _request('var_erreur')=='cookie'
120                AND $_COOKIE['spip_session']!='test_echec_cookie'
121                AND (($GLOBALS['flag_sapi_name'] AND preg_match(",apache,i", @php_sapi_name()))
122                        OR preg_match(",^Apache.* PHP,", $_SERVER['SERVER_SOFTWARE']))
123                // Attention dans le cas 'intranet' la proposition de se loger
124                // par auth_http peut conduire a l'echec.
125                AND !(isset($_SERVER['PHP_AUTH_USER']) AND isset($_SERVER['PHP_AUTH_PW']))
126        )
127
128                return generer_url_action('cookie', "", false, true);
129        else  return '';
130}
131
132function formulaires_login_verifier_dist($cible = "", $login = "", $prive = null){
133
134        include_spip('auth/thelia');
135        $session_login = _request('var_login');
136        $session_password = _request('password');
137        $session_md5pass = _request('session_password_md5');
138        $session_md5next = _request('next_session_password_md5');
139        $session_remember = _request('session_remember');
140
141        if (!$session_login){
142                # pas de login saisi !
143                return array('message_erreur' =>
144                        _T('login_identifiant_inconnu',
145                                array('login' => htmlspecialchars($login))));
146        }
147        $row = retrouver_login($session_login);
148        if ($row)
149                $login = $row['login'];
150        else
151                $login = $session_login;  // laisser une chance
152
153        $auteur = verifier_login($login, $session_password, $session_md5pass, $session_md5next);
154        if (!$auteur){
155                /*if (strlen($session_password) OR strlen($session_md5pass))
156                        return array('password' => _T('login_erreur_pass'));
157                // sinon c'est un login en deux passe old style (ou js en panne)
158                // pas de message d'erreur
159               
160                else */
161                return array('password' => ' ');
162
163        }
164        // on a ete authentifie, construire la session
165        // en gerant la duree demandee pour son cookie
166        if ($session_remember!==NULL)
167                $auteur['cookie'] = $session_remember;
168        $session = charger_fonction('session', 'inc');
169        $session($auteur);
170        $p = ($auteur['prefs']) ? unserialize($auteur['prefs']) : array();
171        $p['cnx'] = ($session_remember=='oui') ? 'perma' : '';
172        $p = array('prefs' => serialize($p));
173        sql_updateq('spip_auteurs', $p, "id_auteur=" . $auteur['id_auteur']);
174        //  bloquer ici le visiteur qui tente d'abuser de ses droits
175        verifier_visiteur();
176        return (is_null($prive) ? is_url_prive($cible) : $prive)
177                ? login_autoriser() : array();
178
179
180}
181
182function login_autoriser(){
183        include_spip('inc/autoriser');
184        if (!autoriser('ecrire')){
185                $h = generer_url_action('logout', 'logout=prive&url=' . urlencode(self()));
186                return array('message_erreur' => "<h1>"
187                        . _T('avis_erreur_visiteur')
188                        . "</h1><p>"
189                        . _T('texte_erreur_visiteur')
190                        . "</p><p class='retour'>[<a href='$h'>"
191                        . _T('icone_deconnecter') . "</a>]</p>");
192        }
193        return array();
194}
195
196function formulaires_login_traiter_dist($cible = "", $login = "", $prive = null){
197        $res = array();
198        // Si on se connecte dans l'espace prive,
199        // ajouter "bonjour" (repere a peu pres les cookies desactives)
200        if (is_null($prive) ? is_url_prive($cible) : $prive){
201                $cible = parametre_url($cible, 'bonjour', 'oui', '&');
202        }
203        if ($cible=='@page_auteur')
204                $cible = generer_url_entite($GLOBALS['auteur_session']['id_auteur'], 'auteur');
205
206        if ($cible){
207                $cible = parametre_url($cible, 'var_login', '', '&');
208        }
209
210        // transformer la cible absolue en cible relative
211        // pour pas echouer quand la meta adresse_site est foireuse
212        if (strncmp($cible, $u = url_de_base(), strlen($u))==0){
213                $cible = "./" . substr($cible, strlen($u));
214        }
215
216        // Si on est admin, poser le cookie de correspondance
217        if ($GLOBALS['auteur_session']['statut']=='0minirezo'){
218                include_spip('inc/cookie');
219                spip_setcookie('spip_admin', '@' . $GLOBALS['auteur_session']['login'],
220                        time()+7*24*3600);
221        }
222
223        // Si on est connecte, envoyer vers la destination
224        if ($cible AND ($cible!=self())){
225                if (!headers_sent() AND !$_GET['var_mode']){
226                        include_spip('inc/headers');
227                        $res['redirect'] = $cible;
228                } else {
229                        $res['message_ok'] .= "<a href='$cible'>" .
230                                _T('login_par_ici') .
231                                "</a>";
232                }
233        }
234        return $res;
235}
236
237
238// Reconnaitre aussi ceux qui donnent leur nom ou email au lieu du login
239
240function retrouver_login($login){
241        if (!spip_connect()){
242                include_spip('inc/minipres');
243                echo minipres(_T('info_travaux_titre'),
244                        _T('titre_probleme_technique'));
245                exit;
246        }
247        $l = sql_quote($login);
248        if ($r = sql_fetsel('id_auteur,login,alea_actuel,alea_futur,prefs,source,login', 'spip_auteurs',
249                "statut<>'5poubelle' AND (" .
250                "pass<>'' OR source<>'spip') AND (" .
251                "login=$l)")
252        )
253                return $r;
254        // Si pas d'auteur avec ce login
255        // regarder s'il a saisi son nom ou son mail.
256        // Ne pas fusionner avec la requete precedente
257        // car un nom peut etre homonyme d'un autre login
258        else return sql_fetsel('id_auteur,login,alea_actuel,alea_futur,prefs,source,login', 'spip_auteurs',
259                "statut<>'5poubelle' AND (" .
260                "pass<>'' OR source<>'spip') AND (" .
261                "login<>'' AND (nom=$l OR email=$l))");
262}
263
264// Essayer les differentes sources d'authenfication dans l'ordre specifie.
265// S'en souvenir dans visiteur_session['auth']
266
267// http://doc.spip.org/@verifier_login
268function verifier_login($login, $password, $md5pass = "", $md5next = ""){
269        foreach ($GLOBALS['liste_des_authentifications'] as $methode){
270                if ($auth = charger_fonction($methode, 'auth')
271                        AND $auteur = $auth($login, $password, $md5pass, $md5next)
272                ){
273                        spip_log("connexion de $login par methode $methode");
274                        $auteur['auth'] = $methode;
275                        return $auteur;
276                }
277        }
278        return false;
279}
Note: See TracBrowser for help on using the repository browser.