From 43ea988ec23399644083c0b1ce4a0e163ca7266e Mon Sep 17 00:00:00 2001 From: Jo Date: Wed, 30 Nov 2022 15:50:53 +0000 Subject: [PATCH] [v9.3.x] Sessions: Remove invalid session cookie if it's invalid/expired/missing (#59586) only remove invalid session cookie if it's invalid/expired/missing --- pkg/models/user_token.go | 16 +++++++++++++--- pkg/services/contexthandler/contexthandler.go | 9 ++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/pkg/models/user_token.go b/pkg/models/user_token.go index 6c92a40d86b..992826aef4b 100644 --- a/pkg/models/user_token.go +++ b/pkg/models/user_token.go @@ -3,6 +3,7 @@ package models import ( "context" "errors" + "fmt" "net" "github.com/grafana/grafana/pkg/registry" @@ -11,7 +12,8 @@ import ( // Typed errors var ( - ErrUserTokenNotFound = errors.New("user token not found") + ErrUserTokenNotFound = errors.New("user token not found") + ErrInvalidSessionToken = errors.New("invalid session token") ) // CreateTokenErr represents a token creation error; used in Enterprise @@ -33,7 +35,11 @@ type TokenExpiredError struct { TokenID int64 } -func (e *TokenExpiredError) Error() string { return "user token expired" } +func (e *TokenExpiredError) Unwrap() error { return ErrInvalidSessionToken } + +func (e *TokenExpiredError) Error() string { + return fmt.Sprintf("%s: user token expired", ErrInvalidSessionToken) +} type TokenRevokedError struct { UserID int64 @@ -41,7 +47,11 @@ type TokenRevokedError struct { MaxConcurrentSessions int64 } -func (e *TokenRevokedError) Error() string { return "user token revoked" } +func (e *TokenRevokedError) Error() string { + return fmt.Sprintf("%s: user token revoked", ErrInvalidSessionToken) +} + +func (e *TokenRevokedError) Unwrap() error { return ErrInvalidSessionToken } // UserToken represents a user token type UserToken struct { diff --git a/pkg/services/contexthandler/contexthandler.go b/pkg/services/contexthandler/contexthandler.go index 87128daebeb..8393b441c9f 100644 --- a/pkg/services/contexthandler/contexthandler.go +++ b/pkg/services/contexthandler/contexthandler.go @@ -434,9 +434,12 @@ func (h *ContextHandler) initContextWithToken(reqContext *models.ReqContext, org token, err := h.AuthTokenService.LookupToken(ctx, rawToken) if err != nil { - reqContext.Logger.Warn("Failed to look up user based on cookie", "error", err) - // Burn the cookie in case of failure - reqContext.Resp.Before(h.deleteInvalidCookieEndOfRequestFunc(reqContext)) + reqContext.Logger.Warn("failed to look up session from cookie", "error", err) + if errors.Is(err, models.ErrUserTokenNotFound) || errors.Is(err, models.ErrInvalidSessionToken) { + // Burn the cookie in case of invalid, expired or missing token + reqContext.Resp.Before(h.deleteInvalidCookieEndOfRequestFunc(reqContext)) + } + reqContext.LookupTokenErr = err return false