2 Unix SMB/CIFS implementation.
4 Connect to the LSA pipe, given an smbcli_tree and possibly some
5 credentials. Try ntlmssp, schannel and anon in that order.
7 Copyright (C) Volker Lendecke 2005
8 Copyright (C) Andrew Bartlett <abartlet@samba.org> 2007
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "libcli/composite/composite.h"
27 #include "librpc/gen_ndr/ndr_lsa_c.h"
28 #include "winbind/wb_server.h"
30 /* Helper to initialize LSA with a specific auth methods. Verify by opening
33 struct init_lsa_state
{
34 struct composite_context
*ctx
;
35 struct dcerpc_pipe
*lsa_pipe
;
38 struct cli_credentials
*creds
;
40 struct lsa_ObjectAttribute objectattr
;
41 struct lsa_OpenPolicy2 openpolicy
;
42 struct policy_handle
*handle
;
45 static void init_lsa_recv_pipe(struct composite_context
*ctx
);
46 static void init_lsa_recv_openpol(struct tevent_req
*subreq
);
48 struct composite_context
*wb_init_lsa_send(TALLOC_CTX
*mem_ctx
,
49 struct wbsrv_domain
*domain
)
51 struct composite_context
*result
, *ctx
;
52 struct init_lsa_state
*state
;
54 result
= composite_create(mem_ctx
, domain
->netlogon_pipe
->conn
->event_ctx
);
55 if (result
== NULL
) goto failed
;
57 state
= talloc(result
, struct init_lsa_state
);
58 if (state
== NULL
) goto failed
;
60 result
->private_data
= state
;
62 /* this will make the secondary connection on the same IPC$ share,
63 secured with SPNEGO or NTLMSSP */
64 ctx
= dcerpc_secondary_auth_connection_send(domain
->netlogon_pipe
,
67 domain
->libnet_ctx
->cred
,
68 domain
->libnet_ctx
->lp_ctx
);
69 composite_continue(state
->ctx
, ctx
, init_lsa_recv_pipe
, state
);
77 static void init_lsa_recv_pipe(struct composite_context
*ctx
)
79 struct init_lsa_state
*state
=
80 talloc_get_type(ctx
->async
.private_data
,
81 struct init_lsa_state
);
82 struct tevent_req
*subreq
;
84 state
->ctx
->status
= dcerpc_secondary_auth_connection_recv(ctx
, state
,
86 if (!composite_is_ok(state
->ctx
)) return;
88 state
->handle
= talloc(state
, struct policy_handle
);
89 if (composite_nomem(state
->handle
, state
->ctx
)) return;
91 state
->openpolicy
.in
.system_name
=
92 talloc_asprintf(state
, "\\\\%s",
93 dcerpc_server_name(state
->lsa_pipe
));
94 ZERO_STRUCT(state
->objectattr
);
95 state
->openpolicy
.in
.attr
= &state
->objectattr
;
96 state
->openpolicy
.in
.access_mask
= SEC_FLAG_MAXIMUM_ALLOWED
;
97 state
->openpolicy
.out
.handle
= state
->handle
;
99 subreq
= dcerpc_lsa_OpenPolicy2_r_send(state
,
100 state
->ctx
->event_ctx
,
101 state
->lsa_pipe
->binding_handle
,
103 if (composite_nomem(subreq
, state
->ctx
)) return;
104 tevent_req_set_callback(subreq
, init_lsa_recv_openpol
, state
);
107 static void init_lsa_recv_openpol(struct tevent_req
*subreq
)
109 struct init_lsa_state
*state
=
110 tevent_req_callback_data(subreq
,
111 struct init_lsa_state
);
113 state
->ctx
->status
= dcerpc_lsa_OpenPolicy2_r_recv(subreq
, state
);
115 if (!composite_is_ok(state
->ctx
)) return;
116 state
->ctx
->status
= state
->openpolicy
.out
.result
;
117 if (!composite_is_ok(state
->ctx
)) return;
119 composite_done(state
->ctx
);
122 NTSTATUS
wb_init_lsa_recv(struct composite_context
*c
,
124 struct dcerpc_pipe
**lsa_pipe
,
125 struct policy_handle
**lsa_policy
)
127 NTSTATUS status
= composite_wait(c
);
128 if (NT_STATUS_IS_OK(status
)) {
129 struct init_lsa_state
*state
=
130 talloc_get_type(c
->private_data
,
131 struct init_lsa_state
);
132 *lsa_pipe
= talloc_steal(mem_ctx
, state
->lsa_pipe
);
133 *lsa_policy
= talloc_steal(mem_ctx
, state
->handle
);