diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 73f33a9f47..d3a73807d4 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -161,6 +161,8 @@ typedef struct slap_syntax { #define SLAP_SYNTAX_BER 0x4U /* stored using BER encoding (binary,certificate) */ slap_syntax_validate_func *ssyn_validate; + slap_syntax_transform_func *ssyn_normalize; + slap_syntax_transform_func *ssyn_pretty; #ifdef SLAPD_BINARY_CONVERSION /* convert to and from binary */ diff --git a/servers/slapd/value.c b/servers/slapd/value.c index 753c724005..21ec4e067e 100644 --- a/servers/slapd/value.c +++ b/servers/slapd/value.c @@ -186,6 +186,16 @@ value_match( { int rc; int usage = 0; + struct berval *nv1 = NULL; + + if( ad->ad_type->sat_syntax->ssyn_normalize ) { + rc = ad->ad_type->sat_syntax->ssyn_normalize( + ad->ad_type->sat_syntax, v1, &nv1 ); + + if( rc != LDAP_SUCCESS ) { + return LDAP_INAPPROPRIATE_MATCHING; + } + } if( !mr->smr_match ) { return LDAP_INAPPROPRIATE_MATCHING; @@ -193,8 +203,11 @@ value_match( rc = (mr->smr_match)( match, usage, ad->ad_type->sat_syntax, - mr, v1, v2 ); + mr, + nv1 != NULL ? nv1 : v1, + v2 ); + ber_bvfree( nv1 ); return rc; }