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 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 #include "torture/torture.h"
23 #include "librpc/gen_ndr/ndr_srvsvc.h"
24 #include "librpc/gen_ndr/ndr_srvsvc_c.h"
25 #include "torture/rpc/rpc.h"
27 /**************************/
28 /* srvsvc_NetCharDev */
29 /**************************/
30 static BOOL test_NetCharDevGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
34 struct srvsvc_NetCharDevGetInfo r;
35 uint32_t levels[] = {0, 1};
39 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
40 r.in.device_name = devname;
42 for (i=0;i<ARRAY_SIZE(levels);i++) {
44 r.in.level = levels[i];
45 d_printf("testing NetCharDevGetInfo level %u on device '%s'\n",
46 r.in.level, r.in.device_name);
47 status = dcerpc_srvsvc_NetCharDevGetInfo(p, mem_ctx, &r);
48 if (!NT_STATUS_IS_OK(status)) {
49 d_printf("NetCharDevGetInfo level %u on device '%s' failed - %s\n",
50 r.in.level, r.in.device_name, nt_errstr(status));
54 if (!W_ERROR_IS_OK(r.out.result)) {
55 d_printf("NetCharDevGetInfo level %u on device '%s' failed - %s\n",
56 r.in.level, r.in.device_name, win_errstr(r.out.result));
64 static BOOL test_NetCharDevControl(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
68 struct srvsvc_NetCharDevControl r;
69 uint32_t opcodes[] = {0, 1};
73 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
74 r.in.device_name = devname;
76 for (i=0;i<ARRAY_SIZE(opcodes);i++) {
78 r.in.opcode = opcodes[i];
79 d_printf("testing NetCharDevControl opcode %u on device '%s'\n",
80 r.in.opcode, r.in.device_name);
81 status = dcerpc_srvsvc_NetCharDevControl(p, mem_ctx, &r);
82 if (!NT_STATUS_IS_OK(status)) {
83 d_printf("NetCharDevControl opcode %u failed - %s\n", r.in.opcode, nt_errstr(status));
87 if (!W_ERROR_IS_OK(r.out.result)) {
88 d_printf("NetCharDevControl opcode %u failed - %s\n", r.in.opcode, win_errstr(r.out.result));
96 static BOOL test_NetCharDevEnum(struct dcerpc_pipe *p,
100 struct srvsvc_NetCharDevEnum r;
101 struct srvsvc_NetCharDevCtr0 c0;
102 uint32_t levels[] = {0, 1};
106 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
108 r.in.ctr.ctr0->count = 0;
109 r.in.ctr.ctr0->array = NULL;
110 r.in.max_buffer = (uint32_t)-1;
111 r.in.resume_handle = NULL;
113 for (i=0;i<ARRAY_SIZE(levels);i++) {
118 r.in.level = levels[i];
119 printf("testing NetCharDevEnum level %u\n", r.in.level);
120 status = dcerpc_srvsvc_NetCharDevEnum(p, mem_ctx, &r);
121 if (!NT_STATUS_IS_OK(status)) {
122 d_printf("NetCharDevEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
126 if (!W_ERROR_IS_OK(r.out.result)) {
127 d_printf("NetCharDevEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
131 /* call test_NetCharDevGetInfo and test_NetCharDevControl for each returned share */
132 if (r.in.level == 1) {
133 for (j=0;j<r.out.ctr.ctr1->count;j++) {
135 device = r.out.ctr.ctr1->array[j].device;
136 if (!test_NetCharDevGetInfo(p, mem_ctx, device)) {
139 if (!test_NetCharDevControl(p, mem_ctx, device)) {
149 /**************************/
150 /* srvsvc_NetCharDevQ */
151 /**************************/
152 static BOOL test_NetCharDevQGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
153 const char *devicequeue)
156 struct srvsvc_NetCharDevQGetInfo r;
157 uint32_t levels[] = {0, 1};
161 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
162 r.in.queue_name = devicequeue;
163 r.in.user = talloc_asprintf(mem_ctx,"Administrator");
165 for (i=0;i<ARRAY_SIZE(levels);i++) {
167 r.in.level = levels[i];
168 d_printf("testing NetCharDevQGetInfo level %u on devicequeue '%s'\n",
169 r.in.level, r.in.queue_name);
170 status = dcerpc_srvsvc_NetCharDevQGetInfo(p, mem_ctx, &r);
171 if (!NT_STATUS_IS_OK(status)) {
172 d_printf("NetCharDevQGetInfo level %u on devicequeue '%s' failed - %s\n",
173 r.in.level, r.in.queue_name, nt_errstr(status));
177 if (!W_ERROR_IS_OK(r.out.result)) {
178 printf("NetCharDevQGetInfo level %u on devicequeue '%s' failed - %s\n",
179 r.in.level, r.in.queue_name, win_errstr(r.out.result));
188 static BOOL test_NetCharDevQSetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
189 const char *devicequeue)
192 struct srvsvc_NetCharDevQSetInfo r;
194 uint32_t levels[] = {0, 1};
198 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
199 r.in.queue_name = devicequeue;
201 for (i=0;i<ARRAY_SIZE(levels);i++) {
204 r.in.level = levels[i];
205 d_printf("testing NetCharDevQSetInfo level %u on devicequeue '%s'\n",
206 r.in.level, devicequeue);
207 switch (r.in.level) {
209 r.in.info.info0 = talloc(mem_ctx, struct srvsvc_NetCharDevQInfo0);
210 r.in.info.info0->device = r.in.queue_name;
213 r.in.info.info1 = talloc(mem_ctx, struct srvsvc_NetCharDevQInfo1);
214 r.in.info.info1->device = r.in.queue_name;
215 r.in.info.info1->priority = 0x000;
216 r.in.info.info1->devices = r.in.queue_name;
217 r.in.info.info1->users = 0x000;
218 r.in.info.info1->num_ahead = 0x000;
223 r.in.parm_error = &parm_error;
224 status = dcerpc_srvsvc_NetCharDevQSetInfo(p, mem_ctx, &r);
225 if (!NT_STATUS_IS_OK(status)) {
226 d_printf("NetCharDevQSetInfo level %u on devicequeue '%s' failed - %s\n",
227 r.in.level, r.in.queue_name, nt_errstr(status));
231 if (!W_ERROR_IS_OK(r.out.result)) {
232 d_printf("NetCharDevQSetInfo level %u on devicequeue '%s' failed - %s\n",
233 r.in.level, r.in.queue_name, win_errstr(r.out.result));
242 static BOOL test_NetCharDevQEnum(struct dcerpc_pipe *p,
246 struct srvsvc_NetCharDevQEnum r;
247 struct srvsvc_NetCharDevQCtr0 c0;
248 uint32_t levels[] = {0, 1};
252 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
253 r.in.user = talloc_asprintf(mem_ctx,"%s","Administrator");
255 r.in.ctr.ctr0->count = 0;
256 r.in.ctr.ctr0->array = NULL;
257 r.in.max_buffer = (uint32_t)-1;
258 r.in.resume_handle = NULL;
260 for (i=0;i<ARRAY_SIZE(levels);i++) {
264 r.in.level = levels[i];
265 printf("testing NetCharDevQEnum level %u\n", r.in.level);
266 status = dcerpc_srvsvc_NetCharDevQEnum(p, mem_ctx, &r);
267 if (!NT_STATUS_IS_OK(status)) {
268 d_printf("NetCharDevQEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
272 if (!W_ERROR_IS_OK(r.out.result)) {
273 d_printf("NetCharDevQEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
277 /* call test_NetCharDevGetInfo and test_NetCharDevControl for each returned share */
278 if (r.in.level == 1) {
279 for (j=0;j<r.out.ctr.ctr1->count;j++) {
281 device = r.out.ctr.ctr1->array[j].device;
282 if (!test_NetCharDevQGetInfo(p, mem_ctx, device)) {
292 /**************************/
294 /**************************/
295 static BOOL test_NetConnEnum(struct dcerpc_pipe *p,
299 struct srvsvc_NetConnEnum r;
300 struct srvsvc_NetConnCtr0 c0;
301 uint32_t levels[] = {0, 1};
305 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
306 r.in.path = talloc_asprintf(mem_ctx,"%s","ADMIN$");
308 r.in.ctr.ctr0->count = 0;
309 r.in.ctr.ctr0->array = NULL;
310 r.in.max_buffer = (uint32_t)-1;
311 r.in.resume_handle = NULL;
313 for (i=0;i<ARRAY_SIZE(levels);i++) {
315 r.in.level = levels[i];
316 d_printf("testing NetConnEnum level %u\n", r.in.level);
317 status = dcerpc_srvsvc_NetConnEnum(p, mem_ctx, &r);
318 if (!NT_STATUS_IS_OK(status)) {
319 d_printf("NetConnEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
323 if (!W_ERROR_IS_OK(r.out.result)) {
324 d_printf("NetConnEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
332 /**************************/
334 /**************************/
335 static BOOL test_NetFileEnum(struct dcerpc_pipe *p,
339 struct srvsvc_NetFileEnum r;
340 struct srvsvc_NetFileCtr3 c3;
341 uint32_t levels[] = {2, 3};
345 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
349 r.in.ctr.ctr3->count = 0;
350 r.in.ctr.ctr3->array = NULL;
351 r.in.max_buffer = (uint32_t)4096;
352 r.in.resume_handle = NULL;
354 for (i=0;i<ARRAY_SIZE(levels);i++) {
356 r.in.level = levels[i];
357 d_printf("testing NetFileEnum level %u\n", r.in.level);
358 status = dcerpc_srvsvc_NetFileEnum(p, mem_ctx, &r);
359 if (!NT_STATUS_IS_OK(status)) {
360 d_printf("NetFileEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
364 if (!W_ERROR_IS_OK(r.out.result)) {
365 d_printf("NetFileEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
373 /**************************/
375 /**************************/
376 static BOOL test_NetSessEnum(struct dcerpc_pipe *p,
380 struct srvsvc_NetSessEnum r;
381 struct srvsvc_NetSessCtr0 c0;
382 uint32_t levels[] = {0, 1, 2, 10, 502};
386 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
390 r.in.ctr.ctr0->count = 0;
391 r.in.ctr.ctr0->array = NULL;
392 r.in.max_buffer = (uint32_t)-1;
393 r.in.resume_handle = NULL;
395 for (i=0;i<ARRAY_SIZE(levels);i++) {
397 r.in.level = levels[i];
398 d_printf("testing NetSessEnum level %u\n", r.in.level);
399 status = dcerpc_srvsvc_NetSessEnum(p, mem_ctx, &r);
400 if (!NT_STATUS_IS_OK(status)) {
401 d_printf("NetSessEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
405 if (!W_ERROR_IS_OK(r.out.result)) {
406 d_printf("NetSessEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
414 /**************************/
415 /* srvsvc_NetShare */
416 /**************************/
417 static BOOL test_NetShareCheck(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
418 const char *device_name)
421 struct srvsvc_NetShareCheck r;
424 r.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
425 r.in.device_name = device_name;
427 d_printf("testing NetShareCheck on device '%s'\n", r.in.device_name);
429 status = dcerpc_srvsvc_NetShareCheck(p, mem_ctx, &r);
430 if (!NT_STATUS_IS_OK(status)) {
431 d_printf("dcerpc_srvsvc_NetShareCheck on device '%s' failed - %s\n",
432 r.in.device_name, nt_errstr(status));
434 } else if (!W_ERROR_IS_OK(r.out.result)) {
435 d_printf("NetShareCheck on device '%s' failed - %s\n",
436 r.in.device_name, win_errstr(r.out.result));
443 static BOOL test_NetShareGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
444 const char *sharename, BOOL admin)
447 struct srvsvc_NetShareGetInfo r;
453 { 0, WERR_OK, WERR_OK },
454 { 1, WERR_OK, WERR_OK },
455 { 2, WERR_ACCESS_DENIED, WERR_OK },
456 { 501, WERR_OK, WERR_OK },
457 { 502, WERR_ACCESS_DENIED, WERR_OK },
458 { 1005, WERR_OK, WERR_OK },
463 r.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
464 r.in.share_name = sharename;
466 for (i=0;i<ARRAY_SIZE(levels);i++) {
469 r.in.level = levels[i].level;
470 expected = levels[i].anon_status;
471 if (admin) expected = levels[i].admin_status;
474 d_printf("testing NetShareGetInfo level %u on share '%s'\n",
475 r.in.level, r.in.share_name);
477 status = dcerpc_srvsvc_NetShareGetInfo(p, mem_ctx, &r);
478 if (!NT_STATUS_IS_OK(status)) {
479 d_printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
480 r.in.level, r.in.share_name, nt_errstr(status));
484 if (!W_ERROR_EQUAL(r.out.result, expected)) {
485 d_printf("NetShareGetInfo level %u on share '%s' failed - %s (expected %s)\n",
486 r.in.level, r.in.share_name, win_errstr(r.out.result),
487 win_errstr(expected));
492 if (r.in.level != 2) continue;
493 if (!r.out.info.info2 || !r.out.info.info2->path) continue;
494 if (!test_NetShareCheck(p, mem_ctx, r.out.info.info2->path)) {
502 static BOOL test_NetShareAddSetDel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
505 struct srvsvc_NetShareAdd a;
506 struct srvsvc_NetShareSetInfo r;
507 struct srvsvc_NetShareGetInfo q;
508 struct srvsvc_NetShareDel d;
513 { 0, WERR_UNKNOWN_LEVEL },
516 { 501, WERR_UNKNOWN_LEVEL },
521 /* { 1007, WERR_OK }, */
527 if (!lp_parm_bool(-1, "torture", "dangerous", False)) {
528 d_printf("NetShareAddSetDel disabled - enable dangerous tests to use\n");
532 a.in.server_unc = r.in.server_unc = q.in.server_unc = d.in.server_unc =
533 talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
534 r.in.share_name = talloc_strdup(mem_ctx, "testshare");
537 a.in.info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
538 a.in.info.info2->name = r.in.share_name;
539 a.in.info.info2->type = STYPE_DISKTREE;
540 a.in.info.info2->comment = talloc_strdup(mem_ctx, "test comment");
541 a.in.info.info2->permissions = 123434566;
542 a.in.info.info2->max_users = -1;
543 a.in.info.info2->current_users = 0;
544 a.in.info.info2->path = talloc_strdup(mem_ctx, "C:\\");
545 a.in.info.info2->password = NULL;
547 a.in.parm_error = NULL;
549 status = dcerpc_srvsvc_NetShareAdd(p, mem_ctx, &a);
550 if (!NT_STATUS_IS_OK(status)) {
551 d_printf("NetShareAdd level 2 on share 'testshare' failed - %s\n",
554 } else if (!W_ERROR_EQUAL(a.out.result, WERR_OK)) {
555 d_printf("NetShareAdd level 2 on share 'testshare' failed - %s\n",
556 win_errstr(a.out.result));
560 r.in.parm_error = NULL;
564 for (i = 0; i < ARRAY_SIZE(levels); i++) {
566 r.in.level = levels[i].level;
569 d_printf("testing NetShareSetInfo level %u on share '%s'\n",
570 r.in.level, r.in.share_name);
572 switch (levels[i].level) {
574 r.in.info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
575 r.in.info.info0->name = r.in.share_name;
578 r.in.info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
579 r.in.info.info1->name = r.in.share_name;
580 r.in.info.info1->type = STYPE_DISKTREE;
581 r.in.info.info1->comment = talloc_strdup(mem_ctx, "test comment 1");
584 r.in.info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
585 r.in.info.info2->name = r.in.share_name;
586 r.in.info.info2->type = STYPE_DISKTREE;
587 r.in.info.info2->comment = talloc_strdup(mem_ctx, "test comment 2");
588 r.in.info.info2->permissions = 0;
589 r.in.info.info2->max_users = 2;
590 r.in.info.info2->current_users = 1;
591 r.in.info.info2->path = talloc_strdup(mem_ctx, "::BLaH::"); /* "C:\\"); */
592 r.in.info.info2->password = NULL;
595 r.in.info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
596 r.in.info.info501->name = r.in.share_name;
597 r.in.info.info501->type = STYPE_DISKTREE;
598 r.in.info.info501->comment = talloc_strdup(mem_ctx, "test comment 501");
599 r.in.info.info501->csc_policy = 0;
602 r.in.info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
603 r.in.info.info502->name = r.in.share_name;
604 r.in.info.info502->type = STYPE_DISKTREE;
605 r.in.info.info502->comment = talloc_strdup(mem_ctx, "test comment 502");
606 r.in.info.info502->permissions = 0;
607 r.in.info.info502->max_users = 502;
608 r.in.info.info502->current_users = 1;
609 r.in.info.info502->path = talloc_strdup(mem_ctx, "C:\\");
610 r.in.info.info502->password = NULL;
611 r.in.info.info502->unknown = 0;
612 r.in.info.info502->sd = NULL;
615 r.in.info.info1004 = talloc(mem_ctx, struct srvsvc_NetShareInfo1004);
616 r.in.info.info1004->comment = talloc_strdup(mem_ctx, "test comment 1004");
619 r.in.info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
620 r.in.info.info1005->dfs_flags = 0;
623 r.in.info.info1006 = talloc(mem_ctx, struct srvsvc_NetShareInfo1006);
624 r.in.info.info1006->max_users = 1006;
627 r.in.info.info1007 = talloc(mem_ctx, struct srvsvc_NetShareInfo1007);
628 r.in.info.info1007->flags = 0;
629 r.in.info.info1007->alternate_directory_name = talloc_strdup(mem_ctx, "test");
633 r.in.info.info1501 = talloc_zero(mem_ctx, struct sec_desc_buf);
637 status = dcerpc_srvsvc_NetShareSetInfo(p, mem_ctx, &r);
638 if (!NT_STATUS_IS_OK(status)) {
639 d_printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
640 r.in.level, r.in.share_name, nt_errstr(status));
643 } else if (!W_ERROR_EQUAL(r.out.result, levels[i].expected)) {
644 d_printf("NetShareSetInfo level %u on share '%s' failed - %s (expected %s)\n",
645 r.in.level, r.in.share_name, win_errstr(r.out.result),
646 win_errstr(levels[i].expected));
651 q.in.share_name = r.in.share_name;
653 status = dcerpc_srvsvc_NetShareGetInfo(p, mem_ctx, &q);
654 if (!NT_STATUS_IS_OK(status)) {
655 d_printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
656 q.in.level, q.in.share_name, nt_errstr(status));
659 } else if (!W_ERROR_EQUAL(q.out.result, WERR_OK)) {
660 d_printf("NetShareGetInfo level %u on share '%s' failed - %s\n",
661 q.in.level, q.in.share_name, win_errstr(q.out.result));
666 if (strcmp(q.out.info.info502->name, r.in.share_name) != 0) {
669 switch (levels[i].level) {
673 if (strcmp(q.out.info.info502->comment, "test comment 1") != 0)
677 if (strcmp(q.out.info.info502->comment, "test comment 2") != 0)
679 if (q.out.info.info2->max_users != 2)
681 if (strcmp(q.out.info.info2->path, "C:\\") != 0)
685 if (strcmp(q.out.info.info501->comment, "test comment 501") != 0)
689 if (strcmp(q.out.info.info502->comment, "test comment 502") != 0)
691 if (q.out.info.info2->max_users != 502)
693 if (strcmp(q.out.info.info2->path, "C:\\") != 0)
697 if (strcmp(q.out.info.info502->comment, "test comment 1004") != 0)
703 if (q.out.info.info2->max_users != 1006)
714 d.in.share_name = r.in.share_name;
717 status = dcerpc_srvsvc_NetShareDel(p, mem_ctx, &d);
718 if (!NT_STATUS_IS_OK(status)) {
719 d_printf("NetShareDel on share 'testshare502' failed - %s\n",
722 } else if (!W_ERROR_EQUAL(a.out.result, WERR_OK)) {
723 d_printf("NetShareDel on share 'testshare502' failed - %s\n",
724 win_errstr(d.out.result));
731 /**************************/
732 /* srvsvc_NetShare */
733 /**************************/
734 static BOOL test_NetShareEnumAll(struct dcerpc_pipe *p,
735 TALLOC_CTX *mem_ctx, BOOL admin)
738 struct srvsvc_NetShareEnumAll r;
739 struct srvsvc_NetShareCtr0 c0;
745 { 0, WERR_OK, WERR_OK },
746 { 1, WERR_OK, WERR_OK },
747 { 2, WERR_ACCESS_DENIED, WERR_OK },
748 { 501, WERR_ACCESS_DENIED, WERR_OK },
749 { 502, WERR_ACCESS_DENIED, WERR_OK },
753 uint32_t resume_handle;
757 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
759 r.in.max_buffer = (uint32_t)-1;
760 r.in.resume_handle = &resume_handle;
761 r.out.resume_handle = &resume_handle;
763 for (i=0;i<ARRAY_SIZE(levels);i++) {
767 r.in.level = levels[i].level;
768 expected = levels[i].anon_status;
769 if (admin) expected = levels[i].admin_status;
774 d_printf("testing NetShareEnumAll level %u\n", r.in.level);
775 status = dcerpc_srvsvc_NetShareEnumAll(p, mem_ctx, &r);
776 if (!NT_STATUS_IS_OK(status)) {
777 d_printf("NetShareEnumAll level %u failed - %s\n", r.in.level, nt_errstr(status));
781 if (!W_ERROR_EQUAL(r.out.result, expected)) {
782 d_printf("NetShareEnumAll level %u failed - %s (expected %s)\n",
783 r.in.level, win_errstr(r.out.result),
784 win_errstr(expected));
788 /* call srvsvc_NetShareGetInfo for each returned share */
789 if (r.in.level == 2 && r.out.ctr.ctr2) {
790 for (j=0;j<r.out.ctr.ctr2->count;j++) {
792 name = r.out.ctr.ctr2->array[j].name;
793 if (!test_NetShareGetInfo(p, mem_ctx, name, admin)) {
803 static BOOL test_NetShareEnum(struct dcerpc_pipe *p,
804 TALLOC_CTX *mem_ctx, BOOL admin)
807 struct srvsvc_NetShareEnum r;
808 struct srvsvc_NetShareCtr0 c0;
814 { 0, WERR_OK, WERR_OK },
815 { 1, WERR_OK, WERR_OK },
816 { 2, WERR_ACCESS_DENIED, WERR_OK },
817 { 501, WERR_UNKNOWN_LEVEL, WERR_UNKNOWN_LEVEL },
818 { 502, WERR_ACCESS_DENIED, WERR_OK },
823 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
825 r.in.ctr.ctr0->count = 0;
826 r.in.ctr.ctr0->array = NULL;
827 r.in.max_buffer = (uint32_t)-1;
828 r.in.resume_handle = NULL;
830 for (i=0;i<ARRAY_SIZE(levels);i++) {
833 r.in.level = levels[i].level;
834 expected = levels[i].anon_status;
835 if (admin) expected = levels[i].admin_status;
839 d_printf("testing NetShareEnum level %u\n", r.in.level);
840 status = dcerpc_srvsvc_NetShareEnum(p, mem_ctx, &r);
841 if (!NT_STATUS_IS_OK(status)) {
842 d_printf("NetShareEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
846 if (!W_ERROR_EQUAL(r.out.result, expected)) {
847 d_printf("NetShareEnum level %u failed - %s (expected %s)\n",
848 r.in.level, win_errstr(r.out.result),
849 win_errstr(expected));
857 /**************************/
859 /**************************/
860 static BOOL test_NetSrvGetInfo(struct dcerpc_pipe *p,
864 struct srvsvc_NetSrvGetInfo r;
865 struct srvsvc_NetSrvInfo503 i503;
866 uint32_t levels[] = {100, 101, 102, 502, 503};
869 uint32_t resume_handle;
873 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
875 for (i=0;i<ARRAY_SIZE(levels);i++) {
878 r.in.level = levels[i];
879 d_printf("testing NetSrvGetInfo level %u\n", r.in.level);
880 status = dcerpc_srvsvc_NetSrvGetInfo(p, mem_ctx, &r);
881 if (!NT_STATUS_IS_OK(status)) {
882 d_printf("NetSrvGetInfo level %u failed - %s\n", r.in.level, nt_errstr(status));
886 if (!W_ERROR_IS_OK(r.out.result)) {
887 d_printf("NetSrvGetInfo level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
895 /**************************/
897 /**************************/
898 static BOOL test_NetDiskEnum(struct dcerpc_pipe *p,
902 struct srvsvc_NetDiskEnum r;
903 uint32_t levels[] = {0};
906 uint32_t resume_handle=0;
909 r.in.server_unc = NULL;
910 r.in.resume_handle = &resume_handle;
912 for (i=0;i<ARRAY_SIZE(levels);i++) {
914 r.in.level = levels[i];
915 d_printf("testing NetDiskEnum level %u\n", r.in.level);
916 status = dcerpc_srvsvc_NetDiskEnum(p, mem_ctx, &r);
917 if (!NT_STATUS_IS_OK(status)) {
918 NDR_PRINT_OUT_DEBUG(srvsvc_NetDiskEnum, &r);
919 d_printf("NetDiskEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
923 if (!W_ERROR_IS_OK(r.out.result)) {
924 d_printf("NetDiskEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
932 /**************************/
933 /* srvsvc_NetTransport */
934 /**************************/
935 static BOOL test_NetTransportEnum(struct dcerpc_pipe *p,
939 struct srvsvc_NetTransportEnum r;
940 struct srvsvc_NetTransportCtr0 c0;
941 uint32_t levels[] = {0, 1};
945 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
946 r.in.transports.ctr0 = &c0;
947 r.in.transports.ctr0->count = 0;
948 r.in.transports.ctr0->array = NULL;
949 r.in.max_buffer = (uint32_t)-1;
950 r.in.resume_handle = NULL;
952 for (i=0;i<ARRAY_SIZE(levels);i++) {
954 r.in.level = levels[i];
955 d_printf("testing NetTransportEnum level %u\n", r.in.level);
956 status = dcerpc_srvsvc_NetTransportEnum(p, mem_ctx, &r);
957 if (!NT_STATUS_IS_OK(status)) {
958 d_printf("NetTransportEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
962 if (!W_ERROR_IS_OK(r.out.result)) {
963 d_printf("NetTransportEnum level %u failed - %s\n", r.in.level, win_errstr(r.out.result));
971 /**************************/
972 /* srvsvc_NetRemoteTOD */
973 /**************************/
974 static BOOL test_NetRemoteTOD(struct dcerpc_pipe *p,
978 struct srvsvc_NetRemoteTOD r;
981 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
984 d_printf("testing NetRemoteTOD\n");
985 status = dcerpc_srvsvc_NetRemoteTOD(p, mem_ctx, &r);
986 if (!NT_STATUS_IS_OK(status)) {
987 d_printf("NetRemoteTOD failed - %s\n", nt_errstr(status));
990 if (!W_ERROR_IS_OK(r.out.result)) {
991 d_printf("NetRemoteTOD failed - %s\n", win_errstr(r.out.result));
997 /**************************/
999 /**************************/
1001 static BOOL test_NetNameValidate(struct dcerpc_pipe *p,
1002 TALLOC_CTX *mem_ctx)
1005 struct srvsvc_NetNameValidate r;
1010 r.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
1013 d_printf("testing NetNameValidate\n");
1015 /* valid path types only between 1 and 13 */
1016 for (i = 1; i < 14; i++) {
1019 /* let's limit ourselves to a maximum of 4096 bytes */
1020 r.in.name = name = talloc_array(mem_ctx, char, 4097);
1027 /* Find maximum length accepted by this type */
1030 memset(name, 'A', n);
1033 status = dcerpc_srvsvc_NetNameValidate(p, mem_ctx, &r);
1034 if (!NT_STATUS_IS_OK(status)) {
1035 d_printf("NetNameValidate failed while checking maximum size (%s)\n",
1040 if (W_ERROR_IS_OK(r.out.result)) {
1042 n += (max - min + 1)/2;
1046 if ((min + 1) >= max) break; /* found it */
1056 d_printf("Maximum length for type %2d, flags %08x: %d\n", i, r.in.flags, max);
1058 /* find invalid chars for this type check only ASCII between 0x20 and 0x7e */
1060 invalidc = talloc_strdup(mem_ctx, "");
1062 for (n = 0x20; n < 0x7e; n++) {
1063 r.in.name = name = talloc_asprintf(mem_ctx, "%c", (char)n);
1065 status = dcerpc_srvsvc_NetNameValidate(p, mem_ctx, &r);
1066 if (!NT_STATUS_IS_OK(status)) {
1067 d_printf("NetNameValidate failed while checking valid chars (%s)\n",
1072 if (!W_ERROR_IS_OK(r.out.result)) {
1073 invalidc = talloc_asprintf_append(invalidc, "%c", (char)n);
1079 d_printf(" Invalid chars for type %2d, flags %08x: \"%s\"\n", i, r.in.flags, invalidc);
1081 /* only two values are accepted for flags: 0x0 and 0x80000000 */
1082 if (r.in.flags == 0x0) {
1083 r.in.flags = 0x80000000;
1093 BOOL torture_rpc_srvsvc(struct torture_context *torture)
1096 struct dcerpc_pipe *p;
1097 TALLOC_CTX *mem_ctx;
1099 const char *binding = torture_setting_string(torture, "binding", NULL);
1100 struct cli_credentials *anon_credentials;
1102 mem_ctx = talloc_init("torture_rpc_srvsvc");
1104 status = torture_rpc_connection(mem_ctx, &p, &ndr_table_srvsvc);
1105 if (!NT_STATUS_IS_OK(status)) {
1106 talloc_free(mem_ctx);
1110 ret &= test_NetCharDevEnum(p, mem_ctx);
1111 ret &= test_NetCharDevQEnum(p, mem_ctx);
1112 ret &= test_NetConnEnum(p, mem_ctx);
1113 ret &= test_NetFileEnum(p, mem_ctx);
1114 ret &= test_NetSessEnum(p, mem_ctx);
1115 ret &= test_NetShareEnumAll(p, mem_ctx, True);
1116 ret &= test_NetSrvGetInfo(p, mem_ctx);
1117 ret &= test_NetDiskEnum(p, mem_ctx);
1118 ret &= test_NetTransportEnum(p, mem_ctx);
1119 ret &= test_NetRemoteTOD(p, mem_ctx);
1120 ret &= test_NetShareEnum(p, mem_ctx, True);
1121 ret &= test_NetShareGetInfo(p, mem_ctx, "ADMIN$", True);
1122 ret &= test_NetShareAddSetDel(p, mem_ctx);
1123 ret &= test_NetNameValidate(p, mem_ctx);
1125 status = torture_rpc_connection(mem_ctx, &p, &ndr_table_srvsvc);
1128 d_printf("You must specify a ncacn binding string\n");
1132 anon_credentials = cli_credentials_init_anon(mem_ctx);
1134 status = dcerpc_pipe_connect(mem_ctx,
1135 &p, binding, &ndr_table_srvsvc,
1136 anon_credentials, NULL);
1137 if (!NT_STATUS_IS_OK(status)) {
1138 talloc_free(mem_ctx);
1142 ret &= test_NetShareEnumAll(p, mem_ctx, False);
1143 ret &= test_NetShareEnum(p, mem_ctx, False);
1144 ret &= test_NetShareGetInfo(p, mem_ctx, "ADMIN$", False);
1146 talloc_free(mem_ctx);