2 Unix SMB/CIFS implementation.
3 Test suite for libnet calls.
5 Copyright (C) Rafal Szczesniak 2005
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include "torture/rpc/rpc.h"
24 #include "libnet/userman.h"
25 #include "libnet/libnet.h"
26 #include "librpc/gen_ndr/ndr_samr_c.h"
28 #define TEST_USERNAME "libnetusermantest"
31 static BOOL test_opendomain(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
32 struct policy_handle *handle, struct lsa_String *domname)
35 struct policy_handle h, domain_handle;
36 struct samr_Connect r1;
37 struct samr_LookupDomain r2;
38 struct samr_OpenDomain r3;
40 printf("connecting\n");
42 r1.in.system_name = 0;
43 r1.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
44 r1.out.connect_handle = &h;
46 status = dcerpc_samr_Connect(p, mem_ctx, &r1);
47 if (!NT_STATUS_IS_OK(status)) {
48 printf("Connect failed - %s\n", nt_errstr(status));
52 r2.in.connect_handle = &h;
53 r2.in.domain_name = domname;
55 printf("domain lookup on %s\n", domname->string);
57 status = dcerpc_samr_LookupDomain(p, mem_ctx, &r2);
58 if (!NT_STATUS_IS_OK(status)) {
59 printf("LookupDomain failed - %s\n", nt_errstr(status));
63 r3.in.connect_handle = &h;
64 r3.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
65 r3.in.sid = r2.out.sid;
66 r3.out.domain_handle = &domain_handle;
68 printf("opening domain\n");
70 status = dcerpc_samr_OpenDomain(p, mem_ctx, &r3);
71 if (!NT_STATUS_IS_OK(status)) {
72 printf("OpenDomain failed - %s\n", nt_errstr(status));
75 *handle = domain_handle;
82 static BOOL test_useradd(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
83 struct policy_handle *domain_handle,
88 struct libnet_rpc_useradd user;
90 user.in.domain_handle = *domain_handle;
91 user.in.username = name;
93 printf("Testing libnet_rpc_useradd\n");
95 status = libnet_rpc_useradd(p, mem_ctx, &user);
96 if (!NT_STATUS_IS_OK(status)) {
97 printf("Failed to call sync rpc_composite_userinfo - %s\n", nt_errstr(status));
105 static void msg_handler(struct monitor_msg *m)
107 struct msg_rpc_create_user *msg_create;
110 case rpc_create_user:
111 msg_create = (struct msg_rpc_create_user*)m->data;
112 printf("monitor_msg: user created (rid=%d)\n", msg_create->rid);
118 static BOOL test_useradd_async(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
119 struct policy_handle *handle, const char* username)
122 struct composite_context *c;
123 struct libnet_rpc_useradd user;
125 user.in.domain_handle = *handle;
126 user.in.username = username;
128 printf("Testing async libnet_rpc_useradd\n");
130 c = libnet_rpc_useradd_send(p, &user, msg_handler);
132 printf("Failed to call async libnet_rpc_useradd\n");
136 status = libnet_rpc_useradd_recv(c, mem_ctx, &user);
137 if (!NT_STATUS_IS_OK(status)) {
138 printf("Calling async libnet_rpc_useradd failed - %s\n", nt_errstr(status));
147 static BOOL test_cleanup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
148 struct policy_handle *domain_handle, const char *username)
151 struct samr_LookupNames r1;
152 struct samr_OpenUser r2;
153 struct samr_DeleteUser r3;
154 struct lsa_String names[2];
156 struct policy_handle user_handle;
158 names[0].string = username;
160 r1.in.domain_handle = domain_handle;
164 printf("user account lookup '%s'\n", username);
166 status = dcerpc_samr_LookupNames(p, mem_ctx, &r1);
167 if (!NT_STATUS_IS_OK(status)) {
168 printf("LookupNames failed - %s\n", nt_errstr(status));
172 rid = r1.out.rids.ids[0];
174 r2.in.domain_handle = domain_handle;
175 r2.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
177 r2.out.user_handle = &user_handle;
179 printf("opening user account\n");
181 status = dcerpc_samr_OpenUser(p, mem_ctx, &r2);
182 if (!NT_STATUS_IS_OK(status)) {
183 printf("OpenUser failed - %s\n", nt_errstr(status));
187 r3.in.user_handle = &user_handle;
188 r3.out.user_handle = &user_handle;
190 printf("deleting user account\n");
192 status = dcerpc_samr_DeleteUser(p, mem_ctx, &r3);
193 if (!NT_STATUS_IS_OK(status)) {
194 printf("DeleteUser failed - %s\n", nt_errstr(status));
202 static BOOL test_createuser(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
203 struct policy_handle *handle, const char* user)
206 struct policy_handle user_handle;
207 struct lsa_String username;
208 struct samr_CreateUser r1;
209 struct samr_Close r2;
212 username.string = user;
214 r1.in.domain_handle = handle;
215 r1.in.account_name = &username;
216 r1.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
217 r1.out.user_handle = &user_handle;
218 r1.out.rid = &user_rid;
220 printf("creating user '%s'\n", username.string);
222 status = dcerpc_samr_CreateUser(p, mem_ctx, &r1);
223 if (!NT_STATUS_IS_OK(status)) {
224 printf("CreateUser failed - %s\n", nt_errstr(status));
226 if (NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS)) {
227 printf("User (%s) already exists - attempting to delete and recreate account again\n", user);
228 if (!test_cleanup(p, mem_ctx, handle, TEST_USERNAME)) {
232 printf("creating user account\n");
234 status = dcerpc_samr_CreateUser(p, mem_ctx, &r1);
235 if (!NT_STATUS_IS_OK(status)) {
236 printf("CreateUser failed - %s\n", nt_errstr(status));
244 r2.in.handle = &user_handle;
245 r2.out.handle = &user_handle;
247 printf("closing user '%s'\n", username.string);
249 status = dcerpc_samr_Close(p, mem_ctx, &r2);
250 if (!NT_STATUS_IS_OK(status)) {
251 printf("Close failed - %s\n", nt_errstr(status));
259 static BOOL test_userdel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
260 struct policy_handle *handle, const char *username)
263 struct libnet_rpc_userdel user;
265 user.in.domain_handle = *handle;
266 user.in.username = username;
268 status = libnet_rpc_userdel(p, mem_ctx, &user);
269 if (!NT_STATUS_IS_OK(status)) {
270 printf("Failed to call sync libnet_rpc_userdel - %s\n", nt_errstr(status));
278 static BOOL test_usermod(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
279 struct policy_handle *handle, const char *username,
280 struct usermod_change *change)
283 struct libnet_rpc_usermod user;
285 user.in.domain_handle = *handle;
286 user.in.username = username;
287 user.in.change = *change;
289 printf("modifying user\n");
291 status = libnet_rpc_usermod(p, mem_ctx, &user);
292 if (!NT_STATUS_IS_OK(status)) {
293 printf("Failed to call sync libnet_rpc_usermod - %s\n", nt_errstr(status));
301 BOOL torture_useradd(void)
305 struct dcerpc_pipe *p;
306 struct policy_handle h;
307 struct lsa_String domain_name;
308 const char *name = TEST_USERNAME;
312 mem_ctx = talloc_init("test_useradd");
313 binding = lp_parm_string(-1, "torture", "binding");
315 status = torture_rpc_connection(mem_ctx,
319 if (!NT_STATUS_IS_OK(status)) {
323 domain_name.string = lp_workgroup();
324 if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
329 if (!test_useradd(p, mem_ctx, &h, name)) {
334 if (!test_cleanup(p, mem_ctx, &h, name)) {
339 if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
344 if (!test_useradd_async(p, mem_ctx, &h, name)) {
349 if (!test_cleanup(p, mem_ctx, &h, name)) {
355 talloc_free(mem_ctx);
360 BOOL torture_userdel(void)
364 struct dcerpc_pipe *p;
365 struct policy_handle h;
366 struct lsa_String domain_name;
367 const char *name = TEST_USERNAME;
371 mem_ctx = talloc_init("test_userdel");
372 binding = lp_parm_string(-1, "torture", "binding");
374 status = torture_rpc_connection(mem_ctx,
378 if (!NT_STATUS_IS_OK(status)) {
382 domain_name.string = lp_workgroup();
383 if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
388 if (!test_createuser(p, mem_ctx, &h, name)) {
393 if (!test_userdel(p, mem_ctx, &h, name)) {
399 talloc_free(mem_ctx);
404 BOOL torture_usermod(void)
408 struct dcerpc_pipe *p;
409 struct policy_handle h;
410 struct lsa_String domain_name;
411 const char *name = TEST_USERNAME;
416 struct timeval expiry = { 12345, 67890 };
417 struct timeval allow = { 67890, 12345 };
418 struct timeval force = { 33333, 55444 };
420 struct usermod_change changes[] = {
421 { USERMOD_FIELD_ACCOUNT_NAME, "changed", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 },
422 { USERMOD_FIELD_FULL_NAME, NULL, "Testing full account name", NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 },
423 { USERMOD_FIELD_DESCRIPTION, NULL, NULL, "Description of tested account", NULL, NULL, NULL, NULL, NULL, NULL, 0 },
424 { USERMOD_FIELD_COMMENT, NULL, NULL, NULL, "Comment for the tested account", NULL, NULL, NULL, NULL, NULL, 0 },
425 { USERMOD_FIELD_LOGON_SCRIPT, NULL, NULL, NULL, NULL, "test_logon.cmd", NULL, NULL, NULL, NULL, 0 },
426 { USERMOD_FIELD_PROFILE_PATH, NULL, NULL, NULL, NULL, NULL, "\\\\TESTSRV\\profiles\\test", NULL, NULL, NULL, 0 },
427 { USERMOD_FIELD_ACCT_EXPIRY, NULL, NULL, NULL, NULL, NULL, NULL, &expiry, NULL, NULL, 0 },
428 { USERMOD_FIELD_ALLOW_PASS_CHG, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &allow, NULL, 0 },
429 { USERMOD_FIELD_FORCE_PASS_CHG, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &force, ACB_NORMAL }
432 mem_ctx = talloc_init("test_userdel");
433 binding = lp_parm_string(-1, "torture", "binding");
435 status = torture_rpc_connection(mem_ctx,
439 if (!NT_STATUS_IS_OK(status)) {
443 domain_name.string = lp_workgroup();
445 if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
450 if (!test_createuser(p, mem_ctx, &h, name)) {
455 for (i = 0; i < (sizeof(changes)/sizeof(struct usermod_change)); i++) {
456 if (!test_usermod(p, mem_ctx, &h, name, &changes[i])) {
461 if (changes[i].fields & USERMOD_FIELD_ACCOUNT_NAME) {
462 name = talloc_strdup(mem_ctx, changes[i].account_name);
466 if (!test_cleanup(p, mem_ctx, &h, name)) {
472 talloc_free(mem_ctx);