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_t 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 /**************************/
147 /* srvsvc_NetCharDevQ */
148 /**************************/
149 static BOOL test_NetCharDevQGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
150 const char *devicequeue)
153 struct srvsvc_NetCharDevQGetInfo r;
154 uint32_t levels[] = {0, 1};
158 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
159 r.in.queue_name = devicequeue;
160 r.in.user = talloc_asprintf(mem_ctx,"Administrator");
162 for (i=0;i<ARRAY_SIZE(levels);i++) {
164 r.in.level = levels[i];
165 printf("testing NetCharDevQGetInfo level %u on devicequeue '%s'\n",
166 r.in.level, r.in.queue_name);
167 status = dcerpc_srvsvc_NetCharDevQGetInfo(p, mem_ctx, &r);
168 if (!NT_STATUS_IS_OK(status)) {
169 printf("NetCharDevQGetInfo level %u on devicequeue '%s' failed - %s\n",
170 r.in.level, r.in.queue_name, nt_errstr(status));
174 if (!W_ERROR_IS_OK(r.out.result)) {
175 printf("NetCharDevQGetInfo level %u on devicequeue '%s' failed - %s\n",
176 r.in.level, r.in.queue_name, win_errstr(r.out.result));
185 static BOOL test_NetCharDevQSetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
186 const char *devicequeue)
189 struct srvsvc_NetCharDevQSetInfo r;
191 uint32_t levels[] = {0, 1};
195 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
196 r.in.queue_name = devicequeue;
198 for (i=0;i<ARRAY_SIZE(levels);i++) {
201 r.in.level = levels[i];
202 printf("testing NetCharDevQSetInfo level %u on devicequeue '%s'\n",
203 r.in.level, devicequeue);
204 switch (r.in.level) {
206 r.in.info.info0 = talloc_p(mem_ctx, struct srvsvc_NetCharDevQInfo0);
207 r.in.info.info0->device = r.in.queue_name;
210 r.in.info.info1 = talloc_p(mem_ctx, struct srvsvc_NetCharDevQInfo1);
211 r.in.info.info1->device = r.in.queue_name;
212 r.in.info.info1->priority = 0x000;
213 r.in.info.info1->devices = r.in.queue_name;
214 r.in.info.info1->users = 0x000;
215 r.in.info.info1->num_ahead = 0x000;
220 r.in.parm_error = &parm_error;
221 status = dcerpc_srvsvc_NetCharDevQSetInfo(p, mem_ctx, &r);
222 if (!NT_STATUS_IS_OK(status)) {
223 printf("NetCharDevQSetInfo level %u on devicequeue '%s' failed - %s\n",
224 r.in.level, r.in.queue_name, nt_errstr(status));
228 if (!W_ERROR_IS_OK(r.out.result)) {
229 printf("NetCharDevQSetInfo level %u on devicequeue '%s' failed - %s\n",
230 r.in.level, r.in.queue_name, win_errstr(r.out.result));
239 static BOOL test_NetCharDevQEnum(struct dcerpc_pipe *p,
243 struct srvsvc_NetCharDevQEnum r;
244 struct srvsvc_NetCharDevQCtr0 c0;
245 uint32_t levels[] = {0, 1};
249 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
250 r.in.user = talloc_asprintf(mem_ctx,"%s","Administrator");
252 r.in.ctr.ctr0->count = 0;
253 r.in.ctr.ctr0->array = NULL;
254 r.in.max_buffer = (uint32)-1;
255 r.in.resume_handle = NULL;
257 for (i=0;i<ARRAY_SIZE(levels);i++) {
261 r.in.level = levels[i];
262 printf("testing NetCharDevQEnum level %u\n", r.in.level);
263 status = dcerpc_srvsvc_NetCharDevQEnum(p, mem_ctx, &r);
264 if (!NT_STATUS_IS_OK(status)) {
265 printf("NetCharDevQEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
269 if (!W_ERROR_IS_OK(r.out.result)) {
270 printf("NetCharDevQEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
274 /* call test_NetCharDevGetInfo and test_NetCharDevControl for each returned share */
275 if (r.in.level == 1) {
276 for (j=0;j<r.out.ctr.ctr1->count;j++) {
278 device = r.out.ctr.ctr1->array[j].device;
279 if (!test_NetCharDevQGetInfo(p, mem_ctx, device)) {
289 /**************************/
291 /**************************/
292 static BOOL test_NetConnEnum(struct dcerpc_pipe *p,
296 struct srvsvc_NetConnEnum r;
297 struct srvsvc_NetConnCtr0 c0;
298 uint32_t levels[] = {0, 1};
302 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
303 r.in.path = talloc_asprintf(mem_ctx,"%s","ADMIN$");
305 r.in.ctr.ctr0->count = 0;
306 r.in.ctr.ctr0->array = NULL;
307 r.in.max_buffer = (uint32_t)-1;
308 r.in.resume_handle = NULL;
310 for (i=0;i<ARRAY_SIZE(levels);i++) {
312 r.in.level = levels[i];
313 printf("testing NetConnEnum level %u\n", r.in.level);
314 status = dcerpc_srvsvc_NetConnEnum(p, mem_ctx, &r);
315 if (!NT_STATUS_IS_OK(status)) {
316 printf("NetConnEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
320 if (!W_ERROR_IS_OK(r.out.result)) {
321 printf("NetConnEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
329 /**************************/
331 /**************************/
332 static BOOL test_NetFileEnum(struct dcerpc_pipe *p,
336 struct srvsvc_NetFileEnum r;
337 struct srvsvc_NetFileCtr3 c3;
338 uint32_t levels[] = {2, 3};
342 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
346 r.in.ctr.ctr3->count = 0;
347 r.in.ctr.ctr3->array = NULL;
348 r.in.max_buffer = (uint32_t)4096;
349 r.in.resume_handle = NULL;
351 for (i=0;i<ARRAY_SIZE(levels);i++) {
353 r.in.level = levels[i];
354 printf("testing NetFileEnum level %u\n", r.in.level);
355 status = dcerpc_srvsvc_NetFileEnum(p, mem_ctx, &r);
356 if (!NT_STATUS_IS_OK(status)) {
357 printf("NetFileEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
361 if (!W_ERROR_IS_OK(r.out.result)) {
362 printf("NetFileEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
370 /**************************/
372 /**************************/
373 static BOOL test_NetSessEnum(struct dcerpc_pipe *p,
377 struct srvsvc_NetSessEnum r;
378 struct srvsvc_NetSessCtr0 c0;
379 uint32_t levels[] = {0, 1, 2, 10, 502};
383 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
387 r.in.ctr.ctr0->count = 0;
388 r.in.ctr.ctr0->array = NULL;
389 r.in.max_buffer = (uint32_t)-1;
390 r.in.resume_handle = NULL;
392 for (i=0;i<ARRAY_SIZE(levels);i++) {
394 r.in.level = levels[i];
395 printf("testing NetSessEnum level %u\n", r.in.level);
396 status = dcerpc_srvsvc_NetSessEnum(p, mem_ctx, &r);
397 if (!NT_STATUS_IS_OK(status)) {
398 printf("NetSessEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
402 if (!W_ERROR_IS_OK(r.out.result)) {
403 printf("NetSessEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
411 /**************************/
412 /* srvsvc_NetShare */
413 /**************************/
414 static BOOL test_NetShareGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
415 const char *sharename)
418 struct srvsvc_NetShareGetInfo r;
419 uint32_t levels[] = {0, 1, 2, 501, 502, 1005};
423 r.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
424 r.in.share_name = sharename;
426 for (i=0;i<ARRAY_SIZE(levels);i++) {
428 r.in.level = levels[i];
430 printf("testing NetShareGetInfo level %u on share '%s'\n",
431 r.in.level, r.in.share_name);
433 status = dcerpc_srvsvc_NetShareGetInfo(p, mem_ctx, &r);
434 if (!NT_STATUS_IS_OK(status)) {
435 printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
436 r.in.level, r.in.share_name, nt_errstr(status));
440 if (!W_ERROR_IS_OK(r.out.result)) {
441 printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
442 r.in.level, r.in.share_name, win_errstr(r.out.result));
450 /**************************/
451 /* srvsvc_NetShare */
452 /**************************/
453 static BOOL test_NetShareEnumAll(struct dcerpc_pipe *p,
457 struct srvsvc_NetShareEnumAll r;
458 struct srvsvc_NetShareCtr0 c0;
459 uint32_t levels[] = {0, 1, 2, 501, 502};
462 uint32_t resume_handle;
466 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
468 r.in.max_buffer = (uint32_t)-1;
469 r.in.resume_handle = &resume_handle;
470 r.out.resume_handle = &resume_handle;
472 for (i=0;i<ARRAY_SIZE(levels);i++) {
477 r.in.level = levels[i];
478 printf("testing NetShareEnumAll level %u\n", r.in.level);
479 status = dcerpc_srvsvc_NetShareEnumAll(p, mem_ctx, &r);
480 if (!NT_STATUS_IS_OK(status)) {
481 printf("NetShareEnumAll level %u failed - %s\n", r.in.level, nt_errstr(status));
485 if (!W_ERROR_IS_OK(r.out.result)) {
486 printf("NetShareEnumAll level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
490 /* call srvsvc_NetShareGetInfo for each returned share */
491 if (r.in.level == 1) {
492 for (j=0;j<r.out.ctr.ctr1->count;j++) {
494 name = r.out.ctr.ctr1->array[j].name;
495 if (!test_NetShareGetInfo(p, mem_ctx, name)) {
505 static BOOL test_NetShareEnum(struct dcerpc_pipe *p,
509 struct srvsvc_NetShareEnum r;
510 struct srvsvc_NetShareCtr0 c0;
511 uint32_t levels[] = {0, 1, 2, 502};
515 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
517 r.in.ctr.ctr0->count = 0;
518 r.in.ctr.ctr0->array = NULL;
519 r.in.max_buffer = (uint32_t)-1;
520 r.in.resume_handle = NULL;
522 for (i=0;i<ARRAY_SIZE(levels);i++) {
524 r.in.level = levels[i];
525 printf("testing NetShareEnum level %u\n", r.in.level);
526 status = dcerpc_srvsvc_NetShareEnum(p, mem_ctx, &r);
527 if (!NT_STATUS_IS_OK(status)) {
528 printf("NetShareEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
532 if (!W_ERROR_IS_OK(r.out.result)) {
533 printf("NetShareEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
541 /**************************/
543 /**************************/
544 static BOOL test_NetSrvGetInfo(struct dcerpc_pipe *p,
548 struct srvsvc_NetSrvGetInfo r;
549 struct srvsvc_NetSrvInfo503 i503;
550 uint32_t levels[] = {100, 101, 102, 502, 503};
553 uint32_t resume_handle;
557 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
559 for (i=0;i<ARRAY_SIZE(levels);i++) {
562 r.in.level = levels[i];
563 printf("testing NetSrvGetInfo level %u\n", r.in.level);
564 status = dcerpc_srvsvc_NetSrvGetInfo(p, mem_ctx, &r);
565 if (!NT_STATUS_IS_OK(status)) {
566 printf("NetSrvGetInfo level %u failed - %s\n", r.in.level, nt_errstr(status));
570 if (!W_ERROR_IS_OK(r.out.result)) {
571 printf("NetSrvGetInfo level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
579 /**************************/
581 /**************************/
582 static BOOL test_NetDiskEnum(struct dcerpc_pipe *p,
586 struct srvsvc_NetDiskEnum r;
587 uint32_t levels[] = {0};
590 uint32_t resume_handle=0;
592 r.in.server_unc = NULL;
594 r.in.resume_handle = &resume_handle;
595 r.in.ctr.ctr0 = NULL;
597 for (i=0;i<ARRAY_SIZE(levels);i++) {
599 r.in.level = levels[i];
600 printf("testing NetDiskEnum level %u\n", r.in.level);
601 status = dcerpc_srvsvc_NetDiskEnum(p, mem_ctx, &r);
602 if (!NT_STATUS_IS_OK(status)) {
603 NDR_PRINT_OUT_DEBUG(srvsvc_NetDiskEnum, &r);
604 printf("NetDiskEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
608 if (!W_ERROR_IS_OK(r.out.result)) {
609 printf("NetDiskEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
617 /**************************/
618 /* srvsvc_NetTransport */
619 /**************************/
620 static BOOL test_NetTransportEnum(struct dcerpc_pipe *p,
624 struct srvsvc_NetTransportEnum r;
625 struct srvsvc_NetTransportCtr0 c0;
626 uint32_t levels[] = {0, 1};
630 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
632 r.in.ctr.ctr0->count = 0;
633 r.in.ctr.ctr0->array = NULL;
634 r.in.max_buffer = (uint32_t)-1;
635 r.in.resume_handle = NULL;
637 for (i=0;i<ARRAY_SIZE(levels);i++) {
639 r.in.level = levels[i];
640 printf("testing NetTransportEnum level %u\n", r.in.level);
641 status = dcerpc_srvsvc_NetTransportEnum(p, mem_ctx, &r);
642 if (!NT_STATUS_IS_OK(status)) {
643 printf("NetTransportEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
647 if (!W_ERROR_IS_OK(r.out.result)) {
648 printf("NetTransportEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
656 /**************************/
657 /* srvsvc_NetRemoteTOD */
658 /**************************/
659 static BOOL test_NetRemoteTOD(struct dcerpc_pipe *p,
663 struct srvsvc_NetRemoteTOD r;
666 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
669 printf("testing NetRemoteTOD\n");
670 status = dcerpc_srvsvc_NetRemoteTOD(p, mem_ctx, &r);
671 if (!NT_STATUS_IS_OK(status)) {
672 printf("NetRemoteTOD failed - %s\n", nt_errstr(status));
675 if (!W_ERROR_IS_OK(r.out.result)) {
676 printf("NetRemoteTOD failed - %s\n", win_errstr(r.out.result));
682 BOOL torture_rpc_srvsvc(int dummy)
685 struct dcerpc_pipe *p;
689 mem_ctx = talloc_init("torture_rpc_srvsvc");
691 status = torture_rpc_connection(&p,
694 DCERPC_SRVSVC_VERSION);
695 if (!NT_STATUS_IS_OK(status)) {
699 if (!test_NetCharDevEnum(p, mem_ctx)) {
703 if (!test_NetCharDevQEnum(p, mem_ctx)) {
707 if (!test_NetConnEnum(p, mem_ctx)) {
711 if (!test_NetFileEnum(p, mem_ctx)) {
715 if (!test_NetSessEnum(p, mem_ctx)) {
719 if (!test_NetShareEnumAll(p, mem_ctx)) {
723 if (!test_NetSrvGetInfo(p, mem_ctx)) {
727 if (!test_NetDiskEnum(p, mem_ctx)) {
731 if (!test_NetTransportEnum(p, mem_ctx)) {
735 if (!test_NetRemoteTOD(p, mem_ctx)) {
739 if (!test_NetShareEnum(p, mem_ctx)) {
743 talloc_destroy(mem_ctx);
745 torture_rpc_close(p);