|
|
@@ -23,6 +23,13 @@ import (
|
|
|
"github.com/grafana/grafana/pkg/social"
|
|
|
)
|
|
|
|
|
|
+var (
|
|
|
+ ErrProviderDeniedRequest = errors.New("Login provider denied login request")
|
|
|
+ ErrEmailNotAllowed = errors.New("Required email domain not fulfilled")
|
|
|
+ ErrSignUpNotAllowed = errors.New("Signup is not allowed for this adapter")
|
|
|
+ ErrUsersQuotaReached = errors.New("Users quota reached")
|
|
|
+)
|
|
|
+
|
|
|
func GenStateString() string {
|
|
|
rnd := make([]byte, 32)
|
|
|
rand.Read(rnd)
|
|
|
@@ -45,8 +52,7 @@ func OAuthLogin(ctx *middleware.Context) {
|
|
|
error := ctx.Query("error")
|
|
|
if error != "" {
|
|
|
errorDesc := ctx.Query("error_description")
|
|
|
- ctx.Logger.Info("OAuthLogin Failed", "error", error, "errorDesc", errorDesc)
|
|
|
- ctx.Redirect(setting.AppSubUrl + "/login?failCode=1003")
|
|
|
+ redirectWithError(ctx, ErrProviderDeniedRequest, "error", error, "errorDesc", errorDesc)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
@@ -118,10 +124,8 @@ func OAuthLogin(ctx *middleware.Context) {
|
|
|
// get user info
|
|
|
userInfo, err := connect.UserInfo(client)
|
|
|
if err != nil {
|
|
|
- if err == social.ErrMissingTeamMembership {
|
|
|
- ctx.Redirect(setting.AppSubUrl + "/login?failCode=1000")
|
|
|
- } else if err == social.ErrMissingOrganizationMembership {
|
|
|
- ctx.Redirect(setting.AppSubUrl + "/login?failCode=1001")
|
|
|
+ if sErr, ok := err.(*social.Error); ok {
|
|
|
+ redirectWithError(ctx, sErr)
|
|
|
} else {
|
|
|
ctx.Handle(500, fmt.Sprintf("login.OAuthLogin(get info from %s)", name), err)
|
|
|
}
|
|
|
@@ -132,8 +136,7 @@ func OAuthLogin(ctx *middleware.Context) {
|
|
|
|
|
|
// validate that the email is allowed to login to grafana
|
|
|
if !connect.IsEmailAllowed(userInfo.Email) {
|
|
|
- ctx.Logger.Info("OAuth login attempt with unallowed email", "email", userInfo.Email)
|
|
|
- ctx.Redirect(setting.AppSubUrl + "/login?failCode=1002")
|
|
|
+ redirectWithError(ctx, ErrEmailNotAllowed)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
@@ -143,7 +146,7 @@ func OAuthLogin(ctx *middleware.Context) {
|
|
|
// create account if missing
|
|
|
if err == m.ErrUserNotFound {
|
|
|
if !connect.IsSignupAllowed() {
|
|
|
- ctx.Redirect(setting.AppSubUrl + "/login")
|
|
|
+ redirectWithError(ctx, ErrSignUpNotAllowed)
|
|
|
return
|
|
|
}
|
|
|
limitReached, err := middleware.QuotaReached(ctx, "user")
|
|
|
@@ -152,7 +155,7 @@ func OAuthLogin(ctx *middleware.Context) {
|
|
|
return
|
|
|
}
|
|
|
if limitReached {
|
|
|
- ctx.Redirect(setting.AppSubUrl + "/login")
|
|
|
+ redirectWithError(ctx, ErrUsersQuotaReached)
|
|
|
return
|
|
|
}
|
|
|
cmd := m.CreateUserCommand{
|
|
|
@@ -186,3 +189,10 @@ func OAuthLogin(ctx *middleware.Context) {
|
|
|
|
|
|
ctx.Redirect(setting.AppSubUrl + "/")
|
|
|
}
|
|
|
+
|
|
|
+func redirectWithError(ctx *middleware.Context, err error, v ...interface{}) {
|
|
|
+ ctx.Logger.Info(err.Error(), v...)
|
|
|
+ // TODO: we can use the flash storage here once it's implemented
|
|
|
+ ctx.Session.Set("loginError", err.Error())
|
|
|
+ ctx.Redirect(setting.AppSubUrl + "/login")
|
|
|
+}
|