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.atana...@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.atana...@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.atana...@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.atana...@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

Reply via email to