From: Stig Venaas Date: Thu, 25 Jan 2001 16:51:59 +0000 (+0000) Subject: Made dnNormalize() do Unicode normalization and case folding. X-Git-Tag: LDBM_PRE_GIANT_RWLOCK~1529 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=b371357c13d20fbe378a0b144ecb14e5fd7820f0;p=openldap Made dnNormalize() do Unicode normalization and case folding. dn_normalize() now uses dnNormalize() and fails if normalized string is longer than original string. --- diff --git a/servers/slapd/dn.c b/servers/slapd/dn.c index 61b964d967..08cda568fa 100644 --- a/servers/slapd/dn.c +++ b/servers/slapd/dn.c @@ -30,89 +30,6 @@ #define UTF8DN 1 -#ifdef UTF8DN -/* - * Upper cases a UTF8 character. We cheat a bit, we only change to upper - * if the byte length is preserved. Should be replaced. - */ - -int -UTF8touppercheat( unsigned char *p ) -{ - ldap_unicode_t u; - int len; - - len = LDAP_UTF8_CHARLEN( p ); - if ( !len ) { - return 1; - } - - u = ldap_utf8_to_ucs4( p ); - if ( u == LDAP_UCS4_INVALID ) { - return 1; - } - - u = uctoupper ( u ); - if ( u < 0 ) { - return 1; - } - - if ( u < 0x80 ) { - if ( len == 1 ) { - p[0] = u; - } else { - return 1; - } - } else if ( u < 0x800 ) { - if ( len == 2 ) { - p[0] = 0xc0 | ( u >> 6 ); - p[1] = 0x80 | ( u & 0x3f ); - } else { - return 1; - } - } else if ( u < 0x10000 ) { - if ( len == 3 ) { - p[0] = 0xe0 | ( u >> 12 ); - p[1] = 0x80 | ( (u >> 6) & 0x3f ); - p[2] = 0x80 | ( u & 0x3f ); - } else { - return 1; - } - } else if ( u < 0x200000 ) { - if ( len == 4 ) { - p[0] = 0xf0 | ( u >> 18 ); - p[1] = 0x80 | ( (u >> 12) & 0x3f ); - p[2] = 0x80 | ( (u >> 6) & 0x3f ); - p[3] = 0x80 | ( u & 0x3f ); - } else { - return 1; - } - } else if ( u < 0x4000000 ) { - if ( len == 5 ) { - p[0] = 0xf8 | ( u >> 24 ); - p[1] = 0x80 | ( (u >> 18) & 0x3f ); - p[2] = 0x80 | ( (u >> 12) & 0x3f ); - p[3] = 0x80 | ( (u >> 6) & 0x3f ); - p[4] = 0x80 | ( u & 0x3f ); - } else { - return 1; - } - } else if ( len == 6 ) { - /* u < 0x80000000 */ - p[0] = 0xfc | ( u >> 30 ); - p[1] = 0x80 | ( (u >> 24) & 0x3f ); - p[2] = 0x80 | ( (u >> 18) & 0x3f ); - p[3] = 0x80 | ( (u >> 12) & 0x3f ); - p[4] = 0x80 | ( (u >> 6) & 0x3f ); - p[5] = 0x80 | ( u & 0x3f ); - } else { - return 1; - } - - return len; -} -#endif - /* * dn_validate - validate and compress dn. the dn is * compressed in place are returned if valid. @@ -286,28 +203,31 @@ dn_validate( char *dn_in ) char * dn_normalize( char *dn ) { + char *out; /* upper case it */ #ifndef UTF8DN ldap_pvt_str2upper( dn ); + /* validate and compress dn */ + out = dn_validate( dn ); #else /* enabling this might require reindexing */ - char *p; - - p = dn; - while ( *p ) { - /* optimizing */ - if ( LDAP_UTF8_ISASCII(p) ) { - *p = TOUPPER( (unsigned char) *p ); - p++; - } else { - p += UTF8touppercheat( p ); + struct berval *bvdn, *nbvdn; + + out = NULL; + bvdn = ber_bvstr( dn ); + + if ( dnNormalize( NULL, bvdn, &nbvdn ) == LDAP_SUCCESS ) { + if ( nbvdn->bv_len <= bvdn->bv_len ) { + out = dn; + strcpy( out, nbvdn->bv_val ); } + ber_bvfree( nbvdn ); } + bvdn->bv_val = NULL; /* prevent bvfree from freeing dn */ + ber_bvfree( bvdn ); #endif - /* validate and compress dn */ - dn = dn_validate( dn ); - return( dn ); + return( out ); } /* diff --git a/servers/slapd/schema_init.c b/servers/slapd/schema_init.c index 0067470fda..2919280de6 100644 --- a/servers/slapd/schema_init.c +++ b/servers/slapd/schema_init.c @@ -238,21 +238,23 @@ dnValidate( return rc; } -static int +int dnNormalize( Syntax *syntax, struct berval *val, struct berval **normalized ) { - struct berval *out = ber_bvdup( val ); + struct berval *out; - if( out->bv_len != 0 ) { + if ( val->bv_len != 0 ) { char *dn; #ifdef USE_DN_NORMALIZE - dn = dn_normalize( out->bv_val ); + out = ber_bvstr( UTF8normalize( val->bv_val, UTF8_CASEFOLD ) ); #else - dn = dn_validate( out->bv_val ); + out = ber_bvdup( val ); + ldap_pvt_str2upper( out->bv_val ); #endif + dn = dn_validate( out->bv_val ); if( dn == NULL ) { ber_bvfree( out ); @@ -261,6 +263,8 @@ dnNormalize( out->bv_val = dn; out->bv_len = strlen( dn ); + } else { + out = ber_bvdup( val ); } *normalized = out;