winbind: Use idmap_config_const_string in idmap_init_domain
[amitay/samba.git] / source3 / winbindd / winbindd_msrpc.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    Winbind rpc backend functions
5
6    Copyright (C) Tim Potter 2000-2001,2003
7    Copyright (C) Andrew Tridgell 2001
8    Copyright (C) Volker Lendecke 2005
9    Copyright (C) Guenther Deschner 2008 (pidl conversion)
10
11    This program is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 3 of the License, or
14    (at your option) any later version.
15
16    This program is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with this program.  If not, see <http://www.gnu.org/licenses/>.
23 */
24
25 #include "includes.h"
26 #include "winbindd.h"
27 #include "winbindd_rpc.h"
28
29 #include "../librpc/gen_ndr/ndr_samr_c.h"
30 #include "rpc_client/cli_pipe.h"
31 #include "rpc_client/cli_samr.h"
32 #include "rpc_client/cli_lsarpc.h"
33 #include "../libcli/security/security.h"
34 #include "libsmb/samlogon_cache.h"
35
36 #undef DBGC_CLASS
37 #define DBGC_CLASS DBGC_WINBIND
38
39 static NTSTATUS winbindd_lookup_names(TALLOC_CTX *mem_ctx,
40                                       struct winbindd_domain *domain,
41                                       uint32_t num_names,
42                                       const char **names,
43                                       const char ***domains,
44                                       struct dom_sid **sids,
45                                       enum lsa_SidType **types);
46
47 /* Query display info for a domain.  This returns enough information plus a
48    bit extra to give an overview of domain users for the User Manager
49    application. */
50 static NTSTATUS msrpc_query_user_list(struct winbindd_domain *domain,
51                                       TALLOC_CTX *mem_ctx,
52                                       uint32_t **prids)
53 {
54         struct rpc_pipe_client *samr_pipe = NULL;
55         struct policy_handle dom_pol;
56         uint32_t *rids = NULL;
57         TALLOC_CTX *tmp_ctx;
58         NTSTATUS status;
59
60         DEBUG(3, ("msrpc_query_user_list\n"));
61
62         tmp_ctx = talloc_stackframe();
63         if (tmp_ctx == NULL) {
64                 return NT_STATUS_NO_MEMORY;
65         }
66
67         if ( !winbindd_can_contact_domain( domain ) ) {
68                 DEBUG(10,("query_user_list: No incoming trust for domain %s\n",
69                           domain->name));
70                 status = NT_STATUS_OK;
71                 goto done;
72         }
73
74         status = cm_connect_sam(domain, tmp_ctx, false, &samr_pipe, &dom_pol);
75         if (!NT_STATUS_IS_OK(status)) {
76                 goto done;
77         }
78
79         status = rpc_query_user_list(tmp_ctx,
80                                      samr_pipe,
81                                      &dom_pol,
82                                      &domain->sid,
83                                      &rids);
84         if (!NT_STATUS_IS_OK(status)) {
85                 goto done;
86         }
87
88         if (prids) {
89                 *prids = talloc_move(mem_ctx, &rids);
90         }
91
92 done:
93         TALLOC_FREE(rids);
94         TALLOC_FREE(tmp_ctx);
95         return status;
96 }
97
98 /* list all domain groups */
99 static NTSTATUS msrpc_enum_dom_groups(struct winbindd_domain *domain,
100                                       TALLOC_CTX *mem_ctx,
101                                       uint32_t *pnum_info,
102                                       struct wb_acct_info **pinfo)
103 {
104         struct rpc_pipe_client *samr_pipe;
105         struct policy_handle dom_pol;
106         struct wb_acct_info *info = NULL;
107         uint32_t num_info = 0;
108         TALLOC_CTX *tmp_ctx;
109         NTSTATUS status;
110
111         DEBUG(3,("msrpc_enum_dom_groups\n"));
112
113         if (pnum_info) {
114                 *pnum_info = 0;
115         }
116
117         tmp_ctx = talloc_stackframe();
118         if (tmp_ctx == NULL) {
119                 return NT_STATUS_NO_MEMORY;
120         }
121
122         if ( !winbindd_can_contact_domain( domain ) ) {
123                 DEBUG(10,("enum_domain_groups: No incoming trust for domain %s\n",
124                           domain->name));
125                 status = NT_STATUS_OK;
126                 goto done;
127         }
128
129         status = cm_connect_sam(domain, tmp_ctx, false, &samr_pipe, &dom_pol);
130         if (!NT_STATUS_IS_OK(status)) {
131                 goto done;
132         }
133
134         status = rpc_enum_dom_groups(tmp_ctx,
135                                      samr_pipe,
136                                      &dom_pol,
137                                      &num_info,
138                                      &info);
139         if (!NT_STATUS_IS_OK(status)) {
140                 goto done;
141         }
142
143         if (pnum_info) {
144                 *pnum_info = num_info;
145         }
146
147         if (pinfo) {
148                 *pinfo = talloc_move(mem_ctx, &info);
149         }
150
151 done:
152         TALLOC_FREE(tmp_ctx);
153         return status;
154 }
155
156 /* List all domain groups */
157
158 static NTSTATUS msrpc_enum_local_groups(struct winbindd_domain *domain,
159                                         TALLOC_CTX *mem_ctx,
160                                         uint32_t *pnum_info,
161                                         struct wb_acct_info **pinfo)
162 {
163         struct rpc_pipe_client *samr_pipe;
164         struct policy_handle dom_pol;
165         struct wb_acct_info *info = NULL;
166         uint32_t num_info = 0;
167         TALLOC_CTX *tmp_ctx;
168         NTSTATUS status;
169
170         DEBUG(3,("msrpc_enum_local_groups\n"));
171
172         if (pnum_info) {
173                 *pnum_info = 0;
174         }
175
176         tmp_ctx = talloc_stackframe();
177         if (tmp_ctx == NULL) {
178                 return NT_STATUS_NO_MEMORY;
179         }
180
181         if ( !winbindd_can_contact_domain( domain ) ) {
182                 DEBUG(10,("enum_local_groups: No incoming trust for domain %s\n",
183                           domain->name));
184                 status = NT_STATUS_OK;
185                 goto done;
186         }
187
188         status = cm_connect_sam(domain, tmp_ctx, false, &samr_pipe, &dom_pol);
189         if (!NT_STATUS_IS_OK(status)) {
190                 goto done;
191         }
192
193         status = rpc_enum_local_groups(mem_ctx,
194                                        samr_pipe,
195                                        &dom_pol,
196                                        &num_info,
197                                        &info);
198         if (!NT_STATUS_IS_OK(status)) {
199                 goto done;
200         }
201
202         if (pnum_info) {
203                 *pnum_info = num_info;
204         }
205
206         if (pinfo) {
207                 *pinfo = talloc_move(mem_ctx, &info);
208         }
209
210 done:
211         TALLOC_FREE(tmp_ctx);
212         return status;
213 }
214
215 /* convert a single name to a sid in a domain */
216 static NTSTATUS msrpc_name_to_sid(struct winbindd_domain *domain,
217                                   TALLOC_CTX *mem_ctx,
218                                   const char *domain_name,
219                                   const char *name,
220                                   uint32_t flags,
221                                   struct dom_sid *sid,
222                                   enum lsa_SidType *type)
223 {
224         NTSTATUS result;
225         struct dom_sid *sids = NULL;
226         enum lsa_SidType *types = NULL;
227         char *full_name = NULL;
228         const char *names[1];
229         NTSTATUS name_map_status = NT_STATUS_UNSUCCESSFUL;
230         char *mapped_name = NULL;
231
232         if (name == NULL || *name=='\0') {
233                 full_name = talloc_asprintf(mem_ctx, "%s", domain_name);
234         } else if (domain_name == NULL || *domain_name == '\0') {
235                 full_name = talloc_asprintf(mem_ctx, "%s", name);
236         } else {
237                 full_name = talloc_asprintf(mem_ctx, "%s\\%s", domain_name, name);
238         }
239         if (!full_name) {
240                 DEBUG(0, ("talloc_asprintf failed!\n"));
241                 return NT_STATUS_NO_MEMORY;
242         }
243
244         DEBUG(3, ("msrpc_name_to_sid: name=%s\n", full_name));
245
246         name_map_status = normalize_name_unmap(mem_ctx, full_name,
247                                                &mapped_name);
248
249         /* Reset the full_name pointer if we mapped anything */
250
251         if (NT_STATUS_IS_OK(name_map_status) ||
252             NT_STATUS_EQUAL(name_map_status, NT_STATUS_FILE_RENAMED))
253         {
254                 full_name = mapped_name;
255         }
256
257         DEBUG(3,("name_to_sid [rpc] %s for domain %s\n",
258                  full_name?full_name:"", domain_name ));
259
260         names[0] = full_name;
261
262         result = winbindd_lookup_names(mem_ctx, domain, 1,
263                                        names, NULL,
264                                        &sids, &types);
265         if (!NT_STATUS_IS_OK(result))
266                 return result;
267
268         /* Return rid and type if lookup successful */
269
270         sid_copy(sid, &sids[0]);
271         *type = types[0];
272
273         return NT_STATUS_OK;
274 }
275
276 /*
277   convert a domain SID to a user or group name
278 */
279 static NTSTATUS msrpc_sid_to_name(struct winbindd_domain *domain,
280                                   TALLOC_CTX *mem_ctx,
281                                   const struct dom_sid *sid,
282                                   char **domain_name,
283                                   char **name,
284                                   enum lsa_SidType *type)
285 {
286         char **domains;
287         char **names;
288         enum lsa_SidType *types = NULL;
289         NTSTATUS result;
290         NTSTATUS name_map_status = NT_STATUS_UNSUCCESSFUL;
291         char *mapped_name = NULL;
292
293         DEBUG(3, ("msrpc_sid_to_name: %s for domain %s\n", sid_string_dbg(sid),
294                  domain->name ));
295
296         result = winbindd_lookup_sids(mem_ctx,
297                                       domain,
298                                       1,
299                                       sid,
300                                       &domains,
301                                       &names,
302                                       &types);
303         if (!NT_STATUS_IS_OK(result)) {
304                 DEBUG(2,("msrpc_sid_to_name: failed to lookup sids: %s\n",
305                         nt_errstr(result)));
306                 return result;
307         }
308
309
310         *type = (enum lsa_SidType)types[0];
311         *domain_name = domains[0];
312         *name = names[0];
313
314         DEBUG(5,("Mapped sid to [%s]\\[%s]\n", domains[0], *name));
315
316         name_map_status = normalize_name_map(mem_ctx, domain, *name,
317                                              &mapped_name);
318         if (NT_STATUS_IS_OK(name_map_status) ||
319             NT_STATUS_EQUAL(name_map_status, NT_STATUS_FILE_RENAMED))
320         {
321                 *name = mapped_name;
322                 DEBUG(5,("returning mapped name -- %s\n", *name));
323         }
324
325         return NT_STATUS_OK;
326 }
327
328 static NTSTATUS msrpc_rids_to_names(struct winbindd_domain *domain,
329                                     TALLOC_CTX *mem_ctx,
330                                     const struct dom_sid *sid,
331                                     uint32_t *rids,
332                                     size_t num_rids,
333                                     char **domain_name,
334                                     char ***names,
335                                     enum lsa_SidType **types)
336 {
337         char **domains;
338         NTSTATUS result;
339         struct dom_sid *sids;
340         size_t i;
341         char **ret_names;
342
343         DEBUG(3, ("msrpc_rids_to_names: domain %s\n", domain->name ));
344
345         if (num_rids) {
346                 sids = talloc_array(mem_ctx, struct dom_sid, num_rids);
347                 if (sids == NULL) {
348                         return NT_STATUS_NO_MEMORY;
349                 }
350         } else {
351                 sids = NULL;
352         }
353
354         for (i=0; i<num_rids; i++) {
355                 if (!sid_compose(&sids[i], sid, rids[i])) {
356                         return NT_STATUS_INTERNAL_ERROR;
357                 }
358         }
359
360         result = winbindd_lookup_sids(mem_ctx,
361                                       domain,
362                                       num_rids,
363                                       sids,
364                                       &domains,
365                                       names,
366                                       types);
367
368         if (!NT_STATUS_IS_OK(result) &&
369             !NT_STATUS_EQUAL(result, STATUS_SOME_UNMAPPED)) {
370                 return result;
371         }
372
373         ret_names = *names;
374         for (i=0; i<num_rids; i++) {
375                 NTSTATUS name_map_status = NT_STATUS_UNSUCCESSFUL;
376                 char *mapped_name = NULL;
377
378                 if ((*types)[i] != SID_NAME_UNKNOWN) {
379                         name_map_status = normalize_name_map(mem_ctx,
380                                                              domain,
381                                                              ret_names[i],
382                                                              &mapped_name);
383                         if (NT_STATUS_IS_OK(name_map_status) ||
384                             NT_STATUS_EQUAL(name_map_status, NT_STATUS_FILE_RENAMED))
385                         {
386                                 ret_names[i] = mapped_name;
387                         }
388
389                         *domain_name = domains[i];
390                 }
391         }
392
393         return result;
394 }
395
396 /* Lookup groups a user is a member of.  I wish Unix had a call like this! */
397 static NTSTATUS msrpc_lookup_usergroups(struct winbindd_domain *domain,
398                                         TALLOC_CTX *mem_ctx,
399                                         const struct dom_sid *user_sid,
400                                         uint32_t *pnum_groups,
401                                         struct dom_sid **puser_grpsids)
402 {
403         struct rpc_pipe_client *samr_pipe;
404         struct policy_handle dom_pol;
405         struct dom_sid *user_grpsids = NULL;
406         uint32_t num_groups = 0;
407         TALLOC_CTX *tmp_ctx;
408         NTSTATUS status;
409
410         DEBUG(3,("msrpc_lookup_usergroups sid=%s\n", sid_string_dbg(user_sid)));
411
412         *pnum_groups = 0;
413
414         tmp_ctx = talloc_stackframe();
415         if (tmp_ctx == NULL) {
416                 return NT_STATUS_NO_MEMORY;
417         }
418
419         /* Check if we have a cached user_info_3 */
420         status = lookup_usergroups_cached(tmp_ctx,
421                                           user_sid,
422                                           &num_groups,
423                                           &user_grpsids);
424         if (NT_STATUS_IS_OK(status)) {
425                 goto cached;
426         }
427
428         if ( !winbindd_can_contact_domain( domain ) ) {
429                 DEBUG(10,("lookup_usergroups: No incoming trust for domain %s\n",
430                           domain->name));
431
432                 /* Tell the cache manager not to remember this one */
433                 status = NT_STATUS_SYNCHRONIZATION_REQUIRED;
434                 goto done;
435         }
436
437         /* no cache; hit the wire */
438         status = cm_connect_sam(domain, tmp_ctx, false, &samr_pipe, &dom_pol);
439         if (!NT_STATUS_IS_OK(status)) {
440                 goto done;
441         }
442
443         status = rpc_lookup_usergroups(tmp_ctx,
444                                        samr_pipe,
445                                        &dom_pol,
446                                        &domain->sid,
447                                        user_sid,
448                                        &num_groups,
449                                        &user_grpsids);
450         if (!NT_STATUS_IS_OK(status)) {
451                 goto done;
452         }
453
454 cached:
455         *pnum_groups = num_groups;
456
457         if (puser_grpsids) {
458                 *puser_grpsids = talloc_move(mem_ctx, &user_grpsids);
459         }
460
461 done:
462         TALLOC_FREE(tmp_ctx);
463         return status;
464         return NT_STATUS_OK;
465 }
466
467 #define MAX_SAM_ENTRIES_W2K 0x400 /* 1024 */
468
469 static NTSTATUS msrpc_lookup_useraliases(struct winbindd_domain *domain,
470                                          TALLOC_CTX *mem_ctx,
471                                          uint32_t num_sids, const struct dom_sid *sids,
472                                          uint32_t *pnum_aliases,
473                                          uint32_t **palias_rids)
474 {
475         struct rpc_pipe_client *samr_pipe;
476         struct policy_handle dom_pol;
477         uint32_t num_aliases = 0;
478         uint32_t *alias_rids = NULL;
479         TALLOC_CTX *tmp_ctx;
480         NTSTATUS status;
481
482         DEBUG(3,("msrpc_lookup_useraliases\n"));
483
484         if (pnum_aliases) {
485                 *pnum_aliases = 0;
486         }
487
488         tmp_ctx = talloc_stackframe();
489         if (tmp_ctx == NULL) {
490                 return NT_STATUS_NO_MEMORY;
491         }
492
493         if (!winbindd_can_contact_domain(domain)) {
494                 DEBUG(10,("msrpc_lookup_useraliases: No incoming trust for domain %s\n",
495                           domain->name));
496                 /* Tell the cache manager not to remember this one */
497                 status = NT_STATUS_SYNCHRONIZATION_REQUIRED;
498                 goto done;
499         }
500
501         status = cm_connect_sam(domain, tmp_ctx, false, &samr_pipe, &dom_pol);
502         if (!NT_STATUS_IS_OK(status)) {
503                 goto done;
504         }
505
506         status = rpc_lookup_useraliases(tmp_ctx,
507                                         samr_pipe,
508                                         &dom_pol,
509                                         num_sids,
510                                         sids,
511                                         &num_aliases,
512                                         &alias_rids);
513         if (!NT_STATUS_IS_OK(status)) {
514                 goto done;
515         }
516
517         if (pnum_aliases) {
518                 *pnum_aliases = num_aliases;
519         }
520
521         if (palias_rids) {
522                 *palias_rids = talloc_move(mem_ctx, &alias_rids);
523         }
524
525 done:
526         TALLOC_FREE(tmp_ctx);
527         return status;
528 }
529
530
531 /* Lookup group membership given a rid.   */
532 static NTSTATUS msrpc_lookup_groupmem(struct winbindd_domain *domain,
533                                       TALLOC_CTX *mem_ctx,
534                                       const struct dom_sid *group_sid,
535                                       enum lsa_SidType type,
536                                       uint32_t *num_names,
537                                       struct dom_sid **sid_mem,
538                                       char ***names,
539                                       uint32_t **name_types)
540 {
541         NTSTATUS status, result;
542         uint32_t i, total_names = 0;
543         struct policy_handle dom_pol, group_pol;
544         uint32_t des_access = SEC_FLAG_MAXIMUM_ALLOWED;
545         uint32_t *rid_mem = NULL;
546         uint32_t group_rid;
547         unsigned int j, r;
548         struct rpc_pipe_client *cli;
549         unsigned int orig_timeout;
550         struct samr_RidAttrArray *rids = NULL;
551         struct dcerpc_binding_handle *b;
552
553         DEBUG(3,("msrpc_lookup_groupmem: %s sid=%s\n", domain->name,
554                   sid_string_dbg(group_sid)));
555
556         if ( !winbindd_can_contact_domain( domain ) ) {
557                 DEBUG(10,("lookup_groupmem: No incoming trust for domain %s\n",
558                           domain->name));
559                 return NT_STATUS_OK;
560         }
561
562         if (!sid_peek_check_rid(&domain->sid, group_sid, &group_rid))
563                 return NT_STATUS_UNSUCCESSFUL;
564
565         *num_names = 0;
566
567         result = cm_connect_sam(domain, mem_ctx, false, &cli, &dom_pol);
568         if (!NT_STATUS_IS_OK(result))
569                 return result;
570
571         b = cli->binding_handle;
572
573         status = dcerpc_samr_OpenGroup(b, mem_ctx,
574                                        &dom_pol,
575                                        des_access,
576                                        group_rid,
577                                        &group_pol,
578                                        &result);
579         if (!NT_STATUS_IS_OK(status)) {
580                 return status;
581         }
582         if (!NT_STATUS_IS_OK(result)) {
583                 return result;
584         }
585
586         /* Step #1: Get a list of user rids that are the members of the
587            group. */
588
589         /* This call can take a long time - allow the server to time out.
590            35 seconds should do it. */
591
592         orig_timeout = rpccli_set_timeout(cli, 35000);
593
594         status = dcerpc_samr_QueryGroupMember(b, mem_ctx,
595                                               &group_pol,
596                                               &rids,
597                                               &result);
598
599         /* And restore our original timeout. */
600         rpccli_set_timeout(cli, orig_timeout);
601
602         {
603                 NTSTATUS _result;
604                 dcerpc_samr_Close(b, mem_ctx, &group_pol, &_result);
605         }
606
607         if (!NT_STATUS_IS_OK(status)) {
608                 return status;
609         }
610
611         if (!NT_STATUS_IS_OK(result)) {
612                 return result;
613         }
614
615         if (!rids || !rids->count) {
616                 names = NULL;
617                 name_types = NULL;
618                 sid_mem = NULL;
619                 return NT_STATUS_OK;
620         }
621
622         *num_names = rids->count;
623         rid_mem = rids->rids;
624
625         /* Step #2: Convert list of rids into list of usernames.  Do this
626            in bunches of ~1000 to avoid crashing NT4.  It looks like there
627            is a buffer overflow or something like that lurking around
628            somewhere. */
629
630 #define MAX_LOOKUP_RIDS 900
631
632         *names = talloc_zero_array(mem_ctx, char *, *num_names);
633         *name_types = talloc_zero_array(mem_ctx, uint32_t, *num_names);
634         *sid_mem = talloc_zero_array(mem_ctx, struct dom_sid, *num_names);
635
636         for (j=0;j<(*num_names);j++)
637                 sid_compose(&(*sid_mem)[j], &domain->sid, rid_mem[j]);
638
639         if (*num_names>0 && (!*names || !*name_types))
640                 return NT_STATUS_NO_MEMORY;
641
642         for (i = 0; i < *num_names; i += MAX_LOOKUP_RIDS) {
643                 int num_lookup_rids = MIN(*num_names - i, MAX_LOOKUP_RIDS);
644                 struct lsa_Strings tmp_names;
645                 struct samr_Ids tmp_types;
646
647                 /* Lookup a chunk of rids */
648
649                 status = dcerpc_samr_LookupRids(b, mem_ctx,
650                                                 &dom_pol,
651                                                 num_lookup_rids,
652                                                 &rid_mem[i],
653                                                 &tmp_names,
654                                                 &tmp_types,
655                                                 &result);
656                 if (!NT_STATUS_IS_OK(status)) {
657                         return status;
658                 }
659
660                 /* see if we have a real error (and yes the
661                    STATUS_SOME_UNMAPPED is the one returned from 2k) */
662
663                 if (!NT_STATUS_IS_OK(result) &&
664                     !NT_STATUS_EQUAL(result, STATUS_SOME_UNMAPPED))
665                         return result;
666
667                 /* Copy result into array.  The talloc system will take
668                    care of freeing the temporary arrays later on. */
669
670                 if (tmp_names.count != num_lookup_rids) {
671                         return NT_STATUS_INVALID_NETWORK_RESPONSE;
672                 }
673                 if (tmp_types.count != num_lookup_rids) {
674                         return NT_STATUS_INVALID_NETWORK_RESPONSE;
675                 }
676
677                 for (r=0; r<tmp_names.count; r++) {
678                         if (tmp_types.ids[r] == SID_NAME_UNKNOWN) {
679                                 continue;
680                         }
681                         if (total_names >= *num_names) {
682                                 break;
683                         }
684                         (*names)[total_names] = fill_domain_username_talloc(
685                                 mem_ctx, domain->name,
686                                 tmp_names.names[r].string, true);
687                         (*name_types)[total_names] = tmp_types.ids[r];
688                         total_names += 1;
689                 }
690         }
691
692         *num_names = total_names;
693
694         return NT_STATUS_OK;
695 }
696
697 #ifdef HAVE_LDAP
698
699 #include "ads.h"
700
701 static int get_ldap_seq(const char *server, struct sockaddr_storage *ss, int port, uint32_t *seq)
702 {
703         int ret = -1;
704         struct timeval to;
705         const char *attrs[] = {"highestCommittedUSN", NULL};
706         LDAPMessage *res = NULL;
707         char **values = NULL;
708         LDAP *ldp = NULL;
709
710         *seq = DOM_SEQUENCE_NONE;
711
712         /*
713          * Parameterised (5) second timeout on open. This is needed as the
714          * search timeout doesn't seem to apply to doing an open as well. JRA.
715          */
716
717         ldp = ldap_open_with_timeout(server, ss, port, lp_ldap_timeout());
718         if (ldp == NULL)
719                 return -1;
720
721         /* Timeout if no response within 20 seconds. */
722         to.tv_sec = 10;
723         to.tv_usec = 0;
724
725         if (ldap_search_st(ldp, "", LDAP_SCOPE_BASE, "(objectclass=*)",
726                            discard_const_p(char *, attrs), 0, &to, &res))
727                 goto done;
728
729         if (ldap_count_entries(ldp, res) != 1)
730                 goto done;
731
732         values = ldap_get_values(ldp, res, "highestCommittedUSN");
733         if (!values || !values[0])
734                 goto done;
735
736         *seq = atoi(values[0]);
737         ret = 0;
738
739   done:
740
741         if (values)
742                 ldap_value_free(values);
743         if (res)
744                 ldap_msgfree(res);
745         if (ldp)
746                 ldap_unbind(ldp);
747         return ret;
748 }
749
750 /**********************************************************************
751  Get the sequence number for a Windows AD native mode domain using
752  LDAP queries.
753 **********************************************************************/
754
755 static int get_ldap_sequence_number(struct winbindd_domain *domain, uint32_t *seq)
756 {
757         int ret = -1;
758         char addr[INET6_ADDRSTRLEN];
759
760         print_sockaddr(addr, sizeof(addr), &domain->dcaddr);
761         if ((ret = get_ldap_seq(addr, &domain->dcaddr, LDAP_PORT, seq)) == 0) {
762                 DEBUG(3, ("get_ldap_sequence_number: Retrieved sequence "
763                           "number for Domain (%s) from DC (%s)\n",
764                         domain->name, addr));
765         }
766         return ret;
767 }
768
769 #endif /* HAVE_LDAP */
770
771 /* find the sequence number for a domain */
772 static NTSTATUS msrpc_sequence_number(struct winbindd_domain *domain,
773                                       uint32_t *pseq)
774 {
775         struct rpc_pipe_client *samr_pipe;
776         struct policy_handle dom_pol;
777         uint32_t seq = DOM_SEQUENCE_NONE;
778         TALLOC_CTX *tmp_ctx;
779         NTSTATUS status;
780
781         DEBUG(3, ("msrpc_sequence_number: fetch sequence_number for %s\n", domain->name));
782
783         if (pseq) {
784                 *pseq = DOM_SEQUENCE_NONE;
785         }
786
787         tmp_ctx = talloc_stackframe();
788         if (tmp_ctx == NULL) {
789                 return NT_STATUS_NO_MEMORY;
790         }
791
792         if ( !winbindd_can_contact_domain( domain ) ) {
793                 DEBUG(10,("sequence_number: No incoming trust for domain %s\n",
794                           domain->name));
795                 if (pseq) {
796                         *pseq = time(NULL);
797                 }
798                 status = NT_STATUS_OK;
799                 goto done;
800         }
801
802 #ifdef HAVE_LDAP
803         if (domain->active_directory) {
804                 int rc;
805
806                 DEBUG(8,("using get_ldap_seq() to retrieve the "
807                          "sequence number\n"));
808
809                 rc =  get_ldap_sequence_number(domain, &seq);
810                 if (rc == 0) {
811                         DEBUG(10,("domain_sequence_number: LDAP for "
812                                   "domain %s is %u\n",
813                                   domain->name, seq));
814
815                         if (pseq) {
816                                 *pseq = seq;
817                         }
818
819                         status = NT_STATUS_OK;
820                         goto done;
821                 }
822
823                 DEBUG(10,("domain_sequence_number: failed to get LDAP "
824                           "sequence number for domain %s\n",
825                           domain->name ));
826         }
827 #endif /* HAVE_LDAP */
828
829         status = cm_connect_sam(domain, tmp_ctx, false, &samr_pipe, &dom_pol);
830         if (!NT_STATUS_IS_OK(status)) {
831                 goto done;
832         }
833
834         status = rpc_sequence_number(tmp_ctx,
835                                      samr_pipe,
836                                      &dom_pol,
837                                      domain->name,
838                                      &seq);
839         if (!NT_STATUS_IS_OK(status)) {
840                 goto done;
841         }
842
843         if (pseq) {
844                 *pseq = seq;
845         }
846
847 done:
848         TALLOC_FREE(tmp_ctx);
849         return status;
850 }
851
852 /* get a list of trusted domains */
853 static NTSTATUS msrpc_trusted_domains(struct winbindd_domain *domain,
854                                       TALLOC_CTX *mem_ctx,
855                                       struct netr_DomainTrustList *ptrust_list)
856 {
857         struct rpc_pipe_client *lsa_pipe;
858         struct policy_handle lsa_policy;
859         struct netr_DomainTrust *trusts = NULL;
860         uint32_t num_trusts = 0;
861         TALLOC_CTX *tmp_ctx;
862         NTSTATUS status;
863
864         DEBUG(3,("msrpc_trusted_domains\n"));
865
866         if (ptrust_list) {
867                 ZERO_STRUCTP(ptrust_list);
868         }
869
870         tmp_ctx = talloc_stackframe();
871         if (tmp_ctx == NULL) {
872                 return NT_STATUS_NO_MEMORY;
873         }
874
875         status = cm_connect_lsa(domain, tmp_ctx, &lsa_pipe, &lsa_policy);
876         if (!NT_STATUS_IS_OK(status)) {
877                 goto done;
878         }
879
880         status = rpc_trusted_domains(tmp_ctx,
881                                      lsa_pipe,
882                                      &lsa_policy,
883                                      &num_trusts,
884                                      &trusts);
885         if (!NT_STATUS_IS_OK(status)) {
886                 goto done;
887         }
888
889         if (ptrust_list) {
890                 ptrust_list->count = num_trusts;
891                 ptrust_list->array = talloc_move(mem_ctx, &trusts);
892         }
893
894 done:
895         TALLOC_FREE(tmp_ctx);
896         return status;
897 }
898
899 /* find the lockout policy for a domain */
900 static NTSTATUS msrpc_lockout_policy(struct winbindd_domain *domain,
901                                      TALLOC_CTX *mem_ctx,
902                                      struct samr_DomInfo12 *lockout_policy)
903 {
904         NTSTATUS status, result;
905         struct rpc_pipe_client *cli;
906         struct policy_handle dom_pol;
907         union samr_DomainInfo *info = NULL;
908         struct dcerpc_binding_handle *b;
909
910         DEBUG(3, ("msrpc_lockout_policy: fetch lockout policy for %s\n", domain->name));
911
912         if ( !winbindd_can_contact_domain( domain ) ) {
913                 DEBUG(10,("msrpc_lockout_policy: No incoming trust for domain %s\n",
914                           domain->name));
915                 return NT_STATUS_NOT_SUPPORTED;
916         }
917
918         status = cm_connect_sam(domain, mem_ctx, false, &cli, &dom_pol);
919         if (!NT_STATUS_IS_OK(status)) {
920                 goto done;
921         }
922
923         b = cli->binding_handle;
924
925         status = dcerpc_samr_QueryDomainInfo(b, mem_ctx,
926                                              &dom_pol,
927                                              DomainLockoutInformation,
928                                              &info,
929                                              &result);
930         if (!NT_STATUS_IS_OK(status)) {
931                 goto done;
932         }
933         if (!NT_STATUS_IS_OK(result)) {
934                 status = result;
935                 goto done;
936         }
937
938         *lockout_policy = info->info12;
939
940         DEBUG(10,("msrpc_lockout_policy: lockout_threshold %d\n",
941                 info->info12.lockout_threshold));
942
943   done:
944
945         return status;
946 }
947
948 /* find the password policy for a domain */
949 static NTSTATUS msrpc_password_policy(struct winbindd_domain *domain,
950                                       TALLOC_CTX *mem_ctx,
951                                       struct samr_DomInfo1 *password_policy)
952 {
953         NTSTATUS status, result;
954         struct rpc_pipe_client *cli;
955         struct policy_handle dom_pol;
956         union samr_DomainInfo *info = NULL;
957         struct dcerpc_binding_handle *b;
958
959         DEBUG(3, ("msrpc_password_policy: fetch password policy for %s\n",
960                   domain->name));
961
962         if ( !winbindd_can_contact_domain( domain ) ) {
963                 DEBUG(10,("msrpc_password_policy: No incoming trust for domain %s\n",
964                           domain->name));
965                 return NT_STATUS_NOT_SUPPORTED;
966         }
967
968         status = cm_connect_sam(domain, mem_ctx, false, &cli, &dom_pol);
969         if (!NT_STATUS_IS_OK(status)) {
970                 goto done;
971         }
972
973         b = cli->binding_handle;
974
975         status = dcerpc_samr_QueryDomainInfo(b, mem_ctx,
976                                              &dom_pol,
977                                              DomainPasswordInformation,
978                                              &info,
979                                              &result);
980         if (!NT_STATUS_IS_OK(status)) {
981                 goto done;
982         }
983         if (!NT_STATUS_IS_OK(result)) {
984                 goto done;
985         }
986
987         *password_policy = info->info1;
988
989         DEBUG(10,("msrpc_password_policy: min_length_password %d\n",
990                 info->info1.min_password_length));
991
992   done:
993
994         return status;
995 }
996
997 NTSTATUS winbindd_lookup_sids(TALLOC_CTX *mem_ctx,
998                               struct winbindd_domain *domain,
999                               uint32_t num_sids,
1000                               const struct dom_sid *sids,
1001                               char ***domains,
1002                               char ***names,
1003                               enum lsa_SidType **types)
1004 {
1005         NTSTATUS status;
1006         NTSTATUS result;
1007         struct rpc_pipe_client *cli = NULL;
1008         struct dcerpc_binding_handle *b = NULL;
1009         struct policy_handle lsa_policy;
1010         unsigned int orig_timeout;
1011         bool use_lookupsids3 = false;
1012         bool retried = false;
1013
1014  connect:
1015         status = cm_connect_lsat(domain, mem_ctx, &cli, &lsa_policy);
1016         if (!NT_STATUS_IS_OK(status)) {
1017                 return status;
1018         }
1019
1020         b = cli->binding_handle;
1021
1022         if (cli->transport->transport == NCACN_IP_TCP) {
1023                 use_lookupsids3 = true;
1024         }
1025
1026         /*
1027          * This call can take a long time
1028          * allow the server to time out.
1029          * 35 seconds should do it.
1030          */
1031         orig_timeout = dcerpc_binding_handle_set_timeout(b, 35000);
1032
1033         status = dcerpc_lsa_lookup_sids_generic(b,
1034                                                 mem_ctx,
1035                                                 &lsa_policy,
1036                                                 num_sids,
1037                                                 sids,
1038                                                 domains,
1039                                                 names,
1040                                                 types,
1041                                                 use_lookupsids3,
1042                                                 &result);
1043
1044         /* And restore our original timeout. */
1045         dcerpc_binding_handle_set_timeout(b, orig_timeout);
1046
1047         if (NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED) ||
1048             NT_STATUS_EQUAL(status, NT_STATUS_RPC_SEC_PKG_ERROR) ||
1049             NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_ACCESS_DENIED)) {
1050                 /*
1051                  * This can happen if the schannel key is not
1052                  * valid anymore, we need to invalidate the
1053                  * all connections to the dc and reestablish
1054                  * a netlogon connection first.
1055                  */
1056                 invalidate_cm_connection(domain);
1057                 domain->can_do_ncacn_ip_tcp = domain->active_directory;
1058                 if (!retried) {
1059                         retried = true;
1060                         goto connect;
1061                 }
1062                 status = NT_STATUS_ACCESS_DENIED;
1063         }
1064
1065         if (!NT_STATUS_IS_OK(status)) {
1066                 return status;
1067         }
1068
1069         if (!NT_STATUS_IS_OK(result)) {
1070                 return result;
1071         }
1072
1073         return NT_STATUS_OK;
1074 }
1075
1076 static NTSTATUS winbindd_lookup_names(TALLOC_CTX *mem_ctx,
1077                                       struct winbindd_domain *domain,
1078                                       uint32_t num_names,
1079                                       const char **names,
1080                                       const char ***domains,
1081                                       struct dom_sid **sids,
1082                                       enum lsa_SidType **types)
1083 {
1084         NTSTATUS status;
1085         NTSTATUS result;
1086         struct rpc_pipe_client *cli = NULL;
1087         struct dcerpc_binding_handle *b = NULL;
1088         struct policy_handle lsa_policy;
1089         unsigned int orig_timeout = 0;
1090         bool use_lookupnames4 = false;
1091         bool retried = false;
1092
1093  connect:
1094         status = cm_connect_lsat(domain, mem_ctx, &cli, &lsa_policy);
1095         if (!NT_STATUS_IS_OK(status)) {
1096                 return status;
1097         }
1098
1099         b = cli->binding_handle;
1100
1101         if (cli->transport->transport == NCACN_IP_TCP) {
1102                 use_lookupnames4 = true;
1103         }
1104
1105         /*
1106          * This call can take a long time
1107          * allow the server to time out.
1108          * 35 seconds should do it.
1109          */
1110         orig_timeout = dcerpc_binding_handle_set_timeout(b, 35000);
1111
1112         status = dcerpc_lsa_lookup_names_generic(b,
1113                                                  mem_ctx,
1114                                                  &lsa_policy,
1115                                                  num_names,
1116                                                  (const char **) names,
1117                                                  domains,
1118                                                  1,
1119                                                  sids,
1120                                                  types,
1121                                                  use_lookupnames4,
1122                                                  &result);
1123
1124         /* And restore our original timeout. */
1125         dcerpc_binding_handle_set_timeout(b, orig_timeout);
1126
1127         if (NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED) ||
1128             NT_STATUS_EQUAL(status, NT_STATUS_RPC_SEC_PKG_ERROR) ||
1129             NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_ACCESS_DENIED)) {
1130                 /*
1131                  * This can happen if the schannel key is not
1132                  * valid anymore, we need to invalidate the
1133                  * all connections to the dc and reestablish
1134                  * a netlogon connection first.
1135                  */
1136                 invalidate_cm_connection(domain);
1137                 if (!retried) {
1138                         retried = true;
1139                         goto connect;
1140                 }
1141                 status = NT_STATUS_ACCESS_DENIED;
1142         }
1143
1144         if (!NT_STATUS_IS_OK(status)) {
1145                 return status;
1146         }
1147
1148         if (!NT_STATUS_IS_OK(result)) {
1149                 return result;
1150         }
1151
1152         return NT_STATUS_OK;
1153 }
1154
1155 /* the rpc backend methods are exposed via this structure */
1156 struct winbindd_methods msrpc_methods = {
1157         False,
1158         msrpc_query_user_list,
1159         msrpc_enum_dom_groups,
1160         msrpc_enum_local_groups,
1161         msrpc_name_to_sid,
1162         msrpc_sid_to_name,
1163         msrpc_rids_to_names,
1164         msrpc_lookup_usergroups,
1165         msrpc_lookup_useraliases,
1166         msrpc_lookup_groupmem,
1167         msrpc_sequence_number,
1168         msrpc_lockout_policy,
1169         msrpc_password_policy,
1170         msrpc_trusted_domains,
1171 };