diff options
| author | Anatoliy Atanasov <anatoliy.atanasov@postpath.com> | 2010-09-20 09:44:19 -0700 | 
|---|---|---|
| committer | Anatoliy Atanasov <anatoliy.atanasov@postpath.com> | 2010-09-20 09:44:19 -0700 | 
| commit | 7250cb3e735fb1b96ebbbcd129e29283a26a508c (patch) | |
| tree | ffc58dacd7e8e151d1f4b8434bfa869bc9910957 /source4/dsdb | |
| parent | faeeb5c8e7b3f2ed4e91db6dd11560658f16182d (diff) | |
| download | samba-7250cb3e735fb1b96ebbbcd129e29283a26a508c.tar.gz samba-7250cb3e735fb1b96ebbbcd129e29283a26a508c.tar.bz2 samba-7250cb3e735fb1b96ebbbcd129e29283a26a508c.zip  | |
s4/fsmo: Create separate function for retrieving fsmo role dn and owner dn.
This functionality is needed for DsCrackNames ListRoles command also.
Diffstat (limited to 'source4/dsdb')
| -rw-r--r-- | source4/dsdb/common/util.c | 72 | ||||
| -rw-r--r-- | source4/dsdb/repl/drepl_fsmo.c | 63 | 
2 files changed, 81 insertions, 54 deletions
diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c index 0e371082be..f95cf91b8a 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,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 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; +} diff --git a/source4/dsdb/repl/drepl_fsmo.c b/source4/dsdb/repl/drepl_fsmo.c index 650b299c1d..ad655f77b9 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:  | 
