mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-06-06 13:14:11 +00:00
- Update go.mod module path from mhsanaei/3x-ui/v3 to saeederamy/3x-ui/v3 - Update all 73 Go files' import paths accordingly - Fix README.fa_IR.md install command to point to fork's main branch The fork was referencing the original repo's module path in go.mod and all Go source imports, making it dependent on MHSanaei's namespace at build time. https://claude.ai/code/session_01M6d5atbWjuLTj6UwRHoK5m
98 lines
1.8 KiB
Go
98 lines
1.8 KiB
Go
package session
|
|
|
|
import (
|
|
"encoding/gob"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/saeederamy/3x-ui/v3/database/model"
|
|
"github.com/saeederamy/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
|
|
}
|