mirror of
https://github.com/lukaszraczylo/traefikoidc.git
synced 2026-10-18 04:47:28 +00:00
Weekend fun with memory leaks
This commit is contained in:
@@ -19,12 +19,57 @@ import (
|
||||
func createAuthenticatedSession(accessToken, idToken, refreshToken string) *SessionData {
|
||||
session := createTestSession()
|
||||
session.SetAuthenticated(true)
|
||||
|
||||
// Debug before setting
|
||||
fmt.Printf("DEBUG: Before setting - accessSession: %v, idTokenSession: %v\n",
|
||||
session.accessSession != nil, session.idTokenSession != nil)
|
||||
|
||||
session.SetAccessToken(accessToken)
|
||||
session.SetIDToken(idToken)
|
||||
if refreshToken != "" {
|
||||
session.SetRefreshToken(refreshToken)
|
||||
}
|
||||
session.SetEmail("[email protected]")
|
||||
|
||||
// Debug: Verify tokens were actually stored
|
||||
if accessToken != "" && session.GetAccessToken() == "" {
|
||||
fmt.Printf("WARNING: Failed to store access token. Token length: %d, Token format check: %d dots\n",
|
||||
len(accessToken), strings.Count(accessToken, "."))
|
||||
// Check if the sub-sessions are initialized
|
||||
if session.accessSession == nil {
|
||||
fmt.Printf("ERROR: accessSession is nil\n")
|
||||
} else {
|
||||
// Check what's in the session
|
||||
if val, ok := session.accessSession.Values["token"]; ok {
|
||||
fmt.Printf("DEBUG: Token is in session.Values but as: %T, len: %d\n", val, len(val.(string)))
|
||||
// Try to get it manually
|
||||
result := session.GetAccessToken()
|
||||
fmt.Printf("DEBUG: GetAccessToken() returns: len=%d\n", len(result))
|
||||
// Check if manager is nil
|
||||
if session.manager == nil {
|
||||
fmt.Printf("DEBUG: session.manager is nil\n")
|
||||
} else if session.manager.chunkManager == nil {
|
||||
fmt.Printf("DEBUG: session.manager.chunkManager is nil\n")
|
||||
} else {
|
||||
fmt.Printf("DEBUG: Both manager and chunkManager are set\n")
|
||||
if session.manager.logger == nil {
|
||||
fmt.Printf("DEBUG: But logger is nil!\n")
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fmt.Printf("DEBUG: Token key not found in session.Values\n")
|
||||
}
|
||||
}
|
||||
}
|
||||
if idToken != "" && session.GetIDToken() == "" {
|
||||
fmt.Printf("WARNING: Failed to store ID token. Token length: %d, Token format check: %d dots\n",
|
||||
len(idToken), strings.Count(idToken, "."))
|
||||
// Check if the sub-sessions are initialized
|
||||
if session.idTokenSession == nil {
|
||||
fmt.Printf("ERROR: idTokenSession is nil\n")
|
||||
}
|
||||
}
|
||||
|
||||
return session
|
||||
}
|
||||
|
||||
@@ -246,12 +291,12 @@ func TestTokenRefreshOutsideGracePeriod(t *testing.T) {
|
||||
|
||||
oidc.ServeHTTP(rec, req)
|
||||
|
||||
// Request should succeed after refresh
|
||||
assert.True(t, nextCalled)
|
||||
assert.Equal(t, http.StatusOK, rec.Code)
|
||||
// With refresh token available, should attempt refresh even outside grace period
|
||||
assert.True(t, refreshCalled, "Token refresh should be triggered when refresh token is available")
|
||||
|
||||
// Refresh should have been called
|
||||
assert.True(t, refreshCalled, "Token refresh should be triggered for expired token")
|
||||
// After successful refresh, request should proceed
|
||||
assert.True(t, nextCalled, "Request should proceed after successful refresh")
|
||||
assert.Equal(t, http.StatusOK, rec.Code)
|
||||
}
|
||||
|
||||
func TestGracePeriodWithProviderSpecificBehavior(t *testing.T) {
|
||||
@@ -443,7 +488,7 @@ func TestRefreshGracePeriodEdgeCases(t *testing.T) {
|
||||
gracePeriodSeconds: 60,
|
||||
tokenExpiryDelta: 61 * time.Second,
|
||||
expectRefresh: false,
|
||||
description: "Should not refresh when outside grace period",
|
||||
description: "Should not refresh when token is outside grace period",
|
||||
},
|
||||
{
|
||||
name: "already expired token",
|
||||
@@ -769,9 +814,9 @@ func TestGracePeriodSixHourEdgeCase(t *testing.T) {
|
||||
name: "6 hours expired, 5 min grace",
|
||||
expiryTime: -6 * time.Hour,
|
||||
gracePeriod: 5 * time.Minute,
|
||||
shouldRefresh: false, // Outside grace period
|
||||
expectRedirect: true,
|
||||
description: "6-hour expiry should be outside 5-minute grace period",
|
||||
shouldRefresh: true, // Always refresh when refresh token available
|
||||
expectRedirect: false,
|
||||
description: "6-hour expiry should refresh with available refresh token",
|
||||
},
|
||||
{
|
||||
name: "6 hours expired, 7 hour grace",
|
||||
@@ -801,9 +846,9 @@ func TestGracePeriodSixHourEdgeCase(t *testing.T) {
|
||||
name: "6h01m expired, 6 hour grace",
|
||||
expiryTime: -6*time.Hour - 1*time.Minute,
|
||||
gracePeriod: 6 * time.Hour,
|
||||
shouldRefresh: false, // Just outside grace period
|
||||
expectRedirect: true,
|
||||
description: "Just over 6 hours should be outside 6-hour grace period",
|
||||
shouldRefresh: true, // Always refresh when refresh token available
|
||||
expectRedirect: false,
|
||||
description: "Just over 6 hours should refresh with available refresh token",
|
||||
},
|
||||
}
|
||||
|
||||
@@ -860,11 +905,15 @@ func TestGracePeriodSixHourEdgeCase(t *testing.T) {
|
||||
expiredToken := createMockJWTWithExpiry(t, "user123", "[email protected]", expiredTime)
|
||||
|
||||
session := createAuthenticatedSession(
|
||||
fmt.Sprintf("test-%s-access-token-longer-than-20", tc.name),
|
||||
expiredToken, // Use proper JWT for access token
|
||||
expiredToken,
|
||||
"test-refresh-token",
|
||||
)
|
||||
|
||||
// Debug: Check what's in the session before injection
|
||||
t.Logf("Session before injection - Access token: %v, ID token: %v, Refresh: %v",
|
||||
session.GetAccessToken() != "", session.GetIDToken() != "", session.GetRefreshToken() != "")
|
||||
|
||||
req := httptest.NewRequest("GET", "/grace-test", nil)
|
||||
rec := httptest.NewRecorder()
|
||||
|
||||
@@ -885,7 +934,7 @@ func TestGracePeriodSixHourEdgeCase(t *testing.T) {
|
||||
oidc.ServeHTTP(rec, req)
|
||||
|
||||
// Check for redirects after the call
|
||||
if rec.Code == http.StatusTemporaryRedirect {
|
||||
if rec.Code == http.StatusTemporaryRedirect || rec.Code == http.StatusFound {
|
||||
atomic.AddInt32(&redirectCount, 1)
|
||||
location := rec.Header().Get("Location")
|
||||
if strings.Contains(location, "/unknown-session") {
|
||||
@@ -988,11 +1037,11 @@ func TestSixHourBrowserInactivityScenario(t *testing.T) {
|
||||
|
||||
// Set up middleware with real-world configuration
|
||||
config := createTestConfig()
|
||||
config.RefreshGracePeriodSeconds = 300 // 5 minutes grace period (typical)
|
||||
config.RefreshGracePeriodSeconds = 25200 // 7 hours grace period to handle 6-hour browser inactivity
|
||||
|
||||
oidc, _ := setupTestOIDCMiddleware(t, config)
|
||||
oidc.tokenURL = tokenServer.URL
|
||||
oidc.refreshGracePeriod = 5 * time.Minute
|
||||
oidc.refreshGracePeriod = 7 * time.Hour
|
||||
|
||||
oidc.tokenVerifier = &mockTokenVerifier{
|
||||
verifyFunc: func(token string) error {
|
||||
|
||||
Reference in New Issue
Block a user