- for ( i = 0; i < iAVA; i++ ) {
- LDAPAVA *ava = rdn[ i ][ 0 ];
- int a, j;
-
- a = strcmp( ava_in->la_attr->bv_val, ava->la_attr->bv_val );
-
- if ( a > 0 ) {
- break;
- }
-
- while ( a == 0 ) {
- int v, d;
-
- d = ava_in->la_value->bv_len - ava->la_value->bv_len;
-
- v = memcmp( ava_in->la_value->bv_val,
- ava->la_value->bv_val,
- d <= 0 ? ava_in->la_value->bv_len
- : ava->la_value->bv_len );
-
- if ( v == 0 && d != 0 ) {
- v = d;
- }
-
- if ( v <= 0 ) {
- /*
- * got it!
- */
- break;
- }
-
- if ( ++i == iAVA ) {
- /*
- * already sorted
- */
- return;
- }
-
- ava = rdn[ i ][ 0 ];
- a = strcmp( ava_in->la_value->bv_val,
- ava->la_value->bv_val );
- }
-
- /*
- * move ahead
- */
- for ( j = iAVA; j > i; j-- ) {
- rdn[ j ][ 0 ] = rdn[ j - 1 ][ 0 ];
- }
- rdn[ i ][ 0 ] = ava_in;
-
- return;
- }
-}
-
-/*
- * In-place, schema-aware normalization / "pretty"ing of the
- * structural representation of a distinguished name.
- */
-static int
-LDAPDN_rewrite( LDAPDN *dn, unsigned flags )
-{
- int iRDN;
- int rc;
-
- assert( dn );
-
- for ( iRDN = 0; dn[ iRDN ]; iRDN++ ) {
- LDAPRDN *rdn = dn[ iRDN ][ 0 ];
- int iAVA;
-
- for ( iAVA = 0; rdn[ iAVA ]; iAVA++ ) {
- LDAPAVA *ava = rdn[ iAVA ][ 0 ];
- AttributeDescription *ad;
- slap_syntax_transform_func *transf = NULL;
- MatchingRule *mr;
- struct berval *bv = NULL;
-
- if ( ( ad = AVA_PRIVATE( ava ) ) == NULL ) {
- const char *text = NULL;
-
- rc = slap_bv2ad( ava->la_attr, &ad, &text );
- if ( rc != LDAP_SUCCESS ) {
- return LDAP_INVALID_SYNTAX;
- }
-
- ava->la_private = ( void * )ad;
- }
-
- /*
- * Replace attr oid/name with the canonical name
- */
- ber_bvfree( ava->la_attr );
- ava->la_attr = ber_bvdup( &ad->ad_cname );
-
- if( flags & SLAP_LDAPDN_PRETTY ) {
- transf = ad->ad_type->sat_syntax->ssyn_pretty;
- mr = NULL;
- } else {
- transf = ad->ad_type->sat_syntax->ssyn_normalize;
- mr = ad->ad_type->sat_equality;
- }
-
- if ( transf ) {
- /*
- * transform value by normalize/pretty function
- */
- rc = ( *transf )( ad->ad_type->sat_syntax,
- ava->la_value, &bv );
-
- if ( rc != LDAP_SUCCESS ) {
- return LDAP_INVALID_SYNTAX;
- }
- }
-
- if( mr && ( mr->smr_usage & SLAP_MR_DN_FOLD ) ) {
- struct berval *s = bv;
-
- bv = ber_bvstr( UTF8normalize( bv ? bv : ava->la_value,
- UTF8_CASEFOLD ) );
-
- ber_bvfree( s );
- }
-
- if( bv ) {
- ber_bvfree( ava->la_value );
- ava->la_value = bv;
- }
-
- AVA_Sort( rdn, iAVA );
- }
- }
-
- return LDAP_SUCCESS;
-}
-
-int
-dnNormalize(
- Syntax *syntax,
- struct berval *val,
- struct berval **normalized )
-{
- struct berval *out = NULL;
-
- Debug( LDAP_DEBUG_TRACE, ">>> dnNormalize: <%s>\n", val->bv_val, 0, 0 );
-
- if ( val->bv_len != 0 ) {
- LDAPDN *dn = NULL;
- char *dn_out = NULL;
- int rc;
-
- /*
- * Go to structural representation
- */
- rc = ldap_str2dn( val->bv_val, &dn, LDAP_DN_FORMAT_LDAP );
- if ( rc != LDAP_SUCCESS ) {
- return LDAP_INVALID_SYNTAX;
- }
-
- /*
- * Schema-aware rewrite
- */
- if ( LDAPDN_rewrite( dn, 0 ) != LDAP_SUCCESS ) {
- ldapava_free_dn( dn );
- return LDAP_INVALID_SYNTAX;
- }
-
- /*
- * Back to string representation
- */
- rc = ldap_dn2str( dn, &dn_out, LDAP_DN_FORMAT_LDAPV3 );
-
- ldapava_free_dn( dn );
-
- if ( rc != LDAP_SUCCESS ) {
- return LDAP_INVALID_SYNTAX;
- }
-
- out = ber_bvstr( dn_out );
-
- } else {
- out = ber_bvdup( val );