1/*
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.
9 *
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 2 of the License, or
13 *  (at your option) any later version.
14 *
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.
19 *
20 *  You should have received a copy of the GNU General Public License
21 *  along with this program; if not, write to the Free Software
22 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 */
24
25/* This is the interface to the netlogon pipe. */
26
27#include "includes.h"
28
29#undef DBGC_CLASS
30#define DBGC_CLASS DBGC_RPC_SRV
31
32/*************************************************************************
33 api_net_req_chal:
34 *************************************************************************/
35
36static BOOL api_net_req_chal(pipes_struct *p)
37{
38	NET_Q_REQ_CHAL q_u;
39	NET_R_REQ_CHAL r_u;
40	prs_struct *data = &p->in_data.data;
41	prs_struct *rdata = &p->out_data.rdata;
42
43	ZERO_STRUCT(q_u);
44	ZERO_STRUCT(r_u);
45
46	/* grab the challenge... */
47	if(!net_io_q_req_chal("", &q_u, data, 0)) {
48		DEBUG(0,("api_net_req_chal: Failed to unmarshall NET_Q_REQ_CHAL.\n"));
49		return False;
50	}
51
52	r_u.status = _net_req_chal(p, &q_u, &r_u);
53
54	/* store the response in the SMB stream */
55	if(!net_io_r_req_chal("", &r_u, rdata, 0)) {
56		DEBUG(0,("api_net_req_chal: Failed to marshall NET_R_REQ_CHAL.\n"));
57		return False;
58	}
59
60	return True;
61}
62
63/*************************************************************************
64 api_net_auth:
65 *************************************************************************/
66
67static BOOL api_net_auth(pipes_struct *p)
68{
69	NET_Q_AUTH q_u;
70	NET_R_AUTH r_u;
71	prs_struct *data = &p->in_data.data;
72	prs_struct *rdata = &p->out_data.rdata;
73
74	ZERO_STRUCT(q_u);
75	ZERO_STRUCT(r_u);
76
77	/* grab the challenge... */
78	if(!net_io_q_auth("", &q_u, data, 0)) {
79		DEBUG(0,("api_net_auth: Failed to unmarshall NET_Q_AUTH.\n"));
80		return False;
81	}
82
83	r_u.status = _net_auth(p, &q_u, &r_u);
84
85	/* store the response in the SMB stream */
86	if(!net_io_r_auth("", &r_u, rdata, 0)) {
87		DEBUG(0,("api_net_auth: Failed to marshall NET_R_AUTH.\n"));
88		return False;
89	}
90
91	return True;
92}
93
94/*************************************************************************
95 api_net_auth_2:
96 *************************************************************************/
97
98static BOOL api_net_auth_2(pipes_struct *p)
99{
100	NET_Q_AUTH_2 q_u;
101	NET_R_AUTH_2 r_u;
102	prs_struct *data = &p->in_data.data;
103	prs_struct *rdata = &p->out_data.rdata;
104
105	ZERO_STRUCT(q_u);
106	ZERO_STRUCT(r_u);
107
108	/* grab the challenge... */
109	if(!net_io_q_auth_2("", &q_u, data, 0)) {
110		DEBUG(0,("api_net_auth_2: Failed to unmarshall NET_Q_AUTH_2.\n"));
111		return False;
112	}
113
114	r_u.status = _net_auth_2(p, &q_u, &r_u);
115
116	/* store the response in the SMB stream */
117	if(!net_io_r_auth_2("", &r_u, rdata, 0)) {
118		DEBUG(0,("api_net_auth_2: Failed to marshall NET_R_AUTH_2.\n"));
119		return False;
120	}
121
122	return True;
123}
124
125/*************************************************************************
126 api_net_srv_pwset:
127 *************************************************************************/
128
129static BOOL api_net_srv_pwset(pipes_struct *p)
130{
131	NET_Q_SRV_PWSET q_u;
132	NET_R_SRV_PWSET r_u;
133	prs_struct *data = &p->in_data.data;
134	prs_struct *rdata = &p->out_data.rdata;
135
136	ZERO_STRUCT(q_u);
137	ZERO_STRUCT(r_u);
138
139	/* grab the challenge and encrypted password ... */
140	if(!net_io_q_srv_pwset("", &q_u, data, 0)) {
141		DEBUG(0,("api_net_srv_pwset: Failed to unmarshall NET_Q_SRV_PWSET.\n"));
142		return False;
143	}
144
145	r_u.status = _net_srv_pwset(p, &q_u, &r_u);
146
147	/* store the response in the SMB stream */
148	if(!net_io_r_srv_pwset("", &r_u, rdata, 0)) {
149		DEBUG(0,("api_net_srv_pwset: Failed to marshall NET_R_SRV_PWSET.\n"));
150		return False;
151	}
152
153	return True;
154}
155
156/*************************************************************************
157 api_net_sam_logoff:
158 *************************************************************************/
159
160static BOOL api_net_sam_logoff(pipes_struct *p)
161{
162	NET_Q_SAM_LOGOFF q_u;
163	NET_R_SAM_LOGOFF r_u;
164	prs_struct *data = &p->in_data.data;
165	prs_struct *rdata = &p->out_data.rdata;
166
167	ZERO_STRUCT(q_u);
168	ZERO_STRUCT(r_u);
169
170	if(!net_io_q_sam_logoff("", &q_u, data, 0)) {
171		DEBUG(0,("api_net_sam_logoff: Failed to unmarshall NET_Q_SAM_LOGOFF.\n"));
172		return False;
173	}
174
175	r_u.status = _net_sam_logoff(p, &q_u, &r_u);
176
177	/* store the response in the SMB stream */
178	if(!net_io_r_sam_logoff("", &r_u, rdata, 0)) {
179		DEBUG(0,("api_net_sam_logoff: Failed to marshall NET_R_SAM_LOGOFF.\n"));
180		return False;
181	}
182
183	return True;
184}
185
186/*************************************************************************
187 api_net_sam_logon:
188 *************************************************************************/
189
190static BOOL api_net_sam_logon(pipes_struct *p)
191{
192	NET_Q_SAM_LOGON q_u;
193	NET_R_SAM_LOGON r_u;
194	prs_struct *data = &p->in_data.data;
195	prs_struct *rdata = &p->out_data.rdata;
196
197	ZERO_STRUCT(q_u);
198	ZERO_STRUCT(r_u);
199
200    if(!net_io_q_sam_logon("", &q_u, data, 0)) {
201        DEBUG(0, ("api_net_sam_logon: Failed to unmarshall NET_Q_SAM_LOGON.\n"));
202        return False;
203    }
204
205	r_u.status = _net_sam_logon(p, &q_u, &r_u);
206
207	/* store the response in the SMB stream */
208	if(!net_io_r_sam_logon("", &r_u, rdata, 0)) {
209		DEBUG(0,("api_net_sam_logon: Failed to marshall NET_R_SAM_LOGON.\n"));
210		return False;
211	}
212
213    return True;
214}
215
216/*************************************************************************
217 api_net_trust_dom_list:
218 *************************************************************************/
219
220static BOOL api_net_trust_dom_list(pipes_struct *p)
221{
222	NET_Q_TRUST_DOM_LIST q_u;
223	NET_R_TRUST_DOM_LIST r_u;
224	prs_struct *data = &p->in_data.data;
225	prs_struct *rdata = &p->out_data.rdata;
226
227	ZERO_STRUCT(q_u);
228	ZERO_STRUCT(r_u);
229
230	/* grab the lsa trusted domain list query... */
231	if(!net_io_q_trust_dom("", &q_u, data, 0)) {
232		DEBUG(0,("api_net_trust_dom_list: Failed to unmarshall NET_Q_TRUST_DOM_LIST.\n"));
233		return False;
234	}
235
236	/* construct reply. */
237	r_u.status = _net_trust_dom_list(p, &q_u, &r_u);
238
239	/* store the response in the SMB stream */
240	if(!net_io_r_trust_dom("", &r_u, rdata, 0)) {
241		DEBUG(0,("net_reply_trust_dom_list: Failed to marshall NET_R_TRUST_DOM_LIST.\n"));
242		return False;
243	}
244
245	return True;
246}
247
248/*************************************************************************
249 api_net_logon_ctrl2:
250 *************************************************************************/
251
252static BOOL api_net_logon_ctrl2(pipes_struct *p)
253{
254	NET_Q_LOGON_CTRL2 q_u;
255	NET_R_LOGON_CTRL2 r_u;
256	prs_struct *data = &p->in_data.data;
257	prs_struct *rdata = &p->out_data.rdata;
258
259	ZERO_STRUCT(q_u);
260	ZERO_STRUCT(r_u);
261
262
263	/* grab the lsa netlogon ctrl2 query... */
264	if(!net_io_q_logon_ctrl2("", &q_u, data, 0)) {
265		DEBUG(0,("api_net_logon_ctrl2: Failed to unmarshall NET_Q_LOGON_CTRL2.\n"));
266		return False;
267	}
268
269	r_u.status = _net_logon_ctrl2(p, &q_u, &r_u);
270
271	if(!net_io_r_logon_ctrl2("", &r_u, rdata, 0)) {
272		DEBUG(0,("net_reply_logon_ctrl2: Failed to marshall NET_R_LOGON_CTRL2.\n"));
273		return False;
274	}
275
276	return True;
277}
278
279/*************************************************************************
280 api_net_logon_ctrl:
281 *************************************************************************/
282
283static BOOL api_net_logon_ctrl(pipes_struct *p)
284{
285	NET_Q_LOGON_CTRL q_u;
286	NET_R_LOGON_CTRL r_u;
287	prs_struct *data = &p->in_data.data;
288	prs_struct *rdata = &p->out_data.rdata;
289
290	ZERO_STRUCT(q_u);
291	ZERO_STRUCT(r_u);
292
293	/* grab the lsa netlogon ctrl query... */
294	if(!net_io_q_logon_ctrl("", &q_u, data, 0)) {
295		DEBUG(0,("api_net_logon_ctrl: Failed to unmarshall NET_Q_LOGON_CTRL.\n"));
296		return False;
297	}
298
299	r_u.status = _net_logon_ctrl(p, &q_u, &r_u);
300
301	if(!net_io_r_logon_ctrl("", &r_u, rdata, 0)) {
302		DEBUG(0,("net_reply_logon_ctrl2: Failed to marshall NET_R_LOGON_CTRL2.\n"));
303		return False;
304	}
305
306	return True;
307}
308
309/*************************************************************************
310 api_ds_enum_dom_trusts:
311 *************************************************************************/
312
313#if 0 	/* JERRY */
314static BOOL api_ds_enum_dom_trusts(pipes_struct *p)
315{
316	DS_Q_ENUM_DOM_TRUSTS q_u;
317	DS_R_ENUM_DOM_TRUSTS r_u;
318
319	prs_struct *data = &p->in_data.data;
320	prs_struct *rdata = &p->out_data.rdata;
321
322	ZERO_STRUCT(q_u);
323	ZERO_STRUCT(r_u);
324
325	DEBUG(6,("api_ds_enum_dom_trusts\n"));
326
327	if ( !ds_io_q_enum_domain_trusts("", data, 0, &q_u) ) {
328		DEBUG(0,("api_ds_enum_domain_trusts: Failed to unmarshall DS_Q_ENUM_DOM_TRUSTS.\n"));
329		return False;
330	}
331
332	r_u.status = _ds_enum_dom_trusts(p, &q_u, &r_u);
333
334	if ( !ds_io_r_enum_domain_trusts("", rdata, 0, &r_u) ) {
335		DEBUG(0,("api_ds_enum_domain_trusts: Failed to marshall DS_R_ENUM_DOM_TRUSTS.\n"));
336		return False;
337	}
338
339	DEBUG(6,("api_ds_enum_dom_trusts\n"));
340
341	return True;
342}
343#endif	/* JERRY */
344
345/*******************************************************************
346 array of \PIPE\NETLOGON operations
347 ********************************************************************/
348static struct api_struct api_net_cmds [] =
349    {
350      { "NET_REQCHAL"       , NET_REQCHAL       , api_net_req_chal       },
351      { "NET_AUTH"          , NET_AUTH          , api_net_auth           },
352      { "NET_AUTH2"         , NET_AUTH2         , api_net_auth_2         },
353      { "NET_SRVPWSET"      , NET_SRVPWSET      , api_net_srv_pwset      },
354      { "NET_SAMLOGON"      , NET_SAMLOGON      , api_net_sam_logon      },
355      { "NET_SAMLOGOFF"     , NET_SAMLOGOFF     , api_net_sam_logoff     },
356      { "NET_LOGON_CTRL2"   , NET_LOGON_CTRL2   , api_net_logon_ctrl2    },
357      { "NET_TRUST_DOM_LIST", NET_TRUST_DOM_LIST, api_net_trust_dom_list },
358      { "NET_LOGON_CTRL"    , NET_LOGON_CTRL    , api_net_logon_ctrl     },
359#if 0	/* JERRY */
360      { "DS_ENUM_DOM_TRUSTS", DS_ENUM_DOM_TRUSTS, api_ds_enum_dom_trusts }
361#endif	/* JERRY */
362    };
363
364void netlog_get_pipe_fns( struct api_struct **fns, int *n_fns )
365{
366	*fns = api_net_cmds;
367	*n_fns = sizeof(api_net_cmds) / sizeof(struct api_struct);
368}
369
370NTSTATUS rpc_net_init(void)
371{
372  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "NETLOGON", "lsass", api_net_cmds,
373				    sizeof(api_net_cmds) / sizeof(struct api_struct));
374}
375