r884: convert samba4 to use [u]int32_t instead of [u]int32
[metze/samba/wip.git] / source4 / torture / rpc / srvsvc.c
1 /* 
2    Unix SMB/CIFS implementation.
3    test suite for srvsvc rpc operations
4
5    Copyright (C) Stefan (metze) Metzmacher 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 2 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, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23
24
25 static BOOL test_NetConnEnum(struct dcerpc_pipe *p, 
26                            TALLOC_CTX *mem_ctx)
27 {
28         NTSTATUS status;
29         struct srvsvc_NetConnEnum r;
30         struct srvsvc_NetConnCtr0 c0;
31         uint32_t levels[] = {0, 1};
32         int i;
33         BOOL ret = True;
34
35         r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
36         r.in.path = talloc_asprintf(mem_ctx,"%s","ADMIN$");
37         r.in.ctr.ctr0 = &c0;
38         r.in.ctr.ctr0->count = 0;
39         r.in.ctr.ctr0->array = NULL;
40         r.in.max_buffer = (uint32_t)-1;
41         r.in.resume_handle = NULL;
42
43         for (i=0;i<ARRAY_SIZE(levels);i++) {
44                 r.in.level = levels[i];
45                 printf("testing NetConnEnum level %u\n", r.in.level);
46                 status = dcerpc_srvsvc_NetConnEnum(p, mem_ctx, &r);
47                 if (!NT_STATUS_IS_OK(status)) {
48                         printf("NetConnEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
49                         ret = False;
50                 }
51         }
52
53         return True;
54 }
55
56 static BOOL test_NetFileEnum(struct dcerpc_pipe *p, 
57                            TALLOC_CTX *mem_ctx)
58 {
59         NTSTATUS status;
60         struct srvsvc_NetFileEnum r;
61         struct srvsvc_NetFileCtr3 c3;
62         uint32_t levels[] = {2, 3};
63         int i;
64         BOOL ret = True;
65
66         r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
67         r.in.path = NULL;
68         r.in.user = NULL;
69         r.in.ctr.ctr3 = &c3;
70         r.in.ctr.ctr3->count = 0;
71         r.in.ctr.ctr3->array = NULL;
72         r.in.max_buffer = (uint32_t)4096;
73         r.in.resume_handle = NULL;
74
75         for (i=0;i<ARRAY_SIZE(levels);i++) {
76                 r.in.level = levels[i];
77                 printf("testing NetFileEnum level %u\n", r.in.level);
78                 status = dcerpc_srvsvc_NetFileEnum(p, mem_ctx, &r);
79                 if (!NT_STATUS_IS_OK(status)) {
80                         printf("NetFileEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
81                         ret = False;
82                 }
83         }
84
85         return True;
86 }
87
88 static BOOL test_NetSessEnum(struct dcerpc_pipe *p, 
89                            TALLOC_CTX *mem_ctx)
90 {
91         NTSTATUS status;
92         struct srvsvc_NetSessEnum r;
93         struct srvsvc_NetSessCtr0 c0;
94         uint32_t levels[] = {0, 1, 2, 10, 502};
95         int i;
96         BOOL ret = True;
97
98         r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
99         r.in.client = NULL;
100         r.in.user = NULL;
101         r.in.ctr.ctr0 = &c0;
102         r.in.ctr.ctr0->count = 0;
103         r.in.ctr.ctr0->array = NULL;
104         r.in.max_buffer = (uint32_t)-1;
105         r.in.resume_handle = NULL;
106
107         for (i=0;i<ARRAY_SIZE(levels);i++) {
108                 r.in.level = levels[i];
109                 printf("testing NetSessEnum level %u\n", r.in.level);
110                 status = dcerpc_srvsvc_NetSessEnum(p, mem_ctx, &r);
111                 if (!NT_STATUS_IS_OK(status)) {
112                         printf("NetSessEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
113                         ret = False;
114                 }
115         }
116
117         return True;
118 }
119
120
121 static BOOL test_NetShareGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
122                                  const char *sharename)
123 {
124         NTSTATUS status;
125         struct srvsvc_NetShareGetInfo r;
126         int levels[] = {0, 1, 2, 501, 502, 1005};
127         int i;
128         BOOL ret = True;
129
130         r.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
131         r.in.share_name = "";
132
133         for (i=0;i<ARRAY_SIZE(levels);i++) {
134                 r.in.level = levels[i];
135
136                 printf("testing NetShareGetInfo level %u on share '%s'\n", 
137                        r.in.level, r.in.share_name);
138
139                 status = dcerpc_srvsvc_NetShareGetInfo(p, mem_ctx, &r);
140                 if (!NT_STATUS_IS_OK(status)) {
141                         printf("NetShareGetInfo level %u failed - %s\n",
142                                r.in.level, nt_errstr(status));
143                         ret = False;
144                 }
145         }
146
147         return ret;
148 }
149
150 static BOOL test_NetShareEnumAll(struct dcerpc_pipe *p, 
151                                  TALLOC_CTX *mem_ctx)
152 {
153         NTSTATUS status;
154         struct srvsvc_NetShareEnumAll r;
155         struct srvsvc_NetShareCtr0 c0;
156         uint32_t levels[] = {0, 1, 2, 501, 502, 1004};
157         int i;
158         BOOL ret = True;
159         uint32_t resume_handle;
160
161         ZERO_STRUCT(c0);
162
163         r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
164         r.in.ctr.ctr0 = &c0;
165         r.in.max_buffer = (uint32_t)-1;
166         r.in.resume_handle = &resume_handle;
167         r.out.resume_handle = &resume_handle;
168
169         for (i=0;i<ARRAY_SIZE(levels);i++) {
170                 int j;
171
172                 resume_handle = 0;
173                 r.in.level = levels[i];
174                 printf("testing NetShareEnumAll level %u\n", r.in.level);
175                 status = dcerpc_srvsvc_NetShareEnumAll(p, mem_ctx, &r);
176                 if (!NT_STATUS_IS_OK(status)) {
177                         printf("NetShareEnumAll level %u failed - %s\n", r.in.level, nt_errstr(status));
178                         ret = False;
179                         continue;
180                 }
181
182                 /* call srvsvc_NetShareGetInfo for each returned share */
183                 if (r.in.level == 1) {
184                         for (j=0;j<r.out.ctr.ctr1->count;j++) {
185                                 const char *name;
186                                 name = r.out.ctr.ctr1->array[j].name;
187                                 if (!test_NetShareGetInfo(p, mem_ctx, name)) {
188                                         ret = False;
189                                 }
190                         }
191                 }
192                 
193         }
194
195         return True;
196 }
197
198
199 static BOOL test_NetDiskEnum(struct dcerpc_pipe *p, 
200                            TALLOC_CTX *mem_ctx)
201 {
202         NTSTATUS status;
203         struct srvsvc_NetDiskEnum r;
204         uint32_t levels[] = {0};
205         int i;
206         BOOL ret = True;
207         uint32_t resume_handle=0;
208
209         r.in.server_unc = NULL;
210         r.in.unknown = 0;
211         r.in.resume_handle = &resume_handle;
212         r.in.ctr.ctr0 = NULL;
213
214         for (i=0;i<ARRAY_SIZE(levels);i++) {
215                 r.in.level = levels[i];
216                 ZERO_STRUCT(r.out);
217                 printf("testing NetDiskEnum level %u\n", r.in.level);
218                 status = dcerpc_srvsvc_NetDiskEnum(p, mem_ctx, &r);
219                 if (!NT_STATUS_IS_OK(status)) {
220                         NDR_PRINT_OUT_DEBUG(srvsvc_NetDiskEnum, &r);
221                         printf("NetDiskEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
222                         ret = False;
223                 }
224         }
225
226         return True;
227 }
228
229 static BOOL test_NetTransportEnum(struct dcerpc_pipe *p, 
230                            TALLOC_CTX *mem_ctx)
231 {
232         NTSTATUS status;
233         struct srvsvc_NetTransportEnum r;
234         struct srvsvc_NetTransportCtr0 c0;
235         uint32_t levels[] = {0, 1};
236         int i;
237         BOOL ret = True;
238
239         r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
240         r.in.ctr.ctr0 = &c0;
241         r.in.ctr.ctr0->count = 0;
242         r.in.ctr.ctr0->array = NULL;
243         r.in.max_buffer = (uint32_t)-1;
244         r.in.resume_handle = NULL;
245
246         for (i=0;i<ARRAY_SIZE(levels);i++) {
247                 r.in.level = levels[i];
248                 printf("testing NetTransportEnum level %u\n", r.in.level);
249                 status = dcerpc_srvsvc_NetTransportEnum(p, mem_ctx, &r);
250                 if (!NT_STATUS_IS_OK(status)) {
251                         printf("NetTransportEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
252                         ret = False;
253                 }
254         }
255
256         return True;
257 }
258
259 static BOOL test_NetShareEnum(struct dcerpc_pipe *p, 
260                            TALLOC_CTX *mem_ctx)
261 {
262         NTSTATUS status;
263         struct srvsvc_NetShareEnum r;
264         struct srvsvc_NetShareCtr0 c0;
265         uint32_t levels[] = {0, 1, 2, 502};
266         int i;
267         BOOL ret = True;
268
269         r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
270         r.in.ctr.ctr0 = &c0;
271         r.in.ctr.ctr0->count = 0;
272         r.in.ctr.ctr0->array = NULL;
273         r.in.max_buffer = (uint32_t)-1;
274         r.in.resume_handle = NULL;
275
276         for (i=0;i<ARRAY_SIZE(levels);i++) {
277                 r.in.level = levels[i];
278                 printf("testing NetShareEnum level %u\n", r.in.level);
279                 status = dcerpc_srvsvc_NetShareEnum(p, mem_ctx, &r);
280                 if (!NT_STATUS_IS_OK(status)) {
281                         printf("NetShareEnum level %u failed - %s\n", r.in.level, nt_errstr(status));
282                         ret = False;
283                 }
284         }
285
286         return True;
287 }
288
289 BOOL torture_rpc_srvsvc(int dummy)
290 {
291         NTSTATUS status;
292         struct dcerpc_pipe *p;
293         TALLOC_CTX *mem_ctx;
294         BOOL ret = True;
295
296         mem_ctx = talloc_init("torture_rpc_srvsvc");
297
298         status = torture_rpc_connection(&p,
299                                         DCERPC_SRVSVC_NAME,
300                                         DCERPC_SRVSVC_UUID,
301                                         DCERPC_SRVSVC_VERSION);
302         if (!NT_STATUS_IS_OK(status)) {
303                 return False;
304         }
305
306         if (!test_NetConnEnum(p, mem_ctx)) {
307                 ret = False;
308         }
309
310         if (!test_NetFileEnum(p, mem_ctx)) {
311                 ret = False;
312         }
313
314         if (!test_NetSessEnum(p, mem_ctx)) {
315                 ret = False;
316         }
317
318         if (!test_NetShareEnumAll(p, mem_ctx)) {
319                 ret = False;
320         }
321
322         if (!test_NetDiskEnum(p, mem_ctx)) {
323                 ret = False;
324         }
325
326         if (!test_NetTransportEnum(p, mem_ctx)) {
327                 ret = False;
328         }
329
330         if (!test_NetShareEnum(p, mem_ctx)) {
331                 ret = False;
332         }
333
334         talloc_destroy(mem_ctx);
335
336         torture_rpc_close(p);
337
338         return ret;
339 }