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