|
|
|
@ -5,6 +5,8 @@ import ( |
|
|
|
|
"fmt" |
|
|
|
|
"strconv" |
|
|
|
|
"strings" |
|
|
|
|
"errors" |
|
|
|
|
"net/http" |
|
|
|
|
|
|
|
|
|
"github.com/grafana/grafana/pkg/models" |
|
|
|
|
"github.com/grafana/grafana/pkg/setting" |
|
|
|
@ -75,7 +77,8 @@ func NewOAuthService() { |
|
|
|
|
// GitHub.
|
|
|
|
|
if name == "github" { |
|
|
|
|
setting.OAuthService.GitHub = true |
|
|
|
|
SocialMap["github"] = &SocialGithub{Config: &config, allowedDomains: info.AllowedDomains, ApiUrl: info.ApiUrl, allowSignup: info.AllowSignup} |
|
|
|
|
teamIds := sec.Key("team_ids").Ints(",") |
|
|
|
|
SocialMap["github"] = &SocialGithub{Config: &config, allowedDomains: info.AllowedDomains, ApiUrl: info.ApiUrl, allowSignup: info.AllowSignup, teamIds: teamIds} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Google.
|
|
|
|
@ -105,8 +108,13 @@ type SocialGithub struct { |
|
|
|
|
allowedDomains []string |
|
|
|
|
ApiUrl string |
|
|
|
|
allowSignup bool |
|
|
|
|
teamIds []int |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
|
ErrMissingTeamMembership = errors.New("User not a member of one of the required teams") |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func (s *SocialGithub) Type() int { |
|
|
|
|
return int(models.GITHUB) |
|
|
|
|
} |
|
|
|
@ -119,6 +127,28 @@ func (s *SocialGithub) IsSignupAllowed() bool { |
|
|
|
|
return s.allowSignup |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *SocialGithub) IsTeamMember(client *http.Client, username string, teamId int) bool { |
|
|
|
|
var data struct { |
|
|
|
|
Url string `json:"url"` |
|
|
|
|
State string `json:"state"` |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
membershipUrl := fmt.Sprintf("https://api.github.com/teams/%d/memberships/%s", teamId, username) |
|
|
|
|
r, err := client.Get(membershipUrl) |
|
|
|
|
if err != nil { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
defer r.Body.Close() |
|
|
|
|
|
|
|
|
|
if err = json.NewDecoder(r.Body).Decode(&data); err != nil { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
active := data.State == "active" |
|
|
|
|
return active |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *SocialGithub) UserInfo(token *oauth2.Token) (*BasicUserInfo, error) { |
|
|
|
|
var data struct { |
|
|
|
|
Id int `json:"id"` |
|
|
|
@ -139,11 +169,23 @@ func (s *SocialGithub) UserInfo(token *oauth2.Token) (*BasicUserInfo, error) { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return &BasicUserInfo{ |
|
|
|
|
userInfo := &BasicUserInfo{ |
|
|
|
|
Identity: strconv.Itoa(data.Id), |
|
|
|
|
Name: data.Name, |
|
|
|
|
Email: data.Email, |
|
|
|
|
}, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if len(s.teamIds) > 0 { |
|
|
|
|
for _, teamId := range s.teamIds { |
|
|
|
|
if s.IsTeamMember(client, data.Name, teamId) { |
|
|
|
|
return userInfo, nil |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil, ErrMissingTeamMembership |
|
|
|
|
} else { |
|
|
|
|
return userInfo, nil |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// ________ .__
|
|
|
|
|