svn commit: samba r5679 - in branches/SAMBA_4_0/source/torture/libnet: .

mimir at samba.org mimir at samba.org
Mon Mar 7 05:12:33 GMT 2005


Author: mimir
Date: 2005-03-07 05:12:33 +0000 (Mon, 07 Mar 2005)
New Revision: 5679

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=5679

Log:
Complete basic test of rpc_composite_userinfo function (which
btw proves the function is completely broken but that's what
tests are for)


rafal


Modified:
   branches/SAMBA_4_0/source/torture/libnet/userinfo.c


Changeset:
Modified: branches/SAMBA_4_0/source/torture/libnet/userinfo.c
===================================================================
--- branches/SAMBA_4_0/source/torture/libnet/userinfo.c	2005-03-07 05:10:44 UTC (rev 5678)
+++ branches/SAMBA_4_0/source/torture/libnet/userinfo.c	2005-03-07 05:12:33 UTC (rev 5679)
@@ -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,10 +74,137 @@
 		*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;
+}
+
+
 BOOL torture_userinfo(void)
 {
 	NTSTATUS status;
@@ -82,8 +213,10 @@
 	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 @@
 	}
 	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);



More information about the samba-cvs mailing list