fix KnowsOfRoles test a part of dcdiag test suite wip
authorAnatoliy Atanasov <anatoliy.atanasov@postpath.com>
Mon, 20 Sep 2010 03:33:50 +0000 (20:33 -0700)
committerAnatoliy Atanasov <anatoliy.atanasov@postpath.com>
Mon, 20 Sep 2010 03:33:50 +0000 (20:33 -0700)
source4/dsdb/common/util.c
source4/rpc_server/drsuapi/dcesrv_drsuapi.c

index fa3439d3f208eb438b349816751b10992b933fe2..f7fe513814200d51d9865b0cee73b09986ac5a01 100644 (file)
@@ -4054,3 +4054,22 @@ WERROR get_fsmo_role_info(TALLOC_CTX *tmp_ctx,
        }
        return WERR_OK;
 }
+
+const char *samdb_dn_to_dnshostname(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, struct ldb_dn *server_dn) 
+{
+       int ldb_ret;
+       struct ldb_result *res = NULL;
+       const char * const attrs[] = { "dNSHostName", NULL};
+
+       ldb_ret = ldb_search(ldb, mem_ctx, &res,
+                            server_dn,
+                            LDB_SCOPE_BASE,
+                            attrs, NULL);
+       if (ldb_ret != LDB_SUCCESS) {
+               DEBUG(2, ("Failed to find dNSHostName for dn %s, ldb error: %s",
+                         ldb_dn_get_linearized(server_dn), ldb_errstring(ldb)));
+               return NULL;
+       }
+
+       return samdb_result_string(res->msgs[0], "dNSHostName", NULL);
+}
index 16c19cdd3e8c50282c43778ca57dcef742e85cce..0d231c9deeb77fbea4777bd92f9a8d0711a69aa1 100644 (file)
@@ -427,33 +427,66 @@ static WERROR dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TA
 
        switch (r->in.level) {
                case 1: {
-                       struct drsuapi_DsNameCtr1 *ctr1;
-                       struct drsuapi_DsNameInfo1 *names;
-                       uint32_t i, count;
-
-                       ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1);
-                       W_ERROR_HAVE_NO_MEMORY(ctr1);
-
-                       count = r->in.req->req1.count;
-                       names = talloc_array(mem_ctx, struct drsuapi_DsNameInfo1, count);
-                       W_ERROR_HAVE_NO_MEMORY(names);
-
-                       for (i=0; i < count; i++) {
-                               status = DsCrackNameOneName(b_state->sam_ctx, mem_ctx,
-                                                           r->in.req->req1.format_flags,
-                                                           r->in.req->req1.format_offered,
-                                                           r->in.req->req1.format_desired,
-                                                           r->in.req->req1.names[i].str,
-                                                           &names[i]);
-                               if (!W_ERROR_IS_OK(status)) {
-                                       return status;
+                       if (r->in.req->req1.format_offered < 0xFFFFFFEF) {
+                               struct drsuapi_DsNameCtr1 *ctr1;
+                               struct drsuapi_DsNameInfo1 *names;
+                               uint32_t i, count;
+
+                               ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1);
+                               W_ERROR_HAVE_NO_MEMORY(ctr1);
+
+                               count = r->in.req->req1.count;
+                               names = talloc_array(mem_ctx, struct drsuapi_DsNameInfo1, count);
+                               W_ERROR_HAVE_NO_MEMORY(names);
+
+                               for (i=0; i < count; i++) {
+                                       status = DsCrackNameOneName(b_state->sam_ctx, mem_ctx,
+                                                                   r->in.req->req1.format_flags,
+                                                                   r->in.req->req1.format_offered,
+                                                                   r->in.req->req1.format_desired,
+                                                                   r->in.req->req1.names[i].str,
+                                                                   &names[i]);
+                                       if (!W_ERROR_IS_OK(status)) {
+                                               return status;
+                                       }
                                }
-                       }
 
-                       ctr1->count = count;
-                       ctr1->array = names;
-                       r->out.ctr->ctr1 = ctr1;
+                               ctr1->count = count;
+                               ctr1->array = names;
+                               r->out.ctr->ctr1 = ctr1;
+                       } else {
+                               struct drsuapi_DsNameCtr1 *ctr1;
+                               struct drsuapi_DsNameInfo1 *names;
+                               uint32_t i, count;
+
+                               count = 5;
+                               ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1);
+                               W_ERROR_HAVE_NO_MEMORY(ctr1);
+                               names = talloc_array(mem_ctx, struct drsuapi_DsNameInfo1, count);
+                               W_ERROR_HAVE_NO_MEMORY(names);
+
+                               for (i = 0; i < count; i++) {
+                                       WERROR werr;
+                                       struct ldb_dn *role_owner_dn, *fsmo_role_dn, *server_dn;
+                                       werr = get_fsmo_role_info(mem_ctx, b_state->sam_ctx, i,
+                                                                 &fsmo_role_dn, &role_owner_dn);
+                                       if(!W_ERROR_IS_OK(werr)) {
+                                               return werr;
+                                       }
+                                       server_dn = ldb_dn_copy(mem_ctx, role_owner_dn);
+                                       ldb_dn_remove_child_components(server_dn, 1);
+                                       names[i].status = DRSUAPI_DS_NAME_STATUS_OK;
+                                       names[i].dns_domain_name = samdb_dn_to_dnshostname(b_state->sam_ctx, mem_ctx,
+                                                                                          server_dn); 
+                                       DEBUG(0, ("\n\n\nDNSHOSTNAME %s\n\n\n", names[i].dns_domain_name));
+                                       W_ERROR_HAVE_NO_MEMORY(names[i].dns_domain_name);
+                                       names[i].result_name = talloc_strdup(mem_ctx, ldb_dn_get_linearized(role_owner_dn));
+                               }
 
+                               ctr1->count = count;
+                               ctr1->array = names;
+                               r->out.ctr->ctr1 = ctr1;
+                       }
                        return WERR_OK;
                }
        }