version 1.97, 2003/03/16 18:09:07
|
version 1.98, 2003/03/16 20:50:39
|
Line 1
|
Line 1
|
/* filter.c - routines for parsing and dealing with filters */ |
/* filter.c - routines for parsing and dealing with filters */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/filter.c,v 1.96 2003/03/16 05:41:53 kurt Exp $ */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/filter.c,v 1.97 2003/03/16 18:09:07 kurt Exp $ */ |
/* |
/* |
* Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. |
* Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. |
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file |
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file |
Line 50 get_filter(
|
Line 50 get_filter(
|
ber_tag_t tag; |
ber_tag_t tag; |
ber_len_t len; |
ber_len_t len; |
int err; |
int err; |
Filter *f; |
Filter f; |
|
|
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, ENTRY, "get_filter: conn %d\n", conn->c_connid, 0, 0 ); |
LDAP_LOG( FILTER, ENTRY, "get_filter: conn %d\n", conn->c_connid, 0, 0 ); |
Line 97 get_filter(
|
Line 97 get_filter(
|
return SLAPD_DISCONNECT; |
return SLAPD_DISCONNECT; |
} |
} |
|
|
f = (Filter *) ch_malloc( sizeof(Filter) ); |
|
f->f_next = NULL; |
|
|
|
err = LDAP_SUCCESS; |
err = LDAP_SUCCESS; |
f->f_choice = tag; |
|
|
|
switch ( f->f_choice ) { |
f.f_next = NULL; |
|
f.f_choice = tag; |
|
|
|
switch ( f.f_choice ) { |
case LDAP_FILTER_EQUALITY: |
case LDAP_FILTER_EQUALITY: |
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, DETAIL2, |
LDAP_LOG( FILTER, DETAIL2, |
Line 111 get_filter(
|
Line 110 get_filter(
|
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "EQUALITY\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "EQUALITY\n", 0, 0, 0 ); |
#endif |
#endif |
err = get_ava( ber, &f->f_ava, SLAP_MR_EQUALITY, text ); |
err = get_ava( ber, &f.f_ava, SLAP_MR_EQUALITY, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
|
|
assert( f->f_ava != NULL ); |
assert( f.f_ava != NULL ); |
break; |
break; |
|
|
case LDAP_FILTER_SUBSTRINGS: |
case LDAP_FILTER_SUBSTRINGS: |
Line 126 get_filter(
|
Line 125 get_filter(
|
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "SUBSTRINGS\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "SUBSTRINGS\n", 0, 0, 0 ); |
#endif |
#endif |
err = get_substring_filter( conn, ber, f, text ); |
err = get_substring_filter( conn, ber, &f, text ); |
if( err != LDAP_SUCCESS ) { |
if( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
assert( f->f_sub != NULL ); |
assert( f.f_sub != NULL ); |
break; |
break; |
|
|
case LDAP_FILTER_GE: |
case LDAP_FILTER_GE: |
Line 140 get_filter(
|
Line 139 get_filter(
|
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "GE\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "GE\n", 0, 0, 0 ); |
#endif |
#endif |
err = get_ava( ber, &f->f_ava, SLAP_MR_ORDERING, text ); |
err = get_ava( ber, &f.f_ava, SLAP_MR_ORDERING, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
assert( f->f_ava != NULL ); |
assert( f.f_ava != NULL ); |
break; |
break; |
|
|
case LDAP_FILTER_LE: |
case LDAP_FILTER_LE: |
Line 154 get_filter(
|
Line 153 get_filter(
|
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "LE\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "LE\n", 0, 0, 0 ); |
#endif |
#endif |
err = get_ava( ber, &f->f_ava, SLAP_MR_ORDERING, text ); |
err = get_ava( ber, &f.f_ava, SLAP_MR_ORDERING, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
assert( f->f_ava != NULL ); |
assert( f.f_ava != NULL ); |
break; |
break; |
|
|
case LDAP_FILTER_PRESENT: { |
case LDAP_FILTER_PRESENT: { |
Line 176 get_filter(
|
Line 175 get_filter(
|
break; |
break; |
} |
} |
|
|
f->f_desc = NULL; |
f.f_desc = NULL; |
err = slap_bv2ad( &type, &f->f_desc, text ); |
err = slap_bv2ad( &type, &f.f_desc, text ); |
|
|
if( err != LDAP_SUCCESS ) { |
if( err != LDAP_SUCCESS ) { |
/* unrecognized attribute description or other error */ |
/* unrecognized attribute description or other error */ |
f->f_choice = SLAPD_FILTER_COMPUTED; |
f.f_choice = SLAPD_FILTER_COMPUTED; |
f->f_result = LDAP_COMPARE_FALSE; |
f.f_result = LDAP_COMPARE_FALSE; |
err = LDAP_SUCCESS; |
err = LDAP_SUCCESS; |
break; |
break; |
} |
} |
|
|
|
assert( f.f_desc != NULL ); |
} break; |
} break; |
|
|
case LDAP_FILTER_APPROX: |
case LDAP_FILTER_APPROX: |
Line 195 get_filter(
|
Line 196 get_filter(
|
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "APPROX\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "APPROX\n", 0, 0, 0 ); |
#endif |
#endif |
err = get_ava( ber, &f->f_ava, SLAP_MR_EQUALITY_APPROX, text ); |
err = get_ava( ber, &f.f_ava, SLAP_MR_EQUALITY_APPROX, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
assert( f->f_ava != NULL ); |
assert( f.f_ava != NULL ); |
break; |
break; |
|
|
case LDAP_FILTER_AND: |
case LDAP_FILTER_AND: |
Line 209 get_filter(
|
Line 210 get_filter(
|
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "AND\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "AND\n", 0, 0, 0 ); |
#endif |
#endif |
err = get_filter_list( conn, ber, &f->f_and, text ); |
err = get_filter_list( conn, ber, &f.f_and, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
#ifdef XXX |
/* no assert - list could be empty */ |
assert( f->f_and != NULL ); |
|
#endif |
|
break; |
break; |
|
|
case LDAP_FILTER_OR: |
case LDAP_FILTER_OR: |
Line 225 get_filter(
|
Line 224 get_filter(
|
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "OR\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "OR\n", 0, 0, 0 ); |
#endif |
#endif |
err = get_filter_list( conn, ber, &f->f_or, text ); |
err = get_filter_list( conn, ber, &f.f_or, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
|
/* no assert - list could be empty */ |
break; |
break; |
|
|
case LDAP_FILTER_NOT: |
case LDAP_FILTER_NOT: |
Line 239 get_filter(
|
Line 239 get_filter(
|
Debug( LDAP_DEBUG_FILTER, "NOT\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "NOT\n", 0, 0, 0 ); |
#endif |
#endif |
(void) ber_skip_tag( ber, &len ); |
(void) ber_skip_tag( ber, &len ); |
err = get_filter( conn, ber, &f->f_not, text ); |
err = get_filter( conn, ber, &f.f_not, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
|
|
|
#ifdef XXX |
|
assert( f.f_not != NULL ); |
|
#endif |
break; |
break; |
|
|
case LDAP_FILTER_EXT: |
case LDAP_FILTER_EXT: |
Line 253 get_filter(
|
Line 257 get_filter(
|
Debug( LDAP_DEBUG_FILTER, "EXTENSIBLE\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "EXTENSIBLE\n", 0, 0, 0 ); |
#endif |
#endif |
|
|
err = get_mra( ber, &f->f_mra, text ); |
err = get_mra( ber, &f.f_mra, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
|
|
#ifdef XXX |
#ifdef XXX |
assert( f->f_mra != NULL ); |
assert( f.f_mra != NULL ); |
#endif |
#endif |
break; |
break; |
|
|
Line 268 get_filter(
|
Line 272 get_filter(
|
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, ERR, |
LDAP_LOG( FILTER, ERR, |
"get_filter: conn %d unknown filter type=%lu\n", |
"get_filter: conn %d unknown filter type=%lu\n", |
conn->c_connid, f->f_choice, 0 ); |
conn->c_connid, f.f_choice, 0 ); |
#else |
#else |
Debug( LDAP_DEBUG_ANY, "get_filter: unknown filter type=%lu\n", |
Debug( LDAP_DEBUG_ANY, "get_filter: unknown filter type=%lu\n", |
f->f_choice, 0, 0 ); |
f.f_choice, 0, 0 ); |
#endif |
#endif |
f->f_choice = SLAPD_FILTER_COMPUTED; |
f.f_choice = SLAPD_FILTER_COMPUTED; |
f->f_result = SLAPD_COMPARE_UNDEFINED; |
f.f_result = SLAPD_COMPARE_UNDEFINED; |
break; |
break; |
} |
} |
|
|
if ( err != LDAP_SUCCESS ) { |
if( err != LDAP_SUCCESS && err != SLAPD_DISCONNECT ) { |
if( err != SLAPD_DISCONNECT ) { |
/* ignore error */ |
/* ignore error */ |
f.f_choice = SLAPD_FILTER_COMPUTED; |
f->f_choice = SLAPD_FILTER_COMPUTED; |
f.f_result = SLAPD_COMPARE_UNDEFINED; |
f->f_result = SLAPD_COMPARE_UNDEFINED; |
err = LDAP_SUCCESS; |
err = LDAP_SUCCESS; |
} |
*filt = f; |
|
|
|
} else { |
|
free(f); |
|
} |
|
|
|
} else { |
if ( err == LDAP_SUCCESS ) { |
*filt = f; |
*filt = ch_malloc( sizeof(f) ); |
|
**filt = f; |
} |
} |
|
|
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
Line 300 get_filter(
|
Line 300 get_filter(
|
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "end get_filter %d\n", err, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "end get_filter %d\n", err, 0, 0 ); |
#endif |
#endif |
|
|
return( err ); |
return( err ); |
} |
} |
|
|
Line 351 get_substring_filter(
|
Line 352 get_substring_filter(
|
ber_tag_t tag; |
ber_tag_t tag; |
ber_len_t len; |
ber_len_t len; |
ber_tag_t rc; |
ber_tag_t rc; |
struct berval value; |
struct berval desc, value, nvalue; |
char *last; |
char *last; |
struct berval bv; |
SubstringsAssertion ssa; |
AttributeDescription *ad; |
|
|
|
*text = "error decoding filter"; |
*text = "error decoding filter"; |
|
|
Line 364 get_substring_filter(
|
Line 364 get_substring_filter(
|
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "begin get_substring_filter\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "begin get_substring_filter\n", 0, 0, 0 ); |
#endif |
#endif |
if ( ber_scanf( ber, "{m" /*}*/, &bv ) == LBER_ERROR ) { |
if ( ber_scanf( ber, "{m" /*}*/, &desc ) == LBER_ERROR ) { |
return SLAPD_DISCONNECT; |
return SLAPD_DISCONNECT; |
} |
} |
|
|
ad = NULL; |
*text = NULL; |
rc = slap_bv2ad( &bv, &ad, text ); |
f->f_choice = SLAPD_FILTER_COMPUTED; |
|
f->f_result = SLAPD_COMPARE_UNDEFINED; |
|
|
|
ssa.sa_desc = NULL; |
|
ssa.sa_initial.bv_val = NULL; |
|
ssa.sa_any = NULL; |
|
ssa.sa_final.bv_val = NULL; |
|
|
|
rc = slap_bv2ad( &desc, &ssa.sa_desc, text ); |
|
|
if( rc != LDAP_SUCCESS ) { |
if( rc != LDAP_SUCCESS ) { |
text = NULL; |
|
f->f_choice = SLAPD_FILTER_COMPUTED; |
|
f->f_result = SLAPD_COMPARE_UNDEFINED; |
|
return LDAP_SUCCESS; |
return LDAP_SUCCESS; |
} |
} |
|
|
f->f_sub = ch_calloc( 1, sizeof(SubstringsAssertion) ); |
rc = LDAP_PROTOCOL_ERROR; |
f->f_sub_desc = ad; |
|
f->f_sub_initial.bv_val = NULL; |
|
f->f_sub_any = NULL; |
|
f->f_sub_final.bv_val = NULL; |
|
|
|
for ( tag = ber_first_element( ber, &len, &last ); tag != LBER_DEFAULT; |
for ( tag = ber_first_element( ber, &len, &last ); |
|
tag != LBER_DEFAULT; |
tag = ber_next_element( ber, &len, last ) ) |
tag = ber_next_element( ber, &len, last ) ) |
{ |
{ |
unsigned usage; |
unsigned usage; |
Line 396 get_substring_filter(
|
Line 398 get_substring_filter(
|
} |
} |
|
|
if ( value.bv_val == NULL || value.bv_len == 0 ) { |
if ( value.bv_val == NULL || value.bv_len == 0 ) { |
|
free( value.bv_val ); |
rc = LDAP_INVALID_SYNTAX; |
rc = LDAP_INVALID_SYNTAX; |
goto return_error; |
goto return_error; |
} |
} |
Line 425 get_substring_filter(
|
Line 428 get_substring_filter(
|
" unknown substring choice=%ld\n", |
" unknown substring choice=%ld\n", |
(long) tag, 0, 0 ); |
(long) tag, 0, 0 ); |
#endif |
#endif |
|
free( value.bv_val ); |
goto return_error; |
goto return_error; |
} |
} |
|
|
Line 432 get_substring_filter(
|
Line 436 get_substring_filter(
|
/* validate/normalize using equality matching rule validator! */ |
/* validate/normalize using equality matching rule validator! */ |
rc = asserted_value_validate_normalize( |
rc = asserted_value_validate_normalize( |
f->f_sub_desc, f->f_sub_desc->ad_type->sat_equality, |
f->f_sub_desc, f->f_sub_desc->ad_type->sat_equality, |
usage, &value, &bv, text ); |
usage, &value, &nvalue, text ); |
|
|
if( rc != LDAP_SUCCESS ) { |
if( rc != LDAP_SUCCESS ) { |
|
free( value.bv_val ); |
goto return_error; |
goto return_error; |
} |
} |
#else |
#else |
Line 441 get_substring_filter(
|
Line 447 get_substring_filter(
|
rc = value_validate( f->f_sub_desc->ad_type->sat_equality, |
rc = value_validate( f->f_sub_desc->ad_type->sat_equality, |
&value, text ); |
&value, text ); |
if( rc != LDAP_SUCCESS ) { |
if( rc != LDAP_SUCCESS ) { |
|
free( value.bv_val ); |
goto return_error; |
goto return_error; |
} |
} |
|
|
rc = value_normalize( f->f_sub_desc, usage, |
rc = value_normalize( f->f_sub_desc, usage, |
&value, &bv, text ); |
&value, &nvalue, text ); |
|
|
|
free( value.bv_val ); |
|
|
if( rc != LDAP_SUCCESS ) { |
if( rc != LDAP_SUCCESS ) { |
goto return_error; |
goto return_error; |
} |
} |
#endif |
#endif |
|
|
value = bv; |
|
rc = LDAP_PROTOCOL_ERROR; |
rc = LDAP_PROTOCOL_ERROR; |
|
|
switch ( tag ) { |
switch ( tag ) { |
case LDAP_SUBSTRING_INITIAL: |
case LDAP_SUBSTRING_INITIAL: |
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, DETAIL1, |
LDAP_LOG( FILTER, DETAIL1, |
"get_substring_filter: conn %d INITIAL\n", conn->c_connid, 0, 0 ); |
"get_substring_filter: conn %d INITIAL\n", |
|
conn->c_connid, 0, 0 ); |
#else |
#else |
Debug( LDAP_DEBUG_FILTER, " INITIAL\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, " INITIAL\n", 0, 0, 0 ); |
#endif |
#endif |
|
|
if ( f->f_sub_initial.bv_val != NULL |
if ( ssa.sa_initial.bv_val != NULL |
|| f->f_sub_any != NULL |
|| ssa.sa_any != NULL |
|| f->f_sub_final.bv_val != NULL ) |
|| ssa.sa_final.bv_val != NULL ) |
{ |
{ |
free( value.bv_val ); |
free( nvalue.bv_val ); |
goto return_error; |
goto return_error; |
} |
} |
|
|
f->f_sub_initial = value; |
ssa.sa_initial = nvalue; |
break; |
break; |
|
|
case LDAP_SUBSTRING_ANY: |
case LDAP_SUBSTRING_ANY: |
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, DETAIL1, |
LDAP_LOG( FILTER, DETAIL1, |
"get_substring_filter: conn %d ANY\n", conn->c_connid, 0, 0 ); |
"get_substring_filter: conn %d ANY\n", |
|
conn->c_connid, 0, 0 ); |
#else |
#else |
Debug( LDAP_DEBUG_FILTER, " ANY\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, " ANY\n", 0, 0, 0 ); |
#endif |
#endif |
|
|
if ( f->f_sub_final.bv_val != NULL ) { |
if ( ssa.sa_final.bv_val != NULL ) { |
free( value.bv_val ); |
free( nvalue.bv_val ); |
goto return_error; |
goto return_error; |
} |
} |
|
|
ber_bvarray_add( &f->f_sub_any, &value ); |
ber_bvarray_add( &ssa.sa_any, &nvalue ); |
break; |
break; |
|
|
case LDAP_SUBSTRING_FINAL: |
case LDAP_SUBSTRING_FINAL: |
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, DETAIL1, |
LDAP_LOG( FILTER, DETAIL1, |
"get_substring_filter: conn %d FINAL\n", conn->c_connid, 0, 0 ); |
"get_substring_filter: conn %d FINAL\n", |
|
conn->c_connid, 0, 0 ); |
#else |
#else |
Debug( LDAP_DEBUG_FILTER, " FINAL\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, " FINAL\n", 0, 0, 0 ); |
#endif |
#endif |
|
|
if ( f->f_sub_final.bv_val != NULL ) { |
if ( ssa.sa_final.bv_val != NULL ) { |
free( value.bv_val ); |
free( nvalue.bv_val ); |
goto return_error; |
goto return_error; |
} |
} |
|
|
f->f_sub_final = value; |
ssa.sa_final = nvalue; |
break; |
break; |
|
|
default: |
default: |
Line 517 get_substring_filter(
|
Line 529 get_substring_filter(
|
(long) tag, 0, 0 ); |
(long) tag, 0, 0 ); |
#endif |
#endif |
|
|
free( value.bv_val ); |
free( nvalue.bv_val ); |
|
|
return_error: |
return_error: |
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
Line 528 return_error:
|
Line 540 return_error:
|
Debug( LDAP_DEBUG_FILTER, " error=%ld\n", |
Debug( LDAP_DEBUG_FILTER, " error=%ld\n", |
(long) rc, 0, 0 ); |
(long) rc, 0, 0 ); |
#endif |
#endif |
free( f->f_sub_initial.bv_val ); |
free( ssa.sa_initial.bv_val ); |
ber_bvarray_free( f->f_sub_any ); |
ber_bvarray_free( ssa.sa_any ); |
free( f->f_sub_final.bv_val ); |
free( ssa.sa_final.bv_val ); |
ch_free( f->f_sub ); |
|
f->f_sub = NULL; |
|
return rc; |
return rc; |
} |
} |
|
|
|
rc = LDAP_SUCCESS; |
|
} |
|
|
|
if( rc == LDAP_SUCCESS ) { |
|
f->f_choice = LDAP_FILTER_SUBSTRINGS; |
|
f->f_sub = ch_malloc( sizeof( ssa ) ); |
|
*f->f_sub = ssa; |
} |
} |
|
|
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
Line 543 return_error:
|
Line 561 return_error:
|
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "end get_substring_filter\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "end get_substring_filter\n", 0, 0, 0 ); |
#endif |
#endif |
return( LDAP_SUCCESS ); |
|
|
return LDAP_SUCCESS; |
} |
} |
|
|
void |
void |