2 Unix SMB/CIFS implementation.
3 test suite for srvsvc rpc operations
5 Copyright (C) Stefan (metze) Metzmacher 2003
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.
24 /**************************/
25 /* srvsvc_NetCharDev */
26 /**************************/
27 static BOOL test_NetCharDevGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
31 struct srvsvc_NetCharDevGetInfo r;
32 uint32_t levels[] = {0, 1};
36 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
37 r.in.device_name = devname;
39 for (i=0;i<ARRAY_SIZE(levels);i++) {
41 r.in.level = levels[i];
42 printf("testing NetCharDevGetInfo level %u on device '%s'\n",
43 r.in.level, r.in.device_name);
44 status = dcerpc_srvsvc_NetCharDevGetInfo(p, mem_ctx, &r);
45 if (!NT_STATUS_IS_OK(status)) {
46 printf("NetCharDevGetInfo level %u on device '%s' failed - %s\n",
47 r.in.level, r.in.device_name, nt_errstr(status));
51 if (!W_ERROR_IS_OK(r.out.result)) {
52 printf("NetCharDevGetInfo level %u on device '%s' failed - %s\n",
53 r.in.level, r.in.device_name, win_errstr(r.out.result));
61 static BOOL test_NetCharDevControl(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
65 struct srvsvc_NetCharDevControl r;
66 uint32_t opcodes[] = {0, 1};
70 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
71 r.in.device_name = devname;
73 for (i=0;i<ARRAY_SIZE(opcodes);i++) {
75 r.in.opcode = opcodes[i];
76 printf("testing NetCharDevControl opcode %u on device '%s'\n",
77 r.in.opcode, r.in.device_name);
78 status = dcerpc_srvsvc_NetCharDevControl(p, mem_ctx, &r);
79 if (!NT_STATUS_IS_OK(status)) {
80 printf("NetCharDevControl opcode %u failed - %s\n", r.in.opcode, nt_errstr(status));
84 if (!W_ERROR_IS_OK(r.out.result)) {
85 printf("NetCharDevControl opcode %u failed - %s\n", r.in.opcode, win_errstr(r.out.result));
93 static BOOL test_NetCharDevEnum(struct dcerpc_pipe *p,
97 struct srvsvc_NetCharDevEnum r;
98 struct srvsvc_NetCharDevCtr0 c0;
99 uint32 levels[] = {0, 1};
103 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
105 r.in.ctr.ctr0->count = 0;
106 r.in.ctr.ctr0->array = NULL;
107 r.in.max_buffer = (uint32)-1;
108 r.in.resume_handle = NULL;
110 for (i=0;i<ARRAY_SIZE(levels);i++) {
115 r.in.level = levels[i];
116 printf("testing NetCharDevEnum level %u\n", r.in.level);
117 status = dcerpc_srvsvc_NetCharDevEnum(p, mem_ctx, &r);
118 if (!NT_STATUS_IS_OK(status)) {
119 printf("NetCharDevEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
123 if (!W_ERROR_IS_OK(r.out.result)) {
124 printf("NetCharDevEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
128 /* call test_NetCharDevGetInfo and test_NetCharDevControl for each returned share */
129 if (r.in.level == 1) {
130 for (j=0;j<r.out.ctr.ctr1->count;j++) {
132 device = r.out.ctr.ctr1->array[j].device;
133 if (!test_NetCharDevGetInfo(p, mem_ctx, device)) {
136 if (!test_NetCharDevControl(p, mem_ctx, device)) {
146 static BOOL test_NetConnEnum(struct dcerpc_pipe *p,
150 struct srvsvc_NetConnEnum r;
151 struct srvsvc_NetConnCtr0 c0;
152 uint32_t levels[] = {0, 1};
156 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
157 r.in.path = talloc_asprintf(mem_ctx,"%s","ADMIN$");
159 r.in.ctr.ctr0->count = 0;
160 r.in.ctr.ctr0->array = NULL;
161 r.in.max_buffer = (uint32_t)-1;
162 r.in.resume_handle = NULL;
164 for (i=0;i<ARRAY_SIZE(levels);i++) {
166 r.in.level = levels[i];
167 printf("testing NetConnEnum level %u\n", r.in.level);
168 status = dcerpc_srvsvc_NetConnEnum(p, mem_ctx, &r);
169 if (!NT_STATUS_IS_OK(status)) {
170 printf("NetConnEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
174 if (!W_ERROR_IS_OK(r.out.result)) {
175 printf("NetConnEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
183 static BOOL test_NetFileEnum(struct dcerpc_pipe *p,
187 struct srvsvc_NetFileEnum r;
188 struct srvsvc_NetFileCtr3 c3;
189 uint32_t levels[] = {2, 3};
193 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
197 r.in.ctr.ctr3->count = 0;
198 r.in.ctr.ctr3->array = NULL;
199 r.in.max_buffer = (uint32_t)4096;
200 r.in.resume_handle = NULL;
202 for (i=0;i<ARRAY_SIZE(levels);i++) {
204 r.in.level = levels[i];
205 printf("testing NetFileEnum level %u\n", r.in.level);
206 status = dcerpc_srvsvc_NetFileEnum(p, mem_ctx, &r);
207 if (!NT_STATUS_IS_OK(status)) {
208 printf("NetFileEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
212 if (!W_ERROR_IS_OK(r.out.result)) {
213 printf("NetFileEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
221 static BOOL test_NetSessEnum(struct dcerpc_pipe *p,
225 struct srvsvc_NetSessEnum r;
226 struct srvsvc_NetSessCtr0 c0;
227 uint32_t levels[] = {0, 1, 2, 10, 502};
231 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
235 r.in.ctr.ctr0->count = 0;
236 r.in.ctr.ctr0->array = NULL;
237 r.in.max_buffer = (uint32_t)-1;
238 r.in.resume_handle = NULL;
240 for (i=0;i<ARRAY_SIZE(levels);i++) {
242 r.in.level = levels[i];
243 printf("testing NetSessEnum level %u\n", r.in.level);
244 status = dcerpc_srvsvc_NetSessEnum(p, mem_ctx, &r);
245 if (!NT_STATUS_IS_OK(status)) {
246 printf("NetSessEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
250 if (!W_ERROR_IS_OK(r.out.result)) {
251 printf("NetSessEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
259 /**************************/
260 /* srvsvc_NetShare */
261 /**************************/
262 static BOOL test_NetShareGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
263 const char *sharename)
266 struct srvsvc_NetShareGetInfo r;
267 uint32_t levels[] = {0, 1, 2, 501, 502, 1005};
271 r.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
272 r.in.share_name = sharename;
274 for (i=0;i<ARRAY_SIZE(levels);i++) {
276 r.in.level = levels[i];
278 printf("testing NetShareGetInfo level %u on share '%s'\n",
279 r.in.level, r.in.share_name);
281 status = dcerpc_srvsvc_NetShareGetInfo(p, mem_ctx, &r);
282 if (!NT_STATUS_IS_OK(status)) {
283 printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
284 r.in.level, r.in.share_name, nt_errstr(status));
288 if (!W_ERROR_IS_OK(r.out.result)) {
289 printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
290 r.in.level, r.in.share_name, win_errstr(r.out.result));
298 static BOOL test_NetShareEnumAll(struct dcerpc_pipe *p,
302 struct srvsvc_NetShareEnumAll r;
303 struct srvsvc_NetShareCtr0 c0;
304 uint32_t levels[] = {0, 1, 2, 501, 502};
307 uint32_t resume_handle;
311 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
313 r.in.max_buffer = (uint32_t)-1;
314 r.in.resume_handle = &resume_handle;
315 r.out.resume_handle = &resume_handle;
317 for (i=0;i<ARRAY_SIZE(levels);i++) {
322 r.in.level = levels[i];
323 printf("testing NetShareEnumAll level %u\n", r.in.level);
324 status = dcerpc_srvsvc_NetShareEnumAll(p, mem_ctx, &r);
325 if (!NT_STATUS_IS_OK(status)) {
326 printf("NetShareEnumAll level %u failed - %s\n", r.in.level, nt_errstr(status));
330 if (!W_ERROR_IS_OK(r.out.result)) {
331 printf("NetShareEnumAll level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
335 /* call srvsvc_NetShareGetInfo for each returned share */
336 if (r.in.level == 1) {
337 for (j=0;j<r.out.ctr.ctr1->count;j++) {
339 name = r.out.ctr.ctr1->array[j].name;
340 if (!test_NetShareGetInfo(p, mem_ctx, name)) {
350 static BOOL test_NetShareEnum(struct dcerpc_pipe *p,
354 struct srvsvc_NetShareEnum r;
355 struct srvsvc_NetShareCtr0 c0;
356 uint32_t levels[] = {0, 1, 2, 502};
360 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
362 r.in.ctr.ctr0->count = 0;
363 r.in.ctr.ctr0->array = NULL;
364 r.in.max_buffer = (uint32_t)-1;
365 r.in.resume_handle = NULL;
367 for (i=0;i<ARRAY_SIZE(levels);i++) {
371 r.in.level = levels[i];
372 printf("testing NetShareEnum level %u\n", r.in.level);
373 status = dcerpc_srvsvc_NetShareEnum(p, mem_ctx, &r);
374 if (!NT_STATUS_IS_OK(status)) {
375 printf("NetShareEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
379 if (!W_ERROR_IS_OK(r.out.result)) {
380 printf("NetShareEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
384 /* call srvsvc_NetShareGetInfo for each returned share */
385 if (r.in.level == 1) {
386 for (j=0;j<r.out.ctr.ctr1->count;j++) {
388 name = r.out.ctr.ctr1->array[j].name;
389 if (!test_NetShareGetInfo(p, mem_ctx, name)) {
399 /**************************/
401 /**************************/
402 static BOOL test_NetDiskEnum(struct dcerpc_pipe *p,
406 struct srvsvc_NetDiskEnum r;
407 uint32_t levels[] = {0};
410 uint32_t resume_handle=0;
412 r.in.server_unc = NULL;
414 r.in.resume_handle = &resume_handle;
415 r.in.ctr.ctr0 = NULL;
417 for (i=0;i<ARRAY_SIZE(levels);i++) {
419 r.in.level = levels[i];
420 printf("testing NetDiskEnum level %u\n", r.in.level);
421 status = dcerpc_srvsvc_NetDiskEnum(p, mem_ctx, &r);
422 if (!NT_STATUS_IS_OK(status)) {
423 NDR_PRINT_OUT_DEBUG(srvsvc_NetDiskEnum, &r);
424 printf("NetDiskEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
428 if (!W_ERROR_IS_OK(r.out.result)) {
429 printf("NetDiskEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
437 /**************************/
438 /* srvsvc_NetTransport */
439 /**************************/
440 static BOOL test_NetTransportEnum(struct dcerpc_pipe *p,
444 struct srvsvc_NetTransportEnum r;
445 struct srvsvc_NetTransportCtr0 c0;
446 uint32_t levels[] = {0, 1};
450 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
452 r.in.ctr.ctr0->count = 0;
453 r.in.ctr.ctr0->array = NULL;
454 r.in.max_buffer = (uint32_t)-1;
455 r.in.resume_handle = NULL;
457 for (i=0;i<ARRAY_SIZE(levels);i++) {
459 r.in.level = levels[i];
460 printf("testing NetTransportEnum level %u\n", r.in.level);
461 status = dcerpc_srvsvc_NetTransportEnum(p, mem_ctx, &r);
462 if (!NT_STATUS_IS_OK(status)) {
463 printf("NetTransportEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
467 if (!W_ERROR_IS_OK(r.out.result)) {
468 printf("NetTransportEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
476 BOOL torture_rpc_srvsvc(int dummy)
479 struct dcerpc_pipe *p;
483 mem_ctx = talloc_init("torture_rpc_srvsvc");
485 status = torture_rpc_connection(&p,
488 DCERPC_SRVSVC_VERSION);
489 if (!NT_STATUS_IS_OK(status)) {
493 if (!test_NetCharDevEnum(p, mem_ctx)) {
497 if (!test_NetConnEnum(p, mem_ctx)) {
501 if (!test_NetFileEnum(p, mem_ctx)) {
505 if (!test_NetSessEnum(p, mem_ctx)) {
509 if (!test_NetShareEnumAll(p, mem_ctx)) {
513 if (!test_NetDiskEnum(p, mem_ctx)) {
517 if (!test_NetTransportEnum(p, mem_ctx)) {
521 if (!test_NetShareEnum(p, mem_ctx)) {
525 talloc_destroy(mem_ctx);
527 torture_rpc_close(p);