X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_userinfo.inc;h=68455e08765db4dd6345f8a8193c21a04c790bb4;hb=7afa23783bbaf8d983427a43b13c19a398f01206;hp=f110833ca2c6c88a171f70514399cc91d7ccb078;hpb=0cb6ad35f0d38e489b77f4ab9beaef37a4168c33;p=gosa.git
diff --git a/include/class_userinfo.inc b/include/class_userinfo.inc
index f110833ca..68455e087 100644
--- a/include/class_userinfo.inc
+++ b/include/class_userinfo.inc
@@ -31,6 +31,7 @@ class userinfo
var $gosaUnitTag= "";
var $subtreeACL= array();
var $ACL= array();
+ var $ocMapping= array();
var $groups= array();
/* get acl's an put them into the userinfo object
@@ -67,6 +68,8 @@ class userinfo
function loadACL()
{
+
+#--------------------------------------------------------------------------OLD-BUT-ACTIVE-----------------------------
$ldap= $this->config->get_ldap_link();
/* Load ACL's from all groups we're in */
@@ -88,8 +91,8 @@ class userinfo
$this->subtreeACL[$base][]= $attrs["gosaSubtreeACL"][$i];
}
}
-
#echo "NEW ACL LOADING --------------------------------------------------------------------------------------------
";
+
$this->ACL= array();
$this->groups= array();
$ldap= $this->config->get_ldap_link();
@@ -112,7 +115,7 @@ class userinfo
$aclc[$attrs['dn']]= array();
$ol= array();
for($i= 0; $i<$attrs['gosaAclEntry']['count']; $i++){
- $ol= array_merge($ol, acl::explodeAcl($attrs['gosaAclEntry'][$i]));
+ $ol= array_merge($ol, @acl::explodeAcl($attrs['gosaAclEntry'][$i]));
}
$aclc[$attrs['dn']]= $ol;
}
@@ -129,18 +132,19 @@ class userinfo
/* No members? This is good for all users... */
if (!count($type['members'])){
$interresting= TRUE;
- }
+ } else {
- /* Inspect members... */
- foreach ($type['members'] as $grp => $grpdsc){
- /* Some group inside the members that is relevant for us? */
- if (in_array_ics(preg_replace('/^G:/', '', $grp), $this->groups)){
- $interresting= TRUE;
- }
+ /* Inspect members... */
+ foreach ($type['members'] as $grp => $grpdsc){
+ /* Some group inside the members that is relevant for us? */
+ if (in_array_ics(preg_replace('/^G:/', '', $grp), $this->groups)){
+ $interresting= TRUE;
+ }
- /* User inside the members? */
- if (preg_replace('/^U:/', '', $grp) == $this->dn){
- $interresting= TRUE;
+ /* User inside the members? */
+ if (preg_replace('/^U:/', '', $grp) == $this->dn){
+ $interresting= TRUE;
+ }
}
}
@@ -153,12 +157,257 @@ class userinfo
}
}
+
+ }
+
+
+ function get_category_permissions($dn, $category)
+ {
+ /* Get list of objectClasses and get the permissions for it */
+ $acl= "";
+ if (isset($this->ocMapping[$category])){
+ foreach($this->ocMapping[$category] as $oc){
+ $acl.= $this->get_permissions($dn, $category."/".$oc);
+ }
+ }
+
+ return ($acl);
}
- function get_permissions($dn, $object= "", $attribute= "")
+ function get_permissions($dn, $object, $attribute= "", $skip_write= FALSE)
{
- echo "Evaluating permissions for $dn, object $object/$attribute
";
+ $acl= array("r" => "", "w" => "", "c" => "", "d" => "", "m" => "", "a" => "");
+
+ /* Build dn array */
+ $path= split(',', $dn);
+ $path= array_reverse($path);
+
+ /* Walk along the path to evaluate the acl */
+ $cpath= "";
+ foreach ($path as $element){
+
+ /* Clean potential ACLs for each level */
+ $acl= $this->cleanACL($acl);
+
+ if ($cpath == ""){
+ $cpath= $element;
+ } else {
+ $cpath= $element.','.$cpath;
+ }
+ if (isset($this->ACL[$cpath])){
+
+ /* Inspect this ACL, place the result into ACL */
+ foreach ($this->ACL[$cpath] as $subacl){
+
+ /* Reset? Just clean the ACL and turn over to the next one... */
+ if ($subacl['type'] == 'reset'){
+ $acl= $this->cleanACL($acl, TRUE);
+ continue;
+ }
+
+ /* Per attribute ACL? */
+ if (isset($subacl['acl'][$object][$attribute])){
+ $acl= $this->mergeACL($acl, $subacl['type'], $subacl['acl'][$object][$attribute]);
+ continue;
+ }
+
+ /* Per object ACL? */
+ if (isset($subacl['acl'][$object][0])){
+ $acl= $this->mergeACL($acl, $subacl['type'], $subacl['acl'][$object][0]);
+ continue;
+ }
+
+ /* Global ACL? */
+ if (isset($subacl['acl']['all'][0])){
+ $acl= $this->mergeACL($acl, $subacl['type'], $subacl['acl']['all'][0]);
+ continue;
+ }
+
+ /* If attribute is "", we want to know, if we've *any* permissions here... */
+ if ($attribute == "" && isset($subacl['acl'][$object])){
+ foreach($subacl['acl'][$object] as $attr => $dummy){
+ $acl= $this->mergeACL($acl, $subacl['type'], $subacl['acl'][$object][$attr]);
+ }
+ continue;
+ }
+
+ }
+ }
+ }
+
+ /* Assemble string */
+ $ret= "";
+ foreach ($acl as $key => $value){
+ if ($value != ""){
+ $ret.= $key;
+ }
+ }
+
+ /* Remove write if needed */
+ if ($skip_write){
+ $ret= preg_replace('/w/', '', $ret);
+ }
+
+ return ($ret);
+ }
+
+
+ /* Extract all departments that are accessible (direct or 'on the way' to an
+ accessible department) */
+ function get_module_departments($module)
+ {
+ global $plist;
+
+ $objects= array();
+ $deps= array();
+
+ /* Extract all relevant objects for this module from plist */
+ foreach ($plist->info as $object => $info){
+ if (!isset($info['plCategory'])){
+ continue;
+ }
+ foreach ($info['plCategory'] as $idx => $data){
+ if (preg_match('/^[0-9]+$/', $idx)){
+ if ($data == $module){
+ $objects[$object]= $object;
+ }
+ } else {
+ if ($idx == $module){
+ $objects[$object]= $object;
+ }
+ }
+ }
+ }
+
+ /* For all gosaDepartments */
+ foreach ($this->config->departments as $dn){
+ $acl= array("r" => "", "w" => "", "c" => "", "d" => "", "m" => "", "a" => "");
+
+ /* Build dn array */
+ $path= split(',', $dn);
+ $path= array_reverse($path);
+
+ /* Walk along the path to evaluate the acl */
+ $cpath= "";
+ foreach ($path as $element){
+
+ /* Clean potential ACLs for each level */
+ $acl= $this->cleanACL($acl);
+
+ if ($cpath == ""){
+ $cpath= $element;
+ } else {
+ $cpath= $element.','.$cpath;
+ }
+ if (isset($this->ACL[$cpath])){
+
+ /* Inspect this ACL, place the result into ACL */
+ foreach ($this->ACL[$cpath] as $subacl){
+
+ /* Reset? Just clean the ACL and turn over to the next one... */
+ if ($subacl['type'] == 'reset'){
+ $acl= $this->cleanACL($acl, TRUE);
+ continue;
+ }
+
+ /* Per object ACL? */
+ foreach ($objects as $object){
+ if (isset($subacl['acl']["$module/$object"])){
+ foreach($subacl['acl']["$module/$object"] as $attribute => $dcl){
+ $acl= $this->mergeACL($acl, $subacl['type'], $subacl['acl']["$module/$object"][$attribute]);
+ }
+ }
+ }
+
+ /* Global ACL? */
+ if (isset($subacl['acl']["$module/all"][0])){
+ $acl= $this->mergeACL($acl, $subacl['type'], $subacl['acl']["$module/all"][0]);
+ continue;
+ }
+
+ /* Global ACL? */
+ if (isset($subacl['acl']["all"][0])){
+ $acl= $this->mergeACL($acl, $subacl['type'], $subacl['acl']["all"][0]);
+ continue;
+ }
+ }
+ }
+ }
+
+ /* Add department, if we have (some) permissions for the required module */
+ foreach ($acl as $val){
+ if ($val != ""){
+ $deps[]= $dn;
+ break;
+ }
+ }
+ }
+
+ return ($deps);
+ }
+
+
+ function mergeACL($acl, $type, $newACL)
+ {
+ foreach(str_split($newACL) as $char){
+
+ /* Ignore invalid characters */
+ if (!preg_match('/[rwcdm]/', $char)){
+ continue;
+ }
+
+ /* Skip permanent and subtree entries */
+ if (preg_match('/[sp]/', $acl[$char])){
+ continue;
+ }
+
+ switch ($type){
+ case 'psub':
+ $acl[$char]= 'p';
+ break;
+
+ case 'sub':
+ $acl[$char]= 's';
+ break;
+
+ case 'one':
+ $acl[$char]= 1;
+ break;
+
+ case 'base':
+ if ($acl[$char] != 1){
+ $acl[$char]= 0;
+ }
+ break;
+ }
+ }
+
+ return ($acl);
+ }
+
+
+ function cleanACL($acl, $reset= FALSE)
+ {
+ foreach ($acl as $key => $value){
+
+ /* Reset removes everything but 'p' */
+ if ($reset && $value != 'p'){
+ $acl[$key]= "";
+ continue;
+ }
+
+ /* Decrease tree level */
+ if (preg_match('/^[0-9]+$/', $value)){
+ if ($value > 0){
+ $acl[$key]= $value - 1;
+ } else {
+ $acl[$key]= "";
+ }
+ }
+ }
+
+ return ($acl);
}
}