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 #include "lib/winbind_util.h"
28 #if defined(WITH_WINBIND)
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 SID to gid */
155 bool winbind_sid_to_gid(gid_t
*pgid
, const struct dom_sid
*sid
)
157 struct wbcDomainSid dom_sid
;
160 memcpy(&dom_sid
, sid
, sizeof(dom_sid
));
162 result
= wbcSidToGid(&dom_sid
, pgid
);
164 return (result
== WBC_ERR_SUCCESS
);
167 bool winbind_xid_to_sid(struct dom_sid
*sid
, const struct unixid
*xid
)
169 struct wbcUnixId wbc_xid
;
170 struct wbcDomainSid dom_sid
;
175 wbc_xid
= (struct wbcUnixId
) {
176 .type
= WBC_ID_TYPE_UID
, .id
.uid
= xid
->id
180 wbc_xid
= (struct wbcUnixId
) {
181 .type
= WBC_ID_TYPE_GID
, .id
.gid
= xid
->id
188 result
= wbcUnixIdsToSids(&wbc_xid
, 1, &dom_sid
);
189 if (result
!= WBC_ERR_SUCCESS
) {
193 memcpy(sid
, &dom_sid
, sizeof(struct dom_sid
));
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 struct dom_sid
*domain_sid
,
217 int num_rids
, uint32_t *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(discard_const_p(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_lookup_usersids(TALLOC_CTX
*mem_ctx
,
275 const struct dom_sid
*user_sid
,
276 uint32_t *p_num_sids
,
277 struct dom_sid
**p_sids
)
280 struct wbcDomainSid dom_sid
;
281 struct wbcDomainSid
*sid_list
= NULL
;
284 memcpy(&dom_sid
, user_sid
, sizeof(dom_sid
));
286 ret
= wbcLookupUserSids(&dom_sid
,
290 if (ret
!= WBC_ERR_SUCCESS
) {
294 *p_sids
= talloc_array(mem_ctx
, struct dom_sid
, num_sids
);
295 if (*p_sids
== NULL
) {
296 wbcFreeMemory(sid_list
);
300 memcpy(*p_sids
, sid_list
, sizeof(dom_sid
) * num_sids
);
302 *p_num_sids
= num_sids
;
303 wbcFreeMemory(sid_list
);
308 #else /* WITH_WINBIND */
310 struct passwd
* winbind_getpwnam(const char * name
)
315 struct passwd
* winbind_getpwsid(const struct dom_sid
*sid
)
320 bool winbind_lookup_name(const char *dom_name
, const char *name
, struct dom_sid
*sid
,
321 enum lsa_SidType
*name_type
)
326 /* Call winbindd to convert sid to name */
328 bool winbind_lookup_sid(TALLOC_CTX
*mem_ctx
, const struct dom_sid
*sid
,
329 const char **domain
, const char **name
,
330 enum lsa_SidType
*name_type
)
335 /* Ping winbindd to see it is alive */
337 bool winbind_ping(void)
342 /* Call winbindd to convert SID to uid */
344 bool winbind_sid_to_uid(uid_t
*puid
, const struct dom_sid
*sid
)
349 /* Call winbindd to convert SID to gid */
351 bool winbind_sid_to_gid(gid_t
*pgid
, const struct dom_sid
*sid
)
356 /* Call winbindd to convert uid or gid to SID */
358 bool winbind_xid_to_sid(struct dom_sid
*sid
, const struct unixid
*xid
)
363 /* Check for a trusted domain */
365 wbcErr
wb_is_trusted_domain(const char *domain
)
367 return WBC_ERR_UNKNOWN_FAILURE
;
370 /* Lookup a set of rids in a given domain */
372 bool winbind_lookup_rids(TALLOC_CTX
*mem_ctx
,
373 const struct dom_sid
*domain_sid
,
374 int num_rids
, uint32_t *rids
,
375 const char **domain_name
,
376 const char ***names
, enum lsa_SidType
**types
)
381 /* Ask Winbind to allocate a new uid for us */
383 bool winbind_allocate_uid(uid_t
*uid
)
388 /* Ask Winbind to allocate a new gid for us */
390 bool winbind_allocate_gid(gid_t
*gid
)
395 bool winbind_lookup_usersids(TALLOC_CTX
*mem_ctx
,
396 const struct dom_sid
*user_sid
,
397 uint32_t *p_num_sids
,
398 struct dom_sid
**p_sids
)
403 #endif /* WITH_WINBIND */