From 4de0149bd9b80cceac07e66486345d50742f7ab2 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Wed, 11 Jan 2023 03:52:17 -0500 Subject: [PATCH] OAuth: Support pagination for GitHub orgs (#58648) * Support pagination for github orgs * fix unused variable * Increase initial page to 100 per the way teams work --- pkg/login/social/github_oauth.go | 40 ++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/pkg/login/social/github_oauth.go b/pkg/login/social/github_oauth.go index a43610f09af..ca56f2888a7 100644 --- a/pkg/login/social/github_oauth.go +++ b/pkg/login/social/github_oauth.go @@ -147,27 +147,33 @@ func (s *SocialGithub) HasMoreRecords(headers http.Header) (string, bool) { } func (s *SocialGithub) FetchOrganizations(client *http.Client, organizationsUrl string) ([]string, error) { + url := organizationsUrl + hasMore := true + logins := make([]string, 0) + type Record struct { Login string `json:"login"` } - response, err := s.httpGet(client, organizationsUrl) - if err != nil { - return nil, fmt.Errorf("error getting organizations: %s", err) + for hasMore { + response, err := s.httpGet(client, url) + if err != nil { + return nil, fmt.Errorf("error getting organizations: %s", err) + } + + var records []Record + + err = json.Unmarshal(response.Body, &records) + if err != nil { + return nil, fmt.Errorf("error getting organizations: %s", err) + } + + for _, record := range records { + logins = append(logins, record.Login) + } + + url, hasMore = s.HasMoreRecords(response.Headers) } - - var records []Record - - err = json.Unmarshal(response.Body, &records) - if err != nil { - return nil, fmt.Errorf("error getting organizations: %s", err) - } - - var logins = make([]string, len(records)) - for i, record := range records { - logins[i] = record.Login - } - return logins, nil } @@ -218,7 +224,7 @@ func (s *SocialGithub) UserInfo(client *http.Client, token *oauth2.Token) (*Basi userInfo.Name = data.Name } - organizationsUrl := fmt.Sprintf(s.apiUrl + "/orgs") + organizationsUrl := fmt.Sprintf(s.apiUrl + "/orgs?per_page=100") if !s.IsTeamMember(client) { return nil, ErrMissingTeamMembership