source: pmb4.2/trunk/fuentes/pmb/classes/acces.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: 42.5 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2005 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: acces.class.php,v 1.24 2015-06-26 13:03:18 dbellamy Exp $
6
7
8if (stristr ($_SERVER['REQUEST_URI'], ".class.php"))
9        die ("no access");
10               
11if ( !defined ('USER_PRF_TYP')) define ('USER_PRF_TYP', 0); // 0 = profil utilisateur (role)
12if ( !defined ('RES_PRF_TYP')) define ('RES_PRF_TYP', 1); // 1 = profil ressource
13
14require_once ("$class_path/marc_table.class.php");
15
16class acces {
17       
18        var $t_cat=array(); //Table catalogue                   
19        var $dom;
20       
21       
22        //Constructeur. 
23        function acces () {
24
25                //Lecture catalog
26                $this->parseCatalog();
27        }
28       
29       
30        //Lecture fichier catalog
31        function parseCatalog() {
32
33                global $base_path;
34                global $msg;
35                $t_cat=array();
36                $cp=new accesParser ();
37                $t_cat=$cp->run ("$base_path/admin/acces/catalog.xml");
38               
39                foreach ($t_cat as $v) {
40                        $mt=$this->parseManifestFile ($v['path']);
41                        $activation_param=$mt['activation_param'];
42                        global $$activation_param;
43                        if ($$activation_param =='1') {
44                                $this->t_cat[$v['id']]['id']=$v['id'];
45                                $this->t_cat[$v['id']]['path']=$v['path'];
46                                $this->t_cat[$v['id']]['comment']=$msg[$mt['comment']];
47                        }
48                }
49                unset ($t_cat);
50        }
51       
52       
53        //Lecture des domaines actives
54        function getCatalog () {
55
56                return $this->t_cat;
57        }
58       
59       
60        //Lecture fichier manifest
61        function parseManifestFile ($path) {
62
63                global $base_path;
64               
65                $mp=new accesParser ();
66                return $mp->run ("$base_path/admin/acces/$path/manifest.xml");
67        }
68       
69       
70        //Instanciation domaine
71        function setDomain ($dom_id) {
72
73                $this->dom=new domain ($this->t_cat[$dom_id]['id'], $this->t_cat[$dom_id]['path']);
74                return $this->dom;
75               
76        }
77
78}
79
80
81class domain {
82       
83        var $dom=array();
84       
85        //instanciation domaine
86        function domain($id, $path) {
87
88                if ( !$id || !$path)
89                        return;
90                $this->dom['id']=$id;
91                $this->dom['path']=$path;
92                $this->parseDomainFile();
93                $this->parseMsgFile();
94                $this->setDefaultRights();
95                $this->checkTables();
96                $this->pos=array();
97        }
98       
99       
100        //Lecture du fichier domain
101        function parseDomainFile() {
102
103                global $base_path;
104               
105                $ap=new accesParser ($this->dom);
106                $dom_file="$base_path/admin/acces/" .$this->dom['path']."/domain.xml";
107                $this->dom=$this->dom + $ap->run ($dom_file);
108        }
109       
110       
111        //lecture messages
112        function parseMsgFile() {
113
114                global $base_path, $lang;
115               
116                $msg_file=$base_path ."/admin/acces/" .$this->dom['path']."/messages/" .$lang .".xml";
117                if ( !file_exists ($msg_file)) {
118                        $msg_file=$base_path ."/admin/acces/" .$this->dom['path']."/messages/fr_FR.xml";
119                }
120                if (file_exists ($msg_file)) {
121                        $parser=new XMLlist ($msg_file);
122                        $parser->analyser ();
123                        $this->dom['msg']=$parser->table;
124                }
125        }
126       
127       
128        //definition des droits par defaut
129        function setDefaultRights() {
130
131                $this->dom['default_rights']=0;
132        }
133       
134        //creation des tables necessaires
135        function checkTables() {
136               
137                global $dbh;
138               
139                //creation de la table de stockage des droits par profils utilisateurs et par ressources si inexistante
140                $q = "CREATE TABLE IF NOT EXISTS acces_res_".$this->dom['id']." (
141                res_num int(8) unsigned NOT NULL default 0,
142                res_prf_num int(2) unsigned NOT NULL default 0,
143                usr_prf_num int(2) unsigned NOT NULL default 0,
144                res_rights int(2) NOT NULL default 0,
145                res_mask int(2) NOT NULL default 0,
146                PRIMARY KEY (res_num, usr_prf_num)
147                )";
148                pmb_mysql_query($q, $dbh);
149               
150                //creation de la table de surcharge des droits par utilisateur si inexistante
151                $q = "CREATE TABLE IF NOT EXISTS acces_usr_".$this->dom['id']." (
152                usr_num int(8) unsigned NOT NULL default 0,
153                res_prf_num int(2) unsigned NOT NULL default 0,
154                usr_rights int(2) NOT NULL default 0,
155                updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
156                PRIMARY KEY (usr_num, res_prf_num)
157                )";
158                pmb_mysql_query($q, $dbh);
159        }
160       
161        //Lecture message general/specifique domaine
162        function getComment($msg_code) {
163               
164                global $msg;
165                if (substr($msg_code,0,4)=='msg:') {
166                        return $msg[substr($msg_code,4)];
167                } else {
168                        return $this->dom['msg'][$msg_code];
169                }
170        }
171       
172       
173        //Retourne la liste des proprietes utilisateur accessibles
174        //et eventuellement celles utilisees
175        function getUserProperties() {
176               
177                $t_acc=explode(',', $this->dom['user']['properties']);
178                $t_r=array();
179                foreach($t_acc as $v) {
180                        $t_r[$v]['id']=$v;
181                        $p_lib=$this->dom['properties'][$v]['lib'];
182                        $t_r[$v]['lib']=$this->getComment($p_lib);
183                }
184                unset($v);
185                return $t_r;
186        }
187       
188
189        //enregistrement des profils utilisateurs
190        function saveUserProfiles($prf_id, $prf_lib, $prf_rule, $prf_hrule, $prf_used=array(),$unused_prf_id=array()) {
191               
192                global $dbh;
193                $t_id=array();
194                if (count($prf_id)) {
195                        foreach($prf_id as $k=>$v) {
196                       
197                                if ($v) { // profils deja enregistres, on modifie juste nom et profil utilise
198                                       
199                                        $q = "update acces_profiles set prf_name='".$prf_lib[$k]."', prf_used='".$prf_used[$k]."' where prf_id ='".$v."' ";
200                                        pmb_mysql_query($q, $dbh);
201                                        $t_id[]=$v;
202                                       
203                                } else { //on regarde si un profil similaire n'existe pas deja
204                                       
205                                        $q = "select prf_id from acces_profiles where dom_num='".$this->dom['id']."' and prf_type='".USER_PRF_TYP."' and prf_rule='".$prf_rule[$k]."' limit 1 ";
206                                        $r = pmb_mysql_query($q, $dbh);
207                                       
208                                        if(pmb_mysql_num_rows($r)) {
209                                                $row = pmb_mysql_fetch_object($r);
210                                                $t_id[]=$row->prf_id;
211                                        } else {
212                                                $q = "insert into acces_profiles set dom_num='".$this->dom['id']."', prf_type='".USER_PRF_TYP."',prf_name='".$prf_lib[$k]."', prf_rule='".$prf_rule[$k]."', prf_hrule='".$prf_hrule[$k]."' ";
213                                                pmb_mysql_query($q, $dbh);
214                                                $il=pmb_mysql_insert_id($dbh);
215                                                $t_id[]=$il;
216                                                $q = "update acces_profiles set prf_used=prf_id where prf_id='".$il."' ";
217                                                pmb_mysql_query($q, $dbh);
218                                        }
219                                }
220                        }
221                        $l_id=implode("','", $t_id);
222                        $q = "delete from acces_profiles where dom_num='".$this->dom['id']."' and prf_type='".USER_PRF_TYP."' and prf_id not in ('".$l_id."') ";
223                        pmb_mysql_query($q, $dbh);
224                }
225               
226                //que faire des anciens profils inutilises
227                if (count($unused_prf_id)) {
228
229                        foreach($unused_prf_id as $v) {
230                               
231                                //modification dans la table des droits par ressource
232                                if(!$prf_used[$v]) $prf_used[$v]=0;
233                                $q = "update acces_res_".$this->dom['id']." set usr_prf_num='".$prf_used[$v]."' where usr_prf_num='".$v."' ";
234                                pmb_mysql_query($q,$dbh);
235
236                                //suppression dans la table de droits
237                                $q = "delete from acces_rights where dom_num='".$this->dom['id']."' and usr_prf_num='".$v."' ";
238                                pmb_mysql_query($q,$dbh);
239                        }
240                }
241               
242        }
243       
244       
245        //lecture des profils utilisateurs
246        function loadUserProfiles() {
247
248                $q = "select * from acces_profiles where ";
249                $q.= "dom_num = '".$this->dom['id']."' ";
250                $q.= "and prf_type='" .USER_PRF_TYP ."' order by prf_name ";
251                return $q;
252        }
253       
254       
255        //Lecture des profils utilisateurs utiles pour le calcul des droits
256        function loadUsedUserProfiles($except=array()) {
257
258                $q = "select * from acces_profiles where ";
259                $q.= "dom_num = '".$this->dom['id']."' ";
260                $q.= "and prf_type='" .USER_PRF_TYP ."' ";
261                if (count($except)) {
262                        $q.= "and prf_id not in ('".implode("','",$except)."') ";
263                }
264                $q.= "and prf_id = prf_used ";
265                $q.= "order by prf_name ";
266                return $q;
267        }
268       
269       
270        //suppression des profils utilisateurs
271        function deleteUserProfiles() {
272               
273                global $dbh;
274                $q= "delete from acces_profiles where prf_type='".USER_PRF_TYP."' and dom_num='".$this->dom['id']."' ";
275                pmb_mysql_query($q, $dbh);
276        }
277       
278       
279        //Calcul des profils utilisateurs en mode automatique (produit scalaire)
280        function calcUserProfiles($chk_prop=array()) {
281
282                global $dbh, $msg;
283                if (!count($chk_prop)) return array();
284               
285                //Recuperation proprietes utilisateurs
286                $t_p=array();
287                $t_pid=explode (',', $this->dom['user']['properties']);
288               
289                foreach ($t_pid as $v) {
290                        if (in_array($v, $chk_prop)) {
291                                $t_p[$v]['type']=$this->dom['properties'][$v]['ref']['type'];
292                                $t_p[$v]['name']=$this->dom['properties'][$v]['ref']['name'];
293                                $t_p[$v]['key']=$this->dom['properties'][$v]['ref']['key'];
294                                $t_p[$v]['value']=$this->dom['properties'][$v]['ref']['value'];
295                                $t_p[$v]['clause']=$this->dom['properties'][$v]['ref']['clause'];
296                        }
297                }
298                unset ($v);
299               
300                //Recuperation des valeurs possibles pour chaque propriete
301                $t_kv=array();
302                foreach ($t_p as $k=>$v) {
303                        switch ($v['type']) {
304                                case 'table' :
305                                        $q="select ".$v['key'].", " .$v['value']." from ".$v['name']." ".($v['clause'] ? "where ".$v['clause']." " : "")."order by 2 ";
306                                        $r=pmb_mysql_query($q, $dbh);
307                                        while (($row=pmb_mysql_fetch_row($r))) {
308                                                $t_kv[$k][$row[0]]=$row[1];
309                                        }
310                                        break;
311                                case 'marc_table' :
312                                        $t_m=new marc_list ('doctype');
313                                        $t_kv[$k]=$t_m->table;
314                                        break;
315                                default :
316                                        break;
317                        }
318                }
319                unset ($v);
320                $t_k=array_keys($t_kv);
321                $t_kv=array_reverse($t_kv, true);                       
322               
323                $nb_tab=count($t_kv);
324
325                $t_r=$this->tab_scal($t_kv);
326               
327                $p=current($t_k);
328                foreach($t_r as $k=>$v) {
329                        reset($t_k);
330                        $p=current($t_k);
331                        $prev_p=0;
332                        $j=0;
333                        for($i=0;$i<$nb_tab;$i++) {
334                                $t_r[$k]['rule']['search'][]='f_'.$p;
335                                if ($prev_p==0) {
336                                        $t_r[$k]['rule']['inter_'.$prev_p.'_f_'.$p]='';
337                                } else {
338                                        $t_r[$k]['rule']['inter_'.$prev_p.'_f_'.$p]='and';
339                                }
340                                $t_r[$k]['rule']['op_'.$prev_p.'_f_'.$p]='EQ';
341                                $t_r[$k]['rule']['field_'.$prev_p.'_f_'.$p][]=$v[$j];
342                                $prev_p=$p;
343                                                               
344                                if ($t_r[$k]['hrule']) {
345                                        $t_r[$k]['hrule'].="\n".$msg['search_and']." ";
346                                }
347                                $t_r[$k]['hrule'].=$this->getComment($this->dom['properties'][$p]['lib'])." ".$v[$j+1];
348                               
349                                if ($t_r[$k]['name']=='') {
350                                        $t_r[$k]['name'] = $this->dom['msg']['user_prf_calc_lib'];
351                                }
352                                $t_r[$k]['name'].= " / ".$v[$j+1];
353                               
354                                $p=next($t_k);
355                                $j+=2;
356                        }
357                }
358       
359                //comparaison et reprise des profils deja existants
360                foreach($t_r as $k=>$v) {
361                        $t_r[$k]['rule']=serialize($v['rule']);
362                        $q = "select prf_id, prf_name, prf_used from acces_profiles where dom_num='".$this->dom['id']."' and prf_type='".USER_PRF_TYP."' and prf_rule='".$t_r[$k]['rule']."' limit 1 ";
363                        $r = pmb_mysql_query($q, $dbh);
364                        if(pmb_mysql_num_rows($r)) {
365                                $row=pmb_mysql_fetch_object($r);
366                                $t_r[$k]['name']=$row->prf_name;
367                                $t_r[$k]['old']=$row->prf_id;
368                        } else {
369                                $t_r[$k]['old']=0;
370                        }
371                }
372                //print '<pre>';print_r($t_r);print '</pre>';
373               
374                //faut trier
375                uasort($t_r, "cmpRules"); 
376
377                return $t_r;
378        }
379
380       
381        function tab_scal($t_kv) {
382               
383                $nb_val=1;
384                foreach($t_kv as $v) {
385                        $nb_val=$nb_val*count($v);
386                }
387                unset ($v);
388               
389                $tr=array();
390                $i=1;
391                $t1 = array_pop($t_kv);
392                $n1 = $nb_val/count($t1);
393                foreach($t1 as $k1=>$v1) {
394                        for($j=0;$j<$n1;$j++) {
395                                $tr[$i][]=$k1;
396                                $tr[$i][]=$v1;
397                                $i++;
398                        }
399                }
400               
401                while(count($t_kv)) {
402                        $t2=array_pop($t_kv);
403                        $tr=$this->tab_scal_2($tr,$t2); 
404                       
405                }
406                return $tr;
407        }
408       
409       
410        function tab_scal_2($tr, $t2) {
411               
412                foreach($tr as $kr=>$vr) {
413                        $tr[$kr][]=key($t2);
414                        $tr[$kr][]=current($t2);
415                        if(!next($t2)) reset($t2);
416                }
417                return $tr;
418        }
419
420       
421        //Retourne la liste des proprietes ressource accessibles
422        //et eventuellement celles utilisees
423        function getResourceProperties() {
424               
425                $t_acc=explode(',', $this->dom['resource']['properties']);
426                $t_r=array();
427                foreach($t_acc as $v) {
428                        $t_r[$v]['id']=$v;
429                        $p_lib=$this->dom['properties'][$v]['lib'];
430                        $t_r[$v]['lib']=$this->getComment($p_lib);
431                }
432                unset($v);
433                return $t_r;
434        }
435       
436       
437        //enregistrement des profils ressources
438        function saveResourceProfiles($prf_id, $prf_lib, $prf_rule, $prf_hrule, $prf_used=array(),$unused_prf_id=array()) {
439               
440                global $dbh;
441                $t_id=array();
442                if (count($prf_id)) {
443                        foreach($prf_id as $k=>$v) {
444                               
445                                if ($v) { // profils deja enregistres, on modifie juste nom et profil utilise
446                                       
447                                        $q = "update acces_profiles set prf_name='".$prf_lib[$k]."', prf_used='".$prf_used[$k]."' where prf_id ='".$v."' ";
448                                        pmb_mysql_query($q, $dbh);
449                                        $t_id[]=$v;
450                                } else {
451                                        $q = "insert into acces_profiles set dom_num='".$this->dom['id']."', prf_type='".RES_PRF_TYP."', prf_name='".$prf_lib[$k]."', prf_rule='".$prf_rule[$k]."', prf_hrule='".$prf_hrule[$k]."' ";
452                                        pmb_mysql_query($q, $dbh);
453                                        $il=pmb_mysql_insert_id($dbh);
454                                        $t_id[]=$il;
455                                        $q = "update acces_profiles set prf_used=prf_id where prf_id='".$il."' ";
456                                        pmb_mysql_query($q, $dbh);
457                                }
458                        }
459                }
460                $l_id=implode("','", $t_id);
461                $q = "delete from acces_profiles where dom_num='".$this->dom['id']."' and prf_type='".RES_PRF_TYP."' and prf_id not in ('".$l_id."') ";
462                pmb_mysql_query($q, $dbh);
463               
464                //que faire des anciens profils inutilises
465                if (count($unused_prf_id)) {
466
467                        foreach($unused_prf_id as $v) {
468                               
469                                //modification dans la table des droits par ressource
470                                if(!$prf_used[$v]) $prf_used[$v]=0;
471                                $q = "update acces_res_".$this->dom['id']." set res_prf_num='".$prf_used[$v]."' where res_prf_num='".$v."' ";
472                                pmb_mysql_query($q,$dbh);
473
474                                //suppression dans la table de droits
475                                $q = "delete from acces_rights where dom_num='".$this->dom['id']."' and res_prf_num='".$v."' ";
476                                pmb_mysql_query($q,$dbh);
477                        }
478                }
479               
480        }
481               
482       
483        //Lecture des profils ressources
484        function loadResourceProfiles() {
485
486                $q = "select * from acces_profiles where ";
487                $q.= "dom_num = '".$this->dom['id']."' ";
488                $q.= "and prf_type='" .RES_PRF_TYP ."' order by prf_name ";
489                return $q;
490        }
491
492       
493        //Lecture des profils ressources utiles pour le calcul des droits
494        function loadUsedResourceProfiles($except=array()) {
495
496                $q = "select * from acces_profiles where ";
497                $q.= "dom_num = '".$this->dom['id']."' ";
498                $q.= "and prf_type='" .RES_PRF_TYP ."' ";
499                if (count($except)) {
500                        $q.= "and prf_id not in ('".implode("','",$except)."') ";
501                }
502                $q.= "and prf_id = prf_used ";
503                $q.= "order by prf_name ";
504                return $q;
505        }
506       
507       
508        //suppression des profils ressources
509        function deleteResourceProfiles() {
510               
511                global $dbh;
512                $q= "delete from acces_profiles where prf_type='".RES_PRF_TYP."' and dom_num='".$this->dom['id']."' ";
513                pmb_mysql_query($q, $dbh);
514        }
515       
516       
517        //Calcul des profils ressources en mode automatique (produit scalaire)
518        function calcResourceProfiles($chk_prop=array()) {
519
520                global $dbh, $msg;
521                if (!count($chk_prop)) return array();
522               
523                //Recuperation proprietes utilisateurs
524                $t_p=array();
525                $t_pid=explode (',', $this->dom['resource']['properties']);
526               
527                foreach ($t_pid as $v) {
528                        if (in_array($v, $chk_prop)) {
529                                $t_p[$v]['type']=$this->dom['properties'][$v]['ref']['type'];
530                                $t_p[$v]['name']=$this->dom['properties'][$v]['ref']['name'];
531                                $t_p[$v]['key']=$this->dom['properties'][$v]['ref']['key'];
532                                $t_p[$v]['value']=$this->dom['properties'][$v]['ref']['value'];
533                                $t_p[$v]['clause']=$this->dom['properties'][$v]['ref']['clause'];
534                        }
535                }
536                unset ($v);
537               
538                //Recuperation des valeurs possibles pour chaque propriete
539                $t_kv=array();
540                foreach ($t_p as $k=>$v) {
541                        switch ($v['type']) {
542                                case 'table' :
543                                        $q="select ".$v['key'].", " .$v['value']." from ".$v['name']." ".($v['clause'] ? "where ".$v['clause']." " : "")."order by 2 ";
544                                        $r=pmb_mysql_query($q, $dbh);
545                                        while (($row=pmb_mysql_fetch_row($r))) {
546                                                $t_kv[$k][$row[0]]=$row[1];
547                                        }
548                                        break;
549                                case 'marc_table' :
550                                        $xf=substr($v['name'],0,strrpos($v['name'],'.'));
551                                        $t_m=new marc_list ($xf);
552                                        $t_kv[$k]=$t_m->table;
553                                        break;
554                                default :
555                                        break;
556                        }
557                }
558                unset ($v);
559                $t_k=array_keys($t_kv);
560                $t_kv=array_reverse($t_kv, true);                       
561               
562                $nb_tab=count($t_kv);
563                               
564                $t_r=$this->tab_scal($t_kv);
565
566                $p=current($t_k);
567                foreach($t_r as $k=>$v) {
568                        reset($t_k);
569                        $p=current($t_k);
570                        $prev_p=0;
571                        $j=0;
572                        for($i=0;$i<$nb_tab;$i++) {
573                                $t_r[$k]['rule']['search'][]='f_'.$p;
574                                if ($prev_p==0) {
575                                        $t_r[$k]['rule']['inter_'.$prev_p.'_f_'.$p]='';
576                                } else {
577                                        $t_r[$k]['rule']['inter_'.$prev_p.'_f_'.$p]='and';
578                                }
579                                $t_r[$k]['rule']['op_'.$prev_p.'_f_'.$p]='EQ';
580                                $t_r[$k]['rule']['field_'.$prev_p.'_f_'.$p][]=$v[$j];
581                                $prev_p=$p;
582                               
583                                if ($t_r[$k]['hrule']) $t_r[$k]['hrule'].="\n".$msg['search_and']." ";
584                                $t_r[$k]['hrule'].=$this->getComment($this->dom['properties'][$p]['lib'])." ".$v[$j+1];
585
586                                if ($t_r[$k]['name']=='') {
587                                        $t_r[$k]['name'] = $this->dom['msg']['res_prf_calc_lib'];
588                                }
589                                $t_r[$k]['name'].= " / ".$v[$j+1];
590                               
591                                $p=next($t_k);
592                                $j+=2;
593                        }
594                }
595               
596                //comparaison et reprise des profils deja existants
597                foreach($t_r as $k=>$v) {
598                        $t_r[$k]['rule']=serialize($v['rule']);
599                        $q = "select prf_id, prf_name from acces_profiles where dom_num='".$this->dom['id']."' and prf_type='".RES_PRF_TYP."' and prf_rule='".$t_r[$k]['rule']."' limit 1 ";
600                        $r = pmb_mysql_query($q, $dbh);
601                        if(pmb_mysql_num_rows($r)) {
602                                $row=pmb_mysql_fetch_object($r);
603                                $t_r[$k]['name']=$row->prf_name;
604                                $t_r[$k]['old']=$row->prf_id; 
605                        } else {
606                                $t_r[$k]['old']=0;
607                        }
608                }
609                //print '<pre>';print_r($t_r);print '</pre>';
610                 
611                //faut trier
612                uasort($t_r, "cmpRules"); 
613               
614                return $t_r;
615        }
616       
617       
618        //lecture des elements faisant l'objet d'un controle d'acces sur les ressources   
619        //si all=0, retourne les controles dependants de l'utilisateur
620        //si all=1, retourne les controles independants de l'utilisateur
621        //si all=2, retourne tous les controles
622        function getControls($all=2) {
623
624                $t_r=array();
625                foreach($this->dom['controls'] as $k=>$v) {
626                       
627                        switch($all) {
628                                case 0 :
629                                        if($v['global']!= 'yes') {
630                                                $t_r[$k]=$this->getComment($v['lib']);
631                                        }
632                                        break;
633                                case 1 :
634                                        if ($v['global']== 'yes') {
635                                                $t_r[$k]=$this->getComment($v['lib']);
636                                        }
637                                        break;
638                                case 2 :
639                                default:
640                                                $t_r[$k]=$this->getComment($v['lib']);
641                                        break;
642                        }
643                }
644                unset ($v);
645                return $t_r;
646        }
647       
648
649        //enregistrement des droits du domaine
650        function saveDomainRights($t_rights=array()) {
651               
652                global $dbh;
653               
654                //recuperation de la liste des controles
655                $t_ctl=$this->getControls(2);
656                //Suppression des anciens droits
657                $q = "delete from acces_rights where dom_num='".$this->dom['id']."' ";
658                pmb_mysql_query($q, $dbh);
659               
660                //recuperation des roles utilisateurs
661                $q_usr = $this->loadUsedUserProfiles();
662                $r_usr = pmb_mysql_query($q_usr, $dbh);
663                $t_usr[0]=0;
664                if (pmb_mysql_num_rows($r_usr)) {
665                        while (($row=pmb_mysql_fetch_object($r_usr))) {
666                                $t_usr[]=$row->prf_id;
667                        }
668                }
669               
670                $q_res=$this->loadUsedResourceProfiles();
671                $r_res = pmb_mysql_query($q_res, $dbh);
672                $t_res[0]=0;
673                if (pmb_mysql_num_rows($r_res)) {
674                        while (($row=pmb_mysql_fetch_object($r_res))) {
675                                $t_res[]=$row->prf_id;
676                        }
677                }
678               
679                //pour chaque profil utilisateur
680                foreach($t_usr as $k_usr=>$v_usr) {
681                       
682                        //pour chaque profil ressource
683                        foreach($t_res as $k_res=>$v_res) {
684                               
685                                //representation decimale des droits utilisateur/ressource
686                                $b_r=0;
687                                if (count($t_ctl)) {
688                                        foreach($t_ctl as $k_ctl=>$v_ctl) {
689                                       
690                                                if ( ($this->dom['controls'][$k_ctl]['global']=='yes') && ($t_rights[0][0][$k_ctl]==1) ) {
691                                                        $b_r = $b_r + pow(2,($k_ctl-1));
692                                                } elseif($t_rights[$v_usr][$v_res][$k_ctl]==1) {
693                                                                $b_r = $b_r + pow(2,($k_ctl-1));
694                                                }
695                                        }
696                                }                       
697                                $q = "replace into acces_rights set dom_num=".$this->dom['id'].",  usr_prf_num=".$v_usr.", res_prf_num=".$v_res.", dom_rights=".$b_r." ";
698                                pmb_mysql_query($q, $dbh);
699                        }
700                }               
701        }
702       
703
704        //lecture nombre de ressources a mettre a jour
705        function getNbResourcesToUpdate () {
706
707                global $dbh;
708               
709                $ret=0;
710                switch ($this->dom['resource']['ref']['type']) {
711                       
712                        case 'table' :
713                                $q="select count(*) from ".$this->dom['resource']['ref']['name']." ";
714                                $r=pmb_mysql_query($q,$dbh);
715                                if (pmb_mysql_num_rows($r)) {
716                                        $ret = pmb_mysql_result($r,0,0);
717                                }
718                                break;
719                        default:
720                                break;
721
722                }
723                return $ret;           
724        }
725       
726        //generation des droits par profil utilisateur pour chacune des ressources
727        function applyDomainRights($nb_done=0,$chk_sav_spe_rights=0) {
728
729                global $dbh;
730                $nb_per_pass=500;
731               
732                switch ($this->dom['resource']['ref']['type']) {
733                       
734                        case 'table' :
735
736                                //lecture de nb_per_pass ressources
737                                $q0 = "select ".$this->dom['resource']['ref']['key']." from ".$this->dom['resource']['ref']['name']." limit ".$nb_done.",".$nb_per_pass;
738                                $r0 = pmb_mysql_query($q0,$dbh);
739                               
740                                //pour chaque ressource, definition du profil
741                                $nb_done+=pmb_mysql_num_rows($r0);
742                                if($r0) {
743                                        while (($row0=pmb_mysql_fetch_row($r0))) {
744                                                $this->applyRessourceRights($row0[0],$chk_sav_spe_rights);
745                                        }
746                                }
747                               
748                                break;
749                               
750                        default :
751                                break;
752                }
753                 return $nb_done;
754        }
755
756       
757        //Suppression des droits pour un domaine
758        function deleteDomainRights() {
759                global $dbh;
760                if ($this->dom['id']) {
761                        $qr = "delete from acces_res_".$this->dom['id']." ";
762                        pmb_mysql_query($qr,$dbh);
763                        $qu = "delete from acces_usr_".$this->dom['id']." ";
764                        pmb_mysql_query($qu,$dbh);
765                }
766        }
767       
768       
769        //nettoyage
770        function cleanResources() {
771                                               
772                global $dbh;
773               
774                $q4 = "delete from acces_res_".$this->dom['id']." where res_prf_num !=0 and res_prf_num not in (select distinct prf_used from acces_profiles)";
775                pmb_mysql_query($q4, $dbh);
776                $q5 = "delete from acces_res_".$this->dom['id']." where usr_prf_num != 0 and usr_prf_num not in (select distinct prf_used from acces_profiles)";
777                pmb_mysql_query($q5, $dbh);
778                $q6 = "delete from acces_res_".$this->dom['id']." ";
779                $q6.= "where res_num not in (select ".$this->dom['resource']['ref']['key']." from ".$this->dom['resource']['ref']['name'].") ";
780                pmb_mysql_query($q6, $dbh);
781        }
782       
783        //lecture des droits pour la ressource
784        function getResourceRights($res_id=0) {
785               
786                global $dbh;
787               
788                if ($res_id!=0) {
789                       
790                        $res_prf = $this->getResourceProfile($res_id);
791                        $q = $this->loadUsedUserProfiles();
792                        $r = pmb_mysql_query($q, $dbh);
793                        if (pmb_mysql_num_rows($r)) {
794                                $t_usr=array();
795                                $t_usr[0]=$res_prf;
796                                while(($row=pmb_mysql_fetch_object($r))) {
797                                        $t_usr[$row->prf_id]=$res_prf;
798                                }
799                                $q="select usr_prf_num, (res_rights ^ res_mask) from acces_res_".$this->dom['id']." where res_num=".$res_id;
800                                $r = pmb_mysql_query($q, $dbh);
801                                $t_r=array();
802                                if (pmb_mysql_num_rows($r)) {
803                                        while(($row=pmb_mysql_fetch_row($r))){
804                                                $t_r[$row[0]][$res_prf]=$row[1];
805                                        }
806                                        return $t_r;
807                                }                               
808                        }
809                }
810                return $this->loadDomainRights();
811        }
812       
813       
814        // lecture de l'ensemble des droits du domaine
815        // retourne un tableau [usr_prf_num][res_prf_num]=dom_rights
816        function loadDomainRights() {
817               
818                global $dbh;
819               
820                $q="select usr_prf_num, res_prf_num, dom_rights from acces_rights where dom_num=".$this->dom['id']." ";
821                $r = pmb_mysql_query($q, $dbh);
822                $t_r = array();
823                if (pmb_mysql_num_rows($r)) {
824                        while (($row=pmb_mysql_fetch_object($r))) {
825                                $t_r[$row->usr_prf_num][$row->res_prf_num]=$row->dom_rights;
826                        }
827                }
828                return $t_r;
829        }
830       
831
832        //stocke les droits des utilisateurs a la creation/modification de la ressource
833        function storeUserRights($old_res_id=0, $res_id=0, $res_prf=array(), $chk_rights=array(), $prf_rad=array(), $r_rad=array()) {
834               
835                global $dbh;
836               
837                if (!$res_id) die('Error: ressource id not defined'); 
838               
839                if (!$old_res_id) {     //creation ressource
840                       
841                        $res_prf = $this->defineResourceProfile();
842
843                        //recuperation de la liste des droits du domaine
844                        $t_r = $this->loadDomainRights();
845               
846                        //recuperation de la liste des controles
847                        $t_ctl=$this->getControls(2);
848                       
849                        //recuperation des profils utilisateurs utiles
850                        $t_usr=array_keys($t_r);
851                       
852                        //pour chaque profil utilisateur
853                        foreach($t_usr as $k_usr=>$v_usr) {
854                                                                                       
855                                $res_rights = $t_r[$v_usr][$res_prf];
856                                $q = "replace into acces_res_".$this->dom['id']." set res_num=".$res_id.", res_prf_num=".$res_prf.", ";
857                                $q.= "usr_prf_num=".$v_usr.", res_rights=".$res_rights.", res_mask=0 ";
858                                pmb_mysql_query($q, $dbh);
859                        }               
860                                               
861                       
862                } else {        //modification ressource
863                       
864                        if ( (count($res_prf[$this->dom['id']])==0) && (count($chk_rights[$this->dom['id']])==0) ) {
865                                $res_prf = $this->defineResourceProfile();
866                        } elseif(count($res_prf[$this->dom['id']])!=0) {        //Profil ressource fourni
867                                switch($prf_rad[$this->dom['id']]) {
868                                        case 'R' :      //Profil recalcule
869                                                $res_prf = $this->defineResourceProfile();
870                                                break;
871                                        case 'C' :      //Profil choisi
872                                                $res_prf = $res_prf[$this->dom['id']];
873                                                break;
874                                        default :
875                                                break; 
876                                }
877                        }else if(count($res_prf[$this->dom['id']])==0){
878                                $res_prf = $this->defineResourceProfile();
879                        }
880
881                        //recuperation de la liste des droits du domaine
882                        $t_r = $this->loadDomainRights();
883               
884                        //recuperation de la liste des controles
885                        $t_ctl=$this->getControls(2);
886                       
887                        //recuperation des profils utilisateurs utiles
888                        $t_usr=array_keys($t_r);
889                       
890                        //pour chaque profil utilisateur
891                        foreach($t_usr as $k_usr=>$v_usr) {
892                                                                                       
893                                //representation decimale du masque utilisateur/ressource
894                                $mask=0;
895                                if ($r_rad[$this->dom['id']]=='C' && count($t_ctl)) {
896                                        foreach($t_ctl as $k_ctl=>$v_ctl) {
897                                                if($chk_rights[$this->dom['id']][$v_usr][$k_ctl]==1) {
898                                                                $mask = $mask + pow(2,($k_ctl-1));
899                                                }
900                                        }       
901                                } else {
902                                        $mask=$t_r[$v_usr][$res_prf];
903                                }
904                                               
905                                $res_rights = $t_r[$v_usr][$res_prf];
906                                $q = "replace into acces_res_".$this->dom['id']." set res_num=".$res_id.", res_prf_num=".$res_prf;
907                                $q.= ",  usr_prf_num=".$v_usr.", res_rights=".$res_rights.", res_mask=($res_rights ^ $mask) ";
908                                pmb_mysql_query($q, $dbh);
909                        }               
910                }
911        }
912
913       
914       
915        //definit les droits d'un profil utilisateur sur une ressource a la creation
916        function defineUserRights($usr_prf_id) {
917               
918                global $dbh;
919                $res_prf = $this->defineResourceProfile();
920                $q1 = "select dom_rights from acces_rights where dom_num=".$this->dom['id']." and res_prf_num=".$res_prf." and usr_prf_num = ".$usr_prf_id;
921                $r1 = pmb_mysql_query($q1, $dbh);
922                $d=0;
923                if (pmb_mysql_num_rows($r1)) {
924                        $d = pmb_mysql_result($r1,0,0);
925                } else {
926                        $d = $this->dom['default_rights'];
927                }
928                return $d;
929        }
930       
931       
932        //retourne le(s) droit(s) precise(s) de l'utilisateur sur la ressource
933        //si $rights=0, retourne tous les droits
934        function getRights($usr_id, $res_id, $rights=0) {
935               
936                global $dbh;
937
938                $usr_id+=0;
939                $res_id+=0;
940                $rights+=0;
941               
942                $qr='';
943                if ($rights) {
944                        $qr="& $rights";
945                }
946               
947                //recherche de surcharge sur les droits d'accès
948                $q="select (usr_rights ".$qr.")
949                from acces_usr_".$this->dom['id']."
950                where usr_num =".$usr_id." and res_prf_num = (select distinct res_prf_num from acces_res_".$this->dom['id']."   where res_num =".$res_id.")";
951                $r = pmb_mysql_query($q,$dbh);
952                if (pmb_mysql_num_rows($r)) {
953                        return pmb_mysql_result($r,0,0);
954                }
955               
956               
957                $usr_prf = $this->getUserProfile($usr_id);
958                $q= "select ((res_rights ^ res_mask) ".$qr.") from acces_res_".$this->dom['id']." where res_num=".$res_id." and usr_prf_num=".$usr_prf;
959                $r = pmb_mysql_result(pmb_mysql_query($q, $dbh),0,0);
960                return $r;
961        }
962
963       
964        //retourne le(s) droit(s) d'un profil utilisateur sur un profil ressource
965        function getDomainRights($usr_prf_num=0, $res_prf_num=0) {
966               
967                global $dbh;
968                $q= "select dom_rights from acces_rights where res_prf_num=".$res_prf_num." and usr_prf_num=".$usr_prf_num." and dom_num=".$this->dom['id'] ;
969                $r = pmb_mysql_query($q, $dbh);
970                if (pmb_mysql_num_rows($r)) {
971                        return pmb_mysql_result($r,0,0);
972                }
973                return 0;
974        }
975
976       
977       
978        //retourne le(s) droit(s) d'un utilisateur
979        //retourne un tableau [usr_prf_num][res_prf_num]=rights
980        function get_user_rights($usr_id, $usr_prf=0) {
981       
982                global $dbh;
983               
984                if (!$usr_prf) {
985                        $usr_prf = $this->getUserProfile($usr_id);
986                }
987               
988                $t_r = array();
989               
990                $q= "select res_prf_num, usr_rights from acces_usr_".$this->dom['id']." where usr_num=".$usr_id." ";
991                $r = pmb_mysql_query($q, $dbh);
992                if (pmb_mysql_num_rows($r)) {
993                        while($row=pmb_mysql_fetch_object($r)) {
994                                $t_r[$usr_prf][$row->res_prf_num]=$row->usr_rights;
995                        }
996                } else {
997                        $t_d = $this->loadDomainRights();
998                        if ($t_d[$usr_prf]) {
999                                $t_r[$usr_prf] = $t_d[$usr_prf];
1000                        } else {
1001                                $t_r = $t_d[0];
1002                        }
1003                }
1004
1005                return $t_r;
1006        }
1007       
1008       
1009        //retourne une requete donnant la liste des ressources repondant aux criteres passes
1010        function getResourceList($usr_id=0, $rights) {
1011                 
1012                $usr_prf = $this->getUserProfile($usr_id);
1013                $q="select res_num from acces_res_".$this->dom['id']." where usr_prf_num=".$usr_prf." and ((res_rights ^ res_mask) & ".$rights.") ";
1014                return $q;
1015        }
1016       
1017       
1018        //retourne la jointure a utiliser pour recuperer les ressources correspondant aux criteres passes
1019        function getJoin($usr_id, $rights, $join_field) {
1020                 
1021                global $dbh;
1022               
1023                if (!$usr_id) {
1024                        $usr_id=0;
1025                }
1026                //recherche de surcharge sur les droits d'accès
1027                $q = "select count(*) from acces_usr_".$this->dom['id']." where usr_num=".$usr_id." ";
1028                $r = pmb_mysql_query($q,$dbh);
1029               
1030                if (pmb_mysql_result($r,0,0)) {
1031                        $j = " join acces_res_".$this->dom['id']." on ".$join_field."=acces_res_".$this->dom['id'].".res_num and acces_res_".$this->dom['id'].".usr_prf_num=0 ";
1032                        $j.= "join acces_usr_".$this->dom['id']." on acces_res_".$this->dom['id'].".res_prf_num=acces_usr_".$this->dom['id'].".res_prf_num and acces_usr_".$this->dom['id'].".usr_num=".$usr_id." ";
1033                        $j.= "and (acces_usr_".$this->dom['id'].".usr_rights & ".$rights.") ";
1034                } else {
1035                        $usr_prf = $this->getUserProfile($usr_id);
1036                        $j=" join acces_res_".$this->dom['id']." on ".$join_field."=acces_res_".$this->dom['id'].".res_num and acces_res_".$this->dom['id'].".usr_prf_num=".$usr_prf." and ((acces_res_".$this->dom['id'].".res_rights ^ acces_res_".$this->dom['id'].".res_mask) & ".$rights.") ";
1037                }
1038                return $j;
1039        }
1040       
1041       
1042        function getFilterQuery($usr_id=0, $rights,$field ,$ids=""){
1043               
1044                global $dbh;
1045               
1046                if (!$usr_id) {
1047                        $usr_id=0;
1048                }
1049               
1050                //recherche de surcharge sur les droits d'accès
1051                $q = "select count(*) from acces_usr_".$this->dom['id']." where usr_num=".$usr_id." ";
1052                $r = pmb_mysql_query($q,$dbh);
1053               
1054                if (pmb_mysql_result($r,0,0)) {
1055                        $j = "select res_num as ".$field." from acces_res_".$this->dom['id']." ar ";
1056                        $j.= "join acces_usr_".$this->dom['id']." au on ar.res_prf_num=au.res_prf_num and usr_num=".$usr_id." ";
1057                        $j.= "where usr_prf_num=0 and (usr_rights & ".$rights.") and res_num in (".$ids.") ";           
1058                } else {
1059                        $usr_prf = $this->getUserProfile($usr_id);
1060                        $j="select res_num as ".$field." from acces_res_".$this->dom['id']." where usr_prf_num=".$usr_prf." and ((res_rights ^ res_mask) & ".$rights.") and res_num in (".$ids.")";
1061                }
1062                return $j;
1063        }
1064       
1065        //calcul du role utilisateur
1066        function getUserProfile($usr_id=0) {
1067               
1068                global $dbh;
1069               
1070                if (!$usr_id) {
1071                        $usr_id=0;
1072                }
1073               
1074                //Recuperation des regles
1075                $q = $this->loadUserProfiles();
1076                $r=pmb_mysql_query($q, $dbh);
1077                $prf_id=0;
1078               
1079                if (pmb_mysql_num_rows($r)) {
1080                        while (($row=pmb_mysql_fetch_object($r))) {
1081                                $t_rules[$row->prf_id]=unserialize($row->prf_rule);
1082                                $prf_used[$row->prf_id]=$row->prf_used;
1083                        }
1084                       
1085                        //recuperation des variables necessaires au calcul
1086                        foreach($this->dom['user']['property_link']['r_query'] as $k_var=>$v_var) {
1087                               
1088                                switch ($v_var['type']) {
1089                                        case 'var' :
1090                                                $x = $v_var['value'];
1091                                                global $$x;
1092                                                $t_var[$k_var]=$$x;
1093                                                break;
1094                                        case 'session' :
1095                                                $x = $v_var['value'];
1096                                                $t_var[$k_var]= $_SESSION[$x];
1097                                                break;
1098                                        case 'field' :
1099                                                $t_var[$k_var]=0;
1100                                                if ($usr_id!==0) {
1101                                                        $q = "select ".$v_var['value']." from ".$this->dom['user']['ref']['name']." where ".$this->dom['user']['ref']['key']."=".$usr_id.($this->dom['user']['ref']['clause'] ? " and ".$this->dom['user']['ref']['clause'] : "" );
1102                                                        $r = pmb_mysql_query($q, $dbh);
1103                                                        if (pmb_mysql_num_rows($r)) {
1104                                                                $t_var[$k_var]= pmb_mysql_result($r,0,0);
1105                                                        } 
1106                                                }
1107                                                break;
1108                                        case 'sql' :
1109                                                $t_var[$k_var]=0;
1110                                                if ($usr_id!==0) {
1111                                                        $q = str_replace('!!usr_id!!',$usr_id,$v_var['value']);
1112                                                        $r = pmb_mysql_query($q, $dbh);
1113                                                        if (pmb_mysql_num_rows($r)) {
1114                                                                $t_var[$k_var]= pmb_mysql_result($r,0,0);
1115                                                        }
1116                                                }
1117                                                break;
1118                                        default:
1119                                                break; 
1120                                }
1121                        }
1122                        unset($v_var);
1123                       
1124                        //Quelle est la regle qui s'applique ?
1125                        $prf_id=0;
1126                        foreach($t_rules as $k_rule=>$v_rule) {
1127       
1128                                $result = TRUE;
1129                                //construction de la regle
1130                                $prev_p_id=0;
1131                                foreach($v_rule['search'] as $k_s=>$v_s) {
1132                                        $p_id = substr($v_s,2);
1133       
1134                                        $var_value=$t_var[$p_id];
1135                                        $t_values=$t_rules[$k_rule]['field_'.$prev_p_id.'_f_'.$p_id];
1136                                       
1137                                        if (!in_array($var_value, $t_values)) {
1138                                               
1139                                                $result=FALSE;
1140                                                break;
1141                                        }
1142                                        $prev_p_id=$p_id;
1143                                }
1144                                if ($result==TRUE) {    //Toutes les conditions sont reunies, on se sauve
1145                                       
1146                                        $prf_id=$prf_used[$k_rule];
1147                                        break;
1148                                }
1149                        }
1150                }
1151                return $prf_id;
1152        }
1153
1154
1155       
1156        /* Lecture du profil courant ressource
1157         *
1158         * Lit le profil courant de la ressource dans la table acces_res_? si existant
1159         * sinon retourne une valeur calculee (creation)
1160         *
1161         */
1162        function getResourceProfile($res_id=0) {
1163
1164                global $dbh;
1165                if ($res_id) {
1166                        $q = "select res_prf_num from acces_res_".$this->dom['id']." join acces_profiles on dom_num='".$this->dom['id']."' and prf_type='1' and prf_id=res_prf_num ";
1167                        $q.= "where res_num = ".$res_id." limit 1";
1168                       
1169                        $r = pmb_mysql_query($q, $dbh); 
1170                        if(pmb_mysql_num_rows($r)) {
1171                                return pmb_mysql_result($r, 0, 0);
1172                        }
1173                }
1174                return $this->defineResourceProfile($res_id);
1175        }
1176       
1177       
1178        //lecture du nom du profil ressource
1179        function getResourceProfileName($res_prf) {
1180
1181                global $dbh;
1182                $q = "select prf_name from acces_profiles where prf_id='$res_prf' ";
1183                $r = pmb_mysql_query($q, $dbh); 
1184                if(pmb_mysql_num_rows($r)) {
1185                        return pmb_mysql_result($r, 0, 0);
1186                } 
1187                return $this->getComment('res_prf_def_lib');
1188        }
1189       
1190       
1191        //definition du profil pour la ressource en creation
1192        function defineResourceProfile($res_id=0) {
1193               
1194                global $dbh;
1195                //Recuperation des regles
1196                $q = $this->loadResourceProfiles();
1197                $r=pmb_mysql_query($q, $dbh);
1198                $prf_id=0;
1199                if (pmb_mysql_num_rows($r)) {
1200                       
1201                        while (($row=pmb_mysql_fetch_object($r))) {
1202                                $t_rules[$row->prf_id]=unserialize($row->prf_rule);
1203                                $prf_used[$row->prf_id]=$row->prf_used;
1204                        }
1205                       
1206                        //recuperation des variables necessaires au calcul
1207                       
1208                        $_query='c_query';
1209                        if($res_id) {
1210                                $_query='i_query';
1211                        }
1212
1213                        foreach($this->dom['resource']['property_link'][$_query] as $k_var=>$v_var) {
1214                               
1215                                switch ($v_var['type']) {
1216                                        case 'var' :
1217                                                $x = $v_var['value'];
1218                                                global $$x;
1219                                                $t_var[$k_var]=$$x;
1220                                                break;
1221                                        case 'session' :
1222                                                $x = $v_var['value'];
1223                                                $t_var[$k_var]= constant($x);
1224                                                break;
1225                                        case 'field' :
1226                                                if ($res_id==0) return $prf_id;
1227                                                $q = "select ".$v_var['value']." from ".$this->dom['resource']['ref']['name']." where ".$this->dom['resource']['ref']['key']."=".$res_id.($this->dom['resource']['ref']['clause'] ? " and ".$this->dom['resource']['ref']['clause'] : "");
1228                                                $r = pmb_mysql_query($q, $dbh);
1229                                                if (pmb_mysql_num_rows($r)) {
1230                                                        $t_var[$k_var]= pmb_mysql_result($r,0,0);
1231                                                } else {
1232                                                        $t_var[$k_var]=0;
1233                                                }
1234                                                break;
1235                                        case 'sql' :
1236                                                if ($res_id==0) return $prf_id;
1237                                                $q = str_replace('!!res_id!!',$res_id,$v_var['value']);
1238                                                $r = pmb_mysql_query($q, $dbh);
1239                                                if (pmb_mysql_num_rows($r)) {
1240                                                        $t_var[$k_var]= pmb_mysql_result($r,0,0);
1241                                                } else {
1242                                                        $t_var[$k_var]=0;
1243                                                }
1244                                                break;
1245                                        default:
1246                                                break; 
1247                                }
1248                        }
1249                        unset($v_var);
1250                       
1251                        //Quelle est la regle qui s'applique ?
1252                        $prf_id=0;
1253                        foreach($t_rules as $k_rule=>$v_rule) {
1254       
1255                                $result = TRUE;
1256                                //construction de la regle
1257                                $prev_p_id=0;
1258                                foreach($v_rule['search'] as $v_s) {
1259                                        $p_id = substr($v_s,2);
1260       
1261                                        $var_value=$t_var[$p_id];
1262                                        $t_values=$t_rules[$k_rule]['field_'.$prev_p_id.'_f_'.$p_id];
1263                                       
1264                                        if (!in_array($var_value, $t_values)) {
1265                                               
1266                                                $result=FALSE;
1267                                                break;
1268                                        }
1269                                        $prev_p_id=$p_id;
1270                                }
1271                                if ($result==TRUE) {    //Toutes les conditions sont reunies, on se sauve
1272                                       
1273                                        $prf_id=$prf_used[$k_rule];
1274                                        break;
1275                                }
1276                        }
1277                }
1278                return $prf_id;
1279               
1280        }
1281       
1282       
1283        function delRessource($res_id=0) {
1284               
1285                global $dbh;
1286                if (!$res_id) return;
1287                $q="delete from acces_res_".$this->dom['id']." where res_num=".$res_id;
1288                pmb_mysql_query($q,$dbh);
1289        }
1290       
1291        //generation des droits par profil utilisateur pour une ressource
1292        function applyRessourceRights($res_id,$chk_sav_spe_rights=0) {
1293                global $dbh;
1294               
1295                $res_prf=$this->getResourceProfile($res_id);
1296
1297                //recuperation des droits/profils utilisateurs pour le profil ressource en cours de traitement
1298                $q1 = "select usr_prf_num, dom_rights from acces_rights where dom_num=".$this->dom['id']." and res_prf_num=".$res_prf." ";
1299                $r1 = pmb_mysql_query($q1, $dbh);
1300                $t_d=array();
1301                if (pmb_mysql_num_rows($r1)) {
1302                        while (($row=pmb_mysql_fetch_object($r1))) {
1303                                $t_d[$row->usr_prf_num]= $row->dom_rights;
1304                        }
1305                }
1306
1307                //pour chaque profil utilisateur
1308                foreach($t_d as $k_d=>$v_d) {
1309                        $q2 = "select res_mask from acces_res_".$this->dom['id']." where res_num=".$res_id." and usr_prf_num=".$k_d;
1310                        $r2 = pmb_mysql_query($q2,$dbh);
1311                        if(pmb_mysql_num_rows($r2)) {
1312                                $q3 = "update acces_res_".$this->dom['id']." set res_prf_num=".$res_prf.", res_rights=".$v_d;
1313                                if(!$chk_sav_spe_rights) $q3.= ", res_mask=0";
1314                                $q3.= " where res_num=".$res_id." and usr_prf_num=".$k_d;
1315                        } else {
1316                                $q3 = "insert into acces_res_".$this->dom['id']." set res_num=".$res_id.", res_prf_num=".$res_prf.", usr_prf_num=".$k_d.", res_rights=".$v_d.", res_mask=0";
1317                        }
1318                        pmb_mysql_query($q3,$dbh);
1319                }
1320        }
1321       
1322        //surcharge des droits utilisateurs
1323        function override_user_rights($usr_id=0, $override_rights=0,$chk_rights=array()) {
1324                global $dbh;
1325
1326                $usr_id+=0;
1327                if ($usr_id && $override_rights && count($chk_rights)) {
1328                        switch ($override_rights) {
1329                               
1330                                case '1' :      //création surcharge
1331                                       
1332                                        if (count($chk_rights[$this->dom['id']])) {
1333                                               
1334                                                        //récupération des profils ressources
1335                                                        $q_res=$this->loadUsedResourceProfiles();
1336                                                        $r_res = pmb_mysql_query($q_res, $dbh);
1337                                                        $t_res[0]=0;
1338                                                        if (pmb_mysql_num_rows($r_res)) {
1339                                                                while (($row=pmb_mysql_fetch_object($r_res))) {
1340                                                                        $t_res[]=$row->prf_id;
1341                                                                }
1342                                                        }
1343                                                       
1344                                                        //recuperation des droits generiques  du domaine pour avoir les droits globaux
1345                                                        $t_r = $this->getDomainRights();
1346                                                               
1347                                                        //recuperation de la liste de tous les controles
1348                                                        $t_ctl=$this->getControls(2);
1349
1350                                                        //pour chaque profil ressource
1351                                                        foreach($t_res as $k_res=>$v_res) {
1352                                                               
1353                                                                //representation decimale des droits utilisateur/ressource
1354                                                                $b_r=0;
1355                                                                if (count($t_ctl)) {
1356                                                                        foreach($t_ctl as $k_ctl=>$v_ctl) {
1357                                                                       
1358                                                                                if ( ($this->dom['controls'][$k_ctl]['global']=='yes') && ($t_r & $this->dom['controls'][$k_ctl]) ) {
1359                                                                                        $b_r = $b_r + pow(2,($k_ctl-1));
1360                                                                                } elseif($chk_rights[$this->dom['id']][$v_res][$k_ctl]==1) {
1361                                                                                        $b_r = $b_r + pow(2,($k_ctl-1));
1362                                                                                }
1363                                                                        }
1364                                                                }                       
1365                                                               
1366                                                                $q = "replace into acces_usr_".$this->dom['id']." set usr_num=".$usr_id.",  res_prf_num=".$v_res.", usr_rights=".$b_r." ";
1367                                                                pmb_mysql_query($q, $dbh);
1368                                                        }
1369                                        }
1370                                       
1371                                        break;
1372                                       
1373                                case '2' :      //suppression surcharge
1374                                       
1375                                        $q = "delete from acces_usr_".$this->dom['id']." where usr_num=".$usr_id." ";
1376                                        pmb_mysql_query($q, $dbh);
1377                                        break;
1378                        }
1379                }
1380        }
1381
1382}
1383
1384
1385
1386class accesParser {
1387       
1388        var $parser;
1389        var $t=array();
1390        var $prev_tag='';
1391        var $prev_id='';
1392        var $path_tag=array();
1393        var $text='';
1394       
1395        function accesParser () {
1396
1397        }
1398       
1399        function run ($file) {
1400
1401                global $charset;
1402               
1403                //Recherche du fichier XML de description
1404                $subst_file=str_replace ('.xml', '_subst.xml', $file);
1405                if (file_exists ($subst_file))
1406                        $file=$subst_file;
1407                $xml=file_get_contents ($file, "r") or die ("Can't find XML file $file");
1408               
1409                unset ($this->t);
1410               
1411                $rx="/<?xml.*encoding=[\'\"](.*?)[\'\"].*?>/m";
1412                if (preg_match ($rx, $xml, $m))
1413                        $encoding=strtoupper ($m[1]); else
1414                        $encoding="ISO-8859-1";
1415               
1416                $this->parser=xml_parser_create ($encoding);
1417                xml_set_object ($this->parser, $this);
1418                xml_parser_set_option ($this->parser, XML_OPTION_TARGET_ENCODING, $charset);
1419                xml_parser_set_option ($this->parser, XML_OPTION_CASE_FOLDING, FALSE);
1420                xml_parser_set_option ($this->parser, XML_OPTION_SKIP_WHITE, TRUE);
1421                xml_set_element_handler ($this->parser, "tagStart", "tagEnd");
1422                xml_set_character_data_handler ($this->parser, "texte");
1423               
1424                if ( !xml_parse ($this->parser, $xml, TRUE)) {
1425                        die (sprintf ("erreur XML %s à la ligne: %d", xml_error_string (xml_get_error_code ($this->parser)), xml_get_current_line_number ($this->parser)));
1426                }
1427                xml_parser_free ($this->parser);
1428                return ($this->t);
1429        }
1430       
1431        function tagStart ($parser, $tag, $att) {
1432
1433                global $msg;
1434               
1435                $this->prev_tag=end ($this->path_tag);
1436                $this->path_tag[]=$tag;
1437                switch ($tag) {
1438                       
1439                        //lecture catalog.xml
1440                        case 'catalog' :
1441                                break;
1442                        case 'item' :
1443                                $this->t[$att['id']]['id']=$att['id'];
1444                                $this->t[$att['id']]['path']=$att['path'];
1445                                break;
1446                       
1447                        //lecture domain.xml   
1448                        case 'user' :
1449                                $this->t['user']['lib']=$this->getMsg ($att['lib']);
1450                                $this->t['user']['properties']=$att['properties'];
1451                                break;
1452                        case 'resource' :
1453                                $this->t['resource']['lib']=$this->getMsg ($att['lib']);
1454                                $this->t['resource']['properties']=$att['properties'];
1455                                break;
1456                        case 'ref' :
1457                                if ($this->prev_tag =='resource') {
1458                                        $this->t['resource']['ref']['type']=$att['type'];
1459                                        $this->t['resource']['ref']['name']=$att['name'];
1460                                        $this->t['resource']['ref']['key']=$att['key'];
1461                                        $this->t['resource']['ref']['clause']=$att['clause'];
1462                                }
1463                                if ($this->prev_tag =='user') {
1464                                        $this->t['user']['ref']['type']=$att['type'];
1465                                        $this->t['user']['ref']['name']=$att['name'];
1466                                        $this->t['user']['ref']['key']=$att['key'];
1467                                        $this->t['user']['ref']['clause']=$att['clause'];
1468                                }
1469                                if ($this->prev_tag =='property') {
1470                                        $this->t['properties'][$this->prev_id]['ref']['type']=$att['type'];
1471                                        $this->t['properties'][$this->prev_id]['ref']['name']=$att['name'];
1472                                        $this->t['properties'][$this->prev_id]['ref']['key']=$att['key'];
1473                                        $this->t['properties'][$this->prev_id]['ref']['value']=$att['value'];
1474                                        $this->t['properties'][$this->prev_id]['ref']['clause']=$att['clause'];
1475                                }
1476                                break;
1477                        case 'property_link' :
1478                                $this->prev_id=$att['with'];
1479                                break;
1480                        case 'c_query' :
1481                        case 'r_query' :
1482                        case 'i_query' :
1483                                $tag_2=$this->path_tag[count($this->path_tag)-3];
1484                                $this->t[$tag_2][$this->prev_tag][$tag][$this->prev_id]['type']=$att['type'];
1485                                $this->t[$tag_2][$this->prev_tag][$tag][$this->prev_id]['value']=$att['value'];
1486                                break;
1487                        case 'properties' :
1488                                break;
1489                        case 'property' :
1490                                $this->t['properties'][$att['id']]['id']=$att['id'];
1491                                $this->t['properties'][$att['id']]['lib']=$att['lib'];
1492                                $this->prev_id=$att['id'];
1493                                break;
1494                        case 'controls' :
1495                                break;
1496                        case 'control' :
1497                                $this->t['controls'][$att['id']]['id']=$att['id'];
1498                                $this->t['controls'][$att['id']]['lib']=$att['lib'];
1499                                $this->t['controls'][$att['id']]['global']=$att['global'];
1500                                $this->prev_id=$att['id'];
1501                                break;
1502                        default :
1503                                break;
1504                }
1505                $this->text='';
1506        }
1507       
1508        function tagEnd ($parser, $tag) {
1509
1510                if ( !count ($this->path_tag))
1511                        return;
1512                if (trim ($this->text) !=='') {
1513                        $this->t[$tag]=$this->text;
1514                }
1515                array_pop ($this->path_tag);
1516        }
1517       
1518        function texte ($parser, $data) {
1519
1520                if ( !count ($this->path_tag))
1521                        return;
1522                $this->text.=$data;
1523        }
1524       
1525        function getMsg ($code) {
1526
1527                global $msg;
1528               
1529                if (substr ($code, 0, 4) =='msg:') {
1530                        return $msg[substr ($code, 4)];
1531                }
1532                return $this->t_dom[$code];
1533        }
1534}
1535
1536
1537//fonction de comparaison des regles pour tri de la liste
1538function cmpRules($a ,$b) {
1539       
1540        return (strcmp($a['hrule'], $b['hrule']));
1541       
1542}
1543
1544?>
Note: See TracBrowser for help on using the repository browser.