2 Unix SMB/CIFS implementation.
4 Connect to the SAMR pipe, and return connection and domain handles.
6 Copyright (C) Volker Lendecke 2005
7 Copyright (C) Andrew Bartlett <abartlet@samba.org> 2007
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #include "libcli/composite/composite.h"
26 #include "libcli/security/security.h"
27 #include "librpc/gen_ndr/ndr_samr_c.h"
28 #include "winbind/wb_server.h"
31 /* Helper to initialize SAMR with a specific auth methods. Verify by opening
34 struct connect_samr_state
{
35 struct composite_context
*ctx
;
38 struct dcerpc_pipe
*samr_pipe
;
39 struct policy_handle
*connect_handle
;
40 struct policy_handle
*domain_handle
;
42 struct samr_Connect2 c
;
43 struct samr_OpenDomain o
;
46 static void connect_samr_recv_pipe(struct composite_context
*ctx
);
47 static void connect_samr_recv_conn(struct rpc_request
*req
);
48 static void connect_samr_recv_open(struct rpc_request
*req
);
50 struct composite_context
*wb_connect_samr_send(TALLOC_CTX
*mem_ctx
,
51 struct wbsrv_domain
*domain
)
53 struct composite_context
*result
, *ctx
;
54 struct connect_samr_state
*state
;
56 result
= composite_create(mem_ctx
, domain
->netlogon_pipe
->conn
->event_ctx
);
57 if (result
== NULL
) goto failed
;
59 state
= talloc(result
, struct connect_samr_state
);
60 if (state
== NULL
) goto failed
;
62 result
->private_data
= state
;
64 state
->sid
= dom_sid_dup(state
, domain
->info
->sid
);
65 if (state
->sid
== NULL
) goto failed
;
67 /* this will make the secondary connection on the same IPC$ share,
68 secured with SPNEGO, NTLMSSP or SCHANNEL */
69 ctx
= dcerpc_secondary_auth_connection_send(domain
->netlogon_pipe
,
72 domain
->libnet_ctx
->cred
,
73 domain
->libnet_ctx
->lp_ctx
);
74 composite_continue(state
->ctx
, ctx
, connect_samr_recv_pipe
, state
);
82 static void connect_samr_recv_pipe(struct composite_context
*ctx
)
84 struct rpc_request
*req
;
85 struct connect_samr_state
*state
=
86 talloc_get_type(ctx
->async
.private_data
,
87 struct connect_samr_state
);
89 state
->ctx
->status
= dcerpc_secondary_auth_connection_recv(ctx
, state
,
91 if (!composite_is_ok(state
->ctx
)) return;
93 state
->connect_handle
= talloc(state
, struct policy_handle
);
94 if (composite_nomem(state
->connect_handle
, state
->ctx
)) return;
96 state
->c
.in
.system_name
=
97 talloc_asprintf(state
, "\\\\%s",
98 dcerpc_server_name(state
->samr_pipe
));
99 state
->c
.in
.access_mask
= SEC_FLAG_MAXIMUM_ALLOWED
;
100 state
->c
.out
.connect_handle
= state
->connect_handle
;
102 req
= dcerpc_samr_Connect2_send(state
->samr_pipe
, state
, &state
->c
);
103 composite_continue_rpc(state
->ctx
, req
, connect_samr_recv_conn
, state
);
107 static void connect_samr_recv_conn(struct rpc_request
*req
)
109 struct connect_samr_state
*state
=
110 talloc_get_type(req
->async
.private_data
,
111 struct connect_samr_state
);
113 state
->ctx
->status
= dcerpc_samr_Connect2_recv(req
);
114 if (!composite_is_ok(state
->ctx
)) return;
115 state
->ctx
->status
= state
->c
.out
.result
;
116 if (!composite_is_ok(state
->ctx
)) return;
118 state
->domain_handle
= talloc(state
, struct policy_handle
);
119 if (composite_nomem(state
->domain_handle
, state
->ctx
)) return;
121 state
->o
.in
.connect_handle
= state
->connect_handle
;
122 state
->o
.in
.access_mask
= SEC_FLAG_MAXIMUM_ALLOWED
;
123 state
->o
.in
.sid
= state
->sid
;
124 state
->o
.out
.domain_handle
= state
->domain_handle
;
126 req
= dcerpc_samr_OpenDomain_send(state
->samr_pipe
, state
, &state
->o
);
127 composite_continue_rpc(state
->ctx
, req
,
128 connect_samr_recv_open
, state
);
131 static void connect_samr_recv_open(struct rpc_request
*req
)
133 struct connect_samr_state
*state
=
134 talloc_get_type(req
->async
.private_data
,
135 struct connect_samr_state
);
137 state
->ctx
->status
= dcerpc_samr_OpenDomain_recv(req
);
138 if (!composite_is_ok(state
->ctx
)) return;
139 state
->ctx
->status
= state
->o
.out
.result
;
140 if (!composite_is_ok(state
->ctx
)) return;
142 composite_done(state
->ctx
);
145 NTSTATUS
wb_connect_samr_recv(struct composite_context
*c
,
147 struct dcerpc_pipe
**samr_pipe
,
148 struct policy_handle
*connect_handle
,
149 struct policy_handle
*domain_handle
)
151 NTSTATUS status
= composite_wait(c
);
152 if (NT_STATUS_IS_OK(status
)) {
153 struct connect_samr_state
*state
=
154 talloc_get_type(c
->private_data
,
155 struct connect_samr_state
);
156 *samr_pipe
= talloc_steal(mem_ctx
, state
->samr_pipe
);
157 *connect_handle
= *state
->connect_handle
;
158 *domain_handle
= *state
->domain_handle
;