X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_userinfo.inc;h=097c7ccdc90f2030cdd4cbc0d35b5e28ba0ff126;hb=cf52f2875e8d24c2985898e38bfe03acf8900e44;hp=783b66822fe500558313f1ca8a27c726243f02a5;hpb=dd6458f7440cb93674a7348f535febaec9634dc1;p=gosa.git diff --git a/include/class_userinfo.inc b/include/class_userinfo.inc index 783b66822..097c7ccdc 100644 --- a/include/class_userinfo.inc +++ b/include/class_userinfo.inc @@ -37,8 +37,8 @@ class userinfo /* get acl's an put them into the userinfo object attr subtreeACL (userdn:components, userdn:component1#sub1#sub2,component2,...) */ - function userinfo($config, $userdn){ - $this->config= $config; + function userinfo(&$config, $userdn){ + $this->config= &$config; $ldap= $this->config->get_ldap_link(); $ldap->cat($userdn,array('sn', 'givenName', 'uid', 'gidNumber', 'preferredLanguage', 'gosaUnitTag')); $attrs= $ldap->fetch(); @@ -64,14 +64,25 @@ class userinfo $this->dn= $userdn; $this->uid= $attrs['uid'][0]; $this->ip= $_SERVER['REMOTE_ADDR']; + + /* Initialize ACL_CACHE */ + $_SESSION['ACL_CACHE']= array(); + $this->reset_acl_cache(); } + public function reset_acl_cache() + { + /* Initialize ACL_CACHE */ + $_SESSION['ACL_CACHE']= array(); + } + function loadACL() { $this->ACL= array(); $this->groups= array(); $this->result_cache =array(); + $this->reset_acl_cache(); $ldap= $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); @@ -178,6 +189,18 @@ class userinfo function get_permissions($dn, $object, $attribute= "", $skip_write= FALSE) { + /* Push cache answer? */ + if (isset($_SESSION['ACL_CACHE']["$dn+$object+$attribute"])){ + + /* Remove write if needed */ + if ($skip_write){ + $ret = preg_replace('/w/', '', $_SESSION['ACL_CACHE']["$dn+$object+$attribute"]); + }else{ + $ret = $_SESSION['ACL_CACHE']["$dn+$object+$attribute"]; + } + return($ret); + } + $acl= array("r" => "", "w" => "", "c" => "", "d" => "", "m" => "", "a" => ""); /* Build dn array */ @@ -250,11 +273,12 @@ class userinfo } } + $_SESSION['ACL_CACHE']["$dn+$object+$attribute"]= $ret; + /* Remove write if needed */ if ($skip_write){ $ret= preg_replace('/w/', '', $ret); } - return ($ret); } @@ -263,6 +287,11 @@ class userinfo accessible department) */ function get_module_departments($module) { + /* Use cached results if possilbe */ + if(isset($_SESSION['ACL_CACHE']['MODULE_DEPARTMENTS'][serialize($module)])){ + return($_SESSION['ACL_CACHE']['MODULE_DEPARTMENTS'][serialize($module)]); + } + global $plist; $objects= array(); @@ -286,11 +315,6 @@ class userinfo } } - /* Load departments here, if we are using php4 */ - if(is_php4() && !count($this->config->departments)){ - $this->config->get_departments(); - } - /* For all gosaDepartments */ foreach ($this->config->departments as $dn){ $acl= array("r" => "", "w" => "", "c" => "", "d" => "", "m" => "", "a" => ""); @@ -360,15 +384,17 @@ class userinfo } } + $_SESSION['ACL_CACHE']['MODULE_DEPARTMENTS'][serialize($module)] = $deps; return ($deps); } function mergeACL($acl, $type, $newACL) { - if(preg_match("/w/",$newACL) && !preg_match("/r/",$newACL)){ + if (strpos($newACL, 'w') !== FALSE && strpos($newACL, 'r') === FALSE){ $newACL .= "r"; } + foreach(str_split($newACL) as $char){ /* Ignore invalid characters */ @@ -408,20 +434,20 @@ class userinfo function cleanACL($acl, $reset= FALSE) { - foreach ($acl as $key => $value){ + foreach ($acl as &$value){ /* Reset removes everything but 'p' */ if ($reset && $value != 'p'){ - $acl[$key]= ""; + $value= ""; continue; } /* Decrease tree level */ - if (preg_match('/^[0-9]+$/', $value)){ - if ($value > 0){ - $acl[$key]= $value - 1; + if (is_int($value)){ + if ($value){ + $value--; } else { - $acl[$key]= ""; + $value= ""; } } } @@ -443,7 +469,6 @@ class userinfo $acl = "rwcdm"; $types = "rwcdm"; - if(!is_string($category)){ trigger_error("category must be string"); $acl = "";