mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-30 13:30:57 +08:00
The beginning of extensible matches. Do not use.
This commit is contained in:
parent
c317a093c4
commit
d4b63dd3e3
@ -18,7 +18,7 @@ SRCS = main.c daemon.c connection.c search.c filter.c add.c charray.c \
|
||||
schema.c schema_check.c schema_init.c schema_prep.c \
|
||||
schemaparse.c ad.c at.c mr.c syntax.c oc.c saslauthz.c \
|
||||
monitor.c configinfo.c starttls.c index.c sets.c\
|
||||
root_dse.c sasl.c module.c suffixalias.c $(@PLAT@_SRCS)
|
||||
root_dse.c sasl.c module.c suffixalias.c mra.c $(@PLAT@_SRCS)
|
||||
|
||||
OBJS = main.o daemon.o connection.o search.o filter.o add.o charray.o \
|
||||
attr.o entry.o config.o backend.o result.o operation.o \
|
||||
@ -29,7 +29,7 @@ OBJS = main.o daemon.o connection.o search.o filter.o add.o charray.o \
|
||||
schema.o schema_check.o schema_init.o schema_prep.o \
|
||||
schemaparse.o ad.o at.o mr.o syntax.o oc.o saslauthz.o \
|
||||
monitor.o configinfo.o starttls.o index.o sets.o\
|
||||
root_dse.o sasl.o module.o suffixalias.o $(@PLAT@_OBJS)
|
||||
root_dse.o sasl.o module.o suffixalias.o mra.o $(@PLAT@_OBJS)
|
||||
|
||||
LDAP_INCDIR= ../../include
|
||||
LDAP_LIBDIR= ../../libraries
|
||||
|
@ -255,13 +255,31 @@ 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:
|
||||
|
126
servers/slapd/mra.c
Normal file
126
servers/slapd/mra.c
Normal file
@ -0,0 +1,126 @@
|
||||
/* $OpenLDAP$ */
|
||||
/*
|
||||
* Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
|
||||
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
|
||||
*/
|
||||
/* mra.c - routines for dealing with extensible matching rule assertions */
|
||||
|
||||
#include "portable.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <ac/string.h>
|
||||
#include <ac/socket.h>
|
||||
|
||||
#include "slap.h"
|
||||
|
||||
|
||||
void
|
||||
mra_free(
|
||||
MatchingRuleAssertion *mra,
|
||||
int freeit
|
||||
)
|
||||
{
|
||||
ad_free( mra->ma_desc, 1 );
|
||||
ch_free( (char *) mra->ma_rule );
|
||||
ber_bvfree( mra->ma_value );
|
||||
if ( freeit ) {
|
||||
ch_free( (char *) mra );
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
get_mra(
|
||||
BerElement *ber,
|
||||
MatchingRuleAssertion **mra,
|
||||
const char **text
|
||||
)
|
||||
{
|
||||
int rc, tag;
|
||||
struct berval type, value, *nvalue;
|
||||
MatchingRuleAssertion *ma;
|
||||
|
||||
ma = ch_malloc( sizeof( MatchingRuleAssertion ) );
|
||||
ma->ma_rule = NULL;
|
||||
ma->ma_desc = NULL;
|
||||
ma->ma_dnattrs = 0;
|
||||
ma->ma_value = NULL;
|
||||
|
||||
rc = ber_scanf( ber, "{t", &tag );
|
||||
|
||||
if( rc == LBER_ERROR ) {
|
||||
Debug( LDAP_DEBUG_ANY, " get_mra ber_scanf\n", 0, 0, 0 );
|
||||
*text = "Error parsing matching rule assertion";
|
||||
return SLAPD_DISCONNECT;
|
||||
}
|
||||
|
||||
if ( tag == LDAP_FILTER_EXT_OID ) {
|
||||
rc = ber_scanf( ber, "a", &ma->ma_rule );
|
||||
if ( rc == LBER_ERROR ) {
|
||||
Debug( LDAP_DEBUG_ANY, " get_mra ber_scanf for mr\n", 0, 0, 0 );
|
||||
*text = "Error parsing matching rule in matching rule assertion";
|
||||
return SLAPD_DISCONNECT;
|
||||
}
|
||||
|
||||
rc = ber_scanf( ber, "t", &tag );
|
||||
|
||||
if( rc == LBER_ERROR ) {
|
||||
Debug( LDAP_DEBUG_ANY, " get_mra ber_scanf\n", 0, 0, 0 );
|
||||
*text = "Error parsing matching rule assertion";
|
||||
return SLAPD_DISCONNECT;
|
||||
}
|
||||
}
|
||||
|
||||
if ( tag == LDAP_FILTER_EXT_TYPE ) {
|
||||
rc = ber_scanf( ber, "o", &type );
|
||||
if ( rc == LBER_ERROR ) {
|
||||
Debug( LDAP_DEBUG_ANY, " get_mra ber_scanf for ad\n", 0, 0, 0 );
|
||||
*text = "Error parsing attribute description in matching rule assertion";
|
||||
return SLAPD_DISCONNECT;
|
||||
}
|
||||
|
||||
rc = slap_bv2ad( &type, &ma->ma_desc, text );
|
||||
ch_free( type.bv_val );
|
||||
|
||||
if( rc != LDAP_SUCCESS ) {
|
||||
ch_free( value.bv_val );
|
||||
mra_free( ma, 1 );
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = ber_scanf( ber, "t", &tag );
|
||||
|
||||
if( rc == LBER_ERROR ) {
|
||||
Debug( LDAP_DEBUG_ANY, " get_mra ber_scanf\n", 0, 0, 0 );
|
||||
*text = "Error parsing matching rule assertion";
|
||||
return SLAPD_DISCONNECT;
|
||||
}
|
||||
}
|
||||
|
||||
rc = ber_scanf( ber, "o", &value );
|
||||
|
||||
if( rc == LBER_ERROR ) {
|
||||
Debug( LDAP_DEBUG_ANY, " get_mra ber_scanf\n", 0, 0, 0 );
|
||||
*text = "Error decoding value in matching rule assertion";
|
||||
return SLAPD_DISCONNECT;
|
||||
}
|
||||
|
||||
/*
|
||||
* OK, if no matching rule, normalize for equality, otherwise
|
||||
* normalize for the matching rule.
|
||||
*/
|
||||
rc = value_normalize( ma->ma_desc, SLAP_MR_EQUALITY, &value, &nvalue, text );
|
||||
ch_free( value.bv_val );
|
||||
|
||||
if( rc != LDAP_SUCCESS ) {
|
||||
ad_free( ma->ma_desc, 1 );
|
||||
ch_free( ma );
|
||||
return rc;
|
||||
}
|
||||
|
||||
ma->ma_value = nvalue;
|
||||
*mra = ma;
|
||||
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user