mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-18 11:05:48 +08:00
ITS#5941 manage callbacks to coexist with other overlays
This commit is contained in:
parent
9d440e3d28
commit
fc1bcaf9de
@ -992,9 +992,16 @@ trans_filter_dup(Operation *op, Filter *f, AttributeName *an)
|
|||||||
case LDAP_FILTER_SUBSTRINGS:
|
case LDAP_FILTER_SUBSTRINGS:
|
||||||
case LDAP_FILTER_EXT:
|
case LDAP_FILTER_EXT:
|
||||||
if ( !f->f_av_desc || ad_inlist( f->f_av_desc, an )) {
|
if ( !f->f_av_desc || ad_inlist( f->f_av_desc, an )) {
|
||||||
|
AttributeAssertion *nava;
|
||||||
|
|
||||||
n = op->o_tmpalloc( sizeof(Filter), op->o_tmpmemctx );
|
n = op->o_tmpalloc( sizeof(Filter), op->o_tmpmemctx );
|
||||||
n->f_choice = f->f_choice;
|
n->f_choice = f->f_choice;
|
||||||
n->f_ava = f->f_ava;
|
|
||||||
|
nava = op->o_tmpalloc( sizeof(AttributeAssertion), op->o_tmpmemctx );
|
||||||
|
*nava = *f->f_ava;
|
||||||
|
n->f_ava = nava;
|
||||||
|
|
||||||
|
ber_dupbv_x( &n->f_av_value, &f->f_av_value, op->o_tmpmemctx );
|
||||||
n->f_next = NULL;
|
n->f_next = NULL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1055,12 +1062,30 @@ trans_filter_free( Operation *op, Filter *f )
|
|||||||
trans_filter_free( op, p );
|
trans_filter_free( op, p );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case LDAP_FILTER_EQUALITY:
|
||||||
|
case LDAP_FILTER_GE:
|
||||||
|
case LDAP_FILTER_LE:
|
||||||
|
case LDAP_FILTER_APPROX:
|
||||||
|
case LDAP_FILTER_SUBSTRINGS:
|
||||||
|
case LDAP_FILTER_EXT:
|
||||||
|
op->o_tmpfree( f->f_av_value.bv_val, op->o_tmpmemctx );
|
||||||
|
op->o_tmpfree( f->f_ava, op->o_tmpmemctx );
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
op->o_tmpfree( f, op->o_tmpmemctx );
|
op->o_tmpfree( f, op->o_tmpmemctx );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
translucent_search_cleanup( Operation *op, SlapReply *rs )
|
||||||
|
{
|
||||||
|
trans_ctx *tc = op->o_callback->sc_private;
|
||||||
|
|
||||||
|
op->ors_filter = tc->orig;
|
||||||
|
return LDAP_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** translucent_search()
|
** translucent_search()
|
||||||
** search via captive backend;
|
** search via captive backend;
|
||||||
@ -1092,8 +1117,8 @@ static int translucent_search(Operation *op, SlapReply *rs) {
|
|||||||
fr = ov->remote ? trans_filter_dup( op, op->ors_filter, ov->remote ) : NULL;
|
fr = ov->remote ? trans_filter_dup( op, op->ors_filter, ov->remote ) : NULL;
|
||||||
fl = ov->local ? trans_filter_dup( op, op->ors_filter, ov->local ) : NULL;
|
fl = ov->local ? trans_filter_dup( op, op->ors_filter, ov->local ) : NULL;
|
||||||
cb.sc_response = (slap_response *) translucent_search_cb;
|
cb.sc_response = (slap_response *) translucent_search_cb;
|
||||||
|
cb.sc_cleanup = (slap_response *) translucent_search_cleanup;
|
||||||
cb.sc_private = &tc;
|
cb.sc_private = &tc;
|
||||||
cb.sc_next = op->o_callback;
|
|
||||||
|
|
||||||
ov->db.be_acl = op->o_bd->be_acl;
|
ov->db.be_acl = op->o_bd->be_acl;
|
||||||
tc.db = op->o_bd;
|
tc.db = op->o_bd;
|
||||||
@ -1105,27 +1130,39 @@ static int translucent_search(Operation *op, SlapReply *rs) {
|
|||||||
tc.attrs = NULL;
|
tc.attrs = NULL;
|
||||||
fbv = op->ors_filterstr;
|
fbv = op->ors_filterstr;
|
||||||
|
|
||||||
op->o_callback = &cb;
|
|
||||||
|
|
||||||
if ( fr || !fl ) {
|
if ( fr || !fl ) {
|
||||||
|
Operation op2;
|
||||||
|
Opheader oh;
|
||||||
|
|
||||||
|
op2 = *op;
|
||||||
|
oh = *op->o_hdr;
|
||||||
|
oh.oh_conn = op->o_conn;
|
||||||
|
oh.oh_connid = op->o_connid;
|
||||||
|
op2.o_bd = &ov->db;
|
||||||
|
op2.o_hdr = &oh;
|
||||||
|
op2.o_extra = op->o_extra;
|
||||||
|
op2.o_callback = &cb;
|
||||||
|
|
||||||
tc.attrs = op->ors_attrs;
|
tc.attrs = op->ors_attrs;
|
||||||
op->ors_slimit = SLAP_NO_LIMIT;
|
op->ors_slimit = SLAP_NO_LIMIT;
|
||||||
op->ors_attrs = slap_anlist_all_attributes;
|
op->ors_attrs = slap_anlist_all_attributes;
|
||||||
op->o_bd = &ov->db;
|
|
||||||
tc.step |= RMT_SIDE;
|
tc.step |= RMT_SIDE;
|
||||||
if ( fl ) {
|
if ( fl ) {
|
||||||
tc.step |= USE_LIST;
|
tc.step |= USE_LIST;
|
||||||
op->ors_filter = fr;
|
op->ors_filter = fr;
|
||||||
filter2bv_x( op, fr, &op->ors_filterstr );
|
filter2bv_x( op, fr, &op2.ors_filterstr );
|
||||||
}
|
}
|
||||||
rc = ov->db.bd_info->bi_op_search(op, rs);
|
rc = ov->db.bd_info->bi_op_search( &op2, rs );
|
||||||
if ( op->ors_attrs == slap_anlist_all_attributes )
|
if ( op->ors_attrs == slap_anlist_all_attributes )
|
||||||
op->ors_attrs = tc.attrs;
|
op->ors_attrs = tc.attrs;
|
||||||
op->o_bd = tc.db;
|
|
||||||
if ( fl ) {
|
if ( fl ) {
|
||||||
op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx );
|
op->o_tmpfree( op2.ors_filterstr.bv_val, op2.o_tmpmemctx );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cb.sc_next = op->o_callback;
|
||||||
|
op->o_callback = &cb;
|
||||||
|
|
||||||
if ( fl && !rc ) {
|
if ( fl && !rc ) {
|
||||||
tc.step |= LCL_SIDE;
|
tc.step |= LCL_SIDE;
|
||||||
op->ors_filter = fl;
|
op->ors_filter = fl;
|
||||||
@ -1134,7 +1171,6 @@ static int translucent_search(Operation *op, SlapReply *rs) {
|
|||||||
op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx );
|
op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx );
|
||||||
}
|
}
|
||||||
op->ors_filterstr = fbv;
|
op->ors_filterstr = fbv;
|
||||||
op->ors_filter = tc.orig;
|
|
||||||
op->o_callback = cb.sc_next;
|
op->o_callback = cb.sc_next;
|
||||||
rs->sr_attrs = op->ors_attrs;
|
rs->sr_attrs = op->ors_attrs;
|
||||||
rs->sr_attr_flags = slap_attr_flags( rs->sr_attrs );
|
rs->sr_attr_flags = slap_attr_flags( rs->sr_attrs );
|
||||||
|
Loading…
Reference in New Issue
Block a user