|
|
@@ -1,21 +1,72 @@
|
|
|
package api
|
|
|
|
|
|
import (
|
|
|
+ "net/url"
|
|
|
+
|
|
|
"github.com/torkelo/grafana-pro/pkg/api/dtos"
|
|
|
"github.com/torkelo/grafana-pro/pkg/bus"
|
|
|
"github.com/torkelo/grafana-pro/pkg/log"
|
|
|
"github.com/torkelo/grafana-pro/pkg/middleware"
|
|
|
m "github.com/torkelo/grafana-pro/pkg/models"
|
|
|
+ "github.com/torkelo/grafana-pro/pkg/setting"
|
|
|
"github.com/torkelo/grafana-pro/pkg/util"
|
|
|
)
|
|
|
|
|
|
+const (
|
|
|
+ VIEW_INDEX = "index"
|
|
|
+)
|
|
|
+
|
|
|
func LoginView(c *middleware.Context) {
|
|
|
if err := setIndexViewData(c); err != nil {
|
|
|
c.Handle(500, "Failed to get settings", err)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- c.HTML(200, "index")
|
|
|
+ // Check auto-login.
|
|
|
+ uname := c.GetCookie(setting.CookieUserName)
|
|
|
+ if len(uname) == 0 {
|
|
|
+ c.HTML(200, VIEW_INDEX)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ isSucceed := false
|
|
|
+ defer func() {
|
|
|
+ if !isSucceed {
|
|
|
+ log.Trace("auto-login cookie cleared: %s", uname)
|
|
|
+ c.SetCookie(setting.CookieUserName, "", -1, setting.AppSubUrl+"/")
|
|
|
+ c.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubUrl+"/")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ userQuery := m.GetUserByLoginQuery{LoginOrEmail: uname}
|
|
|
+ if err := bus.Dispatch(&userQuery); err != nil {
|
|
|
+ if err != m.ErrUserNotFound {
|
|
|
+ c.Handle(500, "GetUserByLoginQuery", err)
|
|
|
+ } else {
|
|
|
+ c.HTML(200, VIEW_INDEX)
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ user := userQuery.Result
|
|
|
+
|
|
|
+ if val, _ := c.GetSuperSecureCookie(
|
|
|
+ util.EncodeMd5(user.Rands+user.Password), setting.CookieRememberName); val != user.Login {
|
|
|
+ c.HTML(200, VIEW_INDEX)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ isSucceed = true
|
|
|
+ loginUserWithUser(user, c)
|
|
|
+
|
|
|
+ if redirectTo, _ := url.QueryUnescape(c.GetCookie("redirect_to")); len(redirectTo) > 0 {
|
|
|
+ c.SetCookie("redirect_to", "", -1, setting.AppSubUrl+"/")
|
|
|
+ c.Redirect(redirectTo)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ c.Redirect(setting.AppSubUrl + "/")
|
|
|
}
|
|
|
|
|
|
func LoginPost(c *middleware.Context, cmd dtos.LoginCommand) {
|
|
|
@@ -36,9 +87,27 @@ func LoginPost(c *middleware.Context, cmd dtos.LoginCommand) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+ // default to true here for now
|
|
|
+ cmd.Remember = true
|
|
|
+
|
|
|
+ if cmd.Remember {
|
|
|
+ days := 86400 * setting.LogInRememberDays
|
|
|
+ c.SetCookie(setting.CookieUserName, user.Login, days, setting.AppSubUrl+"/")
|
|
|
+ c.SetSuperSecureCookie(util.EncodeMd5(user.Rands+user.Password), setting.CookieRememberName, user.Login, days, setting.AppSubUrl+"/")
|
|
|
+ }
|
|
|
+
|
|
|
loginUserWithUser(user, c)
|
|
|
|
|
|
- c.JsonOK("User logged in")
|
|
|
+ result := map[string]interface{}{
|
|
|
+ "message": "Logged in",
|
|
|
+ }
|
|
|
+
|
|
|
+ if redirectTo, _ := url.QueryUnescape(c.GetCookie("redirect_to")); len(redirectTo) > 0 {
|
|
|
+ result["redirectUrl"] = redirectTo
|
|
|
+ c.SetCookie("redirect_to", "", -1, setting.AppSubUrl+"/")
|
|
|
+ }
|
|
|
+
|
|
|
+ c.JSON(200, result)
|
|
|
}
|
|
|
|
|
|
func loginUserWithUser(user *m.User, c *middleware.Context) {
|
|
|
@@ -50,6 +119,8 @@ func loginUserWithUser(user *m.User, c *middleware.Context) {
|
|
|
}
|
|
|
|
|
|
func LogoutPost(c *middleware.Context) {
|
|
|
- c.Session.Delete("userId")
|
|
|
- c.JSON(200, util.DynMap{"status": "logged out"})
|
|
|
+ c.SetCookie(setting.CookieUserName, "", -1, setting.AppSubUrl+"/")
|
|
|
+ c.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubUrl+"/")
|
|
|
+ c.Session.Destory(c.Context)
|
|
|
+ c.JsonOK("logged out")
|
|
|
}
|