2 Unix SMB/CIFS implementation.
3 Test suite for libnet calls.
5 Copyright (C) Rafal Szczesniak 2007
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 3 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, see <http://www.gnu.org/licenses/>.
22 * These are more general use functions shared among the tests.
26 #include "torture/rpc/rpc.h"
27 #include "libnet/libnet.h"
28 #include "librpc/gen_ndr/ndr_samr_c.h"
29 #include "torture/libnet/utils.h"
31 bool test_opendomain(struct torture_context *tctx,
32 struct dcerpc_binding_handle *b, TALLOC_CTX *mem_ctx,
33 struct policy_handle *handle, struct lsa_String *domname,
34 struct dom_sid2 *sid_p)
36 struct policy_handle h, domain_handle;
37 struct samr_Connect r1;
38 struct samr_LookupDomain r2;
39 struct dom_sid2 *sid = NULL;
40 struct samr_OpenDomain r3;
42 torture_comment(tctx, "connecting\n");
44 r1.in.system_name = 0;
45 r1.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
46 r1.out.connect_handle = &h;
48 torture_assert_ntstatus_ok(tctx,
49 dcerpc_samr_Connect_r(b, mem_ctx, &r1),
51 torture_assert_ntstatus_ok(tctx, r1.out.result,
54 r2.in.connect_handle = &h;
55 r2.in.domain_name = domname;
58 torture_comment(tctx, "domain lookup on %s\n", domname->string);
60 torture_assert_ntstatus_ok(tctx,
61 dcerpc_samr_LookupDomain_r(b, mem_ctx, &r2),
62 "LookupDomain failed");
63 torture_assert_ntstatus_ok(tctx, r2.out.result,
64 "LookupDomain failed");
66 r3.in.connect_handle = &h;
67 r3.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
68 r3.in.sid = *r2.out.sid;
69 r3.out.domain_handle = &domain_handle;
71 torture_comment(tctx, "opening domain\n");
73 torture_assert_ntstatus_ok(tctx,
74 dcerpc_samr_OpenDomain_r(b, mem_ctx, &r3),
76 torture_assert_ntstatus_ok(tctx, r3.out.result,
78 *handle = domain_handle;
80 *sid_p = **r2.out.sid;
85 bool test_user_cleanup(struct torture_context *tctx,
86 struct dcerpc_binding_handle *b,
87 TALLOC_CTX *mem_ctx, struct policy_handle *domain_handle,
90 struct samr_LookupNames r1;
91 struct samr_OpenUser r2;
92 struct samr_DeleteUser r3;
93 struct lsa_String names[2];
95 struct policy_handle user_handle;
96 struct samr_Ids rids, types;
98 names[0].string = name;
100 r1.in.domain_handle = domain_handle;
104 r1.out.types = &types;
106 torture_comment(tctx, "user account lookup '%s'\n", name);
108 torture_assert_ntstatus_ok(tctx,
109 dcerpc_samr_LookupNames_r(b, mem_ctx, &r1),
110 "LookupNames failed");
111 torture_assert_ntstatus_ok(tctx, r1.out.result,
112 "LookupNames failed");
114 rid = r1.out.rids->ids[0];
116 r2.in.domain_handle = domain_handle;
117 r2.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
119 r2.out.user_handle = &user_handle;
121 torture_comment(tctx, "opening user account\n");
123 torture_assert_ntstatus_ok(tctx,
124 dcerpc_samr_OpenUser_r(b, mem_ctx, &r2),
126 torture_assert_ntstatus_ok(tctx, r2.out.result,
129 r3.in.user_handle = &user_handle;
130 r3.out.user_handle = &user_handle;
132 torture_comment(tctx, "deleting user account\n");
134 torture_assert_ntstatus_ok(tctx,
135 dcerpc_samr_DeleteUser_r(b, mem_ctx, &r3),
136 "DeleteUser failed");
137 torture_assert_ntstatus_ok(tctx, r3.out.result,
138 "DeleteUser failed");
144 bool test_user_create(struct torture_context *tctx,
145 struct dcerpc_binding_handle *b,
147 struct policy_handle *handle, const char *name,
150 struct lsa_String username;
151 struct samr_CreateUser r;
152 struct policy_handle user_handle;
154 username.string = name;
156 r.in.domain_handle = handle;
157 r.in.account_name = &username;
158 r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
159 r.out.user_handle = &user_handle;
162 torture_comment(tctx, "creating user account %s\n", name);
164 torture_assert_ntstatus_ok(tctx,
165 dcerpc_samr_CreateUser_r(b, mem_ctx, &r),
166 "CreateUser failed");
167 if (!NT_STATUS_IS_OK(r.out.result)) {
168 printf("CreateUser failed - %s\n", nt_errstr(r.out.result));
169 if (NT_STATUS_EQUAL(r.out.result, NT_STATUS_USER_EXISTS)) {
170 torture_comment(tctx, "User (%s) already exists - attempting to delete and recreate account again\n", name);
171 if (!test_user_cleanup(tctx, b, mem_ctx, handle, name)) {
175 torture_comment(tctx, "creating user account\n");
177 torture_assert_ntstatus_ok(tctx,
178 dcerpc_samr_CreateUser_r(b, mem_ctx, &r),
179 "CreateUser failed");
180 torture_assert_ntstatus_ok(tctx, r.out.result,
181 "CreateUser failed");
192 bool test_group_cleanup(struct torture_context *tctx,
193 struct dcerpc_binding_handle *b, TALLOC_CTX *mem_ctx,
194 struct policy_handle *domain_handle,
197 struct samr_LookupNames r1;
198 struct samr_OpenGroup r2;
199 struct samr_DeleteDomainGroup r3;
200 struct lsa_String names[2];
202 struct policy_handle group_handle;
203 struct samr_Ids rids, types;
205 names[0].string = name;
207 r1.in.domain_handle = domain_handle;
211 r1.out.types = &types;
213 torture_comment(tctx, "group account lookup '%s'\n", name);
215 torture_assert_ntstatus_ok(tctx,
216 dcerpc_samr_LookupNames_r(b, mem_ctx, &r1),
217 "LookupNames failed");
218 torture_assert_ntstatus_ok(tctx, r1.out.result,
219 "LookupNames failed");
221 rid = r1.out.rids->ids[0];
223 r2.in.domain_handle = domain_handle;
224 r2.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
226 r2.out.group_handle = &group_handle;
228 torture_comment(tctx, "opening group account\n");
230 torture_assert_ntstatus_ok(tctx,
231 dcerpc_samr_OpenGroup_r(b, mem_ctx, &r2),
233 torture_assert_ntstatus_ok(tctx, r2.out.result,
236 r3.in.group_handle = &group_handle;
237 r3.out.group_handle = &group_handle;
239 torture_comment(tctx, "deleting group account\n");
241 torture_assert_ntstatus_ok(tctx,
242 dcerpc_samr_DeleteDomainGroup_r(b, mem_ctx, &r3),
243 "DeleteGroup failed");
244 torture_assert_ntstatus_ok(tctx, r3.out.result,
245 "DeleteGroup failed");
251 bool test_group_create(struct torture_context *tctx,
252 struct dcerpc_binding_handle *b, TALLOC_CTX *mem_ctx,
253 struct policy_handle *handle, const char *name,
256 struct lsa_String groupname;
257 struct samr_CreateDomainGroup r;
258 struct policy_handle group_handle;
260 groupname.string = name;
262 r.in.domain_handle = handle;
263 r.in.name = &groupname;
264 r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
265 r.out.group_handle = &group_handle;
268 torture_comment(tctx, "creating group account %s\n", name);
270 torture_assert_ntstatus_ok(tctx,
271 dcerpc_samr_CreateDomainGroup_r(b, mem_ctx, &r),
272 "CreateGroup failed");
273 if (!NT_STATUS_IS_OK(r.out.result)) {
274 torture_comment(tctx, "CreateGroup failed - %s\n", nt_errstr(r.out.result));
276 if (NT_STATUS_EQUAL(r.out.result, NT_STATUS_USER_EXISTS)) {
277 torture_comment(tctx, "Group (%s) already exists - attempting to delete and recreate account again\n", name);
278 if (!test_group_cleanup(tctx, b, mem_ctx, handle, name)) {
282 torture_comment(tctx, "creating group account\n");
284 torture_assert_ntstatus_ok(tctx,
285 dcerpc_samr_CreateDomainGroup_r(b, mem_ctx, &r),
286 "CreateGroup failed");
287 torture_assert_ntstatus_ok(tctx, r.out.result,
288 "CreateGroup failed");
299 void msg_handler(struct monitor_msg *m)
301 struct msg_rpc_open_user *msg_open;
302 struct msg_rpc_query_user *msg_query;
303 struct msg_rpc_close_user *msg_close;
304 struct msg_rpc_create_user *msg_create;
307 case mon_SamrOpenUser:
308 msg_open = (struct msg_rpc_open_user*)m->data;
309 printf("monitor_msg: user opened (rid=%d, access_mask=0x%08x)\n",
310 msg_open->rid, msg_open->access_mask);
312 case mon_SamrQueryUser:
313 msg_query = (struct msg_rpc_query_user*)m->data;
314 printf("monitor_msg: user queried (level=%d)\n", msg_query->level);
316 case mon_SamrCloseUser:
317 msg_close = (struct msg_rpc_close_user*)m->data;
318 printf("monitor_msg: user closed (rid=%d)\n", msg_close->rid);
320 case mon_SamrCreateUser:
321 msg_create = (struct msg_rpc_create_user*)m->data;
322 printf("monitor_msg: user created (rid=%d)\n", msg_create->rid);