[SCM] Samba Shared Repository - branch master updated

Anatoliy Atanasov anatoliy at samba.org
Mon Sep 20 10:54:44 MDT 2010


The branch, master has been updated
       via  b4eba42 s4/dcdiag: Handle ListRoles command for dcdiag:KnowsOfRoleHolders test
       via  7250cb3 s4/fsmo: Create separate function for retrieving fsmo role dn and owner dn.
       via  faeeb5c s4/drs: use type enum drsuapi_DsNameFormat in DsCrackNames code
       via  b55853c s4/drs: Added the rest of the enum drsuapi_DsNameFormat values
      from  f12756b s4-smbtorture: add test_SetServiceObjectSecurity() to RPC-SVCCTL.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit b4eba4268d87ab7436eb567c5a629445f81a8ecc
Author: Anatoliy Atanasov <anatoliy.atanasov at postpath.com>
Date:   Mon Sep 20 09:46:10 2010 -0700

    s4/dcdiag: Handle ListRoles command for dcdiag:KnowsOfRoleHolders test

commit 7250cb3e735fb1b96ebbbcd129e29283a26a508c
Author: Anatoliy Atanasov <anatoliy.atanasov at postpath.com>
Date:   Mon Sep 20 09:44:19 2010 -0700

    s4/fsmo: Create separate function for retrieving fsmo role dn and owner dn.
    
    This functionality is needed for DsCrackNames ListRoles command also.

commit faeeb5c8e7b3f2ed4e91db6dd11560658f16182d
Author: Anatoliy Atanasov <anatoliy.atanasov at postpath.com>
Date:   Mon Sep 20 09:41:00 2010 -0700

    s4/drs: use type enum drsuapi_DsNameFormat in DsCrackNames code

commit b55853cd64a5eeeedf1ffb9c09ba0749e3b17617
Author: Anatoliy Atanasov <anatoliy.atanasov at postpath.com>
Date:   Mon Sep 20 09:39:44 2010 -0700

    s4/drs: Added the rest of the enum drsuapi_DsNameFormat values
    
    According to documentation - [MS-DRSR] 4.1.4.1.2 and 4.1.4.1.3

-----------------------------------------------------------------------

Summary of changes:
 librpc/idl/drsuapi.idl                      |   39 +++++++---
 source4/dsdb/common/util.c                  |   93 ++++++++++++++++++++++++
 source4/dsdb/repl/drepl_fsmo.c              |   63 +++--------------
 source4/dsdb/samdb/cracknames.c             |  102 ++++++++++++++++++++++++---
 source4/rpc_server/drsuapi/dcesrv_drsuapi.c |   55 +++++++--------
 5 files changed, 249 insertions(+), 103 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/drsuapi.idl b/librpc/idl/drsuapi.idl
index 9010efc..8981891 100644
--- a/librpc/idl/drsuapi.idl
+++ b/librpc/idl/drsuapi.idl
@@ -952,17 +952,34 @@ interface drsuapi
 	} drsuapi_DsNameFlags;
 
 	typedef [v1_enum] enum {
-		DRSUAPI_DS_NAME_FORMAT_UNKNOWN			= 0,
-		DRSUAPI_DS_NAME_FORMAT_FQDN_1779		= 1,
-		DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT		= 2,
-		DRSUAPI_DS_NAME_FORMAT_DISPLAY			= 3,
-		DRSUAPI_DS_NAME_FORMAT_GUID 			= 6,
-		DRSUAPI_DS_NAME_FORMAT_CANONICAL		= 7,
-		DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL		= 8,
-		DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX		= 9,
-		DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL	= 10,
-		DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY	= 11,
-		DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN		= 12
+		DRSUAPI_DS_NAME_FORMAT_UNKNOWN			= 0x00000000,
+		DRSUAPI_DS_NAME_FORMAT_FQDN_1779		= 0x00000001,
+		DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT		= 0x00000002,
+		DRSUAPI_DS_NAME_FORMAT_DISPLAY			= 0x00000003,
+		DRSUAPI_DS_NAME_FORMAT_GUID 			= 0x00000006,
+		DRSUAPI_DS_NAME_FORMAT_CANONICAL		= 0x00000007,
+		DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL		= 0x00000008,
+		DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX		= 0x00000009,
+		DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL	= 0x0000000A,
+		DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY	= 0x0000000B,
+		DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN		= 0x0000000C,
+		DRSUAPI_DS_NAME_FORMAT_UPN_AND_ALTSECID         = 0xFFFFFFEF,
+		DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT_NAME_SANS_DOMAIN_EX = 0xFFFFFFF0,
+		DRSUAPI_DS_NAME_FORMAT_LIST_GLOBAL_CATALOG_SERVERS = 0xFFFFFFF1,
+		DRSUAPI_DS_NAME_FORMAT_UPN_FOR_LOGON            = 0xFFFFFFF2,
+		DRSUAPI_DS_NAME_FORMAT_LIST_SERVERS_WITH_DCS_IN_SITE = 0xFFFFFFF3,
+		DRSUAPI_DS_NAME_FORMAT_STRING_SID_NAME          = 0xFFFFFFF4,
+		DRSUAPI_DS_NAME_FORMAT_ALT_SECURITY_IDENTITIES_NAME = 0xFFFFFFF5,
+		DRSUAPI_DS_NAME_FORMAT_LIST_NCS                 = 0xFFFFFFF6,
+		DRSUAPI_DS_NAME_FORMAT_LIST_DOMAINS             = 0xFFFFFFF7,
+		DRSUAPI_DS_NAME_FORMAT_MAP_SCHEMA_GUID          = 0xFFFFFFF8,
+		DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT_NAME_SANS_DOMAIN = 0xFFFFFFF9,
+		DRSUAPI_DS_NAME_FORMAT_LIST_ROLES               = 0xFFFFFFFA,
+		DRSUAPI_DS_NAME_FORMAT_LIST_INFO_FOR_SERVER     = 0xFFFFFFFB,
+		DRSUAPI_DS_NAME_FORMAT_LIST_SERVERS_FOR_DOMAIN_IN_SITE = 0xFFFFFFFC,
+		DRSUAPI_DS_NAME_FORMAT_LIST_DOMAINS_IN_SITE     = 0xFFFFFFFD,
+		DRSUAPI_DS_NAME_FORMAT_LIST_SERVERS_IN_SITE     = 0xFFFFFFFE,
+		DRSUAPI_DS_NAME_FORMAT_LIST_SITES               = 0xFFFFFFFF
 	} drsuapi_DsNameFormat;
 
 	typedef struct {
diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c
index 0e37108..a5d7cae 100644
--- a/source4/dsdb/common/util.c
+++ b/source4/dsdb/common/util.c
@@ -43,6 +43,7 @@
 #include "dsdb/common/util.h"
 #include "lib/socket/socket.h"
 #include "dsdb/samdb/ldb_modules/util.h"
+#include "librpc/gen_ndr/irpc.h"
 
 /*
   search the sam for the specified attributes in a specific domain, filter on
@@ -3982,3 +3983,95 @@ bool dsdb_attr_in_rodc_fas(const struct dsdb_attribute *sa)
 	/* other attributes are denied */
 	return false;
 }
+
+/* return fsmo role dn and role owner dn for a particular role*/
+WERROR dsdb_get_fsmo_role_info(TALLOC_CTX *tmp_ctx,
+			       struct ldb_context *ldb,
+			       uint32_t role,
+			       struct ldb_dn **fsmo_role_dn,
+			       struct ldb_dn **role_owner_dn)
+{
+	int ret;
+	switch (role) {
+	case DREPL_NAMING_MASTER:
+		*fsmo_role_dn = samdb_partitions_dn(ldb, tmp_ctx);
+		ret = samdb_reference_dn(ldb, tmp_ctx, *fsmo_role_dn, "fSMORoleOwner", role_owner_dn);
+		if (ret != LDB_SUCCESS) {
+			DEBUG(0,(__location__ ": Failed to find fSMORoleOwner in Naming Master object - %s",
+				 ldb_errstring(ldb)));
+			talloc_free(tmp_ctx);
+			return WERR_DS_DRA_INTERNAL_ERROR;
+		}
+		break;
+	case DREPL_INFRASTRUCTURE_MASTER:
+		*fsmo_role_dn = samdb_infrastructure_dn(ldb, tmp_ctx);
+		ret = samdb_reference_dn(ldb, tmp_ctx, *fsmo_role_dn, "fSMORoleOwner", role_owner_dn);
+		if (ret != LDB_SUCCESS) {
+			DEBUG(0,(__location__ ": Failed to find fSMORoleOwner in Schema Master object - %s",
+				 ldb_errstring(ldb)));
+			talloc_free(tmp_ctx);
+			return WERR_DS_DRA_INTERNAL_ERROR;
+		}
+		break;
+	case DREPL_RID_MASTER:
+		ret = samdb_rid_manager_dn(ldb, tmp_ctx, fsmo_role_dn);
+		if (ret != LDB_SUCCESS) {
+			DEBUG(0, (__location__ ": Failed to find RID Manager object - %s", ldb_errstring(ldb)));
+			talloc_free(tmp_ctx);
+			return WERR_DS_DRA_INTERNAL_ERROR;
+		}
+
+		ret = samdb_reference_dn(ldb, tmp_ctx, *fsmo_role_dn, "fSMORoleOwner", role_owner_dn);
+		if (ret != LDB_SUCCESS) {
+			DEBUG(0,(__location__ ": Failed to find fSMORoleOwner in RID Manager object - %s",
+				 ldb_errstring(ldb)));
+			talloc_free(tmp_ctx);
+			return WERR_DS_DRA_INTERNAL_ERROR;
+		}
+		break;
+	case DREPL_SCHEMA_MASTER:
+		*fsmo_role_dn = ldb_get_schema_basedn(ldb);
+		ret = samdb_reference_dn(ldb, tmp_ctx, *fsmo_role_dn, "fSMORoleOwner", role_owner_dn);
+		if (ret != LDB_SUCCESS) {
+			DEBUG(0,(__location__ ": Failed to find fSMORoleOwner in Schema Master object - %s",
+				 ldb_errstring(ldb)));
+			talloc_free(tmp_ctx);
+			return WERR_DS_DRA_INTERNAL_ERROR;
+		}
+		break;
+	case DREPL_PDC_MASTER:
+		*fsmo_role_dn = ldb_get_default_basedn(ldb);
+		ret = samdb_reference_dn(ldb, tmp_ctx, *fsmo_role_dn, "fSMORoleOwner", role_owner_dn);
+		if (ret != LDB_SUCCESS) {
+			DEBUG(0,(__location__ ": Failed to find fSMORoleOwner in Pd Master object - %s",
+				 ldb_errstring(ldb)));
+			talloc_free(tmp_ctx);
+			return WERR_DS_DRA_INTERNAL_ERROR;
+		}
+		break;
+	default:
+		return WERR_DS_DRA_INTERNAL_ERROR;
+	}
+	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);
+}
diff --git a/source4/dsdb/repl/drepl_fsmo.c b/source4/dsdb/repl/drepl_fsmo.c
index 650b299..ad655f7 100644
--- a/source4/dsdb/repl/drepl_fsmo.c
+++ b/source4/dsdb/repl/drepl_fsmo.c
@@ -6,6 +6,7 @@
    Copyright (C) Nadezhda Ivanova 2010
    Copyright (C) Andrew Tridgell 2010
    Copyright (C) Andrew Bartlett 2010
+   Copyright (C) Anatoliy Atanasov 2010
 
    based on drepl_ridalloc.c
 
@@ -62,77 +63,31 @@ WERROR dreplsrv_fsmo_role_check(struct dreplsrv_service *service,
 {
 	struct ldb_dn *role_owner_dn, *fsmo_role_dn, *ntds_dn;
 	TALLOC_CTX *tmp_ctx = talloc_new(service);
-	struct ldb_context *ldb = service->samdb;
-	int ret;
 	uint64_t fsmo_info = 0;
 	enum drsuapi_DsExtendedOperation extended_op = DRSUAPI_EXOP_NONE;
 	WERROR werr;
 
-	ntds_dn = samdb_ntds_settings_dn(ldb);
+	ntds_dn = samdb_ntds_settings_dn(service->samdb);
 	if (!ntds_dn) {
 		return WERR_DS_DRA_INTERNAL_ERROR;
 	}
 
+	werr = dsdb_get_fsmo_role_info(tmp_ctx, service->samdb, role,
+				       &fsmo_role_dn, &role_owner_dn);
+	if (!W_ERROR_IS_OK(werr)) {
+		return werr;
+	}
+
 	switch (role) {
 	case DREPL_NAMING_MASTER:
-		fsmo_role_dn = samdb_partitions_dn(ldb, tmp_ctx);
-		ret = samdb_reference_dn(ldb, tmp_ctx, fsmo_role_dn, "fSMORoleOwner", &role_owner_dn);
-		if (ret != LDB_SUCCESS) {
-			DEBUG(0,(__location__ ": Failed to find fSMORoleOwner in Naming Master object - %s",
-				 ldb_errstring(ldb)));
-			talloc_free(tmp_ctx);
-			return WERR_DS_DRA_INTERNAL_ERROR;
-		}
-		extended_op = DRSUAPI_EXOP_FSMO_REQ_ROLE;
-		break;
 	case DREPL_INFRASTRUCTURE_MASTER:
-		fsmo_role_dn = samdb_infrastructure_dn(ldb, tmp_ctx);
-		ret = samdb_reference_dn(ldb, tmp_ctx, fsmo_role_dn, "fSMORoleOwner", &role_owner_dn);
-		if (ret != LDB_SUCCESS) {
-			DEBUG(0,(__location__ ": Failed to find fSMORoleOwner in Schema Master object - %s",
-				 ldb_errstring(ldb)));
-			talloc_free(tmp_ctx);
-			return WERR_DS_DRA_INTERNAL_ERROR;
-		}
+	case DREPL_SCHEMA_MASTER:
 		extended_op = DRSUAPI_EXOP_FSMO_REQ_ROLE;
 		break;
 	case DREPL_RID_MASTER:
-		ret = samdb_rid_manager_dn(ldb, tmp_ctx, &fsmo_role_dn);
-		if (ret != LDB_SUCCESS) {
-			DEBUG(0, (__location__ ": Failed to find RID Manager object - %s", ldb_errstring(ldb)));
-			talloc_free(tmp_ctx);
-			return WERR_DS_DRA_INTERNAL_ERROR;
-		}
-
-		ret = samdb_reference_dn(ldb, tmp_ctx, fsmo_role_dn, "fSMORoleOwner", &role_owner_dn);
-		if (ret != LDB_SUCCESS) {
-			DEBUG(0,(__location__ ": Failed to find fSMORoleOwner in RID Manager object - %s",
-				 ldb_errstring(ldb)));
-			talloc_free(tmp_ctx);
-			return WERR_DS_DRA_INTERNAL_ERROR;
-		}
 		extended_op = DRSUAPI_EXOP_FSMO_RID_REQ_ROLE;
 		break;
-	case DREPL_SCHEMA_MASTER:
-		fsmo_role_dn = ldb_get_schema_basedn(ldb);
-		ret = samdb_reference_dn(ldb, tmp_ctx, fsmo_role_dn, "fSMORoleOwner", &role_owner_dn);
-		if (ret != LDB_SUCCESS) {
-			DEBUG(0,(__location__ ": Failed to find fSMORoleOwner in Schema Master object - %s",
-				 ldb_errstring(ldb)));
-			talloc_free(tmp_ctx);
-			return WERR_DS_DRA_INTERNAL_ERROR;
-		}
-		extended_op = DRSUAPI_EXOP_FSMO_REQ_ROLE;
-		break;
 	case DREPL_PDC_MASTER:
-		fsmo_role_dn = ldb_get_default_basedn(ldb);
-		ret = samdb_reference_dn(ldb, tmp_ctx, fsmo_role_dn, "fSMORoleOwner", &role_owner_dn);
-		if (ret != LDB_SUCCESS) {
-			DEBUG(0,(__location__ ": Failed to find fSMORoleOwner in Pd Master object - %s",
-				 ldb_errstring(ldb)));
-			talloc_free(tmp_ctx);
-			return WERR_DS_DRA_INTERNAL_ERROR;
-		}
 		extended_op = DRSUAPI_EXOP_FSMO_REQ_PDC;
 		break;
 	default:
diff --git a/source4/dsdb/samdb/cracknames.c b/source4/dsdb/samdb/cracknames.c
index 63fe345..e642984 100644
--- a/source4/dsdb/samdb/cracknames.c
+++ b/source4/dsdb/samdb/cracknames.c
@@ -39,12 +39,14 @@
 
 static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
 				   struct smb_krb5_context *smb_krb5_context,
-				   uint32_t format_flags, uint32_t format_offered, uint32_t format_desired,
+				   uint32_t format_flags, enum drsuapi_DsNameFormat format_offered,
+				   enum drsuapi_DsNameFormat format_desired,
 				   struct ldb_dn *name_dn, const char *name, 
 				   const char *domain_filter, const char *result_filter, 
 				   struct drsuapi_DsNameInfo1 *info1);
 static WERROR DsCrackNameOneSyntactical(TALLOC_CTX *mem_ctx,
-					uint32_t format_offered, uint32_t format_desired,
+					enum drsuapi_DsNameFormat format_offered,
+					enum drsuapi_DsNameFormat format_desired,
 					struct ldb_dn *name_dn, const char *name, 
 					struct drsuapi_DsNameInfo1 *info1);
 
@@ -177,7 +179,8 @@ static enum drsuapi_DsNameStatus LDB_lookup_spn_alias(krb5_context context, stru
 
 static WERROR DsCrackNameSPNAlias(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
 				  struct smb_krb5_context *smb_krb5_context,
-				  uint32_t format_flags, uint32_t format_offered, uint32_t format_desired,
+				  uint32_t format_flags, enum drsuapi_DsNameFormat format_offered,
+				  enum drsuapi_DsNameFormat format_desired,
 				  const char *name, struct drsuapi_DsNameInfo1 *info1)
 {
 	WERROR wret;
@@ -262,7 +265,8 @@ static WERROR DsCrackNameSPNAlias(struct ldb_context *sam_ctx, TALLOC_CTX *mem_c
 
 static WERROR DsCrackNameUPN(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
 			     struct smb_krb5_context *smb_krb5_context,
-			     uint32_t format_flags, uint32_t format_offered, uint32_t format_desired,
+			     uint32_t format_flags, enum drsuapi_DsNameFormat format_offered,
+			     enum drsuapi_DsNameFormat format_desired,
 			     const char *name, struct drsuapi_DsNameInfo1 *info1)
 {
 	int ldb_ret;
@@ -348,7 +352,8 @@ static WERROR DsCrackNameUPN(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
 /* Crack a single 'name', from format_offered into format_desired, returning the result in info1 */
 
 WERROR DsCrackNameOneName(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
-			  uint32_t format_flags, uint32_t format_offered, uint32_t format_desired,
+			  uint32_t format_flags, enum drsuapi_DsNameFormat format_offered,
+			  enum drsuapi_DsNameFormat format_desired,
 			  const char *name, struct drsuapi_DsNameInfo1 *info1)
 {
 	krb5_error_code ret;
@@ -678,7 +683,8 @@ WERROR DsCrackNameOneName(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
  * database */
 
 static WERROR DsCrackNameOneSyntactical(TALLOC_CTX *mem_ctx,
-					uint32_t format_offered, uint32_t format_desired,
+					enum drsuapi_DsNameFormat format_offered,
+					enum drsuapi_DsNameFormat format_desired,
 					struct ldb_dn *name_dn, const char *name, 
 					struct drsuapi_DsNameInfo1 *info1)
 {
@@ -717,7 +723,8 @@ static WERROR DsCrackNameOneSyntactical(TALLOC_CTX *mem_ctx,
 
 static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
 				   struct smb_krb5_context *smb_krb5_context,
-				   uint32_t format_flags, uint32_t format_offered, uint32_t format_desired,
+				   uint32_t format_flags, enum drsuapi_DsNameFormat format_offered,
+				   enum drsuapi_DsNameFormat format_desired,
 				   struct ldb_dn *name_dn, const char *name, 
 				   const char *domain_filter, const char *result_filter, 
 				   struct drsuapi_DsNameInfo1 *info1)
@@ -872,6 +879,8 @@ static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_
 			return DsCrackNameUPN(sam_ctx, mem_ctx, smb_krb5_context, 
 					      format_flags, format_offered, format_desired,
 					      name, info1);
+		default:
+			break;
 		}
 		info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;
 		return WERR_OK;
@@ -894,6 +903,8 @@ static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_
 				case DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX:
 					canonical_name = ldb_dn_canonical_ex_string(mem_ctx, result_res[i]->dn);
 					break;
+				default:
+					break;
 				}
 				if (strcasecmp_m(canonical_name, name) == 0) {
 					result = result_res[i];
@@ -1208,7 +1219,7 @@ NTSTATUS crack_service_principal_name(struct ldb_context *sam_ctx,
 NTSTATUS crack_name_to_nt4_name(TALLOC_CTX *mem_ctx, 
 				struct tevent_context *ev_ctx, 
 				struct loadparm_context *lp_ctx,
-				uint32_t format_offered,
+				enum drsuapi_DsNameFormat format_offered,
 				const char *name, 
 				const char **nt4_domain, const char **nt4_account)
 {
@@ -1275,7 +1286,7 @@ NTSTATUS crack_auto_name_to_nt4_name(TALLOC_CTX *mem_ctx,
 				     const char **nt4_domain,
 				     const char **nt4_account)
 {
-	uint32_t format_offered = DRSUAPI_DS_NAME_FORMAT_UNKNOWN;
+	enum drsuapi_DsNameFormat format_offered = DRSUAPI_DS_NAME_FORMAT_UNKNOWN;
 
 	/* Handle anonymous bind */
 	if (!name || !*name) {
@@ -1298,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;
+}
diff --git a/source4/rpc_server/drsuapi/dcesrv_drsuapi.c b/source4/rpc_server/drsuapi/dcesrv_drsuapi.c
index 16c19cd..2299714 100644
--- a/source4/rpc_server/drsuapi/dcesrv_drsuapi.c
+++ b/source4/rpc_server/drsuapi/dcesrv_drsuapi.c
@@ -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:


-- 
Samba Shared Repository


More information about the samba-cvs mailing list