diff --git a/watchtower/wtserver/delete_session.go b/watchtower/wtserver/delete_session.go new file mode 100644 index 000000000..a5b517c12 --- /dev/null +++ b/watchtower/wtserver/delete_session.go @@ -0,0 +1,57 @@ +package wtserver + +import ( + "github.com/lightningnetwork/lnd/watchtower/wtdb" + "github.com/lightningnetwork/lnd/watchtower/wtwire" +) + +// handleDeleteSession processes a DeleteSession request for a client with given +// SessionID. The id is assumed to have been previously authenticated by the +// brontide connection. +func (s *Server) handleDeleteSession(peer Peer, id *wtdb.SessionID) error { + var failCode wtwire.DeleteSessionCode + + // Delete all session data associated with id. + err := s.cfg.DB.DeleteSession(*id) + switch { + case err == nil: + failCode = wtwire.CodeOK + + log.Debugf("Session %s deleted", id) + + case err == wtdb.ErrSessionNotFound: + failCode = wtwire.DeleteSessionCodeNotFound + + default: + failCode = wtwire.CodeTemporaryFailure + } + + return s.replyDeleteSession(peer, id, failCode) +} + +// replyDeleteSession sends a DeleteSessionReply back to the peer containing the +// error code resulting from processes a DeleteSession request. +func (s *Server) replyDeleteSession(peer Peer, id *wtdb.SessionID, + code wtwire.DeleteSessionCode) error { + + msg := &wtwire.DeleteSessionReply{ + Code: code, + } + + err := s.sendMessage(peer, msg) + if err != nil { + log.Errorf("Unable to send DeleteSessionReply to %s", id) + } + + // Return the write error if the request succeeded. + if code == wtwire.CodeOK { + return err + } + + // Otherwise the request failed, return a connection failure to + // disconnect the client. + return &connFailure{ + ID: *id, + Code: uint16(code), + } +} diff --git a/watchtower/wtserver/server.go b/watchtower/wtserver/server.go index d1dc9b4c6..4a49c3ad4 100644 --- a/watchtower/wtserver/server.go +++ b/watchtower/wtserver/server.go @@ -259,6 +259,13 @@ func (s *Server) handleClient(peer Peer) { "from %s: %v", id, err) } + case *wtwire.DeleteSession: + err = s.handleDeleteSession(peer, &id) + if err != nil { + log.Errorf("Unable to handle DeleteSession "+ + "from %s: %v", id, err) + } + case *wtwire.StateUpdate: err = s.handleStateUpdates(peer, &id, msg) if err != nil {