mirror of
https://github.com/samba-team/samba.git
synced 2025-01-13 13:18:06 +03:00
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 commit is contained in:
parent
221272e393
commit
5d1b66b68f
@ -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;
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user