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 /*************************************************************************
33 *************************************************************************/
35 static BOOL api_net_req_chal(pipes_struct *p)
39 prs_struct *data = &p->in_data.data;
40 prs_struct *rdata = &p->out_data.rdata;
45 /* grab the challenge... */
46 if(!net_io_q_req_chal("", &q_u, data, 0)) {
47 DEBUG(0,("api_net_req_chal: Failed to unmarshall NET_Q_REQ_CHAL.\n"));
51 r_u.status = _net_req_chal(p, &q_u, &r_u);
53 /* store the response in the SMB stream */
54 if(!net_io_r_req_chal("", &r_u, rdata, 0)) {
55 DEBUG(0,("api_net_req_chal: Failed to marshall NET_R_REQ_CHAL.\n"));
62 /*************************************************************************
64 *************************************************************************/
66 static BOOL api_net_auth(pipes_struct *p)
70 prs_struct *data = &p->in_data.data;
71 prs_struct *rdata = &p->out_data.rdata;
76 /* grab the challenge... */
77 if(!net_io_q_auth("", &q_u, data, 0)) {
78 DEBUG(0,("api_net_auth: Failed to unmarshall NET_Q_AUTH.\n"));
82 r_u.status = _net_auth(p, &q_u, &r_u);
84 /* store the response in the SMB stream */
85 if(!net_io_r_auth("", &r_u, rdata, 0)) {
86 DEBUG(0,("api_net_auth: Failed to marshall NET_R_AUTH.\n"));
93 /*************************************************************************
95 *************************************************************************/
97 static BOOL api_net_auth_2(pipes_struct *p)
101 prs_struct *data = &p->in_data.data;
102 prs_struct *rdata = &p->out_data.rdata;
107 /* grab the challenge... */
108 if(!net_io_q_auth_2("", &q_u, data, 0)) {
109 DEBUG(0,("api_net_auth_2: Failed to unmarshall NET_Q_AUTH_2.\n"));
113 r_u.status = _net_auth_2(p, &q_u, &r_u);
115 /* store the response in the SMB stream */
116 if(!net_io_r_auth_2("", &r_u, rdata, 0)) {
117 DEBUG(0,("api_net_auth_2: Failed to marshall NET_R_AUTH_2.\n"));
124 /*************************************************************************
126 *************************************************************************/
128 static BOOL api_net_srv_pwset(pipes_struct *p)
132 prs_struct *data = &p->in_data.data;
133 prs_struct *rdata = &p->out_data.rdata;
138 /* grab the challenge and encrypted password ... */
139 if(!net_io_q_srv_pwset("", &q_u, data, 0)) {
140 DEBUG(0,("api_net_srv_pwset: Failed to unmarshall NET_Q_SRV_PWSET.\n"));
144 r_u.status = _net_srv_pwset(p, &q_u, &r_u);
146 /* store the response in the SMB stream */
147 if(!net_io_r_srv_pwset("", &r_u, rdata, 0)) {
148 DEBUG(0,("api_net_srv_pwset: Failed to marshall NET_R_SRV_PWSET.\n"));
155 /*************************************************************************
157 *************************************************************************/
159 static BOOL api_net_sam_logoff(pipes_struct *p)
161 NET_Q_SAM_LOGOFF q_u;
162 NET_R_SAM_LOGOFF r_u;
163 prs_struct *data = &p->in_data.data;
164 prs_struct *rdata = &p->out_data.rdata;
169 if(!net_io_q_sam_logoff("", &q_u, data, 0)) {
170 DEBUG(0,("api_net_sam_logoff: Failed to unmarshall NET_Q_SAM_LOGOFF.\n"));
174 r_u.status = _net_sam_logoff(p, &q_u, &r_u);
176 /* store the response in the SMB stream */
177 if(!net_io_r_sam_logoff("", &r_u, rdata, 0)) {
178 DEBUG(0,("api_net_sam_logoff: Failed to marshall NET_R_SAM_LOGOFF.\n"));
185 /*************************************************************************
187 *************************************************************************/
189 static BOOL api_net_sam_logon(pipes_struct *p)
193 prs_struct *data = &p->in_data.data;
194 prs_struct *rdata = &p->out_data.rdata;
199 if(!net_io_q_sam_logon("", &q_u, data, 0)) {
200 DEBUG(0, ("api_net_sam_logon: Failed to unmarshall NET_Q_SAM_LOGON.\n"));
204 r_u.status = _net_sam_logon(p, &q_u, &r_u);
206 /* store the response in the SMB stream */
207 if(!net_io_r_sam_logon("", &r_u, rdata, 0)) {
208 DEBUG(0,("api_net_sam_logon: Failed to marshall NET_R_SAM_LOGON.\n"));
215 /*************************************************************************
216 api_net_trust_dom_list:
217 *************************************************************************/
219 static BOOL api_net_trust_dom_list(pipes_struct *p)
221 NET_Q_TRUST_DOM_LIST q_u;
222 NET_R_TRUST_DOM_LIST r_u;
223 prs_struct *data = &p->in_data.data;
224 prs_struct *rdata = &p->out_data.rdata;
229 /* grab the lsa trusted domain list query... */
230 if(!net_io_q_trust_dom("", &q_u, data, 0)) {
231 DEBUG(0,("api_net_trust_dom_list: Failed to unmarshall NET_Q_TRUST_DOM_LIST.\n"));
235 /* construct reply. */
236 r_u.status = _net_trust_dom_list(p, &q_u, &r_u);
238 /* store the response in the SMB stream */
239 if(!net_io_r_trust_dom("", &r_u, rdata, 0)) {
240 DEBUG(0,("net_reply_trust_dom_list: Failed to marshall NET_R_TRUST_DOM_LIST.\n"));
247 /*************************************************************************
249 *************************************************************************/
251 static BOOL api_net_logon_ctrl2(pipes_struct *p)
253 NET_Q_LOGON_CTRL2 q_u;
254 NET_R_LOGON_CTRL2 r_u;
255 prs_struct *data = &p->in_data.data;
256 prs_struct *rdata = &p->out_data.rdata;
262 /* grab the lsa netlogon ctrl2 query... */
263 if(!net_io_q_logon_ctrl2("", &q_u, data, 0)) {
264 DEBUG(0,("api_net_logon_ctrl2: Failed to unmarshall NET_Q_LOGON_CTRL2.\n"));
268 r_u.status = _net_logon_ctrl2(p, &q_u, &r_u);
270 if(!net_io_r_logon_ctrl2("", &r_u, rdata, 0)) {
271 DEBUG(0,("net_reply_logon_ctrl2: Failed to marshall NET_R_LOGON_CTRL2.\n"));
278 /*************************************************************************
280 *************************************************************************/
282 static BOOL api_net_logon_ctrl(pipes_struct *p)
284 NET_Q_LOGON_CTRL q_u;
285 NET_R_LOGON_CTRL r_u;
286 prs_struct *data = &p->in_data.data;
287 prs_struct *rdata = &p->out_data.rdata;
292 /* grab the lsa netlogon ctrl query... */
293 if(!net_io_q_logon_ctrl("", &q_u, data, 0)) {
294 DEBUG(0,("api_net_logon_ctrl: Failed to unmarshall NET_Q_LOGON_CTRL.\n"));
298 r_u.status = _net_logon_ctrl(p, &q_u, &r_u);
300 if(!net_io_r_logon_ctrl("", &r_u, rdata, 0)) {
301 DEBUG(0,("net_reply_logon_ctrl2: Failed to marshall NET_R_LOGON_CTRL.\n"));
308 /*************************************************************************
309 api_net_sam_logon_ex:
310 *************************************************************************/
312 static BOOL api_net_sam_logon_ex(pipes_struct *p)
314 NET_Q_SAM_LOGON_EX q_u;
315 NET_R_SAM_LOGON_EX r_u;
316 prs_struct *data = &p->in_data.data;
317 prs_struct *rdata = &p->out_data.rdata;
322 if(!net_io_q_sam_logon_ex("", &q_u, data, 0)) {
323 DEBUG(0, ("api_net_sam_logon_ex: Failed to unmarshall NET_Q_SAM_LOGON_EX.\n"));
327 r_u.status = _net_sam_logon_ex(p, &q_u, &r_u);
329 /* store the response in the SMB stream */
330 if(!net_io_r_sam_logon_ex("", &r_u, rdata, 0)) {
331 DEBUG(0,("api_net_sam_logon_ex: Failed to marshall NET_R_SAM_LOGON_EX.\n"));
339 /*************************************************************************
340 api_ds_enum_dom_trusts:
341 *************************************************************************/
344 static BOOL api_ds_enum_dom_trusts(pipes_struct *p)
346 DS_Q_ENUM_DOM_TRUSTS q_u;
347 DS_R_ENUM_DOM_TRUSTS r_u;
349 prs_struct *data = &p->in_data.data;
350 prs_struct *rdata = &p->out_data.rdata;
355 DEBUG(6,("api_ds_enum_dom_trusts\n"));
357 if ( !ds_io_q_enum_domain_trusts("", data, 0, &q_u) ) {
358 DEBUG(0,("api_ds_enum_domain_trusts: Failed to unmarshall DS_Q_ENUM_DOM_TRUSTS.\n"));
362 r_u.status = _ds_enum_dom_trusts(p, &q_u, &r_u);
364 if ( !ds_io_r_enum_domain_trusts("", rdata, 0, &r_u) ) {
365 DEBUG(0,("api_ds_enum_domain_trusts: Failed to marshall DS_R_ENUM_DOM_TRUSTS.\n"));
369 DEBUG(6,("api_ds_enum_dom_trusts\n"));
375 /*******************************************************************
376 array of \PIPE\NETLOGON operations
377 ********************************************************************/
378 static struct api_struct api_net_cmds [] =
380 { "NET_REQCHAL" , NET_REQCHAL , api_net_req_chal },
381 { "NET_AUTH" , NET_AUTH , api_net_auth },
382 { "NET_AUTH2" , NET_AUTH2 , api_net_auth_2 },
383 { "NET_SRVPWSET" , NET_SRVPWSET , api_net_srv_pwset },
384 { "NET_SAMLOGON" , NET_SAMLOGON , api_net_sam_logon },
385 { "NET_SAMLOGOFF" , NET_SAMLOGOFF , api_net_sam_logoff },
386 { "NET_LOGON_CTRL2" , NET_LOGON_CTRL2 , api_net_logon_ctrl2 },
387 { "NET_TRUST_DOM_LIST", NET_TRUST_DOM_LIST, api_net_trust_dom_list },
388 { "NET_LOGON_CTRL" , NET_LOGON_CTRL , api_net_logon_ctrl },
389 { "NET_SAMLOGON_EX" , NET_SAMLOGON_EX , api_net_sam_logon_ex },
391 { "DS_ENUM_DOM_TRUSTS", DS_ENUM_DOM_TRUSTS, api_ds_enum_dom_trusts }
395 void netlog_get_pipe_fns( struct api_struct **fns, int *n_fns )
398 *n_fns = sizeof(api_net_cmds) / sizeof(struct api_struct);
401 NTSTATUS rpc_net_init(void)
403 return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "NETLOGON", "lsass", api_net_cmds,
404 sizeof(api_net_cmds) / sizeof(struct api_struct));