From 88b04ab6e65137079b2dad76d1cea07e7ea9ab80 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Fri, 25 Aug 2006 12:59:03 +0000 Subject: r17830: Set the default_basedn (hey, it comes from the "default" naming contex :-) once at connection time, after modules have been loaded. Introduce a function to retrieve the value where needed. (This used to be commit 0caf6a44e03393c645030a9288e7dfd31e97c98b) --- source4/dsdb/samdb/ldb_modules/password_hash.c | 2 +- source4/dsdb/samdb/samdb.c | 2 +- source4/lib/ldb/common/ldb.c | 71 ++++++++++++++------------ source4/lib/ldb/include/ldb.h | 3 +- source4/lib/ldb/tools/ldbsearch.c | 2 +- 5 files changed, 44 insertions(+), 36 deletions(-) diff --git a/source4/dsdb/samdb/ldb_modules/password_hash.c b/source4/dsdb/samdb/ldb_modules/password_hash.c index e8b9307cf5..2fcfdff997 100644 --- a/source4/dsdb/samdb/ldb_modules/password_hash.c +++ b/source4/dsdb/samdb/ldb_modules/password_hash.c @@ -489,7 +489,7 @@ static int build_domain_data_request(struct ph_context *ac) return LDB_ERR_OPERATIONS_ERROR; } ac->dom_req->operation = LDB_SEARCH; - ac->dom_req->op.search.base = ldb_auto_basedn(ac->module->ldb); + ac->dom_req->op.search.base = ldb_get_default_basedn(ac->module->ldb); ac->dom_req->op.search.scope = LDB_SCOPE_SUBTREE; filter = talloc_asprintf(ac->dom_req, "(&(objectSid=%s)(|(objectClass=domain)(objectClass=builtinDomain)))", diff --git a/source4/dsdb/samdb/samdb.c b/source4/dsdb/samdb/samdb.c index dd671e6a2b..e57a9b1aa2 100644 --- a/source4/dsdb/samdb/samdb.c +++ b/source4/dsdb/samdb/samdb.c @@ -1026,7 +1026,7 @@ struct security_descriptor *samdb_default_security_descriptor(TALLOC_CTX *mem_ct const struct ldb_dn *samdb_base_dn(struct ldb_context *sam_ctx) { - return ldb_auto_basedn(sam_ctx); + return ldb_get_default_basedn(sam_ctx); } diff --git a/source4/lib/ldb/common/ldb.c b/source4/lib/ldb/common/ldb.c index db5333187b..04ac3e7d81 100644 --- a/source4/lib/ldb/common/ldb.c +++ b/source4/lib/ldb/common/ldb.c @@ -141,6 +141,41 @@ int ldb_connect_backend(struct ldb_context *ldb, const char *url, const char *op return ret; } +/* + try to autodetect a basedn if none specified. This fixes one of my + pet hates about ldapsearch, which is that you have to get a long, + complex basedn right to make any use of it. +*/ +static const struct ldb_dn *ldb_set_default_basedn(struct ldb_context *ldb) +{ + TALLOC_CTX *tmp_ctx; + int ret; + static const char *attrs[] = { "defaultNamingContext", NULL }; + struct ldb_result *res; + struct ldb_dn *basedn=NULL; + + basedn = ldb_get_opaque(ldb, "default_baseDN"); + if (basedn) { + return basedn; + } + + tmp_ctx = talloc_new(ldb); + ret = ldb_search(ldb, ldb_dn_new(tmp_ctx), LDB_SCOPE_BASE, + "(objectClass=*)", attrs, &res); + if (ret == LDB_SUCCESS && res->count == 1) { + basedn = ldb_msg_find_attr_as_dn(ldb, res->msgs[0], "defaultNamingContext"); + } + + ldb_set_opaque(ldb, "default_baseDN", basedn); + + talloc_free(tmp_ctx); + return basedn; +} + +const struct ldb_dn *ldb_get_default_basedn(struct ldb_context *ldb) +{ + return ldb_get_opaque(ldb, "default_baseDN"); +} /* connect to a database. The URL can either be one of the following forms @@ -171,6 +206,9 @@ int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, co /* TODO: get timeout from options if available there */ ldb->default_timeout = 300; /* set default to 5 minutes */ + /* set the default base dn */ + ldb_set_default_basedn(ldb); + return LDB_SUCCESS; } @@ -529,37 +567,6 @@ error: return LDB_ERR_OPERATIONS_ERROR; } -/* - try to autodetect a basedn if none specified. This fixes one of my - pet hates about ldapsearch, which is that you have to get a long, - complex basedn right to make any use of it. -*/ -const struct ldb_dn *ldb_auto_basedn(struct ldb_context *ldb) -{ - TALLOC_CTX *tmp_ctx; - int ret; - static const char *attrs[] = { "defaultNamingContext", NULL }; - struct ldb_result *res; - struct ldb_dn *basedn=NULL; - - basedn = ldb_get_opaque(ldb, "auto_baseDN"); - if (basedn) { - return basedn; - } - - tmp_ctx = talloc_new(ldb); - ret = ldb_search(ldb, ldb_dn_new(tmp_ctx), LDB_SCOPE_BASE, - "(objectClass=*)", attrs, &res); - if (ret == LDB_SUCCESS && res->count == 1) { - basedn = ldb_msg_find_attr_as_dn(ldb, res->msgs[0], "defaultNamingContext"); - } - - ldb_set_opaque(ldb, "auto_baseDN", basedn); - - talloc_free(tmp_ctx); - return basedn; -} - /* note that ldb_search() will automatically replace a NULL 'base' value with the defaultNamingContext from the rootDSE if available. @@ -583,7 +590,7 @@ int ldb_search(struct ldb_context *ldb, } if (base == NULL) { - base = ldb_auto_basedn(ldb); + base = ldb_get_default_basedn(ldb); } req->operation = LDB_SEARCH; diff --git a/source4/lib/ldb/include/ldb.h b/source4/lib/ldb/include/ldb.h index 415eacbf61..124cba9b66 100644 --- a/source4/lib/ldb/include/ldb.h +++ b/source4/lib/ldb/include/ldb.h @@ -824,8 +824,9 @@ int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, co /* return an automatic baseDN from the defaultNamingContext of the rootDSE + This value have been set in an opaque pointer at connection time */ -const struct ldb_dn *ldb_auto_basedn(struct ldb_context *ldb); +const struct ldb_dn *ldb_get_default_basedn(struct ldb_context *ldb); /** Search the database diff --git a/source4/lib/ldb/tools/ldbsearch.c b/source4/lib/ldb/tools/ldbsearch.c index f151164559..e6b8a48a95 100644 --- a/source4/lib/ldb/tools/ldbsearch.c +++ b/source4/lib/ldb/tools/ldbsearch.c @@ -219,7 +219,7 @@ static int do_search(struct ldb_context *ldb, sctx->refs = 0; if (basedn == NULL) { - basedn = ldb_auto_basedn(ldb); + basedn = ldb_get_default_basedn(ldb); } req->operation = LDB_SEARCH; -- cgit