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.
23 #include "torture/torture.h"
24 #include "librpc/gen_ndr/ndr_srvsvc.h"
25 #include "librpc/gen_ndr/ndr_srvsvc_c.h"
26 #include "torture/rpc/rpc.h"
28 /**************************/
29 /* srvsvc_NetCharDev */
30 /**************************/
31 static BOOL test_NetCharDevGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
35 struct srvsvc_NetCharDevGetInfo r;
36 uint32_t levels[] = {0, 1};
40 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
41 r.in.device_name = devname;
43 for (i=0;i<ARRAY_SIZE(levels);i++) {
45 r.in.level = levels[i];
46 d_printf("testing NetCharDevGetInfo level %u on device '%s'\n",
47 r.in.level, r.in.device_name);
48 status = dcerpc_srvsvc_NetCharDevGetInfo(p, mem_ctx, &r);
49 if (!NT_STATUS_IS_OK(status)) {
50 d_printf("NetCharDevGetInfo level %u on device '%s' failed - %s\n",
51 r.in.level, r.in.device_name, nt_errstr(status));
55 if (!W_ERROR_IS_OK(r.out.result)) {
56 d_printf("NetCharDevGetInfo level %u on device '%s' failed - %s\n",
57 r.in.level, r.in.device_name, win_errstr(r.out.result));
65 static BOOL test_NetCharDevControl(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
69 struct srvsvc_NetCharDevControl r;
70 uint32_t opcodes[] = {0, 1};
74 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
75 r.in.device_name = devname;
77 for (i=0;i<ARRAY_SIZE(opcodes);i++) {
79 r.in.opcode = opcodes[i];
80 d_printf("testing NetCharDevControl opcode %u on device '%s'\n",
81 r.in.opcode, r.in.device_name);
82 status = dcerpc_srvsvc_NetCharDevControl(p, mem_ctx, &r);
83 if (!NT_STATUS_IS_OK(status)) {
84 d_printf("NetCharDevControl opcode %u failed - %s\n", r.in.opcode, nt_errstr(status));
88 if (!W_ERROR_IS_OK(r.out.result)) {
89 d_printf("NetCharDevControl opcode %u failed - %s\n", r.in.opcode, win_errstr(r.out.result));
97 static BOOL test_NetCharDevEnum(struct dcerpc_pipe *p,
101 struct srvsvc_NetCharDevEnum r;
102 struct srvsvc_NetCharDevCtr0 c0;
103 uint32_t levels[] = {0, 1};
107 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
109 r.in.ctr.ctr0->count = 0;
110 r.in.ctr.ctr0->array = NULL;
111 r.in.max_buffer = (uint32_t)-1;
112 r.in.resume_handle = NULL;
114 for (i=0;i<ARRAY_SIZE(levels);i++) {
119 r.in.level = levels[i];
120 printf("testing NetCharDevEnum level %u\n", r.in.level);
121 status = dcerpc_srvsvc_NetCharDevEnum(p, mem_ctx, &r);
122 if (!NT_STATUS_IS_OK(status)) {
123 d_printf("NetCharDevEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
127 if (!W_ERROR_IS_OK(r.out.result)) {
128 d_printf("NetCharDevEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
132 /* call test_NetCharDevGetInfo and test_NetCharDevControl for each returned share */
133 if (r.in.level == 1) {
134 for (j=0;j<r.out.ctr.ctr1->count;j++) {
136 device = r.out.ctr.ctr1->array[j].device;
137 if (!test_NetCharDevGetInfo(p, mem_ctx, device)) {
140 if (!test_NetCharDevControl(p, mem_ctx, device)) {
150 /**************************/
151 /* srvsvc_NetCharDevQ */
152 /**************************/
153 static BOOL test_NetCharDevQGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
154 const char *devicequeue)
157 struct srvsvc_NetCharDevQGetInfo r;
158 uint32_t levels[] = {0, 1};
162 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
163 r.in.queue_name = devicequeue;
164 r.in.user = talloc_asprintf(mem_ctx,"Administrator");
166 for (i=0;i<ARRAY_SIZE(levels);i++) {
168 r.in.level = levels[i];
169 d_printf("testing NetCharDevQGetInfo level %u on devicequeue '%s'\n",
170 r.in.level, r.in.queue_name);
171 status = dcerpc_srvsvc_NetCharDevQGetInfo(p, mem_ctx, &r);
172 if (!NT_STATUS_IS_OK(status)) {
173 d_printf("NetCharDevQGetInfo level %u on devicequeue '%s' failed - %s\n",
174 r.in.level, r.in.queue_name, nt_errstr(status));
178 if (!W_ERROR_IS_OK(r.out.result)) {
179 printf("NetCharDevQGetInfo level %u on devicequeue '%s' failed - %s\n",
180 r.in.level, r.in.queue_name, win_errstr(r.out.result));
189 static BOOL test_NetCharDevQSetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
190 const char *devicequeue)
193 struct srvsvc_NetCharDevQSetInfo r;
195 uint32_t levels[] = {0, 1};
199 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
200 r.in.queue_name = devicequeue;
202 for (i=0;i<ARRAY_SIZE(levels);i++) {
205 r.in.level = levels[i];
206 d_printf("testing NetCharDevQSetInfo level %u on devicequeue '%s'\n",
207 r.in.level, devicequeue);
208 switch (r.in.level) {
210 r.in.info.info0 = talloc(mem_ctx, struct srvsvc_NetCharDevQInfo0);
211 r.in.info.info0->device = r.in.queue_name;
214 r.in.info.info1 = talloc(mem_ctx, struct srvsvc_NetCharDevQInfo1);
215 r.in.info.info1->device = r.in.queue_name;
216 r.in.info.info1->priority = 0x000;
217 r.in.info.info1->devices = r.in.queue_name;
218 r.in.info.info1->users = 0x000;
219 r.in.info.info1->num_ahead = 0x000;
224 r.in.parm_error = &parm_error;
225 status = dcerpc_srvsvc_NetCharDevQSetInfo(p, mem_ctx, &r);
226 if (!NT_STATUS_IS_OK(status)) {
227 d_printf("NetCharDevQSetInfo level %u on devicequeue '%s' failed - %s\n",
228 r.in.level, r.in.queue_name, nt_errstr(status));
232 if (!W_ERROR_IS_OK(r.out.result)) {
233 d_printf("NetCharDevQSetInfo level %u on devicequeue '%s' failed - %s\n",
234 r.in.level, r.in.queue_name, win_errstr(r.out.result));
243 static BOOL test_NetCharDevQEnum(struct dcerpc_pipe *p,
247 struct srvsvc_NetCharDevQEnum r;
248 struct srvsvc_NetCharDevQCtr0 c0;
249 uint32_t levels[] = {0, 1};
253 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
254 r.in.user = talloc_asprintf(mem_ctx,"%s","Administrator");
256 r.in.ctr.ctr0->count = 0;
257 r.in.ctr.ctr0->array = NULL;
258 r.in.max_buffer = (uint32_t)-1;
259 r.in.resume_handle = NULL;
261 for (i=0;i<ARRAY_SIZE(levels);i++) {
265 r.in.level = levels[i];
266 printf("testing NetCharDevQEnum level %u\n", r.in.level);
267 status = dcerpc_srvsvc_NetCharDevQEnum(p, mem_ctx, &r);
268 if (!NT_STATUS_IS_OK(status)) {
269 d_printf("NetCharDevQEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
273 if (!W_ERROR_IS_OK(r.out.result)) {
274 d_printf("NetCharDevQEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
278 /* call test_NetCharDevGetInfo and test_NetCharDevControl for each returned share */
279 if (r.in.level == 1) {
280 for (j=0;j<r.out.ctr.ctr1->count;j++) {
282 device = r.out.ctr.ctr1->array[j].device;
283 if (!test_NetCharDevQGetInfo(p, mem_ctx, device)) {
293 /**************************/
295 /**************************/
296 static BOOL test_NetConnEnum(struct dcerpc_pipe *p,
300 struct srvsvc_NetConnEnum r;
301 struct srvsvc_NetConnCtr0 c0;
302 uint32_t levels[] = {0, 1};
306 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
307 r.in.path = talloc_asprintf(mem_ctx,"%s","ADMIN$");
309 r.in.ctr.ctr0->count = 0;
310 r.in.ctr.ctr0->array = NULL;
311 r.in.max_buffer = (uint32_t)-1;
312 r.in.resume_handle = NULL;
314 for (i=0;i<ARRAY_SIZE(levels);i++) {
316 r.in.level = levels[i];
317 d_printf("testing NetConnEnum level %u\n", r.in.level);
318 status = dcerpc_srvsvc_NetConnEnum(p, mem_ctx, &r);
319 if (!NT_STATUS_IS_OK(status)) {
320 d_printf("NetConnEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
324 if (!W_ERROR_IS_OK(r.out.result)) {
325 d_printf("NetConnEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
333 /**************************/
335 /**************************/
336 static BOOL test_NetFileEnum(struct dcerpc_pipe *p,
340 struct srvsvc_NetFileEnum r;
341 struct srvsvc_NetFileCtr3 c3;
342 uint32_t levels[] = {2, 3};
346 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
350 r.in.ctr.ctr3->count = 0;
351 r.in.ctr.ctr3->array = NULL;
352 r.in.max_buffer = (uint32_t)4096;
353 r.in.resume_handle = NULL;
355 for (i=0;i<ARRAY_SIZE(levels);i++) {
357 r.in.level = levels[i];
358 d_printf("testing NetFileEnum level %u\n", r.in.level);
359 status = dcerpc_srvsvc_NetFileEnum(p, mem_ctx, &r);
360 if (!NT_STATUS_IS_OK(status)) {
361 d_printf("NetFileEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
365 if (!W_ERROR_IS_OK(r.out.result)) {
366 d_printf("NetFileEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
374 /**************************/
376 /**************************/
377 static BOOL test_NetSessEnum(struct dcerpc_pipe *p,
381 struct srvsvc_NetSessEnum r;
382 struct srvsvc_NetSessCtr0 c0;
383 uint32_t levels[] = {0, 1, 2, 10, 502};
387 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
391 r.in.ctr.ctr0->count = 0;
392 r.in.ctr.ctr0->array = NULL;
393 r.in.max_buffer = (uint32_t)-1;
394 r.in.resume_handle = NULL;
396 for (i=0;i<ARRAY_SIZE(levels);i++) {
398 r.in.level = levels[i];
399 d_printf("testing NetSessEnum level %u\n", r.in.level);
400 status = dcerpc_srvsvc_NetSessEnum(p, mem_ctx, &r);
401 if (!NT_STATUS_IS_OK(status)) {
402 d_printf("NetSessEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
406 if (!W_ERROR_IS_OK(r.out.result)) {
407 d_printf("NetSessEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
415 /**************************/
416 /* srvsvc_NetShare */
417 /**************************/
418 static BOOL test_NetShareCheck(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
419 const char *device_name)
422 struct srvsvc_NetShareCheck r;
425 r.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
426 r.in.device_name = device_name;
428 d_printf("testing NetShareCheck on device '%s'\n", r.in.device_name);
430 status = dcerpc_srvsvc_NetShareCheck(p, mem_ctx, &r);
431 if (!NT_STATUS_IS_OK(status)) {
432 d_printf("dcerpc_srvsvc_NetShareCheck on device '%s' failed - %s\n",
433 r.in.device_name, nt_errstr(status));
435 } else if (!W_ERROR_IS_OK(r.out.result)) {
436 d_printf("NetShareCheck on device '%s' failed - %s\n",
437 r.in.device_name, win_errstr(r.out.result));
444 static BOOL test_NetShareGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
445 const char *sharename, BOOL admin)
448 struct srvsvc_NetShareGetInfo r;
454 { 0, WERR_OK, WERR_OK },
455 { 1, WERR_OK, WERR_OK },
456 { 2, WERR_ACCESS_DENIED, WERR_OK },
457 { 501, WERR_OK, WERR_OK },
458 { 502, WERR_ACCESS_DENIED, WERR_OK },
459 { 1005, WERR_OK, WERR_OK },
464 r.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
465 r.in.share_name = sharename;
467 for (i=0;i<ARRAY_SIZE(levels);i++) {
470 r.in.level = levels[i].level;
471 expected = levels[i].anon_status;
472 if (admin) expected = levels[i].admin_status;
475 d_printf("testing NetShareGetInfo level %u on share '%s'\n",
476 r.in.level, r.in.share_name);
478 status = dcerpc_srvsvc_NetShareGetInfo(p, mem_ctx, &r);
479 if (!NT_STATUS_IS_OK(status)) {
480 d_printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
481 r.in.level, r.in.share_name, nt_errstr(status));
485 if (!W_ERROR_EQUAL(r.out.result, expected)) {
486 d_printf("NetShareGetInfo level %u on share '%s' failed - %s (expected %s)\n",
487 r.in.level, r.in.share_name, win_errstr(r.out.result),
488 win_errstr(expected));
493 if (r.in.level != 2) continue;
494 if (!r.out.info.info2 || !r.out.info.info2->path) continue;
495 if (!test_NetShareCheck(p, mem_ctx, r.out.info.info2->path)) {
503 static BOOL test_NetShareAddSetDel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
506 struct srvsvc_NetShareAdd a;
507 struct srvsvc_NetShareSetInfo r;
508 struct srvsvc_NetShareGetInfo q;
509 struct srvsvc_NetShareDel d;
514 { 0, WERR_UNKNOWN_LEVEL },
517 { 501, WERR_UNKNOWN_LEVEL },
522 /* { 1007, WERR_OK }, */
528 a.in.server_unc = r.in.server_unc = q.in.server_unc = d.in.server_unc =
529 talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
530 r.in.share_name = talloc_strdup(mem_ctx, "testshare");
533 a.in.info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
534 a.in.info.info2->name = r.in.share_name;
535 a.in.info.info2->type = STYPE_DISKTREE;
536 a.in.info.info2->comment = talloc_strdup(mem_ctx, "test comment");
537 a.in.info.info2->permissions = 123434566;
538 a.in.info.info2->max_users = -1;
539 a.in.info.info2->current_users = 0;
540 a.in.info.info2->path = talloc_strdup(mem_ctx, "C:\\");
541 a.in.info.info2->password = NULL;
543 a.in.parm_error = NULL;
545 status = dcerpc_srvsvc_NetShareAdd(p, mem_ctx, &a);
546 if (!NT_STATUS_IS_OK(status)) {
547 d_printf("NetShareAdd level 2 on share 'testshare' failed - %s\n",
550 } else if (!W_ERROR_EQUAL(a.out.result, WERR_OK)) {
551 d_printf("NetShareAdd level 2 on share 'testshare' failed - %s\n",
552 win_errstr(a.out.result));
556 r.in.parm_error = NULL;
560 for (i = 0; i < ARRAY_SIZE(levels); i++) {
562 r.in.level = levels[i].level;
565 d_printf("testing NetShareSetInfo level %u on share '%s'\n",
566 r.in.level, r.in.share_name);
568 switch (levels[i].level) {
570 r.in.info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
571 r.in.info.info0->name = r.in.share_name;
574 r.in.info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
575 r.in.info.info1->name = r.in.share_name;
576 r.in.info.info1->type = STYPE_DISKTREE;
577 r.in.info.info1->comment = talloc_strdup(mem_ctx, "test comment 1");
580 r.in.info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
581 r.in.info.info2->name = r.in.share_name;
582 r.in.info.info2->type = STYPE_DISKTREE;
583 r.in.info.info2->comment = talloc_strdup(mem_ctx, "test comment 2");
584 r.in.info.info2->permissions = 0;
585 r.in.info.info2->max_users = 2;
586 r.in.info.info2->current_users = 1;
587 r.in.info.info2->path = talloc_strdup(mem_ctx, "::BLaH::"); /* "C:\\"); */
588 r.in.info.info2->password = NULL;
591 r.in.info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
592 r.in.info.info501->name = r.in.share_name;
593 r.in.info.info501->type = STYPE_DISKTREE;
594 r.in.info.info501->comment = talloc_strdup(mem_ctx, "test comment 501");
595 r.in.info.info501->csc_policy = 0;
598 r.in.info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
599 r.in.info.info502->name = r.in.share_name;
600 r.in.info.info502->type = STYPE_DISKTREE;
601 r.in.info.info502->comment = talloc_strdup(mem_ctx, "test comment 502");
602 r.in.info.info502->permissions = 0;
603 r.in.info.info502->max_users = 502;
604 r.in.info.info502->current_users = 1;
605 r.in.info.info502->path = talloc_strdup(mem_ctx, "C:\\");
606 r.in.info.info502->password = NULL;
607 r.in.info.info502->unknown = 0;
608 r.in.info.info502->sd = NULL;
611 r.in.info.info1004 = talloc(mem_ctx, struct srvsvc_NetShareInfo1004);
612 r.in.info.info1004->comment = talloc_strdup(mem_ctx, "test comment 1004");
615 r.in.info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
616 r.in.info.info1005->dfs_flags = 0;
619 r.in.info.info1006 = talloc(mem_ctx, struct srvsvc_NetShareInfo1006);
620 r.in.info.info1006->max_users = 1006;
623 r.in.info.info1007 = talloc(mem_ctx, struct srvsvc_NetShareInfo1007);
624 r.in.info.info1007->flags = 0;
625 r.in.info.info1007->alternate_directory_name = talloc_strdup(mem_ctx, "test");
629 r.in.info.info1501 = talloc_zero(mem_ctx, struct sec_desc_buf);
633 status = dcerpc_srvsvc_NetShareSetInfo(p, mem_ctx, &r);
634 if (!NT_STATUS_IS_OK(status)) {
635 d_printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
636 r.in.level, r.in.share_name, nt_errstr(status));
639 } else if (!W_ERROR_EQUAL(r.out.result, levels[i].expected)) {
640 d_printf("NetShareSetInfo level %u on share '%s' failed - %s (expected %s)\n",
641 r.in.level, r.in.share_name, win_errstr(r.out.result),
642 win_errstr(levels[i].expected));
647 q.in.share_name = r.in.share_name;
649 status = dcerpc_srvsvc_NetShareGetInfo(p, mem_ctx, &q);
650 if (!NT_STATUS_IS_OK(status)) {
651 d_printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
652 q.in.level, q.in.share_name, nt_errstr(status));
655 } else if (!W_ERROR_EQUAL(q.out.result, WERR_OK)) {
656 d_printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
657 q.in.level, q.in.share_name, win_errstr(q.out.result));
662 if (strcmp(q.out.info.info502->name, r.in.share_name) != 0) {
665 switch (levels[i].level) {
669 if (strcmp(q.out.info.info502->comment, "test comment 1") != 0)
673 if (strcmp(q.out.info.info502->comment, "test comment 2") != 0)
675 if (q.out.info.info2->max_users != 2)
677 if (strcmp(q.out.info.info2->path, "C:\\") != 0)
681 if (strcmp(q.out.info.info501->comment, "test comment 501") != 0)
685 if (strcmp(q.out.info.info502->comment, "test comment 502") != 0)
687 if (q.out.info.info2->max_users != 502)
689 if (strcmp(q.out.info.info2->path, "C:\\") != 0)
693 if (strcmp(q.out.info.info502->comment, "test comment 1004") != 0)
699 if (q.out.info.info2->max_users != 1006)
710 d.in.share_name = r.in.share_name;
713 status = dcerpc_srvsvc_NetShareDel(p, mem_ctx, &d);
714 if (!NT_STATUS_IS_OK(status)) {
715 d_printf("NetShareDel on share 'testshare502' failed - %s\n",
718 } else if (!W_ERROR_EQUAL(a.out.result, WERR_OK)) {
719 d_printf("NetShareDel on share 'testshare502' failed - %s\n",
720 win_errstr(d.out.result));
727 /**************************/
728 /* srvsvc_NetShare */
729 /**************************/
730 static BOOL test_NetShareEnumAll(struct dcerpc_pipe *p,
731 TALLOC_CTX *mem_ctx, BOOL admin)
734 struct srvsvc_NetShareEnumAll r;
735 struct srvsvc_NetShareCtr0 c0;
741 { 0, WERR_OK, WERR_OK },
742 { 1, WERR_OK, WERR_OK },
743 { 2, WERR_ACCESS_DENIED, WERR_OK },
744 { 501, WERR_ACCESS_DENIED, WERR_OK },
745 { 502, WERR_ACCESS_DENIED, WERR_OK },
749 uint32_t resume_handle;
753 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
755 r.in.max_buffer = (uint32_t)-1;
756 r.in.resume_handle = &resume_handle;
757 r.out.resume_handle = &resume_handle;
759 for (i=0;i<ARRAY_SIZE(levels);i++) {
763 r.in.level = levels[i].level;
764 expected = levels[i].anon_status;
765 if (admin) expected = levels[i].admin_status;
770 d_printf("testing NetShareEnumAll level %u\n", r.in.level);
771 status = dcerpc_srvsvc_NetShareEnumAll(p, mem_ctx, &r);
772 if (!NT_STATUS_IS_OK(status)) {
773 d_printf("NetShareEnumAll level %u failed - %s\n", r.in.level, nt_errstr(status));
777 if (!W_ERROR_EQUAL(r.out.result, expected)) {
778 d_printf("NetShareEnumAll level %u failed - %s (expected %s)\n",
779 r.in.level, win_errstr(r.out.result),
780 win_errstr(expected));
784 /* call srvsvc_NetShareGetInfo for each returned share */
785 if (r.in.level == 2 && r.out.ctr.ctr2) {
786 for (j=0;j<r.out.ctr.ctr2->count;j++) {
788 name = r.out.ctr.ctr2->array[j].name;
789 if (!test_NetShareGetInfo(p, mem_ctx, name, admin)) {
799 static BOOL test_NetShareEnum(struct dcerpc_pipe *p,
800 TALLOC_CTX *mem_ctx, BOOL admin)
803 struct srvsvc_NetShareEnum r;
804 struct srvsvc_NetShareCtr0 c0;
810 { 0, WERR_OK, WERR_OK },
811 { 1, WERR_OK, WERR_OK },
812 { 2, WERR_ACCESS_DENIED, WERR_OK },
813 { 501, WERR_UNKNOWN_LEVEL, WERR_UNKNOWN_LEVEL },
814 { 502, WERR_ACCESS_DENIED, WERR_OK },
819 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
821 r.in.ctr.ctr0->count = 0;
822 r.in.ctr.ctr0->array = NULL;
823 r.in.max_buffer = (uint32_t)-1;
824 r.in.resume_handle = NULL;
826 for (i=0;i<ARRAY_SIZE(levels);i++) {
829 r.in.level = levels[i].level;
830 expected = levels[i].anon_status;
831 if (admin) expected = levels[i].admin_status;
835 d_printf("testing NetShareEnum level %u\n", r.in.level);
836 status = dcerpc_srvsvc_NetShareEnum(p, mem_ctx, &r);
837 if (!NT_STATUS_IS_OK(status)) {
838 d_printf("NetShareEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
842 if (!W_ERROR_EQUAL(r.out.result, expected)) {
843 d_printf("NetShareEnum level %u failed - %s (expected %s)\n",
844 r.in.level, win_errstr(r.out.result),
845 win_errstr(expected));
853 /**************************/
855 /**************************/
856 static BOOL test_NetSrvGetInfo(struct dcerpc_pipe *p,
860 struct srvsvc_NetSrvGetInfo r;
861 struct srvsvc_NetSrvInfo503 i503;
862 uint32_t levels[] = {100, 101, 102, 502, 503};
865 uint32_t resume_handle;
869 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
871 for (i=0;i<ARRAY_SIZE(levels);i++) {
874 r.in.level = levels[i];
875 d_printf("testing NetSrvGetInfo level %u\n", r.in.level);
876 status = dcerpc_srvsvc_NetSrvGetInfo(p, mem_ctx, &r);
877 if (!NT_STATUS_IS_OK(status)) {
878 d_printf("NetSrvGetInfo level %u failed - %s\n", r.in.level, nt_errstr(status));
882 if (!W_ERROR_IS_OK(r.out.result)) {
883 d_printf("NetSrvGetInfo level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
891 /**************************/
893 /**************************/
894 static BOOL test_NetDiskEnum(struct dcerpc_pipe *p,
898 struct srvsvc_NetDiskEnum r;
899 uint32_t levels[] = {0};
902 uint32_t resume_handle=0;
905 r.in.server_unc = NULL;
906 r.in.resume_handle = &resume_handle;
908 for (i=0;i<ARRAY_SIZE(levels);i++) {
910 r.in.level = levels[i];
911 d_printf("testing NetDiskEnum level %u\n", r.in.level);
912 status = dcerpc_srvsvc_NetDiskEnum(p, mem_ctx, &r);
913 if (!NT_STATUS_IS_OK(status)) {
914 NDR_PRINT_OUT_DEBUG(srvsvc_NetDiskEnum, &r);
915 d_printf("NetDiskEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
919 if (!W_ERROR_IS_OK(r.out.result)) {
920 d_printf("NetDiskEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
928 /**************************/
929 /* srvsvc_NetTransport */
930 /**************************/
931 static BOOL test_NetTransportEnum(struct dcerpc_pipe *p,
935 struct srvsvc_NetTransportEnum r;
936 struct srvsvc_NetTransportCtr0 c0;
937 uint32_t levels[] = {0, 1};
941 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
942 r.in.transports.ctr0 = &c0;
943 r.in.transports.ctr0->count = 0;
944 r.in.transports.ctr0->array = NULL;
945 r.in.max_buffer = (uint32_t)-1;
946 r.in.resume_handle = NULL;
948 for (i=0;i<ARRAY_SIZE(levels);i++) {
950 r.in.level = levels[i];
951 d_printf("testing NetTransportEnum level %u\n", r.in.level);
952 status = dcerpc_srvsvc_NetTransportEnum(p, mem_ctx, &r);
953 if (!NT_STATUS_IS_OK(status)) {
954 d_printf("NetTransportEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
958 if (!W_ERROR_IS_OK(r.out.result)) {
959 d_printf("NetTransportEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
967 /**************************/
968 /* srvsvc_NetRemoteTOD */
969 /**************************/
970 static BOOL test_NetRemoteTOD(struct dcerpc_pipe *p,
974 struct srvsvc_NetRemoteTOD r;
977 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
980 d_printf("testing NetRemoteTOD\n");
981 status = dcerpc_srvsvc_NetRemoteTOD(p, mem_ctx, &r);
982 if (!NT_STATUS_IS_OK(status)) {
983 d_printf("NetRemoteTOD failed - %s\n", nt_errstr(status));
986 if (!W_ERROR_IS_OK(r.out.result)) {
987 d_printf("NetRemoteTOD failed - %s\n", win_errstr(r.out.result));
993 /**************************/
995 /**************************/
997 static BOOL test_NetNameValidate(struct dcerpc_pipe *p,
1001 struct srvsvc_NetNameValidate r;
1006 r.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
1009 d_printf("testing NetNameValidate\n");
1011 /* valid path types only between 1 and 13 */
1012 for (i = 1; i < 14; i++) {
1015 /* let's limit ourselves to a maximum of 4096 bytes */
1016 r.in.name = name = talloc_array(mem_ctx, char, 4097);
1023 /* Find maximum length accepted by this type */
1026 memset(name, 'A', n);
1029 status = dcerpc_srvsvc_NetNameValidate(p, mem_ctx, &r);
1030 if (!NT_STATUS_IS_OK(status)) {
1031 d_printf("NetNameValidate failed while checking maximum size (%s)\n",
1036 if (W_ERROR_IS_OK(r.out.result)) {
1038 n += (max - min + 1)/2;
1042 if ((min + 1) >= max) break; /* found it */
1050 talloc_free(r.in.name);
1052 d_printf("Maximum length for type %2d, flags %08x: %d\n", i, r.in.flags, max);
1054 /* find invalid chars for this type check only ASCII between 0x20 and 0x7e */
1056 invalidc = talloc_strdup(mem_ctx, "");
1058 for (n = 0x20; n < 0x7e; n++) {
1059 r.in.name = talloc_asprintf(mem_ctx, "%c", (char)n);
1061 status = dcerpc_srvsvc_NetNameValidate(p, mem_ctx, &r);
1062 if (!NT_STATUS_IS_OK(status)) {
1063 d_printf("NetNameValidate failed while checking valid chars (%s)\n",
1068 if (!W_ERROR_IS_OK(r.out.result)) {
1069 invalidc = talloc_asprintf_append(invalidc, "%c", (char)n);
1072 talloc_free(r.in.name);
1075 d_printf(" Invalid chars for type %2d, flags %08x: \"%s\"\n", i, r.in.flags, invalidc);
1077 /* only two values are accepted for flags: 0x0 and 0x80000000 */
1078 if (r.in.flags == 0x0) {
1079 r.in.flags = 0x80000000;
1089 BOOL torture_rpc_srvsvc(struct torture_context *torture)
1092 struct dcerpc_pipe *p;
1093 TALLOC_CTX *mem_ctx;
1095 const char *binding = lp_parm_string(-1, "torture", "binding");
1096 struct cli_credentials *anon_credentials;
1098 mem_ctx = talloc_init("torture_rpc_srvsvc");
1100 status = torture_rpc_connection(mem_ctx, &p, &dcerpc_table_srvsvc);
1101 if (!NT_STATUS_IS_OK(status)) {
1102 talloc_free(mem_ctx);
1106 ret &= test_NetCharDevEnum(p, mem_ctx);
1107 ret &= test_NetCharDevQEnum(p, mem_ctx);
1108 ret &= test_NetConnEnum(p, mem_ctx);
1109 ret &= test_NetFileEnum(p, mem_ctx);
1110 ret &= test_NetSessEnum(p, mem_ctx);
1111 ret &= test_NetShareEnumAll(p, mem_ctx, True);
1112 ret &= test_NetSrvGetInfo(p, mem_ctx);
1113 ret &= test_NetDiskEnum(p, mem_ctx);
1114 ret &= test_NetTransportEnum(p, mem_ctx);
1115 ret &= test_NetRemoteTOD(p, mem_ctx);
1116 ret &= test_NetShareEnum(p, mem_ctx, True);
1117 ret &= test_NetShareGetInfo(p, mem_ctx, "ADMIN$", True);
1118 /* ret &= test_NetShareAddSetDel(p, mem_ctx); */
1119 ret &= test_NetNameValidate(p, mem_ctx);
1121 status = torture_rpc_connection(mem_ctx, &p, &dcerpc_table_srvsvc);
1124 d_printf("You must specify a ncacn binding string\n");
1128 anon_credentials = cli_credentials_init(mem_ctx);
1129 cli_credentials_set_conf(anon_credentials);
1130 cli_credentials_set_anonymous(anon_credentials);
1132 status = dcerpc_pipe_connect(mem_ctx,
1133 &p, binding, &dcerpc_table_srvsvc,
1134 anon_credentials, NULL);
1135 if (!NT_STATUS_IS_OK(status)) {
1136 talloc_free(mem_ctx);
1140 ret &= test_NetShareEnumAll(p, mem_ctx, False);
1141 ret &= test_NetShareEnum(p, mem_ctx, False);
1142 ret &= test_NetShareGetInfo(p, mem_ctx, "ADMIN$", False);
1144 talloc_free(mem_ctx);