libwbclient: add wbcLookupUserSids()
authorStefan Metzmacher <metze@samba.org>
Fri, 21 Mar 2008 09:18:54 +0000 (10:18 +0100)
committerKarolin Seeger <kseeger@samba.org>
Fri, 11 Apr 2008 06:57:23 +0000 (08:57 +0200)
metze
(cherry picked from commit 38007a387a1f1b53877ef9ea518f83ecf026f4f3)

source/nsswitch/libwbclient/wbc_sid.c
source/nsswitch/libwbclient/wbclient.h

index 0519d8bf9f2c3c4808e590a25c8b1c2f9cc9e359..cd865b9bb5e6262a01477b72c040de4658f9dd8f 100644 (file)
@@ -423,3 +423,85 @@ wbcErr wbcLookupRids(struct wbcDomainSid *dom_sid,
 
        return wbc_status;
 }
+
+/** @brief Get the groups a user belongs to
+ *
+ **/
+
+wbcErr wbcLookupUserSids(const struct wbcDomainSid *user_sid,
+                        bool domain_groups_only,
+                        uint32_t *num_sids,
+                        struct wbcDomainSid **_sids)
+{
+       uint32_t i;
+       const char *s;
+       struct winbindd_request request;
+       struct winbindd_response response;
+       char *sid_string = NULL;
+       struct wbcDomainSid *sids = NULL;
+       wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE;
+       int cmd;
+
+       /* Initialise request */
+
+       ZERO_STRUCT(request);
+       ZERO_STRUCT(response);
+
+       if (!user_sid) {
+               wbc_status = WBC_ERR_INVALID_PARAM;
+               BAIL_ON_WBC_ERROR(wbc_status);
+       }
+
+       wbc_status = wbcSidToString(user_sid, &sid_string);
+       BAIL_ON_WBC_ERROR(wbc_status);
+
+       strncpy(request.data.sid, sid_string, sizeof(request.data.sid)-1);
+       wbcFreeMemory(sid_string);
+
+       if (domain_groups_only) {
+               cmd = WINBINDD_GETUSERDOMGROUPS;
+       } else {
+               cmd = WINBINDD_GETUSERSIDS;
+       }
+
+       wbc_status = wbcRequestResponse(cmd,
+                                       &request,
+                                       &response);
+       BAIL_ON_WBC_ERROR(wbc_status);
+
+       if (response.data.num_entries &&
+           !response.extra_data.data) {
+               wbc_status = WBC_INVALID_RESPONSE;
+               BAIL_ON_WBC_ERROR(wbc_status);
+       }
+
+       sids = talloc_array(NULL, struct wbcDomainSid,
+                           response.data.num_entries);
+       BAIL_ON_PTR_ERROR(sids, wbc_status);
+
+       s = (const char *)response.extra_data.data;
+       for (i = 0; i < response.data.num_entries; i++) {
+               char *n = strchr(s, '\n');
+               if (n) {
+                       *n = '\0';
+               }
+               wbc_status = wbcStringToSid(s, &sids[i]);
+               BAIL_ON_WBC_ERROR(wbc_status);
+               s += strlen(s) + 1;
+       }
+
+       *num_sids = response.data.num_entries;
+       *_sids = sids;
+       sids = NULL;
+       wbc_status = WBC_ERR_SUCCESS;
+
+ done:
+       if (response.extra_data.data) {
+               free(response.extra_data.data);
+       }
+       if (sids) {
+               talloc_free(sids);
+       }
+
+       return wbc_status;
+}
index c01db9618d9ae3b53ac2b419d003bbe36f871d69..4b6978080b8f6391bdfa7ea8c3d597a39566024a 100644 (file)
@@ -298,6 +298,11 @@ wbcErr wbcLookupRids(struct wbcDomainSid *dom_sid,
                     const char ***names,
                     enum wbcSidType **types);
 
+wbcErr wbcLookupUserSids(const struct wbcDomainSid *user_sid,
+                        bool domain_groups_only,
+                        uint32_t *num_sids,
+                        struct wbcDomainSid **sids);
+
 /*
  * SID/uid/gid Mappings
  */