Skip to content

Commit 7a0a18d

Browse files
committed
session_rpcserver: revoke & stop expired sessions
In this commit, we ensure that an expired session is revoked and stopped.
1 parent 259ad26 commit 7a0a18d

File tree

1 file changed

+45
-4
lines changed

1 file changed

+45
-4
lines changed

session_rpcserver.go

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,16 @@ type sessionRpcServer struct {
2222
db *session.DB
2323
sessionServer *session.Server
2424

25-
quit chan struct{}
26-
25+
quit chan struct{}
26+
wg sync.WaitGroup
2727
stopOnce sync.Once
2828
}
2929

3030
// stop cleans up any sessionRpcServer resources.
3131
func (s *sessionRpcServer) stop() {
3232
s.stopOnce.Do(func() {
3333
close(s.quit)
34+
s.wg.Wait()
3435
})
3536
}
3637

@@ -84,6 +85,9 @@ func (s *sessionRpcServer) AddSession(_ context.Context,
8485
// resumeSession tries to start an existing session if it is not expired, not
8586
// revoked and a LiT session.
8687
func (s *sessionRpcServer) resumeSession(sess *session.Session) error {
88+
pubKey := sess.LocalPublicKey
89+
pubKeyBytes := pubKey.SerializeCompressed()
90+
8791
// We only start non-revoked, non-expired LiT sessions. Everything else
8892
// we just skip.
8993
if sess.State != session.StateInUse &&
@@ -100,12 +104,49 @@ func (s *sessionRpcServer) resumeSession(sess *session.Session) error {
100104
}
101105
if sess.Expiry.Before(time.Now()) {
102106
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+
104113
return nil
105114
}
106115

107116
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+
109150
return err
110151
}
111152

0 commit comments

Comments
 (0)