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

Last change on this file since 32903 was 32903, checked in by apachot@…, 10 years ago

début d'authentification unique : créer un utilisateur spip pour chaque client thélia qui se connecte

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{
24        $erreur = _request('var_erreur');
25
26        if (!$login) $login = _request('var_login');
27        if (!$login) {
28                if (isset($_COOKIE['spip_admin'])
29                AND preg_match(",^@(.*)$,", $_COOKIE['spip_admin'], $regs))
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{
119        if (!$GLOBALS['ignore_auth_http']
120                AND _request('var_erreur')=='cookie' 
121                AND $_COOKIE['spip_session'] != 'test_echec_cookie'
122                AND (($GLOBALS['flag_sapi_name'] AND preg_match(",apache,i", @php_sapi_name()))
123                        OR preg_match(",^Apache.* PHP,", $_SERVER['SERVER_SOFTWARE']))
124                // Attention dans le cas 'intranet' la proposition de se loger
125                // par auth_http peut conduire a l'echec.
126                AND !(isset($_SERVER['PHP_AUTH_USER']) AND isset($_SERVER['PHP_AUTH_PW'])))
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 */return array('password' => ' ');
161               
162        }
163        // on a ete authentifie, construire la session
164        // en gerant la duree demandee pour son cookie
165        if ($session_remember !== NULL)
166                $auteur['cookie'] = $session_remember;
167        $session = charger_fonction('session', 'inc');
168        $session($auteur);
169        $p = ($auteur['prefs']) ? unserialize($auteur['prefs']) : array();
170        $p['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
171        $p = array('prefs' => serialize($p));
172        sql_updateq('spip_auteurs', $p, "id_auteur=" . $auteur['id_auteur']);
173        //  bloquer ici le visiteur qui tente d'abuser de ses droits
174        verifier_visiteur();
175        return (is_null($prive) ? is_url_prive($cible) : $prive)
176        ?  login_autoriser() : array();
177   
178       
179
180}
181
182function login_autoriser()
183{
184        include_spip('inc/autoriser');
185        if (!autoriser('ecrire')){
186                $h = generer_url_action('logout','logout=prive&url='.urlencode(self()));
187                return array('message_erreur' => "<h1>"
188                                ._T('avis_erreur_visiteur')
189                                ."</h1><p>"
190                                ._T('texte_erreur_visiteur')
191                                ."</p><p class='retour'>[<a href='$h'>"
192                                ._T('icone_deconnecter')."</a>]</p>");
193        }
194        return array();
195}
196
197function formulaires_login_traiter_dist($cible="",$login="",$prive=null){
198        $res = array();
199        // Si on se connecte dans l'espace prive,
200        // ajouter "bonjour" (repere a peu pres les cookies desactives)
201        if (is_null($prive) ? is_url_prive($cible) : $prive) {
202                $cible = parametre_url($cible, 'bonjour', 'oui', '&');
203        }
204        if ($cible=='@page_auteur')
205                $cible = generer_url_entite($GLOBALS['auteur_session']['id_auteur'],'auteur');
206
207        if ($cible) {
208                $cible = parametre_url($cible, 'var_login', '', '&');
209        } 
210       
211        // transformer la cible absolue en cible relative
212        // pour pas echouer quand la meta adresse_site est foireuse
213        if (strncmp($cible,$u = url_de_base(),strlen($u))==0){
214                $cible = "./".substr($cible,strlen($u));
215        }
216
217        // Si on est admin, poser le cookie de correspondance
218        if ($GLOBALS['auteur_session']['statut'] == '0minirezo') {
219                include_spip('inc/cookie');
220                spip_setcookie('spip_admin', '@'.$GLOBALS['auteur_session']['login'],
221                time() + 7 * 24 * 3600);
222        }
223
224        // Si on est connecte, envoyer vers la destination
225        if ($cible AND ($cible!=self())) {
226                if (!headers_sent() AND !$_GET['var_mode']) {
227                        include_spip('inc/headers');
228                        $res['redirect'] = $cible;
229                } else {
230                        $res['message_ok'] .= "<a href='$cible'>" .
231                          _T('login_par_ici') .
232                          "</a>";
233                }
234        }
235        return $res;
236}
237
238
239// Reconnaitre aussi ceux qui donnent leur nom ou email au lieu du login
240
241function retrouver_login($login)
242{
243        if (!spip_connect()) {
244                include_spip('inc/minipres');
245                echo minipres(_T('info_travaux_titre'),
246                              _T('titre_probleme_technique'));
247                exit;
248        }
249        $l = sql_quote($login);
250        if ($r = sql_fetsel('id_auteur,login,alea_actuel,alea_futur,prefs,source,login', 'spip_auteurs',
251                        "statut<>'5poubelle' AND (" .
252                        "pass<>'' OR source<>'spip') AND (" . 
253                        "login=$l)"))
254                return $r;
255        // Si pas d'auteur avec ce login
256        // regarder s'il a saisi son nom ou son mail.
257        // Ne pas fusionner avec la requete precedente
258        // car un nom peut etre homonyme d'un autre login
259        else return sql_fetsel('id_auteur,login,alea_actuel,alea_futur,prefs,source,login', 'spip_auteurs',
260                        "statut<>'5poubelle' AND (" .
261                        "pass<>'' OR source<>'spip') AND (" . 
262                        "login<>'' AND (nom=$l OR email=$l))");
263}
264
265// Essayer les differentes sources d'authenfication dans l'ordre specifie.
266// S'en souvenir dans visiteur_session['auth']
267
268// http://doc.spip.org/@verifier_login
269function verifier_login($login, $password, $md5pass="", $md5next="")
270{
271        foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
272                if ($auth = charger_fonction($methode, 'auth')
273                AND $auteur = $auth($login, $password, $md5pass, $md5next)) {
274                        spip_log("connexion de $login par methode $methode");
275                        $auteur['auth'] = $methode;
276                        return $auteur;
277                }
278        }
279        return false;
280}
281?>
Note: See TracBrowser for help on using the repository browser.