From b85d7849ada9bdf3cc35a82fddf6d51bce970dff Mon Sep 17 00:00:00 2001 From: Fabrice Rabaute Date: Tue, 14 Jan 2020 12:18:39 -0800 Subject: [PATCH] google: Retrieve all the groups for a user The list of groups is paginated (default page is 200), so when a user has more than 200 groups, only the first 200 are retrieve. This change is retrieving all the groups for a user by querying all the pages. --- connector/google/google.go | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/connector/google/google.go b/connector/google/google.go index 37b6dc15..0e823851 100644 --- a/connector/google/google.go +++ b/connector/google/google.go @@ -240,15 +240,24 @@ func (c *googleConnector) createIdentity(ctx context.Context, identity connector // getGroups creates a connection to the admin directory service and lists // all groups the user is a member of func (c *googleConnector) getGroups(email string) ([]string, error) { - groupsList, err := c.adminSrv.Groups.List().UserKey(email).Do() - if err != nil { - return nil, fmt.Errorf("could not list groups: %v", err) - } - var userGroups []string - for _, group := range groupsList.Groups { - // TODO (joelspeed): Make desried group key configurable - userGroups = append(userGroups, group.Email) + var err error + groupsList := &admin.Groups{} + for { + groupsList, err = c.adminSrv.Groups.List(). + UserKey(email).PageToken(groupsList.NextPageToken).Do() + if err != nil { + return nil, fmt.Errorf("could not list groups: %v", err) + } + + for _, group := range groupsList.Groups { + // TODO (joelspeed): Make desried group key configurable + userGroups = append(userGroups, group.Email) + } + + if groupsList.NextPageToken == "" { + break + } } return userGroups, nil