r11366: Pass around the flags which indicate if we should support plaintext
[samba.git] / source4 / rpc_server / netlogon / dcerpc_netlogon.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    endpoint server for the netlogon pipe
5
6    Copyright (C) Andrew Bartlett <abartlet@samba.org> 2004
7    Copyright (C) Stefan Metzmacher <metze@samba.org>  2005
8    
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 2 of the License, or
12    (at your option) any later version.
13    
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18    
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24 #include "includes.h"
25 #include "librpc/gen_ndr/ndr_netlogon.h"
26 #include "rpc_server/dcerpc_server.h"
27 #include "rpc_server/common/common.h"
28 #include "librpc/gen_ndr/ndr_dcom.h"
29 #include "lib/ldb/include/ldb.h"
30 #include "auth/auth.h"
31
32 struct server_pipe_state {
33         struct netr_Credential client_challenge;
34         struct netr_Credential server_challenge;
35         struct creds_CredentialState *creds;
36 };
37
38
39 /*
40   a client has connected to the netlogon server using schannel, so we need
41   to re-establish the credentials state
42 */
43 static NTSTATUS netlogon_schannel_setup(struct dcesrv_call_state *dce_call) 
44 {
45         struct server_pipe_state *state;
46         NTSTATUS status;
47
48         /* We want the client and server challenge zero */
49         state = talloc_zero(dce_call->conn, struct server_pipe_state);
50         if (state == NULL) {
51                 return NT_STATUS_NO_MEMORY;
52         }
53         
54         status = dcerpc_schannel_creds(dce_call->conn->auth_state.gensec_security, 
55                                        state, 
56                                        &state->creds);
57
58         if (!NT_STATUS_IS_OK(status)) {
59                 DEBUG(3, ("getting schannel credentials failed with %s\n", nt_errstr(status)));
60                 talloc_free(state);
61                 return status;
62         }
63         
64         dce_call->context->private = state;
65
66         return NT_STATUS_OK;
67 }
68
69 /*
70   a hook for bind on the netlogon pipe
71 */
72 static NTSTATUS netlogon_bind(struct dcesrv_call_state *dce_call, const struct dcesrv_interface *di) 
73 {
74         dce_call->context->private = NULL;
75
76         /* if this is a schannel bind then we need to reconstruct the pipe state */
77         if (dce_call->conn->auth_state.auth_info &&
78             dce_call->conn->auth_state.auth_info->auth_type == DCERPC_AUTH_TYPE_SCHANNEL) {
79                 NTSTATUS status;
80
81                 DEBUG(5, ("schannel bind on netlogon\n"));
82
83                 status = netlogon_schannel_setup(dce_call);
84                 if (!NT_STATUS_IS_OK(status)) {
85                         DEBUG(3, ("schannel bind on netlogon failed with %s\n", nt_errstr(status)));
86                         return status;
87                 }
88         }
89
90         return NT_STATUS_OK;
91 }
92
93 #define DCESRV_INTERFACE_NETLOGON_BIND netlogon_bind
94
95 static NTSTATUS netr_ServerReqChallenge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
96                                         struct netr_ServerReqChallenge *r)
97 {
98         struct server_pipe_state *pipe_state = dce_call->context->private;
99
100         ZERO_STRUCTP(r->out.credentials);
101
102         /* destroyed on pipe shutdown */
103
104         if (pipe_state) {
105                 talloc_free(pipe_state);
106                 dce_call->context->private = NULL;
107         }
108         
109         pipe_state = talloc(dce_call->context, struct server_pipe_state);
110         if (!pipe_state) {
111                 return NT_STATUS_NO_MEMORY;
112         }
113
114         pipe_state->creds = NULL;
115
116         pipe_state->client_challenge = *r->in.credentials;
117
118         generate_random_buffer(pipe_state->server_challenge.data, 
119                                sizeof(pipe_state->server_challenge.data));
120
121         *r->out.credentials = pipe_state->server_challenge;
122
123         dce_call->context->private = pipe_state;
124
125         return NT_STATUS_OK;
126 }
127
128 static NTSTATUS netr_ServerAuthenticate3(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
129                                          struct netr_ServerAuthenticate3 *r)
130 {
131         struct server_pipe_state *pipe_state = dce_call->context->private;
132         void *sam_ctx;
133         struct samr_Password *mach_pwd;
134         uint16_t acct_flags;
135         int num_records;
136         struct ldb_message **msgs;
137         NTSTATUS nt_status;
138         const char *attrs[] = {"unicodePwd", "lmPwdHash", "ntPwdHash", "userAccountControl", 
139                                "objectSid", NULL};
140
141         ZERO_STRUCTP(r->out.credentials);
142         *r->out.rid = 0;
143         *r->out.negotiate_flags = *r->in.negotiate_flags;
144
145         if (!pipe_state) {
146                 DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
147                 return NT_STATUS_ACCESS_DENIED;
148         }
149
150         sam_ctx = samdb_connect(mem_ctx, system_session(mem_ctx));
151         if (sam_ctx == NULL) {
152                 return NT_STATUS_INVALID_SYSTEM_SERVICE;
153         }
154         /* pull the user attributes */
155         num_records = gendb_search(sam_ctx, mem_ctx, NULL, &msgs, attrs,
156                                    "(&(sAMAccountName=%s)(objectclass=user))", 
157                                    r->in.account_name);
158
159         if (num_records == 0) {
160                 DEBUG(3,("Couldn't find user [%s] in samdb.\n", 
161                          r->in.account_name));
162                 return NT_STATUS_ACCESS_DENIED;
163         }
164
165         if (num_records > 1) {
166                 DEBUG(0,("Found %d records matching user [%s]\n", num_records, r->in.account_name));
167                 return NT_STATUS_INTERNAL_DB_CORRUPTION;
168         }
169
170         acct_flags = samdb_result_acct_flags(msgs[0], 
171                                              "userAccountControl");
172
173         if (acct_flags & ACB_DISABLED) {
174                 DEBUG(1, ("Account [%s] is disabled\n", r->in.account_name));
175                 return NT_STATUS_ACCESS_DENIED;
176         }
177
178         if (r->in.secure_channel_type == SEC_CHAN_WKSTA) {
179                 if (!(acct_flags & ACB_WSTRUST)) {
180                         DEBUG(1, ("Client asked for a workstation secure channel, but is not a workstation (member server) acb flags: 0x%x\n", acct_flags));
181                         return NT_STATUS_ACCESS_DENIED;
182                 }
183         } else if (r->in.secure_channel_type == SEC_CHAN_DOMAIN) {
184                 if (!(acct_flags & ACB_DOMTRUST)) {
185                         DEBUG(1, ("Client asked for a trusted domain secure channel, but is not a trusted domain: acb flags: 0x%x\n", acct_flags));
186                         return NT_STATUS_ACCESS_DENIED;
187                 }
188         } else if (r->in.secure_channel_type == SEC_CHAN_BDC) {
189                 if (!(acct_flags & ACB_SVRTRUST)) {
190                         DEBUG(1, ("Client asked for a server secure channel, but is not a server (domain controller): acb flags: 0x%x\n", acct_flags));
191                         return NT_STATUS_ACCESS_DENIED;
192                 }
193         } else {
194                 DEBUG(1, ("Client asked for an invalid secure channel type: %d\n", 
195                           r->in.secure_channel_type));
196                 return NT_STATUS_ACCESS_DENIED;
197         }
198
199
200         *r->out.rid = samdb_result_rid_from_sid(mem_ctx, msgs[0], "objectSid", 0);
201
202         nt_status = samdb_result_passwords(mem_ctx, msgs[0], NULL, &mach_pwd);
203         if (!NT_STATUS_IS_OK(nt_status) || mach_pwd == NULL) {
204                 return NT_STATUS_ACCESS_DENIED;
205         }
206
207         if (pipe_state->creds) {
208                 talloc_free(pipe_state->creds);
209         }
210         pipe_state->creds = talloc(pipe_state, struct creds_CredentialState);
211         if (!pipe_state->creds) {
212                 return NT_STATUS_NO_MEMORY;
213         }
214
215         creds_server_init(pipe_state->creds, &pipe_state->client_challenge, 
216                           &pipe_state->server_challenge, mach_pwd,
217                           r->out.credentials,
218                           *r->in.negotiate_flags);
219         
220         if (!creds_server_check(pipe_state->creds, r->in.credentials)) {
221                 talloc_free(pipe_state->creds);
222                 pipe_state->creds = NULL;
223                 return NT_STATUS_ACCESS_DENIED;
224         }
225
226         pipe_state->creds->account_name = talloc_steal(pipe_state->creds, r->in.account_name);
227         
228         pipe_state->creds->computer_name = talloc_steal(pipe_state->creds, r->in.computer_name);
229
230         pipe_state->creds->secure_channel_type = r->in.secure_channel_type;
231
232         pipe_state->creds->sid = samdb_result_dom_sid(pipe_state->creds, msgs[0], "objectSid");
233
234         pipe_state->creds->domain = talloc_strdup(pipe_state->creds, lp_workgroup());
235
236         /* remember this session key state */
237         nt_status = schannel_store_session_key(mem_ctx, pipe_state->creds);
238
239         return nt_status;
240 }
241                                                  
242 static NTSTATUS netr_ServerAuthenticate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
243                                         struct netr_ServerAuthenticate *r)
244 {
245         struct netr_ServerAuthenticate3 r3;
246         uint32_t rid = 0;
247         /* TODO: 
248          * negotiate_flags is used as an [in] parameter
249          * so it need to be initialised.
250          *
251          * (I think ... = 0; seems wrong here --metze)
252          */
253         uint32_t negotiate_flags = 0;  
254
255         r3.in.server_name = r->in.server_name;
256         r3.in.account_name = r->in.account_name;
257         r3.in.secure_channel_type = r->in.secure_channel_type;
258         r3.in.computer_name = r->in.computer_name;
259         r3.in.credentials = r->in.credentials;
260         r3.out.credentials = r->out.credentials;
261         r3.in.negotiate_flags = &negotiate_flags;
262         r3.out.negotiate_flags = &negotiate_flags;
263         r3.out.rid = &rid;
264         
265         return netr_ServerAuthenticate3(dce_call, mem_ctx, &r3);
266 }
267
268 static NTSTATUS netr_ServerAuthenticate2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
269                                          struct netr_ServerAuthenticate2 *r)
270 {
271         struct netr_ServerAuthenticate3 r3;
272         uint32_t rid = 0;
273
274         r3.in.server_name = r->in.server_name;
275         r3.in.account_name = r->in.account_name;
276         r3.in.secure_channel_type = r->in.secure_channel_type;
277         r3.in.computer_name = r->in.computer_name;
278         r3.in.credentials = r->in.credentials;
279         r3.out.credentials = r->out.credentials;
280         r3.in.negotiate_flags = r->in.negotiate_flags;
281         r3.out.negotiate_flags = r->out.negotiate_flags;
282         r3.out.rid = &rid;
283         
284         return netr_ServerAuthenticate3(dce_call, mem_ctx, &r3);
285 }
286
287
288 static NTSTATUS netr_creds_server_step_check(struct server_pipe_state *pipe_state,
289                                              struct netr_Authenticator *received_authenticator,
290                                              struct netr_Authenticator *return_authenticator) 
291 {
292         if (!pipe_state) {
293                 DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
294                 return NT_STATUS_ACCESS_DENIED;
295         }
296
297         return creds_server_step_check(pipe_state->creds, 
298                                        received_authenticator, 
299                                        return_authenticator);
300 }
301
302
303 static NTSTATUS netr_ServerPasswordSet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
304                                        struct netr_ServerPasswordSet *r)
305 {
306         struct server_pipe_state *pipe_state = dce_call->context->private;
307
308         struct ldb_context *sam_ctx;
309         NTSTATUS nt_status;
310
311         nt_status = netr_creds_server_step_check(pipe_state, &r->in.credential, &r->out.return_authenticator);
312         NT_STATUS_NOT_OK_RETURN(nt_status);
313
314         sam_ctx = samdb_connect(mem_ctx, system_session(mem_ctx));
315         if (sam_ctx == NULL) {
316                 return NT_STATUS_INVALID_SYSTEM_SERVICE;
317         }
318
319         creds_des_decrypt(pipe_state->creds, &r->in.new_password);
320
321         /* Using the sid for the account as the key, set the password */
322         nt_status = samdb_set_password_sid(sam_ctx, mem_ctx, 
323                                            pipe_state->creds->sid,
324                                            NULL, /* Don't have plaintext */
325                                            NULL, &r->in.new_password,
326                                            False, /* This is not considered a password change */
327                                            False, /* don't restrict this password change (match w2k3) */
328                                            NULL, NULL);
329         return nt_status;
330 }
331
332
333 /* 
334   netr_LogonUasLogon 
335 */
336 static WERROR netr_LogonUasLogon(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
337                                  struct netr_LogonUasLogon *r)
338 {
339         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
340 }
341
342
343 /* 
344   netr_LogonUasLogoff 
345 */
346 static WERROR netr_LogonUasLogoff(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
347                        struct netr_LogonUasLogoff *r)
348 {
349         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
350 }
351
352
353 /* 
354   netr_LogonSamLogonEx
355
356   This version of the function allows other wrappers to say 'do not check the credentials'
357 */
358 static NTSTATUS netr_LogonSamLogonEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
359                                      struct netr_LogonSamLogonEx *r)
360 {
361         struct server_pipe_state *pipe_state = dce_call->context->private;
362
363         struct auth_context *auth_context;
364         struct auth_usersupplied_info *user_info;
365         struct auth_serversupplied_info *server_info;
366         NTSTATUS nt_status;
367         static const char zeros[16];
368         struct netr_SamBaseInfo *sam;
369         struct netr_SamInfo2 *sam2;
370         struct netr_SamInfo3 *sam3;
371         struct netr_SamInfo6 *sam6;
372         
373         user_info = talloc(mem_ctx, struct auth_usersupplied_info);
374         if (!user_info) {
375                 return NT_STATUS_NO_MEMORY;
376         }
377
378         user_info->flags = 0;
379         user_info->mapped_state = False;
380         user_info->remote_host = NULL;
381
382         switch (r->in.logon_level) {
383         case 1:
384         case 3:
385         case 5:
386                 if (pipe_state->creds->negotiate_flags & NETLOGON_NEG_ARCFOUR) {
387                         creds_arcfour_crypt(pipe_state->creds, 
388                                             r->in.logon.password->lmpassword.hash, 
389                                             sizeof(r->in.logon.password->lmpassword.hash));
390                         creds_arcfour_crypt(pipe_state->creds, 
391                                             r->in.logon.password->ntpassword.hash, 
392                                             sizeof(r->in.logon.password->ntpassword.hash));
393                 } else {
394                         creds_des_decrypt(pipe_state->creds, &r->in.logon.password->lmpassword);
395                         creds_des_decrypt(pipe_state->creds, &r->in.logon.password->ntpassword);
396                 }
397
398                 /* TODO: we need to deny anonymous access here */
399                 nt_status = auth_context_create(mem_ctx, lp_auth_methods(), &auth_context,
400                                                 dce_call->event_ctx);
401                 NT_STATUS_NOT_OK_RETURN(nt_status);
402
403                 user_info->logon_parameters = r->in.logon.password->identity_info.parameter_control;
404                 user_info->client.account_name = r->in.logon.password->identity_info.account_name.string;
405                 user_info->client.domain_name = r->in.logon.password->identity_info.domain_name.string;
406                 user_info->workstation_name = r->in.logon.password->identity_info.workstation.string;
407                 
408                 user_info->password_state = AUTH_PASSWORD_HASH;
409                 user_info->password.hash.lanman = talloc(user_info, struct samr_Password);
410                 if (!user_info->password.hash.lanman) {
411                         return NT_STATUS_NO_MEMORY;
412                 }
413                 *user_info->password.hash.lanman = r->in.logon.password->lmpassword;
414
415                 user_info->password.hash.nt = talloc(user_info, struct samr_Password);
416                 if (!user_info->password.hash.nt) {
417                         return NT_STATUS_NO_MEMORY;
418                 }
419                 *user_info->password.hash.nt = r->in.logon.password->ntpassword;
420                 break;          
421         case 2:
422         case 6:
423
424                 /* TODO: we need to deny anonymous access here */
425                 nt_status = auth_context_create(mem_ctx, lp_auth_methods(), &auth_context,
426                                                 dce_call->event_ctx);
427                 NT_STATUS_NOT_OK_RETURN(nt_status);
428
429                 nt_status = auth_context_set_challenge(auth_context, r->in.logon.network->challenge, "netr_LogonSamLogonWithFlags");
430                 NT_STATUS_NOT_OK_RETURN(nt_status);
431
432                 user_info->logon_parameters = r->in.logon.network->identity_info.parameter_control;
433                 user_info->client.account_name = r->in.logon.network->identity_info.account_name.string;
434                 user_info->client.domain_name = r->in.logon.network->identity_info.domain_name.string;
435                 user_info->workstation_name = r->in.logon.network->identity_info.workstation.string;
436                 
437                 user_info->password_state = AUTH_PASSWORD_RESPONSE;
438                 user_info->password.response.lanman = data_blob(r->in.logon.network->lm.data, r->in.logon.network->lm.length);
439                 user_info->password.response.nt = data_blob(r->in.logon.network->nt.data, r->in.logon.network->nt.length);
440         
441                 break;
442         default:
443                 return NT_STATUS_INVALID_PARAMETER;
444         }
445         
446         nt_status = auth_check_password(auth_context, mem_ctx, user_info, &server_info);
447         NT_STATUS_NOT_OK_RETURN(nt_status);
448
449         nt_status = auth_convert_server_info_sambaseinfo(mem_ctx, server_info, &sam);
450
451         NT_STATUS_NOT_OK_RETURN(nt_status);
452
453         /* Don't crypt an all-zero key, it would give away the NETLOGON pipe session key */
454         /* It appears that level 6 is not individually encrypted */
455         if ((r->in.validation_level != 6) 
456             && memcmp(sam->key.key, zeros,  
457                       sizeof(sam->key.key)) != 0) {
458
459                 /* This key is sent unencrypted without the ARCFOUR flag set */
460                 if (pipe_state->creds->negotiate_flags & NETLOGON_NEG_ARCFOUR) {
461                         creds_arcfour_crypt(pipe_state->creds, 
462                                             sam->key.key, 
463                                             sizeof(sam->key.key));
464                 }
465         }
466
467         /* Don't crypt an all-zero key, it would give away the NETLOGON pipe session key */
468         /* It appears that level 6 is not individually encrypted */
469         if ((r->in.validation_level != 6) 
470             && memcmp(sam->LMSessKey.key, zeros,  
471                       sizeof(sam->LMSessKey.key)) != 0) {
472                 if (pipe_state->creds->negotiate_flags & NETLOGON_NEG_ARCFOUR) {
473                         creds_arcfour_crypt(pipe_state->creds, 
474                                             sam->LMSessKey.key, 
475                                             sizeof(sam->LMSessKey.key));
476                 } else {
477                         creds_des_encrypt_LMKey(pipe_state->creds, 
478                                                 &sam->LMSessKey);
479                 }
480         }
481
482         switch (r->in.validation_level) {
483         case 2:
484                 sam2 = talloc_zero(mem_ctx, struct netr_SamInfo2);
485                 NT_STATUS_HAVE_NO_MEMORY(sam2);
486                 sam2->base = *sam;
487                 r->out.validation.sam2 = sam2;
488                 break;
489
490         case 3:
491                 sam3 = talloc_zero(mem_ctx, struct netr_SamInfo3);
492                 NT_STATUS_HAVE_NO_MEMORY(sam3);
493                 sam3->base = *sam;
494                 r->out.validation.sam3 = sam3;
495                 break;
496
497         case 6:
498                 sam6 = talloc_zero(mem_ctx, struct netr_SamInfo6);
499                 NT_STATUS_HAVE_NO_MEMORY(sam6);
500                 sam6->base = *sam;
501                 sam6->forest.string = lp_realm();
502                 sam6->principle.string = talloc_asprintf(mem_ctx, "%s@%s", 
503                                                          sam->account_name.string, sam6->forest.string);
504                 NT_STATUS_HAVE_NO_MEMORY(sam6->principle.string);
505                 r->out.validation.sam6 = sam6;
506                 break;
507
508         default:
509                 break;
510         }
511
512         r->out.authoritative = 1;
513
514         /* TODO: Describe and deal with these flags */
515         r->out.flags = 0;
516
517         return NT_STATUS_OK;
518 }
519
520 /* 
521   netr_LogonSamLogonWithFlags
522
523 */
524 static NTSTATUS netr_LogonSamLogonWithFlags(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
525                                             struct netr_LogonSamLogonWithFlags *r)
526 {
527         struct server_pipe_state *pipe_state = dce_call->context->private;
528         NTSTATUS nt_status;
529         struct netr_LogonSamLogonEx r2;
530
531         struct netr_Authenticator *return_authenticator;
532
533         return_authenticator = talloc(mem_ctx, struct netr_Authenticator);
534         NT_STATUS_HAVE_NO_MEMORY(return_authenticator);
535
536         nt_status = netr_creds_server_step_check(pipe_state, r->in.credential, return_authenticator);
537         NT_STATUS_NOT_OK_RETURN(nt_status);
538
539         ZERO_STRUCT(r2);
540
541         r2.in.server_name       = r->in.server_name;
542         r2.in.workstation       = r->in.workstation;
543         r2.in.logon_level       = r->in.logon_level;
544         r2.in.logon             = r->in.logon;
545         r2.in.validation_level  = r->in.validation_level;
546         r2.in.flags             = r->in.flags;
547
548         nt_status = netr_LogonSamLogonEx(dce_call, mem_ctx, &r2);
549
550         r->out.return_authenticator     = return_authenticator;
551         r->out.validation               = r2.out.validation;
552         r->out.authoritative            = r2.out.authoritative;
553         r->out.flags                    = r2.out.flags;
554
555         return nt_status;
556 }
557
558 /* 
559   netr_LogonSamLogon
560 */
561 static NTSTATUS netr_LogonSamLogon(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
562                                    struct netr_LogonSamLogon *r)
563 {
564         struct netr_LogonSamLogonWithFlags r2;
565         NTSTATUS status;
566
567         ZERO_STRUCT(r2);
568
569         r2.in.server_name = r->in.server_name;
570         r2.in.workstation = r->in.workstation;
571         r2.in.credential  = r->in.credential;
572         r2.in.return_authenticator = r->in.return_authenticator;
573         r2.in.logon_level = r->in.logon_level;
574         r2.in.logon = r->in.logon;
575         r2.in.validation_level = r->in.validation_level;
576         r2.in.flags = 0;
577
578         status = netr_LogonSamLogonWithFlags(dce_call, mem_ctx, &r2);
579
580         r->out.return_authenticator = r2.out.return_authenticator;
581         r->out.validation = r2.out.validation;
582         r->out.authoritative = r2.out.authoritative;
583
584         return status;
585 }
586
587
588 /* 
589   netr_LogonSamLogoff 
590 */
591 static NTSTATUS netr_LogonSamLogoff(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
592                        struct netr_LogonSamLogoff *r)
593 {
594         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
595 }
596
597
598
599 /* 
600   netr_DatabaseDeltas 
601 */
602 static NTSTATUS netr_DatabaseDeltas(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
603                        struct netr_DatabaseDeltas *r)
604 {
605         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
606 }
607
608
609 /* 
610   netr_DatabaseSync 
611 */
612 static NTSTATUS netr_DatabaseSync(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
613                        struct netr_DatabaseSync *r)
614 {
615         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
616 }
617
618
619 /* 
620   netr_AccountDeltas 
621 */
622 static NTSTATUS netr_AccountDeltas(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
623                        struct netr_AccountDeltas *r)
624 {
625         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
626 }
627
628
629 /* 
630   netr_AccountSync 
631 */
632 static NTSTATUS netr_AccountSync(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
633                        struct netr_AccountSync *r)
634 {
635         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
636 }
637
638
639 /* 
640   netr_GetDcName 
641 */
642 static NTSTATUS netr_GetDcName(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
643                        struct netr_GetDcName *r)
644 {
645         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
646 }
647
648
649 /* 
650   netr_LogonControl 
651 */
652 static WERROR netr_LogonControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
653                        struct netr_LogonControl *r)
654 {
655         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
656 }
657
658
659 /* 
660   netr_GetAnyDCName 
661 */
662 static WERROR netr_GetAnyDCName(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
663                        struct netr_GetAnyDCName *r)
664 {
665         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
666 }
667
668
669 /* 
670   netr_LogonControl2 
671 */
672 static WERROR netr_LogonControl2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
673                        struct netr_LogonControl2 *r)
674 {
675         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
676 }
677
678
679 /* 
680   netr_DatabaseSync2 
681 */
682 static NTSTATUS netr_DatabaseSync2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
683                        struct netr_DatabaseSync2 *r)
684 {
685         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
686 }
687
688
689 /* 
690   netr_DatabaseRedo 
691 */
692 static NTSTATUS netr_DatabaseRedo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
693                        struct netr_DatabaseRedo *r)
694 {
695         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
696 }
697
698
699 /* 
700   netr_LogonControl2Ex 
701 */
702 static WERROR netr_LogonControl2Ex(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
703                        struct netr_LogonControl2Ex *r)
704 {
705         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
706 }
707
708
709 /* 
710   netr_NETRENUMERATETRUSTEDDOMAINS 
711 */
712 static WERROR netr_NETRENUMERATETRUSTEDDOMAINS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
713                        struct netr_NETRENUMERATETRUSTEDDOMAINS *r)
714 {
715         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
716 }
717
718
719 /* 
720   netr_DSRGETDCNAME 
721 */
722 static WERROR netr_DSRGETDCNAME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
723                        struct netr_DSRGETDCNAME *r)
724 {
725         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
726 }
727
728
729 /* 
730   netr_NETRLOGONDUMMYROUTINE1 
731 */
732 static WERROR netr_NETRLOGONDUMMYROUTINE1(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
733                        struct netr_NETRLOGONDUMMYROUTINE1 *r)
734 {
735         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
736 }
737
738
739 /* 
740   netr_NETRLOGONSETSERVICEBITS 
741 */
742 static WERROR netr_NETRLOGONSETSERVICEBITS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
743                        struct netr_NETRLOGONSETSERVICEBITS *r)
744 {
745         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
746 }
747
748
749 /* 
750   netr_NETRLOGONGETTRUSTRID 
751 */
752 static WERROR netr_NETRLOGONGETTRUSTRID(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
753                        struct netr_NETRLOGONGETTRUSTRID *r)
754 {
755         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
756 }
757
758
759 /* 
760   netr_NETRLOGONCOMPUTESERVERDIGEST 
761 */
762 static WERROR netr_NETRLOGONCOMPUTESERVERDIGEST(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
763                        struct netr_NETRLOGONCOMPUTESERVERDIGEST *r)
764 {
765         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
766 }
767
768
769 /* 
770   netr_NETRLOGONCOMPUTECLIENTDIGEST 
771 */
772 static WERROR netr_NETRLOGONCOMPUTECLIENTDIGEST(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
773                        struct netr_NETRLOGONCOMPUTECLIENTDIGEST *r)
774 {
775         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
776 }
777
778
779 /* 
780   netr_DSRGETDCNAMEX 
781 */
782 static WERROR netr_DSRGETDCNAMEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
783                        struct netr_DSRGETDCNAMEX *r)
784 {
785         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
786 }
787
788
789 /* 
790   netr_DSRGETSITENAME 
791 */
792 static WERROR netr_DSRGETSITENAME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
793                        struct netr_DSRGETSITENAME *r)
794 {
795         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
796 }
797
798
799 /*
800   fill in a netr_DomainTrustInfo from a ldb search result
801 */
802 static NTSTATUS fill_domain_primary_info(TALLOC_CTX *mem_ctx, struct ldb_message *res,
803                                          struct netr_DomainTrustInfo *info, 
804                                          const char *local_domain)
805 {
806         ZERO_STRUCTP(info);
807
808         info->domainname.string = local_domain;
809         info->fulldomainname.string = talloc_asprintf(info, "%s.", samdb_result_string(res, "dnsDomain", NULL));
810         /* TODO: we need proper forest support */
811         info->forest.string = info->fulldomainname.string;
812         info->guid = samdb_result_guid(res, "objectGUID");
813         info->sid = samdb_result_dom_sid(mem_ctx, res, "objectSid");
814
815         return NT_STATUS_OK;
816 }
817
818 /*
819   fill in a netr_DomainTrustInfo from a ldb search result
820 */
821 static NTSTATUS fill_domain_trust_info(TALLOC_CTX *mem_ctx, struct ldb_message *res,
822                                        struct netr_DomainTrustInfo *info, 
823                                        const char *local_domain, BOOL is_local)
824 {
825         ZERO_STRUCTP(info);
826
827         if (is_local) {
828                 info->domainname.string = local_domain;
829                 info->fulldomainname.string = samdb_result_string(res, "dnsDomain", NULL);
830                 info->forest.string = NULL;
831                 info->guid = samdb_result_guid(res, "objectGUID");
832                 info->sid = samdb_result_dom_sid(mem_ctx, res, "objectSid");
833         } else {
834                 info->domainname.string = samdb_result_string(res, "flatName", NULL);
835                 info->fulldomainname.string = samdb_result_string(res, "name", NULL);
836                 info->forest.string = NULL;
837                 info->guid = samdb_result_guid(res, "objectGUID");
838                 info->sid = samdb_result_dom_sid(mem_ctx, res, "securityIdentifier");
839         }
840
841         return NT_STATUS_OK;
842 }
843
844 /* 
845   netr_LogonGetDomainInfo
846   this is called as part of the ADS domain logon procedure.
847 */
848 static NTSTATUS netr_LogonGetDomainInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
849                                         struct netr_LogonGetDomainInfo *r)
850 {
851         struct server_pipe_state *pipe_state = dce_call->context->private;
852         const char * const attrs[] = { "dnsDomain", "objectSid", 
853                                        "objectGUID", "flatName", "securityIdentifier",
854                                        NULL };
855         const char * const ref_attrs[] = { "nETBIOSName", NULL };
856         struct ldb_context *sam_ctx;
857         struct ldb_message **res1, **res2, **ref_res;
858         struct netr_DomainInfo1 *info1;
859         int ret, ret1, ret2, i;
860         NTSTATUS status;
861
862         const char *local_domain;
863
864         status = netr_creds_server_step_check(pipe_state, 
865                                               r->in.credential, r->out.return_authenticator);
866         if (!NT_STATUS_IS_OK(status)) {
867                 return status;
868         }
869
870         sam_ctx = samdb_connect(mem_ctx, dce_call->conn->auth_state.session_info);
871         if (sam_ctx == NULL) {
872                 return NT_STATUS_INVALID_SYSTEM_SERVICE;
873         }
874
875         /* we need to do two searches. The first will pull our primary
876            domain and the second will pull any trusted domains. Our
877            primary domain is also a "trusted" domain, so we need to
878            put the primary domain into the lists of returned trusts as
879            well */
880         ret1 = gendb_search(sam_ctx, mem_ctx, NULL, &res1, attrs, "(objectClass=domainDNS)");
881         if (ret1 != 1) {
882                 return NT_STATUS_INTERNAL_DB_CORRUPTION;
883         }
884
885         /* try and find the domain */
886         ret = gendb_search(sam_ctx, mem_ctx, NULL, 
887                            &ref_res, ref_attrs, 
888                            "(&(objectClass=crossRef)(ncName=%s))", 
889                            ldb_dn_linearize(mem_ctx, res1[0]->dn));
890         if (ret != 1) {
891                 return NT_STATUS_INTERNAL_DB_CORRUPTION;
892         }
893
894         local_domain = samdb_result_string(ref_res[0], "nETBIOSName", NULL);
895
896         ret2 = gendb_search(sam_ctx, mem_ctx, NULL, &res2, attrs, "(objectClass=trustedDomain)");
897         if (ret2 == -1) {
898                 return NT_STATUS_INTERNAL_DB_CORRUPTION;
899         }
900
901         info1 = talloc(mem_ctx, struct netr_DomainInfo1);
902         if (info1 == NULL) {
903                 return NT_STATUS_NO_MEMORY;
904         }
905
906         ZERO_STRUCTP(info1);
907
908         info1->num_trusts = ret2 + 1;
909         info1->trusts = talloc_array(mem_ctx, struct netr_DomainTrustInfo, 
910                                        info1->num_trusts);
911         if (info1->trusts == NULL) {
912                 return NT_STATUS_NO_MEMORY;
913         }
914
915         status = fill_domain_primary_info(mem_ctx, res1[0], &info1->domaininfo, local_domain);
916         if (!NT_STATUS_IS_OK(status)) {
917                 return status;
918         }
919
920         for (i=0;i<ret2;i++) {
921                 status = fill_domain_trust_info(mem_ctx, res2[i], &info1->trusts[i], NULL, False);
922                 if (!NT_STATUS_IS_OK(status)) {
923                         return status;
924                 }
925         }
926
927         status = fill_domain_trust_info(mem_ctx, res1[0], &info1->trusts[i], local_domain, True);
928         if (!NT_STATUS_IS_OK(status)) {
929                 return status;
930         }
931
932         r->out.info.info1 = info1;
933
934         return NT_STATUS_OK;
935 }
936
937
938 /* 
939   netr_ServerPasswordSet2 
940 */
941 static NTSTATUS netr_ServerPasswordSet2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
942                                        struct netr_ServerPasswordSet2 *r)
943 {
944         struct server_pipe_state *pipe_state = dce_call->context->private;
945
946         struct ldb_context *sam_ctx;
947         NTSTATUS nt_status;
948         char new_pass[512];
949         uint32_t new_pass_len;
950         BOOL ret;
951
952         struct samr_CryptPassword password_buf;
953
954         nt_status = netr_creds_server_step_check(pipe_state, &r->in.credential, &r->out.return_authenticator);
955         NT_STATUS_NOT_OK_RETURN(nt_status);
956
957         sam_ctx = samdb_connect(mem_ctx, system_session(mem_ctx));
958         if (sam_ctx == NULL) {
959                 return NT_STATUS_INVALID_SYSTEM_SERVICE;
960         }
961
962         memcpy(password_buf.data, r->in.new_password.data, 512);
963         SIVAL(password_buf.data,512,r->in.new_password.length);
964         creds_arcfour_crypt(pipe_state->creds, password_buf.data, 516);
965
966         ret = decode_pw_buffer(password_buf.data, new_pass, sizeof(new_pass),
967                                &new_pass_len, STR_UNICODE);
968         if (!ret) {
969                 DEBUG(3,("netr_ServerPasswordSet2: failed to decode password buffer\n"));
970                 return NT_STATUS_ACCESS_DENIED;
971         }
972
973         /* Using the sid for the account as the key, set the password */
974         nt_status = samdb_set_password_sid(sam_ctx, mem_ctx,
975                                            pipe_state->creds->sid,
976                                            new_pass, /* we have plaintext */
977                                            NULL, NULL,
978                                            False, /* This is not considered a password change */
979                                            False, /* don't restrict this password change (match w2k3) */
980                                            NULL, NULL);
981         return nt_status;
982 }
983
984
985 /* 
986   netr_NETRSERVERPASSWORDGET 
987 */
988 static WERROR netr_NETRSERVERPASSWORDGET(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
989                        struct netr_NETRSERVERPASSWORDGET *r)
990 {
991         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
992 }
993
994
995 /* 
996   netr_NETRLOGONSENDTOSAM 
997 */
998 static WERROR netr_NETRLOGONSENDTOSAM(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
999                        struct netr_NETRLOGONSENDTOSAM *r)
1000 {
1001         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1002 }
1003
1004
1005 /* 
1006   netr_DSRADDRESSTOSITENAMESW 
1007 */
1008 static WERROR netr_DSRADDRESSTOSITENAMESW(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1009                        struct netr_DSRADDRESSTOSITENAMESW *r)
1010 {
1011         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1012 }
1013
1014
1015 /* 
1016   netr_DrsGetDCNameEx2
1017 */
1018 static WERROR netr_DrsGetDCNameEx2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1019                        struct netr_DrsGetDCNameEx2 *r)
1020 {
1021         const char * const attrs[] = { "dnsDomain", "objectGUID", NULL };
1022         void *sam_ctx;
1023         struct ldb_message **res;
1024         int ret;
1025
1026         ZERO_STRUCT(r->out);
1027
1028         sam_ctx = samdb_connect(mem_ctx, dce_call->conn->auth_state.session_info);
1029         if (sam_ctx == NULL) {
1030                 return WERR_DS_SERVICE_UNAVAILABLE;
1031         }
1032
1033         ret = gendb_search(sam_ctx, mem_ctx, NULL, &res, attrs,
1034                                 "(&(objectClass=domainDNS)(dnsDomain=%s))",
1035                                 r->in.domain_name);
1036         if (ret != 1) {
1037                 return WERR_NO_SUCH_DOMAIN;
1038         }
1039
1040         r->out.info = talloc(mem_ctx, struct netr_DrsGetDCNameEx2Info);
1041         if (!r->out.info) {
1042                 return WERR_NOMEM;
1043         }
1044
1045         /* TODO: - return real IP address
1046          *       - check all r->in.* parameters (server_unc is ignored by w2k3!)
1047          */
1048         r->out.info->dc_unc             = talloc_asprintf(mem_ctx, "\\\\%s.%s", lp_netbios_name(),lp_realm());
1049         r->out.info->dc_address = talloc_strdup(mem_ctx, "\\\\0.0.0.0");
1050         r->out.info->dc_address_type    = 1;
1051         r->out.info->domain_guid        = samdb_result_guid(res[0], "objectGUID");
1052         r->out.info->domain_name        = samdb_result_string(res[0], "dnsDomain", NULL);
1053         r->out.info->forest_name        = samdb_result_string(res[0], "dnsDomain", NULL);
1054         r->out.info->dc_flags           = 0xE00001FD;
1055         r->out.info->dc_site_name       = talloc_strdup(mem_ctx, "Default-First-Site-Name");
1056         r->out.info->client_site_name   = talloc_strdup(mem_ctx, "Default-First-Site-Name");
1057
1058         return WERR_OK;
1059 }
1060
1061
1062 /* 
1063   netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN 
1064 */
1065 static WERROR netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1066                        struct netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN *r)
1067 {
1068         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1069 }
1070
1071
1072 /* 
1073   netr_NETRENUMERATETRUSTEDDOMAINSEX 
1074 */
1075 static WERROR netr_NETRENUMERATETRUSTEDDOMAINSEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1076                        struct netr_NETRENUMERATETRUSTEDDOMAINSEX *r)
1077 {
1078         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1079 }
1080
1081
1082 /* 
1083   netr_DSRADDRESSTOSITENAMESEXW 
1084 */
1085 static WERROR netr_DSRADDRESSTOSITENAMESEXW(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1086                        struct netr_DSRADDRESSTOSITENAMESEXW *r)
1087 {
1088         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1089 }
1090
1091
1092 /* 
1093   netr_DSRGETDCSITECOVERAGEW 
1094 */
1095 static WERROR netr_DSRGETDCSITECOVERAGEW(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1096                        struct netr_DSRGETDCSITECOVERAGEW *r)
1097 {
1098         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1099 }
1100
1101
1102 /* 
1103   netr_DsrEnumerateDomainTrusts 
1104 */
1105 static WERROR netr_DsrEnumerateDomainTrusts(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1106                                               struct netr_DsrEnumerateDomainTrusts *r)
1107 {
1108         struct netr_DomainTrust *trusts;
1109         void *sam_ctx;
1110         int ret;
1111         struct ldb_message **dom_res, **ref_res;
1112         const char * const dom_attrs[] = { "dnsDomain", "objectSid", "objectGUID", NULL };
1113         const char * const ref_attrs[] = { "nETBIOSName", NULL };
1114
1115         ZERO_STRUCT(r->out);
1116
1117         sam_ctx = samdb_connect(mem_ctx, dce_call->conn->auth_state.session_info);
1118         if (sam_ctx == NULL) {
1119                 return WERR_GENERAL_FAILURE;
1120         }
1121
1122         ret = gendb_search_dn(sam_ctx, mem_ctx, samdb_base_dn(mem_ctx), &dom_res, dom_attrs);
1123         if (ret == -1) {
1124                 return WERR_GENERAL_FAILURE;            
1125         }
1126
1127         if (ret != 1) {
1128                 return WERR_GENERAL_FAILURE;
1129         }
1130
1131         ret = gendb_search(sam_ctx, mem_ctx, NULL, &ref_res, ref_attrs,
1132                            "(&(objectClass=crossRef)(ncName=%s))",
1133                            ldb_dn_linearize(mem_ctx, dom_res[0]->dn));
1134         if (ret == -1) {
1135                 return WERR_GENERAL_FAILURE;
1136         }
1137
1138         if (ret != 1) {
1139                 return WERR_GENERAL_FAILURE;
1140         }
1141
1142
1143
1144         trusts = talloc_array(mem_ctx, struct netr_DomainTrust, ret);
1145         if (trusts == NULL) {
1146                 return WERR_NOMEM;
1147         }
1148         
1149         r->out.count = 1;
1150         r->out.trusts = trusts;
1151
1152         /* TODO: add filtering by trust_flags, and correct trust_type
1153            and attributes */
1154         trusts[0].netbios_name = samdb_result_string(ref_res[0], "nETBIOSName", NULL);
1155         trusts[0].dns_name     = samdb_result_string(dom_res[0], "dnsDomain", NULL);
1156         trusts[0].trust_flags = 
1157                 NETR_TRUST_FLAG_TREEROOT | 
1158                 NETR_TRUST_FLAG_IN_FOREST | 
1159                 NETR_TRUST_FLAG_PRIMARY;
1160         trusts[0].parent_index = 0;
1161         trusts[0].trust_type = 2;
1162         trusts[0].trust_attributes = 0;
1163         trusts[0].sid  = samdb_result_dom_sid(mem_ctx, dom_res[0], "objectSid");
1164         trusts[0].guid = samdb_result_guid(dom_res[0], "objectGUID");
1165
1166         return WERR_OK;
1167 }
1168
1169
1170 /* 
1171   netr_DSRDEREGISTERDNSHOSTRECORDS 
1172 */
1173 static WERROR netr_DSRDEREGISTERDNSHOSTRECORDS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1174                        struct netr_DSRDEREGISTERDNSHOSTRECORDS *r)
1175 {
1176         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1177 }
1178
1179
1180 /* 
1181   netr_NETRSERVERTRUSTPASSWORDSGET 
1182 */
1183 static WERROR netr_NETRSERVERTRUSTPASSWORDSGET(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1184                        struct netr_NETRSERVERTRUSTPASSWORDSGET *r)
1185 {
1186         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1187 }
1188
1189
1190 /* 
1191   netr_DSRGETFORESTTRUSTINFORMATION 
1192 */
1193 static WERROR netr_DSRGETFORESTTRUSTINFORMATION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1194                        struct netr_DSRGETFORESTTRUSTINFORMATION *r)
1195 {
1196         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1197 }
1198
1199
1200 /* 
1201   netr_NETRGETFORESTTRUSTINFORMATION 
1202 */
1203 static WERROR netr_NETRGETFORESTTRUSTINFORMATION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1204                        struct netr_NETRGETFORESTTRUSTINFORMATION *r)
1205 {
1206         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1207 }
1208
1209
1210 /* 
1211   netr_NETRSERVERGETTRUSTINFO 
1212 */
1213 static WERROR netr_NETRSERVERGETTRUSTINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1214                        struct netr_NETRSERVERGETTRUSTINFO *r)
1215 {
1216         DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1217 }
1218
1219
1220 /* include the generated boilerplate */
1221 #include "librpc/gen_ndr/ndr_netlogon_s.c"