From f0122ce3fc6311f4e03fa4415044f24daa9ccdb4 Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Thu, 5 May 2005 00:22:43 +0000 Subject: [PATCH] move discover function to frontend --- servers/slapd/back-ldap/init.c | 71 ++------------------------------ servers/slapd/back-meta/init.c | 6 ++- servers/slapd/proto-slap.h | 6 +++ servers/slapd/root_dse.c | 75 ++++++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 70 deletions(-) diff --git a/servers/slapd/back-ldap/init.c b/servers/slapd/back-ldap/init.c index 7286cd222a..02c9ad0b11 100644 --- a/servers/slapd/back-ldap/init.c +++ b/servers/slapd/back-ldap/init.c @@ -124,73 +124,6 @@ ldap_back_db_init( Backend *be ) return 0; } -int -ldap_back_discover_t_f_support( const char *uri, int version ) -{ - LDAP *ld; - LDAPMessage *res = NULL, *entry; - int rc, i; - struct berval cred = BER_BVC( "" ), - absoluteFilters = BER_BVC( LDAP_FEATURE_ABSOLUTE_FILTERS ), - **values = NULL; - char *attrs[ 2 ] = { "supportedFeatures", NULL }; - - rc = ldap_initialize( &ld, uri ); - if ( rc != LDAP_SUCCESS ) { - return rc; - } - - rc = ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, &version ); - if ( rc != LDAP_SUCCESS ) { - goto done; - } - - rc = ldap_sasl_bind_s( ld, "", LDAP_SASL_SIMPLE, - &cred, NULL, NULL, NULL ); - if ( rc != LDAP_SUCCESS ) { - goto done; - } - - rc = ldap_search_ext_s( ld, "", LDAP_SCOPE_BASE, "(objectClass=*)", - attrs, 0, NULL, NULL, NULL, 0, &res ); - if ( rc != LDAP_SUCCESS ) { - goto done; - } - - entry = ldap_first_entry( ld, res ); - if ( entry == NULL ) { - goto done; - } - - values = ldap_get_values_len( ld, entry, attrs[ 0 ] ); - if ( values == NULL ) { - rc = LDAP_NO_SUCH_ATTRIBUTE; - goto done; - } - - for ( i = 0; values[ i ] != NULL; i++ ) { - if ( bvmatch( &absoluteFilters, values[ i ] ) ) { - rc = LDAP_COMPARE_TRUE; - goto done; - } - } - - rc = LDAP_COMPARE_FALSE; - -done:; - if ( values != NULL ) { - ldap_value_free_len( values ); - } - - if ( res != NULL ) { - ldap_msgfree( res ); - } - - ldap_unbind_ext( ld, NULL, NULL ); - - return rc; -} - int ldap_back_db_open( BackendDB *be ) { @@ -250,7 +183,9 @@ ldap_back_db_open( BackendDB *be ) li->flags &= ~LDAP_BACK_F_SUPPORT_T_F_DISCOVER; - rc = ldap_back_discover_t_f_support( li->url, li->version ); + rc = slap_discover_feature( li->url, li->version, + slap_schema.si_ad_supportedFeatures->ad_cname.bv_val, + LDAP_FEATURE_ABSOLUTE_FILTERS ); if ( rc == LDAP_COMPARE_TRUE ) { li->flags |= LDAP_BACK_F_SUPPORT_T_F; } diff --git a/servers/slapd/back-meta/init.c b/servers/slapd/back-meta/init.c index 6628be9fd9..305bf901b9 100644 --- a/servers/slapd/back-meta/init.c +++ b/servers/slapd/back-meta/init.c @@ -110,8 +110,10 @@ meta_back_db_open( for ( i = 0; i < mi->mi_ntargets; i++ ) { if ( mi->mi_targets[ i ].mt_flags & LDAP_BACK_F_SUPPORT_T_F_DISCOVER ) { mi->mi_targets[ i ].mt_flags &= ~LDAP_BACK_F_SUPPORT_T_F_DISCOVER; - rc = ldap_back_discover_t_f_support( mi->mi_targets[ i ].mt_uri, - mi->mi_targets[ i ].mt_version ); + rc = slap_discover_feature( mi->mi_targets[ i ].mt_uri, + mi->mi_targets[ i ].mt_version, + slap_schema.si_ad_supportedFeatures->ad_cname.bv_val, + LDAP_FEATURE_ABSOLUTE_FILTERS ); if ( rc == LDAP_COMPARE_TRUE ) { mi->mi_targets[ i ].mt_flags |= LDAP_BACK_F_SUPPORT_T_F; } diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 9dff1bda14..b9d28e5415 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -1185,6 +1185,12 @@ LDAP_SLAPD_F (int) root_dse_info LDAP_P(( LDAP_SLAPD_F (int) read_root_dse_file LDAP_P(( const char *file)); +LDAP_SLAPD_F (int) slap_discover_feature LDAP_P(( + const char *uri, + int version, + const char *attr, + const char *val )); + /* * sasl.c */ diff --git a/servers/slapd/root_dse.c b/servers/slapd/root_dse.c index a4a0cf6898..f4ee3bb477 100644 --- a/servers/slapd/root_dse.c +++ b/servers/slapd/root_dse.c @@ -308,3 +308,78 @@ int read_root_dse_file( const char *fname ) Debug(LDAP_DEBUG_CONFIG, "rootDSE file %s read.\n", fname, 0, 0); return rc; } + +int +slap_discover_feature( + const char *uri, + int version, + const char *attr, + const char *val ) +{ + LDAP *ld; + LDAPMessage *res = NULL, *entry; + int rc, i; + struct berval cred = BER_BVC( "" ), + bv_val, + **values = NULL; + char *attrs[ 2 ] = { NULL, NULL }; + + ber_str2bv( val, 0, 0, &bv_val ); + attrs[ 0 ] = attr; + + rc = ldap_initialize( &ld, uri ); + if ( rc != LDAP_SUCCESS ) { + return rc; + } + + rc = ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, &version ); + if ( rc != LDAP_SUCCESS ) { + goto done; + } + + rc = ldap_sasl_bind_s( ld, "", LDAP_SASL_SIMPLE, + &cred, NULL, NULL, NULL ); + if ( rc != LDAP_SUCCESS ) { + goto done; + } + + rc = ldap_search_ext_s( ld, "", LDAP_SCOPE_BASE, "(objectClass=*)", + attrs, 0, NULL, NULL, NULL, 0, &res ); + if ( rc != LDAP_SUCCESS ) { + goto done; + } + + entry = ldap_first_entry( ld, res ); + if ( entry == NULL ) { + goto done; + } + + values = ldap_get_values_len( ld, entry, attrs[ 0 ] ); + if ( values == NULL ) { + rc = LDAP_NO_SUCH_ATTRIBUTE; + goto done; + } + + for ( i = 0; values[ i ] != NULL; i++ ) { + if ( bvmatch( &bv_val, values[ i ] ) ) { + rc = LDAP_COMPARE_TRUE; + goto done; + } + } + + rc = LDAP_COMPARE_FALSE; + +done:; + if ( values != NULL ) { + ldap_value_free_len( values ); + } + + if ( res != NULL ) { + ldap_msgfree( res ); + } + + ldap_unbind_ext( ld, NULL, NULL ); + + return rc; +} + -- 2.39.5