s3:winbind: Add async wb_group_members
[samba.git] / source3 / winbindd / winbindd_dual_srv.c
1 /*
2    Unix SMB/CIFS implementation.
3
4    In-Child server implementation of the routines defined in wbint.idl
5
6    Copyright (C) Volker Lendecke 2009
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #include "includes.h"
23 #include "winbindd/winbindd.h"
24 #include "winbindd/winbindd_proto.h"
25 #include "librpc/gen_ndr/srv_wbint.h"
26
27 void _wbint_Ping(pipes_struct *p, struct wbint_Ping *r)
28 {
29         *r->out.out_data = r->in.in_data;
30 }
31
32 NTSTATUS _wbint_LookupSid(pipes_struct *p, struct wbint_LookupSid *r)
33 {
34         struct winbindd_domain *domain = wb_child_domain();
35         char *dom_name;
36         char *name;
37         enum lsa_SidType type;
38         NTSTATUS status;
39
40         if (domain == NULL) {
41                 return NT_STATUS_REQUEST_NOT_ACCEPTED;
42         }
43
44         status = domain->methods->sid_to_name(domain, p->mem_ctx, r->in.sid,
45                                               &dom_name, &name, &type);
46         if (!NT_STATUS_IS_OK(status)) {
47                 return status;
48         }
49
50         *r->out.domain = dom_name;
51         *r->out.name = name;
52         *r->out.type = type;
53         return NT_STATUS_OK;
54 }
55
56 NTSTATUS _wbint_LookupName(pipes_struct *p, struct wbint_LookupName *r)
57 {
58         struct winbindd_domain *domain = wb_child_domain();
59
60         if (domain == NULL) {
61                 return NT_STATUS_REQUEST_NOT_ACCEPTED;
62         }
63
64         return domain->methods->name_to_sid(
65                 domain, p->mem_ctx, r->in.domain, r->in.name, r->in.flags,
66                 r->out.sid, r->out.type);
67 }
68
69 NTSTATUS _wbint_Sid2Uid(pipes_struct *p, struct wbint_Sid2Uid *r)
70 {
71         uid_t uid;
72         NTSTATUS status;
73
74         status = idmap_sid_to_uid(r->in.dom_name ? r->in.dom_name : "",
75                                   r->in.sid, &uid);
76         if (!NT_STATUS_IS_OK(status)) {
77                 return status;
78         }
79         *r->out.uid = uid;
80         return NT_STATUS_OK;
81 }
82
83 NTSTATUS _wbint_Sid2Gid(pipes_struct *p, struct wbint_Sid2Gid *r)
84 {
85         gid_t gid;
86         NTSTATUS status;
87
88         status = idmap_sid_to_gid(r->in.dom_name ? r->in.dom_name : "",
89                                   r->in.sid, &gid);
90         if (!NT_STATUS_IS_OK(status)) {
91                 return status;
92         }
93         *r->out.gid = gid;
94         return NT_STATUS_OK;
95 }
96
97 NTSTATUS _wbint_Uid2Sid(pipes_struct *p, struct wbint_Uid2Sid *r)
98 {
99         return idmap_uid_to_sid(r->in.dom_name ? r->in.dom_name : "",
100                                 r->out.sid, r->in.uid);
101 }
102
103 NTSTATUS _wbint_Gid2Sid(pipes_struct *p, struct wbint_Gid2Sid *r)
104 {
105         return idmap_gid_to_sid(r->in.dom_name ? r->in.dom_name : "",
106                                 r->out.sid, r->in.gid);
107 }
108
109 NTSTATUS _wbint_QueryUser(pipes_struct *p, struct wbint_QueryUser *r)
110 {
111         struct winbindd_domain *domain = wb_child_domain();
112
113         if (domain == NULL) {
114                 return NT_STATUS_REQUEST_NOT_ACCEPTED;
115         }
116
117         return domain->methods->query_user(domain, p->mem_ctx, r->in.sid,
118                                            r->out.info);
119 }
120
121 NTSTATUS _wbint_LookupUserAliases(pipes_struct *p,
122                                   struct wbint_LookupUserAliases *r)
123 {
124         struct winbindd_domain *domain = wb_child_domain();
125
126         if (domain == NULL) {
127                 return NT_STATUS_REQUEST_NOT_ACCEPTED;
128         }
129
130         return domain->methods->lookup_useraliases(
131                 domain, p->mem_ctx, r->in.sids->num_sids, r->in.sids->sids,
132                 &r->out.rids->num_rids, &r->out.rids->rids);
133 }
134
135 NTSTATUS _wbint_LookupUserGroups(pipes_struct *p,
136                                  struct wbint_LookupUserGroups *r)
137 {
138         struct winbindd_domain *domain = wb_child_domain();
139
140         if (domain == NULL) {
141                 return NT_STATUS_REQUEST_NOT_ACCEPTED;
142         }
143
144         return domain->methods->lookup_usergroups(
145                 domain, p->mem_ctx, r->in.sid,
146                 &r->out.sids->num_sids, &r->out.sids->sids);
147 }
148
149 NTSTATUS _wbint_QuerySequenceNumber(pipes_struct *p,
150                                     struct wbint_QuerySequenceNumber *r)
151 {
152         struct winbindd_domain *domain = wb_child_domain();
153
154         if (domain == NULL) {
155                 return NT_STATUS_REQUEST_NOT_ACCEPTED;
156         }
157
158         return domain->methods->sequence_number(domain, r->out.sequence);
159 }
160
161 NTSTATUS _wbint_LookupGroupMembers(pipes_struct *p,
162                                    struct wbint_LookupGroupMembers *r)
163 {
164         struct winbindd_domain *domain = wb_child_domain();
165         uint32_t i, num_names;
166         struct dom_sid *sid_mem;
167         char **names;
168         uint32_t *name_types;
169         NTSTATUS status;
170
171         if (domain == NULL) {
172                 return NT_STATUS_REQUEST_NOT_ACCEPTED;
173         }
174
175         status = domain->methods->lookup_groupmem(
176                 domain, p->mem_ctx, r->in.sid,
177                 &num_names, &sid_mem, &names, &name_types);
178         if (!NT_STATUS_IS_OK(status)) {
179                 return status;
180         }
181
182         r->out.members->num_members = num_names;
183         r->out.members->members = talloc_array(
184                 r->out.members, struct wbint_GroupMember, num_names);
185         if (r->out.members->members == NULL) {
186                 return NT_STATUS_NO_MEMORY;
187         }
188
189         for (i=0; i<num_names; i++) {
190                 struct wbint_GroupMember *m = &r->out.members->members[i];
191                 sid_copy(&m->sid, &sid_mem[i]);
192                 m->name = talloc_move(r->out.members->members, &names[i]);
193                 m->type = (enum lsa_SidType)name_types[i];
194         }
195
196         return NT_STATUS_OK;
197 }