2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6 * Copyright (C) Paul Ashton 1997,
7 * Copyright (C) Jeremy Allison 1998-2001,
8 * Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003.
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/>.
24 /* This is the interface to the netlogon pipe. */
29 #define DBGC_CLASS DBGC_RPC_SRV
31 /*******************************************************************
32 ********************************************************************/
34 static bool proxy_netr_call(pipes_struct
*p
, uint8 opnum
)
36 struct api_struct
*fns
;
39 netlogon_get_pipe_fns(&fns
, &n_fns
);
45 if (fns
[opnum
].opnum
!= opnum
) {
46 smb_panic("NETLOGON function table not sorted");
49 return fns
[opnum
].fn(p
);
52 /*************************************************************************
54 *************************************************************************/
56 static bool api_net_req_chal(pipes_struct
*p
)
60 prs_struct
*data
= &p
->in_data
.data
;
61 prs_struct
*rdata
= &p
->out_data
.rdata
;
66 /* grab the challenge... */
67 if(!net_io_q_req_chal("", &q_u
, data
, 0)) {
68 DEBUG(0,("api_net_req_chal: Failed to unmarshall NET_Q_REQ_CHAL.\n"));
72 r_u
.status
= _net_req_chal(p
, &q_u
, &r_u
);
74 /* store the response in the SMB stream */
75 if(!net_io_r_req_chal("", &r_u
, rdata
, 0)) {
76 DEBUG(0,("api_net_req_chal: Failed to marshall NET_R_REQ_CHAL.\n"));
83 /*************************************************************************
85 *************************************************************************/
87 static bool api_net_auth(pipes_struct
*p
)
91 prs_struct
*data
= &p
->in_data
.data
;
92 prs_struct
*rdata
= &p
->out_data
.rdata
;
97 /* grab the challenge... */
98 if(!net_io_q_auth("", &q_u
, data
, 0)) {
99 DEBUG(0,("api_net_auth: Failed to unmarshall NET_Q_AUTH.\n"));
103 r_u
.status
= _net_auth(p
, &q_u
, &r_u
);
105 /* store the response in the SMB stream */
106 if(!net_io_r_auth("", &r_u
, rdata
, 0)) {
107 DEBUG(0,("api_net_auth: Failed to marshall NET_R_AUTH.\n"));
114 /*************************************************************************
116 *************************************************************************/
118 static bool api_net_auth_2(pipes_struct
*p
)
122 prs_struct
*data
= &p
->in_data
.data
;
123 prs_struct
*rdata
= &p
->out_data
.rdata
;
128 /* grab the challenge... */
129 if(!net_io_q_auth_2("", &q_u
, data
, 0)) {
130 DEBUG(0,("api_net_auth_2: Failed to unmarshall NET_Q_AUTH_2.\n"));
134 r_u
.status
= _net_auth_2(p
, &q_u
, &r_u
);
136 /* store the response in the SMB stream */
137 if(!net_io_r_auth_2("", &r_u
, rdata
, 0)) {
138 DEBUG(0,("api_net_auth_2: Failed to marshall NET_R_AUTH_2.\n"));
145 /*************************************************************************
147 *************************************************************************/
149 static bool api_net_srv_pwset(pipes_struct
*p
)
153 prs_struct
*data
= &p
->in_data
.data
;
154 prs_struct
*rdata
= &p
->out_data
.rdata
;
159 /* grab the challenge and encrypted password ... */
160 if(!net_io_q_srv_pwset("", &q_u
, data
, 0)) {
161 DEBUG(0,("api_net_srv_pwset: Failed to unmarshall NET_Q_SRV_PWSET.\n"));
165 r_u
.status
= _net_srv_pwset(p
, &q_u
, &r_u
);
167 /* store the response in the SMB stream */
168 if(!net_io_r_srv_pwset("", &r_u
, rdata
, 0)) {
169 DEBUG(0,("api_net_srv_pwset: Failed to marshall NET_R_SRV_PWSET.\n"));
176 /*************************************************************************
178 *************************************************************************/
180 static bool api_net_sam_logoff(pipes_struct
*p
)
182 NET_Q_SAM_LOGOFF q_u
;
183 NET_R_SAM_LOGOFF r_u
;
184 prs_struct
*data
= &p
->in_data
.data
;
185 prs_struct
*rdata
= &p
->out_data
.rdata
;
190 if(!net_io_q_sam_logoff("", &q_u
, data
, 0)) {
191 DEBUG(0,("api_net_sam_logoff: Failed to unmarshall NET_Q_SAM_LOGOFF.\n"));
195 r_u
.status
= _net_sam_logoff(p
, &q_u
, &r_u
);
197 /* store the response in the SMB stream */
198 if(!net_io_r_sam_logoff("", &r_u
, rdata
, 0)) {
199 DEBUG(0,("api_net_sam_logoff: Failed to marshall NET_R_SAM_LOGOFF.\n"));
206 /*************************************************************************
208 *************************************************************************/
210 static bool api_net_sam_logon(pipes_struct
*p
)
214 prs_struct
*data
= &p
->in_data
.data
;
215 prs_struct
*rdata
= &p
->out_data
.rdata
;
220 if(!net_io_q_sam_logon("", &q_u
, data
, 0)) {
221 DEBUG(0, ("api_net_sam_logon: Failed to unmarshall NET_Q_SAM_LOGON.\n"));
225 r_u
.status
= _net_sam_logon(p
, &q_u
, &r_u
);
227 /* store the response in the SMB stream */
228 if(!net_io_r_sam_logon("", &r_u
, rdata
, 0)) {
229 DEBUG(0,("api_net_sam_logon: Failed to marshall NET_R_SAM_LOGON.\n"));
236 /*************************************************************************
237 api_net_trust_dom_list:
238 *************************************************************************/
240 static bool api_net_trust_dom_list(pipes_struct
*p
)
242 return proxy_netr_call(p
, NDR_NETR_NETRENUMERATETRUSTEDDOMAINS
);
245 /*************************************************************************
247 *************************************************************************/
249 static bool api_net_logon_ctrl2(pipes_struct
*p
)
251 NET_Q_LOGON_CTRL2 q_u
;
252 NET_R_LOGON_CTRL2 r_u
;
253 prs_struct
*data
= &p
->in_data
.data
;
254 prs_struct
*rdata
= &p
->out_data
.rdata
;
260 /* grab the lsa netlogon ctrl2 query... */
261 if(!net_io_q_logon_ctrl2("", &q_u
, data
, 0)) {
262 DEBUG(0,("api_net_logon_ctrl2: Failed to unmarshall NET_Q_LOGON_CTRL2.\n"));
266 r_u
.status
= _net_logon_ctrl2(p
, &q_u
, &r_u
);
268 if(!net_io_r_logon_ctrl2("", &r_u
, rdata
, 0)) {
269 DEBUG(0,("net_reply_logon_ctrl2: Failed to marshall NET_R_LOGON_CTRL2.\n"));
276 /*************************************************************************
278 *************************************************************************/
280 static bool api_net_logon_ctrl(pipes_struct
*p
)
282 return proxy_netr_call(p
, NDR_NETR_LOGONCONTROL
);
285 /*************************************************************************
286 api_net_sam_logon_ex:
287 *************************************************************************/
289 static bool api_net_sam_logon_ex(pipes_struct
*p
)
291 NET_Q_SAM_LOGON_EX q_u
;
292 NET_R_SAM_LOGON_EX r_u
;
293 prs_struct
*data
= &p
->in_data
.data
;
294 prs_struct
*rdata
= &p
->out_data
.rdata
;
299 if(!net_io_q_sam_logon_ex("", &q_u
, data
, 0)) {
300 DEBUG(0, ("api_net_sam_logon_ex: Failed to unmarshall NET_Q_SAM_LOGON_EX.\n"));
304 r_u
.status
= _net_sam_logon_ex(p
, &q_u
, &r_u
);
306 /* store the response in the SMB stream */
307 if(!net_io_r_sam_logon_ex("", &r_u
, rdata
, 0)) {
308 DEBUG(0,("api_net_sam_logon_ex: Failed to marshall NET_R_SAM_LOGON_EX.\n"));
315 /*******************************************************************
316 array of \PIPE\NETLOGON operations
317 ********************************************************************/
318 static struct api_struct api_net_cmds
[] =
320 { "NET_REQCHAL" , NET_REQCHAL
, api_net_req_chal
},
321 { "NET_AUTH" , NET_AUTH
, api_net_auth
},
322 { "NET_AUTH2" , NET_AUTH2
, api_net_auth_2
},
323 { "NET_SRVPWSET" , NET_SRVPWSET
, api_net_srv_pwset
},
324 { "NET_SAMLOGON" , NET_SAMLOGON
, api_net_sam_logon
},
325 { "NET_SAMLOGOFF" , NET_SAMLOGOFF
, api_net_sam_logoff
},
326 { "NET_LOGON_CTRL2" , NET_LOGON_CTRL2
, api_net_logon_ctrl2
},
327 { "NET_TRUST_DOM_LIST", NET_TRUST_DOM_LIST
, api_net_trust_dom_list
},
328 { "NET_LOGON_CTRL" , NET_LOGON_CTRL
, api_net_logon_ctrl
},
329 { "NET_SAMLOGON_EX" , NET_SAMLOGON_EX
, api_net_sam_logon_ex
},
332 void netlog_get_pipe_fns( struct api_struct
**fns
, int *n_fns
)
335 *n_fns
= sizeof(api_net_cmds
) / sizeof(struct api_struct
);
338 NTSTATUS
rpc_net_init(void)
340 return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION
, "NETLOGON", "lsass", api_net_cmds
,
341 sizeof(api_net_cmds
) / sizeof(struct api_struct
));