version 1.12.2.10, 2005/11/03 18:03:00
|
version 1.12.2.11, 2005/11/04 23:08:35
|
Line 1
|
Line 1
|
/* chain.c - chain LDAP operations */ |
/* chain.c - chain LDAP operations */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/chain.c,v 1.12.2.9 2005/08/09 21:04:02 kurt Exp $ */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/chain.c,v 1.12.2.10 2005/11/03 18:03:00 kurt Exp $ */ |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
* |
* |
* Copyright 2003-2005 The OpenLDAP Foundation. |
* Copyright 2003-2005 The OpenLDAP Foundation. |
Line 69 typedef struct ldap_chain_t {
|
Line 69 typedef struct ldap_chain_t {
|
#define LDAP_CHAIN_F_NONE 0x00U |
#define LDAP_CHAIN_F_NONE 0x00U |
#define LDAP_CHAIN_F_CHAINING 0x01U |
#define LDAP_CHAIN_F_CHAINING 0x01U |
|
|
|
ldap_pvt_thread_mutex_t lc_mutex; |
|
|
#ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR |
#ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR |
LDAPControl lc_chaining_ctrl; |
LDAPControl lc_chaining_ctrl; |
char lc_chaining_ctrlflag; |
char lc_chaining_ctrlflag; |
Line 259 ldap_chain_op(
|
Line 261 ldap_chain_op(
|
{ |
{ |
slap_overinst *on = (slap_overinst *) op->o_bd->bd_info; |
slap_overinst *on = (slap_overinst *) op->o_bd->bd_info; |
ldap_chain_t *lc = (ldap_chain_t *)on->on_bi.bi_private; |
ldap_chain_t *lc = (ldap_chain_t *)on->on_bi.bi_private; |
struct ldapinfo li, *lip = lc->lc_li; |
|
|
struct ldapinfo *lip = lc->lc_li; |
|
char *save_url = NULL; |
|
SlapReply rs2 = { 0 }; |
|
|
/* NOTE: returned if ref is empty... */ |
/* NOTE: returned if ref is empty... */ |
int rc = LDAP_OTHER; |
int rc = LDAP_OTHER; |
Line 272 ldap_chain_op(
|
Line 277 ldap_chain_op(
|
|
|
if ( lip->url != NULL ) { |
if ( lip->url != NULL ) { |
op->o_bd->be_private = lip; |
op->o_bd->be_private = lip; |
rc = ( *op_f )( op, rs ); |
rc = ( *op_f )( op, &rs2 ); |
|
rs->sr_err = rs2.sr_err; |
goto done; |
goto done; |
} |
} |
|
|
li = *lip; |
save_url = lip->url; |
op->o_bd->be_private = &li; |
lip->url = NULL; |
|
op->o_bd->be_private = lip; |
|
|
/* if we parse the URI then by no means |
/* if we parse the URI then by no means |
* we can cache stuff or reuse connections, |
* we can cache stuff or reuse connections, |
Line 321 Document: draft-ietf-ldapbis-protocol-27
|
Line 328 Document: draft-ietf-ldapbis-protocol-27
|
save_dn = srv->lud_dn; |
save_dn = srv->lud_dn; |
srv->lud_dn = ""; |
srv->lud_dn = ""; |
srv->lud_scope = LDAP_SCOPE_DEFAULT; |
srv->lud_scope = LDAP_SCOPE_DEFAULT; |
li.url = ldap_url_desc2str( srv ); |
lip->url = ldap_url_desc2str( srv ); |
srv->lud_dn = save_dn; |
srv->lud_dn = save_dn; |
ldap_free_urldesc( srv ); |
ldap_free_urldesc( srv ); |
|
|
if ( li.url == NULL ) { |
if ( lip->url == NULL ) { |
/* try next */ |
/* try next */ |
rc = LDAP_OTHER; |
rc = LDAP_OTHER; |
continue; |
continue; |
} |
} |
|
|
rc = ( *op_f )( op, rs ); |
rc = ( *op_f )( op, &rs2 ); |
|
rs->sr_err = rs2.sr_err; |
|
|
ldap_memfree( li.url ); |
ldap_memfree( lip->url ); |
li.url = NULL; |
lip->url = NULL; |
|
|
if ( rc == LDAP_SUCCESS && rs->sr_err == LDAP_SUCCESS ) { |
if ( rc == LDAP_SUCCESS && rs->sr_err == LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
} |
} |
|
|
|
lip->url = save_url; |
|
|
done:; |
done:; |
#ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR |
#ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR |
(void)chaining_control_remove( op, &ctrls ); |
(void)chaining_control_remove( op, &ctrls ); |
Line 362 ldap_chain_response( Operation *op, Slap
|
Line 372 ldap_chain_response( Operation *op, Slap
|
struct berval ndn = op->o_ndn; |
struct berval ndn = op->o_ndn; |
|
|
ldap_chain_t *lc = (ldap_chain_t *)on->on_bi.bi_private; |
ldap_chain_t *lc = (ldap_chain_t *)on->on_bi.bi_private; |
struct ldapinfo li, *lip = lc->lc_li; |
struct ldapinfo *lip = lc->lc_li; |
|
|
#ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR |
#ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR |
int sr_err = rs->sr_err; |
int sr_err = rs->sr_err; |
Line 402 ldap_chain_response( Operation *op, Slap
|
Line 412 ldap_chain_response( Operation *op, Slap
|
} |
} |
#endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */ |
#endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */ |
|
|
|
ldap_pvt_thread_mutex_lock( &lc->lc_mutex ); |
|
|
/* |
/* |
* TODO: add checks on who/when chain operations; e.g.: |
* TODO: add checks on who/when chain operations; e.g.: |
* a) what identities are authorized |
* a) what identities are authorized |
Line 441 ldap_chain_response( Operation *op, Slap
|
Line 453 ldap_chain_response( Operation *op, Slap
|
} |
} |
break; |
break; |
case LDAP_REQ_ADD: |
case LDAP_REQ_ADD: |
/* slap_mods2entry () should be called in do_add() */ |
|
assert( op->ora_e->e_attrs != NULL ); |
|
rc = ldap_chain_op( op, rs, lback->bi_op_add, ref ); |
rc = ldap_chain_op( op, rs, lback->bi_op_add, ref ); |
break; |
break; |
case LDAP_REQ_DELETE: |
case LDAP_REQ_DELETE: |
Line 462 ldap_chain_response( Operation *op, Slap
|
Line 472 ldap_chain_response( Operation *op, Slap
|
struct berval *curr = ref, |
struct berval *curr = ref, |
odn = op->o_req_dn, |
odn = op->o_req_dn, |
ondn = op->o_req_ndn; |
ondn = op->o_req_ndn; |
|
char *save_url = NULL; |
|
SlapReply rs2 = { 0 }; |
|
|
#ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR |
#ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR |
LDAPControl **ctrls = NULL; |
LDAPControl **ctrls = NULL; |
Line 473 ldap_chain_response( Operation *op, Slap
|
Line 485 ldap_chain_response( Operation *op, Slap
|
|
|
sc2.sc_response = ldap_chain_cb_search_response; |
sc2.sc_response = ldap_chain_cb_search_response; |
|
|
li = *lip; |
save_url = lip->url; |
li.url = NULL; |
lip->url = NULL; |
op->o_bd->be_private = &li; |
op->o_bd->be_private = lip; |
|
|
/* if we parse the URI then by no means |
/* if we parse the URI then by no means |
* we can cache stuff or reuse connections, |
* we can cache stuff or reuse connections, |
Line 504 ldap_chain_response( Operation *op, Slap
|
Line 516 ldap_chain_response( Operation *op, Slap
|
save_dn = srv->lud_dn; |
save_dn = srv->lud_dn; |
srv->lud_dn = ""; |
srv->lud_dn = ""; |
srv->lud_scope = LDAP_SCOPE_DEFAULT; |
srv->lud_scope = LDAP_SCOPE_DEFAULT; |
li.url = ldap_url_desc2str( srv ); |
lip->url = ldap_url_desc2str( srv ); |
if ( li.url != NULL ) { |
if ( lip->url != NULL ) { |
ber_str2bv_x( save_dn, 0, 1, &op->o_req_dn, |
ber_str2bv_x( save_dn, 0, 1, &op->o_req_dn, |
op->o_tmpmemctx ); |
op->o_tmpmemctx ); |
ber_dupbv_x( &op->o_req_ndn, &op->o_req_dn, |
ber_dupbv_x( &op->o_req_ndn, &op->o_req_dn, |
Line 515 ldap_chain_response( Operation *op, Slap
|
Line 527 ldap_chain_response( Operation *op, Slap
|
srv->lud_dn = save_dn; |
srv->lud_dn = save_dn; |
ldap_free_urldesc( srv ); |
ldap_free_urldesc( srv ); |
|
|
if ( li.url == NULL ) { |
if ( lip->url == NULL ) { |
/* try next */ |
/* try next */ |
rs->sr_err = LDAP_OTHER; |
rs->sr_err = LDAP_OTHER; |
continue; |
continue; |
Line 524 ldap_chain_response( Operation *op, Slap
|
Line 536 ldap_chain_response( Operation *op, Slap
|
|
|
/* FIXME: should we also copy filter and scope? |
/* FIXME: should we also copy filter and scope? |
* according to RFC3296, no */ |
* according to RFC3296, no */ |
rc = lback->bi_op_search( op, rs ); |
rc = lback->bi_op_search( op, &rs2 ); |
|
rs->sr_err = rs2.sr_err; |
|
|
ldap_memfree( li.url ); |
ldap_memfree( lip->url ); |
li.url = NULL; |
lip->url = NULL; |
|
|
op->o_tmpfree( op->o_req_dn.bv_val, |
op->o_tmpfree( op->o_req_dn.bv_val, |
op->o_tmpmemctx ); |
op->o_tmpmemctx ); |
Line 545 ldap_chain_response( Operation *op, Slap
|
Line 558 ldap_chain_response( Operation *op, Slap
|
(void)chaining_control_remove( op, &ctrls ); |
(void)chaining_control_remove( op, &ctrls ); |
#endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */ |
#endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */ |
|
|
|
lip->url = save_url; |
|
|
op->o_req_dn = odn; |
op->o_req_dn = odn; |
op->o_req_ndn = ondn; |
op->o_req_ndn = ondn; |
rs->sr_type = REP_SEARCHREF; |
rs->sr_type = REP_SEARCHREF; |
Line 613 dont_chain:;
|
Line 628 dont_chain:;
|
op->o_ndn = ndn; |
op->o_ndn = ndn; |
rs->sr_ref = ref; |
rs->sr_ref = ref; |
|
|
|
ldap_pvt_thread_mutex_unlock( &lc->lc_mutex ); |
|
|
return rc; |
return rc; |
} |
} |
|
|
Line 1074 ldap_chain_db_init(
|
Line 1091 ldap_chain_db_init(
|
lc = ch_malloc( sizeof( ldap_chain_t ) ); |
lc = ch_malloc( sizeof( ldap_chain_t ) ); |
memset( lc, 0, sizeof( ldap_chain_t ) ); |
memset( lc, 0, sizeof( ldap_chain_t ) ); |
|
|
|
ldap_pvt_thread_mutex_init( &lc->lc_mutex ); |
|
|
bd.be_private = NULL; |
bd.be_private = NULL; |
rc = lback->bi_db_init( &bd ); |
rc = lback->bi_db_init( &bd ); |
lc->lc_li = (struct ldapinfo *)bd.be_private; |
lc->lc_li = (struct ldapinfo *)bd.be_private; |
Line 1108 ldap_chain_db_destroy(
|
Line 1127 ldap_chain_db_destroy(
|
|
|
be->be_private = (void *)lc->lc_li; |
be->be_private = (void *)lc->lc_li; |
rc = lback->bi_db_destroy( be ); |
rc = lback->bi_db_destroy( be ); |
lc->lc_li = be->be_private; |
ldap_pvt_thread_mutex_destroy( &lc->lc_mutex ); |
ch_free( lc ); |
ch_free( lc ); |
on->on_bi.bi_private = NULL; |
on->on_bi.bi_private = NULL; |
be->be_private = private; |
be->be_private = private; |