r12608: Remove some unused #include lines.
[jelmer/samba4-debian.git] / source / rpc_server / drsuapi / dcesrv_drsuapi.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    endpoint server for the drsuapi pipe
5
6    Copyright (C) Stefan Metzmacher 2004
7    
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23 #include "includes.h"
24 #include "librpc/gen_ndr/ndr_drsuapi.h"
25 #include "rpc_server/dcerpc_server.h"
26 #include "rpc_server/common/common.h"
27 #include "rpc_server/drsuapi/dcesrv_drsuapi.h"
28 #include "dsdb/samdb/samdb.h"
29
30 /* 
31   drsuapi_DsBind 
32 */
33 static WERROR drsuapi_DsBind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
34                        struct drsuapi_DsBind *r)
35 {
36         struct drsuapi_bind_state *b_state;
37         struct dcesrv_handle *handle;
38         struct drsuapi_DsBindInfoCtr *bind_info;
39         struct GUID site_guid;
40
41         r->out.bind_info = NULL;
42         ZERO_STRUCTP(r->out.bind_handle);
43
44         b_state = talloc(dce_call->conn, struct drsuapi_bind_state);
45         WERR_TALLOC_CHECK(b_state);
46
47         b_state->sam_ctx = samdb_connect(b_state, dce_call->conn->auth_state.session_info); 
48         if (!b_state->sam_ctx) {
49                 talloc_free(b_state);
50                 return WERR_FOOBAR;
51         }
52
53         handle = dcesrv_handle_new(dce_call->context, DRSUAPI_BIND_HANDLE);
54         if (!handle) {
55                 talloc_free(b_state);
56                 return WERR_NOMEM;
57         }
58
59         handle->data = talloc_steal(handle, b_state);
60
61         bind_info = talloc(mem_ctx, struct drsuapi_DsBindInfoCtr);
62         WERR_TALLOC_CHECK(bind_info);
63
64         ZERO_STRUCT(site_guid);
65
66         bind_info->length                               = 28;
67         bind_info->info.info28.supported_extensions     = 0;
68         bind_info->info.info28.site_guid                = site_guid;
69         bind_info->info.info28.u1                       = 0;
70         bind_info->info.info28.repl_epoch               = 0;
71
72         r->out.bind_info = bind_info;
73         *r->out.bind_handle = handle->wire_handle;
74
75         return WERR_OK;
76 }
77
78
79 /* 
80   drsuapi_DsUnbind 
81 */
82 static WERROR drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
83                                struct drsuapi_DsUnbind *r)
84 {
85         struct dcesrv_handle *h;
86
87         *r->out.bind_handle = *r->in.bind_handle;
88
89         DCESRV_PULL_HANDLE_WERR(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE);
90
91         talloc_free(h);
92
93         ZERO_STRUCTP(r->out.bind_handle);
94
95         return WERR_OK;
96 }
97
98
99 /* 
100   drsuapi_DsReplicaSync 
101 */
102 static WERROR drsuapi_DsReplicaSync(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
103                        struct drsuapi_DsReplicaSync *r)
104 {
105         /* TODO: implement this call correct!
106          *       for now we just say yes,
107          *       because we have no output parameter
108          */
109         return WERR_OK;
110 }
111
112
113 /* 
114   drsuapi_DsGetNCChanges
115 */
116 static WERROR drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
117                        struct drsuapi_DsGetNCChanges *r)
118 {
119         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
120 }
121
122
123 /* 
124   drsuapi_DsReplicaUpdateRefs
125 */
126 static WERROR drsuapi_DsReplicaUpdateRefs(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
127                        struct drsuapi_DsReplicaUpdateRefs *r)
128 {
129         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
130 }
131
132
133 /* 
134   DRSUAPI_REPLICA_ADD 
135 */
136 static WERROR DRSUAPI_REPLICA_ADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
137                        struct DRSUAPI_REPLICA_ADD *r)
138 {
139         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
140 }
141
142
143 /* 
144   DRSUAPI_REPLICA_DEL 
145 */
146 static WERROR DRSUAPI_REPLICA_DEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
147                        struct DRSUAPI_REPLICA_DEL *r)
148 {
149         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
150 }
151
152
153 /* 
154   DRSUAPI_REPLICA_MODIFY 
155 */
156 static WERROR DRSUAPI_REPLICA_MODIFY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
157                        struct DRSUAPI_REPLICA_MODIFY *r)
158 {
159         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
160 }
161
162
163 /* 
164   DRSUAPI_VERIFY_NAMES 
165 */
166 static WERROR DRSUAPI_VERIFY_NAMES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
167                        struct DRSUAPI_VERIFY_NAMES *r)
168 {
169         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
170 }
171
172
173 /* 
174   DRSUAPI_GET_MEMBERSHIPS 
175 */
176 static WERROR DRSUAPI_GET_MEMBERSHIPS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
177                        struct DRSUAPI_GET_MEMBERSHIPS *r)
178 {
179         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
180 }
181
182
183 /* 
184   DRSUAPI_INTER_DOMAIN_MOVE 
185 */
186 static WERROR DRSUAPI_INTER_DOMAIN_MOVE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
187                        struct DRSUAPI_INTER_DOMAIN_MOVE *r)
188 {
189         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
190 }
191
192
193 /* 
194   DRSUAPI_GET_NT4_CHANGELOG 
195 */
196 static WERROR DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
197                        struct DRSUAPI_GET_NT4_CHANGELOG *r)
198 {
199         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
200 }
201
202
203 /* 
204   drsuapi_DsCrackNames 
205 */
206 WERROR drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
207                             struct drsuapi_DsCrackNames *r)
208 {
209         WERROR status;
210         struct drsuapi_bind_state *b_state;
211         struct dcesrv_handle *h;
212
213         r->out.level = r->in.level;
214         ZERO_STRUCT(r->out.ctr);
215
216         DCESRV_PULL_HANDLE_WERR(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE);
217         b_state = h->data;
218
219         switch (r->in.level) {
220                 case 1: {
221                         struct drsuapi_DsNameCtr1 *ctr1;
222                         struct drsuapi_DsNameInfo1 *names;
223                         int count;
224                         int i;
225
226                         ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1);
227                         WERR_TALLOC_CHECK(ctr1);
228
229                         count = r->in.req.req1.count;
230                         names = talloc_array(mem_ctx, struct drsuapi_DsNameInfo1, count);
231                         WERR_TALLOC_CHECK(names);
232
233                         for (i=0; i < count; i++) {
234                                 status = DsCrackNameOneName(b_state->sam_ctx, mem_ctx,
235                                                             r->in.req.req1.format_flags,
236                                                             r->in.req.req1.format_offered,
237                                                             r->in.req.req1.format_desired,
238                                                             r->in.req.req1.names[i].str,
239                                                             &names[i]);
240                                 if (!W_ERROR_IS_OK(status)) {
241                                         return status;
242                                 }
243                         }
244
245                         ctr1->count = count;
246                         ctr1->array = names;
247                         r->out.ctr.ctr1 = ctr1;
248
249                         return WERR_OK;
250                 }
251         }
252         
253         return WERR_UNKNOWN_LEVEL;
254 }
255
256 /* 
257   drsuapi_DsWriteAccountSpn 
258 */
259 static WERROR drsuapi_DsWriteAccountSpn(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
260                        struct drsuapi_DsWriteAccountSpn *r)
261 {
262         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
263 }
264
265
266 /* 
267   DRSUAPI_REMOVE_DS_SERVER 
268 */
269 static WERROR DRSUAPI_REMOVE_DS_SERVER(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
270                        struct DRSUAPI_REMOVE_DS_SERVER *r)
271 {
272         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
273 }
274
275
276 /* 
277   DRSUAPI_REMOVE_DS_DOMAIN 
278 */
279 static WERROR DRSUAPI_REMOVE_DS_DOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
280                        struct DRSUAPI_REMOVE_DS_DOMAIN *r)
281 {
282         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
283 }
284
285
286 /* 
287   drsuapi_DsGetDomainControllerInfo 
288 */
289 static WERROR drsuapi_DsGetDomainControllerInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
290                                                 struct drsuapi_DsGetDomainControllerInfo *r)
291 {
292         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
293 }
294
295
296 /* 
297   drsuapi_DsAddEntry
298 */
299 static WERROR drsuapi_DsAddEntry(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
300                        struct drsuapi_DsAddEntry *r)
301 {
302         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
303 }
304
305
306 /* 
307   DRSUAPI_EXECUTE_KCC 
308 */
309 static WERROR DRSUAPI_EXECUTE_KCC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
310                        struct DRSUAPI_EXECUTE_KCC *r)
311 {
312         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
313 }
314
315
316 /* 
317   drsuapi_DsReplicaGetInfo 
318 */
319 static WERROR drsuapi_DsReplicaGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
320                        struct drsuapi_DsReplicaGetInfo *r)
321 {
322         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
323 }
324
325
326 /* 
327   DRSUAPI_ADD_SID_HISTORY 
328 */
329 static WERROR DRSUAPI_ADD_SID_HISTORY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
330                        struct DRSUAPI_ADD_SID_HISTORY *r)
331 {
332         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
333 }
334
335
336 /* 
337   DRSUAPI_GET_MEMBERSHIPS2 
338 */
339 static WERROR DRSUAPI_GET_MEMBERSHIPS2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
340                        struct DRSUAPI_GET_MEMBERSHIPS2 *r)
341 {
342         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
343 }
344
345
346 /* 
347   DRSUAPI_REPLICA_VERIFY_OBJECTS 
348 */
349 static WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
350                        struct DRSUAPI_REPLICA_VERIFY_OBJECTS *r)
351 {
352         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
353 }
354
355
356 /* 
357   DRSUAPI_GET_OBJECT_EXISTENCE 
358 */
359 static WERROR DRSUAPI_GET_OBJECT_EXISTENCE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
360                        struct DRSUAPI_GET_OBJECT_EXISTENCE *r)
361 {
362         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
363 }
364
365
366 /* 
367   DRSUAPI_QUERY_SITES_BY_COST 
368 */
369 static WERROR DRSUAPI_QUERY_SITES_BY_COST(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
370                        struct DRSUAPI_QUERY_SITES_BY_COST *r)
371 {
372         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
373 }
374
375
376 /* include the generated boilerplate */
377 #include "librpc/gen_ndr/ndr_drsuapi_s.c"