s4/fsmo: Separate the code for retrieving fsmo dn and role owner
authorAnatoliy Atanasov <anatoliy.atanasov@postpath.com>
Mon, 20 Sep 2010 03:33:00 +0000 (20:33 -0700)
committerAnatoliy Atanasov <anatoliy.atanasov@postpath.com>
Mon, 20 Sep 2010 03:33:00 +0000 (20:33 -0700)
This call will be needed for DsCrackNames list_roles call

source4/dsdb/common/util.c
source4/dsdb/repl/drepl_fsmo.c

index 0e371082bea99f473b392b5f7f7c52a982f33a79..fa3439d3f208eb438b349816751b10992b933fe2 100644 (file)
@@ -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,74 @@ 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 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;
+}
index 650b299c1ddf4fe1333c15a4e099112655b5e93b..e85e4525bd1e4fcac1a796109f7e04bcef78ee9f 100644 (file)
@@ -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,30 @@ 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 = 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: