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 "param/param.h"
32 bool test_opendomain(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
33 struct policy_handle *handle, struct lsa_String *domname,
37 struct policy_handle h, domain_handle;
38 struct samr_Connect r1;
39 struct samr_LookupDomain r2;
40 struct samr_OpenDomain r3;
42 printf("connecting\n");
44 r1.in.system_name = 0;
45 r1.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
46 r1.out.connect_handle = &h;
48 status = dcerpc_samr_Connect(p, mem_ctx, &r1);
49 if (!NT_STATUS_IS_OK(status)) {
50 printf("Connect failed - %s\n", nt_errstr(status));
54 r2.in.connect_handle = &h;
55 r2.in.domain_name = domname;
57 printf("domain lookup on %s\n", domname->string);
59 status = dcerpc_samr_LookupDomain(p, mem_ctx, &r2);
60 if (!NT_STATUS_IS_OK(status)) {
61 printf("LookupDomain failed - %s\n", nt_errstr(status));
65 r3.in.connect_handle = &h;
66 r3.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
67 r3.in.sid = r2.out.sid;
68 r3.out.domain_handle = &domain_handle;
70 printf("opening domain\n");
72 status = dcerpc_samr_OpenDomain(p, mem_ctx, &r3);
73 if (!NT_STATUS_IS_OK(status)) {
74 printf("OpenDomain failed - %s\n", nt_errstr(status));
77 *handle = domain_handle;
85 bool test_user_cleanup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
86 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;
97 names[0].string = name;
99 r1.in.domain_handle = domain_handle;
103 printf("user account lookup '%s'\n", name);
105 status = dcerpc_samr_LookupNames(p, mem_ctx, &r1);
106 if (!NT_STATUS_IS_OK(status)) {
107 printf("LookupNames failed - %s\n", nt_errstr(status));
111 rid = r1.out.rids.ids[0];
113 r2.in.domain_handle = domain_handle;
114 r2.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
116 r2.out.user_handle = &user_handle;
118 printf("opening user account\n");
120 status = dcerpc_samr_OpenUser(p, mem_ctx, &r2);
121 if (!NT_STATUS_IS_OK(status)) {
122 printf("OpenUser failed - %s\n", nt_errstr(status));
126 r3.in.user_handle = &user_handle;
127 r3.out.user_handle = &user_handle;
129 printf("deleting user account\n");
131 status = dcerpc_samr_DeleteUser(p, mem_ctx, &r3);
132 if (!NT_STATUS_IS_OK(status)) {
133 printf("DeleteUser failed - %s\n", nt_errstr(status));
141 bool test_user_create(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
142 struct policy_handle *handle, const char *name,
146 struct lsa_String username;
147 struct samr_CreateUser r;
148 struct policy_handle user_handle;
150 username.string = name;
152 r.in.domain_handle = handle;
153 r.in.account_name = &username;
154 r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
155 r.out.user_handle = &user_handle;
158 printf("creating user account %s\n", name);
160 status = dcerpc_samr_CreateUser(p, mem_ctx, &r);
161 if (!NT_STATUS_IS_OK(status)) {
162 printf("CreateUser failed - %s\n", nt_errstr(status));
164 if (NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS)) {
165 printf("User (%s) already exists - attempting to delete and recreate account again\n", name);
166 if (!test_user_cleanup(p, mem_ctx, handle, name)) {
170 printf("creating user account\n");
172 status = dcerpc_samr_CreateUser(p, mem_ctx, &r);
173 if (!NT_STATUS_IS_OK(status)) {
174 printf("CreateUser failed - %s\n", nt_errstr(status));
186 bool test_group_cleanup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
187 struct policy_handle *domain_handle,
191 struct samr_LookupNames r1;
192 struct samr_OpenGroup r2;
193 struct samr_DeleteDomainGroup r3;
194 struct lsa_String names[2];
196 struct policy_handle group_handle;
198 names[0].string = name;
200 r1.in.domain_handle = domain_handle;
204 printf("group account lookup '%s'\n", name);
206 status = dcerpc_samr_LookupNames(p, mem_ctx, &r1);
207 if (!NT_STATUS_IS_OK(status)) {
208 printf("LookupNames failed - %s\n", nt_errstr(status));
212 rid = r1.out.rids.ids[0];
214 r2.in.domain_handle = domain_handle;
215 r2.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
217 r2.out.group_handle = &group_handle;
219 printf("opening group account\n");
221 status = dcerpc_samr_OpenGroup(p, mem_ctx, &r2);
222 if (!NT_STATUS_IS_OK(status)) {
223 printf("OpenGroup failed - %s\n", nt_errstr(status));
227 r3.in.group_handle = &group_handle;
228 r3.out.group_handle = &group_handle;
230 printf("deleting group account\n");
232 status = dcerpc_samr_DeleteDomainGroup(p, mem_ctx, &r3);
233 if (!NT_STATUS_IS_OK(status)) {
234 printf("DeleteGroup failed - %s\n", nt_errstr(status));
242 bool test_group_create(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
243 struct policy_handle *handle, const char *name,
247 struct lsa_String groupname;
248 struct samr_CreateDomainGroup r;
249 struct policy_handle group_handle;
251 groupname.string = name;
253 r.in.domain_handle = handle;
254 r.in.name = &groupname;
255 r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
256 r.out.group_handle = &group_handle;
259 printf("creating group account %s\n", name);
261 status = dcerpc_samr_CreateDomainGroup(p, mem_ctx, &r);
262 if (!NT_STATUS_IS_OK(status)) {
263 printf("CreateGroup failed - %s\n", nt_errstr(status));
265 if (NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS)) {
266 printf("Group (%s) already exists - attempting to delete and recreate account again\n", name);
267 if (!test_group_cleanup(p, mem_ctx, handle, name)) {
271 printf("creating group account\n");
273 status = dcerpc_samr_CreateDomainGroup(p, mem_ctx, &r);
274 if (!NT_STATUS_IS_OK(status)) {
275 printf("CreateGroup failed - %s\n", nt_errstr(status));
287 void msg_handler(struct monitor_msg *m)
289 struct msg_rpc_open_user *msg_open;
290 struct msg_rpc_query_user *msg_query;
291 struct msg_rpc_close_user *msg_close;
292 struct msg_rpc_create_user *msg_create;
295 case mon_SamrOpenUser:
296 msg_open = (struct msg_rpc_open_user*)m->data;
297 printf("monitor_msg: user opened (rid=%d, access_mask=0x%08x)\n",
298 msg_open->rid, msg_open->access_mask);
300 case mon_SamrQueryUser:
301 msg_query = (struct msg_rpc_query_user*)m->data;
302 printf("monitor_msg: user queried (level=%d)\n", msg_query->level);
304 case mon_SamrCloseUser:
305 msg_close = (struct msg_rpc_close_user*)m->data;
306 printf("monitor_msg: user closed (rid=%d)\n", msg_close->rid);
308 case mon_SamrCreateUser:
309 msg_create = (struct msg_rpc_create_user*)m->data;
310 printf("monitor_msg: user created (rid=%d)\n", msg_create->rid);