annotate auth/connection.go @ 196:b67208d82543

Make test output more comprehensive Running all tests in one transaction ensures the final output tells about any failing test, not just in the last transaction (i.e. test script). The price is that no traces of the tests are left in the database because we have to rollback in order to have no left-over test roles in the cluster.
author Tom Gottfried <tom@intevation.de>
date Fri, 20 Jul 2018 18:31:45 +0200
parents 1585c334e8a7
children e85413e5befa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 package auth
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
96a429c5f227 Fundamental connection pool based on tokens.
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"
26
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 "database/sql"
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
6 "encoding/binary"
26
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 "errors"
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
8 "io"
126
89cf2e7672ff Implemented an explicit token deletion under endpoint /api/logout.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 27
diff changeset
9 "log"
134
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
10 "sync"
26
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 "time"
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
12
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
13 "gemma.intevation.de/gemma/config"
26
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 )
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 var ErrNoSuchToken = errors.New("No such token")
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17
148
0116aae1071b Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 134
diff changeset
18 type ConnectionPool interface {
0116aae1071b Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 134
diff changeset
19 Delete(token string) bool
0116aae1071b Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 134
diff changeset
20 Add(token string, session *Session) *Connection
0116aae1071b Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 134
diff changeset
21 Renew(token string) (string, error)
0116aae1071b Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 134
diff changeset
22 Do(token string, fn func(*sql.DB) error) error
0116aae1071b Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 134
diff changeset
23 Session(token string) *Session
151
3349bfc2a047 Shutdown server gracefully.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 148
diff changeset
24 Shutdown() error
148
0116aae1071b Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 134
diff changeset
25 }
0116aae1071b Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 134
diff changeset
26
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
27 var ConnPool = func() ConnectionPool {
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
28 if config.Config.SessionStore != "" {
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
29 cp, err := NewPersistentConnectionPool(config.Config.SessionStore)
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
30 if err != nil {
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
31 log.Panicf("Error with session store: %v\n", err)
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
32 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
33 return cp
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
34 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
35 return NewInMemoryConnectionPool()
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 151
diff changeset
36 }()
26
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 const (
130
13b82701b1fb Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 129
diff changeset
39 maxOpen = 16
13b82701b1fb Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 129
diff changeset
40 maxDBIdle = time.Minute * 5
26
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 )
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 type Connection struct {
134
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
44 session *Session
26
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45
131
af114cf64822 Added some reference counting to open db connection to not forcefully close them when system is under pressure. TODO: check if this race free (it should).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 130
diff changeset
46 access time.Time
af114cf64822 Added some reference counting to open db connection to not forcefully close them when system is under pressure. TODO: check if this race free (it should).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 130
diff changeset
47 db *sql.DB
af114cf64822 Added some reference counting to open db connection to not forcefully close them when system is under pressure. TODO: check if this race free (it should).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 130
diff changeset
48 refCount int
134
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
49
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
50 mu sync.Mutex
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
51 }
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
52
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
53 func (c *Connection) serialize() []byte {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
54 var buf bytes.Buffer
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
55 c.session.serialize(&buf)
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
56 access, _ := c.last().MarshalText()
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
57 binary.Write(&buf, binary.BigEndian, string(access))
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
58 return buf.Bytes()
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
59 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
60
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
61 func (c *Connection) unserialize(r io.Reader) error {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
62 session := new(Session)
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
63 if err := session.unserialize(r); err != nil {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
64 return err
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
65 }
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 var access string
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
68 if err := binary.Read(r, binary.BigEndian, &access); err != nil {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
69 return err
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
70 }
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 var t time.Time
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
73 if err := t.UnmarshalText([]byte(access)); err != nil {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
74 return err
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
75 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
76
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
77 *c = Connection{
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
78 session: session,
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
79 access: t,
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
80 }
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 return nil
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
83 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
84
134
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
85 func (c *Connection) set(session *Session) {
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
86 c.session = session
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
87 c.touch()
26
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
88 }
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
89
134
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
90 func (c *Connection) touch() {
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
91 c.mu.Lock()
26
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
92 c.access = time.Now()
134
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
93 c.mu.Unlock()
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
94 }
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
95
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
96 func (c *Connection) last() time.Time {
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
97 c.mu.Lock()
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
98 access := c.access
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
99 c.mu.Unlock()
0c56c56a1c44 Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 133
diff changeset
100 return access
26
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
101 }
96a429c5f227 Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
102
130
13b82701b1fb Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 129
diff changeset
103 func (c *Connection) close() {
13b82701b1fb Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 129
diff changeset
104 if c.db != nil {
13b82701b1fb Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 129
diff changeset
105 if err := c.db.Close(); err != nil {
13b82701b1fb Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 129
diff changeset
106 log.Printf("warn: %v\n", err)
13b82701b1fb Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 129
diff changeset
107 }
13b82701b1fb Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 129
diff changeset
108 c.db = nil
13b82701b1fb Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 129
diff changeset
109 }
13b82701b1fb Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 129
diff changeset
110 }