index.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package controller
  2. import (
  3. "net/http"
  4. "text/template"
  5. "time"
  6. "x-ui/logger"
  7. "x-ui/web/service"
  8. "x-ui/web/session"
  9. "github.com/gin-contrib/sessions"
  10. "github.com/gin-gonic/gin"
  11. )
  12. type LoginForm struct {
  13. Username string `json:"username" form:"username"`
  14. Password string `json:"password" form:"password"`
  15. TwoFactorCode string `json:"twoFactorCode" form:"twoFactorCode"`
  16. }
  17. type IndexController struct {
  18. BaseController
  19. settingService service.SettingService
  20. userService service.UserService
  21. tgbot service.Tgbot
  22. }
  23. func NewIndexController(g *gin.RouterGroup) *IndexController {
  24. a := &IndexController{}
  25. a.initRouter(g)
  26. return a
  27. }
  28. func (a *IndexController) initRouter(g *gin.RouterGroup) {
  29. g.GET("/", a.index)
  30. g.POST("/login", a.login)
  31. g.GET("/logout", a.logout)
  32. g.POST("/getTwoFactorEnable", a.getTwoFactorEnable)
  33. }
  34. func (a *IndexController) index(c *gin.Context) {
  35. if session.IsLogin(c) {
  36. c.Redirect(http.StatusTemporaryRedirect, "panel/")
  37. return
  38. }
  39. html(c, "login.html", "pages.login.title", nil)
  40. }
  41. func (a *IndexController) login(c *gin.Context) {
  42. var form LoginForm
  43. if err := c.ShouldBind(&form); err != nil {
  44. pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.invalidFormData"))
  45. return
  46. }
  47. if form.Username == "" {
  48. pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.emptyUsername"))
  49. return
  50. }
  51. if form.Password == "" {
  52. pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.emptyPassword"))
  53. return
  54. }
  55. user := a.userService.CheckUser(form.Username, form.Password, form.TwoFactorCode)
  56. timeStr := time.Now().Format("2006-01-02 15:04:05")
  57. safeUser := template.HTMLEscapeString(form.Username)
  58. safePass := template.HTMLEscapeString(form.Password)
  59. if user == nil {
  60. logger.Warningf("wrong username: \"%s\", password: \"%s\", IP: \"%s\"", safeUser, safePass, getRemoteIp(c))
  61. a.tgbot.UserLoginNotify(safeUser, safePass, getRemoteIp(c), timeStr, 0)
  62. pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.wrongUsernameOrPassword"))
  63. return
  64. }
  65. logger.Infof("%s logged in successfully, Ip Address: %s\n", safeUser, getRemoteIp(c))
  66. a.tgbot.UserLoginNotify(safeUser, ``, getRemoteIp(c), timeStr, 1)
  67. sessionMaxAge, err := a.settingService.GetSessionMaxAge()
  68. if err != nil {
  69. logger.Warning("Unable to get session's max age from DB")
  70. }
  71. session.SetMaxAge(c, sessionMaxAge*60)
  72. session.SetLoginUser(c, user)
  73. if err := sessions.Default(c).Save(); err != nil {
  74. logger.Warning("Unable to save session: ", err)
  75. return
  76. }
  77. logger.Infof("%s logged in successfully", safeUser)
  78. jsonMsg(c, I18nWeb(c, "pages.login.toasts.successLogin"), nil)
  79. }
  80. func (a *IndexController) logout(c *gin.Context) {
  81. user := session.GetLoginUser(c)
  82. if user != nil {
  83. logger.Infof("%s logged out successfully", user.Username)
  84. }
  85. session.ClearSession(c)
  86. if err := sessions.Default(c).Save(); err != nil {
  87. logger.Warning("Unable to save session after clearing:", err)
  88. }
  89. c.Redirect(http.StatusTemporaryRedirect, c.GetString("base_path"))
  90. }
  91. func (a *IndexController) getTwoFactorEnable(c *gin.Context) {
  92. status, err := a.settingService.GetTwoFactorEnable()
  93. if err == nil {
  94. jsonObj(c, status, nil)
  95. }
  96. }