version 1.100, 2003/03/16 23:27:33
|
version 1.101, 2003/03/17 05:06:02
|
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.99 2003/03/16 20:58:00 kurt Exp $ */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/filter.c,v 1.100 2003/03/16 23:27:33 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 20 static int get_filter_list(
|
Line 20 static int get_filter_list(
|
Filter **f, |
Filter **f, |
const char **text ); |
const char **text ); |
|
|
static int get_substring_filter( |
static int get_ssa( |
Connection *conn, |
Connection *conn, |
BerElement *ber, |
BerElement *ber, |
Filter *f, |
SubstringsAssertion **s, |
const char **text ); |
const char **text ); |
|
|
static void simple_vrFilter2bv( |
static void simple_vrFilter2bv( |
Line 125 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_ssa( conn, ber, &f.f_sub, text ); |
if( err != LDAP_SUCCESS ) { |
if( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
Line 343 get_filter_list( Connection *conn, BerEl
|
Line 343 get_filter_list( Connection *conn, BerEl
|
} |
} |
|
|
static int |
static int |
get_substring_filter( |
get_ssa( |
Connection *conn, |
Connection *conn, |
BerElement *ber, |
BerElement *ber, |
Filter *f, |
SubstringsAssertion **out, |
const char **text ) |
const char **text ) |
{ |
{ |
ber_tag_t tag; |
ber_tag_t tag; |
Line 360 get_substring_filter(
|
Line 360 get_substring_filter(
|
|
|
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, ENTRY, |
LDAP_LOG( FILTER, ENTRY, |
"get_substring_filter: conn %d begin\n", conn->c_connid, 0, 0 ); |
"get_ssa: conn %d begin\n", conn->c_connid, 0, 0 ); |
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "begin get_substring_filter\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "begin get_ssa\n", 0, 0, 0 ); |
#endif |
#endif |
if ( ber_scanf( ber, "{m" /*}*/, &desc ) == LBER_ERROR ) { |
if ( ber_scanf( ber, "{m" /*}*/, &desc ) == LBER_ERROR ) { |
return SLAPD_DISCONNECT; |
return SLAPD_DISCONNECT; |
} |
} |
|
|
*text = NULL; |
*text = NULL; |
f->f_choice = SLAPD_FILTER_COMPUTED; |
|
f->f_result = SLAPD_COMPARE_UNDEFINED; |
|
|
|
ssa.sa_desc = NULL; |
ssa.sa_desc = NULL; |
ssa.sa_initial.bv_val = NULL; |
ssa.sa_initial.bv_val = NULL; |
Line 468 get_substring_filter(
|
Line 466 get_substring_filter(
|
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", |
"get_ssa: conn %d INITIAL\n", |
conn->c_connid, 0, 0 ); |
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 ); |
Line 488 get_substring_filter(
|
Line 486 get_substring_filter(
|
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", |
"get_ssa: conn %d ANY\n", |
conn->c_connid, 0, 0 ); |
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 ); |
Line 505 get_substring_filter(
|
Line 503 get_substring_filter(
|
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", |
"get_ssa: conn %d FINAL\n", |
conn->c_connid, 0, 0 ); |
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 ); |
Line 522 get_substring_filter(
|
Line 520 get_substring_filter(
|
default: |
default: |
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, INFO, |
LDAP_LOG( FILTER, INFO, |
"get_substring_filter: conn %d unknown substring type %ld\n", |
"get_ssa: conn %d unknown substring type %ld\n", |
conn->c_connid, (long)tag, 0 ); |
conn->c_connid, (long)tag, 0 ); |
#else |
#else |
Debug( LDAP_DEBUG_FILTER, |
Debug( LDAP_DEBUG_FILTER, |
Line 536 get_substring_filter(
|
Line 534 get_substring_filter(
|
return_error: |
return_error: |
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, INFO, |
LDAP_LOG( FILTER, INFO, |
"get_substring_filter: conn %d error %ld\n", |
"get_ssa: conn %d error %ld\n", |
conn->c_connid, (long)rc, 0 ); |
conn->c_connid, (long)rc, 0 ); |
#else |
#else |
Debug( LDAP_DEBUG_FILTER, " error=%ld\n", |
Debug( LDAP_DEBUG_FILTER, " error=%ld\n", |
Line 552 return_error:
|
Line 550 return_error:
|
} |
} |
|
|
if( rc == LDAP_SUCCESS ) { |
if( rc == LDAP_SUCCESS ) { |
f->f_choice = LDAP_FILTER_SUBSTRINGS; |
*out = ch_malloc( sizeof( ssa ) ); |
f->f_sub = ch_malloc( sizeof( ssa ) ); |
**out = ssa; |
*f->f_sub = ssa; |
|
} |
} |
|
|
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, ENTRY, |
LDAP_LOG( FILTER, ENTRY, |
"get_substring_filter: conn %d exit\n", conn->c_connid, 0, 0 ); |
"get_ssa: conn %d exit\n", conn->c_connid, 0, 0 ); |
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "end get_substring_filter\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "end get_ssa\n", 0, 0, 0 ); |
#endif |
#endif |
|
|
return LDAP_SUCCESS; |
return LDAP_SUCCESS; |
Line 868 get_simple_vrFilter(
|
Line 865 get_simple_vrFilter(
|
ber_tag_t tag; |
ber_tag_t tag; |
ber_len_t len; |
ber_len_t len; |
int err; |
int err; |
ValuesReturnFilter *vrf; |
ValuesReturnFilter vrf; |
|
|
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, ENTRY, |
LDAP_LOG( FILTER, ENTRY, |
Line 884 get_simple_vrFilter(
|
Line 881 get_simple_vrFilter(
|
return SLAPD_DISCONNECT; |
return SLAPD_DISCONNECT; |
} |
} |
|
|
vrf = (ValuesReturnFilter *) ch_malloc( sizeof(ValuesReturnFilter) ); |
vrf.vrf_next = NULL; |
vrf->vrf_next = NULL; |
|
|
|
err = LDAP_SUCCESS; |
err = LDAP_SUCCESS; |
vrf->vrf_choice = tag; |
vrf.vrf_choice = tag; |
|
|
switch ( vrf->vrf_choice ) { |
switch ( vrf.vrf_choice ) { |
case LDAP_FILTER_EQUALITY: |
case LDAP_FILTER_EQUALITY: |
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, DETAIL2, |
LDAP_LOG( FILTER, DETAIL2, |
Line 898 get_simple_vrFilter(
|
Line 894 get_simple_vrFilter(
|
#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, &vrf->vrf_ava, SLAP_MR_EQUALITY, text ); |
err = get_ava( ber, &vrf.vrf_ava, SLAP_MR_EQUALITY, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
|
|
assert( vrf->vrf_ava != NULL ); |
assert( vrf.vrf_ava != NULL ); |
break; |
break; |
|
|
case LDAP_FILTER_SUBSTRINGS: |
case LDAP_FILTER_SUBSTRINGS: |
Line 913 get_simple_vrFilter(
|
Line 909 get_simple_vrFilter(
|
#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, (Filter *)vrf, text ); |
err = get_ssa( conn, ber, &vrf.vrf_sub, text ); |
break; |
break; |
|
|
case LDAP_FILTER_GE: |
case LDAP_FILTER_GE: |
Line 923 get_simple_vrFilter(
|
Line 919 get_simple_vrFilter(
|
#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, &vrf->vrf_ava, SLAP_MR_ORDERING, text ); |
err = get_ava( ber, &vrf.vrf_ava, SLAP_MR_ORDERING, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
Line 936 get_simple_vrFilter(
|
Line 932 get_simple_vrFilter(
|
#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, &vrf->vrf_ava, SLAP_MR_ORDERING, text ); |
err = get_ava( ber, &vrf.vrf_ava, SLAP_MR_ORDERING, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
Line 957 get_simple_vrFilter(
|
Line 953 get_simple_vrFilter(
|
break; |
break; |
} |
} |
|
|
vrf->vrf_desc = NULL; |
vrf.vrf_desc = NULL; |
err = slap_bv2ad( &type, &vrf->vrf_desc, text ); |
err = slap_bv2ad( &type, &vrf.vrf_desc, text ); |
|
|
if( err != LDAP_SUCCESS ) { |
if( err != LDAP_SUCCESS ) { |
/* unrecognized attribute description or other error */ |
/* unrecognized attribute description or other error */ |
vrf->vrf_choice = SLAPD_FILTER_COMPUTED; |
vrf.vrf_choice = SLAPD_FILTER_COMPUTED; |
vrf->vrf_result = LDAP_COMPARE_FALSE; |
vrf.vrf_result = LDAP_COMPARE_FALSE; |
err = LDAP_SUCCESS; |
err = LDAP_SUCCESS; |
break; |
break; |
} |
} |
Line 976 get_simple_vrFilter(
|
Line 972 get_simple_vrFilter(
|
#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, &vrf->vrf_ava, SLAP_MR_EQUALITY_APPROX, text ); |
err = get_ava( ber, &vrf.vrf_ava, SLAP_MR_EQUALITY_APPROX, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
Line 990 get_simple_vrFilter(
|
Line 986 get_simple_vrFilter(
|
Debug( LDAP_DEBUG_FILTER, "EXTENSIBLE\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "EXTENSIBLE\n", 0, 0, 0 ); |
#endif |
#endif |
|
|
err = get_mra( ber, &vrf->vrf_mra, text ); |
err = get_mra( ber, &vrf.vrf_mra, text ); |
if ( err != LDAP_SUCCESS ) { |
if ( err != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
|
|
assert( vrf->vrf_mra != NULL ); |
assert( vrf.vrf_mra != NULL ); |
break; |
break; |
|
|
default: |
default: |
Line 1003 get_simple_vrFilter(
|
Line 999 get_simple_vrFilter(
|
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
LDAP_LOG( FILTER, ERR, |
LDAP_LOG( FILTER, ERR, |
"get_simple_vrFilter: conn %d unknown filter type=%lu\n", |
"get_simple_vrFilter: conn %d unknown filter type=%lu\n", |
conn->c_connid, vrf->vrf_choice, 0 ); |
conn->c_connid, vrf.vrf_choice, 0 ); |
#else |
#else |
Debug( LDAP_DEBUG_ANY, "get_simple_vrFilter: unknown filter type=%lu\n", |
Debug( LDAP_DEBUG_ANY, "get_simple_vrFilter: unknown filter type=%lu\n", |
vrf->vrf_choice, 0, 0 ); |
vrf.vrf_choice, 0, 0 ); |
#endif |
#endif |
vrf->vrf_choice = SLAPD_FILTER_COMPUTED; |
vrf.vrf_choice = SLAPD_FILTER_COMPUTED; |
vrf->vrf_result = SLAPD_COMPARE_UNDEFINED; |
vrf.vrf_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 */ |
vrf.vrf_choice = SLAPD_FILTER_COMPUTED; |
vrf->vrf_choice = SLAPD_FILTER_COMPUTED; |
vrf.vrf_result = SLAPD_COMPARE_UNDEFINED; |
vrf->vrf_result = SLAPD_COMPARE_UNDEFINED; |
err = LDAP_SUCCESS; |
err = LDAP_SUCCESS; |
} |
*filt = vrf; |
|
|
|
} else { |
|
free(vrf); |
|
} |
|
|
|
} else { |
if ( err == LDAP_SUCCESS ) { |
*filt = vrf; |
*filt = ch_malloc( sizeof vrf ); |
|
**filt = vrf; |
} |
} |
|
|
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |
Line 1035 get_simple_vrFilter(
|
Line 1027 get_simple_vrFilter(
|
#else |
#else |
Debug( LDAP_DEBUG_FILTER, "end get_simple_vrFilter %d\n", err, 0, 0 ); |
Debug( LDAP_DEBUG_FILTER, "end get_simple_vrFilter %d\n", err, 0, 0 ); |
#endif |
#endif |
return( err ); |
|
|
return err; |
} |
} |
|
|
int |
int |
Line 1102 get_vrFilter( Connection *conn, BerEleme
|
Line 1095 get_vrFilter( Connection *conn, BerEleme
|
tag = ber_next_element( ber, &len, last ) ) |
tag = ber_next_element( ber, &len, last ) ) |
{ |
{ |
int err = get_simple_vrFilter( conn, ber, n, text ); |
int err = get_simple_vrFilter( conn, ber, n, text ); |
if ( err != LDAP_SUCCESS ) |
|
return( err ); |
if ( err != LDAP_SUCCESS ) return( err ); |
|
|
n = &(*n)->vrf_next; |
n = &(*n)->vrf_next; |
} |
} |
*n = NULL; |
*n = NULL; |
Line 1397 get_substring_vrFilter(
|
Line 1391 get_substring_vrFilter(
|
struct berval value; |
struct berval value; |
char *last; |
char *last; |
struct berval bv; |
struct berval bv; |
|
SubstringsAssertion ssa; |
*text = "error decoding filter"; |
*text = "error decoding filter"; |
|
|
#ifdef NEW_LOGGING |
#ifdef NEW_LOGGING |