diff options
| author | Günther Deschner <gd@samba.org> | 2008-10-23 23:13:09 +0200 | 
|---|---|---|
| committer | Günther Deschner <gd@samba.org> | 2008-10-24 00:06:33 +0200 | 
| commit | d27bc7377aaea09652d14d06ce70c98d8f618ca7 (patch) | |
| tree | 0ca34a8666d7bfbb5c500c8b127182e6f7aabcff /source3/lib | |
| parent | 3971492301d84d41942c4986eccebf1aa6557b46 (diff) | |
| download | samba-d27bc7377aaea09652d14d06ce70c98d8f618ca7.tar.gz samba-d27bc7377aaea09652d14d06ce70c98d8f618ca7.tar.bz2 samba-d27bc7377aaea09652d14d06ce70c98d8f618ca7.zip  | |
netapi: add more group tests to netapitest.
Guenther
Diffstat (limited to 'source3/lib')
| -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");  | 
