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/>.
22 #include "../libcli/security/security.h"
23 #include "../lib/util/util_pw.h"
24 #include "nsswitch/libwbclient/wbclient.h"
26 #if defined(WITH_WINBIND)
28 #include "lib/winbind_util.h"
30 struct passwd * winbind_getpwnam(const char * name)
33 struct passwd * tmp_pwd = NULL;
34 struct passwd * pwd = NULL;
36 result = wbcGetpwnam(name, &tmp_pwd);
37 if (result != WBC_ERR_SUCCESS)
40 pwd = tcopy_passwd(talloc_tos(), tmp_pwd);
42 wbcFreeMemory(tmp_pwd);
47 struct passwd * winbind_getpwsid(const struct dom_sid *sid)
50 struct passwd * tmp_pwd = NULL;
51 struct passwd * pwd = NULL;
52 struct wbcDomainSid dom_sid;
54 memcpy(&dom_sid, sid, sizeof(dom_sid));
56 result = wbcGetpwsid(&dom_sid, &tmp_pwd);
57 if (result != WBC_ERR_SUCCESS)
60 pwd = tcopy_passwd(talloc_tos(), tmp_pwd);
62 wbcFreeMemory(tmp_pwd);
67 /* Call winbindd to convert a name to a sid */
69 bool winbind_lookup_name(const char *dom_name, const char *name, struct dom_sid *sid,
70 enum lsa_SidType *name_type)
72 struct wbcDomainSid dom_sid;
76 result = wbcLookupName(dom_name, name, &dom_sid, &type);
77 if (result != WBC_ERR_SUCCESS)
80 memcpy(sid, &dom_sid, sizeof(struct dom_sid));
81 *name_type = (enum lsa_SidType)type;
86 /* Call winbindd to convert sid to name */
88 bool winbind_lookup_sid(TALLOC_CTX *mem_ctx, const struct dom_sid *sid,
89 const char **domain, const char **name,
90 enum lsa_SidType *name_type)
92 struct wbcDomainSid dom_sid;
95 char *domain_name = NULL;
96 char *account_name = NULL;
97 struct dom_sid_buf buf;
99 memcpy(&dom_sid, sid, sizeof(dom_sid));
101 result = wbcLookupSid(&dom_sid, &domain_name, &account_name, &type);
102 if (result != WBC_ERR_SUCCESS)
105 /* Copy out result */
108 *domain = talloc_strdup(mem_ctx, domain_name);
111 *name = talloc_strdup(mem_ctx, account_name);
113 *name_type = (enum lsa_SidType)type;
115 DEBUG(10, ("winbind_lookup_sid: SUCCESS: SID %s -> %s %s\n",
116 dom_sid_str_buf(sid, &buf), domain_name, account_name));
118 wbcFreeMemory(domain_name);
119 wbcFreeMemory(account_name);
121 if ((domain && !*domain) || (name && !*name)) {
122 DEBUG(0,("winbind_lookup_sid: talloc() failed!\n"));
130 /* Ping winbindd to see it is alive */
132 bool winbind_ping(void)
134 wbcErr result = wbcPing();
136 return (result == WBC_ERR_SUCCESS);
139 /* Call winbindd to convert SID to uid */
141 bool winbind_sid_to_uid(uid_t *puid, const struct dom_sid *sid)
143 struct wbcDomainSid dom_sid;
146 memcpy(&dom_sid, sid, sizeof(dom_sid));
148 result = wbcSidToUid(&dom_sid, puid);
150 return (result == WBC_ERR_SUCCESS);
153 /* Call winbindd to convert uid to sid */
155 bool winbind_uid_to_sid(struct dom_sid *sid, uid_t uid)
157 struct wbcDomainSid dom_sid;
160 result = wbcUidToSid(uid, &dom_sid);
161 if (result == WBC_ERR_SUCCESS) {
162 memcpy(sid, &dom_sid, sizeof(struct dom_sid));
164 sid_copy(sid, &global_sid_NULL);
167 return (result == WBC_ERR_SUCCESS);
170 /* Call winbindd to convert SID to gid */
172 bool winbind_sid_to_gid(gid_t *pgid, const struct dom_sid *sid)
174 struct wbcDomainSid dom_sid;
177 memcpy(&dom_sid, sid, sizeof(dom_sid));
179 result = wbcSidToGid(&dom_sid, pgid);
181 return (result == WBC_ERR_SUCCESS);
184 /* Call winbindd to convert gid to sid */
186 bool winbind_gid_to_sid(struct dom_sid *sid, gid_t gid)
188 struct wbcDomainSid dom_sid;
191 result = wbcGidToSid(gid, &dom_sid);
192 if (result == WBC_ERR_SUCCESS) {
193 memcpy(sid, &dom_sid, sizeof(struct dom_sid));
195 sid_copy(sid, &global_sid_NULL);
198 return (result == WBC_ERR_SUCCESS);
201 /* Check for a trusted domain */
203 wbcErr wb_is_trusted_domain(const char *domain)
206 struct wbcDomainInfo *info = NULL;
208 result = wbcDomainInfo(domain, &info);
210 if (WBC_ERROR_IS_OK(result)) {
217 /* Lookup a set of rids in a given domain */
219 bool winbind_lookup_rids(TALLOC_CTX *mem_ctx,
220 const struct dom_sid *domain_sid,
221 int num_rids, uint32_t *rids,
222 const char **domain_name,
223 const char ***names, enum lsa_SidType **types)
225 const char *dom_name = NULL;
226 const char **namelist = NULL;
227 enum wbcSidType *name_types = NULL;
228 struct wbcDomainSid dom_sid;
232 memcpy(&dom_sid, domain_sid, sizeof(struct wbcDomainSid));
234 ret = wbcLookupRids(&dom_sid, num_rids, rids,
235 &dom_name, &namelist, &name_types);
236 if (ret != WBC_ERR_SUCCESS) {
240 *domain_name = talloc_strdup(mem_ctx, dom_name);
241 *names = talloc_array(mem_ctx, const char*, num_rids);
242 *types = talloc_array(mem_ctx, enum lsa_SidType, num_rids);
244 for(i=0; i<num_rids; i++) {
245 (*names)[i] = talloc_strdup(*names, namelist[i]);
246 (*types)[i] = (enum lsa_SidType)name_types[i];
249 wbcFreeMemory(discard_const_p(char, dom_name));
250 wbcFreeMemory(namelist);
251 wbcFreeMemory(name_types);
256 /* Ask Winbind to allocate a new uid for us */
258 bool winbind_allocate_uid(uid_t *uid)
262 ret = wbcAllocateUid(uid);
264 return (ret == WBC_ERR_SUCCESS);
267 /* Ask Winbind to allocate a new gid for us */
269 bool winbind_allocate_gid(gid_t *gid)
273 ret = wbcAllocateGid(gid);
275 return (ret == WBC_ERR_SUCCESS);
278 bool winbind_lookup_usersids(TALLOC_CTX *mem_ctx,
279 const struct dom_sid *user_sid,
280 uint32_t *p_num_sids,
281 struct dom_sid **p_sids)
284 struct wbcDomainSid dom_sid;
285 struct wbcDomainSid *sid_list = NULL;
288 memcpy(&dom_sid, user_sid, sizeof(dom_sid));
290 ret = wbcLookupUserSids(&dom_sid,
294 if (ret != WBC_ERR_SUCCESS) {
298 *p_sids = talloc_array(mem_ctx, struct dom_sid, num_sids);
299 if (*p_sids == NULL) {
300 wbcFreeMemory(sid_list);
304 memcpy(*p_sids, sid_list, sizeof(dom_sid) * num_sids);
306 *p_num_sids = num_sids;
307 wbcFreeMemory(sid_list);
312 #else /* WITH_WINBIND */
314 struct passwd * winbind_getpwnam(const char * name)
319 struct passwd * winbind_getpwsid(const struct dom_sid *sid)
324 bool winbind_lookup_name(const char *dom_name, const char *name, struct dom_sid *sid,
325 enum lsa_SidType *name_type)
330 /* Call winbindd to convert sid to name */
332 bool winbind_lookup_sid(TALLOC_CTX *mem_ctx, const struct dom_sid *sid,
333 const char **domain, const char **name,
334 enum lsa_SidType *name_type)
339 /* Ping winbindd to see it is alive */
341 bool winbind_ping(void)
346 /* Call winbindd to convert SID to uid */
348 bool winbind_sid_to_uid(uid_t *puid, const struct dom_sid *sid)
353 /* Call winbindd to convert uid to sid */
355 bool winbind_uid_to_sid(struct dom_sid *sid, uid_t uid)
360 /* Call winbindd to convert SID to gid */
362 bool winbind_sid_to_gid(gid_t *pgid, const struct dom_sid *sid)
367 /* Call winbindd to convert gid to sid */
369 bool winbind_gid_to_sid(struct dom_sid *sid, gid_t gid)
374 /* Check for a trusted domain */
376 wbcErr wb_is_trusted_domain(const char *domain)
378 return WBC_ERR_UNKNOWN_FAILURE;
381 /* Lookup a set of rids in a given domain */
383 bool winbind_lookup_rids(TALLOC_CTX *mem_ctx,
384 const struct dom_sid *domain_sid,
385 int num_rids, uint32_t *rids,
386 const char **domain_name,
387 const char ***names, enum lsa_SidType **types)
392 /* Ask Winbind to allocate a new uid for us */
394 bool winbind_allocate_uid(uid_t *uid)
399 /* Ask Winbind to allocate a new gid for us */
401 bool winbind_allocate_gid(gid_t *gid)
406 bool winbind_lookup_usersids(TALLOC_CTX *mem_ctx,
407 const struct dom_sid *user_sid,
408 uint32_t *p_num_sids,
409 struct dom_sid **p_sids)
414 #endif /* WITH_WINBIND */