Files
trihuy-russian/web/controller/index.go
T

111 lines
3.0 KiB
Go
Raw Normal View History

2023-02-09 22:48:06 +03:30
package controller
import (
"net/http"
2024-07-14 23:37:43 +02:00
"text/template"
2023-02-09 22:48:06 +03:30
"time"
2024-03-11 01:01:24 +03:30
2023-02-09 22:48:06 +03:30
"x-ui/logger"
"x-ui/web/service"
"x-ui/web/session"
"github.com/gin-gonic/gin"
)
type LoginForm struct {
2023-04-21 19:00:14 +03:30
Username string `json:"username" form:"username"`
Password string `json:"password" form:"password"`
LoginSecret string `json:"loginSecret" form:"loginSecret"`
2023-02-09 22:48:06 +03:30
}
type IndexController struct {
BaseController
2023-04-21 19:00:14 +03:30
settingService service.SettingService
userService service.UserService
tgbot service.Tgbot
2023-02-09 22:48:06 +03:30
}
func NewIndexController(g *gin.RouterGroup) *IndexController {
a := &IndexController{}
a.initRouter(g)
return a
}
func (a *IndexController) initRouter(g *gin.RouterGroup) {
g.GET("/", a.index)
g.POST("/login", a.login)
g.GET("/logout", a.logout)
2023-04-21 19:00:14 +03:30
g.POST("/getSecretStatus", a.getSecretStatus)
2023-02-09 22:48:06 +03:30
}
func (a *IndexController) index(c *gin.Context) {
if session.IsLogin(c) {
2023-05-12 22:36:05 +04:30
c.Redirect(http.StatusTemporaryRedirect, "panel/")
2023-02-09 22:48:06 +03:30
return
}
html(c, "login.html", "pages.login.title", nil)
}
func (a *IndexController) login(c *gin.Context) {
var form LoginForm
err := c.ShouldBind(&form)
if err != nil {
2024-03-11 01:01:24 +03:30
pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.invalidFormData"))
2023-02-09 22:48:06 +03:30
return
}
if form.Username == "" {
2024-03-11 01:01:24 +03:30
pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.emptyUsername"))
2023-02-09 22:48:06 +03:30
return
}
if form.Password == "" {
2024-03-11 01:01:24 +03:30
pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.emptyPassword"))
2023-02-09 22:48:06 +03:30
return
}
2023-05-20 19:39:01 +04:30
2023-04-21 19:00:14 +03:30
user := a.userService.CheckUser(form.Username, form.Password, form.LoginSecret)
2023-02-09 22:48:06 +03:30
timeStr := time.Now().Format("2006-01-02 15:04:05")
2024-07-14 23:37:43 +02:00
safeUser := template.HTMLEscapeString(form.Username)
safePass := template.HTMLEscapeString(form.Password)
safeSecret := template.HTMLEscapeString(form.LoginSecret)
2023-02-09 22:48:06 +03:30
if user == nil {
logger.Warningf("wrong username: \"%s\", password: \"%s\", secret: \"%s\", IP: \"%s\"", safeUser, safePass, safeSecret, getRemoteIp(c))
2024-07-14 23:37:43 +02:00
a.tgbot.UserLoginNotify(safeUser, safePass, getRemoteIp(c), timeStr, 0)
2024-03-11 01:01:24 +03:30
pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.wrongUsernameOrPassword"))
2023-02-09 22:48:06 +03:30
return
} else {
2024-07-14 23:37:43 +02:00
logger.Infof("%s logged in successfully, Ip Address: %s\n", safeUser, getRemoteIp(c))
a.tgbot.UserLoginNotify(safeUser, ``, getRemoteIp(c), timeStr, 1)
2023-04-26 02:09:56 +03:30
}
2023-04-25 15:00:21 +03:30
2023-04-26 02:09:56 +03:30
sessionMaxAge, err := a.settingService.GetSessionMaxAge()
if err != nil {
2024-07-08 23:08:00 +02:00
logger.Warning("Unable to get session's max age from DB")
2023-04-26 02:09:56 +03:30
}
2023-04-25 15:00:21 +03:30
2024-08-06 13:44:48 +02:00
err = session.SetMaxAge(c, sessionMaxAge*60)
if err != nil {
logger.Warning("Unable to set session's max age")
2023-02-09 22:48:06 +03:30
}
err = session.SetLoginUser(c, user)
2024-07-08 23:08:00 +02:00
logger.Infof("%s logged in successfully", user.Username)
2023-05-21 03:29:27 +04:30
jsonMsg(c, I18nWeb(c, "pages.login.toasts.successLogin"), err)
2023-02-09 22:48:06 +03:30
}
func (a *IndexController) logout(c *gin.Context) {
user := session.GetLoginUser(c)
if user != nil {
2024-07-08 23:08:00 +02:00
logger.Infof("%s logged out successfully", user.Username)
2023-02-09 22:48:06 +03:30
}
session.ClearSession(c)
c.Redirect(http.StatusTemporaryRedirect, c.GetString("base_path"))
}
2023-04-21 19:00:14 +03:30
func (a *IndexController) getSecretStatus(c *gin.Context) {
status, err := a.settingService.GetSecretStatus()
if err == nil {
jsonObj(c, status, nil)
}
}