a8c48d680507184fccf90a535a31274e9243d430
[samba.git] / source4 / 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
29 /*
30   destroy a general handle. 
31 */
32 static void drsuapi_handle_destroy(struct dcesrv_connection *conn, struct dcesrv_handle *h)
33 {
34         talloc_free(h->data);
35 }
36
37 /* 
38   drsuapi_DsBind 
39 */
40 static WERROR drsuapi_DsBind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
41                        struct drsuapi_DsBind *r)
42 {
43         struct drsuapi_bind_state *b_state;
44         struct dcesrv_handle *handle;
45         struct drsuapi_DsBindInfo *bind_info;
46         const uint8_t bind_info_data[] = DRSUAPI_DS_BIND_INFO_RESPONSE_W2K3;
47
48         r->out.bind_info = NULL;
49         ZERO_STRUCTP(r->out.bind_handle);
50
51         b_state = talloc_p(dce_call->conn, struct drsuapi_bind_state);
52         WERR_TALLOC_CHECK(b_state);
53
54         b_state->sam_ctx = samdb_connect(b_state);
55         if (!b_state->sam_ctx) {
56                 talloc_free(b_state);
57                 return WERR_FOOBAR;
58         }
59
60         handle = dcesrv_handle_new(dce_call->conn, DRSUAPI_BIND_HANDLE);
61         if (!handle) {
62                 talloc_free(b_state);
63                 return WERR_NOMEM;
64         }
65
66         handle->data = b_state;
67         handle->destroy = drsuapi_handle_destroy;
68
69         bind_info = talloc_p(mem_ctx, struct drsuapi_DsBindInfo);
70         WERR_TALLOC_CHECK(bind_info);
71         
72         bind_info->length = sizeof(bind_info_data);
73         bind_info->data = talloc_memdup(mem_ctx, bind_info_data, sizeof(bind_info_data));
74         WERR_TALLOC_CHECK(bind_info->data);
75
76         r->out.bind_info = bind_info;
77         *r->out.bind_handle = handle->wire_handle;
78
79         return WERR_OK;
80 }
81
82
83 /* 
84   drsuapi_DsUnbind 
85 */
86 static WERROR drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
87                        struct drsuapi_DsUnbind *r)
88 {
89         struct dcesrv_handle *h;
90
91         *r->out.bind_handle = *r->in.bind_handle;
92
93         DCESRV_PULL_HANDLE_WERR(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE);
94
95         /* this causes the callback drsuapi_handle_destroy() to be called by
96            the handle destroy code which destroys the state associated
97            with the handle */
98         dcesrv_handle_destroy(dce_call->conn, h);
99
100         ZERO_STRUCTP(r->out.bind_handle);
101
102         return WERR_OK;
103 }
104
105
106 /* 
107   drsuapi_DsReplicaSync 
108 */
109 static WERROR drsuapi_DsReplicaSync(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
110                        struct drsuapi_DsReplicaSync *r)
111 {
112         /* TODO: implment this call correct!
113          *       for now we just say yes
114          */
115         return WERR_OK;
116 }
117
118
119 /* 
120   DRSUAPI_GET_NC_CHANGES 
121 */
122 static WERROR DRSUAPI_GET_NC_CHANGES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
123                        struct DRSUAPI_GET_NC_CHANGES *r)
124 {
125         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
126 }
127
128
129 /* 
130   DRSUAPI_UPDATE_REFS 
131 */
132 static WERROR DRSUAPI_UPDATE_REFS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
133                        struct DRSUAPI_UPDATE_REFS *r)
134 {
135         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
136 }
137
138
139 /* 
140   DRSUAPI_REPLICA_ADD 
141 */
142 static WERROR DRSUAPI_REPLICA_ADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
143                        struct DRSUAPI_REPLICA_ADD *r)
144 {
145         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
146 }
147
148
149 /* 
150   DRSUAPI_REPLICA_DEL 
151 */
152 static WERROR DRSUAPI_REPLICA_DEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
153                        struct DRSUAPI_REPLICA_DEL *r)
154 {
155         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
156 }
157
158
159 /* 
160   DRSUAPI_REPLICA_MODIFY 
161 */
162 static WERROR DRSUAPI_REPLICA_MODIFY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
163                        struct DRSUAPI_REPLICA_MODIFY *r)
164 {
165         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
166 }
167
168
169 /* 
170   DRSUAPI_VERIFY_NAMES 
171 */
172 static WERROR DRSUAPI_VERIFY_NAMES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
173                        struct DRSUAPI_VERIFY_NAMES *r)
174 {
175         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
176 }
177
178
179 /* 
180   DRSUAPI_GET_MEMBERSHIPS 
181 */
182 static WERROR DRSUAPI_GET_MEMBERSHIPS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
183                        struct DRSUAPI_GET_MEMBERSHIPS *r)
184 {
185         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
186 }
187
188
189 /* 
190   DRSUAPI_INTER_DOMAIN_MOVE 
191 */
192 static WERROR DRSUAPI_INTER_DOMAIN_MOVE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
193                        struct DRSUAPI_INTER_DOMAIN_MOVE *r)
194 {
195         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
196 }
197
198
199 /* 
200   DRSUAPI_GET_NT4_CHANGELOG 
201 */
202 static WERROR DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
203                        struct DRSUAPI_GET_NT4_CHANGELOG *r)
204 {
205         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
206 }
207
208
209 /* 
210   drsuapi_DsCrackNames => drsuapip_cracknames.c
211 */
212 static WERROR (*drsuapi_DsCrackNames)(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
213                        struct drsuapi_DsCrackNames *r) = dcesrv_drsuapi_DsCrackNames;
214
215 /* 
216   drsuapi_DsWriteAccountSpn 
217 */
218 static WERROR drsuapi_DsWriteAccountSpn(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
219                        struct drsuapi_DsWriteAccountSpn *r)
220 {
221         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
222 }
223
224
225 /* 
226   DRSUAPI_REMOVE_DS_SERVER 
227 */
228 static WERROR DRSUAPI_REMOVE_DS_SERVER(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
229                        struct DRSUAPI_REMOVE_DS_SERVER *r)
230 {
231         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
232 }
233
234
235 /* 
236   DRSUAPI_REMOVE_DS_DOMAIN 
237 */
238 static WERROR DRSUAPI_REMOVE_DS_DOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
239                        struct DRSUAPI_REMOVE_DS_DOMAIN *r)
240 {
241         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
242 }
243
244
245 /* 
246   drsuapi_DsGetDomainControllerInfo 
247 */
248 static WERROR drsuapi_DsGetDomainControllerInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
249                        struct drsuapi_DsGetDomainControllerInfo *r)
250 {
251         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
252 }
253
254
255 /* 
256   DRSUAPI_ADD_ENTRY 
257 */
258 static WERROR DRSUAPI_ADD_ENTRY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
259                        struct DRSUAPI_ADD_ENTRY *r)
260 {
261         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
262 }
263
264
265 /* 
266   DRSUAPI_EXECUTE_KCC 
267 */
268 static WERROR DRSUAPI_EXECUTE_KCC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
269                        struct DRSUAPI_EXECUTE_KCC *r)
270 {
271         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
272 }
273
274
275 /* 
276   drsuapi_DsReplicaGetInfo 
277 */
278 static WERROR drsuapi_DsReplicaGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
279                        struct drsuapi_DsReplicaGetInfo *r)
280 {
281         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
282 }
283
284
285 /* 
286   DRSUAPI_ADD_SID_HISTORY 
287 */
288 static WERROR DRSUAPI_ADD_SID_HISTORY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
289                        struct DRSUAPI_ADD_SID_HISTORY *r)
290 {
291         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
292 }
293
294
295 /* 
296   DRSUAPI_GET_MEMBERSHIPS2 
297 */
298 static WERROR DRSUAPI_GET_MEMBERSHIPS2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
299                        struct DRSUAPI_GET_MEMBERSHIPS2 *r)
300 {
301         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
302 }
303
304
305 /* 
306   DRSUAPI_REPLICA_VERIFY_OBJECTS 
307 */
308 static WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
309                        struct DRSUAPI_REPLICA_VERIFY_OBJECTS *r)
310 {
311         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
312 }
313
314
315 /* 
316   DRSUAPI_GET_OBJECT_EXISTENCE 
317 */
318 static WERROR DRSUAPI_GET_OBJECT_EXISTENCE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
319                        struct DRSUAPI_GET_OBJECT_EXISTENCE *r)
320 {
321         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
322 }
323
324
325 /* 
326   DRSUAPI_QUERY_SITES_BY_COST 
327 */
328 static WERROR DRSUAPI_QUERY_SITES_BY_COST(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
329                        struct DRSUAPI_QUERY_SITES_BY_COST *r)
330 {
331         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
332 }
333
334
335 /* include the generated boilerplate */
336 #include "librpc/gen_ndr/ndr_drsuapi_s.c"