-
Notifications
You must be signed in to change notification settings - Fork 28
/
manager.go
81 lines (68 loc) · 1.87 KB
/
manager.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package idpsession
import (
"errors"
"fmt"
"net/http"
"github.com/authgear/authgear-server/pkg/lib/config"
"github.com/authgear/authgear-server/pkg/lib/session"
"github.com/authgear/authgear-server/pkg/util/httputil"
)
type CookieManager interface {
ClearCookie(def *httputil.CookieDef) *http.Cookie
}
type Manager struct {
Store Store
Config *config.SessionConfig
Cookies CookieManager
CookieDef session.CookieDef
}
func (m *Manager) ClearCookie() []*http.Cookie {
return []*http.Cookie{
m.Cookies.ClearCookie(m.CookieDef.Def),
m.Cookies.ClearCookie(m.CookieDef.SameSiteStrictDef),
}
}
func (m *Manager) Get(id string) (session.Session, error) {
s, err := m.Store.Get(id)
if errors.Is(err, ErrSessionNotFound) {
return nil, session.ErrSessionNotFound
} else if err != nil {
return nil, fmt.Errorf("failed to get session: %w", err)
}
return s, nil
}
func (m *Manager) Delete(session session.Session) error {
err := m.Store.Delete(session.(*IDPSession))
if err != nil {
return fmt.Errorf("failed to invalidate session: %w", err)
}
return nil
}
func (m *Manager) List(userID string) ([]session.Session, error) {
storedSessions, err := m.Store.List(userID)
if err != nil {
return nil, fmt.Errorf("failed to list sessions: %w", err)
}
var sessions []session.Session
for _, session := range storedSessions {
sessions = append(sessions, session)
}
return sessions, nil
}
func (m *Manager) TerminateAllExcept(userID string, currentSession session.Session) ([]session.Session, error) {
sessions, err := m.Store.List(userID)
if err != nil {
return nil, err
}
deletedSessions := []session.Session{}
for _, ss := range sessions {
if currentSession != nil && ss.IsSameSSOGroup(currentSession) {
continue
}
if err := m.Delete(ss); err != nil {
return nil, err
}
deletedSessions = append(deletedSessions, ss)
}
return deletedSessions, nil
}