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.
25 static BOOL test_NetConnEnum(struct dcerpc_pipe *p,
29 struct srvsvc_NetConnEnum r;
30 struct srvsvc_NetConnCtr0 c0;
31 uint32 levels[] = {0, 1};
35 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
36 r.in.path = talloc_asprintf(mem_ctx,"%s","ADMIN$");
38 r.in.ctr.ctr0->count = 0;
39 r.in.ctr.ctr0->array = NULL;
40 r.in.max_buffer = (uint32)-1;
41 r.in.resume_handle = NULL;
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));
56 static BOOL test_NetFileEnum(struct dcerpc_pipe *p,
60 struct srvsvc_NetFileEnum r;
61 struct srvsvc_NetFileCtr3 c3;
62 uint32 levels[] = {2, 3};
66 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
70 r.in.ctr.ctr3->count = 0;
71 r.in.ctr.ctr3->array = NULL;
72 r.in.max_buffer = (uint32)4096;
73 r.in.resume_handle = NULL;
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));
88 static BOOL test_NetSessEnum(struct dcerpc_pipe *p,
92 struct srvsvc_NetSessEnum r;
93 struct srvsvc_NetSessCtr0 c0;
94 uint32 levels[] = {0, 1, 2, 10, 502};
98 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
102 r.in.ctr.ctr0->count = 0;
103 r.in.ctr.ctr0->array = NULL;
104 r.in.max_buffer = (uint32)-1;
105 r.in.resume_handle = NULL;
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));
121 static BOOL test_NetShareGetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
122 const char *sharename)
125 struct srvsvc_NetShareGetInfo r;
126 int levels[] = {0, 1, 2, 501, 502, 1005};
130 r.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
131 r.in.share_name = "";
133 for (i=0;i<ARRAY_SIZE(levels);i++) {
134 r.in.level = levels[i];
136 printf("testing NetShareGetInfo level %u on share '%s'\n",
137 r.in.level, r.in.share_name);
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));
150 static BOOL test_NetShareEnumAll(struct dcerpc_pipe *p,
154 struct srvsvc_NetShareEnumAll r;
155 struct srvsvc_NetShareCtr0 c0;
156 uint32 levels[] = {0, 1, 2, 501, 502, 1004};
159 uint32 resume_handle;
163 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
165 r.in.max_buffer = (uint32)-1;
166 r.in.resume_handle = &resume_handle;
167 r.out.resume_handle = &resume_handle;
169 for (i=0;i<ARRAY_SIZE(levels);i++) {
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));
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++) {
186 name = r.out.ctr.ctr1->array[j].name;
187 if (!test_NetShareGetInfo(p, mem_ctx, name)) {
199 static BOOL test_NetDiskEnum(struct dcerpc_pipe *p,
203 struct srvsvc_NetDiskEnum r;
204 uint32 levels[] = {0};
207 uint32 resume_handle=0;
209 r.in.server_unc = NULL;
211 r.in.resume_handle = &resume_handle;
212 r.in.ctr.ctr0 = NULL;
214 for (i=0;i<ARRAY_SIZE(levels);i++) {
215 r.in.level = levels[i];
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));
229 static BOOL test_NetTransportEnum(struct dcerpc_pipe *p,
233 struct srvsvc_NetTransportEnum r;
234 struct srvsvc_NetTransportCtr0 c0;
235 uint32 levels[] = {0, 1};
239 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
241 r.in.ctr.ctr0->count = 0;
242 r.in.ctr.ctr0->array = NULL;
243 r.in.max_buffer = (uint32)-1;
244 r.in.resume_handle = NULL;
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));
259 static BOOL test_NetShareEnum(struct dcerpc_pipe *p,
263 struct srvsvc_NetShareEnum r;
264 struct srvsvc_NetShareCtr0 c0;
265 uint32 levels[] = {0, 1, 2, 502};
269 r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));
271 r.in.ctr.ctr0->count = 0;
272 r.in.ctr.ctr0->array = NULL;
273 r.in.max_buffer = (uint32)-1;
274 r.in.resume_handle = NULL;
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));
289 BOOL torture_rpc_srvsvc(int dummy)
292 struct dcerpc_pipe *p;
296 mem_ctx = talloc_init("torture_rpc_srvsvc");
298 status = torture_rpc_connection(&p,
301 DCERPC_SRVSVC_VERSION);
302 if (!NT_STATUS_IS_OK(status)) {
306 if (!test_NetConnEnum(p, mem_ctx)) {
310 if (!test_NetFileEnum(p, mem_ctx)) {
314 if (!test_NetSessEnum(p, mem_ctx)) {
318 if (!test_NetShareEnumAll(p, mem_ctx)) {
322 if (!test_NetDiskEnum(p, mem_ctx)) {
326 if (!test_NetTransportEnum(p, mem_ctx)) {
330 if (!test_NetShareEnum(p, mem_ctx)) {
334 talloc_destroy(mem_ctx);
336 torture_rpc_close(p);