mirror of
https://tangled.org/evan.jarrett.net/at-container-registry
synced 2026-09-20 17:24:16 +00:00
try and invalidate sessions
This commit is contained in:
@@ -112,6 +112,25 @@ func (s *OAuthStore) DeleteSessionsForDID(ctx context.Context, did string) error
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteOldSessionsForDID removes all sessions for a DID except the specified session to keep
|
||||
// This is used during OAuth callback to clean up stale sessions with expired refresh tokens
|
||||
func (s *OAuthStore) DeleteOldSessionsForDID(ctx context.Context, did string, keepSessionID string) error {
|
||||
result, err := s.db.ExecContext(ctx, `
|
||||
DELETE FROM oauth_sessions WHERE account_did = ? AND session_id != ?
|
||||
`, did, keepSessionID)
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to delete old sessions for DID: %w", err)
|
||||
}
|
||||
|
||||
deleted, _ := result.RowsAffected()
|
||||
if deleted > 0 {
|
||||
slog.Info("Deleted old OAuth sessions for DID", "count", deleted, "did", did, "kept", keepSessionID)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetAuthRequestInfo retrieves authentication request data by state
|
||||
func (s *OAuthStore) GetAuthRequestInfo(ctx context.Context, state string) (*oauth.AuthRequestData, error) {
|
||||
var requestDataJSON string
|
||||
|
||||
@@ -122,7 +122,25 @@ func (s *Server) ServeCallback(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
slog.Debug("OAuth callback successful", "did", did, "sessionID", sessionID)
|
||||
|
||||
// Clean up old OAuth sessions for this DID BEFORE invalidating cache
|
||||
// This prevents accumulation of stale sessions with expired refresh tokens
|
||||
// Order matters: delete from DB first, then invalidate cache, so when cache reloads
|
||||
// it will only find the new session
|
||||
type sessionCleaner interface {
|
||||
DeleteOldSessionsForDID(ctx context.Context, did string, keepSessionID string) error
|
||||
}
|
||||
if cleaner, ok := s.app.clientApp.Store.(sessionCleaner); ok {
|
||||
if err := cleaner.DeleteOldSessionsForDID(r.Context(), did, sessionID); err != nil {
|
||||
slog.Warn("Failed to clean up old OAuth sessions", "did", did, "error", err)
|
||||
// Non-fatal - log and continue
|
||||
} else {
|
||||
slog.Debug("Cleaned up old OAuth sessions", "did", did, "kept", sessionID)
|
||||
}
|
||||
}
|
||||
|
||||
// Invalidate cached session (if any) since we have a new session with new tokens
|
||||
// This happens AFTER deleting old sessions from database, ensuring the cache
|
||||
// will load the correct session when it's next accessed
|
||||
if s.refresher != nil {
|
||||
s.refresher.InvalidateSession(did)
|
||||
slog.Debug("Invalidated cached session after creating new session", "did", did)
|
||||
|
||||
Reference in New Issue
Block a user