1 /* bind.c - bdb backend bind routine */
2 /* $OpenLDAP: pkg/ldap/servers/slapd/back-bdb/bind.c,v 1.45.2.4 2008/02/11 23:26:45 kurt Exp $ */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 * Copyright 2000-2008 The OpenLDAP Foundation.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted only as authorized by the OpenLDAP
12 * A copy of this license is available in the file LICENSE in the
13 * top-level directory of the distribution or, alternatively, at
14 * <http://www.OpenLDAP.org/license.html>.
20 #include <ac/string.h>
21 #include <ac/unistd.h>
26 bdb_bind( Operation
*op
, SlapReply
*rs
)
28 struct bdb_info
*bdb
= (struct bdb_info
*) op
->o_bd
->be_private
;
33 AttributeDescription
*password
= slap_schema
.si_ad_userPassword
;
38 Debug( LDAP_DEBUG_ARGS
,
39 "==> " LDAP_XSTRING(bdb_bind
) ": dn: %s\n",
40 op
->o_req_dn
.bv_val
, 0, 0);
42 /* allow noauth binds */
43 switch ( be_rootdn_bind( op
, NULL
) ) {
45 /* frontend will send result */
49 /* give the database a chanche */
50 /* NOTE: this behavior departs from that of other backends,
51 * since the others, in case of password checking failure
52 * do not give the database a chance. If an entry with
53 * rootdn's name does not exist in the database the result
54 * will be the same. See ITS#4962 for discussion. */
58 rs
->sr_err
= LOCK_ID(bdb
->bi_dbenv
, &locker
);
63 rs
->sr_text
= "internal error";
64 send_ldap_result( op
, rs
);
69 /* get entry with reader lock */
70 rs
->sr_err
= bdb_dn2entry( op
, NULL
, &op
->o_req_ndn
, &ei
, 1,
78 send_ldap_error( op
, rs
, LDAP_BUSY
, "ldap_server_busy" );
79 LOCK_ID_FREE(bdb
->bi_dbenv
, locker
);
81 case DB_LOCK_DEADLOCK
:
82 case DB_LOCK_NOTGRANTED
:
85 send_ldap_error( op
, rs
, LDAP_OTHER
, "internal error" );
86 LOCK_ID_FREE(bdb
->bi_dbenv
, locker
);
91 if ( rs
->sr_err
== DB_NOTFOUND
) {
93 bdb_cache_return_entry_r( bdb
, e
, &lock
);
97 rs
->sr_err
= LDAP_INVALID_CREDENTIALS
;
98 send_ldap_result( op
, rs
);
100 LOCK_ID_FREE(bdb
->bi_dbenv
, locker
);
105 ber_dupbv( &op
->oq_bind
.rb_edn
, &e
->e_name
);
107 /* check for deleted */
108 if ( is_entry_subentry( e
) ) {
109 /* entry is an subentry, don't allow bind */
110 Debug( LDAP_DEBUG_TRACE
, "entry is subentry\n", 0,
112 rs
->sr_err
= LDAP_INVALID_CREDENTIALS
;
116 if ( is_entry_alias( e
) ) {
117 /* entry is an alias, don't allow bind */
118 Debug( LDAP_DEBUG_TRACE
, "entry is alias\n", 0, 0, 0 );
119 rs
->sr_err
= LDAP_INVALID_CREDENTIALS
;
123 if ( is_entry_referral( e
) ) {
124 Debug( LDAP_DEBUG_TRACE
, "entry is referral\n", 0,
126 rs
->sr_err
= LDAP_INVALID_CREDENTIALS
;
130 switch ( op
->oq_bind
.rb_method
) {
131 case LDAP_AUTH_SIMPLE
:
132 a
= attr_find( e
->e_attrs
, password
);
134 rs
->sr_err
= LDAP_INVALID_CREDENTIALS
;
138 if ( slap_passwd_check( op
, e
, a
, &op
->oq_bind
.rb_cred
,
139 &rs
->sr_text
) != 0 )
141 /* failure; stop front end from sending result */
142 rs
->sr_err
= LDAP_INVALID_CREDENTIALS
;
150 assert( 0 ); /* should not be reachable */
151 rs
->sr_err
= LDAP_STRONG_AUTH_NOT_SUPPORTED
;
152 rs
->sr_text
= "authentication method not supported";
156 /* free entry and reader lock */
158 bdb_cache_return_entry_r( bdb
, e
, &lock
);
161 LOCK_ID_FREE(bdb
->bi_dbenv
, locker
);
164 send_ldap_result( op
, rs
);
166 ber_bvarray_free( rs
->sr_ref
);
170 /* front end will send result on success (rs->sr_err==0) */