mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-10-17 10:57:24 +08:00
105 lines
2.3 KiB
Go
105 lines
2.3 KiB
Go
package psession
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"log"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/1Panel-dev/1Panel/core/constant"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/glebarez/sqlite"
|
|
"github.com/gorilla/securecookie"
|
|
"github.com/gorilla/sessions"
|
|
"github.com/wader/gormstore/v2"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/logger"
|
|
)
|
|
|
|
type SessionUser struct {
|
|
ID uint `json:"id"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type PSession struct {
|
|
Store *gormstore.Store
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewPSession(dbPath string) *PSession {
|
|
newLogger := logger.New(
|
|
log.New(os.Stdout, "\r\n", log.LstdFlags),
|
|
logger.Config{
|
|
SlowThreshold: time.Second,
|
|
LogLevel: logger.Silent,
|
|
IgnoreRecordNotFoundError: true,
|
|
Colorful: false,
|
|
},
|
|
)
|
|
db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{
|
|
DisableForeignKeyConstraintWhenMigrating: true,
|
|
Logger: newLogger,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
store := gormstore.New(db, securecookie.GenerateRandomKey(32))
|
|
return &PSession{
|
|
Store: store,
|
|
db: db,
|
|
}
|
|
}
|
|
|
|
func (p *PSession) Get(c *gin.Context) (SessionUser, error) {
|
|
var result SessionUser
|
|
session, err := p.Store.Get(c.Request, constant.SessionName)
|
|
if err != nil {
|
|
return result, err
|
|
}
|
|
data, ok := session.Values["user"]
|
|
if !ok {
|
|
return result, errors.New("session data not found")
|
|
}
|
|
bytes, ok := data.([]byte)
|
|
if !ok {
|
|
return result, errors.New("invalid session data format")
|
|
}
|
|
err = json.Unmarshal(bytes, &result)
|
|
return result, err
|
|
}
|
|
|
|
func (p *PSession) Set(c *gin.Context, user SessionUser, secure bool, ttlSeconds int) error {
|
|
session, err := p.Store.Get(c.Request, constant.SessionName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
data, err := json.Marshal(user)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
session.Values["user"] = data
|
|
session.Options = &sessions.Options{
|
|
Path: "/",
|
|
MaxAge: ttlSeconds,
|
|
HttpOnly: true,
|
|
Secure: secure,
|
|
}
|
|
return p.Store.Save(c.Request, c.Writer, session)
|
|
}
|
|
|
|
func (p *PSession) Delete(c *gin.Context) error {
|
|
session, err := p.Store.Get(c.Request, constant.SessionName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
session.Values = make(map[interface{}]interface{})
|
|
session.Options.MaxAge = -1
|
|
return p.Store.Save(c.Request, c.Writer, session)
|
|
}
|
|
|
|
func (p *PSession) Clean() error {
|
|
p.db.Table("sessions").Where("1=1").Delete(nil)
|
|
return nil
|
|
}
|