r10810: This adds the hooks required to communicate the current user from the
[nivanova/samba-autobuild/.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 #include "auth/auth.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 => drsuapip_cracknames.c
205 */
206 static WERROR (*drsuapi_DsCrackNames)(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
207                        struct drsuapi_DsCrackNames *r) = dcesrv_drsuapi_DsCrackNames;
208
209 /* 
210   drsuapi_DsWriteAccountSpn 
211 */
212 static WERROR drsuapi_DsWriteAccountSpn(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
213                        struct drsuapi_DsWriteAccountSpn *r)
214 {
215         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
216 }
217
218
219 /* 
220   DRSUAPI_REMOVE_DS_SERVER 
221 */
222 static WERROR DRSUAPI_REMOVE_DS_SERVER(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
223                        struct DRSUAPI_REMOVE_DS_SERVER *r)
224 {
225         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
226 }
227
228
229 /* 
230   DRSUAPI_REMOVE_DS_DOMAIN 
231 */
232 static WERROR DRSUAPI_REMOVE_DS_DOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
233                        struct DRSUAPI_REMOVE_DS_DOMAIN *r)
234 {
235         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
236 }
237
238
239 /* 
240   drsuapi_DsGetDomainControllerInfo 
241 */
242 static WERROR drsuapi_DsGetDomainControllerInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
243                                                 struct drsuapi_DsGetDomainControllerInfo *r)
244 {
245         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
246 }
247
248
249 /* 
250   drsuapi_DsAddEntry
251 */
252 static WERROR drsuapi_DsAddEntry(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
253                        struct drsuapi_DsAddEntry *r)
254 {
255         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
256 }
257
258
259 /* 
260   DRSUAPI_EXECUTE_KCC 
261 */
262 static WERROR DRSUAPI_EXECUTE_KCC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
263                        struct DRSUAPI_EXECUTE_KCC *r)
264 {
265         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
266 }
267
268
269 /* 
270   drsuapi_DsReplicaGetInfo 
271 */
272 static WERROR drsuapi_DsReplicaGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
273                        struct drsuapi_DsReplicaGetInfo *r)
274 {
275         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
276 }
277
278
279 /* 
280   DRSUAPI_ADD_SID_HISTORY 
281 */
282 static WERROR DRSUAPI_ADD_SID_HISTORY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
283                        struct DRSUAPI_ADD_SID_HISTORY *r)
284 {
285         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
286 }
287
288
289 /* 
290   DRSUAPI_GET_MEMBERSHIPS2 
291 */
292 static WERROR DRSUAPI_GET_MEMBERSHIPS2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
293                        struct DRSUAPI_GET_MEMBERSHIPS2 *r)
294 {
295         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
296 }
297
298
299 /* 
300   DRSUAPI_REPLICA_VERIFY_OBJECTS 
301 */
302 static WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
303                        struct DRSUAPI_REPLICA_VERIFY_OBJECTS *r)
304 {
305         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
306 }
307
308
309 /* 
310   DRSUAPI_GET_OBJECT_EXISTENCE 
311 */
312 static WERROR DRSUAPI_GET_OBJECT_EXISTENCE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
313                        struct DRSUAPI_GET_OBJECT_EXISTENCE *r)
314 {
315         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
316 }
317
318
319 /* 
320   DRSUAPI_QUERY_SITES_BY_COST 
321 */
322 static WERROR DRSUAPI_QUERY_SITES_BY_COST(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
323                        struct DRSUAPI_QUERY_SITES_BY_COST *r)
324 {
325         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
326 }
327
328
329 /* include the generated boilerplate */
330 #include "librpc/gen_ndr/ndr_drsuapi_s.c"