@ -39,6 +39,12 @@ func GetContextHandler() macaron.Handler {
Logger : log . New ( "context" ) ,
}
orgId := int64 ( 0 )
orgIdHeader := ctx . Req . Header . Get ( "X-Grafana-Org-Id" )
if orgIdHeader != "" {
orgId , _ = strconv . ParseInt ( orgIdHeader , 10 , 64 )
}
// the order in which these are tested are important
// look for api key in Authorization header first
// then init session and look for userId in session
@ -46,9 +52,9 @@ func GetContextHandler() macaron.Handler {
// then test if anonymous access is enabled
if initContextWithRenderAuth ( ctx ) ||
initContextWithApiKey ( ctx ) ||
initContextWithBasicAuth ( ctx ) ||
initContextWithAuthProxy ( ctx ) ||
initContextWithUserSessionCookie ( ctx ) ||
initContextWithBasicAuth ( ctx , orgId ) ||
initContextWithAuthProxy ( ctx , orgId ) ||
initContextWithUserSessionCookie ( ctx , orgId ) ||
initContextWithAnonymousUser ( ctx ) {
}
@ -68,18 +74,18 @@ func initContextWithAnonymousUser(ctx *Context) bool {
if err := bus . Dispatch ( & orgQuery ) ; err != nil {
log . Error ( 3 , "Anonymous access organization error: '%s': %s" , setting . AnonymousOrgName , err )
return false
} else {
ctx . IsSignedIn = false
ctx . AllowAnonymous = true
ctx . SignedInUser = & m . SignedInUser { }
ctx . OrgRole = m . RoleType ( setting . AnonymousOrgRole )
ctx . OrgId = orgQuery . Result . Id
ctx . OrgName = orgQuery . Result . Name
return true
}
ctx . IsSignedIn = false
ctx . AllowAnonymous = true
ctx . SignedInUser = & m . SignedInUser { }
ctx . OrgRole = m . RoleType ( setting . AnonymousOrgRole )
ctx . OrgId = orgQuery . Result . Id
ctx . OrgName = orgQuery . Result . Name
return true
}
func initContextWithUserSessionCookie ( ctx * Context ) bool {
func initContextWithUserSessionCookie ( ctx * Context , orgId int64 ) bool {
// initialize session
if err := ctx . Session . Start ( ctx ) ; err != nil {
ctx . Logger . Error ( "Failed to start session" , "error" , err )
@ -91,15 +97,15 @@ func initContextWithUserSessionCookie(ctx *Context) bool {
return false
}
query := m . GetSignedInUserQuery { UserId : userId }
query := m . GetSignedInUserQuery { UserId : userId , OrgId : orgId }
if err := bus . Dispatch ( & query ) ; err != nil {
ctx . Logger . Error ( "Failed to get user with id" , "userId" , userId )
return false
} else {
ctx . SignedInUser = query . Result
ctx . IsSignedIn = true
return true
}
ctx . SignedInUser = query . Result
ctx . IsSignedIn = true
return true
}
func initContextWithApiKey ( ctx * Context ) bool {
@ -114,30 +120,31 @@ func initContextWithApiKey(ctx *Context) bool {
ctx . JsonApiErr ( 401 , "Invalid API key" , err )
return true
}
// fetch key
keyQuery := m . GetApiKeyByNameQuery { KeyName : decoded . Name , OrgId : decoded . OrgId }
if err := bus . Dispatch ( & keyQuery ) ; err != nil {
ctx . JsonApiErr ( 401 , "Invalid API key" , err )
return true
} else {
apikey := keyQuery . Result
}
// validate api key
if ! apikeygen . IsValid ( decoded , apikey . Key ) {
ctx . JsonApiErr ( 401 , "Invalid API key" , err )
return true
}
apikey := keyQuery . Result
ctx . IsSignedIn = true
ctx . SignedInUser = & m . SignedInUser { }
ctx . OrgRole = apikey . Role
ctx . ApiKeyId = apikey . Id
ctx . OrgId = apikey . OrgId
// validate api key
if ! apikeygen . IsValid ( decoded , apikey . Key ) {
ctx . JsonApiErr ( 401 , "Invalid API key" , err )
return true
}
ctx . IsSignedIn = true
ctx . SignedInUser = & m . SignedInUser { }
ctx . OrgRole = apikey . Role
ctx . ApiKeyId = apikey . Id
ctx . OrgId = apikey . OrgId
return true
}
func initContextWithBasicAuth ( ctx * Context ) bool {
func initContextWithBasicAuth ( ctx * Context , orgId int64 ) bool {
if ! setting . BasicAuthEnabled {
return false
@ -168,15 +175,15 @@ func initContextWithBasicAuth(ctx *Context) bool {
return true
}
query := m . GetSignedInUserQuery { UserId : user . Id }
query := m . GetSignedInUserQuery { UserId : user . Id , OrgId : orgId }
if err := bus . Dispatch ( & query ) ; err != nil {
ctx . JsonApiErr ( 401 , "Authentication error" , err )
return true
} else {
ctx . SignedInUser = query . Result
ctx . IsSignedIn = true
return true
}
ctx . SignedInUser = query . Result
ctx . IsSignedIn = true
return true
}
// Handle handles and logs error by given status.