mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-20 22:59:34 -05:00
add scope helpers
This commit is contained in:
parent
6ce47650c9
commit
d12f5fbcb5
2 changed files with 93 additions and 83 deletions
|
|
@ -65,6 +65,18 @@ LDAP_F (char *) ldap_url_list2urls LDAP_P((
|
||||||
LDAP_F (void) ldap_free_urllist LDAP_P((
|
LDAP_F (void) ldap_free_urllist LDAP_P((
|
||||||
struct ldap_url_desc *ludlist ));
|
struct ldap_url_desc *ludlist ));
|
||||||
|
|
||||||
|
LDAP_F (int) ldap_pvt_scope2bv LDAP_P ((
|
||||||
|
int scope, struct berval *bv ));
|
||||||
|
|
||||||
|
LDAP_F (LDAP_CONST char *) ldap_pvt_scope2str LDAP_P ((
|
||||||
|
int scope ));
|
||||||
|
|
||||||
|
LDAP_F (int) ldap_pvt_bv2scope LDAP_P ((
|
||||||
|
struct berval *bv ));
|
||||||
|
|
||||||
|
LDAP_F (int) ldap_pvt_str2scope LDAP_P ((
|
||||||
|
LDAP_CONST char * ));
|
||||||
|
|
||||||
LDAP_F( char * )
|
LDAP_F( char * )
|
||||||
ldap_pvt_ctime LDAP_P((
|
ldap_pvt_ctime LDAP_P((
|
||||||
const time_t *tp,
|
const time_t *tp,
|
||||||
|
|
|
||||||
|
|
@ -257,34 +257,83 @@ skip_url_prefix(
|
||||||
return( NULL );
|
return( NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
static int str2scope( const char *p )
|
ldap_pvt_scope2bv( int scope, struct berval *bv )
|
||||||
{
|
{
|
||||||
if ( strcasecmp( p, "one" ) == 0 ) {
|
switch ( scope ) {
|
||||||
return LDAP_SCOPE_ONELEVEL;
|
case LDAP_SCOPE_BASE:
|
||||||
|
BER_BVSTR( bv, "base" );
|
||||||
|
break;
|
||||||
|
|
||||||
} else if ( strcasecmp( p, "onelevel" ) == 0 ) {
|
case LDAP_SCOPE_ONELEVEL:
|
||||||
return LDAP_SCOPE_ONELEVEL;
|
BER_BVSTR( bv, "one" );
|
||||||
|
break;
|
||||||
|
|
||||||
} else if ( strcasecmp( p, "base" ) == 0 ) {
|
case LDAP_SCOPE_SUBTREE:
|
||||||
return LDAP_SCOPE_BASE;
|
BER_BVSTR( bv, "sub" );
|
||||||
|
break;
|
||||||
|
|
||||||
} else if ( strcasecmp( p, "sub" ) == 0 ) {
|
case LDAP_SCOPE_SUBORDINATE:
|
||||||
return LDAP_SCOPE_SUBTREE;
|
BER_BVSTR( bv, "subordinate" );
|
||||||
|
break;
|
||||||
|
|
||||||
} else if ( strcasecmp( p, "subtree" ) == 0 ) {
|
default:
|
||||||
return LDAP_SCOPE_SUBTREE;
|
return LDAP_OTHER;
|
||||||
|
}
|
||||||
|
|
||||||
} else if ( strcasecmp( p, "subordinate" ) == 0 ) {
|
return LDAP_SUCCESS;
|
||||||
return LDAP_SCOPE_SUBORDINATE;
|
}
|
||||||
|
|
||||||
} else if ( strcasecmp( p, "children" ) == 0 ) {
|
const char *
|
||||||
return LDAP_SCOPE_SUBORDINATE;
|
ldap_pvt_scope2str( int scope )
|
||||||
|
{
|
||||||
|
struct berval bv;
|
||||||
|
|
||||||
|
if ( ldap_pvt_scope2bv( scope, &bv ) == LDAP_SUCCESS ) {
|
||||||
|
return bv.bv_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_bv2scope( struct berval *bv )
|
||||||
|
{
|
||||||
|
static struct {
|
||||||
|
struct berval bv;
|
||||||
|
int scope;
|
||||||
|
} v[] = {
|
||||||
|
{ BER_BVC( "one" ), LDAP_SCOPE_ONELEVEL },
|
||||||
|
{ BER_BVC( "onelevel" ), LDAP_SCOPE_ONELEVEL },
|
||||||
|
{ BER_BVC( "base" ), LDAP_SCOPE_BASE },
|
||||||
|
{ BER_BVC( "sub" ), LDAP_SCOPE_SUBTREE },
|
||||||
|
{ BER_BVC( "subtree" ), LDAP_SCOPE_SUBTREE },
|
||||||
|
{ BER_BVC( "subord" ), LDAP_SCOPE_SUBORDINATE },
|
||||||
|
{ BER_BVC( "subordinate" ), LDAP_SCOPE_SUBORDINATE },
|
||||||
|
{ BER_BVC( "children" ), LDAP_SCOPE_SUBORDINATE },
|
||||||
|
{ BER_BVNULL, -1 }
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for ( i = 0; v[ i ].scope != -1; i++ ) {
|
||||||
|
if ( ber_bvstrcasecmp( bv, &v[ i ].bv ) == 0 ) {
|
||||||
|
return v[ i ].scope;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_str2scope( const char *p )
|
||||||
|
{
|
||||||
|
struct berval bv;
|
||||||
|
|
||||||
|
ber_str2bv( p, 0, 0, &bv );
|
||||||
|
|
||||||
|
return ldap_pvt_bv2scope( &bv );
|
||||||
|
}
|
||||||
|
|
||||||
static const char hex[] = "0123456789ABCDEF";
|
static const char hex[] = "0123456789ABCDEF";
|
||||||
|
|
||||||
#define URLESC_NONE 0x0000U
|
#define URLESC_NONE 0x0000U
|
||||||
|
|
@ -484,6 +533,7 @@ desc2str_len( LDAPURLDesc *u )
|
||||||
{
|
{
|
||||||
int sep = 0;
|
int sep = 0;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
struct berval scope;
|
||||||
|
|
||||||
if ( u == NULL ) {
|
if ( u == NULL ) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -503,36 +553,11 @@ desc2str_len( LDAPURLDesc *u )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( u->lud_scope ) {
|
if ( ldap_pvt_scope2bv( u->lud_scope, &scope ) == LDAP_SUCCESS ) {
|
||||||
case LDAP_SCOPE_BASE:
|
len += scope.bv_len;
|
||||||
case LDAP_SCOPE_ONELEVEL:
|
|
||||||
case LDAP_SCOPE_SUBTREE:
|
|
||||||
case LDAP_SCOPE_SUBORDINATE:
|
|
||||||
switch ( u->lud_scope ) {
|
|
||||||
case LDAP_SCOPE_BASE:
|
|
||||||
len += STRLENOF( "base" );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LDAP_SCOPE_ONELEVEL:
|
|
||||||
len += STRLENOF( "one" );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LDAP_SCOPE_SUBTREE:
|
|
||||||
len += STRLENOF( "sub" );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LDAP_SCOPE_SUBORDINATE:
|
|
||||||
len += STRLENOF( "subordinate" );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !sep ) {
|
if ( !sep ) {
|
||||||
sep = 3;
|
sep = 3;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( u->lud_attrs ) {
|
if ( u->lud_attrs ) {
|
||||||
|
|
@ -576,7 +601,7 @@ desc2str( LDAPURLDesc *u, char *s, int len )
|
||||||
int i;
|
int i;
|
||||||
int sep = 0;
|
int sep = 0;
|
||||||
int sofar = 0;
|
int sofar = 0;
|
||||||
int gotscope = 0;
|
struct berval scope = BER_BVNULL;
|
||||||
|
|
||||||
if ( u == NULL ) {
|
if ( u == NULL ) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -586,20 +611,13 @@ desc2str( LDAPURLDesc *u, char *s, int len )
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( u->lud_scope ) {
|
ldap_pvt_scope2bv( u->lud_scope, &scope );
|
||||||
case LDAP_SCOPE_BASE:
|
|
||||||
case LDAP_SCOPE_ONELEVEL:
|
|
||||||
case LDAP_SCOPE_SUBTREE:
|
|
||||||
case LDAP_SCOPE_SUBORDINATE:
|
|
||||||
gotscope = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( u->lud_exts ) {
|
if ( u->lud_exts ) {
|
||||||
sep = 5;
|
sep = 5;
|
||||||
} else if ( u->lud_filter ) {
|
} else if ( u->lud_filter ) {
|
||||||
sep = 4;
|
sep = 4;
|
||||||
} else if ( gotscope ) {
|
} else if ( !BER_BVISEMPTY( &scope ) ) {
|
||||||
sep = 3;
|
sep = 3;
|
||||||
} else if ( u->lud_attrs ) {
|
} else if ( u->lud_attrs ) {
|
||||||
sep = 2;
|
sep = 2;
|
||||||
|
|
@ -662,30 +680,10 @@ desc2str( LDAPURLDesc *u, char *s, int len )
|
||||||
|
|
||||||
assert( len >= 0 );
|
assert( len >= 0 );
|
||||||
|
|
||||||
switch ( u->lud_scope ) {
|
if ( !BER_BVISNULL( &scope ) ) {
|
||||||
case LDAP_SCOPE_BASE:
|
strcpy( &s[sofar], scope.bv_val );
|
||||||
strcpy( &s[sofar], "base" );
|
sofar += scope.bv_len;
|
||||||
sofar += STRLENOF("base");
|
len -= scope.bv_len;
|
||||||
len -= STRLENOF("base");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LDAP_SCOPE_ONELEVEL:
|
|
||||||
strcpy( &s[sofar], "one" );
|
|
||||||
sofar += STRLENOF("one");
|
|
||||||
len -= STRLENOF("one");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LDAP_SCOPE_SUBTREE:
|
|
||||||
strcpy( &s[sofar], "sub" );
|
|
||||||
sofar += STRLENOF("sub");
|
|
||||||
len -= STRLENOF("sub");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LDAP_SCOPE_SUBORDINATE:
|
|
||||||
strcpy( &s[sofar], "children" );
|
|
||||||
sofar += STRLENOF("children");
|
|
||||||
len -= STRLENOF("children");
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assert( len >= 0 );
|
assert( len >= 0 );
|
||||||
|
|
@ -1025,7 +1023,7 @@ ldap_url_parse_ext( LDAP_CONST char *url_in, LDAPURLDesc **ludpp, unsigned flags
|
||||||
if( *p != '\0' ) {
|
if( *p != '\0' ) {
|
||||||
/* parse the scope */
|
/* parse the scope */
|
||||||
ldap_pvt_hex_unescape( p );
|
ldap_pvt_hex_unescape( p );
|
||||||
ludp->lud_scope = str2scope( p );
|
ludp->lud_scope = ldap_pvt_str2scope( p );
|
||||||
|
|
||||||
if( ludp->lud_scope == -1 ) {
|
if( ludp->lud_scope == -1 ) {
|
||||||
LDAP_FREE( url );
|
LDAP_FREE( url );
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue