@@ -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.
3131func (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.
8687func (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