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

Re: Another ACL question about set usage



Emmanuel Dreyfus wrote:

> 1) a person must be able to modify a mailAddress when it receives mail
> from this address. This is done by an ACL clause like this (obtained
> from this mailing list)
>     by set.exact="this/mail & user/mail" write
> It works very well. That goal is fullfilled.
Looks just fine.

> 2) a user listed as a manager for an ou must be able to modify the
> persons within the ou. I've came to the following:
> 
> access to dn.regex="uid=.+,ou=(.+),dc=example,dc=net$"
>     by set.expand="[ou=$1,dc=example,dc=net]/manager* & user" write
> 
> That works, though it seems to be very poor on the performance front.

Not sure you need to further expand the manager (the "star" at the end
of /manager*).  Furthermore, if that's your real DN layout, you could
try something like

access to dn.regex="^uid=.+,(ou=.+,dc=example,dc=net)$"
     by set.expand="[$1]/manager & user" write

I also note that

access to dn.regex="^uid=.+,(ou=.+,dc=example,dc=net)$"
     by group/organizationalUnit/manager.expand="$1" write

should be equivalent and much more efficient (but, AFAIK,
organizationalUnit does not allow manager!).

The above says that if you treat the objectClass "organizationalUnit" as
a group, and "manager" as the group's member attribute, and the
manager's value matches the user's identity, access is granted.

> I
> tried something more simplier, such as:
>      by set.exact="this/ou/manager & user"
> or that way:
>      by set.exact="(this/ou+[,dc=example,dc=net])/manager & user"
> but it does not work, I have no idea why. I'm very curious to learn
> what's wrong here.


As far as I understand, "ou" contains the name of the
organizationalUnit, not its DN.  So set expansion does not work, because
it only acts on DNs.  Maybe something like

    by set.exact="([cn=]+this/ou+[dc=example,dc=net])/manager & user"

You see, in the last case you were almost there: all you're missing is
the [cn=]+ at the beginning of the DN.  But see my much cleaner example
above, which should be the most efficient thing you can do.

> 
> 3) The trickiest part, for which I have no solution: a user listed as a
> manager for an ou must be able to modify the mailAddress that a user he
> can modify could modify.
> 
> I can try to rephrase this a bit better. If I have the following
> (mailAddress, person, ou) triplet
> dn: mail=W,dc=example,dc=net
> 
> dn: uid=X,ou=Y,dc=example.dc=net
> mail: W
> 
> dn: ou=Y,dc=example,dc=net
> manager: Z
> 
> I want user Z to be able to modify mailAddress W
> 
> Here is an attempt that does not work
>    by set.exact="
>     ([uid=*,ou=] + ([manager=] + user)/ou*) + [,dc=example,dc=net])/mail
>     & this/mail" write

This seems to be hard to get.  As far as I understand:

- your final relation should be
    ANS ::= "this/mail & USERS/mail"

- where USERS is defined as
    USERS ::= "[ldap:///OUDN??one]/entryDN";

- but what's missing is how to compute OUDN from what you've got; this
should do what you need:
    OUDN ::= "([ldap:///dc=example,dc=net??one(manager=]+user+[)])/entryDN"

so performing the substitutions, and breaking up and combining literals
as appropriate

    by set.exact="this/mail &
([ldap:///]+([ldap:///dc=example,dc=net??one(manager=]+user+[)])/entryDN+[??one]/entryDN)/mail"

the above should work.  Unless I missed something in your description,
of course.

Note that performances will be ugly...

p.



Ing. Pierangelo Masarati
OpenLDAP Core Team

SysNet s.n.c.
Via Dossi, 8 - 27100 Pavia - ITALIA
http://www.sys-net.it
------------------------------------------
Office:   +39.02.23998309
Mobile:   +39.333.4963172
Email:    pierangelo.masarati@sys-net.it
------------------------------------------