source: spip-zone/_plugins_/authentification/auth_bd_externe/auth_bd_externe.php @ 2342

Last change on this file since 2342 was 2342, checked in by phil@…, 15 years ago

Version initiale du plugin d'authentification des auteurs via une BD externe (mySQL ou autres si Pear DB est détecté et accessible)

File size: 15.0 KB
Line 
1<?php
2$GLOBALS['bd_externe_present'] = TRUE;
3$GLOBALS['ldap_present'] = TRUE; // Hack pour ne pas avoir à modifier /formulaires/inc-login_public.php
4
5// Lecture du paramétrage BD externe
6require_once(dirname(__FILE__).'/inc/meta_auth_bd_externe.php');
7$bd_externe=lire_parametrage_auth_bd_externe ();
8
9// Inclusion des fonctions d'accès à la BD basées : mysql ou Pear DB
10if ($bd_externe['serveur']=="mysql") require_once(dirname(__FILE__).'/inc/mysql_query.php');
11else require_once(dirname(__FILE__).'/inc/pear_query.php');
12
13// Inclusion fonctions diverses
14require_once(dirname(__FILE__).'/inc/utils.php');
15
16function action_cookie() {
17        include_spip('inc/session');
18        include_spip('inc/cookie');
19        action_spip_cookie();
20}
21
22function action_spip_cookie()
23{
24       
25  global
26    $auteur_session,
27    $change_session,
28    $cookie_admin,
29    $cookie_session,
30    $essai_auth_http,
31    $essai_login,
32    $id_auteur,
33    $ignore_auth_http,
34    $bd_externe_present,
35    $logout,
36    $logout_public,
37    $next_session_password_md5,
38    $retour,
39    $session_login,
40    $session_login_hidden,
41    $session_password,
42    $session_password_md5,
43    $session_remember,
44    $spip_admin,
45    $spip_session,
46    $test_echec_cookie,
47    $url,
48    $valeur,
49    $var_lang,
50    $var_lang_ecrire;
51
52// rejoue le cookie pour renouveler spip_session
53if ($change_session == 'oui') {
54        if (verifier_session($spip_session)) {
55                // Attention : seul celui qui a le bon IP a le droit de rejouer,
56                // ainsi un eventuel voleur de cookie ne pourrait pas deconnecter
57                // sa victime, mais se ferait deconnecter par elle.
58                if ($auteur_session['hash_env'] == hash_env()) {
59                        spip_log("rejoue session");
60                        $auteur_session['ip_change'] = false;
61                        $cookie = creer_cookie_session($auteur_session);
62                        supprimer_session($spip_session);
63                        spip_setcookie('spip_session', $cookie);
64                }
65                else
66                        spip_log("session non rejouee, changement d'IP ?");
67        }
68        envoie_image_vide();echo "ok";
69        exit;
70}
71
72// tentative de connexion en auth_http
73if ($essai_auth_http AND !$ignore_auth_http) {
74        auth_http(($url ? $url : _DIR_RESTREINT_ABS), $essai_auth_http);
75        exit;
76}
77
78// cas particulier, logout dans l'espace public
79if ($logout_public) {
80        $logout = $logout_public;
81        if (!$url)  $url = $GLOBALS['meta']['adresse_site'];
82 }
83// tentative de logout
84if ($logout) {
85        if ($auteur_session['login'] == $logout) {
86                spip_query("UPDATE spip_auteurs SET en_ligne = DATE_SUB(NOW(),INTERVAL 6 MINUTE) WHERE id_auteur = ".$auteur_session['id_auteur']);
87                if ($spip_session) {
88                        zap_sessions($auteur_session['id_auteur'], true);
89                        spip_setcookie('spip_session', $spip_session, time() - 3600 * 24);
90                }
91               
92                if ($_SERVER['PHP_AUTH_USER']
93                AND !$ignore_auth_http
94                AND verifier_php_auth()) {
95                        auth_http(($url ? $url : _DIR_RESTREINT_ABS), 'logout');
96                }
97                unset ($auteur_session);
98        }
99        spip_log("logout: $logout");
100        redirige_par_entete($url ? $url : generer_url_public('login'));
101}
102
103// en cas de login sur bonjour=oui, on tente de poser un cookie
104// puis de passer au login qui diagnostiquera l'echec de cookie
105// le cas echeant.
106if ($test_echec_cookie == 'oui') {
107        spip_setcookie('spip_session', 'test_echec_cookie');
108        redirige_par_entete(generer_url_public('login'),
109                            "var_echec_cookie=oui&url="
110                            . ($url ? urlencode($url) : _DIR_RESTREINT_ABS), true);
111}
112
113// Tentative de login
114unset ($cookie_session);
115$redirect = ($url ? $url : _DIR_RESTREINT_ABS);
116if ($essai_login == "oui") {
117        // Recuperer le login en champ hidden
118        if ($session_login_hidden AND !$session_login)
119                $session_login = $session_login_hidden;
120
121        $login = $session_login;
122
123        // Essayer differentes methodes d'authentification
124        $auths = array('spip');
125        spip_connect(); // pour savoir si ldap est present
126       
127        if ($bd_externe_present) $auths[] = 'bd_externe'; 
128        $ok = false;
129       
130        include_spip('inc/auth_spip'); // Hack : on sort cela de la boucle foreach
131        foreach ($auths as $nom_auth) {
132                       
133                $classe_auth = "Auth_".$nom_auth;               
134                $auth = new $classe_auth;
135               
136                if ($auth->init()) {
137                       
138                        // Essayer les mots de passe challenge md5                                     
139                        $ok = $auth->verifier_challenge_md5($login, $session_password_md5, $next_session_password_md5); 
140                               
141                        // Sinon essayer avec le mot de passe autre cryptage   
142                        if (!$ok && $session_password) $ok = $auth->verifier($login, $session_password);                       
143                        if ($ok)  { $auth->lire(); break; }
144                }
145        }
146
147        // Si la connexion a reussi
148        if ($ok) {
149               
150                // Nouveau redacteur ou visiteur inscrit par mail :
151                // 'nouveau' -> '1comite' ou  '6forum'
152                // Si LDAP : importer l'utilisateur vers la base SPIP
153                $auth->activer();
154
155                if ($auth->login AND $auth->statut == '0minirezo') // force le cookie pour les admins
156                        $cookie_admin = "@".$auth->login;
157
158                // On est connecte : recuperer les donnees auteurs
159                // poser le cookie session, puis le cas echeant
160                // verifier que le statut correspond au minimum requis,
161                $query = "SELECT * FROM spip_auteurs WHERE login='".addslashes($auth->login)."'";
162                $result = spip_query($query);
163                if ($row_auteur = spip_fetch_array($result)) {
164               
165                //if ($row_auteur = $auth->auteur(addslashes($auth->login))) {
166                       
167                        $cookie_session = creer_cookie_session($row_auteur);
168                       
169                } else
170                        $ok = false;
171
172                // Si on se connecte dans l'espace prive, ajouter "bonjour" (inutilise)
173                if ($ok AND ereg(_DIR_RESTREINT_ABS, $redirect)) {
174                        $redirect .= ((false !== strpos($redirect, "?")) ? "&" : "?")
175                        . 'bonjour=oui';
176                }
177               
178        }
179
180        if (!$ok) {
181                if (ereg(_DIR_RESTREINT_ABS, $redirect))
182                        $redirect = generer_url_public('login',
183                                "var_login=$login", true);
184                if ($session_password || $session_password_md5)
185                        $redirect .= '&var_erreur=pass';
186                $redirect .= '&url=' . urlencode($url);
187                spip_log("echec login: $login");
188        }
189        else
190                spip_log("login: $login");
191}
192
193// cookie d'admin ?
194if ($cookie_admin == "non") {
195        if (!$retour)
196                $retour = generer_url_public('login',
197                        'url='.urlencode($url), true);
198
199        spip_setcookie('spip_admin', $spip_admin, time() - 3600 * 24);
200        $redirect = ereg_replace("([?&])var_login=[^&]*&?", '\1', $retour);
201        $redirect = ereg_replace("([?&])var_erreur=[^&]*&?", '\1', $redirect);
202        $redirect .= ((false !== strpos($redirect, "?")) ? "&" : "?")
203                . "var_login=-1";
204}
205else if ($cookie_admin AND $spip_admin != $cookie_admin) {
206        spip_setcookie('spip_admin', $cookie_admin, time() + 3600 * 24 * 14);
207}
208
209// cookie de session ?
210
211if ($cookie_session) {
212        if ($session_remember == 'oui')
213                spip_setcookie('spip_session', $cookie_session, time() + 3600 * 24 * 14);
214        else
215                spip_setcookie('spip_session', $cookie_session);
216
217        $prefs = ($row_auteur['prefs']) ? unserialize($row_auteur['prefs']) : array();
218        $prefs['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
219       
220        spip_query ("UPDATE spip_auteurs SET prefs = '".addslashes(serialize($prefs))."' WHERE id_auteur = ".$row_auteur['id_auteur']);
221
222}
223
224// changement de langue espace public
225if ($var_lang) {
226        include_spip('inc/lang');
227
228        if (changer_langue($var_lang)) {
229                spip_setcookie('spip_lang', $var_lang, time() + 365 * 24 * 3600);
230                $redirect = ereg_replace("[?&]lang=[^&]*", '', $redirect);
231                $redirect .= (strpos($redirect, "?")!==false ? "&" : "?") . "lang=$var_lang";
232        }
233}
234
235// changer de langue espace prive (ou login)
236if ($var_lang_ecrire) {
237        include_spip('inc/lang');
238
239        if (changer_langue($var_lang_ecrire)) {
240                spip_setcookie('spip_lang_ecrire', $var_lang_ecrire, time() + 365 * 24 * 3600);
241                spip_setcookie('spip_lang', $var_lang_ecrire, time() + 365 * 24 * 3600);
242
243                if (_FILE_CONNECT AND $id_auteur) {
244                        include_spip('inc/admin');
245                        if (verifier_action_auteur('var_lang_ecrire', $valeur, $id_auteur)) {
246                                spip_query ("UPDATE spip_auteurs SET lang = '".addslashes($var_lang_ecrire)."' WHERE id_auteur = ".$id_auteur);
247                                $auteur_session['lang'] = $var_lang_ecrire;
248                                ajouter_session($auteur_session, $spip_session);        // enregistrer dans le fichier de session
249                        }
250                }
251
252                $redirect = ereg_replace("[?&]lang=[^&]*", '', $redirect);
253                $redirect .= (strpos($redirect, "?")!==false ? "&" : "?") . "lang=$var_lang_ecrire";
254        }
255}
256
257// Redirection
258// Sous Apache, les cookies avec une redirection fonctionnent
259// Sinon, on fait un refresh HTTP
260if (ereg("^Apache", $GLOBALS['SERVER_SOFTWARE'])) {
261       
262        redirige_par_entete($redirect);
263}
264else {
265        include_spip('inc/headers');
266        spip_header("Refresh: 0; url=" . $redirect);
267        echo "<html><head>";
268        echo "<meta http-equiv='Refresh' content='0; url=".$redirect."'>";
269        echo "</head>\n";
270        echo "<body><a href='".$redirect."'>"._T('navigateur_pas_redirige')."</a></body></html>";
271}
272}
273
274class Auth_bd_externe {
275        var $nom, $bio, $email, $nom_site, $url_site, $login, $pass, $statut, $pgp;
276
277        function init() {               
278                global $bd_externe;
279               
280                spip_log("entree dans auth_bd_externe");
281               
282                // Verifier la presence de bd_externe
283                if (!$GLOBALS['bd_externe_present']) return false;
284               
285                return (bd_externe_connect());
286        }
287
288        function verifier_challenge_md5($login, $mdpass_actuel, $mdpass_futur) {
289                return false;
290        }
291
292        function verifier($login, $pass) {
293                global $bd_externe;
294                global $bd_externe_link;
295
296               
297                $cond_supp = '';
298                var_dump($bd_externe);
299                // Securite...
300                if (!$login || !$pass) return false;
301
302                switch($bd_externe['type_passwd']) {
303                        case 'clear_text' : 
304                                $local_pass = $pass;
305                                break;
306                        case 'md5' : 
307                                $local_pass = md5($pass);
308                                break;
309                        case 'challenge_md5' : 
310                        var_dump($bd_externe);
311                                $cond_supp = ', '.$bd_externe['champ_alea'].' AS alea'; //Select des alea.
312                                break;
313                        case 'crypt' : 
314                                $local_pass = crypt($pass);
315                                break;
316                        case 'unix' :
317                                // On ne fait rien pour le moment car on a besoin de récupérer le salt
318                                break;                 
319                }
320                       
321                $query = "SELECT ".$bd_externe['champ_login_ext']." AS login_ext, ".$bd_externe['champ_passwd']." AS pass".$cond_supp." FROM ".$bd_externe['table'];
322                if ($bd_externe['table_jointure']!="") {
323                        $query.=", ".$bd_externe['table_jointure'];
324                        $query=AjouteClause($query,$bd_externe['table'].".".$bd_externe['champ_cle']."=".$bd_externe['table_jointure'].".".$bd_externe['champ_cle']);
325                }
326       
327                $query=AjouteClause($query,$bd_externe['champ_login_ext']."='".addslashes($login)."'");
328               
329                if ($bd_externe['champ_statut']!="") {                 
330                       
331                        // Clauses supplémentaires pour détecter le cas échéants auteurs et administrateurs
332                        $cond_supp2="";
333                        if ($bd_externe['val_redacteur']!="") {
334                                $val_redacteur=explode(";",$bd_externe['val_redacteur']);                       
335                                foreach($val_redacteur as $cle => $val) $cond_supp2=AjouteClauseCond($cond_supp2,$bd_externe['champ_statut']."='$val'","OR");
336                        }
337                        if ($bd_externe['val_administrateur']!="") {   
338                                $val_administrateur=explode(";",$bd_externe['val_administrateur']);                     
339                                foreach($val_administrateur as $cle => $val) $cond_supp2=AjouteClauseCond($cond_supp2,$bd_externe['champ_statut']."='$val'","OR");                     
340                        }
341                        $cond_supp2=AjouteClauseCond($cond_supp2,"");
342                }
343               
344                $query.=$cond_supp2;   
345
346                $result = bd_externe_query($query);
347               
348                if ($row = bd_externe_fetch($result)) {
349                        if ($bd_externe['type_passwd'] == 'challenge_md5') $local_pass = md5($row['alea'].$pass);                       
350                        if ($bd_externe['type_passwd'] == 'unix') $local_pass=crypt($pass,'$1$'.substr($row['pass'],3,8)); // Modifier le substr pour tenir compte du nombre de caractères utilisés dans le salt
351                        if (addslashes($login) == $row['login_ext'] AND $local_pass == $row['pass']) {                         
352                                $this->login = $login;
353                               
354                                return true;
355                        }
356                }
357                return false;
358        }
359
360        function lire() {
361               
362                global $bd_externe;
363                global $bd_externe_link;
364               
365                $this->nom = $this->email = $this->bio = $this->nom_site = $this->url_site = $this->pgp = $this->pass = $this->statut = '';             
366
367                if (!$this->login) return false;
368
369                // Si l'auteur existe dans la base, y recuperer les infos
370                $query = "SELECT * FROM spip_auteurs WHERE login='".addslashes($this->login)."' AND source='bd_externe'";
371                $result = spip_query($query);
372
373                if ($row = spip_fetch_array($result)) {
374                        $this->nom = $row['nom'];
375                        $this->bio = $row['bio'];
376                        $this->email = $row['email'];
377                        $this->nom_site = $row['nom_site'];
378                        $this->url_site = $row['url_site'];
379                        $this->statut = $row['statut'];
380                        $this->pgp = $row['pgp'];
381                        return true;
382                }
383
384               
385                // Lire les infos sur l'auteur depuis la base externe
386                $query = "SELECT * FROM ".$bd_externe['table'];
387                if ($bd_externe['table_jointure']!="") {
388                        $query.=", ".$bd_externe['table_jointure'];
389                        $query=AjouteClause($query,$bd_externe['table'].".".$bd_externe['champ_cle']."=".$bd_externe['table_jointure'].".".$bd_externe['champ_cle']);
390                }
391                $query=AjouteClause($query,$bd_externe['champ_login_ext']."='".addslashes($this->login)."'");
392                               
393                $result = bd_externe_query($query);
394
395                if ($rows = $row = bd_externe_fetch($result) ) {
396                        $this->nom="";
397                        if ($bd_externe['champ_prenom']!="") $this->nom= ucwords(strtolower($rows[$bd_externe['champ_prenom']]))." ";
398                        $this->nom .= strtoupper($rows[$bd_externe['champ_nom']]);
399                        if (!$this->bio) $this->bio = $rows[$bd_externe['champ_bio']];
400                        if (!$this->email) $this->email = $rows[$bd_externe['champ_email']];
401                        if (!$this->nom_site) $this->nom_site = $rows[$bd_externe['champ_nom_site']];
402                        if (!$this->url_site) $this->url_site = $rows[$bd_externe['champ_url_site']];
403                        if (!$this->pgp) $this->pgp = $rows[$bd_externe['champ_pgp']];
404                       
405                        if ($bd_externe['champ_statut']!="") {
406                                $this->statut="";
407                                $val_redacteur=explode(";",$bd_externe['val_redacteur']);                                       
408                                $val_administrateur=explode(";",$bd_externe['val_administrateur']);                             
409                                foreach($val_redacteur as $cle => $val) if ($rows[$bd_externe['champ_statut']]==$val) $this->statut="1comite";
410                                foreach($val_administrateur as $cle => $val) if ($rows[$bd_externe['champ_statut']]==$val) $this->statut="0minirezo";
411                        }
412                        else $this->statut="1comite";
413                        return true;
414                }
415                return false;
416        }
417
418        function activer() {
419
420                $nom = addslashes($this->nom);
421                $bio = addslashes($this->bio);
422                $login = addslashes($this->login);
423                $email = addslashes($this->email);
424                $nom_site = addslashes($this->nom_site);
425                $url_site = addslashes($this->url_site);               
426                $pgp = addslashes($this->pgp);
427                $statut=$this->statut;
428
429                if ($statut=="") exit;
430
431                // Si l'auteur n'existe pas, l'inserer avec le statut par defaut (defini a l'install)
432                $query = "SELECT id_auteur FROM spip_auteurs WHERE login='$login'";
433                $result = spip_query($query);
434                if (spip_num_rows($result)) return false;
435
436                $query = "INSERT IGNORE INTO spip_auteurs (source, nom, login, email, bio, nom_site, url_site, pgp, statut, pass) ".
437                        "VALUES ('bd_externe', '$nom', '$login', '$email', '$bio', '$nom_site', '$url_site', '$pgp', '$statut', '')";
438
439                return spip_query($query);
440        }
441       
442        function auteur($login) {
443                global $bd_externe;
444                global $bd_externe_link;
445               
446                $query = "SELECT * FROM vhffs_users, vhffs_user_info WHERE (vhffs_users.uid=vhffs_user_info.uid) AND (username='$login' )";     
447                $result = bd_externe_query($query);
448                if ($row = bd_externe_fetch($result)) {
449                        $row['id_auteur']=$row['uid'];
450                        $row['statut']="0minirezo";
451                        return($row);
452                }
453        }
454}
455?>
Note: See TracBrowser for help on using the repository browser.