|
|
@@ -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.
|