@@ -22,15 +22,16 @@ type sessionRpcServer struct {
22
22
db * session.DB
23
23
sessionServer * session.Server
24
24
25
- quit chan struct {}
26
-
25
+ quit chan struct {}
26
+ wg sync. WaitGroup
27
27
stopOnce sync.Once
28
28
}
29
29
30
30
// stop cleans up any sessionRpcServer resources.
31
31
func (s * sessionRpcServer ) stop () {
32
32
s .stopOnce .Do (func () {
33
33
close (s .quit )
34
+ s .wg .Wait ()
34
35
})
35
36
}
36
37
@@ -84,6 +85,9 @@ func (s *sessionRpcServer) AddSession(_ context.Context,
84
85
// resumeSession tries to start an existing session if it is not expired, not
85
86
// revoked and a LiT session.
86
87
func (s * sessionRpcServer ) resumeSession (sess * session.Session ) error {
88
+ pubKey := sess .LocalPublicKey
89
+ pubKeyBytes := pubKey .SerializeCompressed ()
90
+
87
91
// We only start non-revoked, non-expired LiT sessions. Everything else
88
92
// we just skip.
89
93
if sess .State != session .StateInUse &&
@@ -100,12 +104,49 @@ func (s *sessionRpcServer) resumeSession(sess *session.Session) error {
100
104
}
101
105
if sess .Expiry .Before (time .Now ()) {
102
106
log .Debugf ("Not resuming session %x with expiry %s" ,
103
- sess .LocalPublicKey .SerializeCompressed (), sess .Expiry )
107
+ pubKeyBytes , sess .Expiry )
108
+
109
+ if err := s .db .RevokeSession (pubKey ); err != nil {
110
+ return fmt .Errorf ("error revoking session: %v" , err )
111
+ }
112
+
104
113
return nil
105
114
}
106
115
107
116
authData := []byte ("Authorization: Basic " + s .basicAuth )
108
- _ , err := s .sessionServer .StartSession (sess , authData )
117
+ sessionClosedSub , err := s .sessionServer .StartSession (sess , authData )
118
+ if err != nil {
119
+ return err
120
+ }
121
+
122
+ s .wg .Add (1 )
123
+ go func () {
124
+ defer s .wg .Done ()
125
+
126
+ ticker := time .NewTimer (time .Until (sess .Expiry ))
127
+ defer ticker .Stop ()
128
+
129
+ select {
130
+ case <- s .quit :
131
+ case <- sessionClosedSub :
132
+ case <- ticker .C :
133
+ log .Debugf ("Stopping expired session %x with " +
134
+ "type %d" , pubKeyBytes , sess .Type )
135
+
136
+ err = s .sessionServer .StopSession (pubKey )
137
+ if err != nil {
138
+ log .Debugf ("Error stopping session: " +
139
+ "%v" , err )
140
+ }
141
+
142
+ err = s .db .RevokeSession (pubKey )
143
+ if err != nil {
144
+ log .Debugf ("error revoking session: " +
145
+ "%v" , err )
146
+ }
147
+ }
148
+ }()
149
+
109
150
return err
110
151
}
111
152
0 commit comments