session.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package session
  2. import (
  3. "encoding/gob"
  4. "net/http"
  5. "time"
  6. "github.com/mhsanaei/3x-ui/v3/database/model"
  7. "github.com/mhsanaei/3x-ui/v3/logger"
  8. "github.com/gin-contrib/sessions"
  9. "github.com/gin-gonic/gin"
  10. )
  11. const (
  12. loginUserKey = "LOGIN_USER"
  13. apiAuthUserKey = "api_auth_user"
  14. sessionCookieName = "3x-ui"
  15. )
  16. func init() {
  17. gob.Register(model.User{})
  18. }
  19. func SetLoginUser(c *gin.Context, user *model.User) error {
  20. if user == nil {
  21. return nil
  22. }
  23. s := sessions.Default(c)
  24. s.Set(loginUserKey, *user)
  25. return s.Save()
  26. }
  27. func SetAPIAuthUser(c *gin.Context, user *model.User) {
  28. if user == nil {
  29. return
  30. }
  31. c.Set(apiAuthUserKey, user)
  32. }
  33. func GetLoginUser(c *gin.Context) *model.User {
  34. if v, ok := c.Get(apiAuthUserKey); ok {
  35. if u, ok2 := v.(*model.User); ok2 {
  36. return u
  37. }
  38. }
  39. s := sessions.Default(c)
  40. obj := s.Get(loginUserKey)
  41. if obj == nil {
  42. return nil
  43. }
  44. user, ok := obj.(model.User)
  45. if !ok {
  46. s.Delete(loginUserKey)
  47. if err := s.Save(); err != nil {
  48. logger.Warning("session: failed to drop stale user payload:", err)
  49. }
  50. return nil
  51. }
  52. return &user
  53. }
  54. func IsLogin(c *gin.Context) bool {
  55. return GetLoginUser(c) != nil
  56. }
  57. func ClearSession(c *gin.Context) error {
  58. s := sessions.Default(c)
  59. s.Clear()
  60. cookiePath := c.GetString("base_path")
  61. if cookiePath == "" {
  62. cookiePath = "/"
  63. }
  64. secure := c.Request.TLS != nil
  65. s.Options(sessions.Options{
  66. Path: cookiePath,
  67. MaxAge: -1,
  68. HttpOnly: true,
  69. Secure: secure,
  70. SameSite: http.SameSiteLaxMode,
  71. })
  72. if err := s.Save(); err != nil {
  73. return err
  74. }
  75. if cookiePath != "/" {
  76. http.SetCookie(c.Writer, &http.Cookie{
  77. Name: sessionCookieName,
  78. Value: "",
  79. Path: "/",
  80. MaxAge: -1,
  81. Expires: time.Unix(0, 0),
  82. HttpOnly: true,
  83. Secure: secure,
  84. SameSite: http.SameSiteLaxMode,
  85. })
  86. }
  87. return nil
  88. }