mirror of
https://github.com/grafana/grafana.git
synced 2024-11-27 11:20:27 -06:00
3fd6ae597d
Signed-off-by: Dmitry Smirnov <onlyjob@member.fsf.org>
81 lines
2.1 KiB
Go
81 lines
2.1 KiB
Go
package middleware
|
|
|
|
import (
|
|
"github.com/grafana/grafana/pkg/bus"
|
|
"github.com/grafana/grafana/pkg/log"
|
|
m "github.com/grafana/grafana/pkg/models"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
)
|
|
|
|
func initContextWithAuthProxy(ctx *Context) bool {
|
|
if !setting.AuthProxyEnabled {
|
|
return false
|
|
}
|
|
|
|
proxyHeaderValue := ctx.Req.Header.Get(setting.AuthProxyHeaderName)
|
|
if len(proxyHeaderValue) == 0 {
|
|
return false
|
|
}
|
|
|
|
query := getSignedInUserQueryForProxyAuth(proxyHeaderValue)
|
|
if err := bus.Dispatch(query); err != nil {
|
|
if err != m.ErrUserNotFound {
|
|
ctx.Handle(500, "Failed to find user specified in auth proxy header", err)
|
|
return true
|
|
}
|
|
|
|
if setting.AuthProxyAutoSignUp {
|
|
cmd := getCreateUserCommandForProxyAuth(proxyHeaderValue)
|
|
if err := bus.Dispatch(cmd); err != nil {
|
|
ctx.Handle(500, "Failed to create user specified in auth proxy header", err)
|
|
return true
|
|
}
|
|
query = &m.GetSignedInUserQuery{UserId: cmd.Result.Id}
|
|
if err := bus.Dispatch(query); err != nil {
|
|
ctx.Handle(500, "Failed find user after creation", err)
|
|
return true
|
|
}
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
// initialize session
|
|
if err := ctx.Session.Start(ctx); err != nil {
|
|
log.Error(3, "Failed to start session", err)
|
|
return false
|
|
}
|
|
|
|
ctx.SignedInUser = query.Result
|
|
ctx.IsSignedIn = true
|
|
ctx.Session.Set(SESS_KEY_USERID, ctx.UserId)
|
|
|
|
return true
|
|
}
|
|
|
|
func getSignedInUserQueryForProxyAuth(headerVal string) *m.GetSignedInUserQuery {
|
|
query := m.GetSignedInUserQuery{}
|
|
if setting.AuthProxyHeaderProperty == "username" {
|
|
query.Login = headerVal
|
|
} else if setting.AuthProxyHeaderProperty == "email" {
|
|
query.Email = headerVal
|
|
} else {
|
|
panic("Auth proxy header property invalid")
|
|
}
|
|
return &query
|
|
}
|
|
|
|
func getCreateUserCommandForProxyAuth(headerVal string) *m.CreateUserCommand {
|
|
cmd := m.CreateUserCommand{}
|
|
if setting.AuthProxyHeaderProperty == "username" {
|
|
cmd.Login = headerVal
|
|
cmd.Email = headerVal
|
|
} else if setting.AuthProxyHeaderProperty == "email" {
|
|
cmd.Email = headerVal
|
|
cmd.Login = headerVal
|
|
} else {
|
|
panic("Auth proxy header property invalid")
|
|
}
|
|
return &cmd
|
|
}
|