Files

84 lines
2.3 KiB
Go

package terminal_session
import (
"crypto/sha256"
"encoding/hex"
"strconv"
"time"
"github.com/1Panel-dev/1Panel/core/constant"
"github.com/1Panel-dev/1Panel/core/init/session/psession"
"github.com/gin-gonic/gin"
)
const (
HeaderUserID = "X-Panel-User-ID"
HeaderAuthSessionID = "X-Panel-Auth-Session-ID"
HeaderAuthLeaseUntil = "X-Panel-Auth-Lease-Until"
)
type Identity struct {
UserID string
AuthSessionID string
AuthLeaseUntil time.Time
}
func FromContext(c *gin.Context) (Identity, bool) {
if c == nil {
return Identity{}, false
}
value, ok := c.Get(psession.GinContextSessionUserKey)
if !ok {
return Identity{}, false
}
user, ok := value.(psession.SessionUser)
if !ok || user.ID == "" {
return Identity{}, false
}
if c.GetBool("API_AUTH") {
identity := Identity{UserID: user.ID, AuthSessionID: APIAuthSessionID(user.ID), AuthLeaseUntil: time.Now().Add(90 * time.Second)}
if keyID := c.GetString("API_AUTH_KEY_ID"); keyID != "" && c.GetString("API_AUTH_KEY_KIND") == "apiKey" {
identity.AuthSessionID = APIKeyAuthSessionID(keyID)
if value, exists := c.Get("API_AUTH_KEY_EXPIRES_AT"); exists {
if expiresAt, ok := value.(time.Time); ok && !expiresAt.IsZero() && expiresAt.Before(identity.AuthLeaseUntil) {
identity.AuthLeaseUntil = expiresAt
}
}
}
return identity, true
}
sessionID, err := c.Cookie(constant.SessionName)
if err != nil || sessionID == "" {
return Identity{}, false
}
return Identity{UserID: user.ID, AuthSessionID: HashAuthSessionID(sessionID)}, true
}
func APIAuthSessionID(userID string) string {
return "api:" + userID
}
func APIKeyAuthSessionID(keyID string) string {
return "api-key:" + keyID
}
func HashAuthSessionID(sessionID string) string {
sum := sha256.Sum256([]byte(sessionID))
return hex.EncodeToString(sum[:])
}
func ClearForwardedHeaders(c *gin.Context) {
c.Request.Header.Del(HeaderUserID)
c.Request.Header.Del(HeaderAuthSessionID)
c.Request.Header.Del(HeaderAuthLeaseUntil)
}
func SetForwardedHeaders(c *gin.Context, identity Identity) {
c.Request.Header.Set(HeaderUserID, identity.UserID)
c.Request.Header.Set(HeaderAuthSessionID, identity.AuthSessionID)
c.Request.Header.Del(HeaderAuthLeaseUntil)
if !identity.AuthLeaseUntil.IsZero() {
c.Request.Header.Set(HeaderAuthLeaseUntil, strconv.FormatInt(identity.AuthLeaseUntil.UnixMilli(), 10))
}
}