summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/dsdb/samdb/ldb_modules/password_hash.c2
-rw-r--r--source4/dsdb/samdb/samdb.c2
-rw-r--r--source4/lib/ldb/common/ldb.c71
-rw-r--r--source4/lib/ldb/include/ldb.h3
-rw-r--r--source4/lib/ldb/tools/ldbsearch.c2
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;
}
@@ -530,37 +568,6 @@ 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;