mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-02-05 13:40:08 +08:00
Made dnNormalize() do Unicode normalization and case folding.
dn_normalize() now uses dnNormalize() and fails if normalized string is longer than original string.
This commit is contained in:
parent
d717d9c897
commit
b371357c13
@ -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;
|
||||
struct berval *bvdn, *nbvdn;
|
||||
|
||||
p = dn;
|
||||
while ( *p ) {
|
||||
/* optimizing */
|
||||
if ( LDAP_UTF8_ISASCII(p) ) {
|
||||
*p = TOUPPER( (unsigned char) *p );
|
||||
p++;
|
||||
} else {
|
||||
p += UTF8touppercheat( p );
|
||||
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 );
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user