diff options
-rw-r--r-- | source4/include/doserr.h | 3 | ||||
-rw-r--r-- | source4/librpc/idl/drsuapi.idl | 50 | ||||
-rw-r--r-- | source4/rpc_server/drsuapi/dcesrv_drsuapi.c | 62 | ||||
-rw-r--r-- | source4/rpc_server/drsuapi/drsuapi_cracknames.c | 36 | ||||
-rw-r--r-- | source4/torture/rpc/drsuapi.c | 146 |
5 files changed, 201 insertions, 96 deletions
diff --git a/source4/include/doserr.h b/source4/include/doserr.h index e3582889d8..ffaad7f936 100644 --- a/source4/include/doserr.h +++ b/source4/include/doserr.h @@ -231,6 +231,9 @@ #define WERR_DFS_INTERNAL_ERROR W_ERROR(NERR_BASE+590) #define WERR_DFS_CANT_CREATE_JUNCT W_ERROR(NERR_BASE+569) +/* DS errors */ +#define WERR_DS_OBJ_NOT_FOUND W_ERROR(0x0000208d) + #define WERR_FOOBAR WERR_GENERAL_FAILURE diff --git a/source4/librpc/idl/drsuapi.idl b/source4/librpc/idl/drsuapi.idl index 4a0cc7297e..f933437edb 100644 --- a/source4/librpc/idl/drsuapi.idl +++ b/source4/librpc/idl/drsuapi.idl @@ -17,7 +17,7 @@ interface drsuapi [size_is(length)] uint8 data[]; } drsuapi_DsBindInfo; - NTSTATUS drsuapi_DsBind( + WERROR drsuapi_DsBind( [in] GUID *server_guid, [in,out] drsuapi_DsBindInfo *bind_info, [out,ref] policy_handle *bind_handle @@ -25,49 +25,49 @@ interface drsuapi /*****************/ /* Function 0x01 */ - NTSTATUS drsuapi_DsUnbind( + WERROR drsuapi_DsUnbind( [in,out,ref] policy_handle *bind_handle ); /*****************/ /* Function 0x02 */ - NTSTATUS DRSUAPI_REPLICA_SYNC(); + WERROR DRSUAPI_REPLICA_SYNC(); /*****************/ /* Function 0x03 */ - NTSTATUS DRSUAPI_GET_NC_CHANGES(); + WERROR DRSUAPI_GET_NC_CHANGES(); /*****************/ /* Function 0x04 */ - NTSTATUS DRSUAPI_UPDATE_REFS(); + WERROR DRSUAPI_UPDATE_REFS(); /*****************/ /* Function 0x05 */ - NTSTATUS DRSUAPI_REPLICA_ADD(); + WERROR DRSUAPI_REPLICA_ADD(); /*****************/ /* Function 0x06 */ - NTSTATUS DRSUAPI_REPLICA_DEL(); + WERROR DRSUAPI_REPLICA_DEL(); /*****************/ /* Function 0x07 */ - NTSTATUS DRSUAPI_REPLICA_MODIFY(); + WERROR DRSUAPI_REPLICA_MODIFY(); /*****************/ /* Function 0x08 */ - NTSTATUS DRSUAPI_VERIFY_NAMES(); + WERROR DRSUAPI_VERIFY_NAMES(); /*****************/ /* Function 0x09 */ - NTSTATUS DRSUAPI_GET_MEMBERSHIPS(); + WERROR DRSUAPI_GET_MEMBERSHIPS(); /*****************/ /* Function 0x0a */ - NTSTATUS DRSUAPI_INTER_DOMAIN_MOVE(); + WERROR DRSUAPI_INTER_DOMAIN_MOVE(); /*****************/ /* Function 0x0b */ - NTSTATUS DRSUAPI_GET_NT4_CHANGELOG(); + WERROR DRSUAPI_GET_NT4_CHANGELOG(); /*****************/ /* Function 0x0c */ @@ -137,7 +137,7 @@ interface drsuapi [case(1)] drsuapi_DsNameCtr1 *ctr1; } drsuapi_DsNameCtr; - NTSTATUS drsuapi_DsCrackNames( + WERROR drsuapi_DsCrackNames( [in,ref] policy_handle *bind_handle, [in, out] uint32 level, [in,switch_is(level)] drsuapi_DsNameRequest req, @@ -146,15 +146,15 @@ interface drsuapi /*****************/ /* Function 0x0d */ - NTSTATUS DRSUAPI_WRITE_SPN(); + WERROR DRSUAPI_WRITE_SPN(); /*****************/ /* Function 0x0e */ - NTSTATUS DRSUAPI_REMOVE_DS_SERVER(); + WERROR DRSUAPI_REMOVE_DS_SERVER(); /*****************/ /* Function 0x0f */ - NTSTATUS DRSUAPI_REMOVE_DS_DOMAIN(); + WERROR DRSUAPI_REMOVE_DS_DOMAIN(); /*****************/ /* Function 0x10 */ @@ -226,7 +226,7 @@ interface drsuapi } drsuapi_DsGetDCInfoCtr; /* maybe WERROR function */ - NTSTATUS drsuapi_DsGetDomainControllerInfo( + WERROR drsuapi_DsGetDomainControllerInfo( [in,ref] policy_handle *bind_handle, [in, out] int32 level, [in,switch_is(level)] drsuapi_DsGetDCInfoRequest req, @@ -235,33 +235,33 @@ interface drsuapi /*****************/ /* Function 0x11 */ - NTSTATUS DRSUAPI_ADD_ENTRY(); + WERROR DRSUAPI_ADD_ENTRY(); /*****************/ /* Function 0x12 */ - NTSTATUS DRSUAPI_EXECUTE_KCC(); + WERROR DRSUAPI_EXECUTE_KCC(); /*****************/ /* Function 0x13 */ - NTSTATUS DRSUAPI_GET_REPL_INFO(); + WERROR DRSUAPI_GET_REPL_INFO(); /*****************/ /* Function 0x14 */ - NTSTATUS DRSUAPI_ADD_SID_HISTORY(); + WERROR DRSUAPI_ADD_SID_HISTORY(); /*****************/ /* Function 0x15 */ - NTSTATUS DRSUAPI_GET_MEMBERSHIPS2(); + WERROR DRSUAPI_GET_MEMBERSHIPS2(); /*****************/ /* Function 0x16 */ - NTSTATUS DRSUAPI_REPLICA_VERIFY_OBJECTS(); + WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS(); /*****************/ /* Function 0x17 */ - NTSTATUS DRSUAPI_GET_OBJECT_EXISTENCE(); + WERROR DRSUAPI_GET_OBJECT_EXISTENCE(); /*****************/ /* Function 0x18 */ - NTSTATUS DRSUAPI_QUERY_SITES_BY_COST(); + WERROR DRSUAPI_QUERY_SITES_BY_COST(); } diff --git a/source4/rpc_server/drsuapi/dcesrv_drsuapi.c b/source4/rpc_server/drsuapi/dcesrv_drsuapi.c index 9b9f4df3fc..42022dea01 100644 --- a/source4/rpc_server/drsuapi/dcesrv_drsuapi.c +++ b/source4/rpc_server/drsuapi/dcesrv_drsuapi.c @@ -35,7 +35,7 @@ static void drsuapi_handle_destroy(struct dcesrv_connection *conn, struct dcesrv /* drsuapi_DsBind */ -static NTSTATUS drsuapi_DsBind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR drsuapi_DsBind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct drsuapi_DsBind *r) { struct drsuapi_bind_state *b_state; @@ -45,16 +45,14 @@ static NTSTATUS drsuapi_DsBind(struct dcesrv_call_state *dce_call, TALLOC_CTX *m ZERO_STRUCTP(r->out.bind_handle); b_state = talloc_p(dce_call->conn, struct drsuapi_bind_state); - if (!b_state) { - return NT_STATUS_NO_MEMORY; - } + WERR_TALLOC_CHECK(b_state); /* TODO: fill b_state here */ handle = dcesrv_handle_new(dce_call->conn, DRSUAPI_BIND_HANDLE); if (!handle) { talloc_free(b_state); - return NT_STATUS_NO_MEMORY; + return WERR_NOMEM; } handle->data = b_state; @@ -62,21 +60,21 @@ static NTSTATUS drsuapi_DsBind(struct dcesrv_call_state *dce_call, TALLOC_CTX *m *r->out.bind_handle = handle->wire_handle; - return NT_STATUS_OK; + return WERR_OK; } /* drsuapi_DsUnbind */ -static NTSTATUS drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct drsuapi_DsUnbind *r) { struct dcesrv_handle *h; *r->out.bind_handle = *r->in.bind_handle; - DCESRV_PULL_HANDLE(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE); + DCESRV_PULL_HANDLE_WERR(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE); /* this causes the callback drsuapi_handle_destroy() to be called by the handle destroy code which destroys the state associated @@ -85,14 +83,14 @@ static NTSTATUS drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX ZERO_STRUCTP(r->out.bind_handle); - return NT_STATUS_OK; + return WERR_OK; } /* DRSUAPI_REPLICA_SYNC */ -static NTSTATUS DRSUAPI_REPLICA_SYNC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_REPLICA_SYNC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_REPLICA_SYNC *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -102,7 +100,7 @@ static NTSTATUS DRSUAPI_REPLICA_SYNC(struct dcesrv_call_state *dce_call, TALLOC_ /* DRSUAPI_GET_NC_CHANGES */ -static NTSTATUS DRSUAPI_GET_NC_CHANGES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_GET_NC_CHANGES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_GET_NC_CHANGES *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -112,7 +110,7 @@ static NTSTATUS DRSUAPI_GET_NC_CHANGES(struct dcesrv_call_state *dce_call, TALLO /* DRSUAPI_UPDATE_REFS */ -static NTSTATUS DRSUAPI_UPDATE_REFS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_UPDATE_REFS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_UPDATE_REFS *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -122,7 +120,7 @@ static NTSTATUS DRSUAPI_UPDATE_REFS(struct dcesrv_call_state *dce_call, TALLOC_C /* DRSUAPI_REPLICA_ADD */ -static NTSTATUS DRSUAPI_REPLICA_ADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_REPLICA_ADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_REPLICA_ADD *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -132,7 +130,7 @@ static NTSTATUS DRSUAPI_REPLICA_ADD(struct dcesrv_call_state *dce_call, TALLOC_C /* DRSUAPI_REPLICA_DEL */ -static NTSTATUS DRSUAPI_REPLICA_DEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_REPLICA_DEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_REPLICA_DEL *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -142,7 +140,7 @@ static NTSTATUS DRSUAPI_REPLICA_DEL(struct dcesrv_call_state *dce_call, TALLOC_C /* DRSUAPI_REPLICA_MODIFY */ -static NTSTATUS DRSUAPI_REPLICA_MODIFY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_REPLICA_MODIFY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_REPLICA_MODIFY *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -152,7 +150,7 @@ static NTSTATUS DRSUAPI_REPLICA_MODIFY(struct dcesrv_call_state *dce_call, TALLO /* DRSUAPI_VERIFY_NAMES */ -static NTSTATUS DRSUAPI_VERIFY_NAMES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_VERIFY_NAMES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_VERIFY_NAMES *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -162,7 +160,7 @@ static NTSTATUS DRSUAPI_VERIFY_NAMES(struct dcesrv_call_state *dce_call, TALLOC_ /* DRSUAPI_GET_MEMBERSHIPS */ -static NTSTATUS DRSUAPI_GET_MEMBERSHIPS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_GET_MEMBERSHIPS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_GET_MEMBERSHIPS *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -172,7 +170,7 @@ static NTSTATUS DRSUAPI_GET_MEMBERSHIPS(struct dcesrv_call_state *dce_call, TALL /* DRSUAPI_INTER_DOMAIN_MOVE */ -static NTSTATUS DRSUAPI_INTER_DOMAIN_MOVE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_INTER_DOMAIN_MOVE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_INTER_DOMAIN_MOVE *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -182,7 +180,7 @@ static NTSTATUS DRSUAPI_INTER_DOMAIN_MOVE(struct dcesrv_call_state *dce_call, TA /* DRSUAPI_GET_NT4_CHANGELOG */ -static NTSTATUS DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_GET_NT4_CHANGELOG *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -192,13 +190,13 @@ static NTSTATUS DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TA /* drsuapi_DsCrackNames => drsuapip_cracknames.c */ -static NTSTATUS (*drsuapi_DsCrackNames)(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR (*drsuapi_DsCrackNames)(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct drsuapi_DsCrackNames *r) = dcesrv_drsuapi_DsCrackNames; /* DRSUAPI_WRITE_SPN */ -static NTSTATUS DRSUAPI_WRITE_SPN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_WRITE_SPN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_WRITE_SPN *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -208,7 +206,7 @@ static NTSTATUS DRSUAPI_WRITE_SPN(struct dcesrv_call_state *dce_call, TALLOC_CTX /* DRSUAPI_REMOVE_DS_SERVER */ -static NTSTATUS DRSUAPI_REMOVE_DS_SERVER(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_REMOVE_DS_SERVER(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_REMOVE_DS_SERVER *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -218,7 +216,7 @@ static NTSTATUS DRSUAPI_REMOVE_DS_SERVER(struct dcesrv_call_state *dce_call, TAL /* DRSUAPI_REMOVE_DS_DOMAIN */ -static NTSTATUS DRSUAPI_REMOVE_DS_DOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_REMOVE_DS_DOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_REMOVE_DS_DOMAIN *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -228,7 +226,7 @@ static NTSTATUS DRSUAPI_REMOVE_DS_DOMAIN(struct dcesrv_call_state *dce_call, TAL /* drsuapi_DsGetDomainControllerInfo */ -static NTSTATUS drsuapi_DsGetDomainControllerInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR drsuapi_DsGetDomainControllerInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct drsuapi_DsGetDomainControllerInfo *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -238,7 +236,7 @@ static NTSTATUS drsuapi_DsGetDomainControllerInfo(struct dcesrv_call_state *dce_ /* DRSUAPI_ADD_ENTRY */ -static NTSTATUS DRSUAPI_ADD_ENTRY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_ADD_ENTRY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_ADD_ENTRY *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -248,7 +246,7 @@ static NTSTATUS DRSUAPI_ADD_ENTRY(struct dcesrv_call_state *dce_call, TALLOC_CTX /* DRSUAPI_EXECUTE_KCC */ -static NTSTATUS DRSUAPI_EXECUTE_KCC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_EXECUTE_KCC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_EXECUTE_KCC *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -258,7 +256,7 @@ static NTSTATUS DRSUAPI_EXECUTE_KCC(struct dcesrv_call_state *dce_call, TALLOC_C /* DRSUAPI_GET_REPL_INFO */ -static NTSTATUS DRSUAPI_GET_REPL_INFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_GET_REPL_INFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_GET_REPL_INFO *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -268,7 +266,7 @@ static NTSTATUS DRSUAPI_GET_REPL_INFO(struct dcesrv_call_state *dce_call, TALLOC /* DRSUAPI_ADD_SID_HISTORY */ -static NTSTATUS DRSUAPI_ADD_SID_HISTORY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_ADD_SID_HISTORY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_ADD_SID_HISTORY *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -278,7 +276,7 @@ static NTSTATUS DRSUAPI_ADD_SID_HISTORY(struct dcesrv_call_state *dce_call, TALL /* DRSUAPI_GET_MEMBERSHIPS2 */ -static NTSTATUS DRSUAPI_GET_MEMBERSHIPS2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_GET_MEMBERSHIPS2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_GET_MEMBERSHIPS2 *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -288,7 +286,7 @@ static NTSTATUS DRSUAPI_GET_MEMBERSHIPS2(struct dcesrv_call_state *dce_call, TAL /* DRSUAPI_REPLICA_VERIFY_OBJECTS */ -static NTSTATUS DRSUAPI_REPLICA_VERIFY_OBJECTS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_REPLICA_VERIFY_OBJECTS *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -298,7 +296,7 @@ static NTSTATUS DRSUAPI_REPLICA_VERIFY_OBJECTS(struct dcesrv_call_state *dce_cal /* DRSUAPI_GET_OBJECT_EXISTENCE */ -static NTSTATUS DRSUAPI_GET_OBJECT_EXISTENCE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_GET_OBJECT_EXISTENCE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_GET_OBJECT_EXISTENCE *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); @@ -308,7 +306,7 @@ static NTSTATUS DRSUAPI_GET_OBJECT_EXISTENCE(struct dcesrv_call_state *dce_call, /* DRSUAPI_QUERY_SITES_BY_COST */ -static NTSTATUS DRSUAPI_QUERY_SITES_BY_COST(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +static WERROR DRSUAPI_QUERY_SITES_BY_COST(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct DRSUAPI_QUERY_SITES_BY_COST *r) { DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); diff --git a/source4/rpc_server/drsuapi/drsuapi_cracknames.c b/source4/rpc_server/drsuapi/drsuapi_cracknames.c index 1a31d541ba..45b1b362c7 100644 --- a/source4/rpc_server/drsuapi/drsuapi_cracknames.c +++ b/source4/rpc_server/drsuapi/drsuapi_cracknames.c @@ -26,7 +26,7 @@ #include "rpc_server/drsuapi/dcesrv_drsuapi.h" -static NTSTATUS DsCrackNameOneName(struct drsuapi_bind_state *b_state, TALLOC_CTX *mem_ctx, +static WERROR DsCrackNameOneName(struct drsuapi_bind_state *b_state, TALLOC_CTX *mem_ctx, uint32 format_offered, uint32 format_desired, const char *name, struct drsuapi_DsNameInfo1 *info1) { @@ -41,53 +41,53 @@ static NTSTATUS DsCrackNameOneName(struct drsuapi_bind_state *b_state, TALLOC_CT char *str; str = talloc_asprintf(mem_ctx, "%s/", lp_realm()); - NTSTATUS_TALLOC_CHECK(str); + WERR_TALLOC_CHECK(str); ret = strcasecmp(str, name); talloc_free(str); if (ret != 0) { info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND; - return NT_STATUS_OK; + return WERR_OK; } info1->status = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY; info1->dns_domain_name = talloc_asprintf(mem_ctx, "%s", lp_realm()); - NTSTATUS_TALLOC_CHECK(info1->dns_domain_name); + WERR_TALLOC_CHECK(info1->dns_domain_name); switch (format_desired) { case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT: info1->status = DRSUAPI_DS_NAME_STATUS_OK; info1->result_name = talloc_asprintf(mem_ctx, "%s\\", lp_workgroup()); - NTSTATUS_TALLOC_CHECK(info1->result_name); - return NT_STATUS_OK; + WERR_TALLOC_CHECK(info1->result_name); + return WERR_OK; default: - return NT_STATUS_OK; + return WERR_OK; } - return NT_STATUS_INVALID_PARAMETER; + return WERR_INVALID_PARAM; } default: { info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND; - return NT_STATUS_OK; + return WERR_OK; } } - return NT_STATUS_INVALID_PARAMETER; + return WERR_INVALID_PARAM; } /* drsuapi_DsCrackNames */ -NTSTATUS dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, +WERROR dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct drsuapi_DsCrackNames *r) { - NTSTATUS status; + WERROR status; struct drsuapi_bind_state *b_state; struct dcesrv_handle *h; r->out.level = r->in.level; ZERO_STRUCT(r->out.ctr); - DCESRV_PULL_HANDLE(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE); + DCESRV_PULL_HANDLE_WERR(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE); b_state = h->data; switch (r->in.level) { @@ -97,14 +97,14 @@ NTSTATUS dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_ int i; r->out.ctr.ctr1 = talloc_p(mem_ctx, struct drsuapi_DsNameCtr1); - NTSTATUS_TALLOC_CHECK(r->out.ctr.ctr1); + WERR_TALLOC_CHECK(r->out.ctr.ctr1); r->out.ctr.ctr1->count = 0; r->out.ctr.ctr1->array = NULL; count = r->in.req.req1.count; names = talloc_array_p(mem_ctx, struct drsuapi_DsNameInfo1, count); - NTSTATUS_TALLOC_CHECK(names); + WERR_TALLOC_CHECK(names); for (i=0; i < count; i++) { status = DsCrackNameOneName(b_state, mem_ctx, @@ -112,7 +112,7 @@ NTSTATUS dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_ r->in.req.req1.format_desired, r->in.req.req1.names[i].str, &names[i]); - if (!NT_STATUS_IS_OK(status)) { + if (!W_ERROR_IS_OK(status)) { return status; } } @@ -120,9 +120,9 @@ NTSTATUS dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_ r->out.ctr.ctr1->count = count; r->out.ctr.ctr1->array = names; - return NT_STATUS_OK; + return WERR_OK; } } - return NT_STATUS_INVALID_LEVEL; + return WERR_UNKNOWN_LEVEL; } diff --git a/source4/torture/rpc/drsuapi.c b/source4/torture/rpc/drsuapi.c index a387aaa337..be1582e57f 100644 --- a/source4/torture/rpc/drsuapi.c +++ b/source4/torture/rpc/drsuapi.c @@ -34,13 +34,18 @@ static BOOL test_DsBind(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.bind_info = NULL; r.out.bind_handle = bind_handle; + printf("testing DsBind\n"); + status = dcerpc_drsuapi_DsBind(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsBind failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsBind failed - %s\n", errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsBind failed - %s\n", win_errstr(r.out.result)); ret = False; } @@ -72,13 +77,19 @@ static BOOL test_DsCrackNames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.req.req1.format_desired = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT; names[0].str = talloc_asprintf(mem_ctx, "%s/", lp_realm()); + printf("testing DsCrackNames with name '%s' desired format:%d\n", + names[0].str, r.in.req.req1.format_desired); + status = dcerpc_drsuapi_DsCrackNames(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsCrackNames failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsCrackNames failed - %s\n", errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsCrackNames failed - %s\n", win_errstr(r.out.result)); ret = False; } @@ -93,13 +104,19 @@ static BOOL test_DsCrackNames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.req.req1.format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779; names[0].str = nt4_domain; + printf("testing DsCrackNames with name '%s' desired format:%d\n", + names[0].str, r.in.req.req1.format_desired); + status = dcerpc_drsuapi_DsCrackNames(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsCrackNames failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsCrackNames failed - %s\n", errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsCrackNames failed - %s\n", win_errstr(r.out.result)); ret = False; } @@ -113,13 +130,19 @@ static BOOL test_DsCrackNames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.req.req1.format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779; names[0].str = talloc_asprintf(mem_ctx, "%s%s$", nt4_domain, dcerpc_server_name(p)); + printf("testing DsCrackNames with name '%s' desired format:%d\n", + names[0].str, r.in.req.req1.format_desired); + status = dcerpc_drsuapi_DsCrackNames(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsCrackNames failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsCrackNames failed - %s\n", errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsCrackNames failed - %s\n", win_errstr(r.out.result)); ret = False; } @@ -133,13 +156,19 @@ static BOOL test_DsCrackNames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.req.req1.format_desired = DRSUAPI_DS_NAME_FORMAT_CANONICAL; names[0].str = FQDN_1779_name; + printf("testing DsCrackNames with name '%s' desired format:%d\n", + names[0].str, r.in.req.req1.format_desired); + status = dcerpc_drsuapi_DsCrackNames(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsCrackNames failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsCrackNames failed - %s\n", errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsCrackNames failed - %s\n", win_errstr(r.out.result)); ret = False; } @@ -149,13 +178,19 @@ static BOOL test_DsCrackNames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.req.req1.format_desired = DRSUAPI_DS_NAME_FORMAT_DISPLAY; + printf("testing DsCrackNames with name '%s' desired format:%d\n", + names[0].str, r.in.req.req1.format_desired); + status = dcerpc_drsuapi_DsCrackNames(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsCrackNames failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsCrackNames failed - %s\n", errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsCrackNames failed - %s\n", win_errstr(r.out.result)); ret = False; } @@ -165,13 +200,19 @@ static BOOL test_DsCrackNames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.req.req1.format_desired = DRSUAPI_DS_NAME_FORMAT_GUID; + printf("testing DsCrackNames with name '%s' desired format:%d\n", + names[0].str, r.in.req.req1.format_desired); + status = dcerpc_drsuapi_DsCrackNames(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsCrackNames failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsCrackNames failed - %s\n", errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsCrackNames failed - %s\n", win_errstr(r.out.result)); ret = False; } @@ -181,13 +222,19 @@ static BOOL test_DsCrackNames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.req.req1.format_desired = DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL; + printf("testing DsCrackNames with name '%s' desired format:%d\n", + names[0].str, r.in.req.req1.format_desired); + status = dcerpc_drsuapi_DsCrackNames(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsCrackNames failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsCrackNames failed - %s\n", errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsCrackNames failed - %s\n", win_errstr(r.out.result)); ret = False; } @@ -197,13 +244,19 @@ static BOOL test_DsCrackNames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.req.req1.format_desired = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL; + printf("testing DsCrackNames with name '%s' desired format:%d\n", + names[0].str, r.in.req.req1.format_desired); + status = dcerpc_drsuapi_DsCrackNames(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsCrackNames failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsCrackNames failed - %s\n", errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsCrackNames failed - %s\n", win_errstr(r.out.result)); ret = False; } @@ -223,72 +276,118 @@ static BOOL test_DsGetDCInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.bind_handle = bind_handle; r.in.level = 1; + r.in.req.req1.domain_name = talloc_strdup(mem_ctx, lp_realm()); r.in.req.req1.level = 1; + printf("testing DsGetDomainControllerInfo level %d on domainname '%s'\n", + r.in.req.req1.level, r.in.req.req1.domain_name); + status = dcerpc_drsuapi_DsGetDomainControllerInfo(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsGetDomainControllerInfo failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsGetDomainControllerInfo level %d\n" + " with dns domain failed - %s\n", + r.in.req.req1.level, errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsGetDomainControllerInfo level %d\n" + " with dns domain failed - %s\n", + r.in.req.req1.level, win_errstr(r.out.result)); ret = False; } r.in.req.req1.level = 2; + printf("testing DsGetDomainControllerInfo level %d on domainname '%s'\n", + r.in.req.req1.level, r.in.req.req1.domain_name); + status = dcerpc_drsuapi_DsGetDomainControllerInfo(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsGetDomainControllerInfo failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsGetDomainControllerInfo level %d\n" + " with dns domain failed - %s\n", + r.in.req.req1.level, errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsGetDomainControllerInfo level %d\n" + " with dns domain failed - %s\n", + r.in.req.req1.level, win_errstr(r.out.result)); ret = False; } r.in.req.req1.level = -1; + printf("testing DsGetDomainControllerInfo level %d on domainname '%s'\n", + r.in.req.req1.level, r.in.req.req1.domain_name); + status = dcerpc_drsuapi_DsGetDomainControllerInfo(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsGetDomainControllerInfo failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsGetDomainControllerInfo level %d\n" + " with dns domain failed - %s\n", + r.in.req.req1.level, errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsGetDomainControllerInfo level %d\n" + " with dns domain failed - %s\n", + r.in.req.req1.level, win_errstr(r.out.result)); ret = False; } r.in.req.req1.domain_name = talloc_strdup(mem_ctx, lp_workgroup()); r.in.req.req1.level = 2; + printf("testing DsGetDomainControllerInfo level %d on domainname '%s'\n", + r.in.req.req1.level, r.in.req.req1.domain_name); + status = dcerpc_drsuapi_DsGetDomainControllerInfo(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsGetDomainControllerInfo failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsGetDomainControllerInfo level %d\n" + " with netbios domain failed - %s\n", + r.in.req.req1.level, errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsGetDomainControllerInfo level %d\n" + " with netbios domain failed - %s\n", + r.in.req.req1.level, win_errstr(r.out.result)); ret = False; } r.in.req.req1.domain_name = "__UNKNOWN_DOMAIN__"; r.in.req.req1.level = 2; + printf("testing DsGetDomainControllerInfo level %d on domainname '%s'\n", + r.in.req.req1.level, r.in.req.req1.domain_name); + status = dcerpc_drsuapi_DsGetDomainControllerInfo(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - - if (!NT_STATUS_EQUAL(status, NT_STATUS(0x0000208d))) { - printf("drsuapi_DsGetDomainControllerInfo level %d with invalid domain name\n" - " - %s != NTSTATUS[0x0000208d]\n", - r.in.req.req1.level, errstr); - ret = False; - } + printf("dcerpc_drsuapi_DsGetDomainControllerInfo level %d\n" + " with invalid domain failed - %s\n", + r.in.req.req1.level, errstr); + ret = False; + } else if (!W_ERROR_EQUAL(r.out.result, WERR_DS_OBJ_NOT_FOUND)) { + printf("DsGetDomainControllerInfo level %d\n" + " with invalid domain not expected error (WERR_DS_OBJ_NOT_FOUND) - %s\n", + r.in.req.req1.level, win_errstr(r.out.result)); + ret = False; } return ret; @@ -304,13 +403,18 @@ static BOOL test_DsUnbind(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.bind_handle = bind_handle; r.out.bind_handle = bind_handle; + printf("testing DsUnbind\n"); + status = dcerpc_drsuapi_DsUnbind(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { const char *errstr = nt_errstr(status); if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { errstr = dcerpc_errstr(mem_ctx, p->last_fault_code); } - printf("drsuapi_DsUnbind failed - %s\n", errstr); + printf("dcerpc_drsuapi_DsUnbind failed - %s\n", errstr); + ret = False; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("DsBind failed - %s\n", win_errstr(r.out.result)); ret = False; } |