r21563: Fix a memleak: We only need dispinfo structs for "our" and for the builtin
[kai/samba.git] / source / rpc_server / srv_lsa_nt.c
1 /*
2  *  Unix SMB/CIFS implementation.
3  *  RPC Pipe client / server routines
4  *  Copyright (C) Andrew Tridgell              1992-1997,
5  *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6  *  Copyright (C) Paul Ashton                       1997,
7  *  Copyright (C) Jeremy Allison                    2001, 2006.
8  *  Copyright (C) Rafal Szczesniak                  2002,
9  *  Copyright (C) Jim McDonough <jmcd@us.ibm.com>   2002,
10  *  Copyright (C) Simo Sorce                        2003.
11  *  Copyright (C) Gerald (Jerry) Carter             2005.
12  *  Copyright (C) Volker Lendecke                   2005.
13  *
14  *  This program is free software; you can redistribute it and/or modify
15  *  it under the terms of the GNU General Public License as published by
16  *  the Free Software Foundation; either version 2 of the License, or
17  *  (at your option) any later version.
18  *  
19  *  This program is distributed in the hope that it will be useful,
20  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  *  GNU General Public License for more details.
23  *  
24  *  You should have received a copy of the GNU General Public License
25  *  along with this program; if not, write to the Free Software
26  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27  */
28
29 /* This is the implementation of the lsa server code. */
30
31 #include "includes.h"
32
33 #undef DBGC_CLASS
34 #define DBGC_CLASS DBGC_RPC_SRV
35
36 extern PRIVS privs[];
37
38 struct lsa_info {
39         DOM_SID sid;
40         uint32 access;
41 };
42
43 struct generic_mapping lsa_generic_mapping = {
44         POLICY_READ,
45         POLICY_WRITE,
46         POLICY_EXECUTE,
47         POLICY_ALL_ACCESS
48 };
49
50 /*******************************************************************
51  Function to free the per handle data.
52  ********************************************************************/
53
54 static void free_lsa_info(void *ptr)
55 {
56         struct lsa_info *lsa = (struct lsa_info *)ptr;
57
58         SAFE_FREE(lsa);
59 }
60
61 /***************************************************************************
62 Init dom_query
63  ***************************************************************************/
64
65 static void init_dom_query_3(DOM_QUERY_3 *d_q, const char *dom_name, DOM_SID *dom_sid)
66 {
67         d_q->buffer_dom_name = (dom_name != NULL) ? 1 : 0; /* domain buffer pointer */
68         d_q->buffer_dom_sid = (dom_sid != NULL) ? 1 : 0;  /* domain sid pointer */
69
70         /* this string is supposed to be non-null terminated. */
71         /* But the maxlen in this UNISTR2 must include the terminating null. */
72         init_unistr2(&d_q->uni_domain_name, dom_name, UNI_BROKEN_NON_NULL);
73
74         /*
75          * I'm not sure why this really odd combination of length
76          * values works, but it does appear to. I need to look at
77          * this *much* more closely - but at the moment leave alone
78          * until it's understood. This allows a W2k client to join
79          * a domain with both odd and even length names... JRA.
80          */
81
82         /*
83          * IMPORTANT NOTE !!!!
84          * The two fields below probably are reversed in meaning, ie.
85          * the first field is probably the str_len, the second the max
86          * len. Both are measured in bytes anyway.
87          */
88
89         d_q->uni_dom_str_len = d_q->uni_domain_name.uni_max_len * 2;
90         d_q->uni_dom_max_len = d_q->uni_domain_name.uni_str_len * 2;
91
92         if (dom_sid != NULL)
93                 init_dom_sid2(&d_q->dom_sid, dom_sid);
94 }
95
96 /***************************************************************************
97 Init dom_query
98  ***************************************************************************/
99
100 static void init_dom_query_5(DOM_QUERY_5 *d_q, const char *dom_name, DOM_SID *dom_sid)
101 {
102         init_dom_query_3(d_q, dom_name, dom_sid);
103 }
104
105 /***************************************************************************
106  init_dom_ref - adds a domain if it's not already in, returns the index.
107 ***************************************************************************/
108
109 static int init_dom_ref(DOM_R_REF *ref, const char *dom_name, DOM_SID *dom_sid)
110 {
111         int num = 0;
112
113         if (dom_name != NULL) {
114                 for (num = 0; num < ref->num_ref_doms_1; num++) {
115                         if (sid_equal(dom_sid, &ref->ref_dom[num].ref_dom.sid))
116                                 return num;
117                 }
118         } else {
119                 num = ref->num_ref_doms_1;
120         }
121
122         if (num >= MAX_REF_DOMAINS) {
123                 /* index not found, already at maximum domain limit */
124                 return -1;
125         }
126
127         ref->num_ref_doms_1 = num+1;
128         ref->ptr_ref_dom  = 1;
129         ref->max_entries = MAX_REF_DOMAINS;
130         ref->num_ref_doms_2 = num+1;
131
132         ref->hdr_ref_dom[num].ptr_dom_sid = 1; /* dom sid cannot be NULL. */
133
134         init_unistr2(&ref->ref_dom[num].uni_dom_name, dom_name, UNI_FLAGS_NONE);
135         init_uni_hdr(&ref->hdr_ref_dom[num].hdr_dom_name, &ref->ref_dom[num].uni_dom_name);
136
137         init_dom_sid2(&ref->ref_dom[num].ref_dom, dom_sid );
138
139         return num;
140 }
141
142 /***************************************************************************
143  lookup_lsa_rids. Must be called as root for lookup_name to work.
144  ***************************************************************************/
145
146 static NTSTATUS lookup_lsa_rids(TALLOC_CTX *mem_ctx,
147                         DOM_R_REF *ref,
148                         DOM_RID *prid,
149                         uint32 num_entries,
150                         const UNISTR2 *name,
151                         int flags,
152                         uint32 *pmapped_count)
153 {
154         uint32 mapped_count, i;
155
156         SMB_ASSERT(num_entries <= MAX_LOOKUP_SIDS);
157
158         mapped_count = 0;
159         *pmapped_count = 0;
160
161         for (i = 0; i < num_entries; i++) {
162                 DOM_SID sid;
163                 uint32 rid;
164                 int dom_idx;
165                 char *full_name;
166                 const char *domain;
167                 enum lsa_SidType type = SID_NAME_UNKNOWN;
168
169                 /* Split name into domain and user component */
170
171                 full_name = rpcstr_pull_unistr2_talloc(mem_ctx, &name[i]);
172                 if (full_name == NULL) {
173                         DEBUG(0, ("pull_ucs2_talloc failed\n"));
174                         return NT_STATUS_NO_MEMORY;
175                 }
176
177                 DEBUG(5, ("lookup_lsa_rids: looking up name %s\n", full_name));
178
179                 /* We can ignore the result of lookup_name, it will not touch
180                    "type" if it's not successful */
181
182                 lookup_name(mem_ctx, full_name, flags, &domain, NULL,
183                             &sid, &type);
184
185                 switch (type) {
186                 case SID_NAME_USER:
187                 case SID_NAME_DOM_GRP:
188                 case SID_NAME_DOMAIN:
189                 case SID_NAME_ALIAS:
190                 case SID_NAME_WKN_GRP:
191                         DEBUG(5, ("init_lsa_rids: %s found\n", full_name));
192                         /* Leave these unchanged */
193                         break;
194                 default:
195                         /* Don't hand out anything but the list above */
196                         DEBUG(5, ("init_lsa_rids: %s not found\n", full_name));
197                         type = SID_NAME_UNKNOWN;
198                         break;
199                 }
200
201                 rid = 0;
202                 dom_idx = -1;
203
204                 if (type != SID_NAME_UNKNOWN) {
205                         sid_split_rid(&sid, &rid);
206                         dom_idx = init_dom_ref(ref, domain, &sid);
207                         mapped_count++;
208                 }
209
210                 init_dom_rid(&prid[i], rid, type, dom_idx);
211         }
212
213         *pmapped_count = mapped_count;
214         return NT_STATUS_OK;
215 }
216
217 /***************************************************************************
218  lookup_lsa_sids. Must be called as root for lookup_name to work.
219  ***************************************************************************/
220
221 static NTSTATUS lookup_lsa_sids(TALLOC_CTX *mem_ctx,
222                         DOM_R_REF *ref,
223                         LSA_TRANSLATED_SID3 *trans_sids,
224                         uint32 num_entries,
225                         const UNISTR2 *name,
226                         int flags,
227                         uint32 *pmapped_count)
228 {
229         uint32 mapped_count, i;
230
231         SMB_ASSERT(num_entries <= MAX_LOOKUP_SIDS);
232
233         mapped_count = 0;
234         *pmapped_count = 0;
235
236         for (i = 0; i < num_entries; i++) {
237                 DOM_SID sid;
238                 uint32 rid;
239                 int dom_idx;
240                 char *full_name;
241                 const char *domain;
242                 enum lsa_SidType type = SID_NAME_UNKNOWN;
243
244                 /* Split name into domain and user component */
245
246                 full_name = rpcstr_pull_unistr2_talloc(mem_ctx, &name[i]);
247                 if (full_name == NULL) {
248                         DEBUG(0, ("pull_ucs2_talloc failed\n"));
249                         return NT_STATUS_NO_MEMORY;
250                 }
251
252                 DEBUG(5, ("init_lsa_sids: looking up name %s\n", full_name));
253
254                 /* We can ignore the result of lookup_name, it will not touch
255                    "type" if it's not successful */
256
257                 lookup_name(mem_ctx, full_name, flags, &domain, NULL,
258                             &sid, &type);
259
260                 switch (type) {
261                 case SID_NAME_USER:
262                 case SID_NAME_DOM_GRP:
263                 case SID_NAME_DOMAIN:
264                 case SID_NAME_ALIAS:
265                 case SID_NAME_WKN_GRP:
266                         DEBUG(5, ("init_lsa_sids: %s found\n", full_name));
267                         /* Leave these unchanged */
268                         break;
269                 default:
270                         /* Don't hand out anything but the list above */
271                         DEBUG(5, ("init_lsa_sids: %s not found\n", full_name));
272                         type = SID_NAME_UNKNOWN;
273                         break;
274                 }
275
276                 rid = 0;
277                 dom_idx = -1;
278
279                 if (type != SID_NAME_UNKNOWN) {
280                         DOM_SID domain_sid;
281                         sid_copy(&domain_sid, &sid);
282                         sid_split_rid(&domain_sid, &rid);
283                         dom_idx = init_dom_ref(ref, domain, &domain_sid);
284                         mapped_count++;
285                 }
286
287                 /* Initialize the LSA_TRANSLATED_SID3 return. */
288                 trans_sids[i].sid_type = type;
289                 trans_sids[i].sid2 = TALLOC_P(mem_ctx, DOM_SID2);
290                 if (trans_sids[i].sid2 == NULL) {
291                         return NT_STATUS_NO_MEMORY;
292                 }
293                 init_dom_sid2(trans_sids[i].sid2, &sid);
294                 trans_sids[i].sid_idx = dom_idx;
295         }
296
297         *pmapped_count = mapped_count;
298         return NT_STATUS_OK;
299 }
300
301 /***************************************************************************
302  init_reply_lookup_names
303  ***************************************************************************/
304
305 static void init_reply_lookup_names(LSA_R_LOOKUP_NAMES *r_l,
306                 DOM_R_REF *ref, uint32 num_entries,
307                 DOM_RID *rid, uint32 mapped_count)
308 {
309         r_l->ptr_dom_ref  = 1;
310         r_l->dom_ref      = ref;
311
312         r_l->num_entries  = num_entries;
313         r_l->ptr_entries  = 1;
314         r_l->num_entries2 = num_entries;
315         r_l->dom_rid      = rid;
316
317         r_l->mapped_count = mapped_count;
318 }
319
320 /***************************************************************************
321  init_reply_lookup_names2
322  ***************************************************************************/
323
324 static void init_reply_lookup_names2(LSA_R_LOOKUP_NAMES2 *r_l,
325                 DOM_R_REF *ref, uint32 num_entries,
326                 DOM_RID2 *rid, uint32 mapped_count)
327 {
328         r_l->ptr_dom_ref  = 1;
329         r_l->dom_ref      = ref;
330
331         r_l->num_entries  = num_entries;
332         r_l->ptr_entries  = 1;
333         r_l->num_entries2 = num_entries;
334         r_l->dom_rid      = rid;
335
336         r_l->mapped_count = mapped_count;
337 }
338
339 /***************************************************************************
340  init_reply_lookup_names3
341  ***************************************************************************/
342
343 static void init_reply_lookup_names3(LSA_R_LOOKUP_NAMES3 *r_l,
344                 DOM_R_REF *ref, uint32 num_entries,
345                 LSA_TRANSLATED_SID3 *trans_sids, uint32 mapped_count)
346 {
347         r_l->ptr_dom_ref  = 1;
348         r_l->dom_ref      = ref;
349
350         r_l->num_entries  = num_entries;
351         r_l->ptr_entries  = 1;
352         r_l->num_entries2 = num_entries;
353         r_l->trans_sids   = trans_sids;
354
355         r_l->mapped_count = mapped_count;
356 }
357
358 /***************************************************************************
359  init_reply_lookup_names4
360  ***************************************************************************/
361
362 static void init_reply_lookup_names4(LSA_R_LOOKUP_NAMES4 *r_l,
363                 DOM_R_REF *ref, uint32 num_entries,
364                 LSA_TRANSLATED_SID3 *trans_sids, uint32 mapped_count)
365 {
366         r_l->ptr_dom_ref  = 1;
367         r_l->dom_ref      = ref;
368
369         r_l->num_entries  = num_entries;
370         r_l->ptr_entries  = 1;
371         r_l->num_entries2 = num_entries;
372         r_l->trans_sids   = trans_sids;
373
374         r_l->mapped_count = mapped_count;
375 }
376
377 /***************************************************************************
378  Init_reply_lookup_sids.
379  ***************************************************************************/
380
381 static void init_reply_lookup_sids2(LSA_R_LOOKUP_SIDS2 *r_l,
382                                 DOM_R_REF *ref,
383                                 LSA_TRANS_NAME_ENUM2 *names,
384                                 uint32 mapped_count)
385 {
386         r_l->ptr_dom_ref  = ref ? 1 : 0;
387         r_l->dom_ref      = ref;
388         r_l->names        = names;
389         r_l->mapped_count = mapped_count;
390 }
391
392 /***************************************************************************
393  Init_reply_lookup_sids.
394  ***************************************************************************/
395
396 static void init_reply_lookup_sids3(LSA_R_LOOKUP_SIDS3 *r_l,
397                                 DOM_R_REF *ref,
398                                 LSA_TRANS_NAME_ENUM2 *names,
399                                 uint32 mapped_count)
400 {
401         r_l->ptr_dom_ref  = ref ? 1 : 0;
402         r_l->dom_ref      = ref;
403         r_l->names        = names;
404         r_l->mapped_count = mapped_count;
405 }
406
407 /***************************************************************************
408  Init_reply_lookup_sids.
409  ***************************************************************************/
410
411 static NTSTATUS init_reply_lookup_sids(TALLOC_CTX *mem_ctx,
412                                 LSA_R_LOOKUP_SIDS *r_l,
413                                 DOM_R_REF *ref,
414                                 LSA_TRANS_NAME_ENUM2 *names,
415                                 uint32 mapped_count)
416 {
417         LSA_TRANS_NAME_ENUM *oldnames = TALLOC_ZERO_P(mem_ctx, LSA_TRANS_NAME_ENUM);
418
419         if (!oldnames) {
420                 return NT_STATUS_NO_MEMORY;
421         }
422
423         oldnames->num_entries = names->num_entries;
424         oldnames->ptr_trans_names = names->ptr_trans_names;
425         oldnames->num_entries2 = names->num_entries2;
426         oldnames->uni_name = names->uni_name;
427
428         if (names->num_entries) {
429                 int i;
430
431                 oldnames->name = TALLOC_ARRAY(oldnames, LSA_TRANS_NAME, names->num_entries);
432
433                 if (!oldnames->name) {
434                         return NT_STATUS_NO_MEMORY;
435                 }
436                 for (i = 0; i < names->num_entries; i++) {
437                         oldnames->name[i].sid_name_use = names->name[i].sid_name_use;
438                         oldnames->name[i].hdr_name = names->name[i].hdr_name;
439                         oldnames->name[i].domain_idx = names->name[i].domain_idx;
440                 }
441         }
442
443         r_l->ptr_dom_ref  = ref ? 1 : 0;
444         r_l->dom_ref      = ref;
445         r_l->names        = oldnames;
446         r_l->mapped_count = mapped_count;
447         return NT_STATUS_OK;
448 }
449
450 static NTSTATUS lsa_get_generic_sd(TALLOC_CTX *mem_ctx, SEC_DESC **sd, size_t *sd_size)
451 {
452         DOM_SID local_adm_sid;
453         DOM_SID adm_sid;
454
455         SEC_ACE ace[3];
456         SEC_ACCESS mask;
457
458         SEC_ACL *psa = NULL;
459
460         init_sec_access(&mask, POLICY_EXECUTE);
461         init_sec_ace(&ace[0], &global_sid_World, SEC_ACE_TYPE_ACCESS_ALLOWED, mask, 0);
462
463         sid_copy(&adm_sid, get_global_sam_sid());
464         sid_append_rid(&adm_sid, DOMAIN_GROUP_RID_ADMINS);
465         init_sec_access(&mask, POLICY_ALL_ACCESS);
466         init_sec_ace(&ace[1], &adm_sid, SEC_ACE_TYPE_ACCESS_ALLOWED, mask, 0);
467
468         sid_copy(&local_adm_sid, &global_sid_Builtin);
469         sid_append_rid(&local_adm_sid, BUILTIN_ALIAS_RID_ADMINS);
470         init_sec_access(&mask, POLICY_ALL_ACCESS);
471         init_sec_ace(&ace[2], &local_adm_sid, SEC_ACE_TYPE_ACCESS_ALLOWED, mask, 0);
472
473         if((psa = make_sec_acl(mem_ctx, NT4_ACL_REVISION, 3, ace)) == NULL)
474                 return NT_STATUS_NO_MEMORY;
475
476         if((*sd = make_sec_desc(mem_ctx, SEC_DESC_REVISION, SEC_DESC_SELF_RELATIVE, &adm_sid, NULL, NULL, psa, sd_size)) == NULL)
477                 return NT_STATUS_NO_MEMORY;
478
479         return NT_STATUS_OK;
480 }
481
482 #if 0   /* AD DC work in ongoing in Samba 4 */
483
484 /***************************************************************************
485  Init_dns_dom_info.
486 ***************************************************************************/
487
488 static void init_dns_dom_info(LSA_DNS_DOM_INFO *r_l, const char *nb_name,
489                               const char *dns_name, const char *forest_name,
490                               struct GUID *dom_guid, DOM_SID *dom_sid)
491 {
492         if (nb_name && *nb_name) {
493                 init_unistr2(&r_l->uni_nb_dom_name, nb_name, UNI_FLAGS_NONE);
494                 init_uni_hdr(&r_l->hdr_nb_dom_name, &r_l->uni_nb_dom_name);
495                 r_l->hdr_nb_dom_name.uni_max_len += 2;
496                 r_l->uni_nb_dom_name.uni_max_len += 1;
497         }
498         
499         if (dns_name && *dns_name) {
500                 init_unistr2(&r_l->uni_dns_dom_name, dns_name, UNI_FLAGS_NONE);
501                 init_uni_hdr(&r_l->hdr_dns_dom_name, &r_l->uni_dns_dom_name);
502                 r_l->hdr_dns_dom_name.uni_max_len += 2;
503                 r_l->uni_dns_dom_name.uni_max_len += 1;
504         }
505
506         if (forest_name && *forest_name) {
507                 init_unistr2(&r_l->uni_forest_name, forest_name, UNI_FLAGS_NONE);
508                 init_uni_hdr(&r_l->hdr_forest_name, &r_l->uni_forest_name);
509                 r_l->hdr_forest_name.uni_max_len += 2;
510                 r_l->uni_forest_name.uni_max_len += 1;
511         }
512
513         /* how do we init the guid ? probably should write an init fn */
514         if (dom_guid) {
515                 memcpy(&r_l->dom_guid, dom_guid, sizeof(struct GUID));
516         }
517         
518         if (dom_sid) {
519                 r_l->ptr_dom_sid = 1;
520                 init_dom_sid2(&r_l->dom_sid, dom_sid);
521         }
522 }
523 #endif  /* AD DC work in ongoing in Samba 4 */
524
525
526 /***************************************************************************
527  _lsa_open_policy2.
528  ***************************************************************************/
529
530 NTSTATUS _lsa_open_policy2(pipes_struct *p, LSA_Q_OPEN_POL2 *q_u, LSA_R_OPEN_POL2 *r_u)
531 {
532         struct lsa_info *info;
533         SEC_DESC *psd = NULL;
534         size_t sd_size;
535         uint32 des_access=q_u->des_access;
536         uint32 acc_granted;
537         NTSTATUS status;
538
539
540         /* map the generic bits to the lsa policy ones */
541         se_map_generic(&des_access, &lsa_generic_mapping);
542
543         /* get the generic lsa policy SD until we store it */
544         lsa_get_generic_sd(p->mem_ctx, &psd, &sd_size);
545
546         if(!se_access_check(psd, p->pipe_user.nt_user_token, des_access, &acc_granted, &status)) {
547                 if (p->pipe_user.ut.uid != sec_initial_uid()) {
548                         return status;
549                 }
550                 DEBUG(4,("ACCESS should be DENIED (granted: %#010x;  required: %#010x)\n",
551                          acc_granted, des_access));
552                 DEBUGADD(4,("but overwritten by euid == 0\n"));
553         }
554
555         /* This is needed for lsa_open_account and rpcclient .... :-) */
556
557         if (p->pipe_user.ut.uid == sec_initial_uid())
558                 acc_granted = POLICY_ALL_ACCESS;
559
560         /* associate the domain SID with the (unique) handle. */
561         if ((info = SMB_MALLOC_P(struct lsa_info)) == NULL)
562                 return NT_STATUS_NO_MEMORY;
563
564         ZERO_STRUCTP(info);
565         sid_copy(&info->sid,get_global_sam_sid());
566         info->access = acc_granted;
567
568         /* set up the LSA QUERY INFO response */
569         if (!create_policy_hnd(p, &r_u->pol, free_lsa_info, (void *)info))
570                 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
571
572         return NT_STATUS_OK;
573 }
574
575 /***************************************************************************
576  _lsa_open_policy
577  ***************************************************************************/
578
579 NTSTATUS _lsa_open_policy(pipes_struct *p, LSA_Q_OPEN_POL *q_u, LSA_R_OPEN_POL *r_u)
580 {
581         struct lsa_info *info;
582         SEC_DESC *psd = NULL;
583         size_t sd_size;
584         uint32 des_access=q_u->des_access;
585         uint32 acc_granted;
586         NTSTATUS status;
587
588
589         /* map the generic bits to the lsa policy ones */
590         se_map_generic(&des_access, &lsa_generic_mapping);
591
592         /* get the generic lsa policy SD until we store it */
593         lsa_get_generic_sd(p->mem_ctx, &psd, &sd_size);
594
595         if(!se_access_check(psd, p->pipe_user.nt_user_token, des_access, &acc_granted, &status)) {
596                 if (geteuid() != 0) {
597                         return status;
598                 }
599                 DEBUG(4,("ACCESS should be DENIED (granted: %#010x;  required: %#010x)\n",
600                          acc_granted, des_access));
601                 DEBUGADD(4,("but overwritten by euid == 0\n"));
602                 acc_granted = des_access;
603         }
604
605         /* associate the domain SID with the (unique) handle. */
606         if ((info = SMB_MALLOC_P(struct lsa_info)) == NULL)
607                 return NT_STATUS_NO_MEMORY;
608
609         ZERO_STRUCTP(info);
610         sid_copy(&info->sid,get_global_sam_sid());
611         info->access = acc_granted;
612
613         /* set up the LSA QUERY INFO response */
614         if (!create_policy_hnd(p, &r_u->pol, free_lsa_info, (void *)info))
615                 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
616
617         return NT_STATUS_OK;
618 }
619
620 /***************************************************************************
621  _lsa_enum_trust_dom - this needs fixing to do more than return NULL ! JRA.
622  ufff, done :)  mimir
623  ***************************************************************************/
624
625 NTSTATUS _lsa_enum_trust_dom(pipes_struct *p, LSA_Q_ENUM_TRUST_DOM *q_u,
626                              LSA_R_ENUM_TRUST_DOM *r_u)
627 {
628         struct lsa_info *info;
629         uint32 next_idx;
630         struct trustdom_info **domains;
631
632         /*
633          * preferred length is set to 5 as a "our" preferred length
634          * nt sets this parameter to 2
635          * update (20.08.2002): it's not preferred length, but preferred size!
636          * it needs further investigation how to optimally choose this value
637          */
638         uint32 max_num_domains =
639                 q_u->preferred_len < 5 ? q_u->preferred_len : 10;
640         uint32 num_domains;
641         NTSTATUS nt_status;
642         uint32 num_thistime;
643
644         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))
645                 return NT_STATUS_INVALID_HANDLE;
646
647         /* check if the user have enough rights */
648         if (!(info->access & POLICY_VIEW_LOCAL_INFORMATION))
649                 return NT_STATUS_ACCESS_DENIED;
650
651         nt_status = pdb_enum_trusteddoms(p->mem_ctx, &num_domains, &domains);
652
653         if (!NT_STATUS_IS_OK(nt_status)) {
654                 return nt_status;
655         }
656
657         if (q_u->enum_context < num_domains) {
658                 num_thistime = MIN(num_domains, max_num_domains);
659
660                 r_u->status = STATUS_MORE_ENTRIES;
661
662                 if (q_u->enum_context + num_thistime > num_domains) {
663                         num_thistime = num_domains - q_u->enum_context;
664                         r_u->status = NT_STATUS_OK;
665                 }
666
667                 next_idx = q_u->enum_context + num_thistime;
668         } else {
669                 num_thistime = 0;
670                 next_idx = 0xffffffff;
671                 r_u->status = NT_STATUS_NO_MORE_ENTRIES;
672         }
673                 
674         /* set up the lsa_enum_trust_dom response */
675
676         init_r_enum_trust_dom(p->mem_ctx, r_u, next_idx,
677                               num_thistime, domains+q_u->enum_context);
678
679         return r_u->status;
680 }
681
682 /***************************************************************************
683  _lsa_query_info. See the POLICY_INFOMATION_CLASS docs at msdn.
684  ***************************************************************************/
685
686 NTSTATUS _lsa_query_info(pipes_struct *p, LSA_Q_QUERY_INFO *q_u, LSA_R_QUERY_INFO *r_u)
687 {
688         struct lsa_info *handle;
689         LSA_INFO_CTR *ctr = &r_u->ctr;
690         DOM_SID domain_sid;
691         const char *name;
692         DOM_SID *sid = NULL;
693
694         r_u->status = NT_STATUS_OK;
695
696         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle))
697                 return NT_STATUS_INVALID_HANDLE;
698
699         switch (q_u->info_class) {
700         case 0x02:
701                 {
702
703                 uint32 policy_def = LSA_AUDIT_POLICY_ALL;
704                 
705                 /* check if the user have enough rights */
706                 if (!(handle->access & POLICY_VIEW_AUDIT_INFORMATION)) {
707                         DEBUG(10,("_lsa_query_info: insufficient access rights\n"));
708                         return NT_STATUS_ACCESS_DENIED;
709                 }
710
711                 /* fake info: We audit everything. ;) */
712                 ctr->info.id2.ptr = 1;
713                 ctr->info.id2.auditing_enabled = True;
714                 ctr->info.id2.count1 = ctr->info.id2.count2 = LSA_AUDIT_NUM_CATEGORIES;
715
716                 if ((ctr->info.id2.auditsettings = TALLOC_ZERO_ARRAY(p->mem_ctx, uint32, LSA_AUDIT_NUM_CATEGORIES)) == NULL)
717                         return NT_STATUS_NO_MEMORY;
718
719                 ctr->info.id2.auditsettings[LSA_AUDIT_CATEGORY_ACCOUNT_MANAGEMENT] = policy_def;
720                 ctr->info.id2.auditsettings[LSA_AUDIT_CATEGORY_FILE_AND_OBJECT_ACCESS] = policy_def; 
721                 ctr->info.id2.auditsettings[LSA_AUDIT_CATEGORY_LOGON] = policy_def; 
722                 ctr->info.id2.auditsettings[LSA_AUDIT_CATEGORY_PROCCESS_TRACKING] = policy_def; 
723                 ctr->info.id2.auditsettings[LSA_AUDIT_CATEGORY_SECURITY_POLICY_CHANGES] = policy_def;
724                 ctr->info.id2.auditsettings[LSA_AUDIT_CATEGORY_SYSTEM] = policy_def;
725                 ctr->info.id2.auditsettings[LSA_AUDIT_CATEGORY_USE_OF_USER_RIGHTS] = policy_def; 
726
727                 break;
728                 }
729         case 0x03:
730                 /* check if the user have enough rights */
731                 if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))
732                         return NT_STATUS_ACCESS_DENIED;
733
734                 /* Request PolicyPrimaryDomainInformation. */
735                 switch (lp_server_role()) {
736                         case ROLE_DOMAIN_PDC:
737                         case ROLE_DOMAIN_BDC:
738                                 name = get_global_sam_name();
739                                 sid = get_global_sam_sid();
740                                 break;
741                         case ROLE_DOMAIN_MEMBER:
742                                 name = lp_workgroup();
743                                 /* We need to return the Domain SID here. */
744                                 if (secrets_fetch_domain_sid(lp_workgroup(), &domain_sid))
745                                         sid = &domain_sid;
746                                 else
747                                         return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
748                                 break;
749                         case ROLE_STANDALONE:
750                                 name = lp_workgroup();
751                                 sid = NULL;
752                                 break;
753                         default:
754                                 return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
755                 }
756                 init_dom_query_3(&r_u->ctr.info.id3, name, sid);
757                 break;
758         case 0x05:
759                 /* check if the user have enough rights */
760                 if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))
761                         return NT_STATUS_ACCESS_DENIED;
762
763                 /* Request PolicyAccountDomainInformation. */
764                 name = get_global_sam_name();
765                 sid = get_global_sam_sid();
766                 init_dom_query_5(&r_u->ctr.info.id5, name, sid);
767                 break;
768         case 0x06:
769                 /* check if the user have enough rights */
770                 if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))
771                         return NT_STATUS_ACCESS_DENIED;
772
773                 switch (lp_server_role()) {
774                         case ROLE_DOMAIN_BDC:
775                                 /*
776                                  * only a BDC is a backup controller
777                                  * of the domain, it controls.
778                                  */
779                                 ctr->info.id6.server_role = 2;
780                                 break;
781                         default:
782                                 /*
783                                  * any other role is a primary
784                                  * of the domain, it controls.
785                                  */
786                                 ctr->info.id6.server_role = 3;
787                                 break; 
788                 }
789                 break;
790         default:
791                 DEBUG(0,("_lsa_query_info: unknown info level in Lsa Query: %d\n", q_u->info_class));
792                 r_u->status = NT_STATUS_INVALID_INFO_CLASS;
793                 break;
794         }
795
796         if (NT_STATUS_IS_OK(r_u->status)) {
797                 r_u->dom_ptr = 0x22000000; /* bizarre */
798                 ctr->info_class = q_u->info_class;
799         }
800
801         return r_u->status;
802 }
803
804 /***************************************************************************
805  _lsa_lookup_sids_internal
806  ***************************************************************************/
807
808 static NTSTATUS _lsa_lookup_sids_internal(pipes_struct *p,
809                                 uint16 level,                           /* input */
810                                 int num_sids,                           /* input */
811                                 const DOM_SID2 *sid,                    /* input */
812                                 DOM_R_REF **pp_ref,                     /* output */
813                                 LSA_TRANS_NAME_ENUM2 **pp_names,        /* output */
814                                 uint32 *pp_mapped_count)
815 {
816         NTSTATUS status;
817         int i;
818         const DOM_SID **sids = NULL;
819         LSA_TRANS_NAME_ENUM2 *names = NULL;
820         DOM_R_REF *ref = NULL;
821         uint32 mapped_count = 0;
822         struct lsa_dom_info *dom_infos = NULL;
823         struct lsa_name_info *name_infos = NULL;
824
825         *pp_mapped_count = 0;
826         *pp_ref = NULL;
827         *pp_names = NULL;
828         
829         names = TALLOC_ZERO_P(p->mem_ctx, LSA_TRANS_NAME_ENUM2);
830         sids = TALLOC_ARRAY(p->mem_ctx, const DOM_SID *, num_sids);
831         ref = TALLOC_ZERO_P(p->mem_ctx, DOM_R_REF);
832
833         if (sids == NULL || names == NULL || ref == NULL) {
834                 return NT_STATUS_NO_MEMORY;
835         }
836
837         for (i=0; i<num_sids; i++) {
838                 sids[i] = &sid[i].sid;
839         }
840
841         status = lookup_sids(p->mem_ctx, num_sids, sids, level,
842                                   &dom_infos, &name_infos);
843
844         if (!NT_STATUS_IS_OK(status)) {
845                 return status;
846         }
847
848         if (num_sids > 0) {
849                 names->name = TALLOC_ARRAY(names, LSA_TRANS_NAME2, num_sids);
850                 names->uni_name = TALLOC_ARRAY(names, UNISTR2, num_sids);
851                 if ((names->name == NULL) || (names->uni_name == NULL)) {
852                         return NT_STATUS_NO_MEMORY;
853                 }
854         }
855
856         for (i=0; i<MAX_REF_DOMAINS; i++) {
857
858                 if (!dom_infos[i].valid) {
859                         break;
860                 }
861
862                 if (init_dom_ref(ref, dom_infos[i].name,
863                                  &dom_infos[i].sid) != i) {
864                         DEBUG(0, ("Domain %s mentioned twice??\n",
865                                   dom_infos[i].name));
866                         return NT_STATUS_INTERNAL_ERROR;
867                 }
868         }
869
870         for (i=0; i<num_sids; i++) {
871                 struct lsa_name_info *name = &name_infos[i];
872
873                 if (name->type == SID_NAME_UNKNOWN) {
874                         name->dom_idx = -1;
875                         /* Unknown sids should return the string
876                          * representation of the SID. Windows 2003 behaves
877                          * rather erratic here, in many cases it returns the
878                          * RID as 8 bytes hex, in others it returns the full
879                          * SID. We (Jerry/VL) could not figure out which the
880                          * hard cases are, so leave it with the SID.  */
881                         name->name = talloc_asprintf(p->mem_ctx, "%s", 
882                                                      sid_string_static(sids[i]));
883                         if (name->name == NULL) {
884                                 return NT_STATUS_NO_MEMORY;
885                         }
886                 } else {
887                         mapped_count += 1;
888                 }
889                 init_lsa_trans_name2(&names->name[i], &names->uni_name[i],
890                                     name->type, name->name, name->dom_idx);
891         }
892
893         names->num_entries = num_sids;
894         names->ptr_trans_names = 1;
895         names->num_entries2 = num_sids;
896
897         status = NT_STATUS_NONE_MAPPED;
898         if (mapped_count > 0) {
899                 status = (mapped_count < num_sids) ?
900                         STATUS_SOME_UNMAPPED : NT_STATUS_OK;
901         }
902
903         DEBUG(10, ("num_sids %d, mapped_count %d, status %s\n",
904                    num_sids, mapped_count, nt_errstr(status)));
905
906         *pp_mapped_count = mapped_count;
907         *pp_ref = ref;
908         *pp_names = names;
909
910         return status;
911 }
912
913 /***************************************************************************
914  _lsa_lookup_sids
915  ***************************************************************************/
916
917 NTSTATUS _lsa_lookup_sids(pipes_struct *p,
918                           LSA_Q_LOOKUP_SIDS *q_u,
919                           LSA_R_LOOKUP_SIDS *r_u)
920 {
921         struct lsa_info *handle;
922         int num_sids = q_u->sids.num_entries;
923         uint32 mapped_count = 0;
924         DOM_R_REF *ref = NULL;
925         LSA_TRANS_NAME_ENUM2 *names = NULL;
926         NTSTATUS status;
927
928         if ((q_u->level < 1) || (q_u->level > 6)) {
929                 return NT_STATUS_INVALID_PARAMETER;
930         }
931
932         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle)) {
933                 return NT_STATUS_INVALID_HANDLE;
934         }
935
936         /* check if the user has enough rights */
937         if (!(handle->access & POLICY_LOOKUP_NAMES)) {
938                 return NT_STATUS_ACCESS_DENIED;
939         }
940
941         if (num_sids >  MAX_LOOKUP_SIDS) {
942                 DEBUG(5,("_lsa_lookup_sids: limit of %d exceeded, requested %d\n",
943                          MAX_LOOKUP_SIDS, num_sids));
944                 return NT_STATUS_NONE_MAPPED;
945         }
946
947         r_u->status = _lsa_lookup_sids_internal(p,
948                                                 q_u->level,
949                                                 num_sids, 
950                                                 q_u->sids.sid,
951                                                 &ref,
952                                                 &names,
953                                                 &mapped_count);
954
955         /* Convert from LSA_TRANS_NAME_ENUM2 to LSA_TRANS_NAME_ENUM */
956
957         status = init_reply_lookup_sids(p->mem_ctx, r_u, ref, names, mapped_count);
958         if (!NT_STATUS_IS_OK(status)) {
959                 return status;
960         }
961         return r_u->status;
962 }
963
964 /***************************************************************************
965  _lsa_lookup_sids2
966  ***************************************************************************/
967
968 NTSTATUS _lsa_lookup_sids2(pipes_struct *p,
969                           LSA_Q_LOOKUP_SIDS2 *q_u,
970                           LSA_R_LOOKUP_SIDS2 *r_u)
971 {
972         struct lsa_info *handle;
973         int num_sids = q_u->sids.num_entries;
974         uint32 mapped_count = 0;
975         DOM_R_REF *ref = NULL;
976         LSA_TRANS_NAME_ENUM2 *names = NULL;
977
978         if ((q_u->level < 1) || (q_u->level > 6)) {
979                 return NT_STATUS_INVALID_PARAMETER;
980         }
981
982         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle)) {
983                 return NT_STATUS_INVALID_HANDLE;
984         }
985
986         /* check if the user have enough rights */
987         if (!(handle->access & POLICY_LOOKUP_NAMES)) {
988                 return NT_STATUS_ACCESS_DENIED;
989         }
990
991         if (num_sids >  MAX_LOOKUP_SIDS) {
992                 DEBUG(5,("_lsa_lookup_sids2: limit of %d exceeded, requested %d\n",
993                          MAX_LOOKUP_SIDS, num_sids));
994                 return NT_STATUS_NONE_MAPPED;
995         }
996
997         r_u->status = _lsa_lookup_sids_internal(p,
998                                                 q_u->level,
999                                                 num_sids, 
1000                                                 q_u->sids.sid,
1001                                                 &ref,
1002                                                 &names,
1003                                                 &mapped_count);
1004
1005         init_reply_lookup_sids2(r_u, ref, names, mapped_count);
1006         return r_u->status;
1007 }
1008
1009 /***************************************************************************
1010  _lsa_lookup_sida3
1011
1012  Before someone actually re-activates this, please present a sniff showing
1013  this call against some Windows server. I (vl) could not make it work against
1014  w2k3 at all.
1015  ***************************************************************************/
1016
1017 NTSTATUS _lsa_lookup_sids3(pipes_struct *p,
1018                           LSA_Q_LOOKUP_SIDS3 *q_u,
1019                           LSA_R_LOOKUP_SIDS3 *r_u)
1020 {
1021         uint32 mapped_count = 0;
1022         DOM_R_REF *ref;
1023         LSA_TRANS_NAME_ENUM2 *names;
1024
1025         if ((q_u->level < 1) || (q_u->level > 6)) {
1026                 return NT_STATUS_INVALID_PARAMETER;
1027         }
1028
1029         r_u->status = NT_STATUS_RPC_PROTSEQ_NOT_SUPPORTED;
1030
1031         ref = TALLOC_ZERO_P(p->mem_ctx, DOM_R_REF);
1032         names = TALLOC_ZERO_P(p->mem_ctx, LSA_TRANS_NAME_ENUM2);
1033
1034         if ((ref == NULL) || (names == NULL)) {
1035                 /* We would segfault later on in lsa_io_r_lookup_sids3 anyway,
1036                  * so do a planned exit here. We NEEEED pidl! */
1037                 smb_panic("talloc failed");
1038         }
1039
1040         init_reply_lookup_sids3(r_u, ref, names, mapped_count);
1041         return r_u->status;
1042 }
1043
1044 /***************************************************************************
1045 lsa_reply_lookup_names
1046  ***************************************************************************/
1047
1048 NTSTATUS _lsa_lookup_names(pipes_struct *p,LSA_Q_LOOKUP_NAMES *q_u, LSA_R_LOOKUP_NAMES *r_u)
1049 {
1050         struct lsa_info *handle;
1051         UNISTR2 *names = q_u->uni_name;
1052         uint32 num_entries = q_u->num_entries;
1053         DOM_R_REF *ref;
1054         DOM_RID *rids;
1055         uint32 mapped_count = 0;
1056         int flags = 0;
1057
1058         if (num_entries >  MAX_LOOKUP_SIDS) {
1059                 num_entries = MAX_LOOKUP_SIDS;
1060                 DEBUG(5,("_lsa_lookup_names: truncating name lookup list to %d\n", num_entries));
1061         }
1062                 
1063         /* Probably the lookup_level is some sort of bitmask. */
1064         if (q_u->lookup_level == 1) {
1065                 flags = LOOKUP_NAME_ALL;
1066         }
1067
1068         ref = TALLOC_ZERO_P(p->mem_ctx, DOM_R_REF);
1069         rids = TALLOC_ZERO_ARRAY(p->mem_ctx, DOM_RID, num_entries);
1070
1071         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle)) {
1072                 r_u->status = NT_STATUS_INVALID_HANDLE;
1073                 goto done;
1074         }
1075
1076         /* check if the user have enough rights */
1077         if (!(handle->access & POLICY_LOOKUP_NAMES)) {
1078                 r_u->status = NT_STATUS_ACCESS_DENIED;
1079                 goto done;
1080         }
1081
1082         if (!ref || !rids)
1083                 return NT_STATUS_NO_MEMORY;
1084
1085         /* set up the LSA Lookup RIDs response */
1086         become_root(); /* lookup_name can require root privs */
1087         r_u->status = lookup_lsa_rids(p->mem_ctx, ref, rids, num_entries,
1088                                       names, flags, &mapped_count);
1089         unbecome_root();
1090
1091 done:
1092
1093         if (NT_STATUS_IS_OK(r_u->status) && (num_entries != 0) ) {
1094                 if (mapped_count == 0)
1095                         r_u->status = NT_STATUS_NONE_MAPPED;
1096                 else if (mapped_count != num_entries)
1097                         r_u->status = STATUS_SOME_UNMAPPED;
1098         }
1099
1100         init_reply_lookup_names(r_u, ref, num_entries, rids, mapped_count);
1101         return r_u->status;
1102 }
1103
1104 /***************************************************************************
1105 lsa_reply_lookup_names2
1106  ***************************************************************************/
1107
1108 NTSTATUS _lsa_lookup_names2(pipes_struct *p, LSA_Q_LOOKUP_NAMES2 *q_u, LSA_R_LOOKUP_NAMES2 *r_u)
1109 {
1110         struct lsa_info *handle;
1111         UNISTR2 *names = q_u->uni_name;
1112         uint32 num_entries = q_u->num_entries;
1113         DOM_R_REF *ref;
1114         DOM_RID *rids;
1115         DOM_RID2 *rids2;
1116         int i;
1117         uint32 mapped_count = 0;
1118         int flags = 0;
1119
1120         if (num_entries >  MAX_LOOKUP_SIDS) {
1121                 num_entries = MAX_LOOKUP_SIDS;
1122                 DEBUG(5,("_lsa_lookup_names2: truncating name lookup list to %d\n", num_entries));
1123         }
1124                 
1125         /* Probably the lookup_level is some sort of bitmask. */
1126         if (q_u->lookup_level == 1) {
1127                 flags = LOOKUP_NAME_ALL;
1128         }
1129
1130         ref = TALLOC_ZERO_P(p->mem_ctx, DOM_R_REF);
1131         rids = TALLOC_ZERO_ARRAY(p->mem_ctx, DOM_RID, num_entries);
1132         rids2 = TALLOC_ZERO_ARRAY(p->mem_ctx, DOM_RID2, num_entries);
1133
1134         if ((ref == NULL) || (rids == NULL) || (rids2 == NULL)) {
1135                 r_u->status = NT_STATUS_NO_MEMORY;
1136                 return NT_STATUS_NO_MEMORY;
1137         }
1138
1139         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle)) {
1140                 r_u->status = NT_STATUS_INVALID_HANDLE;
1141                 goto done;
1142         }
1143
1144         /* check if the user have enough rights */
1145         if (!(handle->access & POLICY_LOOKUP_NAMES)) {
1146                 r_u->status = NT_STATUS_ACCESS_DENIED;
1147                 goto done;
1148         }
1149
1150         /* set up the LSA Lookup RIDs response */
1151         become_root(); /* lookup_name can require root privs */
1152         r_u->status = lookup_lsa_rids(p->mem_ctx, ref, rids, num_entries,
1153                                       names, flags, &mapped_count);
1154         unbecome_root();
1155
1156 done:
1157
1158         if (NT_STATUS_IS_OK(r_u->status)) {
1159                 if (mapped_count == 0) {
1160                         r_u->status = NT_STATUS_NONE_MAPPED;
1161                 } else if (mapped_count != num_entries) {
1162                         r_u->status = STATUS_SOME_UNMAPPED;
1163                 }
1164         }
1165
1166         /* Convert the rids array to rids2. */
1167         for (i = 0; i < num_entries; i++) {
1168                 rids2[i].type = rids[i].type;
1169                 rids2[i].rid = rids[i].rid;
1170                 rids2[i].rid_idx = rids[i].rid_idx;
1171                 rids2[i].unknown = 0;
1172         }
1173
1174         init_reply_lookup_names2(r_u, ref, num_entries, rids2, mapped_count);
1175         return r_u->status;
1176 }
1177
1178 /***************************************************************************
1179 lsa_reply_lookup_names3.
1180  ***************************************************************************/
1181
1182 NTSTATUS _lsa_lookup_names3(pipes_struct *p, LSA_Q_LOOKUP_NAMES3 *q_u, LSA_R_LOOKUP_NAMES3 *r_u)
1183 {
1184         struct lsa_info *handle;
1185         UNISTR2 *names = q_u->uni_name;
1186         uint32 num_entries = q_u->num_entries;
1187         DOM_R_REF *ref = NULL;
1188         LSA_TRANSLATED_SID3 *trans_sids = NULL;
1189         uint32 mapped_count = 0;
1190         int flags = 0;
1191
1192         if (num_entries >  MAX_LOOKUP_SIDS) {
1193                 num_entries = MAX_LOOKUP_SIDS;
1194                 DEBUG(5,("_lsa_lookup_names3: truncating name lookup list to %d\n", num_entries));
1195         }
1196                 
1197         /* Probably the lookup_level is some sort of bitmask. */
1198         if (q_u->lookup_level == 1) {
1199                 flags = LOOKUP_NAME_ALL;
1200         }
1201
1202         ref = TALLOC_ZERO_P(p->mem_ctx, DOM_R_REF);
1203         trans_sids = TALLOC_ZERO_ARRAY(p->mem_ctx, LSA_TRANSLATED_SID3, num_entries);
1204
1205         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle)) {
1206                 r_u->status = NT_STATUS_INVALID_HANDLE;
1207                 goto done;
1208         }
1209
1210         /* check if the user have enough rights */
1211         if (!(handle->access & POLICY_LOOKUP_NAMES)) {
1212                 r_u->status = NT_STATUS_ACCESS_DENIED;
1213                 goto done;
1214         }
1215
1216         if (!ref || !trans_sids) {
1217                 return NT_STATUS_NO_MEMORY;
1218         }
1219
1220         /* set up the LSA Lookup SIDs response */
1221         become_root(); /* lookup_name can require root privs */
1222         r_u->status = lookup_lsa_sids(p->mem_ctx, ref, trans_sids, num_entries,
1223                                       names, flags, &mapped_count);
1224         unbecome_root();
1225
1226 done:
1227
1228         if (NT_STATUS_IS_OK(r_u->status)) {
1229                 if (mapped_count == 0) {
1230                         r_u->status = NT_STATUS_NONE_MAPPED;
1231                 } else if (mapped_count != num_entries) {
1232                         r_u->status = STATUS_SOME_UNMAPPED;
1233                 }
1234         }
1235
1236         init_reply_lookup_names3(r_u, ref, num_entries, trans_sids, mapped_count);
1237         return r_u->status;
1238 }
1239
1240 /***************************************************************************
1241 lsa_reply_lookup_names4.
1242  ***************************************************************************/
1243
1244 NTSTATUS _lsa_lookup_names4(pipes_struct *p, LSA_Q_LOOKUP_NAMES4 *q_u, LSA_R_LOOKUP_NAMES4 *r_u)
1245 {
1246         UNISTR2 *names = q_u->uni_name;
1247         uint32 num_entries = q_u->num_entries;
1248         DOM_R_REF *ref = NULL;
1249         LSA_TRANSLATED_SID3 *trans_sids = NULL;
1250         uint32 mapped_count = 0;
1251         int flags = 0;
1252
1253         if (num_entries >  MAX_LOOKUP_SIDS) {
1254                 num_entries = MAX_LOOKUP_SIDS;
1255                 DEBUG(5,("_lsa_lookup_names4: truncating name lookup list to %d\n", num_entries));
1256         }
1257                 
1258         /* Probably the lookup_level is some sort of bitmask. */
1259         if (q_u->lookup_level == 1) {
1260                 flags = LOOKUP_NAME_ALL;
1261         }
1262
1263         /* No policy handle on this call. Restrict to crypto connections. */
1264         if (p->auth.auth_type != PIPE_AUTH_TYPE_SCHANNEL) {
1265                 DEBUG(0,("_lsa_lookup_names4: client %s not using schannel for netlogon\n",
1266                         get_remote_machine_name() ));
1267                 return NT_STATUS_INVALID_PARAMETER;
1268         }
1269
1270         ref = TALLOC_ZERO_P(p->mem_ctx, DOM_R_REF);
1271         trans_sids = TALLOC_ZERO_ARRAY(p->mem_ctx, LSA_TRANSLATED_SID3, num_entries);
1272
1273         if (!ref || !trans_sids) {
1274                 return NT_STATUS_NO_MEMORY;
1275         }
1276
1277         /* set up the LSA Lookup SIDs response */
1278         become_root(); /* lookup_name can require root privs */
1279         r_u->status = lookup_lsa_sids(p->mem_ctx, ref, trans_sids, num_entries,
1280                                       names, flags, &mapped_count);
1281         unbecome_root();
1282
1283         if (NT_STATUS_IS_OK(r_u->status)) {
1284                 if (mapped_count == 0) {
1285                         r_u->status = NT_STATUS_NONE_MAPPED;
1286                 } else if (mapped_count != num_entries) {
1287                         r_u->status = STATUS_SOME_UNMAPPED;
1288                 }
1289         }
1290
1291         init_reply_lookup_names4(r_u, ref, num_entries, trans_sids, mapped_count);
1292         return r_u->status;
1293 }
1294
1295 /***************************************************************************
1296  _lsa_close. Also weird - needs to check if lsa handle is correct. JRA.
1297  ***************************************************************************/
1298
1299 NTSTATUS _lsa_Close(pipes_struct *p, struct lsa_Close *r)
1300 {
1301         if (!find_policy_by_hnd(p, r->in.handle, NULL)) {
1302                 return NT_STATUS_INVALID_HANDLE;
1303         }
1304
1305         close_policy_hnd(p, r->in.handle);
1306         return NT_STATUS_OK;
1307 }
1308
1309 /***************************************************************************
1310  ***************************************************************************/
1311
1312 NTSTATUS _lsa_OpenSecret(pipes_struct *p, struct lsa_OpenSecret *r)
1313 {
1314         return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1315 }
1316
1317 /***************************************************************************
1318  ***************************************************************************/
1319
1320 NTSTATUS _lsa_OpenTrustedDomain(pipes_struct *p, struct lsa_OpenTrustedDomain *r)
1321 {
1322         return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1323 }
1324
1325 /***************************************************************************
1326  ***************************************************************************/
1327
1328 NTSTATUS _lsa_CreateTrustedDomain(pipes_struct *p, struct lsa_CreateTrustedDomain *r)
1329 {
1330         return NT_STATUS_ACCESS_DENIED;
1331 }
1332
1333 /***************************************************************************
1334  ***************************************************************************/
1335
1336 NTSTATUS _lsa_CreateSecret(pipes_struct *p, struct lsa_CreateSecret *r)
1337 {
1338         return NT_STATUS_ACCESS_DENIED;
1339 }
1340
1341 /***************************************************************************
1342  ***************************************************************************/
1343
1344 NTSTATUS _lsa_SetSecret(pipes_struct *p, struct lsa_SetSecret *r)
1345 {
1346         return NT_STATUS_ACCESS_DENIED;
1347 }
1348
1349 /***************************************************************************
1350  ***************************************************************************/
1351
1352 NTSTATUS _lsa_delete_object(pipes_struct *p, LSA_Q_DELETE_OBJECT *q_u, LSA_R_DELETE_OBJECT *r_u)
1353 {
1354         return NT_STATUS_ACCESS_DENIED;
1355 }
1356
1357 /***************************************************************************
1358 _lsa_enum_privs.
1359  ***************************************************************************/
1360
1361 NTSTATUS _lsa_enum_privs(pipes_struct *p, LSA_Q_ENUM_PRIVS *q_u, LSA_R_ENUM_PRIVS *r_u)
1362 {
1363         struct lsa_info *handle;
1364         uint32 i;
1365         uint32 enum_context = q_u->enum_context;
1366         int num_privs = count_all_privileges();
1367         LSA_PRIV_ENTRY *entries = NULL;
1368         LUID_ATTR luid;
1369
1370         /* remember that the enum_context starts at 0 and not 1 */
1371
1372         if ( enum_context >= num_privs )
1373                 return NT_STATUS_NO_MORE_ENTRIES;
1374                 
1375         DEBUG(10,("_lsa_enum_privs: enum_context:%d total entries:%d\n", 
1376                 enum_context, num_privs));
1377         
1378         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle))
1379                 return NT_STATUS_INVALID_HANDLE;
1380
1381         /* check if the user have enough rights
1382            I don't know if it's the right one. not documented.  */
1383
1384         if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))
1385                 return NT_STATUS_ACCESS_DENIED;
1386
1387         if ( !(entries = TALLOC_ZERO_ARRAY(p->mem_ctx, LSA_PRIV_ENTRY, num_privs )) )
1388                 return NT_STATUS_NO_MEMORY;
1389
1390         for (i = 0; i < num_privs; i++) {
1391                 if( i < enum_context) {
1392                         init_unistr2(&entries[i].name, NULL, UNI_FLAGS_NONE);
1393                         init_uni_hdr(&entries[i].hdr_name, &entries[i].name);
1394                         
1395                         entries[i].luid_low = 0;
1396                         entries[i].luid_high = 0;
1397                 } else {
1398                         init_unistr2(&entries[i].name, privs[i].name, UNI_FLAGS_NONE);
1399                         init_uni_hdr(&entries[i].hdr_name, &entries[i].name);
1400                         
1401                         luid = get_privilege_luid( &privs[i].se_priv );
1402                         
1403                         entries[i].luid_low = luid.luid.low;
1404                         entries[i].luid_high = luid.luid.high;
1405                 }
1406         }
1407
1408         enum_context = num_privs;
1409         
1410         init_lsa_r_enum_privs(r_u, enum_context, num_privs, entries);
1411
1412         return NT_STATUS_OK;
1413 }
1414
1415 /***************************************************************************
1416 _lsa_priv_get_dispname.
1417  ***************************************************************************/
1418
1419 NTSTATUS _lsa_priv_get_dispname(pipes_struct *p, LSA_Q_PRIV_GET_DISPNAME *q_u, LSA_R_PRIV_GET_DISPNAME *r_u)
1420 {
1421         struct lsa_info *handle;
1422         fstring name_asc;
1423         const char *description;
1424
1425         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle))
1426                 return NT_STATUS_INVALID_HANDLE;
1427
1428         /* check if the user have enough rights */
1429
1430         /*
1431          * I don't know if it's the right one. not documented.
1432          */
1433         if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))
1434                 return NT_STATUS_ACCESS_DENIED;
1435
1436         unistr2_to_ascii(name_asc, &q_u->name, sizeof(name_asc));
1437
1438         DEBUG(10,("_lsa_priv_get_dispname: name = %s\n", name_asc));
1439
1440         description = get_privilege_dispname( name_asc );
1441         
1442         if ( description ) {
1443                 DEBUG(10,("_lsa_priv_get_dispname: display name = %s\n", description));
1444                 
1445                 init_unistr2(&r_u->desc, description, UNI_FLAGS_NONE);
1446                 init_uni_hdr(&r_u->hdr_desc, &r_u->desc);
1447
1448                 r_u->ptr_info = 0xdeadbeef;
1449                 r_u->lang_id = q_u->lang_id;
1450                 
1451                 return NT_STATUS_OK;
1452         } else {
1453                 DEBUG(10,("_lsa_priv_get_dispname: doesn't exist\n"));
1454                 
1455                 r_u->ptr_info = 0;
1456                 
1457                 return NT_STATUS_NO_SUCH_PRIVILEGE;
1458         }
1459 }
1460
1461 /***************************************************************************
1462 _lsa_enum_accounts.
1463  ***************************************************************************/
1464
1465 NTSTATUS _lsa_enum_accounts(pipes_struct *p, LSA_Q_ENUM_ACCOUNTS *q_u, LSA_R_ENUM_ACCOUNTS *r_u)
1466 {
1467         struct lsa_info *handle;
1468         DOM_SID *sid_list;
1469         int i, j, num_entries;
1470         LSA_SID_ENUM *sids=&r_u->sids;
1471         NTSTATUS ret;
1472
1473         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle))
1474                 return NT_STATUS_INVALID_HANDLE;
1475
1476         if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))
1477                 return NT_STATUS_ACCESS_DENIED;
1478
1479         sid_list = NULL;
1480         num_entries = 0;
1481
1482         /* The only way we can currently find out all the SIDs that have been
1483            privileged is to scan all privileges */
1484
1485         if (!NT_STATUS_IS_OK(ret = privilege_enumerate_accounts(&sid_list, &num_entries))) {
1486                 return ret;
1487         }
1488
1489         if (q_u->enum_context >= num_entries)
1490                 return NT_STATUS_NO_MORE_ENTRIES;
1491
1492         sids->ptr_sid = TALLOC_ZERO_ARRAY(p->mem_ctx, uint32, num_entries-q_u->enum_context);
1493         sids->sid = TALLOC_ZERO_ARRAY(p->mem_ctx, DOM_SID2, num_entries-q_u->enum_context);
1494
1495         if (sids->ptr_sid==NULL || sids->sid==NULL) {
1496                 SAFE_FREE(sid_list);
1497                 return NT_STATUS_NO_MEMORY;
1498         }
1499
1500         for (i = q_u->enum_context, j = 0; i < num_entries; i++, j++) {
1501                 init_dom_sid2(&(*sids).sid[j], &sid_list[i]);
1502                 (*sids).ptr_sid[j] = 1;
1503         }
1504
1505         SAFE_FREE(sid_list);
1506
1507         init_lsa_r_enum_accounts(r_u, num_entries);
1508
1509         return NT_STATUS_OK;
1510 }
1511
1512
1513 NTSTATUS _lsa_unk_get_connuser(pipes_struct *p, LSA_Q_UNK_GET_CONNUSER *q_u, LSA_R_UNK_GET_CONNUSER *r_u)
1514 {
1515         const char *username, *domname;
1516         user_struct *vuser = get_valid_user_struct(p->vuid);
1517   
1518         if (vuser == NULL)
1519                 return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
1520
1521         if (vuser->guest) {
1522                 /*
1523                  * I'm 99% sure this is not the right place to do this,
1524                  * global_sid_Anonymous should probably be put into the token
1525                  * instead of the guest id -- vl
1526                  */
1527                 if (!lookup_sid(p->mem_ctx, &global_sid_Anonymous,
1528                                 &domname, &username, NULL)) {
1529                         return NT_STATUS_NO_MEMORY;
1530                 }
1531         } else {
1532                 username = vuser->user.smb_name;
1533                 domname = vuser->user.domain;
1534         }
1535   
1536         r_u->ptr_user_name = 1;
1537         init_unistr2(&r_u->uni2_user_name, username, UNI_STR_TERMINATE);
1538         init_uni_hdr(&r_u->hdr_user_name, &r_u->uni2_user_name);
1539
1540         r_u->unk1 = 1;
1541   
1542         r_u->ptr_dom_name = 1;
1543         init_unistr2(&r_u->uni2_dom_name, domname,  UNI_STR_TERMINATE);
1544         init_uni_hdr(&r_u->hdr_dom_name, &r_u->uni2_dom_name);
1545
1546         r_u->status = NT_STATUS_OK;
1547   
1548         return r_u->status;
1549 }
1550
1551 /***************************************************************************
1552  Lsa Create Account 
1553  ***************************************************************************/
1554
1555 NTSTATUS _lsa_create_account(pipes_struct *p, LSA_Q_CREATEACCOUNT *q_u, LSA_R_CREATEACCOUNT *r_u)
1556 {
1557         struct lsa_info *handle;
1558         struct lsa_info *info;
1559
1560         /* find the connection policy handle. */
1561         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle))
1562                 return NT_STATUS_INVALID_HANDLE;
1563
1564         /* check if the user have enough rights */
1565
1566         /*
1567          * I don't know if it's the right one. not documented.
1568          * but guessed with rpcclient.
1569          */
1570         if (!(handle->access & POLICY_GET_PRIVATE_INFORMATION)) {
1571                 DEBUG(10, ("_lsa_create_account: No POLICY_GET_PRIVATE_INFORMATION access right!\n"));
1572                 return NT_STATUS_ACCESS_DENIED;
1573         }
1574
1575         /* check to see if the pipe_user is a Domain Admin since 
1576            account_pol.tdb was already opened as root, this is all we have */
1577            
1578         if ( !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) ) {
1579                 DEBUG(10, ("_lsa_create_account: The use is not a Domain Admin, deny access!\n"));
1580                 return NT_STATUS_ACCESS_DENIED;
1581         }
1582                 
1583         if ( is_privileged_sid( &q_u->sid.sid ) ) {
1584                 DEBUG(10, ("_lsa_create_account: Policy account already exists!\n"));
1585                 return NT_STATUS_OBJECT_NAME_COLLISION;
1586         }
1587
1588         /* associate the user/group SID with the (unique) handle. */
1589         
1590         if ((info = SMB_MALLOC_P(struct lsa_info)) == NULL)
1591                 return NT_STATUS_NO_MEMORY;
1592
1593         ZERO_STRUCTP(info);
1594         info->sid = q_u->sid.sid;
1595         info->access = q_u->access;
1596
1597         /* get a (unique) handle.  open a policy on it. */
1598         if (!create_policy_hnd(p, &r_u->pol, free_lsa_info, (void *)info))
1599                 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1600
1601         DEBUG(10, ("_lsa_create_account: call privileges code to create an account\n"));
1602         return privilege_create_account( &info->sid );
1603 }
1604
1605
1606 /***************************************************************************
1607  Lsa Open Account
1608  ***************************************************************************/
1609
1610 NTSTATUS _lsa_open_account(pipes_struct *p, LSA_Q_OPENACCOUNT *q_u, LSA_R_OPENACCOUNT *r_u)
1611 {
1612         struct lsa_info *handle;
1613         struct lsa_info *info;
1614
1615         /* find the connection policy handle. */
1616         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle))
1617                 return NT_STATUS_INVALID_HANDLE;
1618
1619         /* check if the user have enough rights */
1620
1621         /*
1622          * I don't know if it's the right one. not documented.
1623          * but guessed with rpcclient.
1624          */
1625         if (!(handle->access & POLICY_GET_PRIVATE_INFORMATION))
1626                 return NT_STATUS_ACCESS_DENIED;
1627
1628         /* TODO: Fis the parsing routine before reenabling this check! */
1629         #if 0
1630         if (!lookup_sid(&handle->sid, dom_name, name, &type))
1631                 return NT_STATUS_ACCESS_DENIED;
1632         #endif
1633         /* associate the user/group SID with the (unique) handle. */
1634         if ((info = SMB_MALLOC_P(struct lsa_info)) == NULL)
1635                 return NT_STATUS_NO_MEMORY;
1636
1637         ZERO_STRUCTP(info);
1638         info->sid = q_u->sid.sid;
1639         info->access = q_u->access;
1640
1641         /* get a (unique) handle.  open a policy on it. */
1642         if (!create_policy_hnd(p, &r_u->pol, free_lsa_info, (void *)info))
1643                 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1644
1645         return NT_STATUS_OK;
1646 }
1647
1648 /***************************************************************************
1649  For a given SID, enumerate all the privilege this account has.
1650  ***************************************************************************/
1651
1652 NTSTATUS _lsa_enum_privsaccount(pipes_struct *p, prs_struct *ps, LSA_Q_ENUMPRIVSACCOUNT *q_u, LSA_R_ENUMPRIVSACCOUNT *r_u)
1653 {
1654         struct lsa_info *info=NULL;
1655         SE_PRIV mask;
1656         PRIVILEGE_SET privileges;
1657
1658         /* find the connection policy handle. */
1659         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))
1660                 return NT_STATUS_INVALID_HANDLE;
1661
1662         if ( !get_privileges_for_sids( &mask, &info->sid, 1 ) ) 
1663                 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1664
1665         privilege_set_init( &privileges );
1666
1667         if ( se_priv_to_privilege_set( &privileges, &mask ) ) {
1668
1669                 DEBUG(10,("_lsa_enum_privsaccount: %s has %d privileges\n", 
1670                         sid_string_static(&info->sid), privileges.count));
1671
1672                 r_u->status = init_lsa_r_enum_privsaccount(ps->mem_ctx, r_u, privileges.set, privileges.count, 0);
1673         }
1674         else
1675                 r_u->status = NT_STATUS_NO_SUCH_PRIVILEGE;
1676
1677         privilege_set_free( &privileges );
1678
1679         return r_u->status;
1680 }
1681
1682 /***************************************************************************
1683  
1684  ***************************************************************************/
1685
1686 NTSTATUS _lsa_getsystemaccount(pipes_struct *p, LSA_Q_GETSYSTEMACCOUNT *q_u, LSA_R_GETSYSTEMACCOUNT *r_u)
1687 {
1688         struct lsa_info *info=NULL;
1689
1690         /* find the connection policy handle. */
1691
1692         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))
1693                 return NT_STATUS_INVALID_HANDLE;
1694
1695         if (!lookup_sid(p->mem_ctx, &info->sid, NULL, NULL, NULL))
1696                 return NT_STATUS_OK;
1697
1698         /*
1699           0x01 -> Log on locally
1700           0x02 -> Access this computer from network
1701           0x04 -> Log on as a batch job
1702           0x10 -> Log on as a service
1703           
1704           they can be ORed together
1705         */
1706
1707         r_u->access = PR_LOG_ON_LOCALLY | PR_ACCESS_FROM_NETWORK;
1708
1709         return NT_STATUS_OK;
1710 }
1711
1712 /***************************************************************************
1713   update the systemaccount information
1714  ***************************************************************************/
1715
1716 NTSTATUS _lsa_setsystemaccount(pipes_struct *p, LSA_Q_SETSYSTEMACCOUNT *q_u, LSA_R_SETSYSTEMACCOUNT *r_u)
1717 {
1718         struct lsa_info *info=NULL;
1719         GROUP_MAP map;
1720         r_u->status = NT_STATUS_OK;
1721
1722         /* find the connection policy handle. */
1723         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))
1724                 return NT_STATUS_INVALID_HANDLE;
1725
1726         /* check to see if the pipe_user is a Domain Admin since 
1727            account_pol.tdb was already opened as root, this is all we have */
1728            
1729         if ( !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) )
1730                 return NT_STATUS_ACCESS_DENIED;
1731
1732         if (!pdb_getgrsid(&map, info->sid))
1733                 return NT_STATUS_NO_SUCH_GROUP;
1734
1735         return pdb_update_group_mapping_entry(&map);
1736 }
1737
1738 /***************************************************************************
1739  For a given SID, add some privileges.
1740  ***************************************************************************/
1741
1742 NTSTATUS _lsa_addprivs(pipes_struct *p, LSA_Q_ADDPRIVS *q_u, LSA_R_ADDPRIVS *r_u)
1743 {
1744         struct lsa_info *info = NULL;
1745         SE_PRIV mask;
1746         PRIVILEGE_SET *set = NULL;
1747
1748         /* find the connection policy handle. */
1749         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))
1750                 return NT_STATUS_INVALID_HANDLE;
1751                 
1752         /* check to see if the pipe_user is root or a Domain Admin since 
1753            account_pol.tdb was already opened as root, this is all we have */
1754            
1755         if ( p->pipe_user.ut.uid != sec_initial_uid() 
1756                 && !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) )
1757         {
1758                 return NT_STATUS_ACCESS_DENIED;
1759         }
1760
1761         set = &q_u->set;
1762
1763         if ( !privilege_set_to_se_priv( &mask, set ) )
1764                 return NT_STATUS_NO_SUCH_PRIVILEGE;
1765
1766         if ( !grant_privilege( &info->sid, &mask ) ) {
1767                 DEBUG(3,("_lsa_addprivs: grant_privilege(%s) failed!\n",
1768                         sid_string_static(&info->sid) ));
1769                 DEBUG(3,("Privilege mask:\n"));
1770                 dump_se_priv( DBGC_ALL, 3, &mask );
1771                 return NT_STATUS_NO_SUCH_PRIVILEGE;
1772         }
1773
1774         return NT_STATUS_OK;
1775 }
1776
1777 /***************************************************************************
1778  For a given SID, remove some privileges.
1779  ***************************************************************************/
1780
1781 NTSTATUS _lsa_removeprivs(pipes_struct *p, LSA_Q_REMOVEPRIVS *q_u, LSA_R_REMOVEPRIVS *r_u)
1782 {
1783         struct lsa_info *info = NULL;
1784         SE_PRIV mask;
1785         PRIVILEGE_SET *set = NULL;
1786
1787         /* find the connection policy handle. */
1788         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))
1789                 return NT_STATUS_INVALID_HANDLE;
1790
1791         /* check to see if the pipe_user is root or a Domain Admin since 
1792            account_pol.tdb was already opened as root, this is all we have */
1793            
1794         if ( p->pipe_user.ut.uid != sec_initial_uid()
1795                 && !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) ) 
1796         {
1797                 return NT_STATUS_ACCESS_DENIED;
1798         }
1799
1800         set = &q_u->set;
1801
1802         if ( !privilege_set_to_se_priv( &mask, set ) )
1803                 return NT_STATUS_NO_SUCH_PRIVILEGE;
1804
1805         if ( !revoke_privilege( &info->sid, &mask ) ) {
1806                 DEBUG(3,("_lsa_removeprivs: revoke_privilege(%s) failed!\n",
1807                         sid_string_static(&info->sid) ));
1808                 DEBUG(3,("Privilege mask:\n"));
1809                 dump_se_priv( DBGC_ALL, 3, &mask );
1810                 return NT_STATUS_NO_SUCH_PRIVILEGE;
1811         }
1812
1813         return NT_STATUS_OK;
1814 }
1815
1816 /***************************************************************************
1817  For a given SID, remove some privileges.
1818  ***************************************************************************/
1819
1820 NTSTATUS _lsa_query_secobj(pipes_struct *p, LSA_Q_QUERY_SEC_OBJ *q_u, LSA_R_QUERY_SEC_OBJ *r_u)
1821 {
1822         struct lsa_info *handle=NULL;
1823         SEC_DESC *psd = NULL;
1824         size_t sd_size;
1825         NTSTATUS status;
1826
1827         r_u->status = NT_STATUS_OK;
1828
1829         /* find the connection policy handle. */
1830         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle))
1831                 return NT_STATUS_INVALID_HANDLE;
1832
1833         /* check if the user have enough rights */
1834         if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))
1835                 return NT_STATUS_ACCESS_DENIED;
1836
1837
1838         switch (q_u->sec_info) {
1839         case 1:
1840                 /* SD contains only the owner */
1841
1842                 status=lsa_get_generic_sd(p->mem_ctx, &psd, &sd_size);
1843                 if(!NT_STATUS_IS_OK(status))
1844                         return NT_STATUS_NO_MEMORY;
1845
1846
1847                 if((r_u->buf = make_sec_desc_buf(p->mem_ctx, sd_size, psd)) == NULL)
1848                         return NT_STATUS_NO_MEMORY;
1849                 break;
1850         case 4:
1851                 /* SD contains only the ACL */
1852
1853                 status=lsa_get_generic_sd(p->mem_ctx, &psd, &sd_size);
1854                 if(!NT_STATUS_IS_OK(status))
1855                         return NT_STATUS_NO_MEMORY;
1856
1857                 if((r_u->buf = make_sec_desc_buf(p->mem_ctx, sd_size, psd)) == NULL)
1858                         return NT_STATUS_NO_MEMORY;
1859                 break;
1860         default:
1861                 return NT_STATUS_INVALID_LEVEL;
1862         }
1863
1864         r_u->ptr=1;
1865
1866         return r_u->status;
1867 }
1868
1869 #if 0   /* AD DC work in ongoing in Samba 4 */
1870
1871 /***************************************************************************
1872  ***************************************************************************/
1873
1874 NTSTATUS _lsa_query_info2(pipes_struct *p, LSA_Q_QUERY_INFO2 *q_u, LSA_R_QUERY_INFO2 *r_u)
1875 {
1876         struct lsa_info *handle;
1877         const char *nb_name;
1878         char *dns_name = NULL;
1879         char *forest_name = NULL;
1880         DOM_SID *sid = NULL;
1881         struct GUID guid;
1882         fstring dnsdomname;
1883
1884         ZERO_STRUCT(guid);
1885         r_u->status = NT_STATUS_OK;
1886
1887         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle))
1888                 return NT_STATUS_INVALID_HANDLE;
1889
1890         switch (q_u->info_class) {
1891         case 0x0c:
1892                 /* check if the user have enough rights */
1893                 if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))
1894                         return NT_STATUS_ACCESS_DENIED;
1895
1896                 /* Request PolicyPrimaryDomainInformation. */
1897                 switch (lp_server_role()) {
1898                         case ROLE_DOMAIN_PDC:
1899                         case ROLE_DOMAIN_BDC:
1900                                 nb_name = get_global_sam_name();
1901                                 /* ugly temp hack for these next two */
1902
1903                                 /* This should be a 'netbios domain -> DNS domain' mapping */
1904                                 dnsdomname[0] = '\0';
1905                                 get_mydnsdomname(dnsdomname);
1906                                 strlower_m(dnsdomname);
1907                                 
1908                                 dns_name = dnsdomname;
1909                                 forest_name = dnsdomname;
1910
1911                                 sid = get_global_sam_sid();
1912                                 secrets_fetch_domain_guid(lp_workgroup(), &guid);
1913                                 break;
1914                         default:
1915                                 return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
1916                 }
1917                 init_dns_dom_info(&r_u->info.dns_dom_info, nb_name, dns_name, 
1918                                   forest_name,&guid,sid);
1919                 break;
1920         default:
1921                 DEBUG(0,("_lsa_query_info2: unknown info level in Lsa Query: %d\n", q_u->info_class));
1922                 r_u->status = NT_STATUS_INVALID_INFO_CLASS;
1923                 break;
1924         }
1925
1926         if (NT_STATUS_IS_OK(r_u->status)) {
1927                 r_u->ptr = 0x1;
1928                 r_u->info_class = q_u->info_class;
1929         }
1930
1931         return r_u->status;
1932 }
1933 #endif  /* AD DC work in ongoing in Samba 4 */
1934
1935 /***************************************************************************
1936  ***************************************************************************/
1937
1938 NTSTATUS _lsa_add_acct_rights(pipes_struct *p, LSA_Q_ADD_ACCT_RIGHTS *q_u, LSA_R_ADD_ACCT_RIGHTS *r_u)
1939 {
1940         struct lsa_info *info = NULL;
1941         int i = 0;
1942         DOM_SID sid;
1943         fstring privname;
1944         UNISTR4_ARRAY *uni_privnames = q_u->rights;
1945         
1946
1947         /* find the connection policy handle. */
1948         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))
1949                 return NT_STATUS_INVALID_HANDLE;
1950                 
1951         /* check to see if the pipe_user is a Domain Admin since 
1952            account_pol.tdb was already opened as root, this is all we have */
1953            
1954         if ( p->pipe_user.ut.uid != sec_initial_uid()
1955                 && !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) ) 
1956         {
1957                 return NT_STATUS_ACCESS_DENIED;
1958         }
1959
1960         /* according to an NT4 PDC, you can add privileges to SIDs even without
1961            call_lsa_create_account() first.  And you can use any arbitrary SID. */
1962            
1963         sid_copy( &sid, &q_u->sid.sid );
1964         
1965         /* just a little sanity check */
1966         
1967         if ( q_u->count != uni_privnames->count ) {
1968                 DEBUG(0,("_lsa_add_acct_rights: count != number of UNISTR2 elements!\n"));
1969                 return NT_STATUS_INVALID_HANDLE;        
1970         }
1971                 
1972         for ( i=0; i<q_u->count; i++ ) {
1973                 UNISTR4 *uni4_str = &uni_privnames->strings[i];
1974
1975                 /* only try to add non-null strings */
1976
1977                 if ( !uni4_str->string )
1978                         continue;
1979
1980                 rpcstr_pull( privname, uni4_str->string->buffer, sizeof(privname), -1, STR_TERMINATE );
1981                 
1982                 if ( !grant_privilege_by_name( &sid, privname ) ) {
1983                         DEBUG(2,("_lsa_add_acct_rights: Failed to add privilege [%s]\n", privname ));
1984                         return NT_STATUS_NO_SUCH_PRIVILEGE;
1985                 }
1986         }
1987
1988         return NT_STATUS_OK;
1989 }
1990
1991 /***************************************************************************
1992  ***************************************************************************/
1993
1994 NTSTATUS _lsa_remove_acct_rights(pipes_struct *p, LSA_Q_REMOVE_ACCT_RIGHTS *q_u, LSA_R_REMOVE_ACCT_RIGHTS *r_u)
1995 {
1996         struct lsa_info *info = NULL;
1997         int i = 0;
1998         DOM_SID sid;
1999         fstring privname;
2000         UNISTR4_ARRAY *uni_privnames = q_u->rights;
2001         
2002
2003         /* find the connection policy handle. */
2004         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))
2005                 return NT_STATUS_INVALID_HANDLE;
2006                 
2007         /* check to see if the pipe_user is a Domain Admin since 
2008            account_pol.tdb was already opened as root, this is all we have */
2009            
2010         if ( p->pipe_user.ut.uid != sec_initial_uid()
2011                 && !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) )
2012         {
2013                 return NT_STATUS_ACCESS_DENIED;
2014         }
2015
2016         sid_copy( &sid, &q_u->sid.sid );
2017
2018         if ( q_u->removeall ) {
2019                 if ( !revoke_all_privileges( &sid ) ) 
2020                         return NT_STATUS_ACCESS_DENIED;
2021         
2022                 return NT_STATUS_OK;
2023         }
2024         
2025         /* just a little sanity check */
2026         
2027         if ( q_u->count != uni_privnames->count ) {
2028                 DEBUG(0,("_lsa_add_acct_rights: count != number of UNISTR2 elements!\n"));
2029                 return NT_STATUS_INVALID_HANDLE;        
2030         }
2031                 
2032         for ( i=0; i<q_u->count; i++ ) {
2033                 UNISTR4 *uni4_str = &uni_privnames->strings[i];
2034
2035                 /* only try to add non-null strings */
2036
2037                 if ( !uni4_str->string )
2038                         continue;
2039
2040                 rpcstr_pull( privname, uni4_str->string->buffer, sizeof(privname), -1, STR_TERMINATE );
2041                 
2042                 if ( !revoke_privilege_by_name( &sid, privname ) ) {
2043                         DEBUG(2,("_lsa_remove_acct_rights: Failed to revoke privilege [%s]\n", privname ));
2044                         return NT_STATUS_NO_SUCH_PRIVILEGE;
2045                 }
2046         }
2047
2048         return NT_STATUS_OK;
2049 }
2050
2051
2052 /***************************************************************************
2053  ***************************************************************************/
2054
2055 NTSTATUS _lsa_enum_acct_rights(pipes_struct *p, LSA_Q_ENUM_ACCT_RIGHTS *q_u, LSA_R_ENUM_ACCT_RIGHTS *r_u)
2056 {
2057         struct lsa_info *info = NULL;
2058         DOM_SID sid;
2059         PRIVILEGE_SET privileges;
2060         SE_PRIV mask;
2061         
2062
2063         /* find the connection policy handle. */
2064         
2065         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))
2066                 return NT_STATUS_INVALID_HANDLE;
2067                 
2068         /* according to an NT4 PDC, you can add privileges to SIDs even without
2069            call_lsa_create_account() first.  And you can use any arbitrary SID. */
2070            
2071         sid_copy( &sid, &q_u->sid.sid );
2072         
2073         if ( !get_privileges_for_sids( &mask, &sid, 1 ) )
2074                 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
2075
2076         privilege_set_init( &privileges );
2077
2078         if ( se_priv_to_privilege_set( &privileges, &mask ) ) {
2079
2080                 DEBUG(10,("_lsa_enum_acct_rights: %s has %d privileges\n", 
2081                         sid_string_static(&sid), privileges.count));
2082
2083                 r_u->status = init_r_enum_acct_rights( r_u, &privileges );
2084         }
2085         else 
2086                 r_u->status = NT_STATUS_NO_SUCH_PRIVILEGE;
2087
2088         privilege_set_free( &privileges );
2089
2090         return r_u->status;
2091 }
2092
2093
2094 /***************************************************************************
2095  ***************************************************************************/
2096
2097 NTSTATUS _lsa_lookup_priv_value(pipes_struct *p, LSA_Q_LOOKUP_PRIV_VALUE *q_u, LSA_R_LOOKUP_PRIV_VALUE *r_u)
2098 {
2099         struct lsa_info *info = NULL;
2100         fstring name;
2101         LUID_ATTR priv_luid;
2102         SE_PRIV mask;
2103         
2104         /* find the connection policy handle. */
2105         
2106         if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))
2107                 return NT_STATUS_INVALID_HANDLE;
2108                 
2109         unistr2_to_ascii(name, &q_u->privname.unistring, sizeof(name));
2110         
2111         DEBUG(10,("_lsa_lookup_priv_value: name = %s\n", name));
2112
2113         if ( !se_priv_from_name( name, &mask ) )
2114                 return NT_STATUS_NO_SUCH_PRIVILEGE;
2115
2116         priv_luid = get_privilege_luid( &mask );
2117
2118         r_u->luid.low  = priv_luid.luid.low;
2119         r_u->luid.high = priv_luid.luid.high;
2120                 
2121
2122         return NT_STATUS_OK;
2123 }
2124
2125
2126 /*
2127  * From here on the server routines are just dummy ones to make smbd link with
2128  * librpc/gen_ndr/srv_lsa.c. These routines are actually never called, we are
2129  * pulling the server stubs across one by one.
2130  */ 
2131
2132 NTSTATUS _lsa_Delete(pipes_struct *p, struct lsa_Delete *r)
2133 {
2134         p->rng_fault_state = True;
2135         return NT_STATUS_NOT_IMPLEMENTED;
2136 }
2137
2138 NTSTATUS _lsa_EnumPrivs(pipes_struct *p, struct lsa_EnumPrivs *r)
2139 {
2140         p->rng_fault_state = True;
2141         return NT_STATUS_NOT_IMPLEMENTED;
2142 }
2143
2144 NTSTATUS _lsa_QuerySecurity(pipes_struct *p, struct lsa_QuerySecurity *r)
2145 {
2146         p->rng_fault_state = True;
2147         return NT_STATUS_NOT_IMPLEMENTED;
2148 }
2149
2150 NTSTATUS _lsa_SetSecObj(pipes_struct *p, struct lsa_SetSecObj *r)
2151 {
2152         p->rng_fault_state = True;
2153         return NT_STATUS_NOT_IMPLEMENTED;
2154 }
2155
2156 NTSTATUS _lsa_ChangePassword(pipes_struct *p, struct lsa_ChangePassword *r)
2157 {
2158         p->rng_fault_state = True;
2159         return NT_STATUS_NOT_IMPLEMENTED;
2160 }
2161
2162 NTSTATUS _lsa_OpenPolicy(pipes_struct *p, struct lsa_OpenPolicy *r)
2163 {
2164         p->rng_fault_state = True;
2165         return NT_STATUS_NOT_IMPLEMENTED;
2166 }
2167
2168 NTSTATUS _lsa_QueryInfoPolicy(pipes_struct *p, struct lsa_QueryInfoPolicy *r)
2169 {
2170         p->rng_fault_state = True;
2171         return NT_STATUS_NOT_IMPLEMENTED;
2172 }
2173
2174 NTSTATUS _lsa_SetInfoPolicy(pipes_struct *p, struct lsa_SetInfoPolicy *r)
2175 {
2176         p->rng_fault_state = True;
2177         return NT_STATUS_NOT_IMPLEMENTED;
2178 }
2179
2180 NTSTATUS _lsa_ClearAuditLog(pipes_struct *p, struct lsa_ClearAuditLog *r)
2181 {
2182         p->rng_fault_state = True;
2183         return NT_STATUS_NOT_IMPLEMENTED;
2184 }
2185
2186 NTSTATUS _lsa_CreateAccount(pipes_struct *p, struct lsa_CreateAccount *r)
2187 {
2188         p->rng_fault_state = True;
2189         return NT_STATUS_NOT_IMPLEMENTED;
2190 }
2191
2192 NTSTATUS _lsa_EnumAccounts(pipes_struct *p, struct lsa_EnumAccounts *r)
2193 {
2194         p->rng_fault_state = True;
2195         return NT_STATUS_NOT_IMPLEMENTED;
2196 }
2197
2198 NTSTATUS _lsa_EnumTrustDom(pipes_struct *p, struct lsa_EnumTrustDom *r)
2199 {
2200         p->rng_fault_state = True;
2201         return NT_STATUS_NOT_IMPLEMENTED;
2202 }
2203
2204 NTSTATUS _lsa_LookupNames(pipes_struct *p, struct lsa_LookupNames *r)
2205 {
2206         p->rng_fault_state = True;
2207         return NT_STATUS_NOT_IMPLEMENTED;
2208 }
2209
2210 NTSTATUS _lsa_LookupSids(pipes_struct *p, struct lsa_LookupSids *r)
2211 {
2212         p->rng_fault_state = True;
2213         return NT_STATUS_NOT_IMPLEMENTED;
2214 }
2215
2216 NTSTATUS _lsa_OpenAccount(pipes_struct *p, struct lsa_OpenAccount *r)
2217 {
2218         p->rng_fault_state = True;
2219         return NT_STATUS_NOT_IMPLEMENTED;
2220 }
2221
2222 NTSTATUS _lsa_EnumPrivsAccount(pipes_struct *p, struct lsa_EnumPrivsAccount *r)
2223 {
2224         p->rng_fault_state = True;
2225         return NT_STATUS_NOT_IMPLEMENTED;
2226 }
2227
2228 NTSTATUS _lsa_AddPrivilegesToAccount(pipes_struct *p, struct lsa_AddPrivilegesToAccount *r)
2229 {
2230         p->rng_fault_state = True;
2231         return NT_STATUS_NOT_IMPLEMENTED;
2232 }
2233
2234 NTSTATUS _lsa_RemovePrivilegesFromAccount(pipes_struct *p, struct lsa_RemovePrivilegesFromAccount *r)
2235 {
2236         p->rng_fault_state = True;
2237         return NT_STATUS_NOT_IMPLEMENTED;
2238 }
2239
2240 NTSTATUS _lsa_GetQuotasForAccount(pipes_struct *p, struct lsa_GetQuotasForAccount *r)
2241 {
2242         p->rng_fault_state = True;
2243         return NT_STATUS_NOT_IMPLEMENTED;
2244 }
2245
2246 NTSTATUS _lsa_SetQuotasForAccount(pipes_struct *p, struct lsa_SetQuotasForAccount *r)
2247 {
2248         p->rng_fault_state = True;
2249         return NT_STATUS_NOT_IMPLEMENTED;
2250 }
2251
2252 NTSTATUS _lsa_GetSystemAccessAccount(pipes_struct *p, struct lsa_GetSystemAccessAccount *r)
2253 {
2254         p->rng_fault_state = True;
2255         return NT_STATUS_NOT_IMPLEMENTED;
2256 }
2257
2258 NTSTATUS _lsa_SetSystemAccessAccount(pipes_struct *p, struct lsa_SetSystemAccessAccount *r)
2259 {
2260         p->rng_fault_state = True;
2261         return NT_STATUS_NOT_IMPLEMENTED;
2262 }
2263
2264 NTSTATUS _lsa_QueryTrustedDomainInfo(pipes_struct *p, struct lsa_QueryTrustedDomainInfo *r)
2265 {
2266         p->rng_fault_state = True;
2267         return NT_STATUS_NOT_IMPLEMENTED;
2268 }
2269
2270 NTSTATUS _lsa_SetInformationTrustedDomain(pipes_struct *p, struct lsa_SetInformationTrustedDomain *r)
2271 {
2272         p->rng_fault_state = True;
2273         return NT_STATUS_NOT_IMPLEMENTED;
2274 }
2275
2276 NTSTATUS _lsa_QuerySecret(pipes_struct *p, struct lsa_QuerySecret *r)
2277 {
2278         p->rng_fault_state = True;
2279         return NT_STATUS_NOT_IMPLEMENTED;
2280 }
2281
2282 NTSTATUS _lsa_LookupPrivValue(pipes_struct *p, struct lsa_LookupPrivValue *r)
2283 {
2284         p->rng_fault_state = True;
2285         return NT_STATUS_NOT_IMPLEMENTED;
2286 }
2287
2288 NTSTATUS _lsa_LookupPrivName(pipes_struct *p, struct lsa_LookupPrivName *r)
2289 {
2290         p->rng_fault_state = True;
2291         return NT_STATUS_NOT_IMPLEMENTED;
2292 }
2293
2294 NTSTATUS _lsa_LookupPrivDisplayName(pipes_struct *p, struct lsa_LookupPrivDisplayName *r)
2295 {
2296         p->rng_fault_state = True;
2297         return NT_STATUS_NOT_IMPLEMENTED;
2298 }
2299
2300 NTSTATUS _lsa_DeleteObject(pipes_struct *p, struct lsa_DeleteObject *r)
2301 {
2302         p->rng_fault_state = True;
2303         return NT_STATUS_NOT_IMPLEMENTED;
2304 }
2305
2306 NTSTATUS _lsa_EnumAccountsWithUserRight(pipes_struct *p, struct lsa_EnumAccountsWithUserRight *r)
2307 {
2308         p->rng_fault_state = True;
2309         return NT_STATUS_NOT_IMPLEMENTED;
2310 }
2311
2312 NTSTATUS _lsa_EnumAccountRights(pipes_struct *p, struct lsa_EnumAccountRights *r)
2313 {
2314         p->rng_fault_state = True;
2315         return NT_STATUS_NOT_IMPLEMENTED;
2316 }
2317
2318 NTSTATUS _lsa_AddAccountRights(pipes_struct *p, struct lsa_AddAccountRights *r)
2319 {
2320         p->rng_fault_state = True;
2321         return NT_STATUS_NOT_IMPLEMENTED;
2322 }
2323
2324 NTSTATUS _lsa_RemoveAccountRights(pipes_struct *p, struct lsa_RemoveAccountRights *r)
2325 {
2326         p->rng_fault_state = True;
2327         return NT_STATUS_NOT_IMPLEMENTED;
2328 }
2329
2330 NTSTATUS _lsa_QueryTrustedDomainInfoBySid(pipes_struct *p, struct lsa_QueryTrustedDomainInfoBySid *r)
2331 {
2332         p->rng_fault_state = True;
2333         return NT_STATUS_NOT_IMPLEMENTED;
2334 }
2335
2336 NTSTATUS _lsa_SetTrustedDomainInfo(pipes_struct *p, struct lsa_SetTrustedDomainInfo *r)
2337 {
2338         p->rng_fault_state = True;
2339         return NT_STATUS_NOT_IMPLEMENTED;
2340 }
2341
2342 NTSTATUS _lsa_DeleteTrustedDomain(pipes_struct *p, struct lsa_DeleteTrustedDomain *r)
2343 {
2344         p->rng_fault_state = True;
2345         return NT_STATUS_NOT_IMPLEMENTED;
2346 }
2347
2348 NTSTATUS _lsa_StorePrivateData(pipes_struct *p, struct lsa_StorePrivateData *r)
2349 {
2350         p->rng_fault_state = True;
2351         return NT_STATUS_NOT_IMPLEMENTED;
2352 }
2353
2354 NTSTATUS _lsa_RetrievePrivateData(pipes_struct *p, struct lsa_RetrievePrivateData *r)
2355 {
2356         p->rng_fault_state = True;
2357         return NT_STATUS_NOT_IMPLEMENTED;
2358 }
2359
2360 NTSTATUS _lsa_OpenPolicy2(pipes_struct *p, struct lsa_OpenPolicy2 *r)
2361 {
2362         p->rng_fault_state = True;
2363         return NT_STATUS_NOT_IMPLEMENTED;
2364 }
2365
2366 NTSTATUS _lsa_GetUserName(pipes_struct *p, struct lsa_GetUserName *r)
2367 {
2368         p->rng_fault_state = True;
2369         return NT_STATUS_NOT_IMPLEMENTED;
2370 }
2371
2372 NTSTATUS _lsa_QueryInfoPolicy2(pipes_struct *p, struct lsa_QueryInfoPolicy2 *r)
2373 {
2374         p->rng_fault_state = True;
2375         return NT_STATUS_NOT_IMPLEMENTED;
2376 }
2377
2378 NTSTATUS _lsa_SetInfoPolicy2(pipes_struct *p, struct lsa_SetInfoPolicy2 *r)
2379 {
2380         p->rng_fault_state = True;
2381         return NT_STATUS_NOT_IMPLEMENTED;
2382 }
2383
2384 NTSTATUS _lsa_QueryTrustedDomainInfoByName(pipes_struct *p, struct lsa_QueryTrustedDomainInfoByName *r)
2385 {
2386         p->rng_fault_state = True;
2387         return NT_STATUS_NOT_IMPLEMENTED;
2388 }
2389
2390 NTSTATUS _lsa_SetTrustedDomainInfoByName(pipes_struct *p, struct lsa_SetTrustedDomainInfoByName *r)
2391 {
2392         p->rng_fault_state = True;
2393         return NT_STATUS_NOT_IMPLEMENTED;
2394 }
2395
2396 NTSTATUS _lsa_EnumTrustedDomainsEx(pipes_struct *p, struct lsa_EnumTrustedDomainsEx *r)
2397 {
2398         p->rng_fault_state = True;
2399         return NT_STATUS_NOT_IMPLEMENTED;
2400 }
2401
2402 NTSTATUS _lsa_CreateTrustedDomainEx(pipes_struct *p, struct lsa_CreateTrustedDomainEx *r)
2403 {
2404         p->rng_fault_state = True;
2405         return NT_STATUS_NOT_IMPLEMENTED;
2406 }
2407
2408 NTSTATUS _lsa_CloseTrustedDomainEx(pipes_struct *p, struct lsa_CloseTrustedDomainEx *r)
2409 {
2410         p->rng_fault_state = True;
2411         return NT_STATUS_NOT_IMPLEMENTED;
2412 }
2413
2414 NTSTATUS _lsa_QueryDomainInformationPolicy(pipes_struct *p, struct lsa_QueryDomainInformationPolicy *r)
2415 {
2416         p->rng_fault_state = True;
2417         return NT_STATUS_NOT_IMPLEMENTED;
2418 }
2419
2420 NTSTATUS _lsa_SetDomainInformationPolicy(pipes_struct *p, struct lsa_SetDomainInformationPolicy *r)
2421 {
2422         p->rng_fault_state = True;
2423         return NT_STATUS_NOT_IMPLEMENTED;
2424 }
2425
2426 NTSTATUS _lsa_OpenTrustedDomainByName(pipes_struct *p, struct lsa_OpenTrustedDomainByName *r)
2427 {
2428         p->rng_fault_state = True;
2429         return NT_STATUS_NOT_IMPLEMENTED;
2430 }
2431
2432 NTSTATUS _lsa_TestCall(pipes_struct *p, struct lsa_TestCall *r)
2433 {
2434         p->rng_fault_state = True;
2435         return NT_STATUS_NOT_IMPLEMENTED;
2436 }
2437
2438 NTSTATUS _lsa_LookupSids2(pipes_struct *p, struct lsa_LookupSids2 *r)
2439 {
2440         p->rng_fault_state = True;
2441         return NT_STATUS_NOT_IMPLEMENTED;
2442 }
2443
2444 NTSTATUS _lsa_LookupNames2(pipes_struct *p, struct lsa_LookupNames2 *r)
2445 {
2446         p->rng_fault_state = True;
2447         return NT_STATUS_NOT_IMPLEMENTED;
2448 }
2449
2450 NTSTATUS _lsa_CreateTrustedDomainEx2(pipes_struct *p, struct lsa_CreateTrustedDomainEx2 *r)
2451 {
2452         p->rng_fault_state = True;
2453         return NT_STATUS_NOT_IMPLEMENTED;
2454 }
2455
2456 NTSTATUS _lsa_CREDRWRITE(pipes_struct *p, struct lsa_CREDRWRITE *r)
2457 {
2458         p->rng_fault_state = True;
2459         return NT_STATUS_NOT_IMPLEMENTED;
2460 }
2461
2462 NTSTATUS _lsa_CREDRREAD(pipes_struct *p, struct lsa_CREDRREAD *r)
2463 {
2464         p->rng_fault_state = True;
2465         return NT_STATUS_NOT_IMPLEMENTED;
2466 }
2467
2468 NTSTATUS _lsa_CREDRENUMERATE(pipes_struct *p, struct lsa_CREDRENUMERATE *r)
2469 {
2470         p->rng_fault_state = True;
2471         return NT_STATUS_NOT_IMPLEMENTED;
2472 }
2473
2474 NTSTATUS _lsa_CREDRWRITEDOMAINCREDENTIALS(pipes_struct *p, struct lsa_CREDRWRITEDOMAINCREDENTIALS *r)
2475 {
2476         p->rng_fault_state = True;
2477         return NT_STATUS_NOT_IMPLEMENTED;
2478 }
2479
2480 NTSTATUS _lsa_CREDRREADDOMAINCREDENTIALS(pipes_struct *p, struct lsa_CREDRREADDOMAINCREDENTIALS *r)
2481 {
2482         p->rng_fault_state = True;
2483         return NT_STATUS_NOT_IMPLEMENTED;
2484 }
2485
2486 NTSTATUS _lsa_CREDRDELETE(pipes_struct *p, struct lsa_CREDRDELETE *r)
2487 {
2488         p->rng_fault_state = True;
2489         return NT_STATUS_NOT_IMPLEMENTED;
2490 }
2491
2492 NTSTATUS _lsa_CREDRGETTARGETINFO(pipes_struct *p, struct lsa_CREDRGETTARGETINFO *r)
2493 {
2494         p->rng_fault_state = True;
2495         return NT_STATUS_NOT_IMPLEMENTED;
2496 }
2497
2498 NTSTATUS _lsa_CREDRPROFILELOADED(pipes_struct *p, struct lsa_CREDRPROFILELOADED *r)
2499 {
2500         p->rng_fault_state = True;
2501         return NT_STATUS_NOT_IMPLEMENTED;
2502 }
2503
2504 NTSTATUS _lsa_LookupNames3(pipes_struct *p, struct lsa_LookupNames3 *r)
2505 {
2506         p->rng_fault_state = True;
2507         return NT_STATUS_NOT_IMPLEMENTED;
2508 }
2509
2510 NTSTATUS _lsa_CREDRGETSESSIONTYPES(pipes_struct *p, struct lsa_CREDRGETSESSIONTYPES *r)
2511 {
2512         p->rng_fault_state = True;
2513         return NT_STATUS_NOT_IMPLEMENTED;
2514 }
2515
2516 NTSTATUS _lsa_LSARREGISTERAUDITEVENT(pipes_struct *p, struct lsa_LSARREGISTERAUDITEVENT *r)
2517 {
2518         p->rng_fault_state = True;
2519         return NT_STATUS_NOT_IMPLEMENTED;
2520 }
2521
2522 NTSTATUS _lsa_LSARGENAUDITEVENT(pipes_struct *p, struct lsa_LSARGENAUDITEVENT *r)
2523 {
2524         p->rng_fault_state = True;
2525         return NT_STATUS_NOT_IMPLEMENTED;
2526 }
2527
2528 NTSTATUS _lsa_LSARUNREGISTERAUDITEVENT(pipes_struct *p, struct lsa_LSARUNREGISTERAUDITEVENT *r)
2529 {
2530         p->rng_fault_state = True;
2531         return NT_STATUS_NOT_IMPLEMENTED;
2532 }
2533
2534 NTSTATUS _lsa_LSARQUERYFORESTTRUSTINFORMATION(pipes_struct *p, struct lsa_LSARQUERYFORESTTRUSTINFORMATION *r)
2535 {
2536         p->rng_fault_state = True;
2537         return NT_STATUS_NOT_IMPLEMENTED;
2538 }
2539
2540 NTSTATUS _lsa_LSARSETFORESTTRUSTINFORMATION(pipes_struct *p, struct lsa_LSARSETFORESTTRUSTINFORMATION *r)
2541 {
2542         p->rng_fault_state = True;
2543         return NT_STATUS_NOT_IMPLEMENTED;
2544 }
2545
2546 NTSTATUS _lsa_CREDRRENAME(pipes_struct *p, struct lsa_CREDRRENAME *r)
2547 {
2548         p->rng_fault_state = True;
2549         return NT_STATUS_NOT_IMPLEMENTED;
2550 }
2551
2552 NTSTATUS _lsa_LookupSids3(pipes_struct *p, struct lsa_LookupSids3 *r)
2553 {
2554         p->rng_fault_state = True;
2555         return NT_STATUS_NOT_IMPLEMENTED;
2556 }
2557
2558 NTSTATUS _lsa_LookupNames4(pipes_struct *p, struct lsa_LookupNames4 *r)
2559 {
2560         p->rng_fault_state = True;
2561         return NT_STATUS_NOT_IMPLEMENTED;
2562 }
2563
2564 NTSTATUS _lsa_LSAROPENPOLICYSCE(pipes_struct *p, struct lsa_LSAROPENPOLICYSCE *r)
2565 {
2566         p->rng_fault_state = True;
2567         return NT_STATUS_NOT_IMPLEMENTED;
2568 }
2569
2570 NTSTATUS _lsa_LSARADTREGISTERSECURITYEVENTSOURCE(pipes_struct *p, struct lsa_LSARADTREGISTERSECURITYEVENTSOURCE *r)
2571 {
2572         p->rng_fault_state = True;
2573         return NT_STATUS_NOT_IMPLEMENTED;
2574 }
2575
2576 NTSTATUS _lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE(pipes_struct *p, struct lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE *r)
2577 {
2578         p->rng_fault_state = True;
2579         return NT_STATUS_NOT_IMPLEMENTED;
2580 }
2581
2582 NTSTATUS _lsa_LSARADTREPORTSECURITYEVENT(pipes_struct *p, struct lsa_LSARADTREPORTSECURITYEVENT *r)
2583 {
2584         p->rng_fault_state = True;
2585         return NT_STATUS_NOT_IMPLEMENTED;
2586 }