]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/bconfig.c
ITS#8150 let check_name_index handle frontend
[openldap] / servers / slapd / bconfig.c
index c501135236665d02ad5f5a6236763d9a1ef87e08..4e796ccc98a715ac6f88be74166609931e4e3b09 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2005-2014 The OpenLDAP Foundation.
+ * Copyright 2005-2015 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -2957,9 +2957,9 @@ config_suffix(ConfigArgs *c)
        if(tbe == c->be) {
                Debug( LDAP_DEBUG_ANY, "%s: suffix already served by this backend!.\n",
                        c->log, 0, 0);
-               return 1;
                free(pdn.bv_val);
                free(ndn.bv_val);
+               return 1;
        } else if(tbe) {
                BackendDB *b2 = tbe;
 
@@ -3039,7 +3039,7 @@ config_rootpw(ConfigArgs *c) {
        }
 
        tbe = select_backend(&c->be->be_rootndn, 0);
-       if(tbe != c->be) {
+       if(tbe != c->be && !SLAP_DBHIDDEN( c->be )) {
                snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> can only be set when rootdn is under suffix",
                        c->argv[0] );
                Debug(LDAP_DEBUG_ANY, "%s: %s\n",
@@ -4679,7 +4679,7 @@ check_name_index( CfEntryInfo *parent, ConfigType ce_type, Entry *e,
        if ( ce_type == Cft_Database )
                nsibs--;
 
-       if ( index != nsibs ) {
+       if ( index != nsibs || isfrontend ) {
                if ( gotindex ) {
                        if ( index < nsibs ) {
                                if ( tailindex ) return LDAP_NAMING_VIOLATION;
@@ -6434,6 +6434,8 @@ config_build_entry( Operation *op, SlapReply *rs, CfEntryInfo *parent,
 {
        Entry *e = entry_alloc();
        CfEntryInfo *ce = ch_calloc( 1, sizeof(CfEntryInfo) );
+       struct berval val;
+       struct berval ad_name;
        AttributeDescription *ad = NULL;
        int rc;
        char *ptr;
@@ -6442,7 +6444,6 @@ config_build_entry( Operation *op, SlapReply *rs, CfEntryInfo *parent,
        struct berval pdn;
        ObjectClass *oc;
        CfEntryInfo *ceprev = NULL;
-       LDAPRDN srdn = NULL;
 
        Debug( LDAP_DEBUG_TRACE, "config_build_entry: \"%s\"\n", rdn->bv_val, 0, 0);
        e->e_private = ce;
@@ -6471,17 +6472,16 @@ config_build_entry( Operation *op, SlapReply *rs, CfEntryInfo *parent,
        if ( extra )
                attr_merge_normalize_one(e, slap_schema.si_ad_objectClass,
                        extra->co_name, NULL );
-       if ( ldap_bv2rdn_x( rdn, &srdn, &ptr, LDAP_DN_FORMAT_LDAP, op->o_tmpmemctx ))
-               goto fail;
-
-       rc = slap_bv2ad( &srdn[0]->la_attr, &ad, &text );
+       ptr = strchr(rdn->bv_val, '=');
+       ad_name.bv_val = rdn->bv_val;
+       ad_name.bv_len = ptr - rdn->bv_val;
+       rc = slap_bv2ad( &ad_name, &ad, &text );
        if ( rc ) {
-               ldap_rdnfree_x( srdn, op->o_tmpmemctx );
                goto fail;
        }
-       attr_merge_normalize_one(e, ad, &srdn[0]->la_value, NULL );
-       ldap_rdnfree_x( srdn, op->o_tmpmemctx );
-       srdn = NULL;
+       val.bv_val = ptr+1;
+       val.bv_len = rdn->bv_len - (val.bv_val - rdn->bv_val);
+       attr_merge_normalize_one(e, ad, &val, NULL );
 
        oc = main->co_oc;
        c->table = main->co_type;
@@ -6570,7 +6570,7 @@ config_build_schema_inc( ConfigArgs *c, CfEntryInfo *ceparent,
                ptr = strchr( bv.bv_val, '.' );
                if ( ptr )
                        bv.bv_len = ptr - bv.bv_val;
-               c->value_dn.bv_len = snprintf(c->value_dn.bv_val, sizeof( c->log ), "cn=\"" SLAP_X_ORDERED_FMT, c->depth);
+               c->value_dn.bv_len = snprintf(c->value_dn.bv_val, sizeof( c->log ), "cn=" SLAP_X_ORDERED_FMT, c->depth);
                if ( c->value_dn.bv_len >= sizeof( c->log ) ) {
                        /* FIXME: how can indicate error? */
                        return -1;
@@ -6578,8 +6578,6 @@ config_build_schema_inc( ConfigArgs *c, CfEntryInfo *ceparent,
                strncpy( c->value_dn.bv_val + c->value_dn.bv_len, bv.bv_val,
                        bv.bv_len );
                c->value_dn.bv_len += bv.bv_len;
-               c->value_dn.bv_val[c->value_dn.bv_len] ='"';
-               c->value_dn.bv_len++;
                c->value_dn.bv_val[c->value_dn.bv_len] ='\0';
                if ( rdnNormalize( 0, NULL, NULL, &c->value_dn, &rdn, NULL )) {
                        Debug( LDAP_DEBUG_ANY,
@@ -7222,22 +7220,6 @@ config_tool_entry_put( BackendDB *be, Entry *e, struct berval *text )
                                        return NOID;
                                }
                        } else {
-                               if ( !strncmp( e->e_nname.bv_val + 
-                                       STRLENOF( "olcDatabase" ), "=frontend",
-                                       STRLENOF( "=frontend" ) ) )
-                               {
-                                       struct berval rdn, pdn, ndn;
-                                       dnParent( &e->e_nname, &pdn );
-                                       rdn.bv_val = ca.log;
-                                       rdn.bv_len = snprintf(rdn.bv_val, sizeof( ca.log ),
-                                               "%s=" SLAP_X_ORDERED_FMT "%s",
-                                               cfAd_database->ad_cname.bv_val, -1,
-                                               frontendDB->bd_info->bi_type );
-                                       build_new_dn( &ndn, &pdn, &rdn, NULL );
-                                       ber_memfree( e->e_name.bv_val );
-                                       e->e_name = ndn;
-                                       ber_bvreplace( &e->e_nname, &e->e_name );
-                               }
                                entry_put_got_frontend++;
                                isFrontend = 1;
                        }