1/*
2 *  Unix SMB/CIFS implementation.
3 *  RPC Pipe client / server routines
4
5 *  Copyright (C) Gerald Carter				2002-2003
6 *
7 *  This program is free software; you can redistribute it and/or modify
8 *  it under the terms of the GNU General Public License as published by
9 *  the Free Software Foundation; either version 2 of the License, or
10 *  (at your option) any later version.
11 *
12 *  This program is distributed in the hope that it will be useful,
13 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *  GNU General Public License for more details.
16 *
17 *  You should have received a copy of the GNU General Public License
18 *  along with this program; if not, write to the Free Software
19 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#include "includes.h"
23
24/************************************************************************
25************************************************************************/
26
27static BOOL ds_io_dominfobasic( const char *desc, prs_struct *ps, int depth, DSROLE_PRIMARY_DOMAIN_INFO_BASIC **basic)
28{
29	DSROLE_PRIMARY_DOMAIN_INFO_BASIC *p = *basic;
30
31	if ( UNMARSHALLING(ps) )
32		p = *basic = PRS_ALLOC_MEM(ps, DSROLE_PRIMARY_DOMAIN_INFO_BASIC, 1);
33
34	if ( !p )
35		return False;
36
37	if ( !prs_uint16("machine_role", ps, depth, &p->machine_role) )
38		return False;
39	if ( !prs_uint16("unknown", ps, depth, &p->unknown) )
40		return False;
41
42	if ( !prs_uint32("flags", ps, depth, &p->flags) )
43		return False;
44
45	if ( !prs_uint32("netbios_ptr", ps, depth, &p->netbios_ptr) )
46		return False;
47	if ( !prs_uint32("dnsname_ptr", ps, depth, &p->dnsname_ptr) )
48		return False;
49	if ( !prs_uint32("forestname_ptr", ps, depth, &p->forestname_ptr) )
50		return False;
51
52	if ( !smb_io_uuid("domain_guid", &p->domain_guid, ps, depth) )
53		return False;
54
55	if ( !smb_io_unistr2( "netbios_domain", &p->netbios_domain, p->netbios_ptr, ps, depth) )
56		return False;
57	if ( !prs_align(ps) )
58		return False;
59
60	if ( !smb_io_unistr2( "dns_domain", &p->dns_domain, p->dnsname_ptr, ps, depth) )
61		return False;
62	if ( !prs_align(ps) )
63		return False;
64
65	if ( !smb_io_unistr2( "forest_domain", &p->forest_domain, p->forestname_ptr, ps, depth) )
66		return False;
67	if ( !prs_align(ps) )
68		return False;
69
70
71	return True;
72
73}
74
75/************************************************************************
76************************************************************************/
77
78BOOL ds_io_q_getprimdominfo( const char *desc, prs_struct *ps, int depth, DS_Q_GETPRIMDOMINFO *q_u)
79{
80	prs_debug(ps, depth, desc, "ds_io_q_getprimdominfo");
81	depth++;
82
83	if(!prs_align(ps))
84		return False;
85
86	if ( !prs_uint16( "level", ps, depth, &q_u->level ) )
87		return False;
88
89	return True;
90}
91
92/************************************************************************
93************************************************************************/
94
95BOOL ds_io_r_getprimdominfo( const char *desc, prs_struct *ps, int depth, DS_R_GETPRIMDOMINFO *r_u)
96{
97	prs_debug(ps, depth, desc, "ds_io_r_getprimdominfo");
98	depth++;
99
100	if(!prs_align(ps))
101		return False;
102
103	if ( !prs_uint32( "ptr", ps, depth, &r_u->ptr ) )
104		return False;
105
106	if ( r_u->ptr )
107	{
108		if ( !prs_uint16( "level", ps, depth, &r_u->level ) )
109			return False;
110
111		if ( !prs_uint16( "unknown0", ps, depth, &r_u->unknown0 ) )
112			return False;
113
114		switch ( r_u->level )
115		{
116			case DsRolePrimaryDomainInfoBasic:
117				if ( !ds_io_dominfobasic( "dominfobasic", ps, depth, &r_u->info.basic ) )
118					return False;
119				break;
120			default:
121				return False;
122		}
123	}
124
125	if ( !prs_align(ps) )
126		return False;
127
128	if ( !prs_ntstatus("status", ps, depth, &r_u->status ) )
129		return False;
130
131	return True;
132}
133
134/************************************************************************
135 initialize a DS_ENUM_DOM_TRUSTS structure
136************************************************************************/
137
138BOOL init_q_ds_enum_domain_trusts( DS_Q_ENUM_DOM_TRUSTS *q, const char *server,
139                                 uint32 flags )
140{
141	q->flags = flags;
142
143	if ( server && *server )
144		q->server_ptr = 1;
145	else
146		q->server_ptr = 0;
147
148	init_unistr2( &q->server, server, UNI_STR_TERMINATE);
149
150	return True;
151}
152
153/************************************************************************
154************************************************************************/
155
156static BOOL ds_io_domain_trusts( const char *desc, prs_struct *ps, int depth, DS_DOMAIN_TRUSTS *trust)
157{
158	prs_debug(ps, depth, desc, "ds_io_dom_trusts_ctr");
159	depth++;
160
161	if ( !prs_uint32( "netbios_ptr", ps, depth, &trust->netbios_ptr ) )
162		return False;
163
164	if ( !prs_uint32( "dns_ptr", ps, depth, &trust->dns_ptr ) )
165		return False;
166
167	if ( !prs_uint32( "flags", ps, depth, &trust->flags ) )
168		return False;
169
170	if ( !prs_uint32( "parent_index", ps, depth, &trust->parent_index ) )
171		return False;
172
173	if ( !prs_uint32( "trust_type", ps, depth, &trust->trust_type ) )
174		return False;
175
176	if ( !prs_uint32( "trust_attributes", ps, depth, &trust->trust_attributes ) )
177		return False;
178
179	if ( !prs_uint32( "sid_ptr", ps, depth, &trust->sid_ptr ) )
180		return False;
181
182	if ( !smb_io_uuid("guid", &trust->guid, ps, depth) )
183		return False;
184
185	return True;
186}
187
188/************************************************************************
189************************************************************************/
190
191static BOOL ds_io_dom_trusts_ctr( const char *desc, prs_struct *ps, int depth, DS_DOMAIN_TRUSTS_CTR *ctr)
192{
193	int i;
194
195	prs_debug(ps, depth, desc, "ds_io_dom_trusts_ctr");
196	depth++;
197
198	if ( !prs_uint32( "ptr", ps, depth, &ctr->ptr ) )
199		return False;
200
201	if ( !prs_uint32( "max_count", ps, depth, &ctr->max_count ) )
202		return False;
203
204	/* are we done? */
205
206	if ( ctr->max_count == 0 )
207		return True;
208
209	/* allocate the domain trusts array are parse it */
210
211	ctr->trusts = TALLOC_ARRAY(ps->mem_ctx, DS_DOMAIN_TRUSTS, ctr->max_count);
212
213	if ( !ctr->trusts )
214		return False;
215
216	/* this stinks; the static portion o fthe structure is read here and then
217	   we need another loop to read the UNISTR2's and SID's */
218
219	for ( i=0; i<ctr->max_count;i++ ) {
220		if ( !ds_io_domain_trusts("domain_trusts", ps, depth, &ctr->trusts[i] ) )
221			return False;
222	}
223
224	for ( i=0; i<ctr->max_count; i++ ) {
225
226		if ( !smb_io_unistr2("netbios_domain", &ctr->trusts[i].netbios_domain, ctr->trusts[i].netbios_ptr, ps, depth) )
227			return False;
228
229		if(!prs_align(ps))
230			return False;
231
232		if ( !smb_io_unistr2("dns_domain", &ctr->trusts[i].dns_domain, ctr->trusts[i].dns_ptr, ps, depth) )
233			return False;
234
235		if(!prs_align(ps))
236			return False;
237
238		if ( ctr->trusts[i].sid_ptr ) {
239			if ( !smb_io_dom_sid2("sid", &ctr->trusts[i].sid, ps, depth ) )
240				return False;
241		}
242	}
243
244	return True;
245}
246
247/************************************************************************
248 initialize a DS_ENUM_DOM_TRUSTS request
249************************************************************************/
250
251BOOL ds_io_q_enum_domain_trusts( const char *desc, prs_struct *ps, int depth, DS_Q_ENUM_DOM_TRUSTS *q_u)
252{
253	prs_debug(ps, depth, desc, "ds_io_q_enum_domain_trusts");
254	depth++;
255
256	if ( !prs_align(ps) )
257		return False;
258
259	if ( !prs_uint32( "server_ptr", ps, depth, &q_u->server_ptr ) )
260		return False;
261
262	if ( !smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth) )
263			return False;
264
265	if ( !prs_align(ps) )
266		return False;
267
268	if ( !prs_uint32( "flags", ps, depth, &q_u->flags ) )
269		return False;
270
271	return True;
272}
273
274/************************************************************************
275************************************************************************/
276
277BOOL ds_io_r_enum_domain_trusts( const char *desc, prs_struct *ps, int depth, DS_R_ENUM_DOM_TRUSTS *r_u)
278{
279	prs_debug(ps, depth, desc, "ds_io_r_enum_domain_trusts");
280	depth++;
281
282	if(!prs_align(ps))
283		return False;
284
285	if ( !prs_uint32( "num_domains", ps, depth, &r_u->num_domains ) )
286		return False;
287
288	if ( r_u->num_domains ) {
289		if ( !ds_io_dom_trusts_ctr("domains", ps, depth, &r_u->domains ) )
290			return False;
291	}
292
293	if(!prs_align(ps))
294		return False;
295
296	if ( !prs_ntstatus("status", ps, depth, &r_u->status ) )
297		return False;
298
299	return True;
300}
301
302
303