@ -11,6 +11,8 @@ import (
"net/http"
"net/url"
"golang.org/x/oauth2"
"github.com/grafana/grafana/pkg/api/response"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/infra/metrics"
@ -20,7 +22,6 @@ import (
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/web"
"golang.org/x/oauth2"
)
var (
@ -131,7 +132,7 @@ func (hs *HTTPServer) OAuthLogin(ctx *models.ReqContext) response.Response {
return nil
}
hashedState := hashStatecode ( state , provider . ClientSecret )
hashedState := hs . hashStatecode ( state , provider . ClientSecret )
cookies . WriteCookie ( ctx . Resp , OauthStateCookieName , hashedState , hs . Cfg . OAuthCookieMaxAge , hs . CookieOptionsFromCfg )
if provider . HostedDomain != "" {
opts = append ( opts , oauth2 . SetAuthURLParam ( "hd" , provider . HostedDomain ) )
@ -154,7 +155,7 @@ func (hs *HTTPServer) OAuthLogin(ctx *models.ReqContext) response.Response {
return nil
}
queryState := hashStatecode ( ctx . Query ( "state" ) , provider . ClientSecret )
queryState := hs . hashStatecode ( ctx . Query ( "state" ) , provider . ClientSecret )
oauthLogger . Info ( "state check" , "queryState" , queryState , "cookieState" , cookieState )
if cookieState != queryState {
hs . handleOAuthLoginError ( ctx , loginInfo , LoginError {
@ -233,7 +234,7 @@ func (hs *HTTPServer) OAuthLogin(ctx *models.ReqContext) response.Response {
return nil
}
loginInfo . ExternalUser = * buildExternalUserInfo ( token , userInfo , name )
loginInfo . ExternalUser = * hs . buildExternalUserInfo ( token , userInfo , name )
loginInfo . User , err = hs . SyncUser ( ctx , & loginInfo . ExternalUser , connect )
if err != nil {
hs . handleOAuthLoginErrorWithRedirect ( ctx , loginInfo , err )
@ -264,7 +265,7 @@ func (hs *HTTPServer) OAuthLogin(ctx *models.ReqContext) response.Response {
}
// buildExternalUserInfo returns a ExternalUserInfo struct from OAuth user profile
func buildExternalUserInfo ( token * oauth2 . Token , userInfo * social . BasicUserInfo , name string ) * models . ExternalUserInfo {
func ( hs * HTTPServer ) buildExternalUserInfo ( token * oauth2 . Token , userInfo * social . BasicUserInfo , name string ) * models . ExternalUserInfo {
oauthLogger . Debug ( "Building external user info from OAuth user info" )
extUser := & models . ExternalUserInfo {
@ -278,13 +279,13 @@ func buildExternalUserInfo(token *oauth2.Token, userInfo *social.BasicUserInfo,
Groups : userInfo . Groups ,
}
if userInfo . Role != "" {
if userInfo . Role != "" && ! hs . Cfg . OAuthSkipOrgRoleUpdateSync {
rt := models . RoleType ( userInfo . Role )
if rt . IsValid ( ) {
// The user will be assigned a role in either the auto-assigned organization or in the default one
var orgID int64
if settin g. AutoAssignOrg && settin g. AutoAssignOrgId > 0 {
orgID = int64 ( settin g. AutoAssignOrgId )
if hs . Cf g. AutoAssignOrg && hs . Cf g. AutoAssignOrgId > 0 {
orgID = int64 ( hs . Cf g. AutoAssignOrgId )
plog . Debug ( "The user has a role assignment and organization membership is auto-assigned" ,
"role" , userInfo . Role , "orgId" , orgID )
} else {
@ -327,8 +328,8 @@ func (hs *HTTPServer) SyncUser(
return cmd . Result , nil
}
func hashStatecode ( code , seed string ) string {
hashBytes := sha256 . Sum256 ( [ ] byte ( code + settin g. SecretKey + seed ) )
func ( hs * HTTPServer ) hashStatecode ( code , seed string ) string {
hashBytes := sha256 . Sum256 ( [ ] byte ( code + hs . Cf g. SecretKey + seed ) )
return hex . EncodeToString ( hashBytes [ : ] )
}