X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fbackend.c;h=297ec308f981b42310a28d01602493c1054d15bb;hb=d23c55964651929e7b2b5a1730b33efee9661033;hp=c44efa33b4607c50cf89d4484c2db91d9cf33b99;hpb=f6085d3f820d0fcea59928304a533e0524b56f48;p=openldap diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index c44efa33b4..297ec308f9 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* backend.c - routines for dealing with back-end databases */ @@ -241,11 +241,11 @@ int backend_startup(Backend *be) #ifdef NEW_LOGGING LDAP_LOG(( "backend", LDAP_LEVEL_DETAIL1, "backend_startup: starting \"%s\"\n", - be->be_suffix[0] )); + be->be_suffix[0]->bv_val )); #else Debug( LDAP_DEBUG_TRACE, "backend_startup: starting \"%s\"\n", - be->be_suffix[0], 0, 0 ); + be->be_suffix[0]->bv_val, 0, 0 ); #endif if ( be->bd_info->bi_open ) { @@ -272,11 +272,11 @@ int backend_startup(Backend *be) if(rc != 0) { #ifdef NEW_LOGGING LDAP_LOG(( "backend", LDAP_LEVEL_CRIT, - "backend_startup: bi_db_open failed!\n" )); + "backend_startup: bi_db_open failed! (%d)\n", rc )); #else Debug( LDAP_DEBUG_ANY, - "backend_startup: bi_db_open failed!\n", - 0, 0, 0 ); + "backend_startup: bi_db_open failed! (%d)\n", + rc, 0, 0 ); #endif return rc; } @@ -322,11 +322,12 @@ int backend_startup(Backend *be) if(rc != 0) { #ifdef NEW_LOGGING LDAP_LOG(( "backend", LDAP_LEVEL_CRIT, - "backend_startup: bi_db_open %d failed!\n", i )); + "backend_startup: bi_db_open(%d) failed! (%d)\n", + i, rc )); #else Debug( LDAP_DEBUG_ANY, - "backend_startup: bi_db_open %d failed!\n", - i, 0, 0 ); + "backend_startup: bi_db_open(%d) failed! (%d)\n", + i, rc, 0 ); #endif return rc; } @@ -410,19 +411,19 @@ int backend_shutdown( Backend *be ) int backend_destroy(void) { int i; + BackendDB *bd; /* destroy each backend database */ - for( i = 0; i < nBackendDB; i++ ) { - if ( backendDB[i].bd_info->bi_db_destroy ) { - backendDB[i].bd_info->bi_db_destroy( - &backendDB[i] ); + for( i = 0, bd = backendDB; i < nBackendDB; i++, bd++ ) { + if ( bd->bd_info->bi_db_destroy ) { + bd->bd_info->bi_db_destroy( bd ); } - charray_free( backendDB[i].be_suffix ); - ber_bvecfree( backendDB[i].be_nsuffix ); - free( backendDB[i].be_root_dn ); - free( backendDB[i].be_root_ndn ); - free( backendDB[i].be_root_pw.bv_val ); - acl_destroy( backendDB[i].be_acl, global_acl ); + ber_bvecfree( bd->be_suffix ); + ber_bvecfree( bd->be_nsuffix ); + if ( bd->be_rootdn.bv_val ) free( bd->be_rootdn.bv_val ); + if ( bd->be_rootndn.bv_val ) free( bd->be_rootndn.bv_val ); + if ( bd->be_rootpw.bv_val ) free( bd->be_rootpw.bv_val ); + acl_destroy( bd->be_acl, global_acl ); } free( backendDB ); @@ -489,6 +490,7 @@ backend_db_init( be->be_restrictops = global_restrictops; be->be_requires = global_requires; + be->be_ssf_set = global_ssf_set; /* assign a default depth limit for alias deref */ be->be_max_deref_depth = SLAPD_DEFAULT_MAXDEREFDEPTH; @@ -521,21 +523,23 @@ be_db_close( void ) Backend * select_backend( - const char * dn, + struct berval * dn, int manageDSAit, int noSubs ) { - int i, j, len, dnlen; + int i, j; + ber_len_t len, dnlen = dn->bv_len; Backend *be = NULL; - dnlen = strlen( dn ); for ( i = 0; i < nbackends; i++ ) { for ( j = 0; backends[i].be_nsuffix != NULL && backends[i].be_nsuffix[j] != NULL; j++ ) { - if ((backends[i].be_glueflags&SLAP_GLUE_SUBORDINATE)&& - noSubs) + if (( backends[i].be_flags & SLAP_BFLAG_GLUE_SUBORDINATE ) + && noSubs ) + { continue; + } len = backends[i].be_nsuffix[j]->bv_len; @@ -543,15 +547,18 @@ select_backend( /* suffix is longer than DN */ continue; } - - if ( len && len < dnlen && ( !DN_SEPARATOR( dn[(dnlen-len)-1] ) || DN_ESCAPE( dn[(dnlen-len)-2] ) ) ) { + if ( len && len < dnlen && + ( !DN_SEPARATOR( dn->bv_val[(dnlen-len)-1] ) || + DN_ESCAPE( dn->bv_val[(dnlen-len)-2] ) ) ) + { /* make sure we have a separator */ continue; } - - if ( strcmp( backends[i].be_nsuffix[j]->bv_val, &dn[dnlen-len] ) == 0 ) { + if ( strcmp( backends[i].be_nsuffix[j]->bv_val, + &dn->bv_val[dnlen-len] ) == 0 ) + { if( be == NULL ) { be = &backends[i]; @@ -572,17 +579,13 @@ select_backend( int be_issuffix( Backend *be, - const char *suffix + struct berval *bvsuffix ) { int i; - size_t len = strlen(suffix); for ( i = 0; be->be_nsuffix != NULL && be->be_nsuffix[i] != NULL; i++ ) { - if ( len != be->be_nsuffix[i]->bv_len ) { - continue; - } - if ( strcmp( be->be_nsuffix[i]->bv_val, suffix ) == 0 ) { + if ( ber_bvcmp( be->be_nsuffix[i], bvsuffix ) == 0 ) { return( 1 ); } } @@ -591,55 +594,43 @@ be_issuffix( } int -be_isroot( Backend *be, const char *ndn ) +be_isroot( Backend *be, struct berval *ndn ) { - int rc; - - if ( ndn == NULL || *ndn == '\0' ) { + if ( !ndn->bv_len ) { return( 0 ); } - if ( be->be_root_ndn == NULL || *be->be_root_ndn == '\0' ) { + if ( !be->be_rootndn.bv_len ) { return( 0 ); } - rc = strcmp( be->be_root_ndn, ndn ) ? 0 : 1; - - return(rc); + return dn_match( &be->be_rootndn, ndn ); } int -be_isupdate( Backend *be, const char *ndn ) +be_isupdate( Backend *be, struct berval *ndn ) { - int rc; - - if ( ndn == NULL || *ndn == '\0' ) { + if ( !ndn->bv_len ) { return( 0 ); } - if ( be->be_update_ndn == NULL || *be->be_update_ndn == '\0' ) { + if ( !be->be_update_ndn.bv_len ) { return( 0 ); } - rc = strcmp( be->be_update_ndn, ndn ) ? 0 : 1; - - return(rc); + return dn_match( &be->be_update_ndn, ndn ); } -char * +struct berval * be_root_dn( Backend *be ) { - if ( be->be_root_dn == NULL ) { - return( "" ); - } - - return be->be_root_dn; + return &be->be_rootdn; } int be_isroot_pw( Backend *be, Connection *conn, - const char *ndn, + struct berval *ndn, struct berval *cred ) { int result; @@ -648,7 +639,7 @@ be_isroot_pw( Backend *be, return 0; } - if( be->be_root_pw.bv_len == 0 ) { + if( be->be_rootpw.bv_len == 0 ) { return 0; } @@ -659,7 +650,7 @@ be_isroot_pw( Backend *be, #endif #endif - result = lutil_passwd( &be->be_root_pw, cred, NULL ); + result = lutil_passwd( &be->be_rootpw, cred, NULL ); #if defined( SLAPD_CRYPT ) || defined( SLAPD_SPASSWD ) #ifdef SLAPD_SPASSWD @@ -755,7 +746,7 @@ backend_check_controls( if( (*ctrls)->ldctl_iscritical && !charray_inlist( be->be_controls, (*ctrls)->ldctl_oid ) ) { - *text = "control unavailable in NamingContext"; + *text = "control unavailable in context"; return LDAP_UNAVAILABLE_CRITICAL_EXTENSION; } } @@ -901,7 +892,7 @@ backend_check_restrictions( if( requires & SLAP_REQUIRE_STRONG ) { /* should check mechanism */ - if( op->o_authmech == NULL || op->o_dn.bv_len == 0 ) + if( op->o_authmech.bv_len == 0 || op->o_dn.bv_len == 0 ) { *text = "strong authentication required"; return LDAP_STRONG_AUTH_REQUIRED; @@ -909,7 +900,7 @@ backend_check_restrictions( } if( requires & SLAP_REQUIRE_SASL ) { - if( op->o_authmech == NULL || op->o_dn.bv_len == 0 ) + if( op->o_authmech.bv_len == 0 || op->o_dn.bv_len == 0 ) { *text = "SASL authentication required"; return LDAP_STRONG_AUTH_REQUIRED; @@ -961,8 +952,8 @@ int backend_check_referrals( Backend *be, Connection *conn, Operation *op, - const char *dn, - const char *ndn ) + struct berval *dn, + struct berval *ndn ) { int rc = LDAP_SUCCESS; @@ -987,27 +978,25 @@ backend_group( Connection *conn, Operation *op, Entry *target, - const char *gr_ndn, - const char *op_ndn, + struct berval *gr_ndn, + struct berval *op_ndn, ObjectClass *group_oc, AttributeDescription *group_at ) { GroupAssertion *g; - int len = strlen(gr_ndn); int i; ldap_pvt_thread_mutex_lock( &op->o_abandonmutex ); i = op->o_abandon; ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); - if (i) - return SLAPD_ABANDON; + if (i) return SLAPD_ABANDON; - if( strcmp( target->e_ndn, gr_ndn ) != 0 ) { + if ( !dn_match( &target->e_nname, gr_ndn ) ) { /* we won't attempt to send it to a different backend */ - be = select_backend(gr_ndn, 0, - (be->be_glueflags & SLAP_GLUE_INSTANCE)); + be = select_backend( gr_ndn, 0, + (be->be_flags & SLAP_BFLAG_GLUE_INSTANCE)); if (be == NULL) { return LDAP_NO_SUCH_OBJECT; @@ -1015,16 +1004,17 @@ backend_group( } ldap_pvt_thread_mutex_lock( &conn->c_mutex ); - for (g = conn->c_groups; g; g=g->next) { - if (g->be != be || g->oc != group_oc || g->at != group_at || - g->len != len) + for (g = conn->c_groups; g; g=g->ga_next) { + if (g->ga_be != be || g->ga_oc != group_oc || + g->ga_at != group_at || g->ga_len != gr_ndn->bv_len) continue; - if (strcmp( g->ndn, gr_ndn ) == 0) + if (strcmp( g->ga_ndn, gr_ndn->bv_val ) == 0) break; } ldap_pvt_thread_mutex_unlock( &conn->c_mutex ); - if (g) - return g->res; + if (g) { + return g->ga_res; + } if( be->be_group ) { int res = be->be_group( be, conn, op, @@ -1032,15 +1022,15 @@ backend_group( group_oc, group_at ); if (op->o_tag != LDAP_REQ_BIND) { - g = ch_malloc(sizeof(GroupAssertion) + len); - g->be = be; - g->oc = group_oc; - g->at = group_at; - g->res = res; - g->len = len; - strcpy(g->ndn, gr_ndn); + g = ch_malloc(sizeof(GroupAssertion) + gr_ndn->bv_len); + g->ga_be = be; + g->ga_oc = group_oc; + g->ga_at = group_at; + g->ga_res = res; + g->ga_len = gr_ndn->bv_len; + strcpy(g->ga_ndn, gr_ndn->bv_val); ldap_pvt_thread_mutex_lock( &conn->c_mutex ); - g->next = conn->c_groups; + g->ga_next = conn->c_groups; conn->c_groups = g; ldap_pvt_thread_mutex_unlock( &conn->c_mutex ); } @@ -1057,18 +1047,16 @@ backend_attribute( Connection *conn, Operation *op, Entry *target, - const char *entry_ndn, + struct berval *edn, AttributeDescription *entry_at, - struct berval ***vals + BerVarray *vals ) { - if( target == NULL || - strcmp( target->e_ndn, entry_ndn ) != 0 ) - { + if ( target == NULL || !dn_match( &target->e_nname, edn ) ) { /* we won't attempt to send it to a different backend */ - be = select_backend(entry_ndn, 0, - (be->be_glueflags & SLAP_GLUE_INSTANCE)); + be = select_backend( edn, 0, + (be->be_flags & SLAP_BFLAG_GLUE_INSTANCE)); if (be == NULL) { return LDAP_NO_SUCH_OBJECT; @@ -1076,7 +1064,7 @@ backend_attribute( } if( be->be_attribute ) { - return be->be_attribute( be, conn, op, target, entry_ndn, + return be->be_attribute( be, conn, op, target, edn, entry_at, vals ); } @@ -1088,7 +1076,7 @@ Attribute *backend_operational( Connection *conn, Operation *op, Entry *e, - char **attrs, + AttributeName *attrs, int opattrs ) { Attribute *a = NULL, **ap = &a; @@ -1104,8 +1092,7 @@ Attribute *backend_operational( * add them to the attribute list */ if ( ( opattrs || attrs ) && be && be->be_operational != NULL ) { - ( void )be->be_operational( be, conn, op, e, - attrs, opattrs, ap ); + ( void )be->be_operational( be, conn, op, e, attrs, opattrs, ap ); } return a;