2 Unix SMB/CIFS implementation.
3 Winbind Utility functions
5 Copyright (C) Gerald (Jerry) Carter 2007
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #if defined(WITH_WINBIND)
25 #include "nsswitch/libwbclient/wbclient.h"
27 struct passwd * winbind_getpwnam(const char * name)
30 struct passwd * tmp_pwd = NULL;
31 struct passwd * pwd = NULL;
33 result = wbcGetpwnam(name, &tmp_pwd);
34 if (result != WBC_ERR_SUCCESS)
37 pwd = tcopy_passwd(talloc_tos(), tmp_pwd);
39 wbcFreeMemory(tmp_pwd);
44 struct passwd * winbind_getpwsid(const DOM_SID *sid)
47 struct passwd * tmp_pwd = NULL;
48 struct passwd * pwd = NULL;
49 struct wbcDomainSid dom_sid;
51 memcpy(&dom_sid, sid, sizeof(dom_sid));
53 result = wbcGetpwsid(&dom_sid, &tmp_pwd);
54 if (result != WBC_ERR_SUCCESS)
57 pwd = tcopy_passwd(talloc_tos(), tmp_pwd);
59 wbcFreeMemory(tmp_pwd);
64 /* Call winbindd to convert a name to a sid */
66 bool winbind_lookup_name(const char *dom_name, const char *name, DOM_SID *sid,
67 enum lsa_SidType *name_type)
69 struct wbcDomainSid dom_sid;
73 result = wbcLookupName(dom_name, name, &dom_sid, &type);
74 if (result != WBC_ERR_SUCCESS)
77 memcpy(sid, &dom_sid, sizeof(DOM_SID));
78 *name_type = (enum lsa_SidType)type;
83 /* Call winbindd to convert sid to name */
85 bool winbind_lookup_sid(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
86 const char **domain, const char **name,
87 enum lsa_SidType *name_type)
89 struct wbcDomainSid dom_sid;
92 char *domain_name = NULL;
93 char *account_name = NULL;
95 memcpy(&dom_sid, sid, sizeof(dom_sid));
97 result = wbcLookupSid(&dom_sid, &domain_name, &account_name, &type);
98 if (result != WBC_ERR_SUCCESS)
101 /* Copy out result */
104 *domain = talloc_strdup(mem_ctx, domain_name);
107 *name = talloc_strdup(mem_ctx, account_name);
109 *name_type = (enum lsa_SidType)type;
111 DEBUG(10, ("winbind_lookup_sid: SUCCESS: SID %s -> %s %s\n",
112 sid_string_dbg(sid), domain_name, account_name));
114 wbcFreeMemory(domain_name);
115 wbcFreeMemory(account_name);
117 if ((domain && !*domain) || (name && !*name)) {
118 DEBUG(0,("winbind_lookup_sid: talloc() failed!\n"));
126 /* Ping winbindd to see it is alive */
128 bool winbind_ping(void)
130 wbcErr result = wbcPing();
132 return (result == WBC_ERR_SUCCESS);
135 /* Call winbindd to convert SID to uid */
137 bool winbind_sid_to_uid(uid_t *puid, const DOM_SID *sid)
139 struct wbcDomainSid dom_sid;
142 memcpy(&dom_sid, sid, sizeof(dom_sid));
144 result = wbcSidToUid(&dom_sid, puid);
146 return (result == WBC_ERR_SUCCESS);
149 /* Call winbindd to convert uid to sid */
151 bool winbind_uid_to_sid(DOM_SID *sid, uid_t uid)
153 struct wbcDomainSid dom_sid;
156 result = wbcUidToSid(uid, &dom_sid);
157 if (result == WBC_ERR_SUCCESS) {
158 memcpy(sid, &dom_sid, sizeof(DOM_SID));
160 sid_copy(sid, &global_sid_NULL);
163 return (result == WBC_ERR_SUCCESS);
166 /* Call winbindd to convert SID to gid */
168 bool winbind_sid_to_gid(gid_t *pgid, const DOM_SID *sid)
170 struct wbcDomainSid dom_sid;
173 memcpy(&dom_sid, sid, sizeof(dom_sid));
175 result = wbcSidToGid(&dom_sid, pgid);
177 return (result == WBC_ERR_SUCCESS);
180 /* Call winbindd to convert gid to sid */
182 bool winbind_gid_to_sid(DOM_SID *sid, gid_t gid)
184 struct wbcDomainSid dom_sid;
187 result = wbcGidToSid(gid, &dom_sid);
188 if (result == WBC_ERR_SUCCESS) {
189 memcpy(sid, &dom_sid, sizeof(DOM_SID));
191 sid_copy(sid, &global_sid_NULL);
194 return (result == WBC_ERR_SUCCESS);
197 /* Check for a trusted domain */
199 wbcErr wb_is_trusted_domain(const char *domain)
202 struct wbcDomainInfo *info = NULL;
204 result = wbcDomainInfo(domain, &info);
206 if (WBC_ERROR_IS_OK(result)) {
213 /* Lookup a set of rids in a given domain */
215 bool winbind_lookup_rids(TALLOC_CTX *mem_ctx,
216 const DOM_SID *domain_sid,
217 int num_rids, uint32 *rids,
218 const char **domain_name,
219 const char ***names, enum lsa_SidType **types)
221 const char *dom_name = NULL;
222 const char **namelist = NULL;
223 enum wbcSidType *name_types = NULL;
224 struct wbcDomainSid dom_sid;
228 memcpy(&dom_sid, domain_sid, sizeof(struct wbcDomainSid));
230 ret = wbcLookupRids(&dom_sid, num_rids, rids,
231 &dom_name, &namelist, &name_types);
232 if (ret != WBC_ERR_SUCCESS) {
236 *domain_name = talloc_strdup(mem_ctx, dom_name);
237 *names = TALLOC_ARRAY(mem_ctx, const char*, num_rids);
238 *types = TALLOC_ARRAY(mem_ctx, enum lsa_SidType, num_rids);
240 for(i=0; i<num_rids; i++) {
241 (*names)[i] = talloc_strdup(*names, namelist[i]);
242 (*types)[i] = (enum lsa_SidType)name_types[i];
245 wbcFreeMemory(CONST_DISCARD(char*, dom_name));
246 wbcFreeMemory(namelist);
247 wbcFreeMemory(name_types);
252 /* Ask Winbind to allocate a new uid for us */
254 bool winbind_allocate_uid(uid_t *uid)
258 ret = wbcAllocateUid(uid);
260 return (ret == WBC_ERR_SUCCESS);
263 /* Ask Winbind to allocate a new gid for us */
265 bool winbind_allocate_gid(gid_t *gid)
269 ret = wbcAllocateGid(gid);
271 return (ret == WBC_ERR_SUCCESS);
274 bool winbind_get_groups(TALLOC_CTX * mem_ctx, const char *account, uint32_t *num_groups, gid_t **_groups)
278 gid_t *group_list = NULL;
280 ret = wbcGetGroups(account, &ngroups, &group_list);
281 if (ret != WBC_ERR_SUCCESS)
284 *_groups = TALLOC_ARRAY(mem_ctx, gid_t, ngroups);
285 if (*_groups == NULL) {
286 wbcFreeMemory(group_list);
290 memcpy(*_groups, group_list, ngroups* sizeof(gid_t));
291 *num_groups = ngroups;
293 wbcFreeMemory(group_list);
297 bool winbind_get_sid_aliases(TALLOC_CTX *mem_ctx,
298 const DOM_SID *dom_sid,
299 const DOM_SID *members,
301 uint32_t **pp_alias_rids,
302 size_t *p_num_alias_rids)
305 struct wbcDomainSid domain_sid;
306 struct wbcDomainSid *sid_list = NULL;
311 memcpy(&domain_sid, dom_sid, sizeof(*dom_sid));
313 sid_list = TALLOC_ARRAY(mem_ctx, struct wbcDomainSid, num_members);
315 for (i=0; i < num_members; i++) {
316 memcpy(&sid_list[i], &members[i], sizeof(sid_list[i]));
319 ret = wbcGetSidAliases(&domain_sid,
324 if (ret != WBC_ERR_SUCCESS) {
328 *pp_alias_rids = TALLOC_ARRAY(mem_ctx, uint32_t, num_rids);
329 if (*pp_alias_rids == NULL) {
334 memcpy(*pp_alias_rids, rids, sizeof(uint32_t) * num_rids);
336 *p_num_alias_rids = num_rids;
342 #else /* WITH_WINBIND */
344 struct passwd * winbind_getpwnam(const char * name)
349 struct passwd * winbind_getpwsid(const DOM_SID *sid)
354 bool winbind_lookup_name(const char *dom_name, const char *name, DOM_SID *sid,
355 enum lsa_SidType *name_type)
360 /* Call winbindd to convert sid to name */
362 bool winbind_lookup_sid(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
363 const char **domain, const char **name,
364 enum lsa_SidType *name_type)
369 /* Ping winbindd to see it is alive */
371 bool winbind_ping(void)
376 /* Call winbindd to convert SID to uid */
378 bool winbind_sid_to_uid(uid_t *puid, const DOM_SID *sid)
383 /* Call winbindd to convert uid to sid */
385 bool winbind_uid_to_sid(DOM_SID *sid, uid_t uid)
390 /* Call winbindd to convert SID to gid */
392 bool winbind_sid_to_gid(gid_t *pgid, const DOM_SID *sid)
397 /* Call winbindd to convert gid to sid */
399 bool winbind_gid_to_sid(DOM_SID *sid, gid_t gid)
404 /* Check for a trusted domain */
406 wbcErr wb_is_trusted_domain(const char *domain)
408 return WBC_ERR_UNKNOWN_FAILURE;
411 /* Lookup a set of rids in a given domain */
413 bool winbind_lookup_rids(TALLOC_CTX *mem_ctx,
414 const DOM_SID *domain_sid,
415 int num_rids, uint32 *rids,
416 const char **domain_name,
417 const char ***names, enum lsa_SidType **types)
422 /* Ask Winbind to allocate a new uid for us */
424 bool winbind_allocate_uid(uid_t *uid)
429 /* Ask Winbind to allocate a new gid for us */
431 bool winbind_allocate_gid(gid_t *gid)
436 bool winbind_get_groups(TALLOC_CTX *mem_ctx, const char *account, uint32_t *num_groups, gid_t **_groups)
441 bool winbind_get_sid_aliases(TALLOC_CTX *mem_ctx,
442 const DOM_SID *dom_sid,
443 const DOM_SID *members,
445 uint32_t **pp_alias_rids,
446 size_t *p_num_alias_rids)
451 #endif /* WITH_WINBIND */