r26151: Add IDL and torture test for wkssvc_NetrValidateName() and
[sfrench/samba-autobuild/.git] / source4 / torture / rpc / wkssvc.c
1 /*
2    Unix SMB/CIFS implementation.
3    test suite for wkssvc rpc operations
4
5    Copyright (C) Andrew Tridgell 2003
6
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.
11
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.
16
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/>.
19 */
20
21 #include "includes.h"
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"
27
28 #define SMBTORTURE_TRANSPORT_NAME "\\Device\\smbtrt_transport_name"
29 #define SMBTORTURE_USE_NAME "S:"
30
31 static bool test_NetWkstaGetInfo(struct torture_context *tctx,
32                                  struct dcerpc_pipe *p)
33 {
34         NTSTATUS status;
35         struct wkssvc_NetWkstaGetInfo r;
36         union wkssvc_NetWkstaInfo info;
37         uint16_t levels[] = {100, 101, 102, 502};
38         int i;
39
40         r.in.server_name = dcerpc_server_name(p);
41         r.out.info = &info;
42
43         for (i=0;i<ARRAY_SIZE(levels);i++) {
44                 r.in.level = levels[i];
45                 torture_comment(tctx, "testing NetWkstaGetInfo level %u\n", r.in.level);
46                 status = dcerpc_wkssvc_NetWkstaGetInfo(p, tctx, &r);
47                 torture_assert_ntstatus_ok(tctx, status,
48                         talloc_asprintf(tctx, "NetWkstaGetInfo level %u failed", r.in.level));
49                 torture_assert_werr_ok(tctx, r.out.result,
50                         talloc_asprintf(tctx, "NetWkstaGetInfo level %u failed", r.in.level));
51         }
52
53         return true;
54 }
55
56 static bool test_NetWkstaTransportEnum(struct torture_context *tctx,
57                                        struct dcerpc_pipe *p)
58 {
59         NTSTATUS status;
60         struct wkssvc_NetWkstaTransportEnum r;
61         uint32_t resume_handle = 0;
62         struct wkssvc_NetWkstaTransportInfo info;
63         union wkssvc_NetWkstaTransportCtr ctr;
64         struct wkssvc_NetWkstaTransportCtr0 ctr0;
65         uint32_t total_entries = 0;
66
67         ZERO_STRUCT(ctr0);
68         ctr.ctr0 = &ctr0;
69
70         info.level = 0;
71         info.ctr = ctr;
72
73         r.in.server_name = dcerpc_server_name(p);
74         r.in.info = &info;
75         r.in.max_buffer = (uint32_t)-1;
76         r.in.resume_handle = &resume_handle;
77         r.out.total_entries = &total_entries;
78         r.out.info = &info;
79         r.out.resume_handle = &resume_handle;
80
81         torture_comment(tctx, "testing NetWkstaTransportEnum level 0\n");
82
83         status = dcerpc_wkssvc_NetWkstaTransportEnum(p, tctx, &r);
84         torture_assert_ntstatus_ok(tctx, status,
85                                    "NetWkstaTransportEnum failed");
86         torture_assert_werr_ok(tctx, r.out.result, talloc_asprintf(tctx,
87                                "NetWkstaTransportEnum level %u failed",
88                                info.level));
89
90         return true;
91 }
92
93 static bool test_NetrWkstaTransportAdd(struct torture_context *tctx,
94                                        struct dcerpc_pipe *p)
95 {
96         NTSTATUS status;
97         struct wkssvc_NetrWkstaTransportAdd r;
98         struct wkssvc_NetWkstaTransportInfo0 info0;
99         uint32_t parm_err = 0;
100
101         ZERO_STRUCT(info0);
102
103         info0.quality_of_service = 0xffff;
104         info0.vc_count = 0;
105         info0.name = SMBTORTURE_TRANSPORT_NAME;
106         info0.address = "000000000000";
107         info0.wan_link = 0x400;
108
109         r.in.server_name = dcerpc_server_name(p);
110         r.in.level = 0;
111         r.in.info0 = &info0;
112         r.in.parm_err = r.out.parm_err = &parm_err;
113
114         torture_comment(tctx, "testing NetrWkstaTransportAdd level 0\n");
115
116         status = dcerpc_wkssvc_NetrWkstaTransportAdd(p, tctx, &r);
117         torture_assert_ntstatus_ok(tctx, status,
118                                    "NetrWkstaTransportAdd failed");
119         torture_assert_werr_equal(tctx, r.out.result,
120                                   WERR_INVALID_PARAM,
121                                   "NetrWkstaTransportAdd level 0 failed");
122
123         return true;
124 }
125
126 static bool test_NetrWkstaTransportDel(struct torture_context *tctx,
127                                        struct dcerpc_pipe *p)
128 {
129         NTSTATUS status;
130         struct wkssvc_NetrWkstaTransportDel r;
131
132         r.in.server_name = dcerpc_server_name(p);
133         r.in.transport_name = SMBTORTURE_TRANSPORT_NAME;
134         r.in.unknown3 = 0;
135
136         torture_comment(tctx, "testing NetrWkstaTransportDel\n");
137
138         status = dcerpc_wkssvc_NetrWkstaTransportDel(p, tctx, &r);
139         torture_assert_ntstatus_ok(tctx, status,
140                                    "NetrWkstaTransportDel failed");
141         torture_assert_werr_ok(tctx, r.out.result,
142                                "NetrWkstaTransportDel");
143
144         return true;
145 }
146
147 static bool test_NetWkstaEnumUsers(struct torture_context *tctx,
148                                    struct dcerpc_pipe *p)
149 {
150         NTSTATUS status;
151         struct wkssvc_NetWkstaEnumUsers r;
152         uint32_t handle = 0;
153         uint32_t entries_read = 0;
154         struct wkssvc_NetWkstaEnumUsersInfo info;
155         struct wkssvc_NetWkstaEnumUsersCtr0 *user0;
156         struct wkssvc_NetWkstaEnumUsersCtr1 *user1;
157         uint32_t levels[] = { 0, 1 };
158         int i;
159
160         for (i=0; i<ARRAY_SIZE(levels); i++) {
161
162                 ZERO_STRUCT(info);
163
164                 info.level = levels[i];
165                 switch (info.level) {
166                 case 0:
167                         user0 = talloc_zero(tctx,
168                                             struct wkssvc_NetWkstaEnumUsersCtr0);
169                         info.ctr.user0 = user0;
170                         break;
171                 case 1:
172                         user1 = talloc_zero(tctx,
173                                             struct wkssvc_NetWkstaEnumUsersCtr1);
174                         info.ctr.user1 = user1;
175                         break;
176                 default:
177                         break;
178                 }
179
180                 r.in.server_name = dcerpc_server_name(p);
181                 r.in.prefmaxlen = (uint32_t)-1;
182                 r.in.info = r.out.info = &info;
183                 r.in.resume_handle = r.out.resume_handle = &handle;
184
185                 r.out.entries_read = &entries_read;
186
187                 torture_comment(tctx, "testing NetWkstaEnumUsers level %u\n",
188                                 levels[i]);
189
190                 status = dcerpc_wkssvc_NetWkstaEnumUsers(p, tctx, &r);
191                 torture_assert_ntstatus_ok(tctx, status,
192                                            "NetWkstaEnumUsers failed");
193                 torture_assert_werr_ok(tctx, r.out.result,
194                                        "NetWkstaEnumUsers failed");
195         }
196
197         return true;
198 }
199
200 static bool test_NetrWkstaUserGetInfo(struct torture_context *tctx,
201                                       struct dcerpc_pipe *p)
202 {
203         NTSTATUS status;
204         struct wkssvc_NetrWkstaUserGetInfo r;
205         union wkssvc_NetrWkstaUserInfo info;
206         const char *dom = lp_workgroup(global_loadparm);
207         struct cli_credentials *creds = cmdline_credentials;
208         const char *user = cli_credentials_get_username(creds);
209         int i;
210
211         const struct {
212                 const char *unknown;
213                 uint32_t level;
214                 WERROR result;
215         } tests[] = {
216                 { NULL, 0, WERR_NO_SUCH_LOGON_SESSION },
217                 { NULL, 1, WERR_NO_SUCH_LOGON_SESSION },
218                 { NULL, 1101, WERR_OK },
219                 { dom, 0, WERR_INVALID_PARAM },
220                 { dom, 1, WERR_INVALID_PARAM },
221                 { dom, 1101, WERR_INVALID_PARAM },
222                 { user, 0, WERR_INVALID_PARAM },
223                 { user, 1, WERR_INVALID_PARAM },
224                 { user, 1101, WERR_INVALID_PARAM },
225         };
226
227         for (i=0; i<ARRAY_SIZE(tests); i++) {
228                 r.in.unknown = tests[i].unknown;
229                 r.in.level = tests[i].level;
230                 r.out.info = &info;
231
232                 torture_comment(tctx, "testing NetrWkstaUserGetInfo level %u\n",
233                                 r.in.level);
234
235                 status = dcerpc_wkssvc_NetrWkstaUserGetInfo(p, tctx, &r);
236                 torture_assert_ntstatus_ok(tctx, status,
237                                            "NetrWkstaUserGetInfo failed");
238                 torture_assert_werr_equal(tctx, r.out.result,
239                                           tests[i].result,
240                                           "NetrWkstaUserGetInfo failed");
241         }
242
243         return true;
244 }
245
246 static bool test_NetrUseEnum(struct torture_context *tctx,
247                              struct dcerpc_pipe *p)
248 {
249         NTSTATUS status;
250         struct wkssvc_NetrUseEnum r;
251         uint32_t handle = 0;
252         uint32_t entries_read = 0;
253         struct wkssvc_NetrUseEnumInfo info;
254         struct wkssvc_NetrUseEnumCtr0 *use0;
255         struct wkssvc_NetrUseEnumCtr1 *use1;
256         struct wkssvc_NetrUseEnumCtr2 *use2;
257         uint32_t levels[] = { 0, 1, 2 };
258         int i;
259
260         for (i=0; i<ARRAY_SIZE(levels); i++) {
261
262                 ZERO_STRUCT(info);
263
264                 info.level = levels[i];
265                 switch (info.level) {
266                 case 0:
267                         use0 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr0);
268                         info.ctr.ctr0 = use0;
269                         break;
270                 case 1:
271                         use1 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr1);
272                         info.ctr.ctr1 = use1;
273                         break;
274                 case 2:
275                         use2 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr2);
276                         info.ctr.ctr2 = use2;
277                         break;
278                 default:
279                         break;
280                 }
281
282                 r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
283                 r.in.prefmaxlen = (uint32_t)-1;
284                 r.in.info = r.out.info = &info;
285                 r.in.resume_handle = r.out.resume_handle = &handle;
286
287                 r.out.entries_read = &entries_read;
288
289                 torture_comment(tctx, "testing NetrUseEnum level %u\n",
290                                 levels[i]);
291
292                 status = dcerpc_wkssvc_NetrUseEnum(p, tctx, &r);
293                 torture_assert_ntstatus_ok(tctx, status,
294                                            "NetrUseEnum failed");
295                 torture_assert_werr_ok(tctx, r.out.result,
296                                        "NetrUseEnum failed");
297         }
298
299         return true;
300 }
301
302 static bool test_NetrUseAdd(struct torture_context *tctx,
303                             struct dcerpc_pipe *p)
304 {
305         NTSTATUS status;
306         struct wkssvc_NetrUseAdd r;
307         struct wkssvc_NetrUseInfo0 info0;
308         struct wkssvc_NetrUseInfo1 info1;
309         union wkssvc_NetrUseGetInfoCtr *ctr;
310         uint32_t parm_err = 0;
311
312         ctr = talloc(tctx, union wkssvc_NetrUseGetInfoCtr);
313
314         ZERO_STRUCT(info0);
315
316         info0.local = SMBTORTURE_USE_NAME;
317         info0.remote = "\\\\localhost\\c$";
318
319         ctr->info0 = &info0;
320
321         r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
322         r.in.level = 0;
323         r.in.ctr = ctr;
324         r.in.parm_err = r.out.parm_err = &parm_err;
325
326         torture_comment(tctx, "testing NetrUseAdd level %u\n",
327                         r.in.level);
328
329         status = dcerpc_wkssvc_NetrUseAdd(p, tctx, &r);
330         torture_assert_ntstatus_ok(tctx, status,
331                                    "NetrUseAdd failed");
332         torture_assert_werr_equal(tctx, r.out.result, WERR_UNKNOWN_LEVEL,
333                                "NetrUseAdd failed");
334
335         ZERO_STRUCT(r);
336         ZERO_STRUCT(info1);
337
338         info1.local = SMBTORTURE_USE_NAME;
339         info1.remote = "\\\\localhost\\sysvol";
340         info1.password = NULL;
341
342         ctr->info1 = &info1;
343
344         r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
345         r.in.level = 1;
346         r.in.ctr = ctr;
347         r.in.parm_err = r.out.parm_err = &parm_err;
348
349         torture_comment(tctx, "testing NetrUseAdd level %u\n",
350                         r.in.level);
351
352         status = dcerpc_wkssvc_NetrUseAdd(p, tctx, &r);
353         torture_assert_ntstatus_ok(tctx, status,
354                                    "NetrUseAdd failed");
355         torture_assert_werr_ok(tctx, r.out.result,
356                                "NetrUseAdd failed");
357
358         return true;
359 }
360
361 static bool test_NetrUseDel(struct torture_context *tctx,
362                             struct dcerpc_pipe *p)
363 {
364         NTSTATUS status;
365         struct wkssvc_NetrUseDel r;
366
367         r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
368         r.in.use_name = SMBTORTURE_USE_NAME;
369         r.in.force_cond = 0;
370
371         torture_comment(tctx, "testing NetrUseDel\n");
372
373         status = dcerpc_wkssvc_NetrUseDel(p, tctx, &r);
374         torture_assert_ntstatus_ok(tctx, status,
375                                    "NetrUseDel failed");
376         torture_assert_werr_ok(tctx, r.out.result,
377                                "NetrUseDel failed");
378         return true;
379 }
380
381 static bool test_NetrUseGetInfo_level(struct torture_context *tctx,
382                                       struct dcerpc_pipe *p,
383                                       const char *use_name,
384                                       uint32_t level,
385                                       WERROR werr)
386 {
387         NTSTATUS status;
388         struct wkssvc_NetrUseGetInfo r;
389         union wkssvc_NetrUseGetInfoCtr ctr;
390
391         ZERO_STRUCT(ctr);
392
393         r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
394         r.in.use_name = use_name;
395         r.in.level = level;
396         r.out.ctr = &ctr;
397         status = dcerpc_wkssvc_NetrUseGetInfo(p, tctx, &r);
398
399         torture_assert_ntstatus_ok(tctx, status,
400                                    "NetrUseGetInfo failed");
401         torture_assert_werr_equal(tctx, r.out.result, werr,
402                                   "NetrUseGetInfo failed");
403         return true;
404 }
405
406 static bool test_NetrUseGetInfo(struct torture_context *tctx,
407                                 struct dcerpc_pipe *p)
408 {
409         NTSTATUS status;
410         struct wkssvc_NetrUseEnum r;
411         uint32_t handle = 0;
412         uint32_t entries_read = 0;
413         struct wkssvc_NetrUseEnumInfo info;
414         struct wkssvc_NetrUseEnumCtr0 *use0;
415         uint32_t levels[] = { 0, 1, 2 };
416         const char *use_name = NULL;
417         int i, k;
418
419         ZERO_STRUCT(info);
420
421         info.level = 0;
422         use0 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr0);
423         info.ctr.ctr0 = use0;
424
425         r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
426         r.in.prefmaxlen = (uint32_t)-1;
427         r.in.info = r.out.info = &info;
428         r.in.resume_handle = r.out.resume_handle = &handle;
429         r.out.entries_read = &entries_read;
430
431         status = dcerpc_wkssvc_NetrUseEnum(p, tctx, &r);
432         torture_assert_ntstatus_ok(tctx, status,
433                                    "NetrUseEnum failed");
434         torture_assert_werr_ok(tctx, r.out.result,
435                                "NetrUseEnum failed");
436
437         for (k=0; k < r.out.info->ctr.ctr0->count; k++) {
438
439                 use_name = r.out.info->ctr.ctr0->array[k].local;
440
441                 for (i=0; i<ARRAY_SIZE(levels); i++) {
442
443                         if (!test_NetrUseGetInfo_level(tctx, p, use_name,
444                                                        levels[i],
445                                                        WERR_OK))
446                         {
447                                 if (levels[i] != 0) {
448                                         return false;
449                                 }
450                         }
451                 }
452
453                 use_name = r.out.info->ctr.ctr0->array[k].remote;
454
455                 for (i=0; i<ARRAY_SIZE(levels); i++) {
456
457                         if (!test_NetrUseGetInfo_level(tctx, p, use_name,
458                                                        levels[i],
459                                                        WERR_NOT_CONNECTED))
460                         {
461                                 if (levels[i] != 0) {
462                                         return false;
463                                 }
464                         }
465                 }
466         }
467
468         return true;
469 }
470
471 static bool test_NetrLogonDomainNameAdd(struct torture_context *tctx,
472                                         struct dcerpc_pipe *p)
473 {
474         NTSTATUS status;
475         struct wkssvc_NetrLogonDomainNameAdd r;
476
477         r.in.domain_name = lp_workgroup(global_loadparm);
478
479         torture_comment(tctx, "testing NetrLogonDomainNameAdd\n");
480
481         status = dcerpc_wkssvc_NetrLogonDomainNameAdd(p, tctx, &r);
482         torture_assert_ntstatus_ok(tctx, status,
483                                    "NetrLogonDomainNameAdd failed");
484         torture_assert_werr_equal(tctx, r.out.result, WERR_NOT_SUPPORTED,
485                                   "NetrLogonDomainNameAdd failed");
486         return true;
487 }
488
489 static bool test_NetrLogonDomainNameDel(struct torture_context *tctx,
490                                         struct dcerpc_pipe *p)
491 {
492         NTSTATUS status;
493         struct wkssvc_NetrLogonDomainNameDel r;
494
495         r.in.domain_name = lp_workgroup(global_loadparm);
496
497         torture_comment(tctx, "testing NetrLogonDomainNameDel\n");
498
499         status = dcerpc_wkssvc_NetrLogonDomainNameDel(p, tctx, &r);
500         torture_assert_ntstatus_ok(tctx, status,
501                                    "NetrLogonDomainNameDel failed");
502         torture_assert_werr_equal(tctx, r.out.result, WERR_NOT_SUPPORTED,
503                                   "NetrLogonDomainNameDel failed");
504         return true;
505 }
506
507 static bool test_NetrValidateName(struct torture_context *tctx,
508                                   struct dcerpc_pipe *p)
509 {
510         NTSTATUS status;
511         struct wkssvc_NetrValidateName r;
512         uint16_t levels[] = {0,1,2,3,4,5};
513         int i;
514
515         for (i=0; i<ARRAY_SIZE(levels); i++) {
516
517                 r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
518                 r.in.name = lp_workgroup(global_loadparm);
519                 r.in.Account = NULL;
520                 r.in.Password = NULL;
521                 r.in.name_type = levels[i];
522
523                 torture_comment(tctx, "testing NetrValidateName level %u\n",
524                                 r.in.name_type);
525
526                 status = dcerpc_wkssvc_NetrValidateName(p, tctx, &r);
527                 torture_assert_ntstatus_ok(tctx, status,
528                                            "NetrValidateName failed");
529                 torture_assert_werr_equal(tctx, r.out.result,
530                                           WERR_NOT_SUPPORTED,
531                                           "NetrValidateName failed");
532         }
533
534         return true;
535 }
536
537 static bool test_NetrValidateName2(struct torture_context *tctx,
538                                    struct dcerpc_pipe *p)
539 {
540         NTSTATUS status;
541         struct wkssvc_NetrValidateName2 r;
542         uint16_t levels[] = {0,1,2,3,4,5};
543         int i;
544
545         for (i=0; i<ARRAY_SIZE(levels); i++) {
546
547                 r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
548                 r.in.name = lp_workgroup(global_loadparm);
549                 r.in.Account = NULL;
550                 r.in.EncryptedPassword = NULL;
551                 r.in.name_type = levels[i];
552
553                 torture_comment(tctx, "testing NetrValidateName2 level %u\n",
554                                 r.in.name_type);
555
556                 status = dcerpc_wkssvc_NetrValidateName2(p, tctx, &r);
557                 torture_assert_ntstatus_ok(tctx, status,
558                                            "NetrValidateName2 failed");
559                 torture_assert_werr_equal(tctx, r.out.result,
560                                           WERR_RPC_E_REMOTE_DISABLED,
561                                           "NetrValidateName2 failed");
562         }
563
564         return true;
565 }
566
567 struct torture_suite *torture_rpc_wkssvc(TALLOC_CTX *mem_ctx)
568 {
569         struct torture_suite *suite;
570         struct torture_rpc_tcase *tcase;
571
572         suite = torture_suite_create(mem_ctx, "WKSSVC");
573         tcase = torture_suite_add_rpc_iface_tcase(suite, "wkssvc",
574                                                   &ndr_table_wkssvc);
575
576         torture_rpc_tcase_add_test(tcase, "NetWkstaGetInfo",
577                                    test_NetWkstaGetInfo);
578
579         torture_rpc_tcase_add_test(tcase, "NetWkstaTransportEnum",
580                                    test_NetWkstaTransportEnum);
581         torture_rpc_tcase_add_test(tcase, "NetrWkstaTransportDel",
582                                    test_NetrWkstaTransportDel);
583         torture_rpc_tcase_add_test(tcase, "NetrUseGetInfo",
584                                    test_NetrUseGetInfo);
585         torture_rpc_tcase_add_test(tcase, "NetrWkstaTransportAdd",
586                                    test_NetrWkstaTransportAdd);
587
588         torture_rpc_tcase_add_test(tcase, "NetWkstaEnumUsers",
589                                    test_NetWkstaEnumUsers);
590         torture_rpc_tcase_add_test(tcase, "NetrWkstaUserGetInfo",
591                                    test_NetrWkstaUserGetInfo);
592
593         torture_rpc_tcase_add_test(tcase, "NetrUseDel",
594                                    test_NetrUseDel);
595         torture_rpc_tcase_add_test(tcase, "NetrUseEnum",
596                                    test_NetrUseEnum);
597         torture_rpc_tcase_add_test(tcase, "NetrUseAdd",
598                                    test_NetrUseAdd);
599
600         torture_rpc_tcase_add_test(tcase, "NetrValidateName",
601                                    test_NetrValidateName);
602         torture_rpc_tcase_add_test(tcase, "NetrValidateName2",
603                                    test_NetrValidateName2);
604         torture_rpc_tcase_add_test(tcase, "NetrLogonDomainNameDel",
605                                    test_NetrLogonDomainNameDel);
606         torture_rpc_tcase_add_test(tcase, "NetrLogonDomainNameAdd",
607                                    test_NetrLogonDomainNameAdd);
608
609         return suite;
610 }