diff options
-rw-r--r-- | source4/librpc/idl/dssetup.idl | 51 | ||||
-rw-r--r-- | source4/rpc_server/dssetup/dcesrv_dssetup.c | 58 | ||||
-rw-r--r-- | source4/torture/rpc/dssetup.c | 17 |
3 files changed, 98 insertions, 28 deletions
diff --git a/source4/librpc/idl/dssetup.idl b/source4/librpc/idl/dssetup.idl index dc57e86a11..25045c5879 100644 --- a/source4/librpc/idl/dssetup.idl +++ b/source4/librpc/idl/dssetup.idl @@ -15,6 +15,15 @@ /**********************************************/ /* Function 0x00 */ + typedef enum { + DS_ROLE_STANDALONE_WORKSTATION = 0, + DS_ROLE_MEMBER_WORKSTATION = 1, + DS_ROLE_STANDALONE_SERVER = 2, + DS_ROLE_MEMBER_SERVER = 3, + DS_ROLE_BACKUP_DC = 4, + DS_ROLE_PRIMARY_DC = 5 + } ds_Role; + typedef struct { uint16 role; uint32 flags; @@ -23,9 +32,43 @@ unistr *forest; GUID domain_guid; } ds_DomainBasicInformation; + + typedef enum { + DS_NOT_UPGRADING = 0, + DS_UPGRADING = 1 + } ds_UpgradeStatus; + + typedef enum { + DS_PREVIOUS_UNKNOWN = 0, + DS_PREVIOUS_PRIMARY = 1, + DS_PREVIOUS_BACKUP = 2 + } ds_PreviousStatus; + + typedef struct { + uint32 upgrading; + uint16 previous_role; + } ds_DomainUpgradeStatus; + + typedef enum { + DS_STATUS_IDLE = 0, + DS_STATUS_ACTIVE = 1, + DS_STATUS_NEEDS_REBOOT = 2 + } ds_Status; + + typedef struct { + uint16 status; + } ds_RoleOpStatus; + typedef enum { + DS_BASIC_INFORMATION = 1, + DS_UPGRADE_STATUS = 2, + DS_ROLE_OP_STATUS = 3 + } ds_InformationLevel; + typedef union { - [case(1)] ds_DomainBasicInformation basic; + [case(DS_BASIC_INFORMATION)] ds_DomainBasicInformation basic; + [case(DS_UPGRADE_STATUS)] ds_DomainUpgradeStatus upgrade; + [case(DS_ROLE_OP_STATUS)] ds_RoleOpStatus status; } ds_DomainInformation; WERROR ds_RolerGetPrimaryDomainInformation( @@ -33,7 +76,11 @@ [out,switch_is(level)] ds_DomainInformation *info ); - + /* + w2k3 has removed all the calls below from their implementation. + These stubs are left here only as a way of documenting the names + of the calls in case they ever turn up on the wire. + */ WERROR ds_RolerDnsNameToFlatName(); WERROR ds_RolerDcAsDc(); WERROR ds_RolerDcAsReplica(); diff --git a/source4/rpc_server/dssetup/dcesrv_dssetup.c b/source4/rpc_server/dssetup/dcesrv_dssetup.c index bdf1c5af90..cde2b4d69a 100644 --- a/source4/rpc_server/dssetup/dcesrv_dssetup.c +++ b/source4/rpc_server/dssetup/dcesrv_dssetup.c @@ -50,20 +50,31 @@ static WERROR ds_RolerGetPrimaryDomainInformation(struct dcesrv_call_state *dce_ return WERR_SERVER_UNAVAILABLE; } + r->out.info = talloc_p(mem_ctx, union ds_DomainInformation); + if (r->out.info == NULL) { + return WERR_NOMEM; + } + switch (r->in.level) { - case 1: - r->out.info = talloc_p(mem_ctx, union ds_DomainInformation); - if (r->out.info == NULL) { - return WERR_NOMEM; - } - r->out.info->basic.role = lp_server_role(); - r->out.info->basic.flags = 0x01000003; - r->out.info->basic.domain = samdb_result_string(res[0], "name", NULL); - r->out.info->basic.dns_domain = samdb_result_string(res[0], "dnsDomain", NULL); - r->out.info->basic.forest = samdb_result_string(res[0], "dnsDomain", NULL); + case DS_BASIC_INFORMATION: + /* incorrect, but needed for the moment */ + r->out.info->basic.role = DS_ROLE_MEMBER_SERVER; + r->out.info->basic.flags = 0x01000003; + r->out.info->basic.domain = samdb_result_string(res[0], "name", NULL); + r->out.info->basic.dns_domain = samdb_result_string(res[0], "dnsDomain", NULL); + r->out.info->basic.forest = samdb_result_string(res[0], "dnsDomain", NULL); r->out.info->basic.domain_guid = samdb_result_guid(res[0], "objectGUID"); break; + case DS_UPGRADE_STATUS: + r->out.info->upgrade.upgrading = DS_NOT_UPGRADING; + r->out.info->upgrade.previous_role = DS_PREVIOUS_UNKNOWN; + break; + + case DS_ROLE_OP_STATUS: + r->out.info->status.status = DS_STATUS_IDLE; + break; + default: err = WERR_INVALID_PARAM; break; @@ -73,11 +84,18 @@ static WERROR ds_RolerGetPrimaryDomainInformation(struct dcesrv_call_state *dce_ } +/***************************************** +NOTE! The remaining calls below were +removed in w2k3, so the DCESRV_FAULT() +replies are the correct implementation. Do +not try and fill these in with anything else +******************************************/ + /* ds_RolerDnsNameToFlatName */ static WERROR ds_RolerDnsNameToFlatName(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct ds_RolerDnsNameToFlatName *r) + struct ds_RolerDnsNameToFlatName *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); } @@ -87,7 +105,7 @@ static WERROR ds_RolerDnsNameToFlatName(struct dcesrv_call_state *dce_call, TALL ds_RolerDcAsDc */ static WERROR ds_RolerDcAsDc(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct ds_RolerDcAsDc *r) + struct ds_RolerDcAsDc *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); } @@ -97,7 +115,7 @@ static WERROR ds_RolerDcAsDc(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem ds_RolerDcAsReplica */ static WERROR ds_RolerDcAsReplica(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct ds_RolerDcAsReplica *r) + struct ds_RolerDcAsReplica *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); } @@ -107,7 +125,7 @@ static WERROR ds_RolerDcAsReplica(struct dcesrv_call_state *dce_call, TALLOC_CTX ds_RolerDemoteDc */ static WERROR ds_RolerDemoteDc(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct ds_RolerDemoteDc *r) + struct ds_RolerDemoteDc *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); } @@ -117,7 +135,7 @@ static WERROR ds_RolerDemoteDc(struct dcesrv_call_state *dce_call, TALLOC_CTX *m ds_RolerGetDcOperationProgress */ static WERROR ds_RolerGetDcOperationProgress(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct ds_RolerGetDcOperationProgress *r) + struct ds_RolerGetDcOperationProgress *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); } @@ -127,7 +145,7 @@ static WERROR ds_RolerGetDcOperationProgress(struct dcesrv_call_state *dce_call, ds_RolerGetDcOperationResults */ static WERROR ds_RolerGetDcOperationResults(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct ds_RolerGetDcOperationResults *r) + struct ds_RolerGetDcOperationResults *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); } @@ -137,7 +155,7 @@ static WERROR ds_RolerGetDcOperationResults(struct dcesrv_call_state *dce_call, ds_RolerCancel */ static WERROR ds_RolerCancel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct ds_RolerCancel *r) + struct ds_RolerCancel *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); } @@ -147,7 +165,7 @@ static WERROR ds_RolerCancel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem ds_RolerServerSaveStateForUpgrade */ static WERROR ds_RolerServerSaveStateForUpgrade(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct ds_RolerServerSaveStateForUpgrade *r) + struct ds_RolerServerSaveStateForUpgrade *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); } @@ -157,7 +175,7 @@ static WERROR ds_RolerServerSaveStateForUpgrade(struct dcesrv_call_state *dce_ca ds_RolerUpgradeDownlevelServer */ static WERROR ds_RolerUpgradeDownlevelServer(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct ds_RolerUpgradeDownlevelServer *r) + struct ds_RolerUpgradeDownlevelServer *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); } @@ -167,7 +185,7 @@ static WERROR ds_RolerUpgradeDownlevelServer(struct dcesrv_call_state *dce_call, ds_RolerAbortDownlevelServerUpgrade */ static WERROR ds_RolerAbortDownlevelServerUpgrade(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct ds_RolerAbortDownlevelServerUpgrade *r) + struct ds_RolerAbortDownlevelServerUpgrade *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); } diff --git a/source4/torture/rpc/dssetup.c b/source4/torture/rpc/dssetup.c index 1819c523a5..7e63243e8a 100644 --- a/source4/torture/rpc/dssetup.c +++ b/source4/torture/rpc/dssetup.c @@ -28,18 +28,23 @@ static BOOL test_RolerGetPrimaryDomainInformation(struct dcerpc_pipe *p, TALLOC_ { struct ds_RolerGetPrimaryDomainInformation r; NTSTATUS status; + BOOL ret = True; + int i; printf("\ntesting RolerGetPrimaryDomainInformation\n"); - r.in.level = 1; + for (i=DS_BASIC_INFORMATION;i<=DS_ROLE_OP_STATUS;i++) { + r.in.level = i; - status = dcerpc_ds_RolerGetPrimaryDomainInformation(p, mem_ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("RolerGetPrimaryDomainInformation failed - %s\n", nt_errstr(status)); - return False; + status = dcerpc_ds_RolerGetPrimaryDomainInformation(p, mem_ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("RolerGetPrimaryDomainInformation level %d failed - %s\n", + i, nt_errstr(status)); + ret = False; + } } - return True; + return ret; } BOOL torture_rpc_dssetup(void) |