grafana/pkg/social/social.go

142 lines
3.9 KiB
Go
Raw Normal View History

2014-10-07 14:54:38 -05:00
package social
import (
"strings"
2015-02-05 03:37:13 -06:00
"github.com/grafana/grafana/pkg/setting"
"golang.org/x/net/context"
2014-11-28 04:51:34 -06:00
2014-12-30 03:10:13 -06:00
"golang.org/x/oauth2"
2014-10-07 14:54:38 -05:00
)
type BasicUserInfo struct {
Identity string
Name string
Email string
Login string
Company string
Role string
2014-10-07 14:54:38 -05:00
}
type SocialConnector interface {
Type() int
2014-12-30 03:10:13 -06:00
UserInfo(token *oauth2.Token) (*BasicUserInfo, error)
IsEmailAllowed(email string) bool
IsSignupAllowed() bool
2014-10-07 14:54:38 -05:00
2014-12-30 03:10:13 -06:00
AuthCodeURL(state string, opts ...oauth2.AuthCodeOption) string
Exchange(ctx context.Context, code string) (*oauth2.Token, error)
2014-10-07 14:54:38 -05:00
}
var (
2014-10-07 16:56:37 -05:00
SocialBaseUrl = "/login/"
2014-10-07 14:54:38 -05:00
SocialMap = make(map[string]SocialConnector)
)
2014-10-07 16:56:37 -05:00
func NewOAuthService() {
2014-10-07 14:54:38 -05:00
setting.OAuthService = &setting.OAuther{}
setting.OAuthService.OAuthInfos = make(map[string]*setting.OAuthInfo)
allOauthes := []string{"github", "google", "generic_oauth", "grafananet"}
2014-10-07 14:54:38 -05:00
for _, name := range allOauthes {
sec := setting.Cfg.Section("auth." + name)
2014-10-07 14:54:38 -05:00
info := &setting.OAuthInfo{
ClientId: sec.Key("client_id").String(),
ClientSecret: sec.Key("client_secret").String(),
Scopes: sec.Key("scopes").Strings(" "),
AuthUrl: sec.Key("auth_url").String(),
TokenUrl: sec.Key("token_url").String(),
ApiUrl: sec.Key("api_url").String(),
Enabled: sec.Key("enabled").MustBool(),
AllowedDomains: sec.Key("allowed_domains").Strings(" "),
AllowSignup: sec.Key("allow_sign_up").MustBool(),
2014-10-07 16:56:37 -05:00
}
if !info.Enabled {
continue
2014-10-07 14:54:38 -05:00
}
setting.OAuthService.OAuthInfos[name] = info
2014-12-30 03:10:13 -06:00
config := oauth2.Config{
ClientID: info.ClientId,
ClientSecret: info.ClientSecret,
Endpoint: oauth2.Endpoint{
AuthURL: info.AuthUrl,
TokenURL: info.TokenUrl,
},
RedirectURL: strings.TrimSuffix(setting.AppUrl, "/") + SocialBaseUrl + name,
Scopes: info.Scopes,
2014-10-07 14:54:38 -05:00
}
2014-10-07 16:56:37 -05:00
// GitHub.
if name == "github" {
setting.OAuthService.GitHub = true
2015-04-28 22:19:48 -05:00
teamIds := sec.Key("team_ids").Ints(",")
2015-05-23 09:06:51 -05:00
allowedOrganizations := sec.Key("allowed_organizations").Strings(" ")
2015-04-29 02:49:22 -05:00
SocialMap["github"] = &SocialGithub{
2015-05-23 09:06:51 -05:00
Config: &config,
allowedDomains: info.AllowedDomains,
apiUrl: info.ApiUrl,
allowSignup: info.AllowSignup,
teamIds: teamIds,
allowedOrganizations: allowedOrganizations,
2015-04-29 02:49:22 -05:00
}
2014-10-07 16:56:37 -05:00
}
2014-10-07 14:54:38 -05:00
2014-10-07 16:56:37 -05:00
// Google.
if name == "google" {
setting.OAuthService.Google = true
2015-04-29 02:49:22 -05:00
SocialMap["google"] = &SocialGoogle{
Config: &config, allowedDomains: info.AllowedDomains,
apiUrl: info.ApiUrl,
allowSignup: info.AllowSignup,
}
2014-10-07 16:56:37 -05:00
}
// Generic - Uses the same scheme as Github.
if name == "generic_oauth" {
setting.OAuthService.Generic = true
setting.OAuthService.OAuthProviderName = sec.Key("oauth_provider_name").String()
teamIds := sec.Key("team_ids").Ints(",")
allowedOrganizations := sec.Key("allowed_organizations").Strings(" ")
SocialMap["generic_oauth"] = &GenericOAuth{
Config: &config,
allowedDomains: info.AllowedDomains,
apiUrl: info.ApiUrl,
allowSignup: info.AllowSignup,
teamIds: teamIds,
allowedOrganizations: allowedOrganizations,
}
}
if name == "grafananet" {
setting.OAuthService.GrafanaNet = true
allowedOrganizations := sec.Key("allowed_organizations").Strings(" ")
url := sec.Key("url").String()
if url == "" {
url = "https://grafana.net"
}
config := oauth2.Config{
ClientID: info.ClientId,
ClientSecret: info.ClientSecret,
Endpoint: oauth2.Endpoint{
AuthURL: url + "/oauth2/authorize",
TokenURL: url + "/api/oauth2/token",
},
RedirectURL: strings.TrimSuffix(setting.AppUrl, "/") + SocialBaseUrl + name,
Scopes: info.Scopes,
}
SocialMap["grafananet"] = &SocialGrafanaNet{
Config: &config,
url: url,
allowSignup: info.AllowSignup,
allowedOrganizations: allowedOrganizations,
}
}
2014-10-07 14:54:38 -05:00
}
}