]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schema_init.c
liberally accept many LDAPv2/LDAPv3 stuff in DN (quoted parts, ';' as rdn separator...
[openldap] / servers / slapd / schema_init.c
index 62e871b1c4f1839ce0bae172dc51cfcc6735648c..8437777e12722ed44d77784a3079b37862fca325 100644 (file)
 #define berValidate                                            blobValidate
 
 /* unimplemented pretters */
+#define integerPretty                                  NULL
 #ifndef USE_LDAP_DN_PARSING
-#define dnPretty                                               NULL
+#      define dnPretty                                         NULL
+#else
+#      define SLAP_LDAPDN_PRETTY 0x1
 #endif /* !USE_LDAP_DN_PARSING */
-#define integerPretty                                  NULL
 
 /* recycled matching routines */
 #define bitStringMatch                                 octetStringMatch
@@ -233,7 +235,11 @@ dnValidate(
                return( LDAP_SUCCESS );
        }
 
-       rc = ldap_str2dn( in->bv_val, &dn, LDAP_DN_FORMAT_LDAPV3 );
+       rc = ldap_str2dn( in->bv_val, &dn, LDAP_DN_FORMAT_LDAP );
+
+       /*
+        * Fixme: should we also validate each DN component?
+        */
        ldapava_free_dn( dn );
        
        if ( rc != LDAP_SUCCESS ) {
@@ -305,11 +311,11 @@ AVA_Sort( LDAPRDN *rdn, int iAVA )
 }
 
 /*
- * In-place normalization of the structural representation 
- * of a distinguished name
+ * In-place, schema-aware normalization / "pretty"ing of the
+ * structural representation of a distinguished name.
  */
 static int
-DN_Normalize( LDAPDN *dn )
+LDAPDN_rewrite( LDAPDN *dn, unsigned flags )
 {
        int             iRDN;
        int             rc;
@@ -324,56 +330,60 @@ DN_Normalize( LDAPDN *dn )
                        LDAPAVA                 *ava = rdn[ iAVA ][ 0 ];
                        AttributeDescription    *ad = NULL;
                        const char              *text = NULL;
-                       slap_syntax_transform_func *nf = NULL;
+                       slap_syntax_transform_func *transf = NULL;
+                       MatchingRule *mr;
                        struct berval           *bv = NULL;
 
                        rc = slap_bv2ad( ava->la_attr, &ad, &text );
                        if ( rc != LDAP_SUCCESS ) {
-                               return( LDAP_INVALID_SYNTAX );
+                               return LDAP_INVALID_SYNTAX;
                        }
 
                        /* 
-                        * FIXME: is this required? 
+                        * Replace attr oid/name with the canonical name
                         */
                        ber_bvfree( ava->la_attr );
                        ava->la_attr = ber_bvdup( &ad->ad_cname );
-                               
-                       /*
-                        * FIXME: What is this intended for?
-                        */
-                       nf = ad->ad_type->sat_syntax->ssyn_normalize;
-                       if ( !nf ) {
-                               break;
+
+                       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;
                        }
-                               
-                       rc = ( *nf )( ad->ad_type->sat_syntax,
-                                ava->la_value, &bv );
+
+                       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 ( rc != LDAP_SUCCESS ) {
+                                       return LDAP_INVALID_SYNTAX;
+                               }
                        }
 
-                       /*
-                        * FIXME: shouldn't this happen inside 
-                        * ssyn_normalize if the syntax is case 
-                        * insensitive?
-                        */
-                       if ( !( ava->la_flags & LDAP_AVA_BINARY ) ) {
+                       if( mr && ( mr->smr_usage & SLAP_MR_DN_FOLD ) ) {
                                struct berval *s = bv;
-                               
-                               bv = ber_bvstr( UTF8normalize( bv, 
-                                               UTF8_CASEFOLD ) );
+
+                               bv = ber_bvstr( UTF8normalize( bv ? bv : ava->la_value, 
+                                       UTF8_CASEFOLD ) );
+
                                ber_bvfree( s );
                        }
 
-                       ber_bvfree( ava->la_value );
-                       ava->la_value = bv;
+                       if( bv ) {
+                               ber_bvfree( ava->la_value );
+                               ava->la_value = bv;
+                       }
 
                        AVA_Sort( rdn, iAVA );
                }
        }
 
-       return( LDAP_SUCCESS );
+       return LDAP_SUCCESS;
 }
 
 int
@@ -384,7 +394,7 @@ dnNormalize(
 {
        struct berval *out = NULL;
 
-       Debug( LDAP_DEBUG_TRACE, ">>> dnNormalize: %s\n", val->bv_val, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, ">>> dnNormalize: <%s>\n", val->bv_val, 0, 0 );
 
        if ( val->bv_len != 0 ) {
                LDAPDN          *dn = NULL;
@@ -394,16 +404,17 @@ dnNormalize(
                /*
                 * Go to structural representation
                 */
-               rc = ldap_str2dn( val->bv_val, &dn, LDAP_DN_FORMAT_LDAPV3 );
+               rc = ldap_str2dn( val->bv_val, &dn, LDAP_DN_FORMAT_LDAP );
                if ( rc != LDAP_SUCCESS ) {
-                       return( LDAP_INVALID_SYNTAX );
+                       return LDAP_INVALID_SYNTAX;
                }
 
                /*
-                * Add schema-aware normalization stuff
+                * Schema-aware rewrite
                 */
-               if ( DN_Normalize( dn ) != LDAP_SUCCESS ) {
-                       goto error_return;
+               if ( LDAPDN_rewrite( dn, 0 ) != LDAP_SUCCESS ) {
+                       ldapava_free_dn( dn );
+                       return LDAP_INVALID_SYNTAX;
                }
 
                /*
@@ -411,25 +422,23 @@ dnNormalize(
                 */
                rc = ldap_dn2str( dn, &dn_out, LDAP_DN_FORMAT_LDAPV3 );
 
+               ldapava_free_dn( dn );
+
                if ( rc != LDAP_SUCCESS ) {
-error_return:;
-                       ldapava_free_dn( dn );
-                       return( LDAP_INVALID_SYNTAX );
+                       return LDAP_INVALID_SYNTAX;
                }
 
-               ldapava_free_dn( dn );
-
                out = ber_bvstr( dn_out );
 
        } else {
                out = ber_bvdup( val );
        }
 
-       Debug( LDAP_DEBUG_TRACE, "<<< dnNormalize: %s\n", out->bv_val, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "<<< dnNormalize: <%s>\n", out->bv_val, 0, 0 );
 
        *normalized = out;
 
-       return( LDAP_SUCCESS );
+       return LDAP_SUCCESS;
 }
 
 int
@@ -440,37 +449,35 @@ dnPretty(
 {
        struct berval *out = NULL;
 
+       Debug( LDAP_DEBUG_TRACE, ">>> dnPretty: <%s>\n", val->bv_val, 0, 0 );
+
        if ( val->bv_len != 0 ) {
                LDAPDN          *dn = NULL;
                char            *dn_out = NULL;
                int             rc;
 
                /* FIXME: should be liberal in what we accept */
-               rc = ldap_str2dn( val->bv_val, &dn, LDAP_DN_FORMAT_LDAPV3 );
+               rc = ldap_str2dn( val->bv_val, &dn, LDAP_DN_FORMAT_LDAP );
                if ( rc != LDAP_SUCCESS ) {
-                       return( LDAP_INVALID_SYNTAX );
+                       return LDAP_INVALID_SYNTAX;
                }
 
-               /* Add LDAPDN pretty code here
-                *   pretty'ing MUST preserve values
-                *   but MAY use alternative representation of value.
-                *
-                * That is, in addition to changes made by the
-                * str->LDAPDN->str processing, this code can
-                *       convert values from BER to LDAP string representation
-                *              (or other direction if appropriate)
-                *       "pretty" values
-                *       normalize attribute descriptions
-                *       reorder AVAs in RDNs
+               /*
+                * Schema-aware rewrite
                 */
+               if ( LDAPDN_rewrite( dn, SLAP_LDAPDN_PRETTY ) != LDAP_SUCCESS ) {
+                       ldapava_free_dn( dn );
+                       return LDAP_INVALID_SYNTAX;
+               }
 
                /* FIXME: not sure why the default isn't pretty */
                rc = ldap_dn2str( dn, &dn_out,
                        LDAP_DN_FORMAT_LDAPV3 | LDAP_DN_PRETTY );
+
                ldapava_free_dn( dn );
 
                if ( rc != LDAP_SUCCESS ) {
-                       return( LDAP_INVALID_SYNTAX );
+                       return LDAP_INVALID_SYNTAX;
                }
 
                out = ber_bvstr( dn_out );
@@ -479,9 +486,11 @@ dnPretty(
                out = ber_bvdup( val );
        }
 
+       Debug( LDAP_DEBUG_TRACE, "<<< dnPretty: <%s>\n", out->bv_val, 0, 0 );
+
        *pretty = out;
 
-       return( LDAP_SUCCESS );
+       return LDAP_SUCCESS;
 }
 
 int
@@ -499,13 +508,7 @@ dnMatch(
        match = value->bv_len - asserted->bv_len;
 
        if ( match == 0 ) {
-#ifdef USE_DN_NORMALIZE
                match = strcmp( value->bv_val, asserted->bv_val );
-               fprintf(stderr, "USE_DN_NORMALIZE :(\n");
-#else
-               match = strcasecmp( value->bv_val, asserted->bv_val );
-               fprintf(stderr, "!USE_DN_NORMALIZE :)\n");
-#endif
        }
 
 #ifdef NEW_LOGGING
@@ -4787,7 +4790,7 @@ struct mrule_defs_rec mrule_defs[] = {
 
        {"( 2.5.13.2 NAME 'caseIgnoreMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
-               SLAP_MR_EQUALITY | SLAP_MR_EXT,
+               SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD,
                NULL, NULL,
                caseIgnoreMatch, caseExactIgnoreIndexer, caseExactIgnoreFilter,
                directoryStringApproxMatchOID },
@@ -4833,7 +4836,7 @@ struct mrule_defs_rec mrule_defs[] = {
 
        {"( 2.5.13.8 NAME 'numericStringMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
-               SLAP_MR_EQUALITY | SLAP_MR_EXT,
+               SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD,
                NULL, NULL,
                caseIgnoreIA5Match,
                caseIgnoreIA5Indexer,
@@ -4851,7 +4854,7 @@ struct mrule_defs_rec mrule_defs[] = {
 
        {"( 2.5.13.11 NAME 'caseIgnoreListMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )",
-               SLAP_MR_EQUALITY | SLAP_MR_EXT,
+               SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD,
                NULL, NULL,
                caseIgnoreListMatch, NULL, NULL,
                NULL},
@@ -4893,7 +4896,7 @@ struct mrule_defs_rec mrule_defs[] = {
 
        {"( 2.5.13.20 NAME 'telephoneNumberMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )",
-               SLAP_MR_EQUALITY | SLAP_MR_EXT,
+               SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD,
                NULL, NULL,
                telephoneNumberMatch,
                telephoneNumberIndexer,
@@ -4977,7 +4980,7 @@ struct mrule_defs_rec mrule_defs[] = {
 
        {"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
-               SLAP_MR_EQUALITY | SLAP_MR_EXT,
+               SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD,
                NULL, NULL,
                caseIgnoreIA5Match, caseIgnoreIA5Indexer, caseIgnoreIA5Filter,
                IA5StringApproxMatchOID },