source: pmb4.2/trunk/fuentes/pmb/classes/external_services_rights.class.php @ 815

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

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 10.7 KB
Line 
1<?php
2// +-------------------------------------------------+
3// | 2002-2007 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: external_services_rights.class.php,v 1.3 2015-04-03 11:16:19 jpermanne Exp $
6
7//Gestion des droits des services externes
8
9if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
10
11require_once("$class_path/external_services.class.php");
12
13define("ES_RIGHTS_UNKNOWN_GROUP_OR_METHOD",1);
14define("ES_RIGHTS_ANONYMOUS_USER_BAD_PMB_RIGHTS_FOR_METHOD",2);
15define("ES_RIGHTS_ANONYMOUS_USER_BAD_PMB_RIGHTS_FOR_GROUP",3);
16define("ES_RIGHTS_USER_BAD_PMB_RIGHTS_FOR_METHOD",4);
17define("ES_RIGHTS_USER_BAD_PMB_RIGHTS_FOR_GROUP",5);
18define("ES_RIGHTS_BAD_PMB_RIGHTS_FOR_THIS_USER",6);
19define("ES_RIGHTS_GROUP_OR_METHOD_FORBIDDEN",7);
20
21class es_rights {
22        var $group;
23        var $method;
24        var $available=true;
25        var $anonymous_user;
26        var $users=array();
27       
28        function es_rights($group,$method) {
29                $this->group=$group;
30                $this->method=$method;
31        }
32}
33
34class external_services_rights extends es_base {
35        var $es;                        //Services externes
36        var $users=array();     //Tableau des users
37        var $all_rights;        //Tous les droits !
38       
39        function external_services_rights($external_services) {
40                //Instantiation de la classe external_services
41                $this->es=$external_services;
42               
43                //Récupération des droits des utilisateurs
44                $resultat=pmb_mysql_query("select * from users");
45                while ($r=pmb_mysql_fetch_object($resultat)) {
46                        $this->users[$r->userid]= clone $r;
47                }
48               
49                //Calcul de tous les droits existants
50                $constants=get_defined_constants(true);
51                $this->all_rights=0;
52                foreach ($constants["user"] as $key=>$val) {
53                        if (substr($key,strlen($key)-5,5)=="_AUTH") $this->all_rights|=$val;
54                }
55        }
56       
57        function user_rights($user) {
58                return $this->users[$user]->rights;
59        }
60       
61        //Récupère les droits d'une méthode
62        function get_rights($group,$method) {
63                global $msg;
64                $this->clear_error();
65                //Vérification que le groupe / méthode existe
66                if (((!$method)&&($this->es->group_exists($group)))||($this->es->method_exists($group,$method))) {
67                        $es_r=new es_rights($group,$method);
68                        $requete="select available, num_user, anonymous from es_methods, es_methods_users where groupe='".addslashes($group)."' and method='".addslashes($method)."' and id_method=num_method";
69                        $resultat=pmb_mysql_query($requete);
70                        if ($resultat) {
71                                $first=true;
72                                while ($r=pmb_mysql_fetch_object($resultat)) {
73                                        if ($first) $es_r->available=$r->available;
74                                        if ($r->anonymous) 
75                                                $es_r->anonymous_user=$r->num_user;
76                                        else
77                                                $es_r->users[]=$r->num_user;
78                                }
79                        }
80                        return $es_r;
81                } else {
82                        $this->set_error(ES_RIGHTS_UNKNOWN_GROUP_OR_METHOD,$msg["es_rights_error_unknown_group"]);
83                        return false;
84                }
85        }
86       
87        function has_basic_rights($user,$group,$method) {
88                global $msg;
89                $this->clear_error();
90                //Compilation de tous les droits
91                if ($this->es->group_exists($group)) {
92                        $group_rights=0;
93                        $has_rights=false;
94                        foreach ($this->es->catalog->groups[$group]->methods as $method_name=>$m) {
95                                if ($m->rights) {
96                                        $group_rights|=$m->rights;
97                                        $has_rights=true;
98                                }
99                        }
100                        if (!$has_rights) $group_rights=$this->all_rights;
101                        if ((!$method)&&(!($group_rights&$this->user_rights($user)))) return false;
102                        if ($this->es->method_exists($group,$method)) {
103                                $method_rights=$this->es->catalog->groups[$group]->methods[$method]->rights;
104                                if (!$method_rights) $method_rights=$this->all_rights;
105                                if (($method)&&(!($method_rights&$this->user_rights($user)))) return false;
106                        } else {
107                                if ($method) {
108                                        $this->set_error(ES_RIGHTS_UNKNOWN_GROUP_OR_METHOD,$msg["es_rights_error_unknown_group"]);
109                                        return false;
110                                }
111                        }
112                        return true;
113                } else {
114                        $this->set_error(ES_RIGHTS_UNKNOWN_GROUP_OR_METHOD,$msg["es_rights_error_unknown_group"]);
115                }
116                return false;
117        }
118       
119        function has_rights($user,$group,$method) {
120                global $msg;
121                $user += 0;
122                $this->clear_error();
123                //La méthode est-elle disponible
124                //Recherche de la disponibilité du groupe
125                $requete="select available from es_methods where groupe='".addslashes($group)."' and available=0";
126                $resultat=pmb_mysql_query($requete);
127                if (pmb_mysql_num_rows($resultat)) 
128                        $available=pmb_mysql_result($resultat,0,0);
129                else {
130                         $requete="select available from es_methods where groupe='".addslashes($group)."' and method='".addslashes($method)."'";
131                         $resultat=pmb_mysql_query($requete);
132                         if (pmb_mysql_num_rows($resultat)) 
133                                $available=pmb_mysql_result($resultat,0,0);
134                }
135               
136                //Si user est vide, on recherche l'utilisateur anonyme
137                if ($user=="") {
138                        //Recherche de l'anonyme de la méthode
139                        $requete="select num_user from es_methods, es_methods_users where groupe='".addslashes($group)."' and method='".addslashes($method)."' and num_method=id_method and anonymous=1";
140                        $resultat=pmb_mysql_query($requete);
141                        if (pmb_mysql_num_rows($resultat)) {
142                                $user_u=pmb_mysql_result($resultat,0,0);
143                        } else {
144                                //Si il n'y en a pas, on recherche celui du groupe
145                                $requete="select num_user from es_methods, es_methods_users where groupe='".addslashes($group)."' and num_method=id_method and anonymous=1";
146                                $resultat=pmb_mysql_query($requete);
147                                if (pmb_mysql_num_rows($resultat)) {
148                                        $user_u=pmb_mysql_result($resultat,0,0);
149                                } else {
150                                        return false;
151                                }
152                        }
153                } else {
154                        //L'utilisateur est fourni, on regarde si il peut utiliser la méthode
155                       
156                        //Voyons si il a les accès complet au groupe directement
157                        $sql = "SELECT COUNT(1) FROM es_methods_users LEFT JOIN es_methods ON (es_methods_users.num_method = id_method) WHERE groupe = '".addslashes($group)."' AND method = '' AND available = 1 AND num_user = ".$user;
158                        $res = pmb_mysql_query($sql);
159                        $full_group_allowed = pmb_mysql_result($res,0,0);
160                        if ($full_group_allowed)
161                                $user_u = $user;
162                        else {
163                                //Voyons si il a les accès à la méthode
164                                $sql = "SELECT COUNT(1) FROM es_methods_users LEFT JOIN es_methods ON (es_methods_users.num_method = id_method) WHERE groupe = '".addslashes($group)."' AND method = '".addslashes($method)."' AND available = 1 AND num_user = ".$user;
165                                $res = pmb_mysql_query($sql);
166                                $method_allowed = pmb_mysql_result($res,0,0);
167                                if ($method_allowed)
168                                        $user_u = $user;
169                        }
170                }
171                //Si utilisateur trouvé, on vérifie ses droits de base
172                if (!$this->has_basic_rights($user_u,$group,$method)) {
173                        $this->set_error(ES_RIGHTS_BAD_PMB_RIGHTS_FOR_THIS_USER,sprintf($msg["es_rights_bad_user_rights"],$this->users[$user_u]->username));
174                } else if (!$available) {
175                        $this->set_error(ES_RIGHTS_GROUP_OR_METHOD_FORBIDDEN,$msg["es_rights_group_forbidden"]);
176                } else return true;
177                return false;
178        }
179       
180        function set_rights($es_r) {
181                global $msg;
182                $this->clear_error();
183                //Vérification des droits
184                if (((!$es_r->method)&&($this->es->group_exists($es_r->group)))||($this->es->method_exists($es_r->group,$es_r->method))) {
185                        //Vérification des droits
186                        if ((($es_r->anonymous_user)&&($this->has_basic_rights($es_r->anonymous_user,$es_r->group,$es_r->method)))||(!$es_r->anonymous_user)) {
187                                //Pour chaque user, vérification des droits !
188                                for ($i=0; $i<count($es_r->users); $i++) {
189                                        if (($es_r->users[$i]!=$es_r->anonymous_user)&&(!$this->has_basic_rights($es_r->users[$i],$es_r->group,$es_r->method))) {
190                                                if ($es_r->method)
191                                                        $this->set_error(ES_RIGHTS_USER_BAD_PMB_RIGHTS_FOR_METHOD,sprintf($msg["es_rights_user_unsifficent_rights"],$this->users[$es_r->users[$i]]->username,$es_r->method,$es_r->group));
192                                                else $this->set_error(ES_RIGHTS_USER_BAD_PMB_RIGHTS_FOR_GROUP,sprintf($msg["es_rights_user_unsifficent_rights_group"],$this->users[$es_r->users[$i]]->username,$es_r->group));
193                                                return false; 
194                                        }
195                                }
196                                //Tout va bien, on insère !!
197                                //Recherche de l'ancien id
198                                $id_method=0;
199                                $requete="select id_method from es_methods where groupe='".addslashes($es_r->group)."' and method='".addslashes($es_r->method)."'";
200                                $resultat=pmb_mysql_query($requete);
201                                if (pmb_mysql_num_rows($resultat)) $id_method=pmb_mysql_result($resultat,0,0);
202                                if ($id_method) {
203                                        $requete="delete from es_methods where groupe='".addslashes($es_r->group)."' and method='".addslashes($es_r->method)."'";
204                                        pmb_mysql_query($requete);
205                                        $requete="delete from es_methods_users where num_method=$id_method";
206                                        pmb_mysql_query($requete);
207                                }
208                                //Insertion maintenant
209                                $requete="insert into es_methods (groupe,method,available) values('".addslashes($es_r->group)."','".addslashes($es_r->method)."',".$es_r->available.")";
210                                pmb_mysql_query($requete);
211                                $id_method=pmb_mysql_insert_id();
212                                if ($es_r->anonymous_user) pmb_mysql_query("insert into es_methods_users (num_method,num_user,anonymous) values($id_method,$es_r->anonymous_user,1)");
213                                for ($i=0; $i<count($es_r->users); $i++) {
214                                        if ($es_r->users[$i]!=$es_r->anonymous_user) {
215                                                pmb_mysql_query("insert into es_methods_users (num_method,num_user,anonymous) values($id_method,".$es_r->users[$i].",0)");
216                                        }
217                                }
218                                return true;
219                        } else {
220                                if ($es_r->method)
221                                        $this->set_error(ES_RIGHTS_ANONYMOUS_USER_BAD_PMB_RIGHTS_FOR_METHOD,sprintf($msg["es_rights_unsufficent_anonymous_user_method"],$this->users[$es_r->anonymous_user]->username,$es_r->method,$es_r->group));
222                                else $this->set_error(ES_RIGHTS_ANONYMOUS_USER_BAD_PMB_RIGHTS_FOR_GROUP,sprintf($msg["es_rights_unsufficent_anonymous_user_group"],$this->users[$es_r->anonymous_user]->username,$es_r->group));
223                                return false; 
224                        }
225                } else {
226                        $this->set_error(ES_RIGHTS_UNKNOWN_GROUP_OR_METHOD,$msg["es_rights_error_unknown_group"]);
227                        return false;
228                }
229        }
230       
231        //Utilisateurs possibles en fonction des droits d'un groupe ou d'une méthode
232        function possible_users($group,$method) {
233                $this->clear_error();
234                //Si pas de méthode, consolidation au niveau du groupe
235                if ($this->es->group_exists($group)) {
236                        if (!$method) { 
237                                $group_rights=0;
238                                $has_rights=false;
239                                foreach ($this->es->catalog->groups[$group]->methods as $method_name=>$m) {
240                                        if ($m->rights) {
241                                                $group_rights|=$m->rights;
242                                                $has_rights=true;
243                                        }
244                                }
245                                if (!$has_rights) $group_rights=$this->all_rights;
246                               
247                                //Recherche des emprunteurs qui on le droit
248                                $r_users=array();
249                                foreach($this->users as $user_id=>$user) {
250                                        if ($user->rights&$group_rights) $r_users[]=$user_id;
251                                }
252                        } else {
253                                if ($this->es->method_exists($group,$method)) {
254                                        $r_users=array();
255                                        $method_rights=$this->es->catalog->groups[$group]->methods[$method]->rights;
256                                        if (!$method_rights) $method_rights=$this->all_rights;
257                                        foreach($this->users as $user_id=>$user) {
258                                                if ($user->rights&$method_rights) $r_users[]=$user_id;
259                                        }
260                                } else {
261                                        $this->set_error(ES_RIGHTS_UNKNOWN_GROUP_OR_METHOD,$msg["es_rights_error_unknown_group"]);
262                                        return false;
263                                }
264                        }
265                        return $r_users;
266                } else {
267                        $this->set_error(ES_RIGHTS_UNKNOWN_GROUP_OR_METHOD,$msg["es_rights_error_unknown_group"]);
268                        return false;
269                }
270        }
271}
272?>
Note: See TracBrowser for help on using the repository browser.