diff options
-rw-r--r-- | source3/lib/netapi/tests/netgroup.c | 223 |
1 files changed, 220 insertions, 3 deletions
diff --git a/source3/lib/netapi/tests/netgroup.c b/source3/lib/netapi/tests/netgroup.c index 51a21b3bf5..e43520ad1a 100644 --- a/source3/lib/netapi/tests/netgroup.c +++ b/source3/lib/netapi/tests/netgroup.c @@ -127,6 +127,152 @@ static NET_API_STATUS test_netgroupenum(const char *hostname, return 0; } +static NET_API_STATUS test_netgroupgetusers(const char *hostname, + uint32_t level, + const char *groupname, + const char *username) +{ + NET_API_STATUS status; + uint32_t entries_read = 0; + uint32_t total_entries = 0; + uint32_t resume_handle = 0; + int found_user = 0; + const char *current_name = NULL; + uint8_t *buffer = NULL; + int i; + + struct GROUP_USERS_INFO_0 *info0 = NULL; + struct GROUP_USERS_INFO_1 *info1 = NULL; + + printf("testing NetGroupGetUsers level %d\n", level); + + do { + status = NetGroupGetUsers(hostname, + groupname, + level, + &buffer, + (uint32_t)-1, + &entries_read, + &total_entries, + &resume_handle); + if (status == 0 || status == ERROR_MORE_DATA) { + + switch (level) { + case 0: + info0 = (struct GROUP_USERS_INFO_0 *)buffer; + break; + case 1: + info1 = (struct GROUP_USERS_INFO_1 *)buffer; + break; + default: + break; + } + for (i=0; i<entries_read; i++) { + switch (level) { + case 0: + current_name = info0->grui0_name; + break; + case 1: + current_name = info1->grui1_name; + break; + default: + break; + } + + if (username && strcasecmp(current_name, username) == 0) { + found_user = 1; + } + + switch (level) { + case 0: + info0++; + break; + case 1: + info1++; + break; + } + } + NetApiBufferFree(buffer); + } + } while (status == ERROR_MORE_DATA); + + if (status) { + return status; + } + + if (username && !found_user) { + printf("failed to get user\n"); + return -1; + } + + return 0; +} + +static NET_API_STATUS test_netgroupsetusers(const char *hostname, + const char *groupname, + uint32_t level, + size_t num_entries, + const char **names) +{ + NET_API_STATUS status; + uint8_t *buffer = NULL; + int i = 0; + size_t buf_size = 0; + + struct GROUP_USERS_INFO_0 *g0 = NULL; + struct GROUP_USERS_INFO_1 *g1 = NULL; + + printf("testing NetGroupSetUsers level %d\n", level); + + switch (level) { + case 0: + buf_size = sizeof(struct GROUP_USERS_INFO_0) * num_entries; + + status = NetApiBufferAllocate(buf_size, (void **)&g0); + if (status) { + goto out; + } + + for (i=0; i<num_entries; i++) { + g0[i].grui0_name = names[i]; + } + + buffer = (uint8_t *)g0; + break; + case 1: + buf_size = sizeof(struct GROUP_USERS_INFO_1) * num_entries; + + status = NetApiBufferAllocate(buf_size, (void **)&g1); + if (status) { + goto out; + } + + for (i=0; i<num_entries; i++) { + g1[i].grui1_name = names[i]; + } + + buffer = (uint8_t *)g1; + break; + default: + break; + } + + /* NetGroupSetUsers */ + + status = NetGroupSetUsers(hostname, + groupname, + level, + buffer, + num_entries); + if (status) { + goto out; + } + + out: + NetApiBufferFree(buffer); + return status; +} + NET_API_STATUS netapitest_group(struct libnetapi_ctx *ctx, const char *hostname) { @@ -137,6 +283,7 @@ NET_API_STATUS netapitest_group(struct libnetapi_ctx *ctx, uint32_t parm_err = 0; uint32_t levels[] = { 0, 1, 2, 3}; uint32_t enum_levels[] = { 0, 1, 2, 3}; + uint32_t getmem_levels[] = { 0, 1}; int i; printf("NetGroup tests\n"); @@ -201,9 +348,16 @@ NET_API_STATUS netapitest_group(struct libnetapi_ctx *ctx, printf("testing NetGroupSetInfo level 0\n"); status = NetGroupSetInfo(hostname, groupname, 0, (uint8_t *)&g0, &parm_err); - if (status) { - NETAPI_STATUS(ctx, status, "NetGroupSetInfo"); - goto out; + switch (status) { + case 0: + break; + case 50: /* not supported */ + case 124: /* not implemented */ + groupname2 = groupname; + goto skip_rename; + default: + NETAPI_STATUS(ctx, status, "NetGroupSetInfo"); + goto out; } /* should not exist anymore */ @@ -214,6 +368,7 @@ NET_API_STATUS netapitest_group(struct libnetapi_ctx *ctx, goto out; } + skip_rename: /* query info */ for (i=0; i<ARRAY_SIZE(levels); i++) { @@ -233,6 +388,17 @@ NET_API_STATUS netapitest_group(struct libnetapi_ctx *ctx, goto out; } + /* should not be member */ + + for (i=0; i<ARRAY_SIZE(getmem_levels); i++) { + + status = test_netgroupgetusers(hostname, getmem_levels[i], groupname2, NULL); + if (status) { + NETAPI_STATUS(ctx, status, "NetGroupGetUsers"); + goto out; + } + } + printf("testing NetGroupAddUser\n"); status = NetGroupAddUser(hostname, groupname2, username); @@ -241,6 +407,17 @@ NET_API_STATUS netapitest_group(struct libnetapi_ctx *ctx, goto out; } + /* should be member */ + + for (i=0; i<ARRAY_SIZE(getmem_levels); i++) { + + status = test_netgroupgetusers(hostname, getmem_levels[i], groupname2, username); + if (status) { + NETAPI_STATUS(ctx, status, "NetGroupGetUsers"); + goto out; + } + } + printf("testing NetGroupDelUser\n"); status = NetGroupDelUser(hostname, groupname2, username); @@ -249,6 +426,46 @@ NET_API_STATUS netapitest_group(struct libnetapi_ctx *ctx, goto out; } + /* should not be member */ + + status = test_netgroupgetusers(hostname, 0, groupname2, NULL); + if (status) { + NETAPI_STATUS(ctx, status, "NetGroupGetUsers"); + goto out; + } + + /* set it again via exlicit member set */ + + status = test_netgroupsetusers(hostname, groupname2, 0, 1, &username); + if (status) { + NETAPI_STATUS(ctx, status, "NetGroupSetUsers"); + goto out; + } + + /* should be member */ + + status = test_netgroupgetusers(hostname, 0, groupname2, username); + if (status) { + NETAPI_STATUS(ctx, status, "NetGroupGetUsers"); + goto out; + } +#if 0 + /* wipe out member list */ + + status = test_netgroupsetusers(hostname, groupname2, 0, 0, NULL); + if (status) { + NETAPI_STATUS(ctx, status, "NetGroupSetUsers"); + goto out; + } + + /* should not be member */ + + status = test_netgroupgetusers(hostname, 0, groupname2, NULL); + if (status) { + NETAPI_STATUS(ctx, status, "NetGroupGetUsers"); + goto out; + } +#endif status = NetUserDel(hostname, username); if (status) { NETAPI_STATUS(ctx, status, "NetUserDel"); |