summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2006-08-25 06:41:37 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:16:44 -0500
commita2ca0b5e3cf2e1ac485f7046d67de9fc4e5171f9 (patch)
tree65039aa5160301d151c09b92e626f3bda8bbfc04 /source4
parent6a4794452fdfffac4d9b1c6fc95bcb475f62b68c (diff)
downloadsamba-a2ca0b5e3cf2e1ac485f7046d67de9fc4e5171f9.tar.gz
samba-a2ca0b5e3cf2e1ac485f7046d67de9fc4e5171f9.tar.bz2
samba-a2ca0b5e3cf2e1ac485f7046d67de9fc4e5171f9.zip
r17821: changed ldb_search() and the ldbsearch command line utility to
automatically work out the basedn when basedn==NULL. The basedn is fetched from the rootDSE defaultNamingContext value (if there is one) This means we don't have to have the defaultNamingContext logic in lots of places. It makes a lot of sense to me to have basedn==NULL mean "use the default, as given by the database" Note that explicitly specifing a basedn of '' is not the same thing, and will not trigger this code The baseDN is cached in a ldb opaque, so we only have to fetch it once (This used to be commit 5d1b66b68fc517ce684f75e466ed5f25e46857d5)
Diffstat (limited to 'source4')
-rw-r--r--source4/lib/ldb/common/ldb.c41
-rw-r--r--source4/lib/ldb/include/ldb.h5
-rw-r--r--source4/lib/ldb/tools/ldbsearch.c4
3 files changed, 50 insertions, 0 deletions
diff --git a/source4/lib/ldb/common/ldb.c b/source4/lib/ldb/common/ldb.c
index ce42a36a59..f49fb2d955 100644
--- a/source4/lib/ldb/common/ldb.c
+++ b/source4/lib/ldb/common/ldb.c
@@ -529,6 +529,43 @@ 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");
+ }
+
+ if (basedn) {
+ 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.
+*/
int ldb_search(struct ldb_context *ldb,
const struct ldb_dn *base,
enum ldb_scope scope,
@@ -547,6 +584,10 @@ int ldb_search(struct ldb_context *ldb,
return LDB_ERR_OPERATIONS_ERROR;
}
+ if (base == NULL) {
+ base = ldb_auto_basedn(ldb);
+ }
+
req->operation = LDB_SEARCH;
req->op.search.base = base;
req->op.search.scope = scope;
diff --git a/source4/lib/ldb/include/ldb.h b/source4/lib/ldb/include/ldb.h
index b07cdd964c..415eacbf61 100644
--- a/source4/lib/ldb/include/ldb.h
+++ b/source4/lib/ldb/include/ldb.h
@@ -822,6 +822,11 @@ struct ldb_context *ldb_init(void *mem_ctx);
*/
int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[]);
+/*
+ return an automatic baseDN from the defaultNamingContext of the rootDSE
+*/
+const struct ldb_dn *ldb_auto_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 6bbd9e2f74..f151164559 100644
--- a/source4/lib/ldb/tools/ldbsearch.c
+++ b/source4/lib/ldb/tools/ldbsearch.c
@@ -218,6 +218,10 @@ static int do_search(struct ldb_context *ldb,
sctx->entries = 0;
sctx->refs = 0;
+ if (basedn == NULL) {
+ basedn = ldb_auto_basedn(ldb);
+ }
+
req->operation = LDB_SEARCH;
req->op.search.base = basedn;
req->op.search.scope = options->scope;