--- servers/slapd/filter.c 2001/12/07 15:43:18 1.13.4.10 +++ servers/slapd/filter.c 2000/10/13 18:41:56 1.54 @@ -1,5 +1,5 @@ /* filter.c - routines for parsing and dealing with filters */ -/* $OpenLDAP: pkg/ldap/servers/slapd/filter.c,v 1.13.4.9 2001/08/31 20:24:17 kurt Exp $ */ +/* $OpenLDAP: pkg/ldap/servers/slapd/filter.c,v 1.53 2000/10/09 17:13:17 jsanchez Exp $ */ /* * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file @@ -183,12 +183,7 @@ get_filter( err = slap_bv2ad( &type, &f->f_desc, text ); if( err != LDAP_SUCCESS ) { - /* unrecognized attribute description or other error */ - f->f_choice = SLAPD_FILTER_COMPUTED; - f->f_result = LDAP_COMPARE_FALSE; - *fstr = ch_strdup( "(unrecogized=*)" ); ch_free( type.bv_val ); - err = LDAP_SUCCESS; break; } @@ -260,17 +255,35 @@ get_filter( break; case LDAP_FILTER_EXT: - /* not yet implemented */ - Debug( LDAP_DEBUG_ANY, "extensible match not yet implemented.\n", - 0, 0, 0 ); - (void) ber_skip_tag( ber, &len ); - f->f_choice = SLAPD_FILTER_COMPUTED; - f->f_result = SLAPD_COMPARE_UNDEFINED; - *fstr = ch_strdup( "(extended)" ); + Debug( LDAP_DEBUG_FILTER, "EXTENSIBLE\n", 0, 0, 0 ); + + err = get_mra( ber, &f->f_mra, text ); + if ( err != LDAP_SUCCESS ) { + break; + } + + assert( f->f_mra != NULL ); + + filter_escape_value( f->f_mr_value, &escaped ); + + *fstr = ch_malloc( sizeof("(:dn::=)") + + (f->f_mr_desc ? f->f_mr_desc->ad_cname->bv_len : 0) + + (f->f_mr_rule ? strlen(f->f_mr_rule) : 0) + + escaped.bv_len ); + + sprintf( *fstr, "(%s%s%s%s:=%s)", + (f->f_mr_desc ? f->f_mr_desc->ad_cname->bv_val : ""), + (f->f_mr_dnattrs ? ":dn" : ""), + (f->f_mr_rule ? ":" : ""), + (f->f_mr_rule ? f->f_mr_rule : ""), + f->f_mr_desc->ad_cname->bv_val, + escaped.bv_val ); + + ber_memfree( escaped.bv_val ); break; default: - (void) ber_scanf( ber, "x" ); /* skip the element */ + (void) ber_skip_tag( ber, &len ); Debug( LDAP_DEBUG_ANY, "get_filter: unknown filter type=%lu\n", f->f_choice, 0, 0 ); f->f_choice = SLAPD_FILTER_COMPUTED; @@ -448,10 +461,7 @@ get_substring_filter( switch ( tag ) { case LDAP_SUBSTRING_INITIAL: Debug( LDAP_DEBUG_FILTER, " INITIAL\n", 0, 0, 0 ); - if ( f->f_sub_initial != NULL - || f->f_sub_any != NULL - || f->f_sub_final != NULL ) - { + if ( f->f_sub_initial != NULL ) { ber_bvfree( value ); goto return_error; } @@ -469,12 +479,6 @@ get_substring_filter( case LDAP_SUBSTRING_ANY: Debug( LDAP_DEBUG_FILTER, " ANY\n", 0, 0, 0 ); - - if ( f->f_sub_final != NULL ) { - ber_bvfree( value ); - goto return_error; - } - if( ber_bvecadd( &f->f_sub_any, value ) < 0 ) { ber_bvfree( value ); goto return_error; @@ -492,12 +496,10 @@ get_substring_filter( case LDAP_SUBSTRING_FINAL: Debug( LDAP_DEBUG_FILTER, " FINAL\n", 0, 0, 0 ); - if ( f->f_sub_final != NULL ) { ber_bvfree( value ); goto return_error; } - f->f_sub_final = value; if( fstr ) { @@ -577,7 +579,6 @@ filter_free( Filter *f ) if ( f->f_sub_final != NULL ) { ber_bvfree( f->f_sub_final ); } - ch_free( f->f_sub ); break; case LDAP_FILTER_AND: