[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: Concerns with OLC (cn=config) for editing schema, ACLs, and deleting entries



--On Tuesday, March 20, 2012 12:58 AM -0400 "David N. Blank-Edelman" <dnb@ccs.neu.edu> wrote:

To your original point: once those details are clear, I suspect it would
be relatively straightforward to write a slapacl command/script that
parsed the ACL .conf file format and then used Net::LDAP to twiddle
cn=config on a specified server accordingly.

From one of my scripts, that adjust acls 3, 7, and 8 for anonymous vs user
only read access:

if($options{d}) {
@acls=(
'{3}to attrs=objectclass by dn.children="cn=admins,cn=zimbra" write by dn.base="uid=zmpostfix,cn=appaccts,cn=zimbra" read by dn.base="uid=zmamavis,cn=appaccts,cn=zimbra" read by users read by * none', '{7}to filter="(!(zimbraHideInGal=TRUE))" attrs=cn,co,company,dc,displayName,givenName,gn,initials,l,mail,o,ou,physicalDeliveryOfficeName,postalCode,sn,st,street,streetAddress,telephoneNumber,title,uid,homePhone,pager,mobile,userCertificate by dn.children="cn=admins,cn=zimbra" write by dn.base="uid=zmpostfix,cn=appaccts,cn=zimbra" read by users read by * none', '{8}to attrs=zimbraId,zimbraMailAddress,zimbraMailAlias,zimbraMailCanonicalAddress,zimbraMailCatchAllAddress,zimbraMailCatchAllCanonicalAddress,zimbraMailCatchAllForwardingAddress,zimbraMailDeliveryAddress,zimbraMailForwardingAddress,zimbraPrefMailForwardingAddress,zimbraMailHost,zimbraMailStatus,zimbraMailTransport,zimbraDomainName,zimbraDomainType,zimbraPrefMailLocalDeliveryDisabled by dn.children="cn=admins,cn=zimbra" write by dn.base="uid=zmpostfix,cn=appaccts,cn=zimbra" read by dn.base="uid=zmamavis,cn=appaccts,cn=zimbra" read by * none',
);
}

if ($options{e}) {
@acls=(
'{3}to attrs=objectclass by dn.children="cn=admins,cn=zimbra" write by dn.base="uid=zmpostfix,cn=appaccts,cn=zimbra" read by dn.base="uid=zmamavis,cn=appaccts,cn=zimbra" read by * read', '{7}to filter="(!(zimbraHideInGal=TRUE))" attrs=cn,co,company,dc,displayName,givenName,gn,initials,l,mail,o,ou,physicalDeliveryOfficeName,postalCode,sn,st,street,streetAddress,telephoneNumber,title,uid,homePhone,pager,mobile,userCertificate by dn.children="cn=admins,cn=zimbra" write by dn.base="uid=zmpostfix,cn=appaccts,cn=zimbra" read by * read', '{8}to attrs=zimbraId,zimbraMailAddress,zimbraMailAlias,zimbraMailCanonicalAddress,zimbraMailCatchAllAddress,zimbraMailCatchAllCanonicalAddress,zimbraMailCatchAllForwardingAddress,zimbraMailDeliveryAddress,zimbraMailForwardingAddress,zimbraPrefMailForwardingAddress,zimbraMailHost,zimbraMailStatus,zimbraMailTransport,zimbraDomainName,zimbraDomainType,zimbraPrefMailLocalDeliveryDisabled by dn.children="cn=admins,cn=zimbra" write by dn.base="uid=zmpostfix,cn=appaccts,cn=zimbra" read by dn.base="uid=zmamavis,cn=appaccts,cn=zimbra" read by * read',
);
}



$mesg = $ldap->modify(
   $dn,
   delete => {olcAccess => '{3}'},
   );
$mesg = $ldap->modify(
   $dn,
       add =>{olcAccess=>"$acls[0]"},
   );
$mesg = $ldap->modify(
   $dn,
   delete => {olcAccess => '{7}'},
   );
$mesg = $ldap->modify(
   $dn,
   add => {olcAccess => "$acls[1]"},
   );
$mesg = $ldap->modify(
   $dn,
   delete => {olcAccess => '{8}'},
   );
$mesg = $ldap->modify(
   $dn,
       add =>{olcAccess=>"$acls[2]"},
   );
$ldap->unbind;




Again, the ability to delete an existing acl by its ordering is invaluable. So is the ability to do inserts in the ACL tables based on the ordering number.


Here's another bit I've done to modify an existing ACL when upgrading between Zimbra versions:

   my $entry=$result->entry($result->count-1);
   my @attrvals=$entry->get_value("olcAccess");
   my $aclNumber=-1;
   my $attrMod="";

   foreach my $attr (@attrvals) {
     if ($attr =~ /zimbraDomainName/) {
       ($aclNumber) = $attr =~ /^\{(\d+)\}*/;
       if ($attr !~ /uid=zmamavis,cn=appaccts,cn=zimbra/) {
         $attrMod=$attr;
$attrMod =~ s/by \* none/by dn.base="uid=zmamavis,cn=appaccts,cn=zimbra" read by \* none/;
       }
     }
   }

   if ($aclNumber != -1 && $attrMod ne "") {
     $result = $ldap->modify(
         $dn,
         delete => {olcAccess => "{$aclNumber}"},
     );
     $result = $ldap->modify(
         $dn,
         add =>{olcAccess=>"$attrMod"},
     );
   }



--Quanah


--

Quanah Gibson-Mount
Sr. Member of Technical Staff
Zimbra, Inc
A Division of VMware, Inc.
--------------------
Zimbra ::  the leader in open source messaging and collaboration