| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | 
							- package controller
 
- import (
 
- 	"net/http"
 
- 	"text/template"
 
- 	"time"
 
- 	"github.com/mhsanaei/3x-ui/v2/logger"
 
- 	"github.com/mhsanaei/3x-ui/v2/web/service"
 
- 	"github.com/mhsanaei/3x-ui/v2/web/session"
 
- 	"github.com/gin-contrib/sessions"
 
- 	"github.com/gin-gonic/gin"
 
- )
 
- // LoginForm represents the login request structure.
 
- type LoginForm struct {
 
- 	Username      string `json:"username" form:"username"`
 
- 	Password      string `json:"password" form:"password"`
 
- 	TwoFactorCode string `json:"twoFactorCode" form:"twoFactorCode"`
 
- }
 
- // IndexController handles the main index and login-related routes.
 
- type IndexController struct {
 
- 	BaseController
 
- 	settingService service.SettingService
 
- 	userService    service.UserService
 
- 	tgbot          service.Tgbot
 
- }
 
- // NewIndexController creates a new IndexController and initializes its routes.
 
- func NewIndexController(g *gin.RouterGroup) *IndexController {
 
- 	a := &IndexController{}
 
- 	a.initRouter(g)
 
- 	return a
 
- }
 
- // initRouter sets up the routes for index, login, logout, and two-factor authentication.
 
- func (a *IndexController) initRouter(g *gin.RouterGroup) {
 
- 	g.GET("/", a.index)
 
- 	g.GET("/logout", a.logout)
 
- 	g.POST("/login", a.login)
 
- 	g.POST("/getTwoFactorEnable", a.getTwoFactorEnable)
 
- }
 
- // index handles the root route, redirecting logged-in users to the panel or showing the login page.
 
- func (a *IndexController) index(c *gin.Context) {
 
- 	if session.IsLogin(c) {
 
- 		c.Redirect(http.StatusTemporaryRedirect, "panel/")
 
- 		return
 
- 	}
 
- 	html(c, "login.html", "pages.login.title", nil)
 
- }
 
- // login handles user authentication and session creation.
 
- func (a *IndexController) login(c *gin.Context) {
 
- 	var form LoginForm
 
- 	if err := c.ShouldBind(&form); err != nil {
 
- 		pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.invalidFormData"))
 
- 		return
 
- 	}
 
- 	if form.Username == "" {
 
- 		pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.emptyUsername"))
 
- 		return
 
- 	}
 
- 	if form.Password == "" {
 
- 		pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.emptyPassword"))
 
- 		return
 
- 	}
 
- 	user := a.userService.CheckUser(form.Username, form.Password, form.TwoFactorCode)
 
- 	timeStr := time.Now().Format("2006-01-02 15:04:05")
 
- 	safeUser := template.HTMLEscapeString(form.Username)
 
- 	safePass := template.HTMLEscapeString(form.Password)
 
- 	if user == nil {
 
- 		logger.Warningf("wrong username: \"%s\", password: \"%s\", IP: \"%s\"", safeUser, safePass, getRemoteIp(c))
 
- 		a.tgbot.UserLoginNotify(safeUser, safePass, getRemoteIp(c), timeStr, 0)
 
- 		pureJsonMsg(c, http.StatusOK, false, I18nWeb(c, "pages.login.toasts.wrongUsernameOrPassword"))
 
- 		return
 
- 	}
 
- 	logger.Infof("%s logged in successfully, Ip Address: %s\n", safeUser, getRemoteIp(c))
 
- 	a.tgbot.UserLoginNotify(safeUser, ``, getRemoteIp(c), timeStr, 1)
 
- 	sessionMaxAge, err := a.settingService.GetSessionMaxAge()
 
- 	if err != nil {
 
- 		logger.Warning("Unable to get session's max age from DB")
 
- 	}
 
- 	session.SetMaxAge(c, sessionMaxAge*60)
 
- 	session.SetLoginUser(c, user)
 
- 	if err := sessions.Default(c).Save(); err != nil {
 
- 		logger.Warning("Unable to save session: ", err)
 
- 		return
 
- 	}
 
- 	logger.Infof("%s logged in successfully", safeUser)
 
- 	jsonMsg(c, I18nWeb(c, "pages.login.toasts.successLogin"), nil)
 
- }
 
- // logout handles user logout by clearing the session and redirecting to the login page.
 
- func (a *IndexController) logout(c *gin.Context) {
 
- 	user := session.GetLoginUser(c)
 
- 	if user != nil {
 
- 		logger.Infof("%s logged out successfully", user.Username)
 
- 	}
 
- 	session.ClearSession(c)
 
- 	if err := sessions.Default(c).Save(); err != nil {
 
- 		logger.Warning("Unable to save session after clearing:", err)
 
- 	}
 
- 	c.Redirect(http.StatusTemporaryRedirect, c.GetString("base_path"))
 
- }
 
- // getTwoFactorEnable retrieves the current status of two-factor authentication.
 
- func (a *IndexController) getTwoFactorEnable(c *gin.Context) {
 
- 	status, err := a.settingService.GetTwoFactorEnable()
 
- 	if err == nil {
 
- 		jsonObj(c, status, nil)
 
- 	}
 
- }
 
 
  |