X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_acl.inc;h=01165904c669b232eaf1b168b54a55c6dc7b5cb2;hb=7b9eac53d0a01b7a79fc31199e8983c333c86a43;hp=ce577b39d0d2bc1f573b3dde8a24477d11333fb7;hpb=aa89f24a74bb13b3739abde5b0b4d31534172b75;p=gosa.git diff --git a/gosa-core/include/class_acl.inc b/gosa-core/include/class_acl.inc index ce577b39d..01165904c 100644 --- a/gosa-core/include/class_acl.inc +++ b/gosa-core/include/class_acl.inc @@ -1068,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.= ""._("inactive")." - "._("No members").""; } - return (preg_replace('/, $/', '', $summary)); } @@ -1268,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();