s4-samdb: use dsdb_search() in cracknames
authorAndrew Tridgell <tridge@samba.org>
Tue, 16 Feb 2010 05:09:07 +0000 (16:09 +1100)
committerAndrew Tridgell <tridge@samba.org>
Tue, 16 Feb 2010 10:10:52 +0000 (21:10 +1100)
greatly simplifies some of the cracknames code

Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org>

source4/dsdb/samdb/cracknames.c

index f0bd5d23ab1ada325f2e077bef09610f68fb08c4..3095ee2d46568d31b34505970ec2fa50b0f6ceb6 100644 (file)
@@ -34,6 +34,7 @@
 #include "auth/auth.h"
 #include "../lib/util/util_ldb.h"
 #include "dsdb/samdb/samdb.h"
+#include "dsdb/common/util.h"
 #include "param/param.h"
 
 static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
@@ -721,7 +722,6 @@ static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_
        const char * const *result_attrs;
        struct ldb_message **result_res = NULL;
        struct ldb_message *result = NULL;
-       struct ldb_dn *result_basedn = NULL;
        int i;
        char *p;
        struct ldb_dn *partitions_basedn = samdb_partitions_dn(sam_ctx, mem_ctx);
@@ -809,66 +809,33 @@ static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_
        if (result_filter) {
                int ret;
                struct ldb_result *res;
-               if (domain_res) {
-                       result_basedn = samdb_result_dn(sam_ctx, mem_ctx, domain_res->msgs[0], "ncName", NULL);
+               uint32_t dsdb_flags = 0;
+               struct ldb_dn *search_dn;
 
-                       ret = ldb_search(sam_ctx, mem_ctx, &res,
-                                                result_basedn, LDB_SCOPE_SUBTREE, 
-                                                result_attrs, "%s", result_filter);
-                       if (ret != LDB_SUCCESS) {
-                               talloc_free(result_res);
-                               info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
-                               return WERR_OK;
-                       }
-                       ldb_ret = res->count;
-                       result_res = res->msgs;
+               if (domain_res) {
+                       dsdb_flags = 0;
+                       search_dn = samdb_result_dn(sam_ctx, mem_ctx, domain_res->msgs[0], "ncName", NULL);
                } else {
-                       /* search with the 'phantom root' flag */
-                       struct ldb_request *req;
-
-                       res = talloc_zero(mem_ctx, struct ldb_result);
-                       W_ERROR_HAVE_NO_MEMORY(res);
-
-                       ret = ldb_build_search_req(&req, sam_ctx, mem_ctx,
-                                                  ldb_get_root_basedn(sam_ctx),
-                                                  LDB_SCOPE_SUBTREE,
-                                                  result_filter,
-                                                  result_attrs,
-                                                  NULL,
-                                                  res,
-                                                  ldb_search_default_callback,
-                                                  NULL);
-                       if (ret == LDB_SUCCESS) {
-                               struct ldb_search_options_control *search_options;
-                               search_options = talloc(req, struct ldb_search_options_control);
-                               W_ERROR_HAVE_NO_MEMORY(search_options);
-                               search_options->search_options = LDB_SEARCH_OPTION_PHANTOM_ROOT;
-
-                               ret = ldb_request_add_control(req, LDB_CONTROL_SEARCH_OPTIONS_OID, false, search_options);
-                       }
-                       if (ret != LDB_SUCCESS) {
-                               talloc_free(res);
-                               info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
-                               return WERR_OK;
-                       }
-
-                       ret = ldb_request(sam_ctx, req);
-
-                       if (ret == LDB_SUCCESS) {
-                               ret = ldb_wait(req->handle, LDB_WAIT_ALL);
-                       }
-
-                       talloc_free(req);
+                       dsdb_flags = DSDB_SEARCH_SEARCH_ALL_PARTITIONS;
+                       search_dn = ldb_get_root_basedn(sam_ctx);
+               }
 
-                       if (ret != LDB_SUCCESS) {
-                               DEBUG(2, ("DsCrackNameOneFilter phantom root search failed: %s", 
-                                         ldb_errstring(sam_ctx)));
-                               info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
-                               return WERR_OK;
-                       }
-                       ldb_ret = res->count;
-                       result_res = res->msgs;
+               /* search with the 'phantom root' flag */
+               ret = dsdb_search(sam_ctx, mem_ctx, &res,
+                                 search_dn,
+                                 LDB_SCOPE_SUBTREE,
+                                 result_attrs,
+                                 DSDB_SEARCH_SEARCH_ALL_PARTITIONS,
+                                 "%s", result_filter);
+               if (ret != LDB_SUCCESS) {
+                       DEBUG(2, ("DsCrackNameOneFilter phantom root search failed: %s",
+                                 ldb_errstring(sam_ctx)));
+                       info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
+                       return WERR_OK;
                }
+
+               ldb_ret = res->count;
+               result_res = res->msgs;
        } else if (format_offered == DRSUAPI_DS_NAME_FORMAT_FQDN_1779) {
                ldb_ret = gendb_search_dn(sam_ctx, mem_ctx, name_dn, &result_res,
                                          result_attrs);