2 * Unix SMB/CIFS implementation.
4 * Copyright (C) Guenther Deschner 2008
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
21 #include "lib/netapi/netapi.h"
22 #include "lib/netapi/netapi_private.h"
24 /****************************************************************
25 ****************************************************************/
27 WERROR
libnetapi_samr_open_domain(struct libnetapi_ctx
*mem_ctx
,
28 struct rpc_pipe_client
*pipe_cli
,
29 uint32_t connect_mask
,
31 struct policy_handle
*connect_handle
,
32 struct policy_handle
*domain_handle
,
33 struct dom_sid2
**domain_sid
)
37 struct libnetapi_private_ctx
*priv
;
38 uint32_t resume_handle
= 0;
39 uint32_t num_entries
= 0;
40 struct samr_SamArray
*sam
= NULL
;
41 const char *domain_name
= NULL
;
42 struct lsa_String lsa_domain_name
;
43 bool domain_found
= true;
46 priv
= talloc_get_type_abort(mem_ctx
->private_data
,
47 struct libnetapi_private_ctx
);
49 if (is_valid_policy_hnd(&priv
->samr
.connect_handle
)) {
50 if ((priv
->samr
.connect_mask
& connect_mask
) == connect_mask
) {
51 *connect_handle
= priv
->samr
.connect_handle
;
53 libnetapi_samr_close_connect_handle(mem_ctx
,
54 &priv
->samr
.connect_handle
);
58 if (is_valid_policy_hnd(&priv
->samr
.domain_handle
)) {
59 if ((priv
->samr
.domain_mask
& domain_mask
) == domain_mask
) {
60 *domain_handle
= priv
->samr
.domain_handle
;
62 libnetapi_samr_close_domain_handle(mem_ctx
,
63 &priv
->samr
.domain_handle
);
67 if (priv
->samr
.domain_sid
) {
68 *domain_sid
= priv
->samr
.domain_sid
;
71 if (is_valid_policy_hnd(&priv
->samr
.connect_handle
) &&
72 ((priv
->samr
.connect_mask
& connect_mask
) == connect_mask
) &&
73 is_valid_policy_hnd(&priv
->samr
.domain_handle
) &&
74 (priv
->samr
.domain_mask
& domain_mask
) == domain_mask
) {
78 if (!is_valid_policy_hnd(connect_handle
)) {
79 status
= rpccli_try_samr_connects(pipe_cli
, mem_ctx
,
82 if (!NT_STATUS_IS_OK(status
)) {
83 werr
= ntstatus_to_werror(status
);
88 status
= rpccli_samr_EnumDomains(pipe_cli
, mem_ctx
,
94 if (!NT_STATUS_IS_OK(status
)) {
95 werr
= ntstatus_to_werror(status
);
99 for (i
=0; i
<num_entries
; i
++) {
101 domain_name
= sam
->entries
[i
].name
.string
;
103 if (strequal(domain_name
, builtin_domain_name())) {
112 werr
= WERR_NO_SUCH_DOMAIN
;
116 init_lsa_String(&lsa_domain_name
, domain_name
);
118 status
= rpccli_samr_LookupDomain(pipe_cli
, mem_ctx
,
122 if (!NT_STATUS_IS_OK(status
)) {
123 werr
= ntstatus_to_werror(status
);
127 status
= rpccli_samr_OpenDomain(pipe_cli
, mem_ctx
,
132 if (!NT_STATUS_IS_OK(status
)) {
133 werr
= ntstatus_to_werror(status
);
137 priv
->samr
.cli
= pipe_cli
;
139 priv
->samr
.domain_name
= domain_name
;
140 priv
->samr
.domain_sid
= *domain_sid
;
142 priv
->samr
.connect_mask
= connect_mask
;
143 priv
->samr
.connect_handle
= *connect_handle
;
145 priv
->samr
.domain_mask
= domain_mask
;
146 priv
->samr
.domain_handle
= *domain_handle
;
154 /****************************************************************
155 ****************************************************************/
157 WERROR
libnetapi_samr_open_builtin_domain(struct libnetapi_ctx
*mem_ctx
,
158 struct rpc_pipe_client
*pipe_cli
,
159 uint32_t connect_mask
,
160 uint32_t builtin_mask
,
161 struct policy_handle
*connect_handle
,
162 struct policy_handle
*builtin_handle
)
166 struct libnetapi_private_ctx
*priv
;
168 priv
= talloc_get_type_abort(mem_ctx
->private_data
,
169 struct libnetapi_private_ctx
);
171 if (is_valid_policy_hnd(&priv
->samr
.connect_handle
)) {
172 if ((priv
->samr
.connect_mask
& connect_mask
) == connect_mask
) {
173 *connect_handle
= priv
->samr
.connect_handle
;
175 libnetapi_samr_close_connect_handle(mem_ctx
,
176 &priv
->samr
.connect_handle
);
180 if (is_valid_policy_hnd(&priv
->samr
.builtin_handle
)) {
181 if ((priv
->samr
.builtin_mask
& builtin_mask
) == builtin_mask
) {
182 *builtin_handle
= priv
->samr
.builtin_handle
;
184 libnetapi_samr_close_builtin_handle(mem_ctx
,
185 &priv
->samr
.builtin_handle
);
189 if (is_valid_policy_hnd(&priv
->samr
.connect_handle
) &&
190 ((priv
->samr
.connect_mask
& connect_mask
) == connect_mask
) &&
191 is_valid_policy_hnd(&priv
->samr
.builtin_handle
) &&
192 (priv
->samr
.builtin_mask
& builtin_mask
) == builtin_mask
) {
196 if (!is_valid_policy_hnd(connect_handle
)) {
197 status
= rpccli_try_samr_connects(pipe_cli
, mem_ctx
,
200 if (!NT_STATUS_IS_OK(status
)) {
201 werr
= ntstatus_to_werror(status
);
206 status
= rpccli_samr_OpenDomain(pipe_cli
, mem_ctx
,
209 CONST_DISCARD(DOM_SID
*, &global_sid_Builtin
),
211 if (!NT_STATUS_IS_OK(status
)) {
212 werr
= ntstatus_to_werror(status
);
216 priv
->samr
.cli
= pipe_cli
;
218 priv
->samr
.connect_mask
= connect_mask
;
219 priv
->samr
.connect_handle
= *connect_handle
;
221 priv
->samr
.builtin_mask
= builtin_mask
;
222 priv
->samr
.builtin_handle
= *builtin_handle
;
230 /****************************************************************
231 ****************************************************************/
233 void libnetapi_samr_close_domain_handle(struct libnetapi_ctx
*ctx
,
234 struct policy_handle
*handle
)
236 struct libnetapi_private_ctx
*priv
;
238 if (!is_valid_policy_hnd(handle
)) {
242 priv
= talloc_get_type_abort(ctx
->private_data
,
243 struct libnetapi_private_ctx
);
245 if (!policy_hnd_equal(handle
, &priv
->samr
.domain_handle
)) {
249 rpccli_samr_Close(priv
->samr
.cli
, ctx
, handle
);
251 ZERO_STRUCT(priv
->samr
.domain_handle
);
254 /****************************************************************
255 ****************************************************************/
257 void libnetapi_samr_close_builtin_handle(struct libnetapi_ctx
*ctx
,
258 struct policy_handle
*handle
)
260 struct libnetapi_private_ctx
*priv
;
262 if (!is_valid_policy_hnd(handle
)) {
266 priv
= talloc_get_type_abort(ctx
->private_data
,
267 struct libnetapi_private_ctx
);
269 if (!policy_hnd_equal(handle
, &priv
->samr
.builtin_handle
)) {
273 rpccli_samr_Close(priv
->samr
.cli
, ctx
, handle
);
275 ZERO_STRUCT(priv
->samr
.builtin_handle
);
278 /****************************************************************
279 ****************************************************************/
281 void libnetapi_samr_close_connect_handle(struct libnetapi_ctx
*ctx
,
282 struct policy_handle
*handle
)
284 struct libnetapi_private_ctx
*priv
;
286 if (!is_valid_policy_hnd(handle
)) {
290 priv
= talloc_get_type_abort(ctx
->private_data
,
291 struct libnetapi_private_ctx
);
293 if (!policy_hnd_equal(handle
, &priv
->samr
.connect_handle
)) {
297 rpccli_samr_Close(priv
->samr
.cli
, ctx
, handle
);
299 ZERO_STRUCT(priv
->samr
.connect_handle
);
302 /****************************************************************
303 ****************************************************************/
305 void libnetapi_samr_free(struct libnetapi_ctx
*ctx
)
307 struct libnetapi_private_ctx
*priv
;
309 if (!ctx
->private_data
) {
313 priv
= talloc_get_type_abort(ctx
->private_data
,
314 struct libnetapi_private_ctx
);
316 libnetapi_samr_close_domain_handle(ctx
, &priv
->samr
.domain_handle
);
317 libnetapi_samr_close_builtin_handle(ctx
, &priv
->samr
.builtin_handle
);
318 libnetapi_samr_close_connect_handle(ctx
, &priv
->samr
.connect_handle
);