X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fgetdn.c;h=3fe68f5466107aeab1045dcbe3099952ed9b541c;hb=dd733e163a74db2968107b75e14f8705417b02c5;hp=01852c6ef89d627b1c900292c286018140290f50;hpb=42cc5e5333c36b1bd7ab250dac3a1a54ec3c439a;p=openldap diff --git a/libraries/libldap/getdn.c b/libraries/libldap/getdn.c index 01852c6ef8..3fe68f5466 100644 --- a/libraries/libldap/getdn.c +++ b/libraries/libldap/getdn.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* Portions @@ -54,135 +54,26 @@ ldap_get_dn( LDAP *ld, LDAPMessage *entry ) char * ldap_dn2ufn( LDAP_CONST char *dn ) { - char *p, *ufn, *r; - int state; + char *ufn; + char **vals; Debug( LDAP_DEBUG_TRACE, "ldap_dn2ufn\n", 0, 0, 0 ); + /* produces completely untyped UFNs */ + if( dn == NULL ) { return NULL; } - if ( ldap_is_dns_dn( dn ) || - ( p = ldap_utf8_strpbrk( dn, "=" ) ) == NULL ) - { - return( LDAP_STRDUP( dn ) ); - } - - ufn = LDAP_STRDUP( ++p ); - - if( ufn == NULL ) return NULL; - -#define INQUOTE 1 -#define OUTQUOTE 2 - state = OUTQUOTE; - for ( p = ufn, r = ufn; *p; LDAP_UTF8_INCR(p) ) { - switch ( *p ) { - case '\\': - if ( p[1] != '\0' ) { - *r++ = '\\'; - LDAP_UTF8_COPY(r,++p); - LDAP_UTF8_INCR(r); - } - break; - - case '"': - if ( state == INQUOTE ) - state = OUTQUOTE; - else - state = INQUOTE; - *r++ = *p; - break; - - case ';': - case ',': - if ( state == OUTQUOTE ) - *r++ = ','; - else - *r++ = *p; - break; - - case '=': - if ( state == INQUOTE ) { - *r++ = *p; - } else { - char *rsave = r; - - *r = '\0'; - LDAP_UTF8_DECR( r ); - - while ( !ldap_utf8_isspace( r ) - && *r != ';' && *r != ',' && r > ufn ) - { - LDAP_UTF8_DECR( r ); - } - LDAP_UTF8_INCR( r ); - - if ( strcasecmp( r, "c" ) - && strcasecmp( r, "o" ) - && strcasecmp( r, "ou" ) - && strcasecmp( r, "st" ) - && strcasecmp( r, "l" ) - && strcasecmp( r, "cn" ) ) { - r = rsave; - *r++ = '='; - } - } - break; - - default: - LDAP_UTF8_COPY(r, p); - LDAP_UTF8_INCR(r); - break; - } - } - *r = '\0'; - - return( ufn ); -} - -char ** -ldap_explode_dns( LDAP_CONST char *dn_in ) -{ - char *s; - char **rdns; - char *tok_r; - char *dn; - - int ncomps; - int maxcomps = 8; - - if ( (dn = LDAP_STRDUP( dn_in )) == NULL ) { - return( NULL ); - } - - if ( (rdns = (char **) LDAP_MALLOC( maxcomps * sizeof(char *) )) == NULL ) { - LDAP_FREE( dn ); - return( NULL ); - } - - ncomps = 0; - for ( s = ldap_pvt_strtok( dn, "@.", &tok_r ); s != NULL; - s = ldap_pvt_strtok( NULL, "@.", &tok_r ) ) - { - if ( ncomps == maxcomps ) { - maxcomps *= 2; - if ( (rdns = (char **) LDAP_REALLOC( rdns, maxcomps * - sizeof(char *) )) == NULL ) - { - LDAP_FREE( dn ); - return NULL; - } - } - rdns[ncomps++] = LDAP_STRDUP( s ); + vals = ldap_explode_dn( dn , 1 ); + if( vals == NULL ) { + return NULL; } - LDAP_FREE(dn); - rdns[ncomps] = NULL; + ufn = ldap_charray2str( vals, ", " ); - /* trim rdns */ - rdns = (char **) LDAP_REALLOC( rdns, (ncomps+1) * sizeof(char*) ); - return( rdns ); + ldap_memvfree( vals ); + return ufn; } char ** @@ -190,9 +81,6 @@ ldap_explode_dn( LDAP_CONST char *dn, int notypes ) { Debug( LDAP_DEBUG_TRACE, "ldap_explode_dn\n", 0, 0, 0 ); - if ( ldap_is_dns_dn( dn ) ) { - return( ldap_explode_dns( dn ) ); - } return explode_name( dn, notypes, NAME_TYPE_LDAP_DN ); } @@ -287,6 +175,9 @@ ldap_dcedn2dn( LDAP_CONST char *dce ) return dn; } +#define INQUOTE 1 +#define OUTQUOTE 2 + static char ** explode_name( const char *name, int notypes, int is_type ) { @@ -325,7 +216,7 @@ explode_name( const char *name, int notypes, int is_type ) state = INQUOTE; break; case '=': - if( state = OUTQUOTE ) have_equals++; + if( state == OUTQUOTE ) have_equals++; break; case '+': if (is_type == NAME_TYPE_LDAP_RDN) @@ -384,7 +275,7 @@ explode_name( const char *name, int notypes, int is_type ) if (( parts[ count-1 ] = (char *)LDAP_CALLOC( 1, len + 1 )) != NULL ) { - SAFEMEMCPY( parts[ count-1 ], rdn, len ); + AC_MEMCPY( parts[ count-1 ], rdn, len ); if( !endquote ) { /* skip trailing spaces */ @@ -415,11 +306,3 @@ explode_name( const char *name, int notypes, int is_type ) return( parts ); } - - -int -ldap_is_dns_dn( LDAP_CONST char *dn ) -{ - return dn[ 0 ] != '\0' && ldap_utf8_strpbrk( dn, "=,;" ) == NULL; -} -