summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/torture/libnet/userinfo.c154
1 files changed, 151 insertions, 3 deletions
diff --git a/source4/torture/libnet/userinfo.c b/source4/torture/libnet/userinfo.c
index 0ba31a4062..b076783662 100644
--- a/source4/torture/libnet/userinfo.c
+++ b/source4/torture/libnet/userinfo.c
@@ -21,10 +21,14 @@
#include "includes.h"
#include "librpc/gen_ndr/ndr_samr.h"
+#include "libnet/composite.h"
+
+#define TEST_USERNAME "libnetuserinfotest"
static BOOL test_opendomain(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
- struct policy_handle *handle, struct samr_String *domname)
+ struct policy_handle *handle, struct samr_String *domname,
+ struct dom_sid2 *sid)
{
NTSTATUS status;
struct policy_handle h, domain_handle;
@@ -70,6 +74,133 @@ static BOOL test_opendomain(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
*handle = domain_handle;
}
+ *sid = *r2.out.sid;
+ return True;
+}
+
+
+static BOOL test_cleanup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+ struct policy_handle *domain_handle, char *username)
+{
+ NTSTATUS status;
+ struct samr_LookupNames r1;
+ struct samr_OpenUser r2;
+ struct samr_DeleteUser r3;
+ struct samr_String names[2];
+ uint32_t rid;
+ struct policy_handle user_handle;
+
+ names[0].string = username;
+
+ r1.in.domain_handle = domain_handle;
+ r1.in.num_names = 1;
+ r1.in.names = names;
+
+ printf("user account lookup\n");
+
+ status = dcerpc_samr_LookupNames(p, mem_ctx, &r1);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("LookupNames failed - %s\n", nt_errstr(status));
+ return False;
+ }
+
+ rid = r1.out.rids.ids[0];
+
+ r2.in.domain_handle = domain_handle;
+ r2.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+ r2.in.rid = rid;
+ r2.out.user_handle = &user_handle;
+
+ printf("opening user account\n");
+
+ status = dcerpc_samr_OpenUser(p, mem_ctx, &r2);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("OpenUser failed - %s\n", nt_errstr(status));
+ return False;
+ }
+
+ r3.in.user_handle = &user_handle;
+ r3.out.user_handle = &user_handle;
+
+ printf("deleting user account\n");
+
+ status = dcerpc_samr_DeleteUser(p, mem_ctx, &r3);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("DeleteUser failed - %s\n", nt_errstr(status));
+ return False;
+ }
+
+ return True;
+}
+
+
+static BOOL test_create(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+ struct policy_handle *handle, const char *name, uint32_t *rid)
+{
+ NTSTATUS status;
+ struct samr_String username;
+ struct samr_CreateUser r;
+ struct policy_handle user_handle;
+
+ username.string = name;
+
+ r.in.domain_handle = handle;
+ r.in.account_name = &username;
+ r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+ r.out.user_handle = &user_handle;
+ r.out.rid = rid;
+
+ printf("creating user account\n");
+
+ status = dcerpc_samr_CreateUser(p, mem_ctx, &r);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("CreateUser failed - %s\n", nt_errstr(status));
+
+ if (NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS)) {
+ printf("User (%s) already exists - attempting to delete and recreate account again\n", name);
+ if (!test_cleanup(p, mem_ctx, handle, TEST_USERNAME)) {
+ return False;
+ }
+
+ printf("creating user account\n");
+
+ status = dcerpc_samr_CreateUser(p, mem_ctx, &r);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("CreateUser failed - %s\n", nt_errstr(status));
+ return False;
+ }
+ return True;
+ }
+ return False;
+ }
+
+ return True;
+}
+
+
+static BOOL test_userinfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+ struct policy_handle *domain_handle,
+ struct dom_sid2 *domain_sid, char* user_name,
+ uint32_t *rid)
+{
+ NTSTATUS status;
+ struct rpc_composite_userinfo user;
+ struct dom_sid *user_sid;
+ char *name;
+
+ user_sid = dom_sid_add_rid(mem_ctx, domain_sid, *rid);
+
+ user.in.domain_handle = *domain_handle;
+ user.in.sid = dom_sid_string(mem_ctx, user_sid);
+ user.in.level = 5; /* this should be extended */
+
+ printf("Testing sync rpc_composite_userinfo\n");
+ status = rpc_composite_userinfo(p, mem_ctx, &user);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("Failed to call sync rpc_composite_userinfo - %s\n", nt_errstr(status));
+ return False;
+ }
+
return True;
}
@@ -82,8 +213,10 @@ BOOL torture_userinfo(void)
struct dcerpc_binding b;
TALLOC_CTX *mem_ctx;
BOOL ret = True;
- struct policy_handle h;
+ struct policy_handle h, user_handle;
struct samr_String name;
+ struct dom_sid2 sid;
+ uint32_t rid;
mem_ctx = talloc_init("test_userinfo");
binding = lp_parm_string(-1, "torture", "binding");
@@ -106,10 +239,25 @@ BOOL torture_userinfo(void)
}
name.string = b.host;
- if (!test_opendomain(p, mem_ctx, &h, &name)) {
+ if (!test_opendomain(p, mem_ctx, &h, &name, &sid)) {
ret = False;
+ goto done;
}
+ if (!test_create(p, mem_ctx, &h, TEST_USERNAME, &rid)) {
+ ret = False;
+ goto done;
+ }
+
+ if (!test_userinfo(p, mem_ctx, &h, &sid, TEST_USERNAME, &rid)) {
+ ret = False;
+ goto done;
+ }
+
+ if (!test_cleanup(p, mem_ctx, &h, TEST_USERNAME)) {
+ ret = False;
+ goto done;
+ }
done:
talloc_free(mem_ctx);
torture_rpc_close(p);