Skip to content

Commit

Permalink
feat: list consent sessions by session id
Browse files Browse the repository at this point in the history
  • Loading branch information
aarmam committed Sep 14, 2022
1 parent c68e130 commit a8596e4
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 1 deletion.
10 changes: 9 additions & 1 deletion consent/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,17 @@ func (h *Handler) adminListOAuth2SubjectConsentSessions(w http.ResponseWriter, r
h.r.Writer().WriteError(w, r, errorsx.WithStack(fosite.ErrInvalidRequest.WithHint(`Query parameter 'subject' is not defined but should have been.`)))
return
}
loginSessionId := r.URL.Query().Get("login_session_id")

page, itemsPerPage := x.ParsePagination(r)
s, err := h.r.ConsentManager().FindSubjectsGrantedConsentRequests(r.Context(), subject, itemsPerPage, itemsPerPage*page)

var s []AcceptOAuth2ConsentRequest
var err error
if len(loginSessionId) == 0 {
s, err = h.r.ConsentManager().FindSubjectsGrantedConsentRequests(r.Context(), subject, itemsPerPage, itemsPerPage*page)
} else {
s, err = h.r.ConsentManager().FindSubjectsSessionGrantedConsentRequests(r.Context(), subject, loginSessionId, itemsPerPage, itemsPerPage*page)
}
if errors.Is(err, ErrNoPreviousConsentFound) {
h.r.Writer().Write(w, r, []PreviousOAuth2ConsentSession{})
return
Expand Down
1 change: 1 addition & 0 deletions consent/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ type Manager interface {
VerifyAndInvalidateConsentRequest(ctx context.Context, verifier string) (*AcceptOAuth2ConsentRequest, error)
FindGrantedAndRememberedConsentRequests(ctx context.Context, client, user string) ([]AcceptOAuth2ConsentRequest, error)
FindSubjectsGrantedConsentRequests(ctx context.Context, user string, limit, offset int) ([]AcceptOAuth2ConsentRequest, error)
FindSubjectsSessionGrantedConsentRequests(ctx context.Context, user, sid string, limit, offset int) ([]AcceptOAuth2ConsentRequest, error)
CountSubjectsGrantedConsentRequests(ctx context.Context, user string) (int, error)

// Cookie management
Expand Down
47 changes: 47 additions & 0 deletions consent/manager_test_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ func ManagerTests(m Manager, clientManager client.Manager, fositeManager x.Fosit
lr[k] = &LoginRequest{
ID: makeID("fk-login-challenge", network, k),
Subject: fmt.Sprintf("subject%s", k),
SessionID: sqlxx.NullString(makeID("fk-login-session", network, k)),
Verifier: makeID("fk-login-verifier", network, k),
Client: &client.Client{LegacyClientID: fmt.Sprintf("fk-client-%s", k)},
AuthenticatedAt: sqlxx.NullTime(time.Now()),
Expand Down Expand Up @@ -683,6 +684,52 @@ func ManagerTests(m Manager, clientManager client.Manager, fositeManager x.Fosit
_, err = m.HandleConsentRequest(context.Background(), hcr2)
require.NoError(t, err)

for i, tc := range []struct {
subject string
sid string
challenges []string
clients []string
}{
{
subject: cr1.Subject,
sid: makeID("fk-login-session", network, "rv1"),
challenges: []string{challengerv1},
clients: []string{"fk-client-rv1"},
},
{
subject: cr2.Subject,
sid: makeID("fk-login-session", network, "rv2"),
challenges: []string{challengerv2},
clients: []string{"fk-client-rv2"},
},
{
subject: "subjectrv3",
sid: makeID("fk-login-session", network, "rv2"),
challenges: []string{},
clients: []string{},
},
} {
t.Run(fmt.Sprintf("case=%d/subject=%s/session=%s", i, tc.subject, tc.sid), func(t *testing.T) {
consents, err := m.FindSubjectsSessionGrantedConsentRequests(context.Background(), tc.subject, tc.sid, 100, 0)
assert.Equal(t, len(tc.challenges), len(consents))

if len(tc.challenges) == 0 {
assert.EqualError(t, err, ErrNoPreviousConsentFound.Error())
} else {
require.NoError(t, err)
for _, consent := range consents {
assert.Contains(t, tc.challenges, consent.ID)
assert.Contains(t, tc.clients, consent.ConsentRequest.Client.GetID())
}
}

n, err := m.CountSubjectsGrantedConsentRequests(context.Background(), tc.subject)
require.NoError(t, err)
assert.Equal(t, n, len(tc.challenges))

})
}

for i, tc := range []struct {
subject string
challenges []string
Expand Down
35 changes: 35 additions & 0 deletions persistence/sql/persister_consent.go
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,41 @@ nid = ?`, flow.FlowStateConsentUsed, flow.FlowStateConsentUnused,
return p.filterExpiredConsentRequests(ctx, rs)
}

func (p *Persister) FindSubjectsSessionGrantedConsentRequests(ctx context.Context, subject, sid string, limit, offset int) ([]consent.AcceptOAuth2ConsentRequest, error) {
ctx, span := p.r.Tracer(ctx).Tracer().Start(ctx, "persistence.sql.FindSubjectsSessionGrantedConsentRequests")
defer span.End()

var fs []flow.Flow
c := p.Connection(ctx)

if err := c.
Where(
strings.TrimSpace(fmt.Sprintf(`
(state = %d OR state = %d) AND
subject = ? AND
login_session_id = ? AND
consent_skip=FALSE AND
consent_error='{}' AND
nid = ?`, flow.FlowStateConsentUsed, flow.FlowStateConsentUnused,
)),
subject, sid, p.NetworkID(ctx)).
Order("requested_at DESC").
Paginate(offset/limit+1, limit).
All(&fs); err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil, errorsx.WithStack(consent.ErrNoPreviousConsentFound)
}
return nil, sqlcon.HandleError(err)
}

var rs []consent.AcceptOAuth2ConsentRequest
for _, f := range fs {
rs = append(rs, *f.GetHandledConsentRequest())
}

return p.filterExpiredConsentRequests(ctx, rs)
}

func (p *Persister) CountSubjectsGrantedConsentRequests(ctx context.Context, subject string) (int, error) {
ctx, span := p.r.Tracer(ctx).Tracer().Start(ctx, "persistence.sql.CountSubjectsGrantedConsentRequests")
defer span.End()
Expand Down

0 comments on commit a8596e4

Please sign in to comment.