Skip to content

Commit eecbd18

Browse files
committed
fix: propagate session unmarshal errors instead of silently discarding
1 parent 1e470ba commit eecbd18

4 files changed

Lines changed: 23 additions & 12 deletions

File tree

pkg/repository/interface.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package repository
33
import (
44
"context"
55
"encoding/json"
6+
"fmt"
67

78
"github.com/ory/fosite"
89
"github.com/ory/fosite/handler/oauth2"
@@ -29,10 +30,12 @@ type AuthorizeRequestStorage interface {
2930
DeleteAuthorizeRequest(ctx context.Context, requestID string) error
3031
}
3132

32-
func restoreSession(req *fosite.Request, sessionData json.RawMessage, sess fosite.Session) {
33+
func restoreSession(req *fosite.Request, sessionData json.RawMessage, sess fosite.Session) error {
3334
if len(sessionData) > 0 && sess != nil {
34-
if json.Unmarshal(sessionData, sess) == nil {
35-
req.SetSession(sess)
35+
if err := json.Unmarshal(sessionData, sess); err != nil {
36+
return fmt.Errorf("failed to unmarshal session data: %w", err)
3637
}
38+
req.SetSession(sess)
3739
}
40+
return nil
3841
}

pkg/repository/kvs.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ func (r *kvsRepository) GetAuthorizeCodeSession(ctx context.Context, code string
8989
return nil, err
9090
}
9191
fositeReq := req.ToFositeReq()
92-
restoreSession(fositeReq, req.SessionData, sess)
92+
if err := restoreSession(fositeReq, req.SessionData, sess); err != nil {
93+
return nil, err
94+
}
9395
return fositeReq, nil
9496
}
9597

@@ -107,7 +109,9 @@ func (r *kvsRepository) GetAccessTokenSession(ctx context.Context, signature str
107109
return nil, err
108110
}
109111
fositeReq := req.ToFositeReq()
110-
restoreSession(fositeReq, req.SessionData, sess)
112+
if err := restoreSession(fositeReq, req.SessionData, sess); err != nil {
113+
return nil, err
114+
}
111115
return fositeReq, nil
112116
}
113117

@@ -125,7 +129,9 @@ func (r *kvsRepository) GetRefreshTokenSession(ctx context.Context, signature st
125129
return nil, err
126130
}
127131
fositeReq := req.ToFositeReq()
128-
restoreSession(fositeReq, req.SessionData, sess)
132+
if err := restoreSession(fositeReq, req.SessionData, sess); err != nil {
133+
return nil, err
134+
}
129135
return fositeReq, nil
130136
}
131137

@@ -200,7 +206,9 @@ func (r *kvsRepository) GetPKCERequestSession(ctx context.Context, signature str
200206
return nil, err
201207
}
202208
fositeReq := req.ToFositeReq()
203-
restoreSession(fositeReq, req.SessionData, sess)
209+
if err := restoreSession(fositeReq, req.SessionData, sess); err != nil {
210+
return nil, err
211+
}
204212
return fositeReq, nil
205213
}
206214

pkg/repository/sql.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,9 @@ func unmarshalRequest(data []byte, sess fosite.Session) (fosite.Requester, error
356356
return nil, fmt.Errorf("failed to unmarshal request: %w", err)
357357
}
358358
fositeReq := req.ToFositeReq()
359-
restoreSession(fositeReq, req.SessionData, sess)
359+
if err := restoreSession(fositeReq, req.SessionData, sess); err != nil {
360+
return nil, err
361+
}
360362
return fositeReq, nil
361363
}
362364

pkg/repository/sql_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ func TestSQLRepositorySessionPersistence(t *testing.T) {
9898
}
9999
}
100100

101-
func TestSQLRepositorySessionPersistence_BackwardsCompatible(t *testing.T) {
101+
func TestSQLRepositorySessionPersistence_NilSessionStored(t *testing.T) {
102102
repo, err := NewSQLRepository("sqlite", "file::memory:?cache=shared&_busy_timeout=5000")
103103
if err != nil {
104104
t.Fatalf("failed to create sql repository: %v", err)
@@ -112,7 +112,6 @@ func TestSQLRepositorySessionPersistence_BackwardsCompatible(t *testing.T) {
112112
RedirectURIs: []string{"https://example.com/callback"},
113113
}
114114

115-
// Simulate old data without session
116115
req := &fosite.Request{
117116
ID: "req-old",
118117
RequestedAt: time.Now().UTC().Round(time.Second),
@@ -130,9 +129,8 @@ func TestSQLRepositorySessionPersistence_BackwardsCompatible(t *testing.T) {
130129
t.Fatalf("GetAuthorizeCodeSession failed: %v", err)
131130
}
132131

133-
// Session should be nil (no data to restore, no fallback)
134132
if result.GetSession() != nil {
135-
t.Fatalf("expected nil session for old data, got %v", result.GetSession())
133+
t.Fatalf("expected nil session when no session was stored, got %v", result.GetSession())
136134
}
137135
}
138136

0 commit comments

Comments
 (0)