The branch, master has been updated via d1c30ab lib: call_backtrace() is no more via d978e05 librpc: add clusapi_ResourceControlCode to IDL. via f9788a8 s4-torture: also test CLUSCTL_CLUSTER_CHECK_VOTER_DOWN. via 4075d1c s4-torture: add test for CreateGroupEnum. via 8142b38 librpc: add ClusterResTypeEnumType to IDL. via 8ce0aae s4-torture: add test for CreateResTypeEnum(). via 31d0ef9 s4-torture: test CLUSCTL_GROUP_GET_FLAGS GroupControl. via de11f1b librpc: add CLUS_RESOURCE_CLASS_INFO to IDL via 058032c s4-torture: add test for clusapi_CreateGroupResourceEnum via 6fe2a2b librpc: add ClusterGroupEnumType enum to IDL. via 6ee7617 s4-torture: add new tests for clusapi resourcetypes. via 71d3abb s4-torture: Fix logic errors in node and group control clusapi tests. via 04d5a22 librpc: add clusapi_ResourceTypeControlCode enum. via be9a44a s4-torture: test multiple different cluster control codes. from 82778a6 pidl: fix field2name wireshark dissector test.
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit d1c30aba04dd25fd9abc04005c9aff300ca79c4a Author: Volker Lendecke <v...@samba.org> Date: Tue Sep 6 11:46:39 2016 +0200 lib: call_backtrace() is no more Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Martin Schwenke <mar...@meltin.net> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Thu Sep 8 03:51:34 CEST 2016 on sn-devel-144 commit d978e058a5131c98a32dda2992b406042990eaa0 Author: Günther Deschner <g...@samba.org> Date: Wed May 11 14:18:02 2016 +0200 librpc: add clusapi_ResourceControlCode to IDL. Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit f9788a84247f5709a1df65cc2cd7ab83d658a693 Author: Günther Deschner <g...@samba.org> Date: Sat May 7 01:24:28 2016 +0200 s4-torture: also test CLUSCTL_CLUSTER_CHECK_VOTER_DOWN. Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4075d1c2640c7d20aa7b862a637ba05eaaf07701 Author: Günther Deschner <g...@samba.org> Date: Wed May 4 01:34:20 2016 +0200 s4-torture: add test for CreateGroupEnum. Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 8142b38c02a73e2f873d5172394dbe93c0783a52 Author: Günther Deschner <g...@samba.org> Date: Wed May 4 00:40:10 2016 +0200 librpc: add ClusterResTypeEnumType to IDL. Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 8ce0aaef505ddfc3df87ce159c38773becfa42e1 Author: Günther Deschner <g...@samba.org> Date: Wed May 4 00:39:48 2016 +0200 s4-torture: add test for CreateResTypeEnum(). Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 31d0ef96f8e91d74015eed09d4ae9b8d3312a01c Author: Günther Deschner <g...@samba.org> Date: Tue May 3 17:38:29 2016 +0200 s4-torture: test CLUSCTL_GROUP_GET_FLAGS GroupControl. Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit de11f1b32b0ed75a3227ef3a10d744224dec06dd Author: Günther Deschner <g...@samba.org> Date: Tue May 3 17:18:40 2016 +0200 librpc: add CLUS_RESOURCE_CLASS_INFO to IDL Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 058032c58b5c0d76bb2d491c862f123d76afd5c9 Author: Günther Deschner <g...@samba.org> Date: Tue May 3 12:59:24 2016 +0200 s4-torture: add test for clusapi_CreateGroupResourceEnum Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 6fe2a2bb9d6786e4977aad2b0ae75c48f05f3ea5 Author: Günther Deschner <g...@samba.org> Date: Tue May 3 12:58:07 2016 +0200 librpc: add ClusterGroupEnumType enum to IDL. Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 6ee7617207a1fef04245be86ba14ebcb65982181 Author: Günther Deschner <g...@samba.org> Date: Tue May 3 11:19:38 2016 +0200 s4-torture: add new tests for clusapi resourcetypes. Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 71d3abbdc45ba5b5a1bcafa98949a89968dbb0fc Author: Günther Deschner <g...@samba.org> Date: Mon May 2 17:53:38 2016 +0200 s4-torture: Fix logic errors in node and group control clusapi tests. Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 04d5a228c0fa6433909763b0c6cd70607f056d17 Author: Günther Deschner <g...@samba.org> Date: Mon May 2 17:07:04 2016 +0200 librpc: add clusapi_ResourceTypeControlCode enum. Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit be9a44a0f0e7f7195e9cb8805cbff207e9ec405c Author: Günther Deschner <g...@samba.org> Date: Mon May 2 14:53:13 2016 +0200 s4-torture: test multiple different cluster control codes. Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/util/samba_util.h | 2 - librpc/idl/clusapi.idl | 133 +++++++++++- source4/torture/rpc/clusapi.c | 490 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 611 insertions(+), 14 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h index c339161..416fde8 100644 --- a/lib/util/samba_util.h +++ b/lib/util/samba_util.h @@ -66,8 +66,6 @@ extern const char *panic_action; /** * Write backtrace to debug log */ -_PUBLIC_ void call_backtrace(void); - _PUBLIC_ void dump_core_setup(const char *progname, const char *logfile); /** diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl index 8c4a227..6c86f10 100644 --- a/librpc/idl/clusapi.idl +++ b/librpc/idl/clusapi.idl @@ -791,10 +791,15 @@ import "winreg.idl", "misc.idl"; /*****************/ /* Function 0x35 */ + typedef [bitmap32bit] bitmap { + CLUSTER_GROUP_ENUM_CONTAINS = 0x00000001, + CLUSTER_GROUP_ENUM_NODES = 0x00000002 + } ClusterGroupEnumType; + WERROR clusapi_CreateGroupResourceEnum( [ in ] HGROUP_RPC hGroup, - [ in ] uint32 dwType, + [ in ] ClusterGroupEnumType dwType, [ out ] ENUM_LIST **ReturnEnum, [ out ] WERROR *rpc_status ); @@ -1042,10 +1047,83 @@ import "winreg.idl", "misc.idl"; /*****************/ /* Function 0x49 */ + typedef [v1_enum] enum { + CLUS_RESCLASS_UNKNOWN = 0x00000000, + CLUS_RESCLASS_STORAGE = 0x00000001, + CLUS_RESCLASS_NETWORK = 0x00000002 + } clusapi_ResourceClass; + + typedef [public] struct { + clusapi_ResourceClass Class; + uint32 SubClass; + } CLUS_RESOURCE_CLASS_INFO; + + typedef [v1_enum] enum { + CLUSCTL_RESOURCE_UNKNOWN = 0x01000000, + CLUSCTL_RESOURCE_GET_CHARACTERISTICS = 0x01000005, + CLUSCTL_RESOURCE_GET_FLAGS = 0x01000009, + CLUSCTL_RESOURCE_GET_CLASS_INFO = 0x0100000D, + CLUSCTL_RESOURCE_GET_REQUIRED_DEPENDENCIES = 0x01000011, + CLUSCTL_RESOURCE_GET_NAME = 0x01000029, + CLUSCTL_RESOURCE_GET_RESOURCE_TYPE = 0x0100002D, + CLUSCTL_RESOURCE_GET_ID = 0x01000039, + CLUSCTL_RESOURCE_ENUM_COMMON_PROPERTIES = 0x01000051, + CLUSCTL_RESOURCE_GET_RO_COMMON_PROPERTIES = 0x01000055, + CLUSCTL_RESOURCE_GET_COMMON_PROPERTIES = 0x01000059, + CLUSCTL_RESOURCE_SET_COMMON_PROPERTIES = 0x0140005E, + CLUSCTL_RESOURCE_VALIDATE_COMMON_PROPERTIES = 0x01000061, + CLUSCTL_RESOURCE_GET_COMMON_PROPERTY_FMTS = 0x01000065, + CLUSCTL_RESOURCE_ENUM_PRIVATE_PROPERTIES = 0x01000079, + CLUSCTL_RESOURCE_GET_RO_PRIVATE_PROPERTIES = 0x0100007D, + CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTIES = 0x01000081, + CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES = 0x01400086, + CLUSCTL_RESOURCE_VALIDATE_PRIVATE_PROPERTIES = 0x01000089, + CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTY_FMTS = 0x0100008D, + CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT = 0x014000A2, + CLUSCTL_RESOURCE_DELETE_REGISTRY_CHECKPOINT = 0x014000A6, + CLUSCTL_RESOURCE_GET_REGISTRY_CHECKPOINTS = 0x010000A9, + CLUSCTL_RESOURCE_ADD_CRYPTO_CHECKPOINT = 0x014000AE, + CLUSCTL_RESOURCE_DELETE_CRYPTO_CHECKPOINT = 0x014000B2, + CLUSCTL_RESOURCE_GET_CRYPTO_CHECKPOINTS = 0x010000B5, + CLUSCTL_RESOURCE_UPGRADE_DLL = 0x014000BA, + CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT_64BIT = 0x014000BE, + CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT_32BIT = 0x014000C2, + CLUSCTL_RESOURCE_GET_NETWORK_NAME = 0x01000169, + CLUSCTL_RESOURCE_NETNAME_REGISTER_DNS_RECORDS = 0x01000172, + CLUSCTL_RESOURCE_GET_DNS_NAME = 0x01000175, + CLUSCTL_RESOURCE_NETNAME_SET_PWD_INFO = 0x0100017A, + CLUSCTL_RESOURCE_NETNAME_DELETE_CO = 0x0100017E, + CLUSCTL_RESOURCE_NETNAME_VALIDATE_VCO = 0x01000181, + CLUSCTL_RESOURCE_NETNAME_RESET_VCO = 0x01000185, + CLUSCTL_RESOURCE_NETNAME_CREDS_UPDATED = 0x01c0018a, + CLUSCTL_RESOURCE_STORAGE_GET_DISK_INFO = 0x01000191, + CLUSCTL_RESOURCE_STORAGE_IS_PATH_VALID = 0x01000199, + CLUSCTL_RESOURCE_IPADDRESS_RENEW_LEASE = 0x014001BE, + CLUSCTL_RESOURCE_IPADDRESS_RELEASE_LEASE = 0x014001C2, + CLUSCTL_RESOURCE_QUERY_MAINTENANCE_MODE = 0x010001E1, + CLUSCTL_RESOURCE_SET_MAINTENANCE_MODE = 0x014001E6, + CLUSCTL_RESOURCE_STORAGE_SET_DRIVELETTER = 0x014001EA, + CLUSCTL_RESOURCE_STORAGE_GET_DISK_INFO_EX = 0x010001F1, + CLUSCTL_RESOURCE_STORAGE_GET_DIRTY = 0x01000219, + CLUSCTL_RESOURCE_STORAGE_GET_MOUNTPOINTS = 0x01000211, + CLUSCTL_RESOURCE_STORAGE_GET_SHARED_VOLUME_INFO = 0x01000225, + CLUSCTL_RESOURCE_VM_START_MIGRATION = 0x01600004, + CLUSCTL_RESOURCE_VM_CANCEL_MIGRATION = 0x01600008, + CLUSCTL_RESOURCE_SET_CSV_MAINTENANCE_MODE = 0x01400296, + CLUSCTL_RESOURCE_ENABLE_SHARED_VOLUME_DIRECTIO = 0x0140028a, + CLUSCTL_RESOURCE_DISABLE_SHARED_VOLUME_DIRECTIO = 0x0140028e, + CLUSCTL_RESOURCE_SET_SHARED_VOLUME_BACKUP_MODE = 0x0140029a, + CLUSCTL_RESOURCE_GET_RELATED_RESOURCE_NAMES = 0x01001fad, + CLUSCTL_RESOURCE_POOL_GET_DRIVE_INFO = 0x010002b5, + CLUSCTL_RESOURCE_CLOUD_WITNESS_UPDATE_TOKEN = 0x014020e6, + CLUSCTL_RESOURCE_NETNAME_CHECK_OU_PERMISSIONS = 0x07002121, + CLUSCTL_RESOURCE_NETNAME_CHECK_AD_STATE = 0x07002125 + } clusapi_ResourceControlCode; + WERROR clusapi_ResourceControl( [ in ] HRES_RPC hResource, - [ in ] uint32 dwControlCode, + [ in ] clusapi_ResourceControlCode dwControlCode, [ in, unique, size_is(nInBufferSize) ] uint8 *lpInBuffer, [ in ] uint32 nInBufferSize, [ out, size_is(nOutBufferSize), @@ -1078,11 +1156,53 @@ import "winreg.idl", "misc.idl"; /*****************/ /* Function 0x4B */ + typedef [v1_enum] enum { + CLUSCTL_RESOURCE_TYPE_UNKNOWN = 0x02000000, + CLUSCTL_RESOURCE_TYPE_GET_CHARACTERISTICS = 0x02000005, + CLUSCTL_RESOURCE_TYPE_GET_FLAGS = 0x02000009, + CLUSCTL_RESOURCE_TYPE_GET_CLASS_INFO = 0x0200000D, + CLUSCTL_RESOURCE_TYPE_GET_REQUIRED_DEPENDENCIES = 0x02000011, + CLUSCTL_RESOURCE_TYPE_GET_ARB_TIMEOUT = 0x02000015, + CLUSCTL_RESOURCE_TYPE_ENUM_COMMON_PROPERTIES = 0x02000051, + CLUSCTL_RESOURCE_TYPE_GET_RO_COMMON_PROPERTIES = 0x02000055, + CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTIES = 0x02000059, + CLUSCTL_RESOURCE_TYPE_SET_COMMON_PROPERTIES = 0x0240005E, + CLUSCTL_RESOURCE_TYPE_VALIDATE_COMMON_PROPERTIES = 0x02000061, + CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTY_FMTS = 0x02000065, + CLUSCTL_RESOURCE_TYPE_GET_COMMON_RESOURCE_PROPERTY_FMTS = 0x02000069, + CLUSCTL_RESOURCE_TYPE_ENUM_PRIVATE_PROPERTIES = 0x02000079, + CLUSCTL_RESOURCE_TYPE_GET_RO_PRIVATE_PROPERTIES = 0x0200007D, + CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTIES = 0x02000081, + CLUSCTL_RESOURCE_TYPE_SET_PRIVATE_PROPERTIES = 0x02400086, + CLUSCTL_RESOURCE_TYPE_VALIDATE_PRIVATE_PROPERTIES = 0x02000089, + CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTY_FMTS = 0x0200008D, + CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_RESOURCE_PROPERTY_FMTS= 0x02000091, + CLUSCTL_RESOURCE_TYPE_STORAGE_GET_AVAILABLE_DISKS = 0x02000195, + CLUSCTL_RESOURCE_TYPE_NETNAME_VALIDATE_NETNAME = 0x02000235, + CLUSCTL_RESOURCE_TYPE_VALIDATE_PATH = 0x02000231, + CLUSCTL_RESOURCE_TYPE_GEN_APP_VALIDATE_DIRECTORY = 0x02000239, + CLUSCTL_RESOURCE_TYPE_STORAGE_GET_DRIVELETTERS = 0x020001ED, + CLUSCTL_RESOURCE_TYPE_STORAGE_GET_AVAILABLE_DISKS_EX = 0x020001F5, + CLUSCTL_RESOURCE_TYPE_STORAGE_REMAP_DRIVELETTER = 0x02000201, + CLUSCTL_RESOURCE_TYPE_STORAGE_GET_DISKID = 0x02000205, + CLUSCTL_RESOURCE_TYPE_STORAGE_IS_CLUSTERABLE = 0x02000209, + CLUSCTL_RESOURCE_TYPE_STORAGE_RELEASE_OWNERSHIP = 0x0240020E, + CLUSCTL_RESOURCE_TYPE_STORAGE_IS_CSV_FILE = 0x1000229, + CLUSCTL_RESOURCE_TYPE_CLOUD_WITNESS_VALIDATE_CREDENTIALS= 0x020020e1, + CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_ELIGIBLE_LOGDISKS = 0x02002149, + CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_ELIGIBLE_TARGET_DATADISKS = 0x0200214D, + CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_ELIGIBLE_SOURCE_DATADISKS = 0x02002151, + CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_REPLICA_VOLUMES = 0x02002159, + CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_LOG_VOLUME = 0x0200215D, + CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_REPLICATED_DISKS = 0x02002155, + CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_RESOURCE_GROUP = 0x02002161 + } clusapi_ResourceTypeControlCode; + WERROR clusapi_ResourceTypeControl( [ in ] HCLUSTER_RPC hCluster, [ in, string ] [charset(UTF16)] uint16 *lpszResourceTypeName, - [ in ] uint32 dwControlCode, + [ in ] clusapi_ResourceTypeControlCode dwControlCode, [ in, unique, size_is(nInBufferSize) ] uint8 *lpInBuffer, [ in ] uint32 nInBufferSize, [ out, size_is(nOutBufferSize), @@ -1507,10 +1627,15 @@ import "winreg.idl", "misc.idl"; /*****************/ /* Function 0x67 */ + typedef [bitmap32bit] bitmap { + CLUSTER_RESOURCE_TYPE_ENUM_NODES = 0x00000001, + CLUSTER_RESOURCE_TYPE_ENUM_RESOURCES = 0x00000002 + } ClusterResTypeEnumType; + WERROR clusapi_CreateResTypeEnum( [ in, string ] [charset(UTF16)] uint16 *lpszTypeName, - [ in ] uint32 dwType, + [ in ] ClusterResTypeEnumType dwType, [ out ] ENUM_LIST **ReturnEnum, [ out ] WERROR *rpc_status ); diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c index d59f24f..eebfa38 100644 --- a/source4/torture/rpc/clusapi.c +++ b/source4/torture/rpc/clusapi.c @@ -1148,6 +1148,129 @@ static bool test_GetResourceNetworkName(struct torture_context *tctx, return ret; } +static bool test_ResourceTypeControl_int(struct torture_context *tctx, + struct dcerpc_pipe *p, + struct policy_handle *Cluster, + const char *resource_type, + enum clusapi_ClusterControlCode dwControlCode) +{ + struct dcerpc_binding_handle *b = p->binding_handle; + struct clusapi_ResourceTypeControl r; + uint32_t lpBytesReturned; + uint32_t lpcbRequired; + WERROR rpc_status; + + r.in.hCluster = *Cluster; + r.in.lpszResourceTypeName = resource_type; + r.in.dwControlCode = 0; + r.in.lpInBuffer = NULL; + r.in.nInBufferSize = 0; + r.in.nOutBufferSize = 0; + r.out.lpOutBuffer = NULL; + r.out.lpBytesReturned = &lpBytesReturned; + r.out.lpcbRequired = &lpcbRequired; + r.out.rpc_status = &rpc_status; + + torture_assert_ntstatus_ok(tctx, + dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r), + "ResourceTypeControl failed"); + + if (strequal(r.in.lpszResourceTypeName, "MSMQ") || + strequal(r.in.lpszResourceTypeName, "MSMQTriggers")) { + torture_assert_werr_equal(tctx, + r.out.result, + WERR_CLUSTER_RESTYPE_NOT_SUPPORTED, + "ResourceTypeControl failed"); + return true; + } + + torture_assert_werr_equal(tctx, + r.out.result, + WERR_INVALID_FUNCTION, + "ResourceTypeControl failed"); + + r.in.dwControlCode = dwControlCode; + + torture_assert_ntstatus_ok(tctx, + dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r), + "ResourceTypeControl failed"); + + if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) { + r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired); + r.in.nOutBufferSize = *r.out.lpcbRequired; + torture_assert_ntstatus_ok(tctx, + dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r), + "ResourceTypeControl failed"); + } + torture_assert_werr_ok(tctx, + r.out.result, + "ResourceTypeControl failed"); + + /* now try what happens when we query with a buffer large enough to hold + * the entire packet */ + + r.in.nOutBufferSize = 0x400; + r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize); + + torture_assert_ntstatus_ok(tctx, + dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r), + "ResourceTypeControl failed"); + torture_assert_werr_ok(tctx, + r.out.result, + "ResourceTypeControl failed"); + torture_assert(tctx, *r.out.lpBytesReturned < r.in.nOutBufferSize, + "lpBytesReturned expected to be smaller than input size nOutBufferSize"); + + return true; +} + +static bool test_ResourceTypeControl(struct torture_context *tctx, + struct dcerpc_pipe *p, + const char *resourcetype_name) +{ + struct policy_handle Cluster; + bool ret; + uint32_t control_codes[] = { + CLUSCTL_RESOURCE_TYPE_GET_CLASS_INFO, + CLUSCTL_RESOURCE_TYPE_GET_CHARACTERISTICS, + CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTIES, + CLUSCTL_RESOURCE_TYPE_GET_RO_COMMON_PROPERTIES, + CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTIES + }; + int i; + + if (!test_OpenCluster_int(tctx, p, &Cluster)) { + return false; + } + + for (i=0; i < ARRAY_SIZE(control_codes); i++) { + ret = test_ResourceTypeControl_int(tctx, p, &Cluster, + resourcetype_name, + control_codes[i]); + if (!ret) { + goto done; + } + } + + done: + test_CloseCluster_int(tctx, p, &Cluster); + + return ret; +} + + + +static bool test_one_resourcetype(struct torture_context *tctx, + struct dcerpc_pipe *p, + const char *resourcetype_name) +{ + torture_assert(tctx, + test_ResourceTypeControl(tctx, p, resourcetype_name), + "failed to query ResourceTypeControl"); + + return true; +} + static bool test_one_resource(struct torture_context *tctx, struct dcerpc_pipe *p, const char *resource_name) @@ -1224,6 +1347,44 @@ static bool test_all_resources(struct torture_context *tctx, return true; } +static bool test_all_resourcetypes(struct torture_context *tctx, + void *data) +{ + struct torture_clusapi_context *t = + talloc_get_type_abort(data, struct torture_clusapi_context); + struct dcerpc_binding_handle *b = t->p->binding_handle; + struct clusapi_CreateEnum r; + uint32_t dwType = CLUSTER_ENUM_RESTYPE; + struct ENUM_LIST *ReturnEnum; + WERROR rpc_status; + int i; + + r.in.dwType = dwType; + r.out.ReturnEnum = &ReturnEnum; + r.out.rpc_status = &rpc_status; + + torture_assert_ntstatus_ok(tctx, + dcerpc_clusapi_CreateEnum_r(b, tctx, &r), + "CreateEnum failed"); + torture_assert_werr_ok(tctx, + r.out.result, + "CreateEnum failed"); + + for (i=0; i < ReturnEnum->EntryCount; i++) { + + struct ENUM_ENTRY e = ReturnEnum->Entry[i]; + + torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_RESTYPE, "type mismatch"); + + torture_assert(tctx, + test_one_resourcetype(tctx, t->p, e.Name), + "failed to test one resourcetype"); + } + + return true; +} + + static bool test_OpenNode_int(struct torture_context *tctx, struct dcerpc_pipe *p, const char *lpszNodeName, @@ -1522,12 +1683,12 @@ static bool test_NodeControl(struct torture_context *tctx, } ret = test_NodeControl_int(tctx, t->p, &hNode, CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES); - if (ret) { + if (!ret) { return false; } ret = test_NodeControl_int(tctx, t->p, &hNode, CLUSCTL_NODE_GET_ID); - if (ret) { + if (!ret) { return false; } @@ -1993,6 +2154,60 @@ static bool test_GroupControl_int(struct torture_context *tctx, return true; } +static bool test_CreateGroupResourceEnum_int(struct torture_context *tctx, + struct dcerpc_pipe *p, + struct policy_handle *hGroup) +{ + struct dcerpc_binding_handle *b = p->binding_handle; + struct clusapi_CreateGroupResourceEnum r; + uint32_t dwType[] = { + CLUSTER_GROUP_ENUM_CONTAINS, + CLUSTER_GROUP_ENUM_NODES + }; + uint32_t dwType_invalid[] = { + 0x00000040, + 0x00000080, + 0x00000100 /* and many more ... */ + }; + struct ENUM_LIST *ReturnEnum; + WERROR rpc_status; + int i; + + r.in.hGroup = *hGroup; + + for (i=0; i < ARRAY_SIZE(dwType); i++) { + + r.in.hGroup = *hGroup; + r.in.dwType = dwType[i]; + r.out.ReturnEnum = &ReturnEnum; + r.out.rpc_status = &rpc_status; + + torture_assert_ntstatus_ok(tctx, + dcerpc_clusapi_CreateGroupResourceEnum_r(b, tctx, &r), + "CreateGroupResourceEnum failed"); + torture_assert_werr_ok(tctx, + r.out.result, + "CreateGroupResourceEnum failed"); + } + + for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) { + + r.in.dwType = dwType_invalid[i]; + r.out.ReturnEnum = &ReturnEnum; + r.out.rpc_status = &rpc_status; + + torture_assert_ntstatus_ok(tctx, + dcerpc_clusapi_CreateGroupResourceEnum_r(b, tctx, &r), + "CreateGroupResourceEnum failed"); + torture_assert_werr_ok(tctx, + r.out.result, + "CreateGroupResourceEnum failed"); + } + + return true; +} + + static bool test_GroupControl(struct torture_context *tctx, void *data) { @@ -2006,12 +2221,17 @@ static bool test_GroupControl(struct torture_context *tctx, } ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_CHARACTERISTICS); - if (ret) { + if (!ret) { return false; } ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_RO_COMMON_PROPERTIES); - if (ret) { + if (!ret) { + return false; + } + + ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_FLAGS); + if (!ret) { return false; } @@ -2122,6 +2342,14 @@ static bool test_one_group(struct torture_context *tctx, test_GetGroupState_int(tctx, p, &hGroup), "failed to query group id"); + torture_assert(tctx, + test_GroupControl_int(tctx, p, &hGroup, CLUSCTL_GROUP_GET_FLAGS), + "failed to query group control"); + + torture_assert(tctx, + test_CreateGroupResourceEnum_int(tctx, p, &hGroup), + "failed to query resource enum"); + test_CloseGroup_int(tctx, p, &hGroup); return true; @@ -2217,7 +2445,8 @@ static bool test_SetServiceAccountPassword(struct torture_context *tctx, static bool test_ClusterControl_int(struct torture_context *tctx, struct dcerpc_pipe *p, - struct policy_handle *Cluster) + struct policy_handle *Cluster, + enum clusapi_ClusterControlCode dwControlCode) { struct dcerpc_binding_handle *b = p->binding_handle; struct clusapi_ClusterControl r; @@ -2243,7 +2472,7 @@ static bool test_ClusterControl_int(struct torture_context *tctx, WERR_INVALID_FUNCTION, "ClusterControl failed"); - r.in.dwControlCode = CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES; + r.in.dwControlCode = dwControlCode; torture_assert_ntstatus_ok(tctx, dcerpc_clusapi_ClusterControl_r(b, tctx, &r), -- Samba Shared Repository