X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_acl.inc;h=01165904c669b232eaf1b168b54a55c6dc7b5cb2;hb=7b9eac53d0a01b7a79fc31199e8983c333c86a43;hp=136a022293f929b03847f7ded12dd7eaae2499bf;hpb=3848c9b0f0536119c27ff3da721198dbc5107e0f;p=gosa.git diff --git a/gosa-core/include/class_acl.inc b/gosa-core/include/class_acl.inc index 136a02229..01165904c 100644 --- a/gosa-core/include/class_acl.inc +++ b/gosa-core/include/class_acl.inc @@ -87,7 +87,18 @@ class acl extends plugin $ldap->search('(&(objectClass=gosaAccount)(gosaUnitTag='.$tag.'))', array('uid', 'cn')); } while ($attrs= $ldap->fetch()){ - $this->users['U:'.$attrs['dn']]= $attrs['cn'][0].' ['.$attrs['uid'][0].']'; + + // Allow objects without cn to be listed without causing an error. + if(!isset($attrs['cn'][0]) && isset($attrs['uid'][0])){ + $this->users['U:'.$attrs['dn']]= $attrs['uid'][0]; + }elseif(!isset($attrs['uid'][0]) && isset($attrs['cn'][0])){ + $this->users['U:'.$attrs['dn']]= $attrs['cn'][0]; + }elseif(!isset($attrs['uid'][0]) && !isset($attrs['cn'][0])){ + $this->users['U:'.$attrs['dn']]= $attrs['dn']; + }else{ + $this->users['U:'.$attrs['dn']]= $attrs['cn'][0].' ['.$attrs['uid'][0].']'; + } + } ksort($this->users); @@ -725,8 +736,11 @@ class acl extends plugin /* Create sub acl if it does not exist */ if (!isset($this->aclContents[$key])){ $this->aclContents[$key]= array(); + } + if(!isset($this->aclContents[$key][0])){ $this->aclContents[$key][0]= ''; } + $currentAcl= $this->aclContents[$key]; /* Get the overall plugin acls @@ -756,14 +770,14 @@ class acl extends plugin "\n ". "\n "._("Object").": $name". "\n ". - "\n ". + "\n ". "\n "; } else if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/ie/i",$_SERVER['HTTP_USER_AGENT'])) { $display.= "\n". "\n ". "\n ". "\n ". + "\n ". "\n "; } else { $display.= "\n
"._("Object").": $name". - "\n
". @@ -1054,20 +1068,22 @@ class acl extends plugin } } + /* Summarize members */ - if ($summary != ""){ - $summary.= ", "; - } - if (count($entry['members'])){ - $summary.= _("Members").": "; - foreach ($entry['members'] as $cn){ - $cn= preg_replace('/ \[.*$/', '', $cn); - $summary.= $cn.", "; + if(!($this instanceOf aclrole)){ + if ($summary != ""){ + $summary.= ", "; + } + if (count($entry['members'])){ + $summary.= _("Members").": "; + foreach ($entry['members'] as $cn){ + $cn= preg_replace('/ \[.*$/', '', $cn); + $summary.= $cn.", "; + } + } else { + $summary.= ""._("inactive")." - "._("No members").""; } - } else { - $summary.= _("ACL takes effect for all users"); } - return (preg_replace('/, $/', '', $summary)); } @@ -1202,7 +1218,7 @@ class acl extends plugin } if (!$ldap->success()){ - msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class())); + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class()), ERROR_DIALOG); } /* Refresh users ACLs */ @@ -1254,37 +1270,56 @@ class acl extends plugin /* Remove acls defined for $src */ function remove_acl() { - $this->remove_acl_for_dn($this->dn); + acl::remove_acl_for($this->dn); } /* Remove acls defined for $src */ - function remove_acl_for_dn($src = "") - { - if($src == ""){ - $src = $this->dn; - } - $ldap = $this->config->get_ldap_link(); - $ldap->cd($this->config->current['BASE']); - $ldap->search("(&(objectClass=gosaAcl)(gosaAclEntry=*".base64_encode($src)."*))",array("gosaAclEntry","dn")); - while($attrs = $ldap->fetch()){ - $acl = new acl($this->config,$this->parent,$attrs['dn']); - foreach($acl->gosaAclEntry as $id => $entry){ - foreach($entry['members'] as $m_id => $member){ - if($m_id == "U:".$src){ - unset($acl->gosaAclEntry[$id]['members'][$m_id]); - gosa_log("modify","users/acl",$attrs['dn'],array(),sprintf("Removed acl for user %s on object %s.",$src,$attrs['dn'])); - } - if($m_id == "G:".$src){ - unset($acl->gosaAclEntry[$id]['members'][$m_id]); - gosa_log("modify","groups/acl",$attrs['dn'],array(),sprintf("Removed acl for group %s on object %s.",$src,$attrs['dn'])); - } - } + static function remove_acl_for($dn) + { + global $config; + + $ldap = $config->get_ldap_link(); + $ldap->cd($config->current['BASE']); + $ldap->search("(&(objectClass=gosaAcl)(gosaAclEntry=*".base64_encode($dn)."*))",array("gosaAclEntry","dn")); + $new_entries= array(); + while($attrs = $ldap->fetch()){ + if (!isset($attrs['gosaAclEntry'])) { + continue; + } + unset($attrs['gosaAclEntry']['count']); + + // Remove entry directly + foreach($attrs['gosaAclEntry'] as $id => $entry){ + $parts= split(':',$entry); + $members= split(',',$parts[2]); + $new_members= array(); + foreach($members as $member) { + if (base64_decode($member) != $dn) { + $new_members[]= $member; + } else { + gosa_log("modify","users/acl",$attrs['dn'],array(),sprintf("Removed acl for %s on object %s.",$dn,$attrs['dn'])); + } + } + + /* We can completely remove the entry if there are no members anymore */ + if (count($new_members)) { + $parts[2]= implode(",", $new_members); + $new_entries[]= implode(":", $parts); + } + } + + // There should be a modification, so write it back + $ldap->cd($attrs['dn']); + $new_attrs= array("gosaAclEntry" => $new_entries); + $ldap->modify($new_attrs); + if (!$ldap->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $dn, LDAP_MOD, get_class()), ERROR_DIALOG); } - $acl -> save(); } } + function update_acl_membership($src,$dst) { $ldap = $this->config->get_ldap_link();