s3-winbind: Added a common rpc_lookup_usergroups function.
authorAndreas Schneider <asn@samba.org>
Fri, 18 Jun 2010 16:19:16 +0000 (18:19 +0200)
committerAndreas Schneider <asn@samba.org>
Mon, 5 Jul 2010 13:59:12 +0000 (15:59 +0200)
source3/winbindd/winbindd_rpc.c
source3/winbindd/winbindd_rpc.h

index 0da5f6923c68853e5a6e8d394f78c02b82746915..201eedd095784d7b655b23cc7be399480a512935 100644 (file)
@@ -509,3 +509,65 @@ NTSTATUS rpc_query_user(TALLOC_CTX *mem_ctx,
 
        return NT_STATUS_OK;
 }
+
+/* Lookup groups a user is a member of. */
+NTSTATUS rpc_lookup_usergroups(TALLOC_CTX *mem_ctx,
+                              struct rpc_pipe_client *samr_pipe,
+                              struct policy_handle *samr_policy,
+                              const struct dom_sid *domain_sid,
+                              const struct dom_sid *user_sid,
+                              uint32_t *pnum_groups,
+                              struct dom_sid **puser_grpsids)
+{
+       struct policy_handle user_policy;
+       struct samr_RidWithAttributeArray *rid_array = NULL;
+       struct dom_sid *user_grpsids = NULL;
+       uint32_t num_groups = 0, i;
+       uint32_t user_rid;
+       NTSTATUS status;
+
+       if (!sid_peek_check_rid(domain_sid, user_sid, &user_rid)) {
+               return NT_STATUS_UNSUCCESSFUL;
+       }
+
+       /* Get user handle */
+       status = rpccli_samr_OpenUser(samr_pipe,
+                                     mem_ctx,
+                                     samr_policy,
+                                     SEC_FLAG_MAXIMUM_ALLOWED,
+                                     user_rid,
+                                     &user_policy);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       /* Query user rids */
+       status = rpccli_samr_GetGroupsForUser(samr_pipe,
+                                             mem_ctx,
+                                             &user_policy,
+                                             &rid_array);
+       num_groups = rid_array->count;
+
+       rpccli_samr_Close(samr_pipe, mem_ctx, &user_policy);
+
+       if (!NT_STATUS_IS_OK(status) || num_groups == 0) {
+               return status;
+       }
+
+       user_grpsids = TALLOC_ARRAY(mem_ctx, struct dom_sid, num_groups);
+       if (user_grpsids == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               return status;
+       }
+
+       for (i = 0; i < num_groups; i++) {
+               sid_compose(&(user_grpsids[i]), domain_sid,
+                           rid_array->rids[i].rid);
+       }
+
+       *pnum_groups = num_groups;
+
+       *puser_grpsids = user_grpsids;
+
+       return NT_STATUS_OK;
+}
index 6d888e6c7e587f059821dd4493a945e284f243a3..c46014166d62d008278f5aaac65df8f9a747ef21 100644 (file)
@@ -87,4 +87,13 @@ NTSTATUS rpc_query_user(TALLOC_CTX *mem_ctx,
                        const struct dom_sid *user_sid,
                        struct wbint_userinfo *user_info);
 
+/* Lookup groups a user is a member of. */
+NTSTATUS rpc_lookup_usergroups(TALLOC_CTX *mem_ctx,
+                              struct rpc_pipe_client *samr_pipe,
+                              struct policy_handle *samr_policy,
+                              const struct dom_sid *domain_sid,
+                              const struct dom_sid *user_sid,
+                              uint32_t *pnum_groups,
+                              struct dom_sid **puser_grpsids);
+
 #endif /* _WINBINDD_RPC_H_ */