r8807: Modifying datetime field using struct timeval argument rather than
[Samba/ekacnet.git] / source / torture / libnet / userman.c
blob063587feb259c9eee68f0858a235344f9189de48
1 /*
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.
22 #include "includes.h"
23 #include "librpc/gen_ndr/ndr_samr.h"
24 #include "libnet/composite.h"
25 #include "libnet/userman.h"
26 #include "libcli/composite/monitor.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)
34 NTSTATUS status;
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));
49 return False;
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));
60 return False;
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));
73 return False;
74 } else {
75 *handle = domain_handle;
78 return True;
82 static BOOL test_useradd(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
83 struct policy_handle *domain_handle,
84 const char *name)
86 NTSTATUS status;
87 BOOL ret = True;
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));
98 return False;
101 return ret;
105 static void msg_handler(struct monitor_msg *m)
107 struct msg_rpc_create_user *msg_create;
109 switch (m->type) {
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);
113 break;
118 static BOOL test_useradd_async(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
119 struct policy_handle *handle, const char* username)
121 NTSTATUS status;
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);
131 if (!c) {
132 printf("Failed to call async libnet_rpc_useradd\n");
133 return False;
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));
139 return False;
142 return True;
147 static BOOL test_cleanup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
148 struct policy_handle *domain_handle, const char *username)
150 NTSTATUS status;
151 struct samr_LookupNames r1;
152 struct samr_OpenUser r2;
153 struct samr_DeleteUser r3;
154 struct lsa_String names[2];
155 uint32_t rid;
156 struct policy_handle user_handle;
158 names[0].string = username;
160 r1.in.domain_handle = domain_handle;
161 r1.in.num_names = 1;
162 r1.in.names = names;
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));
169 return False;
172 rid = r1.out.rids.ids[0];
174 r2.in.domain_handle = domain_handle;
175 r2.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
176 r2.in.rid = rid;
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));
184 return False;
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));
195 return False;
198 return True;
202 static BOOL test_createuser(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
203 struct policy_handle *handle, const char* user)
205 NTSTATUS status;
206 struct policy_handle user_handle;
207 struct lsa_String username;
208 struct samr_CreateUser r1;
209 struct samr_Close r2;
210 uint32_t user_rid;
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)) {
229 return False;
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));
237 return False;
239 return True;
241 return False;
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));
252 return False;
255 return True;
259 static BOOL test_userdel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
260 struct policy_handle *handle, const char *username)
262 NTSTATUS status;
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));
271 return False;
274 return True;
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)
282 NTSTATUS status;
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));
294 return False;
297 return True;
301 BOOL torture_useradd(void)
303 NTSTATUS status;
304 const char *binding;
305 struct dcerpc_pipe *p;
306 struct policy_handle h;
307 struct lsa_String domain_name;
308 const char *name = TEST_USERNAME;
309 TALLOC_CTX *mem_ctx;
310 BOOL ret = True;
312 mem_ctx = talloc_init("test_useradd");
313 binding = lp_parm_string(-1, "torture", "binding");
315 status = torture_rpc_connection(mem_ctx,
317 DCERPC_SAMR_NAME,
318 DCERPC_SAMR_UUID,
319 DCERPC_SAMR_VERSION);
321 if (!NT_STATUS_IS_OK(status)) {
322 return False;
325 domain_name.string = lp_workgroup();
326 if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
327 ret = False;
328 goto done;
331 if (!test_useradd(p, mem_ctx, &h, name)) {
332 ret = False;
333 goto done;
336 if (!test_cleanup(p, mem_ctx, &h, name)) {
337 ret = False;
338 goto done;
341 if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
342 ret = False;
343 goto done;
346 if (!test_useradd_async(p, mem_ctx, &h, name)) {
347 ret = False;
348 goto done;
351 if (!test_cleanup(p, mem_ctx, &h, name)) {
352 ret = False;
353 goto done;
356 done:
357 talloc_free(mem_ctx);
358 return ret;
362 BOOL torture_userdel(void)
364 NTSTATUS status;
365 const char *binding;
366 struct dcerpc_pipe *p;
367 struct policy_handle h;
368 struct lsa_String domain_name;
369 const char *name = TEST_USERNAME;
370 TALLOC_CTX *mem_ctx;
371 BOOL ret = True;
373 mem_ctx = talloc_init("test_userdel");
374 binding = lp_parm_string(-1, "torture", "binding");
376 status = torture_rpc_connection(mem_ctx,
378 DCERPC_SAMR_NAME,
379 DCERPC_SAMR_UUID,
380 DCERPC_SAMR_VERSION);
382 if (!NT_STATUS_IS_OK(status)) {
383 return False;
386 domain_name.string = lp_workgroup();
387 if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
388 ret = False;
389 goto done;
392 if (!test_createuser(p, mem_ctx, &h, name)) {
393 ret = False;
394 goto done;
397 if (!test_userdel(p, mem_ctx, &h, name)) {
398 ret = False;
399 goto done;
402 done:
403 talloc_free(mem_ctx);
404 return ret;
408 BOOL torture_usermod(void)
410 NTSTATUS status;
411 const char *binding;
412 struct dcerpc_pipe *p;
413 struct policy_handle h;
414 struct lsa_String domain_name;
415 char *name = TEST_USERNAME;
416 TALLOC_CTX *mem_ctx;
417 BOOL ret = True;
418 int i;
420 struct timeval expiry = { 12345, 67890 };
422 struct usermod_change changes[] = {
423 { USERMOD_FIELD_ACCOUNT_NAME, "changed", NULL, NULL, NULL, NULL, NULL },
424 { USERMOD_FIELD_FULL_NAME, NULL, "Testing full account name", NULL, NULL, NULL, NULL },
425 { USERMOD_FIELD_DESCRIPTION, NULL, NULL, "Description of tested account", NULL, NULL, NULL },
426 { USERMOD_FIELD_LOGON_SCRIPT, NULL, NULL, NULL, "test_logon.cmd", NULL, NULL },
427 { USERMOD_FIELD_PROFILE_PATH, NULL, NULL, NULL, NULL, "\\\\TESTSRV\\profiles\\test", NULL },
428 { USERMOD_FIELD_ACCT_EXPIRY, NULL, NULL, NULL, NULL, NULL, &expiry }
431 mem_ctx = talloc_init("test_userdel");
432 binding = lp_parm_string(-1, "torture", "binding");
434 status = torture_rpc_connection(mem_ctx,
436 DCERPC_SAMR_NAME,
437 DCERPC_SAMR_UUID,
438 DCERPC_SAMR_VERSION);
440 if (!NT_STATUS_IS_OK(status)) {
441 return False;
444 domain_name.string = lp_workgroup();
446 if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
447 ret = False;
448 goto done;
451 if (!test_createuser(p, mem_ctx, &h, name)) {
452 ret = False;
453 goto done;
456 for (i = 0; i < (sizeof(changes)/sizeof(struct usermod_change)); i++) {
457 if (!test_usermod(p, mem_ctx, &h, name, &changes[i])) {
458 ret = False;
459 goto done;
462 if (changes[i].fields & USERMOD_FIELD_ACCOUNT_NAME) {
463 name = talloc_strdup(mem_ctx, changes[i].account_name);
467 if (!test_cleanup(p, mem_ctx, &h, name)) {
468 ret = False;
469 goto done;
472 done:
473 talloc_free(mem_ctx);
474 return ret;