package session import ( "encoding/gob" "net/http" "time" "github.com/mhsanaei/3x-ui/v3/database/model" "github.com/mhsanaei/3x-ui/v3/logger" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" ) const ( loginUserKey = "LOGIN_USER" apiAuthUserKey = "api_auth_user" sessionCookieName = "3x-ui" ) func init() { gob.Register(model.User{}) } func SetLoginUser(c *gin.Context, user *model.User) error { if user == nil { return nil } s := sessions.Default(c) s.Set(loginUserKey, *user) return s.Save() } func SetAPIAuthUser(c *gin.Context, user *model.User) { if user == nil { return } c.Set(apiAuthUserKey, user) } func GetLoginUser(c *gin.Context) *model.User { if v, ok := c.Get(apiAuthUserKey); ok { if u, ok2 := v.(*model.User); ok2 { return u } } s := sessions.Default(c) obj := s.Get(loginUserKey) if obj == nil { return nil } user, ok := obj.(model.User) if !ok { s.Delete(loginUserKey) if err := s.Save(); err != nil { logger.Warning("session: failed to drop stale user payload:", err) } return nil } return &user } func IsLogin(c *gin.Context) bool { return GetLoginUser(c) != nil } func ClearSession(c *gin.Context) error { s := sessions.Default(c) s.Clear() cookiePath := c.GetString("base_path") if cookiePath == "" { cookiePath = "/" } secure := c.Request.TLS != nil s.Options(sessions.Options{ Path: cookiePath, MaxAge: -1, HttpOnly: true, Secure: secure, SameSite: http.SameSiteLaxMode, }) if err := s.Save(); err != nil { return err } if cookiePath != "/" { http.SetCookie(c.Writer, &http.Cookie{ Name: sessionCookieName, Value: "", Path: "/", MaxAge: -1, Expires: time.Unix(0, 0), HttpOnly: true, Secure: secure, SameSite: http.SameSiteLaxMode, }) } return nil }