git.iko.soy/typeable/oauth2-proxy
on v2.2 help sign in
115 lines 2.3 kB history raw
1package providers
3import (
4 "fmt"
5 "strconv"
6 "strings"
7 "time"
9 "github.com/bitly/oauth2_proxy/cookie"
12type SessionState struct {
13 AccessToken string
14 ExpiresOn time.Time
15 RefreshToken string
16 Email string
17 User string
20func (s *SessionState) IsExpired() bool {
21 if !s.ExpiresOn.IsZero() && s.ExpiresOn.Before(time.Now()) {
22 return true
23 }
24 return false
27func (s *SessionState) String() string {
28 o := fmt.Sprintf("Session{%s", s.userOrEmail())
29 if s.AccessToken != "" {
30 o += " token:true"
31 }
32 if !s.ExpiresOn.IsZero() {
33 o += fmt.Sprintf(" expires:%s", s.ExpiresOn)
34 }
35 if s.RefreshToken != "" {
36 o += " refresh_token:true"
37 }
38 return o + "}"
41func (s *SessionState) EncodeSessionState(c *cookie.Cipher) (string, error) {
42 if c == nil || s.AccessToken == "" {
43 return s.userOrEmail(), nil
44 }
45 return s.EncryptedString(c)
48func (s *SessionState) userOrEmail() string {
49 u := s.User
50 if s.Email != "" {
51 u = s.Email
52 }
53 return u
56func (s *SessionState) EncryptedString(c *cookie.Cipher) (string, error) {
57 var err error
58 if c == nil {
59 panic("error. missing cipher")
60 }
61 a := s.AccessToken
62 if a != "" {
63 a, err = c.Encrypt(a)
64 if err != nil {
65 return "", err
66 }
67 }
68 r := s.RefreshToken
69 if r != "" {
70 r, err = c.Encrypt(r)
71 if err != nil {
72 return "", err
73 }
74 }
75 return fmt.Sprintf("%s|%s|%d|%s", s.userOrEmail(), a, s.ExpiresOn.Unix(), r), nil
78func DecodeSessionState(v string, c *cookie.Cipher) (s *SessionState, err error) {
79 chunks := strings.Split(v, "|")
80 if len(chunks) == 1 {
81 if strings.Contains(chunks[0], "@") {
82 u := strings.Split(v, "@")[0]
83 return &SessionState{Email: v, User: u}, nil
84 }
85 return &SessionState{User: v}, nil
86 }
88 if len(chunks) != 4 {
89 err = fmt.Errorf("invalid number of fields (got %d expected 4)", len(chunks))
90 return
91 }
93 s = &SessionState{}
94 if c != nil && chunks[1] != "" {
95 s.AccessToken, err = c.Decrypt(chunks[1])
96 if err != nil {
97 return nil, err
98 }
99 }
100 if c != nil && chunks[3] != "" {
101 s.RefreshToken, err = c.Decrypt(chunks[3])
102 if err != nil {
103 return nil, err
104 }
105 }
106 if u := chunks[0]; strings.Contains(u, "@") {
107 s.Email = u
108 s.User = strings.Split(u, "@")[0]
109 } else {
110 s.User = u
111 }
112 ts, _ := strconv.Atoi(chunks[2])
113 s.ExpiresOn = time.Unix(int64(ts), 0)
114 return