s4/dcdiag: Handle ListRoles command for dcdiag:KnowsOfRoleHolders test
authorAnatoliy Atanasov <anatoliy.atanasov@postpath.com>
Mon, 20 Sep 2010 16:46:10 +0000 (09:46 -0700)
committerAnatoliy Atanasov <anatoliy.atanasov@postpath.com>
Mon, 20 Sep 2010 16:46:10 +0000 (09:46 -0700)
source4/dsdb/common/util.c
source4/dsdb/samdb/cracknames.c
source4/rpc_server/drsuapi/dcesrv_drsuapi.c

index f95cf91b8aff2287e98cc9624593f96c79ea642a..a5d7caeefea5fa7e1cebe67f7fb287c951946b08 100644 (file)
@@ -4054,3 +4054,24 @@ WERROR dsdb_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(4, ("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 66e6b612db5f92f6f385587477b77b53c8f824b5..e642984171d6ac487107a79bf5b03a8e2a41029c 100644 (file)
@@ -1309,3 +1309,76 @@ NTSTATUS crack_auto_name_to_nt4_name(TALLOC_CTX *mem_ctx,
 
        return crack_name_to_nt4_name(mem_ctx, ev_ctx, lp_ctx, format_offered, name, nt4_domain, nt4_account);
 }
+
+
+WERROR dcesrv_drsuapi_ListRoles(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
+                               const struct drsuapi_DsNameRequest1 *req1,
+                               struct drsuapi_DsNameCtr1 **ctr1)
+{
+       struct drsuapi_DsNameInfo1 *names;
+       uint32_t i;
+       uint32_t count = 5;/*number of fsmo role owners we are going to return*/
+
+       *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 = dsdb_get_fsmo_role_info(mem_ctx, 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(sam_ctx, mem_ctx,
+                                                                  server_dn);
+               if(!names[i].dns_domain_name) {
+                       DEBUG(4, ("list_roles: Failed to find dNSHostName for server %s",
+                                 ldb_dn_get_linearized(server_dn)));
+               }
+               names[i].result_name = talloc_strdup(mem_ctx, ldb_dn_get_linearized(role_owner_dn));
+       }
+
+       (*ctr1)->count = count;
+       (*ctr1)->array = names;
+
+       return WERR_OK;
+}
+
+WERROR dcesrv_drsuapi_CrackNamesByNameFormat(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
+                                            const struct drsuapi_DsNameRequest1 *req1,
+                                            struct drsuapi_DsNameCtr1 **ctr1)
+{
+       struct drsuapi_DsNameInfo1 *names;
+       uint32_t i, count;
+       WERROR status;
+
+       *ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1);
+       W_ERROR_HAVE_NO_MEMORY(*ctr1);
+
+       count = 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(sam_ctx, mem_ctx,
+                                           req1->format_flags,
+                                           req1->format_offered,
+                                           req1->format_desired,
+                                           req1->names[i].str,
+                                           &names[i]);
+               if (!W_ERROR_IS_OK(status)) {
+                       return status;
+               }
+       }
+
+       (*ctr1)->count = count;
+       (*ctr1)->array = names;
+
+       return WERR_OK;
+}
index 16c19cdd3e8c50282c43778ca57dcef742e85cce..2299714c2d04317fa84108c15cf75c6167d6331d 100644 (file)
@@ -406,14 +406,12 @@ static WERROR dcesrv_drsuapi_DsGetNT4ChangeLog(struct dcesrv_call_state *dce_cal
        DRSUAPI_UNSUPPORTED(drsuapi_DsGetNT4ChangeLog);
 }
 
-
 /* 
   drsuapi_DsCrackNames 
 */
 static WERROR dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                            struct drsuapi_DsCrackNames *r)
 {
-       WERROR status;
        struct drsuapi_bind_state *b_state;
        struct dcesrv_handle *h;
 
@@ -427,37 +425,36 @@ 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;
-                               }
+                       switch(r->in.req->req1.format_offered){
+                       case DRSUAPI_DS_NAME_FORMAT_UPN_AND_ALTSECID:
+                       case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT_NAME_SANS_DOMAIN_EX:
+                       case DRSUAPI_DS_NAME_FORMAT_LIST_GLOBAL_CATALOG_SERVERS:
+                       case DRSUAPI_DS_NAME_FORMAT_UPN_FOR_LOGON:
+                       case DRSUAPI_DS_NAME_FORMAT_LIST_SERVERS_WITH_DCS_IN_SITE:
+                       case DRSUAPI_DS_NAME_FORMAT_STRING_SID_NAME:
+                       case DRSUAPI_DS_NAME_FORMAT_ALT_SECURITY_IDENTITIES_NAME:
+                       case DRSUAPI_DS_NAME_FORMAT_LIST_NCS:
+                       case DRSUAPI_DS_NAME_FORMAT_LIST_DOMAINS:
+                       case DRSUAPI_DS_NAME_FORMAT_MAP_SCHEMA_GUID:
+                       case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT_NAME_SANS_DOMAIN:
+                       case DRSUAPI_DS_NAME_FORMAT_LIST_INFO_FOR_SERVER:
+                       case DRSUAPI_DS_NAME_FORMAT_LIST_SERVERS_FOR_DOMAIN_IN_SITE:
+                       case DRSUAPI_DS_NAME_FORMAT_LIST_DOMAINS_IN_SITE:
+                       case DRSUAPI_DS_NAME_FORMAT_LIST_SERVERS_IN_SITE:
+                       case DRSUAPI_DS_NAME_FORMAT_LIST_SITES:
+                               DEBUG(0, ("DsCrackNames: Unsupported operation requested: %X",
+                                         r->in.req->req1.format_offered));
+                               return WERR_OK;
+                       case DRSUAPI_DS_NAME_FORMAT_LIST_ROLES:
+                               return dcesrv_drsuapi_ListRoles(b_state->sam_ctx, mem_ctx,
+                                                               &r->in.req->req1, &r->out.ctr->ctr1);
+                       default:/* format_offered is in the enum drsuapi_DsNameFormat*/
+                               return dcesrv_drsuapi_CrackNamesByNameFormat(b_state->sam_ctx, mem_ctx,
+                                                                            &r->in.req->req1, &r->out.ctr->ctr1);
                        }
-
-                       ctr1->count = count;
-                       ctr1->array = names;
-                       r->out.ctr->ctr1 = ctr1;
-
                        return WERR_OK;
                }
        }
-       
        return WERR_UNKNOWN_LEVEL;
 }