2 Unix SMB/CIFS implementation.
3 Test suite for libnet calls.
5 Copyright (C) Rafal Szczesniak 2006
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/>.
23 #include "lib/cmdline/cmdline.h"
24 #include "libnet/libnet.h"
25 #include "librpc/gen_ndr/ndr_samr_c.h"
26 #include "librpc/gen_ndr/ndr_lsa_c.h"
27 #include "torture/rpc/torture_rpc.h"
28 #include "param/param.h"
29 #include "torture/libnet/proto.h"
32 static bool test_opendomain_samr(struct torture_context
*tctx
,
33 struct dcerpc_binding_handle
*b
, TALLOC_CTX
*mem_ctx
,
34 struct policy_handle
*handle
, struct lsa_String
*domname
,
35 uint32_t *access_mask
, struct dom_sid
**sid_p
)
37 struct policy_handle h
, domain_handle
;
38 struct samr_Connect r1
;
39 struct samr_LookupDomain r2
;
40 struct dom_sid2
*sid
= NULL
;
41 struct samr_OpenDomain r3
;
43 torture_comment(tctx
, "connecting\n");
45 *access_mask
= SEC_FLAG_MAXIMUM_ALLOWED
;
47 r1
.in
.system_name
= 0;
48 r1
.in
.access_mask
= *access_mask
;
49 r1
.out
.connect_handle
= &h
;
51 torture_assert_ntstatus_ok(tctx
,
52 dcerpc_samr_Connect_r(b
, mem_ctx
, &r1
),
54 torture_assert_ntstatus_ok(tctx
, r1
.out
.result
,
57 r2
.in
.connect_handle
= &h
;
58 r2
.in
.domain_name
= domname
;
61 torture_comment(tctx
, "domain lookup on %s\n", domname
->string
);
63 torture_assert_ntstatus_ok(tctx
,
64 dcerpc_samr_LookupDomain_r(b
, mem_ctx
, &r2
),
65 "LookupDomain failed");
66 torture_assert_ntstatus_ok(tctx
, r2
.out
.result
,
67 "LookupDomain failed");
69 r3
.in
.connect_handle
= &h
;
70 r3
.in
.access_mask
= *access_mask
;
71 r3
.in
.sid
= *sid_p
= *r2
.out
.sid
;
72 r3
.out
.domain_handle
= &domain_handle
;
74 torture_comment(tctx
, "opening domain\n");
76 torture_assert_ntstatus_ok(tctx
,
77 dcerpc_samr_OpenDomain_r(b
, mem_ctx
, &r3
),
79 torture_assert_ntstatus_ok(tctx
, r3
.out
.result
,
82 *handle
= domain_handle
;
88 static bool test_opendomain_lsa(struct torture_context
*tctx
,
89 struct dcerpc_binding_handle
*b
, TALLOC_CTX
*mem_ctx
,
90 struct policy_handle
*handle
, struct lsa_String
*domname
,
91 uint32_t *access_mask
)
93 struct lsa_OpenPolicy2 open
;
94 struct lsa_ObjectAttribute attr
;
95 struct lsa_QosInfo qos
;
97 *access_mask
= SEC_FLAG_MAXIMUM_ALLOWED
;
103 qos
.impersonation_level
= 2;
104 qos
.context_mode
= 1;
105 qos
.effective_only
= 0;
109 open
.in
.system_name
= domname
->string
;
110 open
.in
.attr
= &attr
;
111 open
.in
.access_mask
= *access_mask
;
112 open
.out
.handle
= handle
;
114 torture_assert_ntstatus_ok(tctx
,
115 dcerpc_lsa_OpenPolicy2_r(b
, mem_ctx
, &open
),
116 "OpenPolicy2 failed");
117 torture_assert_ntstatus_ok(tctx
, open
.out
.result
,
118 "OpenPolicy2 failed");
123 bool torture_domain_open_lsa(struct torture_context
*torture
)
127 struct libnet_context
*ctx
;
128 struct libnet_DomainOpen r
;
129 struct lsa_Close lsa_close
;
130 struct policy_handle h
;
131 const char *domain_name
;
133 /* we're accessing domain controller so the domain name should be
134 passed (it's going to be resolved to dc name and address) instead
135 of specific server name. */
136 domain_name
= lpcfg_workgroup(torture
->lp_ctx
);
138 ctx
= libnet_context_init(torture
->ev
, torture
->lp_ctx
);
140 torture_comment(torture
, "failed to create libnet context\n");
144 ctx
->cred
= samba_cmdline_get_creds();
147 r
.in
.type
= DOMAIN_LSA
;
148 r
.in
.domain_name
= domain_name
;
149 r
.in
.access_mask
= SEC_FLAG_MAXIMUM_ALLOWED
;
151 status
= libnet_DomainOpen(ctx
, torture
, &r
);
152 if (!NT_STATUS_IS_OK(status
)) {
153 torture_comment(torture
, "failed to open domain on lsa service: %s\n", nt_errstr(status
));
158 ZERO_STRUCT(lsa_close
);
159 lsa_close
.in
.handle
= &ctx
->lsa
.handle
;
160 lsa_close
.out
.handle
= &h
;
162 torture_assert_ntstatus_ok(torture
,
163 dcerpc_lsa_Close_r(ctx
->lsa
.pipe
->binding_handle
, ctx
, &lsa_close
),
164 "failed to close domain on lsa service");
165 torture_assert_ntstatus_ok(torture
, lsa_close
.out
.result
,
166 "failed to close domain on lsa service");
174 bool torture_domain_close_lsa(struct torture_context
*torture
)
178 TALLOC_CTX
*mem_ctx
=NULL
;
179 struct libnet_context
*ctx
;
180 struct lsa_String domain_name
;
181 struct dcerpc_binding
*binding
;
182 uint32_t access_mask
;
183 struct policy_handle h
;
184 struct dcerpc_pipe
*p
;
185 struct libnet_DomainClose r
;
187 status
= torture_rpc_binding(torture
, &binding
);
188 if (!NT_STATUS_IS_OK(status
)) {
192 ctx
= libnet_context_init(torture
->ev
, torture
->lp_ctx
);
194 torture_comment(torture
, "failed to create libnet context\n");
199 ctx
->cred
= samba_cmdline_get_creds();
201 mem_ctx
= talloc_init("torture_domain_close_lsa");
202 status
= dcerpc_pipe_connect_b(mem_ctx
, &p
, binding
, &ndr_table_lsarpc
,
203 samba_cmdline_get_creds(),
204 torture
->ev
, torture
->lp_ctx
);
205 if (!NT_STATUS_IS_OK(status
)) {
206 torture_comment(torture
, "failed to connect to server: %s\n", nt_errstr(status
));
211 domain_name
.string
= lpcfg_workgroup(torture
->lp_ctx
);
213 if (!test_opendomain_lsa(torture
, p
->binding_handle
, torture
, &h
, &domain_name
, &access_mask
)) {
214 torture_comment(torture
, "failed to open domain on lsa service\n");
220 ctx
->lsa
.name
= domain_name
.string
;
221 ctx
->lsa
.access_mask
= access_mask
;
225 r
.in
.type
= DOMAIN_LSA
;
226 r
.in
.domain_name
= domain_name
.string
;
228 status
= libnet_DomainClose(ctx
, mem_ctx
, &r
);
229 if (!NT_STATUS_IS_OK(status
)) {
235 talloc_free(mem_ctx
);
241 bool torture_domain_open_samr(struct torture_context
*torture
)
244 struct libnet_context
*ctx
;
246 struct policy_handle domain_handle
, handle
;
247 struct libnet_DomainOpen io
;
249 const char *domain_name
;
252 mem_ctx
= talloc_init("test_domainopen_lsa");
254 ctx
= libnet_context_init(torture
->ev
, torture
->lp_ctx
);
255 ctx
->cred
= samba_cmdline_get_creds();
257 /* we're accessing domain controller so the domain name should be
258 passed (it's going to be resolved to dc name and address) instead
259 of specific server name. */
260 domain_name
= lpcfg_workgroup(torture
->lp_ctx
);
263 * Testing synchronous version
265 torture_comment(torture
, "opening domain\n");
267 io
.in
.type
= DOMAIN_SAMR
;
268 io
.in
.domain_name
= domain_name
;
269 io
.in
.access_mask
= SEC_FLAG_MAXIMUM_ALLOWED
;
271 status
= libnet_DomainOpen(ctx
, mem_ctx
, &io
);
272 if (!NT_STATUS_IS_OK(status
)) {
273 torture_comment(torture
, "Composite domain open failed for domain '%s' - %s\n",
274 domain_name
, nt_errstr(status
));
279 domain_handle
= ctx
->samr
.handle
;
281 r
.in
.handle
= &domain_handle
;
282 r
.out
.handle
= &handle
;
284 torture_comment(torture
, "closing domain handle\n");
286 torture_assert_ntstatus_ok(torture
,
287 dcerpc_samr_Close_r(ctx
->samr
.pipe
->binding_handle
, mem_ctx
, &r
),
289 torture_assert_ntstatus_ok(torture
, r
.out
.result
,
293 talloc_free(mem_ctx
);
300 bool torture_domain_close_samr(struct torture_context
*torture
)
304 TALLOC_CTX
*mem_ctx
= NULL
;
305 struct libnet_context
*ctx
;
306 struct lsa_String domain_name
;
307 struct dcerpc_binding
*binding
;
308 uint32_t access_mask
;
309 struct policy_handle h
;
310 struct dcerpc_pipe
*p
;
311 struct libnet_DomainClose r
;
314 status
= torture_rpc_binding(torture
, &binding
);
315 if (!NT_STATUS_IS_OK(status
)) {
319 ctx
= libnet_context_init(torture
->ev
, torture
->lp_ctx
);
321 torture_comment(torture
, "failed to create libnet context\n");
326 ctx
->cred
= samba_cmdline_get_creds();
328 mem_ctx
= talloc_init("torture_domain_close_samr");
329 status
= dcerpc_pipe_connect_b(mem_ctx
, &p
, binding
, &ndr_table_samr
,
330 ctx
->cred
, torture
->ev
, torture
->lp_ctx
);
331 if (!NT_STATUS_IS_OK(status
)) {
332 torture_comment(torture
, "failed to connect to server: %s\n", nt_errstr(status
));
337 domain_name
.string
= talloc_strdup(mem_ctx
, lpcfg_workgroup(torture
->lp_ctx
));
339 if (!test_opendomain_samr(torture
, p
->binding_handle
, torture
, &h
, &domain_name
, &access_mask
, &sid
)) {
340 torture_comment(torture
, "failed to open domain on samr service\n");
346 ctx
->samr
.name
= talloc_steal(ctx
, domain_name
.string
);
347 ctx
->samr
.access_mask
= access_mask
;
348 ctx
->samr
.handle
= h
;
349 ctx
->samr
.sid
= talloc_steal(ctx
, sid
);
352 r
.in
.type
= DOMAIN_SAMR
;
353 r
.in
.domain_name
= domain_name
.string
;
355 status
= libnet_DomainClose(ctx
, mem_ctx
, &r
);
356 if (!NT_STATUS_IS_OK(status
)) {
362 talloc_free(mem_ctx
);
368 bool torture_domain_list(struct torture_context
*torture
)
372 TALLOC_CTX
*mem_ctx
= NULL
;
373 struct dcerpc_binding
*binding
;
374 struct libnet_context
*ctx
;
375 struct libnet_DomainList r
;
378 status
= torture_rpc_binding(torture
, &binding
);
379 if (!NT_STATUS_IS_OK(status
)) {
383 ctx
= libnet_context_init(torture
->ev
, torture
->lp_ctx
);
385 torture_comment(torture
, "failed to create libnet context\n");
390 ctx
->cred
= samba_cmdline_get_creds();
392 mem_ctx
= talloc_init("torture_domain_close_samr");
395 * querying the domain list using default buffer size
399 r
.in
.hostname
= dcerpc_binding_get_string_option(binding
, "host");
401 status
= libnet_DomainList(ctx
, mem_ctx
, &r
);
402 if (!NT_STATUS_IS_OK(status
)) {
407 torture_comment(torture
, "Received list or domains (everything in one piece):\n");
409 for (i
= 0; i
< r
.out
.count
; i
++) {
410 torture_comment(torture
, "Name[%d]: %s\n", i
, r
.out
.domains
[i
].name
);
414 * querying the domain list using specified (much smaller) buffer size
417 ctx
->samr
.buf_size
= 32;
420 r
.in
.hostname
= dcerpc_binding_get_string_option(binding
, "host");
422 status
= libnet_DomainList(ctx
, mem_ctx
, &r
);
423 if (!NT_STATUS_IS_OK(status
)) {
428 torture_comment(torture
, "Received list or domains (collected in more than one round):\n");
430 for (i
= 0; i
< r
.out
.count
; i
++) {
431 torture_comment(torture
, "Name[%d]: %s\n", i
, r
.out
.domains
[i
].name
);
435 torture_comment(torture
, "\nStatus: %s\n", nt_errstr(status
));
437 talloc_free(mem_ctx
);