From c5a8b7947c032f64c385ec8124e21061ba3d9956 Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount Date: Sat, 8 Nov 2008 01:40:33 +0000 Subject: [PATCH] ITS#5735,ITS#5736 --- CHANGES | 2 ++ servers/slapd/back-ldap/chain.c | 14 ++++++------ servers/slapd/back-monitor/database.c | 8 +++---- servers/slapd/bconfig.c | 31 ++++++++++++++++++++++----- servers/slapd/config.h | 2 ++ servers/slapd/overlays/pcache.c | 16 +------------- servers/slapd/overlays/translucent.c | 10 +-------- 7 files changed, 42 insertions(+), 41 deletions(-) diff --git a/CHANGES b/CHANGES index e29cc9251e..c560731511 100644 --- a/CHANGES +++ b/CHANGES @@ -5,8 +5,10 @@ OpenLDAP 2.4.13 Engineering Fixed slapd database open with real structure (ITS#5724) Fixed slapd rewriting undefined filter (ITS#5731) Added slapd GSSAPI refactoring (ITS#5369) + Added slapd private databases to be instantiated by global overlays (ITS#5735,ITS#5736) Added slapd support for certificateListExactMatch from RFC4523 (ITS#5700) Fixed slapd-bdb/hdb invalid db crash (ITS#5698) + Fixed slapo-chain/translucent back-config support (ITS#5736) Added slapo-constraint parameter to allow LDAP URI constraints (ITS#5704) Added slapo-constraint support for constraining rename (ITS#5703) Added slapo-constraint support for relax control (ITS#5705) diff --git a/servers/slapd/back-ldap/chain.c b/servers/slapd/back-ldap/chain.c index 32783ed0a9..ffdf61fe5c 100644 --- a/servers/slapd/back-ldap/chain.c +++ b/servers/slapd/back-ldap/chain.c @@ -63,6 +63,7 @@ typedef enum { LDAP_CH_RES, LDAP_CH_ERR } ldap_chain_status_t; + static BackendInfo *lback; typedef struct ldap_chain_t { @@ -1096,7 +1097,7 @@ static ConfigOCs chainocs[] = { "NAME 'olcChainDatabase' " "DESC 'Chain remote server configuration' " "AUXILIARY )", - Cft_Misc, chaincfg, chain_ldadd }, + Cft_Misc, olcDatabaseDummy, chain_ldadd }, { NULL, 0, NULL } }; @@ -1187,6 +1188,8 @@ chain_ldadd( CfEntryInfo *p, Entry *e, ConfigArgs *ca ) } } + ca->ca_private = on; + done:; if ( rc != LDAP_SUCCESS ) { (void)ldap_chain_db_destroy_one( ca->be, NULL ); @@ -1510,17 +1513,11 @@ ldap_chain_db_init( ldap_chain_t *lc = NULL; if ( lback == NULL ) { - static BackendInfo lback2; - lback = backend_info( "ldap" ); if ( lback == NULL ) { return 1; } - - lback2 = *lback; - lback2.bi_type = ldapchain.on_bi.bi_type; - lback = &lback2; } lc = ch_malloc( sizeof( ldap_chain_t ) ); @@ -2062,7 +2059,8 @@ ldap_chain_parse_ctrl( int chain_initialize( void ) { - int rc; + int rc; + const char *text; /* Make sure we don't exceed the bits reserved for userland */ config_check_userland( CH_LAST ); diff --git a/servers/slapd/back-monitor/database.c b/servers/slapd/back-monitor/database.c index ec98abc7bc..eb7c218b48 100644 --- a/servers/slapd/back-monitor/database.c +++ b/servers/slapd/back-monitor/database.c @@ -160,12 +160,12 @@ monitor_subsys_database_init_one( "monitor_subsys_database_init: " "missing suffix for %s\n", rdnval, 0, 0 ); - return -1; - } - attr_merge( e, slap_schema.si_ad_namingContexts, + } else { + attr_merge( e, slap_schema.si_ad_namingContexts, be->be_suffix, be->be_nsuffix ); - attr_merge( e_database, slap_schema.si_ad_namingContexts, + attr_merge( e_database, slap_schema.si_ad_namingContexts, be->be_suffix, be->be_nsuffix ); + } } (void)init_readOnly( mi, e, be->be_restrictops ); diff --git a/servers/slapd/bconfig.c b/servers/slapd/bconfig.c index ca86da541d..9d33ceaa13 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -696,6 +696,15 @@ static ConfigTable config_back_cf_table[] = { NULL, NULL, NULL, NULL } }; +/* Need to no-op this keyword for dynamic config */ +ConfigTable olcDatabaseDummy[] = { + { "", "", 0, 0, 0, ARG_IGNORED, + NULL, "( OLcfgGlAt:13 NAME 'olcDatabase' " + "DESC 'The backend type for a database instance' " + "SUP olcBackend SINGLE-VALUE X-ORDERED 'SIBLINGS' )", NULL, NULL }, + { NULL, NULL, 0, 0, 0, ARG_IGNORED } +}; + /* Routines to check if a child can be added to this type */ static ConfigLDAPadd cfAddSchema, cfAddInclude, cfAddDatabase, cfAddBackend, cfAddModule, cfAddOverlay; @@ -3253,7 +3262,7 @@ typedef struct setup_cookie { ConfigArgs *ca; Entry *frontend; Entry *config; - int got_frontend; + int got_frontend; int got_config; } setup_cookie; @@ -3262,15 +3271,18 @@ config_ldif_resp( Operation *op, SlapReply *rs ) { if ( rs->sr_type == REP_SEARCH ) { setup_cookie *sc = op->o_callback->sc_private; + struct berval pdn; sc->cfb->cb_got_ldif = 1; /* Does the frontend exist? */ if ( !sc->got_frontend ) { if ( !strncmp( rs->sr_entry->e_nname.bv_val, - "olcDatabase", STRLENOF( "olcDatabase" ))) { + "olcDatabase", STRLENOF( "olcDatabase" ))) + { if ( strncmp( rs->sr_entry->e_nname.bv_val + STRLENOF( "olcDatabase" ), "={-1}frontend", - STRLENOF( "={-1}frontend" ))) { + STRLENOF( "={-1}frontend" ))) + { struct berval rdn; int i = op->o_noop; sc->ca->be = frontendDB; @@ -3293,13 +3305,19 @@ config_ldif_resp( Operation *op, SlapReply *rs ) } } } + + dnParent( &rs->sr_entry->e_nname, &pdn ); + /* Does the configDB exist? */ if ( sc->got_frontend && !sc->got_config && !strncmp( rs->sr_entry->e_nname.bv_val, - "olcDatabase", STRLENOF( "olcDatabase" ))) { + "olcDatabase", STRLENOF( "olcDatabase" )) && + dn_match( &config_rdn, &pdn ) ) + { if ( strncmp( rs->sr_entry->e_nname.bv_val + STRLENOF( "olcDatabase" ), "={0}config", - STRLENOF( "={0}config" ))) { + STRLENOF( "={0}config" ))) + { struct berval rdn; int i = op->o_noop; sc->ca->be = LDAP_STAILQ_FIRST( &backendDB ); @@ -6443,6 +6461,9 @@ config_back_initialize( BackendInfo *bi ) i = config_register_schema( ct, cf_ocs ); if ( i ) return i; + i = slap_str2ad( "olcDatabase", &olcDatabaseDummy[0].ad, &text ); + if ( i ) return i; + /* setup olcRootPW to be base64-encoded when written in LDIF form; * basically, we don't care if it fails */ i = slap_str2ad( "olcRootPW", &ad, &text ); diff --git a/servers/slapd/config.h b/servers/slapd/config.h index 8da8b6e1bb..7d91c7c2ff 100644 --- a/servers/slapd/config.h +++ b/servers/slapd/config.h @@ -201,6 +201,8 @@ int config_shadow( ConfigArgs *c, int flag ); extern slap_verbmasks *slap_ldap_response_code; extern int slap_ldap_response_code_register( struct berval *bv, int err ); +extern ConfigTable olcDatabaseDummy[]; + LDAP_END_DECL #endif /* CONFIG_H */ diff --git a/servers/slapd/overlays/pcache.c b/servers/slapd/overlays/pcache.c index 450290fcc3..40ac4b99ed 100644 --- a/servers/slapd/overlays/pcache.c +++ b/servers/slapd/overlays/pcache.c @@ -2655,15 +2655,6 @@ static ConfigTable pccfg[] = { { NULL, NULL, 0, 0, 0, ARG_IGNORED } }; -/* Need to no-op this keyword for dynamic config */ -static ConfigTable pcdummy[] = { - { "", "", 0, 0, 0, ARG_IGNORED, - NULL, "( OLcfgGlAt:13 NAME 'olcDatabase' " - "DESC 'The backend type for a database instance' " - "SUP olcBackend SINGLE-VALUE X-ORDERED 'SIBLINGS' )", NULL, NULL }, - { NULL, NULL, 0, 0, 0, ARG_IGNORED } -}; - static ConfigOCs pcocs[] = { { "( OLcfgOvOc:2.1 " "NAME 'olcPcacheConfig' " @@ -2675,7 +2666,7 @@ static ConfigOCs pcocs[] = { { "( OLcfgOvOc:2.2 " "NAME 'olcPcacheDatabase' " "DESC 'Cache database configuration' " - "AUXILIARY )", Cft_Misc, pcdummy, pc_ldadd }, + "AUXILIARY )", Cft_Misc, olcDatabaseDummy, pc_ldadd }, { NULL, 0, NULL } }; @@ -3995,11 +3986,6 @@ pcache_initialize() code = config_register_schema( pccfg, pcocs ); if ( code ) return code; - { - const char *text; - code = slap_str2ad( "olcDatabase", &pcdummy[0].ad, &text ); - if ( code ) return code; - } return overlay_register( &pcache ); } diff --git a/servers/slapd/overlays/translucent.c b/servers/slapd/overlays/translucent.c index 75b2d2012e..70d763f11e 100644 --- a/servers/slapd/overlays/translucent.c +++ b/servers/slapd/overlays/translucent.c @@ -95,14 +95,6 @@ static ConfigTable translucentcfg[] = { { NULL, NULL, 0, 0, 0, ARG_IGNORED } }; -static ConfigTable transdummy[] = { - { "", "", 0, 0, 0, ARG_IGNORED, - NULL, "( OLcfgGlAt:13 NAME 'olcDatabase' " - "DESC 'The backend type for a database instance' " - "SUP olcBackend SINGLE-VALUE X-ORDERED 'SIBLINGS' )", NULL, NULL }, - { NULL, NULL, 0, 0, 0, ARG_IGNORED } -}; - static ConfigOCs translucentocs[] = { { "( OLcfgOvOc:14.1 " "NAME 'olcTranslucentConfig' " @@ -115,7 +107,7 @@ static ConfigOCs translucentocs[] = { { "( OLcfgOvOc:14.2 " "NAME 'olcTranslucentDatabase' " "DESC 'Translucent target database configuration' " - "AUXILIARY )", Cft_Misc, transdummy, translucent_ldadd }, + "AUXILIARY )", Cft_Misc, olcDatabaseDummy, translucent_ldadd }, { NULL, 0, NULL } }; /* for translucent_init() */ -- 2.39.5