|
|
|
@ -186,6 +186,37 @@ func (s *SocialGithub) IsOrganizationMember(client *http.Client) bool { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *SocialGithub) FetchPrivateEmail(client *http.Client) (string, error) { |
|
|
|
|
type Record struct { |
|
|
|
|
Email string `json:"email"` |
|
|
|
|
Primary bool `json:"primary"` |
|
|
|
|
Verified bool `json:"verified"` |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
emailsUrl := fmt.Sprintf("https://api.github.com/user/emails") |
|
|
|
|
r, err := client.Get(emailsUrl) |
|
|
|
|
if err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
defer r.Body.Close() |
|
|
|
|
|
|
|
|
|
var records []Record |
|
|
|
|
|
|
|
|
|
if err = json.NewDecoder(r.Body).Decode(&records); err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var email = "" |
|
|
|
|
for _, record := range records { |
|
|
|
|
if record.Primary { |
|
|
|
|
email = record.Email |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return email, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *SocialGithub) FetchTeamMemberships(client *http.Client) ([]int, error) { |
|
|
|
|
type Record struct { |
|
|
|
|
Id int `json:"id"` |
|
|
|
@ -274,6 +305,13 @@ func (s *SocialGithub) UserInfo(token *oauth2.Token) (*BasicUserInfo, error) { |
|
|
|
|
return nil, ErrMissingOrganizationMembership |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if userInfo.Email == "" { |
|
|
|
|
userInfo.Email, err = s.FetchPrivateEmail(client) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return userInfo, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|