mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-04-18 15:20:35 +08:00
propagate selected changes to back-ldap
This commit is contained in:
parent
1ce560383a
commit
5804183f04
@ -83,6 +83,7 @@ static int
|
||||
meta_back_do_single_bind(
|
||||
struct metaconn *lc,
|
||||
Operation *op,
|
||||
SlapReply *rs,
|
||||
int candidate
|
||||
);
|
||||
|
||||
@ -94,7 +95,8 @@ meta_back_bind( Operation *op, SlapReply *rs )
|
||||
|
||||
int rc = -1, i, gotit = 0, ndnlen, isroot = 0;
|
||||
int op_type = META_OP_ALLOW_MULTIPLE;
|
||||
int err = LDAP_SUCCESS;
|
||||
|
||||
rs->sr_err = LDAP_SUCCESS;
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( BACK_META, ENTRY, "meta_back_bind: dn: %s.\n",
|
||||
@ -173,9 +175,9 @@ meta_back_bind( Operation *op, SlapReply *rs )
|
||||
op->oq_bind.rb_method = LDAP_AUTH_SIMPLE;
|
||||
}
|
||||
|
||||
lerr = meta_back_do_single_bind( lc, op, i );
|
||||
lerr = meta_back_do_single_bind( lc, op, rs, i );
|
||||
if ( lerr != LDAP_SUCCESS ) {
|
||||
err = lerr;
|
||||
rs->sr_err = lerr;
|
||||
( void )meta_clear_one_candidate( &lc->conns[ i ], 1 );
|
||||
} else {
|
||||
rc = LDAP_SUCCESS;
|
||||
@ -196,7 +198,7 @@ meta_back_bind( Operation *op, SlapReply *rs )
|
||||
* err is the last error that occurred during a bind;
|
||||
* if at least (and at most?) one bind succeedes, fine.
|
||||
*/
|
||||
if ( rc != LDAP_SUCCESS /* && err != LDAP_SUCCESS */ ) {
|
||||
if ( rc != LDAP_SUCCESS /* && rs->sr_err != LDAP_SUCCESS */ ) {
|
||||
|
||||
/*
|
||||
* deal with bind failure ...
|
||||
@ -206,11 +208,11 @@ meta_back_bind( Operation *op, SlapReply *rs )
|
||||
* no target was found within the naming context,
|
||||
* so bind must fail with invalid credentials
|
||||
*/
|
||||
if ( err == LDAP_SUCCESS && gotit == 0 ) {
|
||||
err = LDAP_INVALID_CREDENTIALS;
|
||||
if ( rs->sr_err == LDAP_SUCCESS && gotit == 0 ) {
|
||||
rs->sr_err = LDAP_INVALID_CREDENTIALS;
|
||||
}
|
||||
|
||||
rs->sr_err = ldap_back_map_result( err );
|
||||
rs->sr_err = ldap_back_map_result( rs );
|
||||
send_ldap_result( op, rs );
|
||||
return -1;
|
||||
}
|
||||
@ -227,12 +229,12 @@ static int
|
||||
meta_back_do_single_bind(
|
||||
struct metaconn *lc,
|
||||
Operation *op,
|
||||
SlapReply *rs,
|
||||
int candidate
|
||||
)
|
||||
{
|
||||
struct metainfo *li = ( struct metainfo * )op->o_bd->be_private;
|
||||
struct berval mdn = { 0, NULL };
|
||||
int rc;
|
||||
ber_int_t msgid;
|
||||
|
||||
/*
|
||||
@ -266,19 +268,19 @@ meta_back_do_single_bind(
|
||||
}
|
||||
|
||||
if ( op->o_ctrls ) {
|
||||
rc = ldap_set_option( lc->conns[ candidate ].ld,
|
||||
rs->sr_err = ldap_set_option( lc->conns[ candidate ].ld,
|
||||
LDAP_OPT_SERVER_CONTROLS, op->o_ctrls );
|
||||
if ( rc != LDAP_SUCCESS ) {
|
||||
rc = ldap_back_map_result( rc );
|
||||
if ( rs->sr_err != LDAP_SUCCESS ) {
|
||||
rs->sr_err = ldap_back_map_result( rs );
|
||||
goto return_results;
|
||||
}
|
||||
}
|
||||
|
||||
rc = ldap_sasl_bind(lc->conns[ candidate ].ld, mdn.bv_val,
|
||||
rs->sr_err = ldap_sasl_bind(lc->conns[ candidate ].ld, mdn.bv_val,
|
||||
LDAP_SASL_SIMPLE, &op->oq_bind.rb_cred,
|
||||
op->o_ctrls, NULL, &msgid);
|
||||
if ( rc != LDAP_SUCCESS ) {
|
||||
rc = ldap_back_map_result( rc );
|
||||
if ( rs->sr_err != LDAP_SUCCESS ) {
|
||||
rs->sr_err = ldap_back_map_result( rs );
|
||||
|
||||
} else {
|
||||
/*
|
||||
@ -311,7 +313,7 @@ return_results:;
|
||||
free( mdn.bv_val );
|
||||
}
|
||||
|
||||
return rc;
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -459,12 +461,13 @@ meta_back_op_result( struct metaconn *lc, Operation *op, SlapReply *rs )
|
||||
char *rmatch = NULL;
|
||||
|
||||
for ( i = 0, lsc = lc->conns; !META_LAST(lsc); ++i, ++lsc ) {
|
||||
int err = LDAP_SUCCESS;
|
||||
char *msg = NULL;
|
||||
char *match = NULL;
|
||||
|
||||
ldap_get_option( lsc->ld, LDAP_OPT_ERROR_NUMBER, &err );
|
||||
if ( err != LDAP_SUCCESS ) {
|
||||
rs->sr_err = LDAP_SUCCESS;
|
||||
|
||||
ldap_get_option( lsc->ld, LDAP_OPT_ERROR_NUMBER, &rs->sr_err );
|
||||
if ( rs->sr_err != LDAP_SUCCESS ) {
|
||||
/*
|
||||
* better check the type of error. In some cases
|
||||
* (search ?) it might be better to return a
|
||||
@ -475,7 +478,7 @@ meta_back_op_result( struct metaconn *lc, Operation *op, SlapReply *rs )
|
||||
LDAP_OPT_ERROR_STRING, &msg );
|
||||
ldap_get_option( lsc->ld,
|
||||
LDAP_OPT_MATCHED_DN, &match );
|
||||
err = ldap_back_map_result( err );
|
||||
rs->sr_err = ldap_back_map_result( rs );
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( BACK_META, RESULTS,
|
||||
@ -496,9 +499,9 @@ meta_back_op_result( struct metaconn *lc, Operation *op, SlapReply *rs )
|
||||
/*
|
||||
* FIXME: need to rewrite "match" (need rwinfo)
|
||||
*/
|
||||
switch ( err ) {
|
||||
switch ( rs->sr_err ) {
|
||||
default:
|
||||
rerr = err;
|
||||
rerr = rs->sr_err;
|
||||
rmsg = msg;
|
||||
msg = NULL;
|
||||
rmatch = match;
|
||||
|
@ -233,8 +233,8 @@ meta_back_compare( Operation *op, SlapReply *rs )
|
||||
goto finish;
|
||||
}
|
||||
|
||||
cres = ldap_result2error( lsc->ld, res, 1 );
|
||||
switch ( cres ) {
|
||||
rs->sr_err = ldap_result2error( lsc->ld, res, 1 );
|
||||
switch ( rs->sr_err ) {
|
||||
case LDAP_COMPARE_TRUE:
|
||||
case LDAP_COMPARE_FALSE:
|
||||
|
||||
@ -251,7 +251,7 @@ meta_back_compare( Operation *op, SlapReply *rs )
|
||||
break;
|
||||
|
||||
default:
|
||||
rres = ldap_back_map_result( cres );
|
||||
rres = ldap_back_map_result( rs );
|
||||
|
||||
if ( err != NULL ) {
|
||||
free( err );
|
||||
|
@ -221,13 +221,13 @@ metaconn_free(
|
||||
*/
|
||||
static int
|
||||
init_one_conn(
|
||||
Operation *op,
|
||||
SlapReply *rs,
|
||||
Operation *op,
|
||||
SlapReply *rs,
|
||||
struct metatarget *lt,
|
||||
struct metasingleconn *lsc
|
||||
)
|
||||
{
|
||||
int err, vers;
|
||||
int vers;
|
||||
|
||||
/*
|
||||
* Already init'ed
|
||||
@ -239,9 +239,9 @@ init_one_conn(
|
||||
/*
|
||||
* Attempts to initialize the connection to the target ds
|
||||
*/
|
||||
err = ldap_initialize( &lsc->ld, lt->uri );
|
||||
if ( err != LDAP_SUCCESS ) {
|
||||
return ldap_back_map_result( err );
|
||||
rs->sr_err = ldap_initialize( &lsc->ld, lt->uri );
|
||||
if ( rs->sr_err != LDAP_SUCCESS ) {
|
||||
return ldap_back_map_result( rs );
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -105,8 +105,7 @@ meta_back_search( Operation *op, SlapReply *rs )
|
||||
LDAPMessage *res, *e;
|
||||
int count, rc = 0, *msgid, sres = LDAP_NO_SUCH_OBJECT;
|
||||
char *match = NULL, *err = NULL;
|
||||
char *mbase = NULL, *mmatch = NULL;
|
||||
struct berval mfilter;
|
||||
char *mmatch = NULL;
|
||||
BerVarray v2refs = NULL;
|
||||
|
||||
int i, last = 0, candidates = 0;
|
||||
@ -210,10 +209,12 @@ meta_back_search( Operation *op, SlapReply *rs )
|
||||
* Inits searches
|
||||
*/
|
||||
for ( i = 0, lsc = lc->conns; !META_LAST(lsc); ++i, ++lsc ) {
|
||||
char *realbase = ( char * )op->o_req_dn.bv_val;
|
||||
int realscope = op->oq_search.rs_scope;
|
||||
ber_len_t suffixlen;
|
||||
char **mapped_attrs;
|
||||
char *realbase = ( char * )op->o_req_dn.bv_val;
|
||||
int realscope = op->oq_search.rs_scope;
|
||||
ber_len_t suffixlen = 0;
|
||||
char *mbase = NULL;
|
||||
struct berval mfilter = { 0L, NULL };
|
||||
char **mapped_attrs = NULL;
|
||||
|
||||
if ( lsc->candidate != META_CANDIDATE ) {
|
||||
msgid[ i ] = -1;
|
||||
@ -312,83 +313,53 @@ meta_back_search( Operation *op, SlapReply *rs )
|
||||
goto finish;
|
||||
|
||||
case REWRITE_REGEXEC_ERR:
|
||||
#if 0
|
||||
rs->sr_err = LDAP_OTHER;
|
||||
rs->sr_text = "rewrite error";
|
||||
rs->sr_text = "Rewrite error";
|
||||
send_ldap_result( op, rs );
|
||||
rc = -1;
|
||||
goto finish;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Rewrite the search filter, if required
|
||||
*/
|
||||
switch ( rewrite_session( li->targets[ i ]->rwinfo,
|
||||
"searchFilter",
|
||||
filterstr->bv_val, conn, &mfilter.bv_val ) ) {
|
||||
case REWRITE_REGEXEC_OK:
|
||||
if ( mfilter.bv_val != NULL && mfilter.bv_val[ 0 ] != '\0') {
|
||||
mfilter.bv_len = strlen( mfilter.bv_val );
|
||||
} else {
|
||||
if ( mfilter.bv_val != NULL ) {
|
||||
free( mfilter.bv_val );
|
||||
}
|
||||
mfilter = *filterstr;
|
||||
}
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( BACK_META, DETAIL1,
|
||||
"[rw] searchFilter [%d]: \"%s\" -> \"%s\"\n",
|
||||
i, filterstr->bv_val, mfilter.bv_val );
|
||||
#else /* !NEW_LOGGING */
|
||||
Debug( LDAP_DEBUG_ARGS,
|
||||
"rw> searchFilter [%d]: \"%s\" -> \"%s\"\n",
|
||||
i, filterstr->bv_val, mfilter.bv_val );
|
||||
#endif /* !NEW_LOGGING */
|
||||
break;
|
||||
|
||||
case REWRITE_REGEXEC_UNWILLING:
|
||||
send_ldap_result( conn, op, LDAP_UNWILLING_TO_PERFORM,
|
||||
NULL, "Operation not allowed",
|
||||
NULL, NULL );
|
||||
rc = -1;
|
||||
goto finish;
|
||||
|
||||
case REWRITE_REGEXEC_ERR:
|
||||
send_ldap_result( conn, op, LDAP_OTHER,
|
||||
NULL, "Rewrite error", NULL, NULL );
|
||||
rc = -1;
|
||||
goto finish;
|
||||
/*
|
||||
* this target is no longer candidate
|
||||
*/
|
||||
msgid[ i ] = -1;
|
||||
goto new_candidate;
|
||||
}
|
||||
|
||||
/*
|
||||
* Maps attributes in filter
|
||||
* Maps filter
|
||||
*/
|
||||
mapped_filter = ldap_back_map_filter( &li->targets[ i ]->at_map,
|
||||
&li->targets[ i ]->oc_map, &mfilter,
|
||||
BACKLDAP_MAP );
|
||||
if ( mapped_filter == NULL ) {
|
||||
mapped_filter = ( char * )mfilter.bv_val;
|
||||
} else {
|
||||
if ( mfilter.bv_val != filterstr->bv_val ) {
|
||||
free( mfilter.bv_val );
|
||||
}
|
||||
}
|
||||
mfilter.bv_val = NULL;
|
||||
mfilter.bv_len = 0;
|
||||
#endif
|
||||
|
||||
rc = ldap_back_filter_map_rewrite_( li->targets[ i ]->rwinfo,
|
||||
op->o_conn,
|
||||
&li->targets[ i ]->at_map,
|
||||
&li->targets[ i ]->oc_map,
|
||||
op->oq_search.rs_filter,
|
||||
&mfilter, BACKLDAP_MAP );
|
||||
if ( rc != 0 ) {
|
||||
/*
|
||||
* this target is no longer candidate
|
||||
*/
|
||||
msgid[ i ] = -1;
|
||||
goto new_candidate;
|
||||
}
|
||||
|
||||
/*
|
||||
* Maps required attributes
|
||||
*/
|
||||
mapped_attrs = ldap_back_map_attrs( &li->targets[ i ]->at_map,
|
||||
op->oq_search.rs_attrs, BACKLDAP_MAP );
|
||||
rc = ldap_back_map_attrs( &li->targets[ i ]->at_map,
|
||||
op->oq_search.rs_attrs, BACKLDAP_MAP,
|
||||
&mapped_attrs );
|
||||
if ( rc != LDAP_SUCCESS ) {
|
||||
/*
|
||||
* this target is no longer candidate
|
||||
*/
|
||||
msgid[ i ] = -1;
|
||||
goto new_candidate;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if ( mapped_attrs == NULL && op->oq_search.rs_attrs) {
|
||||
for ( count = 0; op->oq_search.rs_attrs[ count ].an_name.bv_val; count++ );
|
||||
mapped_attrs = ch_malloc( ( count + 1 ) * sizeof(char *));
|
||||
@ -397,6 +368,7 @@ meta_back_search( Operation *op, SlapReply *rs )
|
||||
}
|
||||
mapped_attrs[ count ] = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Starts the search
|
||||
@ -553,9 +525,9 @@ new_candidate:;
|
||||
}
|
||||
|
||||
} else {
|
||||
sres = ldap_result2error( lsc->ld,
|
||||
rs->sr_err = ldap_result2error( lsc->ld,
|
||||
res, 1 );
|
||||
sres = ldap_back_map_result( sres );
|
||||
sres = ldap_back_map_result( rs );
|
||||
if ( err != NULL ) {
|
||||
free( err );
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user