s3:winbind: Convert wb_group_members_send() to resolve array of groups
authorPavel Filipenský <pfilipensky@samba.org>
Thu, 9 Mar 2023 15:00:20 +0000 (16:00 +0100)
committerAndreas Schneider <asn@cryptomilk.org>
Tue, 13 Jun 2023 12:15:32 +0000 (12:15 +0000)
Signed-off-by: Pavel Filipenský <pfilipensky@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
source3/winbindd/wb_getgrsid.c
source3/winbindd/wb_group_members.c
source3/winbindd/winbindd_proto.h

index c62d5040dc995ca18e9aca361f3dd40d7d40acc5..f2c7d9d72fdcbd89bd6cff47122aa2275475bb14 100644 (file)
@@ -177,8 +177,12 @@ static void wb_getgrsid_sid2gid_done(struct tevent_req *subreq)
         * the "regular" case of a group type sid.
         */
 
-       subreq = wb_group_members_send(state, state->ev, &state->sid,
-                                      state->type, state->max_nesting);
+       subreq = wb_group_members_send(state,
+                                      state->ev,
+                                      &state->sid,
+                                      1,
+                                      &state->type,
+                                      state->max_nesting);
        if (tevent_req_nomem(subreq, req)) {
                return;
        }
index 65ae4271d57f74b762d727a90c131f74066e3f52..3fe7357e8b7b82ea9ef39536f39e7911784b636e 100644 (file)
@@ -294,24 +294,27 @@ static void wb_group_members_done(struct tevent_req *subreq);
 struct tevent_req *wb_group_members_send(TALLOC_CTX *mem_ctx,
                                         struct tevent_context *ev,
                                         const struct dom_sid *sid,
-                                        enum lsa_SidType type,
+                                        uint32_t num_sids,
+                                        enum lsa_SidType *type,
                                         int max_depth)
 {
        struct tevent_req *req, *subreq = NULL;
        struct wb_group_members_state *state;
        NTSTATUS status;
        struct dom_sid_buf buf;
+       uint32_t i;
 
        req = tevent_req_create(mem_ctx, &state,
                                struct wb_group_members_state);
        if (req == NULL) {
                return NULL;
        }
-       D_INFO("WB command group_members start.\n"
-              "Looking up domain SID %s with SID type %d and max_depth %d.\n",
-              dom_sid_str_buf(sid, &buf),
-              type,
-              max_depth);
+       D_INFO("WB command group_members start (max_depth=%d).\n", max_depth);
+       for (i = 0; i < num_sids; i++) {
+               D_INFO("Looking up members of group SID %s with SID type %d\n",
+                      dom_sid_str_buf(&sid[i], &buf),
+                      type[i]);
+       }
 
        state->ev = ev;
        state->depth = max_depth;
@@ -320,13 +323,16 @@ struct tevent_req *wb_group_members_send(TALLOC_CTX *mem_ctx,
                return tevent_req_post(req, ev);
        }
 
-       state->groups = talloc(state, struct wbint_Principal);
+       state->groups = talloc_array(state, struct wbint_Principal, num_sids);
        if (tevent_req_nomem(state->groups, req)) {
                return tevent_req_post(req, ev);
        }
-       state->groups->name = NULL;
-       sid_copy(&state->groups->sid, sid);
-       state->groups->type = type;
+
+       for (i = 0; i < num_sids; i++) {
+               state->groups[i].name = NULL;
+               sid_copy(&state->groups[i].sid, &sid[i]);
+               state->groups[i].type = type[i];
+       }
 
        status = wb_group_members_next_subreq(state, state, &subreq);
        if (tevent_req_nterror(req, status)) {
index 8ebe19f0f9ee37e1faf2d796eb75a9a03986cc8c..46682ed0dabc1d968cd6de020bf2920e479f6023 100644 (file)
@@ -714,7 +714,8 @@ NTSTATUS winbindd_show_sequence_recv(struct tevent_req *req,
 struct tevent_req *wb_group_members_send(TALLOC_CTX *mem_ctx,
                                         struct tevent_context *ev,
                                         const struct dom_sid *sid,
-                                        enum lsa_SidType type,
+                                        uint32_t num_sids,
+                                        enum lsa_SidType *type,
                                         int max_depth);
 NTSTATUS wb_group_members_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
                               struct db_context **members);