/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2005 The OpenLDAP Foundation.
+ * Copyright 1998-2007 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
int rc;
Debug( LDAP_DEBUG_FILTER, "=> test_filter\n", 0, 0, 0 );
+ if ( f->f_choice & SLAPD_FILTER_UNDEFINED ) {
+ Debug( LDAP_DEBUG_FILTER, " UNDEFINED\n", 0, 0, 0 );
+ rc = SLAPD_COMPARE_UNDEFINED;
+ goto out;
+ }
+
switch ( f->f_choice ) {
case SLAPD_FILTER_COMPUTED:
Debug( LDAP_DEBUG_FILTER, " COMPUTED %s (%d)\n",
f->f_choice, 0, 0 );
rc = LDAP_PROTOCOL_ERROR;
}
-
+out:
Debug( LDAP_DEBUG_FILTER, "<= test_filter %d\n", rc, 0, 0 );
return( rc );
}
void *memctx;
BER_MEMFREE_FN *memfree;
#ifdef LDAP_COMP_MATCH
- int i, num_attr_vals;
+ int i, num_attr_vals = 0;
#endif
if ( op == NULL ) {
const char *text;
rc = value_match( &ret, slap_schema.si_ad_entryDN, mra->ma_rule,
- 0, &e->e_nname, &mra->ma_value, &text );
+ SLAP_MR_EXT, &e->e_nname, &mra->ma_value, &text );
if( rc != LDAP_SUCCESS ) return rc;
if ( !a->a_comp_data->cd_tree[i] ) {
return LDAP_OPERATIONS_ERROR;
}
- rc = value_match( &ret, a->a_desc, mra->ma_rule, 0,
+ rc = value_match( &ret, a->a_desc, mra->ma_rule,
+ SLAP_MR_COMPONENT,
(struct berval*)a->a_comp_data->cd_tree[i++],
(void*)mra, &text );
} else
if ( normalize_attribute && mra->ma_rule->smr_normalize ) {
/*
- Document: draft-ietf-ldapbis-protocol
+ Document: RFC 4511
4.5.1. Search Request
...
If the type field is present and the matchingRule is present,
the matchValue is compared against entry attributes of the
specified type. In this case, the matchingRule MUST be one
- suitable for use with the specified type (see [Syntaxes]),
+ suitable for use with the specified type (see [RFC4517]),
otherwise the filter item is Undefined.
nbv = *bv;
}
- rc = value_match( &ret, a->a_desc, mra->ma_rule, 0,
- &nbv, &mra->ma_value, &text );
+ rc = value_match( &ret, a->a_desc, mra->ma_rule,
+ SLAP_MR_EXT, &nbv, &mra->ma_value, &text );
if ( nbv.bv_val != bv->bv_val ) {
memfree( nbv.bv_val, memctx );
{
int ret;
- rc = value_match( &ret, a->a_desc, mra->ma_rule, 0,
+ rc = value_match( &ret, a->a_desc, mra->ma_rule,
+ SLAP_MR_COMPONENT,
(struct berval*)a, (void*)mra, &text );
if ( rc != LDAP_SUCCESS ) break;
nbv = *bv;
}
- rc = value_match( &ret, a->a_desc, mra->ma_rule, 0,
- &nbv, &value, &text );
+ rc = value_match( &ret, a->a_desc, mra->ma_rule,
+ SLAP_MR_EXT, &nbv, &value, &text );
if ( nbv.bv_val != bv->bv_val ) {
memfree( nbv.bv_val, memctx );
for ( iAVA = 0; rdn[ iAVA ]; iAVA++ ) {
LDAPAVA *ava = rdn[ iAVA ];
- struct berval *bv = &ava->la_value, value;
+ struct berval *bv = &ava->la_value,
+ value = BER_BVNULL,
+ nbv = BER_BVNULL;
AttributeDescription *ad =
(AttributeDescription *)ava->la_private;
- int ret;
- const char *text;
+ int ret;
+ const char *text;
- assert( ad );
+ assert( ad != NULL );
if ( mra->ma_desc ) {
/* have a mra type? check for subtype */
}
}
+ if ( mra->ma_rule->smr_normalize ) {
+ /* see comment above */
+ if ( mra->ma_rule->smr_normalize(
+ SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
+ mra->ma_rule->smr_syntax,
+ mra->ma_rule,
+ bv, &nbv, memctx ) != LDAP_SUCCESS )
+ {
+ /* FIXME: stop processing? */
+ rc = LDAP_SUCCESS;
+ ret = -1;
+ goto cleanup;
+ }
+
+ } else {
+ nbv = *bv;
+ }
+
/* check match */
- rc = value_match( &ret, ad, mra->ma_rule, 0,
- bv, &value, &text );
- if ( value.bv_val != mra->ma_value.bv_val ) {
+ rc = value_match( &ret, ad, mra->ma_rule, SLAP_MR_EXT,
+ &nbv, &value, &text );
+
+cleanup:;
+ if ( !BER_BVISNULL( &value ) && value.bv_val != mra->ma_value.bv_val ) {
memfree( value.bv_val, memctx );
}
+ if ( !BER_BVISNULL( &nbv ) && nbv.bv_val != bv->bv_val ) {
+ memfree( nbv.bv_val, memctx );
+ }
+
if ( rc == LDAP_SUCCESS && ret == 0 ) rc = LDAP_COMPARE_TRUE;
if ( rc != LDAP_SUCCESS ) {
int rc;
Attribute *a;
#ifdef LDAP_COMP_MATCH
- int i, num_attr_vals;
+ int i, num_attr_vals = 0;
AttributeAliasing *a_alias = NULL;
#endif
if ( ava->aa_desc == slap_schema.si_ad_entryDN ) {
MatchingRule *mr;
- int rc, match;
+ int match;
const char *text;
if( type != LDAP_FILTER_EQUALITY &&
}
mr = slap_schema.si_ad_entryDN->ad_type->sat_equality;
- assert( mr );
+ assert( mr != NULL );
- rc = value_match( &match, slap_schema.si_ad_entryDN, mr, 0,
- &e->e_nname, &ava->aa_value, &text );
+ rc = value_match( &match, slap_schema.si_ad_entryDN, mr,
+ SLAP_MR_EXT, &e->e_nname, &ava->aa_value, &text );
if( rc != LDAP_SUCCESS ) return rc;
if( match == 0 ) return LDAP_COMPARE_TRUE;
a != NULL;
a = attrs_find( a->a_next, ava->aa_desc ) )
{
+ int use;
MatchingRule *mr;
struct berval *bv;
continue;
}
+ use = SLAP_MR_EQUALITY;
+
switch ( type ) {
case LDAP_FILTER_APPROX:
+ use = SLAP_MR_EQUALITY_APPROX;
mr = a->a_desc->ad_type->sat_approx;
if( mr != NULL ) break;
- /* use EQUALITY matching rule if no APPROX rule */
+ /* fallthru: use EQUALITY matching rule if no APPROX rule */
case LDAP_FILTER_EQUALITY:
+ /* use variable set above so fall thru use is not clobbered */
mr = a->a_desc->ad_type->sat_equality;
break;
case LDAP_FILTER_GE:
case LDAP_FILTER_LE:
+ use = SLAP_MR_ORDERING;
mr = a->a_desc->ad_type->sat_ordering;
break;
return LDAP_OPERATIONS_ERROR;
}
- ret = value_match( &match, a->a_desc, cf_mr, 0,
- (struct berval*)a->a_comp_data->cd_tree[i++], (void*)&mra, &text );
+ ret = value_match( &match, a->a_desc, cf_mr,
+ SLAP_MR_COMPONENT,
+ (struct berval*)a->a_comp_data->cd_tree[i++],
+ (void*)&mra, &text );
if ( ret == LDAP_INAPPROPRIATE_MATCHING ) {
/* cached component tree is broken, just remove it */
free_ComponentData ( a );
}
if ( a_alias )
ava->aa_desc = a_alias->aa_aliasing_ad;
- }
- else
+
+ } else
#endif
{
-
- ret = value_match( &match, a->a_desc, mr, 0,
+ ret = value_match( &match, a->a_desc, mr, use,
bv, &ava->aa_value, &text );
}
int ret, match;
const char *text;
- ret = value_match( &match, a->a_desc, mr, 0,
+ ret = value_match( &match, a->a_desc, mr, SLAP_MR_SUBSTR,
bv, f->f_sub, &text );
if( ret != LDAP_SUCCESS ) {