mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-20 13:53:21 -05:00
handle filter computed in a more granular way (ITS#2977)
This commit is contained in:
parent
ca5515b460
commit
d015b9583c
3 changed files with 71 additions and 45 deletions
|
|
@ -172,7 +172,7 @@ map_attr_value(
|
|||
}
|
||||
|
||||
if ( value == NULL ) {
|
||||
return 0;
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
if ( ad->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName )
|
||||
|
|
@ -191,10 +191,8 @@ map_attr_value(
|
|||
break;
|
||||
|
||||
case LDAP_UNWILLING_TO_PERFORM:
|
||||
return -1;
|
||||
|
||||
case LDAP_OTHER:
|
||||
return -1;
|
||||
return LDAP_OTHER;
|
||||
}
|
||||
|
||||
} else if ( ad == slap_schema.si_ad_objectClass || ad == slap_schema.si_ad_structuralObjectClass ) {
|
||||
|
|
@ -213,7 +211,7 @@ map_attr_value(
|
|||
ber_memfree( vtmp.bv_val );
|
||||
}
|
||||
|
||||
return 0;
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
|
|
@ -223,23 +221,23 @@ ldap_back_filter_map_rewrite(
|
|||
struct berval *fstr,
|
||||
int remap )
|
||||
{
|
||||
int i;
|
||||
int i, rc;
|
||||
Filter *p;
|
||||
struct berval atmp;
|
||||
struct berval vtmp;
|
||||
ber_len_t len;
|
||||
|
||||
if ( f == NULL ) {
|
||||
ber_str2bv( "No filter!", sizeof("No filter!")-1, 1, fstr );
|
||||
return -1;
|
||||
ber_str2bv( "(?=error)", sizeof("(?=error)")-1, 1, fstr );
|
||||
return LDAP_OTHER;
|
||||
}
|
||||
|
||||
switch ( f->f_choice ) {
|
||||
case LDAP_FILTER_EQUALITY:
|
||||
if ( map_attr_value( dc, f->f_av_desc, &atmp,
|
||||
&f->f_av_value, &vtmp, remap ) )
|
||||
{
|
||||
return -1;
|
||||
rc = map_attr_value( dc, f->f_av_desc, &atmp,
|
||||
&f->f_av_value, &vtmp, remap );
|
||||
if ( rc ) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
fstr->bv_len = atmp.bv_len + vtmp.bv_len
|
||||
|
|
@ -253,10 +251,10 @@ ldap_back_filter_map_rewrite(
|
|||
break;
|
||||
|
||||
case LDAP_FILTER_GE:
|
||||
if ( map_attr_value( dc, f->f_av_desc, &atmp,
|
||||
&f->f_av_value, &vtmp, remap ) )
|
||||
{
|
||||
return -1;
|
||||
rc = map_attr_value( dc, f->f_av_desc, &atmp,
|
||||
&f->f_av_value, &vtmp, remap );
|
||||
if ( rc ) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
fstr->bv_len = atmp.bv_len + vtmp.bv_len
|
||||
|
|
@ -270,10 +268,10 @@ ldap_back_filter_map_rewrite(
|
|||
break;
|
||||
|
||||
case LDAP_FILTER_LE:
|
||||
if ( map_attr_value( dc, f->f_av_desc, &atmp,
|
||||
&f->f_av_value, &vtmp, remap ) )
|
||||
{
|
||||
return -1;
|
||||
rc = map_attr_value( dc, f->f_av_desc, &atmp,
|
||||
&f->f_av_value, &vtmp, remap );
|
||||
if ( rc ) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
fstr->bv_len = atmp.bv_len + vtmp.bv_len
|
||||
|
|
@ -287,10 +285,10 @@ ldap_back_filter_map_rewrite(
|
|||
break;
|
||||
|
||||
case LDAP_FILTER_APPROX:
|
||||
if ( map_attr_value( dc, f->f_av_desc, &atmp,
|
||||
&f->f_av_value, &vtmp, remap ) )
|
||||
{
|
||||
return -1;
|
||||
rc = map_attr_value( dc, f->f_av_desc, &atmp,
|
||||
&f->f_av_value, &vtmp, remap );
|
||||
if ( rc ) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
fstr->bv_len = atmp.bv_len + vtmp.bv_len
|
||||
|
|
@ -304,10 +302,10 @@ ldap_back_filter_map_rewrite(
|
|||
break;
|
||||
|
||||
case LDAP_FILTER_SUBSTRINGS:
|
||||
if ( map_attr_value( dc, f->f_sub_desc, &atmp,
|
||||
NULL, NULL, remap ) )
|
||||
{
|
||||
return -1;
|
||||
rc = map_attr_value( dc, f->f_sub_desc, &atmp,
|
||||
NULL, NULL, remap );
|
||||
if ( rc ) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* cannot be a DN ... */
|
||||
|
|
@ -366,10 +364,10 @@ ldap_back_filter_map_rewrite(
|
|||
break;
|
||||
|
||||
case LDAP_FILTER_PRESENT:
|
||||
if ( map_attr_value( dc, f->f_desc, &atmp,
|
||||
NULL, NULL, remap ) )
|
||||
{
|
||||
return -1;
|
||||
rc = map_attr_value( dc, f->f_desc, &atmp,
|
||||
NULL, NULL, remap );
|
||||
if ( rc ) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
fstr->bv_len = atmp.bv_len + ( sizeof("(=*)") - 1 );
|
||||
|
|
@ -392,9 +390,9 @@ ldap_back_filter_map_rewrite(
|
|||
for ( p = f->f_list; p != NULL; p = p->f_next ) {
|
||||
len = fstr->bv_len;
|
||||
|
||||
if ( ldap_back_filter_map_rewrite( dc, p, &vtmp, remap ) )
|
||||
{
|
||||
return -1;
|
||||
rc = ldap_back_filter_map_rewrite( dc, p, &vtmp, remap );
|
||||
if ( rc != LDAP_SUCCESS ) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
fstr->bv_len += vtmp.bv_len;
|
||||
|
|
@ -410,10 +408,10 @@ ldap_back_filter_map_rewrite(
|
|||
|
||||
case LDAP_FILTER_EXT: {
|
||||
if ( f->f_mr_desc ) {
|
||||
if ( map_attr_value( dc, f->f_mr_desc, &atmp,
|
||||
&f->f_mr_value, &vtmp, remap ) )
|
||||
{
|
||||
return -1;
|
||||
rc = map_attr_value( dc, f->f_mr_desc, &atmp,
|
||||
&f->f_mr_value, &vtmp, remap );
|
||||
if ( rc ) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
|
@ -450,14 +448,14 @@ ldap_back_filter_map_rewrite(
|
|||
f->f_result == SLAPD_COMPARE_UNDEFINED ? sizeof("(?=undefined)")-1 :
|
||||
sizeof("(?=error)")-1,
|
||||
1, fstr );
|
||||
break;
|
||||
return LDAP_COMPARE_FALSE;
|
||||
|
||||
default:
|
||||
ber_str2bv( "(?=unknown)", sizeof("(?=unknown)")-1, 1, fstr );
|
||||
break;
|
||||
return LDAP_COMPARE_FALSE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -154,7 +154,17 @@ ldap_back_search(
|
|||
rc = ldap_back_filter_map_rewrite( &dc, op->oq_search.rs_filter,
|
||||
&mfilter, BACKLDAP_MAP );
|
||||
|
||||
if ( rc ) {
|
||||
switch ( rc ) {
|
||||
case LDAP_SUCCESS:
|
||||
break;
|
||||
|
||||
case LDAP_COMPARE_FALSE:
|
||||
rs->sr_err = LDAP_SUCCESS;
|
||||
rs->sr_text = NULL;
|
||||
rc = 0;
|
||||
goto finish;
|
||||
|
||||
default:
|
||||
rs->sr_err = LDAP_OTHER;
|
||||
rs->sr_text = "Rewrite error";
|
||||
dontfreetext = 1;
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ meta_back_search( Operation *op, SlapReply *rs )
|
|||
struct metasingleconn *lsc;
|
||||
struct timeval tv = { 0, 0 };
|
||||
LDAPMessage *res, *e;
|
||||
int rc = 0, *msgid, sres = LDAP_NO_SUCH_OBJECT;
|
||||
int rc = 0, *msgid, sres = LDAP_SUCCESS;
|
||||
char *err = NULL;
|
||||
struct berval match = { 0, NULL }, mmatch = { 0, NULL };
|
||||
BerVarray v2refs = NULL;
|
||||
|
|
@ -70,6 +70,9 @@ meta_back_search( Operation *op, SlapReply *rs )
|
|||
int isroot = 0;
|
||||
dncookie dc;
|
||||
|
||||
int is_scope = 0,
|
||||
is_filter = 0;
|
||||
|
||||
/*
|
||||
* controls are set in ldap_back_dobind()
|
||||
*
|
||||
|
|
@ -198,6 +201,8 @@ meta_back_search( Operation *op, SlapReply *rs )
|
|||
if ( dnIsSuffix( &li->targets[ i ]->suffix,
|
||||
&op->o_req_ndn ) ) {
|
||||
realbase = li->targets[ i ]->suffix;
|
||||
is_scope++;
|
||||
|
||||
} else {
|
||||
/*
|
||||
* this target is no longer candidate
|
||||
|
|
@ -218,6 +223,7 @@ meta_back_search( Operation *op, SlapReply *rs )
|
|||
*/
|
||||
realbase = li->targets[ i ]->suffix;
|
||||
realscope = LDAP_SCOPE_BASE;
|
||||
is_scope++;
|
||||
break;
|
||||
} /* else continue with the next case */
|
||||
|
||||
|
|
@ -268,7 +274,15 @@ meta_back_search( Operation *op, SlapReply *rs )
|
|||
rc = ldap_back_filter_map_rewrite( &dc,
|
||||
op->oq_search.rs_filter,
|
||||
&mfilter, BACKLDAP_MAP );
|
||||
if ( rc != 0 ) {
|
||||
switch ( rc ) {
|
||||
case LDAP_SUCCESS:
|
||||
is_filter++;
|
||||
break;
|
||||
|
||||
case LDAP_COMPARE_FALSE:
|
||||
rc = 0;
|
||||
|
||||
default:
|
||||
/*
|
||||
* this target is no longer candidate
|
||||
*/
|
||||
|
|
@ -529,6 +543,10 @@ new_candidate:;
|
|||
* FIXME: we should handle error codes and return the more
|
||||
* important/reasonable
|
||||
*/
|
||||
if ( is_scope == 0 ) {
|
||||
sres = LDAP_NO_SUCH_OBJECT;
|
||||
}
|
||||
|
||||
if ( sres == LDAP_SUCCESS && v2refs ) {
|
||||
sres = LDAP_REFERRAL;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue