source: pmb4.2/trunk/fuentes/pmb/includes/sessions.inc.php @ 828

Last change on this file since 828 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 15.3 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: sessions.inc.php,v 1.40 2015-05-19 14:29:28 apetithomme Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".inc.php")) die("no access");
8
9// fonctions de gestion des sessions
10
11// prevents direct script access
12if(preg_match('/sessions\.inc\.php/', $REQUEST_URI)) {
13        include('./forbidden.inc.php'); forbidden();
14}
15
16define( 'CHECK_USER_NO_SESSION', 1 );
17define( 'CHECK_USER_SESSION_DEPASSEE', 2 );
18define( 'CHECK_USER_SESSION_INVALIDE', 3 );
19define( 'CHECK_USER_AUCUN_DROITS', 4 );
20define( 'CHECK_USER_PB_ENREG_SESSION', 5 );
21define( 'CHECK_USER_PB_OUVERTURE_SESSION', 6 );
22define( 'CHECK_USER_SESSION_OK', 7 );
23
24// checkUser : authentification de l'utilisateur
25function checkUser($SESSNAME, $allow=0,$user_connexion='') {
26        global $dbh;
27        global $nb_per_page_author,$nb_per_page_publisher,$nb_per_page_collection,$nb_per_page_subcollection,$nb_per_page_serie;
28        global $nb_per_page_a_search,$nb_per_page_p_search,$nb_per_page_s_search,$nb_per_page_empr ;
29        global $nb_per_page_a_select,$nb_per_page_c_select,$nb_per_page_sc_select,$nb_per_page_p_select,$nb_per_page_s_select ;
30        global $param_popup_ticket, $param_sounds , $param_licence ;
31       
32        global $biblio_name,$biblio_adr1,$biblio_adr2,$biblio_cp,$biblio_town,$biblio_state,$biblio_country,$biblio_phone,$biblio_email,$biblio_website,$biblio_logo,$biblio_commentaire;
33        global $nb_per_page_search, $nb_per_page_select, $nb_per_page_gestion ;
34       
35        global $PMBuserid, $PMBusername, $PMBgrp_num;
36        global $checkuser_type_erreur ;
37        global $stylesheet ;
38        global $PMBusernom;
39        global $PMBuserprenom;
40        global $PMBuseremail,$PMBuseremailbcc;
41        global $explr_invisible ;
42        global $explr_visible_unmod ;
43        global $explr_visible_mod ;
44        global $check_messages;
45        global $pmb_sur_location_activate;
46        // par défaut : pas de session ouverte
47        $checkuser_type_erreur = CHECK_USER_NO_SESSION ;
48       
49        // récupère les infos de session dans les cookies
50        $PHPSESSID = $_COOKIE["$SESSNAME-SESSID"];
51        if ($user_connexion) $PHPSESSLOGIN = $user_connexion; 
52        else $PHPSESSLOGIN = $_COOKIE["$SESSNAME-LOGIN"];
53        $PHPSESSNAME = $_COOKIE["$SESSNAME-SESSNAME"];
54
55        // message de debug messages ?
56        if ($check_messages==-1) setcookie($SESSNAME."-CHECK-MESSAGES", 0, 0);
57        if ($check_messages==1) setcookie($SESSNAME."-CHECK-MESSAGES", 1, 0);
58
59        // on récupère l'IP du client
60        $ip = $_SERVER['REMOTE_ADDR'];
61
62        // recherche de la session ouverte dans la table
63        $query = "SELECT SESSID, login, IP, SESSstart, LastOn, SESSNAME FROM sessions WHERE ";
64        $query .= "SESSID='$PHPSESSID'";
65        $txt_er = $query;
66        $result = pmb_mysql_query($query, $dbh);
67        $numlignes = pmb_mysql_num_rows($result);
68
69        if(!$result || !$numlignes) {
70                $checkuser_type_erreur = CHECK_USER_NO_SESSION ;
71                return FALSE;
72        }
73       
74        // vérification de la durée de la session
75        $session = pmb_mysql_fetch_object($result);
76        // durée depuis le dernier rafraichissement
77        if(($session->LastOn+SESSION_REACTIVATE) < time()) {
78                $checkuser_type_erreur = CHECK_USER_SESSION_DEPASSEE ;
79                return FALSE;
80        }
81        // durée depuis le début de la session
82        if(($session->SESSstart+SESSION_MAXTIME) < time()) {
83                $checkuser_type_erreur = CHECK_USER_SESSION_DEPASSEE ;
84                return FALSE;
85        }
86       
87        // il faut stocker le sessid parce FL réutilise le tableau session pour aller lire les infos de users !!!
88        if($session->SESSID=="") {
89                $checkuser_type_erreur = CHECK_USER_SESSION_INVALIDE ;
90                return FALSE;
91        } else {
92                $id_session = $session->SESSID ;
93                $SESSstart_session = $session->SESSstart ;
94        }
95        // contrôle des droits utilisateurs
96        $query = "SELECT * FROM users WHERE username='$PHPSESSLOGIN' ";
97        $result = @pmb_mysql_query($query, $dbh);
98        $session = pmb_mysql_fetch_object($result);
99
100        if($allow) {
101                if(!($allow & $session->rights)) {
102                        $checkuser_type_erreur = CHECK_USER_AUCUN_DROIT ;
103                        return FALSE;
104                }
105        }
106
107        // authentification OK, on remet LAstOn à jour
108        $t = time();
109        $id = $id_session;
110       
111        // on en profite pour récupérer l'id du user
112        $PMBuserid = $session->userid;
113        $PMBusername = $session->username;
114       
115        // on avait bien stocké le sessid, on va pouvoir remettre à jour le laston, avec sessid dans la clause where au lieu de id en outre.
116        $query = "UPDATE sessions SET LastOn='$t' WHERE sessid='$id' ";
117        $result = pmb_mysql_query($query, $dbh) or die (pmb_mysql_error());
118
119        if(!$result) {
120                $checkuser_type_erreur = CHECK_USER_PB_ENREG_SESSION ;
121                return FALSE;
122        }
123       
124        // récupération de la langue de l'utilisateur
125
126        // mise à disposition des variables de la session
127        define('SESSlogin'      , $PHPSESSLOGIN);
128        define('SESSname'       , $SESSNAME);
129        define('SESSid'         , $PHPSESSID);
130        define('SESSstart'      , $SESSstart_session);
131        define('SESSlang'       , $session->user_lang);
132        define('SESSrights'     , $session->rights);
133        define('SESSuserid'     , $session->userid);
134       
135        /* Nbre d'enregistrements affichés par page */
136        /* gestion */ 
137        $nb_per_page_author = $session->nb_per_page_gestion ;
138        $nb_per_page_publisher = $session->nb_per_page_gestion ;
139        $nb_per_page_collection = $session->nb_per_page_gestion ;
140        $nb_per_page_subcollection = $session->nb_per_page_gestion ;
141        $nb_per_page_serie = $session->nb_per_page_gestion ;
142        $nb_per_page_search = $session->nb_per_page_search ;
143        $nb_per_page_select = $session->nb_per_page_select ;
144        $nb_per_page_gestion = $session->nb_per_page_gestion ;
145       
146        /* param par défaut */ 
147        $requete_param = "SELECT * FROM users WHERE username='$PHPSESSLOGIN' LIMIT 1 ";
148        $res_param = pmb_mysql_query($requete_param, $dbh);
149        $field_values = pmb_mysql_fetch_row( $res_param );
150        $array_values = pmb_mysql_fetch_array( $res_param );
151        $i = 0;
152        while ($i < pmb_mysql_num_fields($res_param)) {
153                $field = pmb_mysql_field_name($res_param, $i) ;
154                $field_deb = substr($field,0,6);
155                switch ($field_deb) {
156                        case "deflt_" :
157                                global $$field;
158                                $$field=$field_values[$i];
159                                break;
160                        case "deflt2" :
161                                global $$field;
162                                $$field=$field_values[$i];
163                                break;
164                        case "param_" :
165                                global $$field;
166                                $$field=$field_values[$i];
167                                break ;
168                        case "value_" :
169                                global $$field;
170                                $$field=$field_values[$i];
171                                break ;
172                        case "xmlta_" :
173                                global $$field;
174                                $$field=$field_values[$i];
175                                break ;
176                        case "deflt3" :
177                                global $$field;
178                                $$field=$field_values[$i];
179                                break;
180                        default :
181                                break ;
182                        }
183                $i++;
184                }
185        $requete_nom = "SELECT nom, prenom, user_email, userid, username, environnement, grp_num FROM users WHERE username='$PHPSESSLOGIN' ";
186        $res_nom = pmb_mysql_query($requete_nom, $dbh);
187        $param_nom = @pmb_mysql_fetch_object( $res_nom );
188        $PMBusernom=$param_nom->nom ;
189        $PMBuserprenom=$param_nom->prenom ;
190        $PMBuseremail=$param_nom->user_email ; 
191        $PMBgrp_num=$param_nom->grp_num;
192        $PMBuseremailbcc=$value_email_bcc ;     
193        // pour que l'id user soit dispo partout
194        define('SESSuserid'     , $param_nom->userid);
195        $PMBuserid = $param_nom->userid;
196        $PMBusername = $param_nom->username;
197        $menusarray=unserialize($param_nom->environnement);
198        if (is_array($menusarray)) $_SESSION["AutoHide"]=$menusarray;
199       
200        /* on va chercher la feuille de style du user */
201        $stylesheet = $deflt_styles ;
202       
203        /* param de la localisation */ 
204        if ($deflt2docs_location) $requete_param = "SELECT * FROM docs_location where idlocation='$deflt2docs_location'";
205        else $requete_param = "SELECT * FROM docs_location limit 1";
206        $res_param = pmb_mysql_query($requete_param, $dbh);
207        $obj_location = pmb_mysql_fetch_object( $res_param ) ;
208        $biblio_name=         $obj_location->name ; 
209        $biblio_adr1=         $obj_location->adr1 ;   
210        $biblio_adr2=         $obj_location->adr2 ;   
211        $biblio_cp=           $obj_location->cp ;   
212        $biblio_town=         $obj_location->town ;   
213        $biblio_state=        $obj_location->state ;   
214        $biblio_country=      $obj_location->country ; 
215        $biblio_phone=        $obj_location->phone ;
216        $biblio_email=        $obj_location->email ;   
217        $biblio_website=      $obj_location->website ; 
218        $biblio_logo=         $obj_location->logo ;
219        $biblio_commentaire=  $obj_location->commentaire ;
220
221        if($pmb_sur_location_activate && $deflt2docs_location){         
222                if($obj_location->surloc_num && $obj_location->surloc_used){
223                        $requete="SELECT * FROM sur_location WHERE surloc_id='".$obj_location->surloc_num."' LIMIT 1";                 
224                        $sur_loc_session = pmb_mysql_query($requete, $dbh) or die(pmb_mysql_error()."<br />$requete");
225                        if(pmb_mysql_num_rows($sur_loc_session)) {
226                                $sur_loc_session=pmb_mysql_fetch_object($sur_loc_session);                             
227                                $biblio_name=         $sur_loc_session->surloc_name ; 
228                                $biblio_adr1=         $sur_loc_session->surloc_adr1 ;   
229                                $biblio_adr2=         $sur_loc_session->surloc_adr2 ;   
230                                $biblio_cp=           $sur_loc_session->surloc_cp ;   
231                                $biblio_town=         $sur_loc_session->surloc_town ;   
232                                $biblio_state=        $sur_loc_session->surloc_state ;   
233                                $biblio_country=      $sur_loc_session->surloc_country ; 
234                                $biblio_phone=        $sur_loc_session->surloc_phone ;
235                                $biblio_email=        $sur_loc_session->surloc_email ;   
236                                $biblio_website=      $sur_loc_session->surloc_website ; 
237                                $biblio_logo=         $sur_loc_session->surloc_logo ;
238                                $biblio_commentaire=  $obj_location->commentaire ;                     
239                        }               
240                }
241        }
242        /* recherches */
243        /* author */
244        $nb_per_page_a_search = $session->nb_per_page_search ;
245        /* publisher */
246        $nb_per_page_p_search = $session->nb_per_page_search ;
247        /* subject */
248        $nb_per_page_s_search = $session->nb_per_page_search ;
249       
250        /* lecteur */
251        $nb_per_page_empr = $session->nb_per_page_search ;
252       
253        /* selectors */
254        /* author */
255        $nb_per_page_a_select = $session->nb_per_page_select ;
256        /* collection */
257        $nb_per_page_c_select = $session->nb_per_page_select ;
258        /* sub-collection */
259        $nb_per_page_sc_select = $session->nb_per_page_select ;
260        /* publisher */
261        $nb_per_page_p_select = $session->nb_per_page_select ;
262        /* serie */
263        $nb_per_page_s_select = $session->nb_per_page_select ;
264
265        // pour visibilite des exemplaires :
266        $explr_invisible = $session->explr_invisible ;
267        $explr_visible_unmod = $session->explr_visible_unmod ;
268        $explr_visible_mod = $session->explr_visible_mod ;
269       
270        return TRUE;
271        }
272
273// startSession : fonction de démarrage d'une session
274function startSession($SESSNAME, $login, $database=LOCATION) {
275        global $dbh; // le lien MySQL
276        global $stylesheet; /* pour qu'à l'ouverture de la session le user récupère de suite son style */
277        global $PMBuserid, $PMBusername, $PMBgrp_num;
278        global $checkuser_type_erreur ;
279        global $PMBusernom;
280        global $PMBuserprenom;
281        global $PMBuseremail;
282        global $PMBdatabase ;
283       
284        if (!$PMBdatabase) $PMBdatabase=$database;
285       
286        // nettoyage des sessions 'oubliées'
287        cleanTable($SESSNAME);
288
289        // génération d'un identificateur unique
290
291        // initialisation du générateur de nombres aléatoires
292        mt_srand((float) microtime()*1000000);
293
294        // nombre aléatoire entre 1111111111 et 9999999999
295        $SESSID = mt_rand(1111111111, 9999999999);
296
297        // début session (date UNIX)
298        $SESSstart = time();
299
300        // adresse IP du client
301        $IP = $_SERVER['REMOTE_ADDR'];
302
303        $query = "SELECT rights, user_lang FROM users WHERE username='$login'";
304        $result = pmb_mysql_query($query, $dbh);
305        $ff = pmb_mysql_fetch_object($result);
306        $flag = $ff->rights;
307
308        // inscription de la session dans la table
309        $query = "INSERT INTO sessions (SESSID, login, IP, SESSstart, LastOn, SESSNAME) VALUES(";
310        $query .= "'$SESSID'";
311        $query .= ", '$login'";
312        $query .= ", '$IP'";
313        $query .= ", '$SESSstart'";
314        $query .= ", '$SESSstart'";
315        $query .= ", '$SESSNAME' )";
316
317        $result = pmb_mysql_query($query, $dbh);
318        if(!$result) {
319                $checkuser_type_erreur = CHECK_USER_PB_OUVERTURE_SESSION ;
320                return CHECK_USER_PB_OUVERTURE_SESSION ;
321        }
322
323        // cookie pour le login de l'utilisateur
324        setcookie($SESSNAME."-LOGIN", $login, 0);
325
326        // cookie pour le nom de la session
327        setcookie($SESSNAME."-SESSNAME", $SESSNAME, 0);
328
329        // cookie pour l'ID de session
330        setcookie($SESSNAME."-SESSID", $SESSID, 0);
331
332        // cookie pour la base de donnée
333        setcookie($SESSNAME."-DATABASE", $PMBdatabase, 0);
334
335        // mise à disposition des variables de la session
336        define('SESSlogin'      , $login);
337        define('SESSname'       , $SESSNAME);
338        define('SESSid'         , $SESSID);
339        define('SESSstart'      , $SESSstart);
340        define('SESSlang'       , $ff->user_lang);
341        define('SESSrights'     , $flag);
342       
343        /* param par défaut */ 
344        $requete_param = "SELECT * FROM users WHERE username='$login' LIMIT 1 ";
345        $res_param = pmb_mysql_query($requete_param, $dbh);
346        $field_values = pmb_mysql_fetch_row( $res_param );
347        $i = 0;
348        while ($i < pmb_mysql_num_fields($res_param)) {
349                $field = pmb_mysql_field_name($res_param, $i) ;
350                $field_deb = substr($field,0,6);
351                switch ($field_deb) {
352                        case "deflt_" :
353                                global $$field;
354                                $$field=$field_values[$i];
355                                break;
356                        case "deflt2" :
357                                global $$field;
358                                $$field=$field_values[$i];
359                                break;
360                        case "param_" :
361                                global $$field;
362                                $$field=$field_values[$i];
363                                break ;
364                        case "value_" :
365                                global $$field;
366                                $$field=$field_values[$i];
367                                break ;
368                        case "xmlta_" :
369                                global $$field;
370                                $$field=$field_values[$i];
371                                break ;
372                        case "deflt3" :
373                                global $$field;
374                                $$field=$field_values[$i];
375                                break;
376                        default :
377                                break ;
378                        }
379                $i++;
380                }
381        $requete_nom = "SELECT nom, prenom, user_email, userid, username, grp_num FROM users WHERE username='$login' ";
382        $res_nom = pmb_mysql_query($requete_nom, $dbh);
383        $param_nom = pmb_mysql_fetch_object( $res_nom );
384        $PMBusernom=$param_nom->nom ;
385        $PMBuserprenom=$param_nom->prenom ;
386        $PMBgrp_num=$param_nom->grp_num;
387        $PMBuseremail=$param_nom->user_email ; 
388        // pour que l'id user soit dispo partout
389        define('SESSuserid'     , $param_nom->userid);
390        $PMBuserid = $param_nom->userid;
391        $PMBusername = $param_nom->username;
392       
393        /* on va chercher la feuille de style du user */
394        $stylesheet = $deflt_styles ;
395       
396        //Ouverture de la session php
397        header("Expires: Sat, 01 Jan 2000 00:00:00 GMT");
398        header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
399        header("Cache-Control: post-check=0, pre-check=0",false);
400        session_cache_limiter('must-revalidate');
401        session_name("pmb".SESSid);
402        session_start();
403       
404        //Récupération  de l'historique
405        $query = "select session from admin_session where userid=".$PMBuserid;
406        $resultat=pmb_mysql_query($query);
407        if ($resultat) {
408                if (pmb_mysql_num_rows($resultat)) {
409                        $_SESSION["session_history"]=@unserialize(@pmb_mysql_result($resultat,0,0));
410                }
411        }
412
413        return CHECK_USER_SESSION_OK ;
414        }
415
416// cleanTable : nettoyage des sessions terminées (user non-deconnecté)
417function cleanTable($SESSNAME) {
418        global $dbh;
419
420        // heure courante moins une heure
421        $time_out = time() - SESSION_MAXTIME;
422
423        // suppression des sessions inactives
424        $query = "DELETE FROM sessions WHERE LastOn < ".$time_out." and SESSNAME = '".$SESSNAME."'";
425        $result = pmb_mysql_query($query, $dbh);
426        }
427
428// sessionDelete : fin d'une session
429function sessionDelete($SESSNAME) {
430        global $dbh;
431
432        $login = $_COOKIE[$SESSNAME.'-LOGIN'];
433
434        $PHPSESSID = $_COOKIE["$SESSNAME-SESSID"];
435        $PHPSESSLOGIN = $_COOKIE["$SESSNAME-LOGIN"];
436        $PHPSESSNAME = $_COOKIE["$SESSNAME-SESSNAME"];
437
438
439
440        // altération du cookie-client (au cas où la suppression ne fonctionnerait pas)
441
442        setcookie($SESSNAME."-LOGIN", "no_login", 0);
443        setcookie($SESSNAME."-SESSNAME", "no_session", 0);
444        setcookie($SESSNAME."-SESSID", "no_id_session", 0);
445
446        // tentative de suppression ddes cookies
447
448        setcookie($SESSNAME."-SESSNAME");
449        setcookie($SESSNAME."-SESSID");
450        setcookie($SESSNAME."-LOGIN");
451
452        //Destruction de la session php
453        session_destroy();
454
455        // effacement de la session de la table des sessions
456
457        $query = "DELETE FROM sessions WHERE login='$login'";
458        $query .= " AND SESSNAME='$SESSNAME' and SESSID='$PHPSESSID'";
459
460        $result = @pmb_mysql_query($query, $dbh);
461        if($result)
462                return TRUE;
463
464        return FALSE;
465
466        }
467
Note: See TracBrowser for help on using the repository browser.