2 Unix SMB/CIFS implementation.
3 test suite for wkssvc rpc operations
5 Copyright (C) Andrew Tridgell 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_wkssvc_c.h"
24 #include "torture/rpc/rpc.h"
25 #include "lib/cmdline/popt_common.h"
26 #include "param/param.h"
28 #define SMBTORTURE_ALTERNATE_NAME "smbtrt_altname"
29 #define SMBTORTURE_TRANSPORT_NAME "\\Device\\smbtrt_transport_name"
30 #define SMBTORTURE_USE_NAME "S:"
32 static bool test_NetWkstaGetInfo(struct torture_context *tctx,
33 struct dcerpc_pipe *p)
36 struct wkssvc_NetWkstaGetInfo r;
37 union wkssvc_NetWkstaInfo info;
38 uint16_t levels[] = {100, 101, 102, 502};
41 r.in.server_name = dcerpc_server_name(p);
44 for (i=0;i<ARRAY_SIZE(levels);i++) {
45 r.in.level = levels[i];
46 torture_comment(tctx, "testing NetWkstaGetInfo level %u\n", r.in.level);
47 status = dcerpc_wkssvc_NetWkstaGetInfo(p, tctx, &r);
48 torture_assert_ntstatus_ok(tctx, status,
49 talloc_asprintf(tctx, "NetWkstaGetInfo level %u failed", r.in.level));
50 torture_assert_werr_ok(tctx, r.out.result,
51 talloc_asprintf(tctx, "NetWkstaGetInfo level %u failed", r.in.level));
57 static bool test_NetWkstaTransportEnum(struct torture_context *tctx,
58 struct dcerpc_pipe *p)
61 struct wkssvc_NetWkstaTransportEnum r;
62 uint32_t resume_handle = 0;
63 struct wkssvc_NetWkstaTransportInfo info;
64 union wkssvc_NetWkstaTransportCtr ctr;
65 struct wkssvc_NetWkstaTransportCtr0 ctr0;
66 uint32_t total_entries = 0;
74 r.in.server_name = dcerpc_server_name(p);
76 r.in.max_buffer = (uint32_t)-1;
77 r.in.resume_handle = &resume_handle;
78 r.out.total_entries = &total_entries;
80 r.out.resume_handle = &resume_handle;
82 torture_comment(tctx, "testing NetWkstaTransportEnum level 0\n");
84 status = dcerpc_wkssvc_NetWkstaTransportEnum(p, tctx, &r);
85 torture_assert_ntstatus_ok(tctx, status,
86 "NetWkstaTransportEnum failed");
87 torture_assert_werr_ok(tctx, r.out.result, talloc_asprintf(tctx,
88 "NetWkstaTransportEnum level %u failed",
94 static bool test_NetrWkstaTransportAdd(struct torture_context *tctx,
95 struct dcerpc_pipe *p)
98 struct wkssvc_NetrWkstaTransportAdd r;
99 struct wkssvc_NetWkstaTransportInfo0 info0;
100 uint32_t parm_err = 0;
104 info0.quality_of_service = 0xffff;
106 info0.name = SMBTORTURE_TRANSPORT_NAME;
107 info0.address = "000000000000";
108 info0.wan_link = 0x400;
110 r.in.server_name = dcerpc_server_name(p);
113 r.in.parm_err = r.out.parm_err = &parm_err;
115 torture_comment(tctx, "testing NetrWkstaTransportAdd level 0\n");
117 status = dcerpc_wkssvc_NetrWkstaTransportAdd(p, tctx, &r);
118 torture_assert_ntstatus_ok(tctx, status,
119 "NetrWkstaTransportAdd failed");
120 torture_assert_werr_equal(tctx, r.out.result,
122 "NetrWkstaTransportAdd level 0 failed");
127 static bool test_NetrWkstaTransportDel(struct torture_context *tctx,
128 struct dcerpc_pipe *p)
131 struct wkssvc_NetrWkstaTransportDel r;
133 r.in.server_name = dcerpc_server_name(p);
134 r.in.transport_name = SMBTORTURE_TRANSPORT_NAME;
137 torture_comment(tctx, "testing NetrWkstaTransportDel\n");
139 status = dcerpc_wkssvc_NetrWkstaTransportDel(p, tctx, &r);
140 torture_assert_ntstatus_ok(tctx, status,
141 "NetrWkstaTransportDel failed");
142 torture_assert_werr_ok(tctx, r.out.result,
143 "NetrWkstaTransportDel");
148 static bool test_NetWkstaEnumUsers(struct torture_context *tctx,
149 struct dcerpc_pipe *p)
152 struct wkssvc_NetWkstaEnumUsers r;
154 uint32_t entries_read = 0;
155 struct wkssvc_NetWkstaEnumUsersInfo info;
156 struct wkssvc_NetWkstaEnumUsersCtr0 *user0;
157 struct wkssvc_NetWkstaEnumUsersCtr1 *user1;
158 uint32_t levels[] = { 0, 1 };
161 for (i=0; i<ARRAY_SIZE(levels); i++) {
165 info.level = levels[i];
166 switch (info.level) {
168 user0 = talloc_zero(tctx,
169 struct wkssvc_NetWkstaEnumUsersCtr0);
170 info.ctr.user0 = user0;
173 user1 = talloc_zero(tctx,
174 struct wkssvc_NetWkstaEnumUsersCtr1);
175 info.ctr.user1 = user1;
181 r.in.server_name = dcerpc_server_name(p);
182 r.in.prefmaxlen = (uint32_t)-1;
183 r.in.info = r.out.info = &info;
184 r.in.resume_handle = r.out.resume_handle = &handle;
186 r.out.entries_read = &entries_read;
188 torture_comment(tctx, "testing NetWkstaEnumUsers level %u\n",
191 status = dcerpc_wkssvc_NetWkstaEnumUsers(p, tctx, &r);
192 torture_assert_ntstatus_ok(tctx, status,
193 "NetWkstaEnumUsers failed");
194 torture_assert_werr_ok(tctx, r.out.result,
195 "NetWkstaEnumUsers failed");
201 static bool test_NetrWkstaUserGetInfo(struct torture_context *tctx,
202 struct dcerpc_pipe *p)
205 struct wkssvc_NetrWkstaUserGetInfo r;
206 union wkssvc_NetrWkstaUserInfo info;
207 const char *dom = lp_workgroup(global_loadparm);
208 struct cli_credentials *creds = cmdline_credentials;
209 const char *user = cli_credentials_get_username(creds);
217 { NULL, 0, WERR_NO_SUCH_LOGON_SESSION },
218 { NULL, 1, WERR_NO_SUCH_LOGON_SESSION },
219 { NULL, 1101, WERR_OK },
220 { dom, 0, WERR_INVALID_PARAM },
221 { dom, 1, WERR_INVALID_PARAM },
222 { dom, 1101, WERR_INVALID_PARAM },
223 { user, 0, WERR_INVALID_PARAM },
224 { user, 1, WERR_INVALID_PARAM },
225 { user, 1101, WERR_INVALID_PARAM },
228 for (i=0; i<ARRAY_SIZE(tests); i++) {
229 r.in.unknown = tests[i].unknown;
230 r.in.level = tests[i].level;
233 torture_comment(tctx, "testing NetrWkstaUserGetInfo level %u\n",
236 status = dcerpc_wkssvc_NetrWkstaUserGetInfo(p, tctx, &r);
237 torture_assert_ntstatus_ok(tctx, status,
238 "NetrWkstaUserGetInfo failed");
239 torture_assert_werr_equal(tctx, r.out.result,
241 "NetrWkstaUserGetInfo failed");
247 static bool test_NetrUseEnum(struct torture_context *tctx,
248 struct dcerpc_pipe *p)
251 struct wkssvc_NetrUseEnum r;
253 uint32_t entries_read = 0;
254 struct wkssvc_NetrUseEnumInfo info;
255 struct wkssvc_NetrUseEnumCtr0 *use0;
256 struct wkssvc_NetrUseEnumCtr1 *use1;
257 struct wkssvc_NetrUseEnumCtr2 *use2;
258 uint32_t levels[] = { 0, 1, 2 };
261 for (i=0; i<ARRAY_SIZE(levels); i++) {
265 info.level = levels[i];
266 switch (info.level) {
268 use0 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr0);
269 info.ctr.ctr0 = use0;
272 use1 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr1);
273 info.ctr.ctr1 = use1;
276 use2 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr2);
277 info.ctr.ctr2 = use2;
283 r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
284 r.in.prefmaxlen = (uint32_t)-1;
285 r.in.info = r.out.info = &info;
286 r.in.resume_handle = r.out.resume_handle = &handle;
288 r.out.entries_read = &entries_read;
290 torture_comment(tctx, "testing NetrUseEnum level %u\n",
293 status = dcerpc_wkssvc_NetrUseEnum(p, tctx, &r);
294 torture_assert_ntstatus_ok(tctx, status,
295 "NetrUseEnum failed");
296 torture_assert_werr_ok(tctx, r.out.result,
297 "NetrUseEnum failed");
303 static bool test_NetrUseAdd(struct torture_context *tctx,
304 struct dcerpc_pipe *p)
307 struct wkssvc_NetrUseAdd r;
308 struct wkssvc_NetrUseInfo0 info0;
309 struct wkssvc_NetrUseInfo1 info1;
310 union wkssvc_NetrUseGetInfoCtr *ctr;
311 uint32_t parm_err = 0;
313 ctr = talloc(tctx, union wkssvc_NetrUseGetInfoCtr);
317 info0.local = SMBTORTURE_USE_NAME;
318 info0.remote = "\\\\localhost\\c$";
322 r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
325 r.in.parm_err = r.out.parm_err = &parm_err;
327 torture_comment(tctx, "testing NetrUseAdd level %u\n",
330 status = dcerpc_wkssvc_NetrUseAdd(p, tctx, &r);
331 torture_assert_ntstatus_ok(tctx, status,
332 "NetrUseAdd failed");
333 torture_assert_werr_equal(tctx, r.out.result, WERR_UNKNOWN_LEVEL,
334 "NetrUseAdd failed");
339 info1.local = SMBTORTURE_USE_NAME;
340 info1.remote = "\\\\localhost\\sysvol";
341 info1.password = NULL;
345 r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
348 r.in.parm_err = r.out.parm_err = &parm_err;
350 torture_comment(tctx, "testing NetrUseAdd level %u\n",
353 status = dcerpc_wkssvc_NetrUseAdd(p, tctx, &r);
354 torture_assert_ntstatus_ok(tctx, status,
355 "NetrUseAdd failed");
356 torture_assert_werr_ok(tctx, r.out.result,
357 "NetrUseAdd failed");
362 static bool test_NetrUseDel(struct torture_context *tctx,
363 struct dcerpc_pipe *p)
366 struct wkssvc_NetrUseDel r;
368 r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
369 r.in.use_name = SMBTORTURE_USE_NAME;
372 torture_comment(tctx, "testing NetrUseDel\n");
374 status = dcerpc_wkssvc_NetrUseDel(p, tctx, &r);
375 torture_assert_ntstatus_ok(tctx, status,
376 "NetrUseDel failed");
377 torture_assert_werr_ok(tctx, r.out.result,
378 "NetrUseDel failed");
382 static bool test_NetrUseGetInfo_level(struct torture_context *tctx,
383 struct dcerpc_pipe *p,
384 const char *use_name,
389 struct wkssvc_NetrUseGetInfo r;
390 union wkssvc_NetrUseGetInfoCtr ctr;
394 r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
395 r.in.use_name = use_name;
398 status = dcerpc_wkssvc_NetrUseGetInfo(p, tctx, &r);
400 torture_assert_ntstatus_ok(tctx, status,
401 "NetrUseGetInfo failed");
402 torture_assert_werr_equal(tctx, r.out.result, werr,
403 "NetrUseGetInfo failed");
407 static bool test_NetrUseGetInfo(struct torture_context *tctx,
408 struct dcerpc_pipe *p)
411 struct wkssvc_NetrUseEnum r;
413 uint32_t entries_read = 0;
414 struct wkssvc_NetrUseEnumInfo info;
415 struct wkssvc_NetrUseEnumCtr0 *use0;
416 uint32_t levels[] = { 0, 1, 2 };
417 const char *use_name = NULL;
423 use0 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr0);
424 info.ctr.ctr0 = use0;
426 r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
427 r.in.prefmaxlen = (uint32_t)-1;
428 r.in.info = r.out.info = &info;
429 r.in.resume_handle = r.out.resume_handle = &handle;
430 r.out.entries_read = &entries_read;
432 status = dcerpc_wkssvc_NetrUseEnum(p, tctx, &r);
433 torture_assert_ntstatus_ok(tctx, status,
434 "NetrUseEnum failed");
435 torture_assert_werr_ok(tctx, r.out.result,
436 "NetrUseEnum failed");
438 for (k=0; k < r.out.info->ctr.ctr0->count; k++) {
440 use_name = r.out.info->ctr.ctr0->array[k].local;
442 for (i=0; i<ARRAY_SIZE(levels); i++) {
444 if (!test_NetrUseGetInfo_level(tctx, p, use_name,
448 if (levels[i] != 0) {
454 use_name = r.out.info->ctr.ctr0->array[k].remote;
456 for (i=0; i<ARRAY_SIZE(levels); i++) {
458 if (!test_NetrUseGetInfo_level(tctx, p, use_name,
462 if (levels[i] != 0) {
472 static bool test_NetrLogonDomainNameAdd(struct torture_context *tctx,
473 struct dcerpc_pipe *p)
476 struct wkssvc_NetrLogonDomainNameAdd r;
478 r.in.domain_name = lp_workgroup(global_loadparm);
480 torture_comment(tctx, "testing NetrLogonDomainNameAdd\n");
482 status = dcerpc_wkssvc_NetrLogonDomainNameAdd(p, tctx, &r);
483 torture_assert_ntstatus_ok(tctx, status,
484 "NetrLogonDomainNameAdd failed");
485 torture_assert_werr_equal(tctx, r.out.result, WERR_NOT_SUPPORTED,
486 "NetrLogonDomainNameAdd failed");
490 static bool test_NetrLogonDomainNameDel(struct torture_context *tctx,
491 struct dcerpc_pipe *p)
494 struct wkssvc_NetrLogonDomainNameDel r;
496 r.in.domain_name = lp_workgroup(global_loadparm);
498 torture_comment(tctx, "testing NetrLogonDomainNameDel\n");
500 status = dcerpc_wkssvc_NetrLogonDomainNameDel(p, tctx, &r);
501 torture_assert_ntstatus_ok(tctx, status,
502 "NetrLogonDomainNameDel failed");
503 torture_assert_werr_equal(tctx, r.out.result, WERR_NOT_SUPPORTED,
504 "NetrLogonDomainNameDel failed");
508 static bool test_NetrEnumerateComputerNames_level(struct torture_context *tctx,
509 struct dcerpc_pipe *p,
515 struct wkssvc_NetrEnumerateComputerNames r;
516 struct wkssvc_ComputerNamesCtr *ctr;
519 ctr = talloc_zero(tctx, struct wkssvc_ComputerNamesCtr);
521 r.in.server_name = dcerpc_server_name(p);
522 r.in.name_type = level;
526 torture_comment(tctx, "testing NetrEnumerateComputerNames level %u\n",
529 status = dcerpc_wkssvc_NetrEnumerateComputerNames(p, tctx, &r);
530 torture_assert_ntstatus_ok(tctx, status,
531 "NetrEnumerateComputerNames failed");
532 torture_assert_werr_ok(tctx, r.out.result,
533 "NetrEnumerateComputerNames failed");
535 if ((level == NetPrimaryComputerName) && ctr->count != 1) {
536 torture_comment(tctx,
537 "NetrEnumerateComputerNames did not return one "
538 "name but %u\n", ctr->count);
542 if (names && num_names) {
545 for (i=0; i<ctr->count; i++) {
546 if (!add_string_to_array(tctx,
547 ctr->computer_name[i].string,
559 static bool test_NetrEnumerateComputerNames(struct torture_context *tctx,
560 struct dcerpc_pipe *p)
562 uint16_t levels[] = {0,1,2};
565 for (i=0; i<ARRAY_SIZE(levels); i++) {
567 if (!test_NetrEnumerateComputerNames_level(tctx,
579 static bool test_NetrValidateName(struct torture_context *tctx,
580 struct dcerpc_pipe *p)
583 struct wkssvc_NetrValidateName r;
584 uint16_t levels[] = {0,1,2,3,4,5};
587 for (i=0; i<ARRAY_SIZE(levels); i++) {
589 r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
590 r.in.name = lp_workgroup(global_loadparm);
592 r.in.Password = NULL;
593 r.in.name_type = levels[i];
595 torture_comment(tctx, "testing NetrValidateName level %u\n",
598 status = dcerpc_wkssvc_NetrValidateName(p, tctx, &r);
599 torture_assert_ntstatus_ok(tctx, status,
600 "NetrValidateName failed");
601 torture_assert_werr_equal(tctx, r.out.result,
603 "NetrValidateName failed");
609 static bool test_NetrValidateName2(struct torture_context *tctx,
610 struct dcerpc_pipe *p)
613 struct wkssvc_NetrValidateName2 r;
614 uint16_t levels[] = {0,1,2,3,4,5};
617 for (i=0; i<ARRAY_SIZE(levels); i++) {
619 r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
620 r.in.name = lp_workgroup(global_loadparm);
622 r.in.EncryptedPassword = NULL;
623 r.in.name_type = levels[i];
625 torture_comment(tctx, "testing NetrValidateName2 level %u\n",
628 status = dcerpc_wkssvc_NetrValidateName2(p, tctx, &r);
629 torture_assert_ntstatus_ok(tctx, status,
630 "NetrValidateName2 failed");
631 torture_assert_werr_equal(tctx, r.out.result,
632 WERR_RPC_E_REMOTE_DISABLED,
633 "NetrValidateName2 failed");
639 static bool test_NetrAddAlternateComputerName(struct torture_context *tctx,
640 struct dcerpc_pipe *p)
643 struct wkssvc_NetrAddAlternateComputerName r;
644 const char **names = NULL;
648 r.in.server_name = dcerpc_server_name(p);
649 r.in.NewAlternateMachineName = SMBTORTURE_ALTERNATE_NAME;
651 r.in.EncryptedPassword = NULL;
654 torture_comment(tctx, "testing NetrAddAlternateComputerName\n");
656 status = dcerpc_wkssvc_NetrAddAlternateComputerName(p, tctx, &r);
657 torture_assert_ntstatus_ok(tctx, status,
658 "NetrAddAlternateComputerName failed");
659 torture_assert_werr_ok(tctx, r.out.result,
660 "NetrAddAlternateComputerName failed");
662 if (!test_NetrEnumerateComputerNames_level(tctx, p,
663 NetAlternateComputerNames,
669 for (i=0; i<num_names; i++) {
670 if (strequal(names[i], SMBTORTURE_ALTERNATE_NAME)) {
675 torture_comment(tctx, "new alternate name not set\n");
680 static bool test_NetrRemoveAlternateComputerName(struct torture_context *tctx,
681 struct dcerpc_pipe *p)
684 struct wkssvc_NetrRemoveAlternateComputerName r;
685 const char **names = NULL;
689 r.in.server_name = dcerpc_server_name(p);
690 r.in.AlternateMachineNameToRemove = SMBTORTURE_ALTERNATE_NAME;
692 r.in.EncryptedPassword = NULL;
695 torture_comment(tctx, "testing NetrRemoveAlternateComputerName\n");
697 status = dcerpc_wkssvc_NetrRemoveAlternateComputerName(p, tctx, &r);
698 torture_assert_ntstatus_ok(tctx, status,
699 "NetrRemoveAlternateComputerName failed");
700 torture_assert_werr_ok(tctx, r.out.result,
701 "NetrRemoveAlternateComputerName failed");
703 if (!test_NetrEnumerateComputerNames_level(tctx, p,
704 NetAlternateComputerNames,
710 for (i=0; i<num_names; i++) {
711 if (strequal(names[i], SMBTORTURE_ALTERNATE_NAME)) {
719 struct torture_suite *torture_rpc_wkssvc(TALLOC_CTX *mem_ctx)
721 struct torture_suite *suite;
722 struct torture_rpc_tcase *tcase;
724 suite = torture_suite_create(mem_ctx, "WKSSVC");
725 tcase = torture_suite_add_rpc_iface_tcase(suite, "wkssvc",
728 torture_rpc_tcase_add_test(tcase, "NetWkstaGetInfo",
729 test_NetWkstaGetInfo);
731 torture_rpc_tcase_add_test(tcase, "NetWkstaTransportEnum",
732 test_NetWkstaTransportEnum);
733 torture_rpc_tcase_add_test(tcase, "NetrWkstaTransportDel",
734 test_NetrWkstaTransportDel);
735 torture_rpc_tcase_add_test(tcase, "NetrUseGetInfo",
736 test_NetrUseGetInfo);
737 torture_rpc_tcase_add_test(tcase, "NetrWkstaTransportAdd",
738 test_NetrWkstaTransportAdd);
740 torture_rpc_tcase_add_test(tcase, "NetWkstaEnumUsers",
741 test_NetWkstaEnumUsers);
742 torture_rpc_tcase_add_test(tcase, "NetrWkstaUserGetInfo",
743 test_NetrWkstaUserGetInfo);
745 torture_rpc_tcase_add_test(tcase, "NetrUseDel",
747 torture_rpc_tcase_add_test(tcase, "NetrUseEnum",
749 torture_rpc_tcase_add_test(tcase, "NetrUseAdd",
752 torture_rpc_tcase_add_test(tcase, "NetrValidateName",
753 test_NetrValidateName);
754 torture_rpc_tcase_add_test(tcase, "NetrValidateName2",
755 test_NetrValidateName2);
756 torture_rpc_tcase_add_test(tcase, "NetrLogonDomainNameDel",
757 test_NetrLogonDomainNameDel);
758 torture_rpc_tcase_add_test(tcase, "NetrLogonDomainNameAdd",
759 test_NetrLogonDomainNameAdd);
760 torture_rpc_tcase_add_test(tcase, "NetrRemoveAlternateComputerName",
761 test_NetrRemoveAlternateComputerName);
762 torture_rpc_tcase_add_test(tcase, "NetrAddAlternateComputerName",
763 test_NetrAddAlternateComputerName);
764 torture_rpc_tcase_add_test(tcase, "NetrEnumerateComputerNames",
765 test_NetrEnumerateComputerNames);