Mercurial > gemma
annotate auth/persistent.go @ 202:dba50c51cda7
Persistent session store: Implemented Session.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Sun, 22 Jul 2018 09:38:38 +0200 |
parents | 80dc7bbe97db |
children | 6a802aed7f99 |
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 "database/sql" |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 "log" |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
7 "time" |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
8 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
9 bolt "github.com/coreos/bbolt" |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 ) |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 type PersistentConnectionPool struct { |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
13 db *bolt.DB |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
14 conns map[string]*Connection |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
15 cmds chan func(*PersistentConnectionPool) |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
16 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
18 var sessionsBucket = []byte("sessions") |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
19 |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
20 func NewPersistentConnectionPool(filename string) (*PersistentConnectionPool, error) { |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
21 |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
22 db, err := bolt.Open(filename, 0600, nil) |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
23 if err != nil { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
24 return nil, err |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
25 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
26 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
27 conns := make(map[string]*Connection) |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
28 err = db.Update(func(tx *bolt.Tx) error { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
29 b, err := tx.CreateBucketIfNotExists(sessionsBucket) |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
30 if err != nil { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
31 return err |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
32 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
33 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
34 // pre-load sessions |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
35 c := b.Cursor() |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
36 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
37 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
|
38 var conn Connection |
197
e85413e5befa
Cleaned up serialisation/deserilisation of sessions a bit.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
193
diff
changeset
|
39 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
|
40 return err |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
41 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
42 conns[string(k)] = &conn |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
43 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
44 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
45 return nil |
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 if err != nil { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
49 db.Close() |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
50 return nil, err |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
51 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
52 |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
53 pcp := &PersistentConnectionPool{ |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
54 db: db, |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
55 conns: conns, |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
56 cmds: make(chan func(*PersistentConnectionPool)), |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
57 } |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
58 go pcp.run() |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 return pcp, nil |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
60 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
61 |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
62 func (pcp *PersistentConnectionPool) run() { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
63 for { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
64 select { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
65 case cmd := <-pcp.cmds: |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
66 cmd(pcp) |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
67 case <-time.After(time.Minute): |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
68 pcp.cleanDB() |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
69 case <-time.After(time.Minute * 5): |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
70 pcp.cleanToken() |
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 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
73 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
74 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
75 func (pcp *PersistentConnectionPool) cleanDB() { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
76 log.Println("cleanDB: Not implemented, yet.") |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
77 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
78 |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
79 func (pcp *PersistentConnectionPool) cleanToken() { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
80 log.Println("cleanToken: Not implemented, yet.") |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
81 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
82 |
200
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
83 func (pcp *PersistentConnectionPool) remove(token string) { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
84 err := pcp.db.Update(func(tx *bolt.Tx) error { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
85 b := tx.Bucket(sessionsBucket) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
86 return b.Delete([]byte(token)) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
87 }) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
88 if err != nil { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
89 log.Printf("error: %v\n", err) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
90 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
91 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
92 |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
93 func (pcp *PersistentConnectionPool) Delete(token string) bool { |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
94 res := make(chan bool) |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
95 pcp.cmds <- func(pcp *PersistentConnectionPool) { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
96 conn, found := pcp.conns[token] |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
97 if !found { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
98 res <- false |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
99 return |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
100 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
101 conn.close() |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
102 delete(pcp.conns, token) |
200
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
103 pcp.remove(token) |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
104 res <- true |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
105 } |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
106 return <-res |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
107 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
108 |
200
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
109 func (pcp *PersistentConnectionPool) store(token string, con *Connection) { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
110 err := pcp.db.Update(func(tx *bolt.Tx) error { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
111 b := tx.Bucket(sessionsBucket) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
112 var buf bytes.Buffer |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
113 if err := con.serialize(&buf); err != nil { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
114 return err |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
115 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
116 return b.Put([]byte(token), buf.Bytes()) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
117 }) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
118 if err != nil { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
119 log.Printf("error: %v\n", err) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
120 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
121 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
122 |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
123 func (pcp *PersistentConnectionPool) Add(token string, session *Session) *Connection { |
199
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
124 res := make(chan *Connection) |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
125 |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
126 pcp.cmds <- func(cp *PersistentConnectionPool) { |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
127 con := pcp.conns[token] |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
128 if con == nil { |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
129 con = &Connection{} |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
130 pcp.conns[token] = con |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
131 } |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
132 con.set(session) |
200
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
133 pcp.store(token, con) |
199
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
134 res <- con |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
135 } |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
136 |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
137 con := <-res |
ddc7ef95c247
Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
197
diff
changeset
|
138 return con |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
139 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
140 |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
141 func (pcp *PersistentConnectionPool) Renew(token string) (string, error) { |
200
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
142 |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
143 type result struct { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
144 newToken string |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
145 err error |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
146 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
147 |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
148 resCh := make(chan result) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
149 |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
150 pcp.cmds <- func(cp *PersistentConnectionPool) { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
151 con := pcp.conns[token] |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
152 if con == nil { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
153 resCh <- result{err: ErrNoSuchToken} |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
154 } else { |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
155 delete(pcp.conns, token) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
156 pcp.remove(token) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
157 newToken := GenerateSessionKey() |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
158 // TODO: Ensure that this is not racy! |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
159 con.session.ExpiresAt = time.Now().Add(maxTokenValid).Unix() |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
160 pcp.conns[newToken] = con |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
161 pcp.store(newToken, con) |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
162 resCh <- result{newToken: newToken} |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
163 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
164 } |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
165 |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
166 r := <-resCh |
8426a92fda00
Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
199
diff
changeset
|
167 return r.newToken, r.err |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
168 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
169 |
201
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
170 func (pcp *PersistentConnectionPool) trim(conn *Connection) { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
171 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
172 conn.refCount-- |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
173 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
174 for { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
175 least := time.Now() |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
176 var count int |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
177 var oldest *Connection |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
178 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
179 for _, con := range pcp.conns { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
180 if con.db != nil && con.refCount <= 0 { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
181 if last := con.last(); last.Before(least) { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
182 least = last |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
183 oldest = con |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
184 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
185 count++ |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
186 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
187 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
188 if count <= maxOpen { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
189 break |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
190 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
191 oldest.close() |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
192 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
193 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
194 |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
195 func (pcp *PersistentConnectionPool) Do(token string, fn func(*sql.DB) error) error { |
201
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 type result struct { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
198 con *Connection |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
199 err error |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
200 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
201 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
202 res := make(chan result) |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
203 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
204 pcp.cmds <- func(pcp *PersistentConnectionPool) { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
205 con := pcp.conns[token] |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
206 if con == nil { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
207 res <- result{err: ErrNoSuchToken} |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
208 return |
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 con.touch() |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
211 // store the session here. The ref counting for |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
212 // open db connections is irrelevant for persistence |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
213 // as they all come up closed when the system reboots. |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
214 pcp.store(token, con) |
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 if con.db != nil { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
217 con.refCount++ |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
218 res <- result{con: con} |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
219 return |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
220 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
221 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
222 session := con.session |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
223 db, err := opendb(session.User, session.Password) |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
224 if err != nil { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
225 res <- result{err: err} |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
226 return |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
227 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
228 con.db = db |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
229 con.refCount++ |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
230 res <- result{con: con} |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
231 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
232 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
233 r := <-res |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
234 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
235 if r.err != nil { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
236 return r.err |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
237 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
238 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
239 defer func() { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
240 pcp.cmds <- func(pcp *PersistentConnectionPool) { |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
241 pcp.trim(r.con) |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
242 } |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
243 }() |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
244 |
80dc7bbe97db
Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
200
diff
changeset
|
245 return fn(r.con.db) |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
246 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
247 |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
248 func (pcp *PersistentConnectionPool) Session(token string) *Session { |
202
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
249 res := make(chan *Session) |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
250 pcp.cmds <- func(pcp *PersistentConnectionPool) { |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
251 con := pcp.conns[token] |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
252 if con == nil { |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
253 res <- nil |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
254 } else { |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
255 con.touch() |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
256 pcp.store(token, con) |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
257 res <- con.session |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
258 } |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
259 } |
dba50c51cda7
Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
201
diff
changeset
|
260 return <-res |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
261 } |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
262 |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
263 func (pcp *PersistentConnectionPool) Shutdown() error { |
193
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
264 log.Println("info: shutdown persistent connection pool.") |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
265 if db := pcp.db; db != nil { |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
266 pcp.db = nil |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
267 return db.Close() |
1585c334e8a7
More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
190
diff
changeset
|
268 } |
190
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
269 return nil |
3457a60fb12d
Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
270 } |