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

Re: (ITS#4962) inconsistent Bind(rootdn) behavior



h.b.furuseth@usit.uio.no wrote:

> Backends are quite inconsistent about how Bind treats rootdn/rootpw.
> After a quick browse of the HEAD code, it looks like this - I'll
> investigate closer if needed:
> 
> rootpw supported:
>     Yes: config, bdb, meta, monitor, ldif, HEAD:null, sql, overlay retcode.
>     No:  dnssrv, ldap?, RE23:null, perl, relay, shell.

back-ldap doesn't care about rootdn/rootpw; back-meta does mostly for
historical reasons (could be removed with some work).

>     (Bind not supported: passwd).
> 
> Rootpw vs. normal Bind as rootdn (typically when rootdn names an entry):
>     config, bdb, null, sql, overlay retcode (I think):
>         Try rootpw first, then if failure try normal Bind (even if
>         rootpw exists but the Bind password does not match it).
>     ldif:
>         Do not try rootpw if rootdn names an existing entry.
>     meta:
>         Fail if rootpw is missing or does not match, more complicated
>         otherwise.
>     monitor:
>         Fine - there are no entries with passwords.

(yet :)

I discovered that back-monitor may benefit from having a rootdn because
this provides a means to easily workaround any ACLs.  The availability
of rootpw is also important because I ran into few cases where no other
means to authenticate were available, and all in all this feature (I
mean: rootdn w/ rootpw comes for free from the database infrastructure).

> The manpage is (fortunately:-) unclear on what happens in this case.

}-)

> Check if op->orb_method == LDAP_AUTH_SIMPLE:
>     Yes: config, bdb, meta, monitor.
>     No:  ldif, null, sql, overlay retcode.

I don't think we can get to calling bi_op_bind() otherwise... could even
be an assertion.

> Set op->orb_edn (op->oq_bind.rb_edn) from be_root_dn() on success:
>     config, bdb, monitor, sql.
> 
> Set op->orb_edn on failure:
>     bdb: Sometimes, from &e->e_name.
>     sql: Always, from op->o_req_ndn.

Not sure what does this mean: op->orb_edn should only be set in case of
success, AFAIK.

> Set rs->sr_err = LDAP_SUCCESS on success:
>     ldif, meta

For consistency, I presume.  The caller will just check the response code.

> Reset rs->sr_text:
>     meta
> 
> Which behavior is right?  I'm wondering if Bind should fail if rootpw
> exists but the Bind password does not match it.
> 
> In any case, methinks we need a be_rootpw_bind(op, rs) function which
> takes care of this consistently, so bi_op_bind in most cases can just do
>     if (be_rootpw_bind(op, rs)) return rs->sr_err;
> If needed it could accept rs==NULL to just check the password - like
> be_isroot_pw() but with more return codes to distinguish different
> cases.

At this point, it might be worth moving this check outside bi_op_bind().
 Wait a moment: we need to do something else at least in back-meta if
rootdn bind succeeds... but I think that could be changed.

p.



Ing. Pierangelo Masarati
OpenLDAP Core Team

SysNet s.r.l.
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
---------------------------------------