annotate pkg/auth/store.go @ 495:5c08afd15ce7 metamorph-for-all

Give file containing the session store a more suited name.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 24 Aug 2018 14:28:05 +0200
parents pkg/auth/pool.go@8a0737aa6ab6
children 22e1bf563a04
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 package auth
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 import (
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
4 "bytes"
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 "log"
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
6 "time"
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
7
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
8 bolt "github.com/coreos/bbolt"
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 )
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
11 // Sessions is the global connection pool.
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
12 var Sessions *SessionStore
220
11d1a488b08f Depend command line parsing on Viper/Cobra. Configuration should be persistent now.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 213
diff changeset
13
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
14 type SessionStore struct {
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
15 storage *bolt.DB
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
16 conns map[string]*Connection
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
17 cmds chan func(*SessionStore)
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
20 var sessionsBucket = []byte("sessions")
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
21
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
22 func NewSessionStore(filename string) (*SessionStore, error) {
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
23
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
24 pcp := &SessionStore{
213
2fad2931a5a6 Fix for [issue78] gemma back end broken for me since 213:3d0988d9f867
Sascha L. Teichmann <teichmann@intevation.de>
parents: 205
diff changeset
25 conns: make(map[string]*Connection),
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
26 cmds: make(chan func(*SessionStore)),
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
27 }
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
28 if err := pcp.openStorage(filename); err != nil {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
29 return nil, err
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
30 }
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
31 go pcp.run()
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
32 return pcp, nil
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
33 }
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
34
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
35 // openStorage opens a storage file.
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
36 func (pcp *SessionStore) openStorage(filename string) error {
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
37
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
38 // No file, nothing to restore/persist.
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
39 if filename == "" {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
40 return nil
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
41 }
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
43 db, err := bolt.Open(filename, 0600, nil)
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
44 if err != nil {
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
45 return err
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
46 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
47
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
48 err = db.Update(func(tx *bolt.Tx) error {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
49 b, err := tx.CreateBucketIfNotExists(sessionsBucket)
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
50 if err != nil {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
51 return err
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
52 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
53
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
54 // pre-load sessions
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
55 c := b.Cursor()
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
56
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
57 for k, v := c.First(); k != nil; k, v = c.Next() {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
58 var conn Connection
197
e85413e5befa Cleaned up serialisation/deserilisation of sessions a bit.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 193
diff changeset
59 if err := conn.deserialize(bytes.NewReader(v)); err != nil {
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
60 return err
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
61 }
213
2fad2931a5a6 Fix for [issue78] gemma back end broken for me since 213:3d0988d9f867
Sascha L. Teichmann <teichmann@intevation.de>
parents: 205
diff changeset
62 pcp.conns[string(k)] = &conn
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
63 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
64
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
65 return nil
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
66 })
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
67
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
68 if err != nil {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
69 db.Close()
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
70 return err
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
71 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
72
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
73 pcp.storage = db
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
74 return nil
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
77 func (pcp *SessionStore) run() {
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
78 for {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
79 select {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
80 case cmd := <-pcp.cmds:
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
81 cmd(pcp)
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
82 case <-time.After(time.Minute * 5):
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
83 pcp.cleanToken()
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
84 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
85 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
86 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
87
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
88 func (pcp *SessionStore) cleanToken() {
203
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
89 now := time.Now()
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
90 for token, con := range pcp.conns {
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
91 expires := time.Unix(con.session.ExpiresAt, 0)
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
92 if expires.Before(now) {
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
93 delete(pcp.conns, token)
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
94 pcp.remove(token)
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
95 }
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
96 }
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
97 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
98
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
99 func (pcp *SessionStore) remove(token string) {
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
100 if pcp.storage == nil {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
101 return
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
102 }
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
103 err := pcp.storage.Update(func(tx *bolt.Tx) error {
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
104 b := tx.Bucket(sessionsBucket)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
105 return b.Delete([]byte(token))
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
106 })
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
107 if err != nil {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
108 log.Printf("error: %v\n", err)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
109 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
110 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
111
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
112 func (pcp *SessionStore) Delete(token string) bool {
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
113 res := make(chan bool)
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
114 pcp.cmds <- func(pcp *SessionStore) {
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
115 if _, found := pcp.conns[token]; !found {
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
116 res <- false
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
117 return
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
118 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
119 delete(pcp.conns, token)
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
120 pcp.remove(token)
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
121 res <- true
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
122 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
123 return <-res
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
124 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
125
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
126 func (pcp *SessionStore) store(token string, con *Connection) {
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
127 if pcp.storage == nil {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
128 return
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
129 }
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
130 err := pcp.storage.Update(func(tx *bolt.Tx) error {
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
131 b := tx.Bucket(sessionsBucket)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
132 var buf bytes.Buffer
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
133 if err := con.serialize(&buf); err != nil {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
134 return err
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
135 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
136 return b.Put([]byte(token), buf.Bytes())
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
137 })
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
138 if err != nil {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
139 log.Printf("error: %v\n", err)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
140 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
141 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
142
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
143 func (pcp *SessionStore) Add(token string, session *Session) *Connection {
199
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
144 res := make(chan *Connection)
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
145
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
146 pcp.cmds <- func(cp *SessionStore) {
199
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
147 con := pcp.conns[token]
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
148 if con == nil {
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
149 con = &Connection{}
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
150 pcp.conns[token] = con
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
151 }
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
152 con.set(session)
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
153 pcp.store(token, con)
199
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
154 res <- con
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
155 }
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
156
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
157 con := <-res
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
158 return con
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
159 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
160
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
161 func (pcp *SessionStore) Renew(token string) (string, error) {
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
162
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
163 type result struct {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
164 newToken string
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
165 err error
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
166 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
167
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
168 resCh := make(chan result)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
169
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
170 pcp.cmds <- func(cp *SessionStore) {
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
171 con := pcp.conns[token]
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
172 if con == nil {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
173 resCh <- result{err: ErrNoSuchToken}
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
174 } else {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
175 delete(pcp.conns, token)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
176 pcp.remove(token)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
177 newToken := GenerateSessionKey()
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
178 // TODO: Ensure that this is not racy!
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
179 con.session.ExpiresAt = time.Now().Add(maxTokenValid).Unix()
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
180 pcp.conns[newToken] = con
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
181 pcp.store(newToken, con)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
182 resCh <- result{newToken: newToken}
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
183 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
184 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
185
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
186 r := <-resCh
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
187 return r.newToken, r.err
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
188 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
189
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
190 func (pcp *SessionStore) Do(token string) (*Session, error) {
201
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
191
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
192 type result struct {
486
b2dc9c2f69e0 First stab to use the metamorphic db to do all database stuff.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 414
diff changeset
193 session *Session
b2dc9c2f69e0 First stab to use the metamorphic db to do all database stuff.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 414
diff changeset
194 err error
201
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
195 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
196
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
197 res := make(chan result)
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
198
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
199 pcp.cmds <- func(pcp *SessionStore) {
201
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
200 con := pcp.conns[token]
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
201 if con == nil {
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
202 res <- result{err: ErrNoSuchToken}
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
203 return
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
204 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
205 con.touch()
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
206 pcp.store(token, con)
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
207
486
b2dc9c2f69e0 First stab to use the metamorphic db to do all database stuff.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 414
diff changeset
208 res <- result{session: con.session}
201
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
209 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
210
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
211 r := <-res
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
212
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
213 if r.err != nil {
486
b2dc9c2f69e0 First stab to use the metamorphic db to do all database stuff.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 414
diff changeset
214 return nil, r.err
201
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
215 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
216
486
b2dc9c2f69e0 First stab to use the metamorphic db to do all database stuff.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 414
diff changeset
217 return r.session, nil
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
218 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
219
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
220 func (pcp *SessionStore) Session(token string) *Session {
202
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
221 res := make(chan *Session)
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
222 pcp.cmds <- func(pcp *SessionStore) {
202
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
223 con := pcp.conns[token]
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
224 if con == nil {
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
225 res <- nil
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
226 } else {
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
227 con.touch()
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
228 pcp.store(token, con)
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
229 res <- con.session
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
230 }
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
231 }
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
232 return <-res
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
233 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
234
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
235 func (pcp *SessionStore) Logout(user string) {
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
236 pcp.cmds <- func(pcp *SessionStore) {
240
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 220
diff changeset
237 for token, con := range pcp.conns {
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 220
diff changeset
238 if con.session.User == user {
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 220
diff changeset
239 delete(pcp.conns, token)
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 220
diff changeset
240 pcp.remove(token)
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 220
diff changeset
241 }
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 220
diff changeset
242 }
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 220
diff changeset
243 }
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 220
diff changeset
244 }
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 220
diff changeset
245
493
8a0737aa6ab6 The connection pool is now only a session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 486
diff changeset
246 func (pcp *SessionStore) Shutdown() error {
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
247 if db := pcp.storage; db != nil {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
248 log.Println("info: shutdown persistent connection pool.")
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
249 pcp.storage = nil
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
250 return db.Close()
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
251 }
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
252 log.Println("info: shutdown in-memory connection pool.")
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
253 return nil
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
254 }