From 41e36c7ec788178fc111a26ea087fb12e64449ba Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Fri, 21 Oct 2022 11:24:46 +0200 Subject: [PATCH] watchtower: add wtclient.ClientSession constructor --- watchtower/wtclient/client.go | 22 +++++++--------------- watchtower/wtclient/interface.go | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/watchtower/wtclient/client.go b/watchtower/wtclient/client.go index 32622b7da..fda072840 100644 --- a/watchtower/wtclient/client.go +++ b/watchtower/wtclient/client.go @@ -435,27 +435,19 @@ func getTowerAndSessionCandidates(db DB, keyRing ECDHKeyRing, } for _, s := range sessions { - towerKeyDesc, err := keyRing.DeriveKey( - keychain.KeyLocator{ - Family: keychain.KeyFamilyTowerSession, - Index: s.KeyIndex, - }, + if !sessionFilter(s) { + continue + } + + cs, err := NewClientSessionFromDBSession( + s, tower, keyRing, ) if err != nil { return nil, err } - sessionKeyECDH := keychain.NewPubKeyECDH( - towerKeyDesc, keyRing, - ) - // Add the session to the set of candidate sessions. - candidateSessions[s.ID] = &ClientSession{ - ID: s.ID, - ClientSessionBody: s.ClientSessionBody, - Tower: tower, - SessionKeyECDH: sessionKeyECDH, - } + candidateSessions[s.ID] = cs perActiveTower(tower) } diff --git a/watchtower/wtclient/interface.go b/watchtower/wtclient/interface.go index a69e9980f..4dd9176ae 100644 --- a/watchtower/wtclient/interface.go +++ b/watchtower/wtclient/interface.go @@ -198,3 +198,30 @@ type ClientSession struct { // key used to connect to the watchtower. SessionKeyECDH keychain.SingleKeyECDH } + +// NewClientSessionFromDBSession converts a wtdb.ClientSession to a +// ClientSession. +func NewClientSessionFromDBSession(s *wtdb.ClientSession, tower *Tower, + keyRing ECDHKeyRing) (*ClientSession, error) { + + towerKeyDesc, err := keyRing.DeriveKey( + keychain.KeyLocator{ + Family: keychain.KeyFamilyTowerSession, + Index: s.KeyIndex, + }, + ) + if err != nil { + return nil, err + } + + sessionKeyECDH := keychain.NewPubKeyECDH( + towerKeyDesc, keyRing, + ) + + return &ClientSession{ + ID: s.ID, + ClientSessionBody: s.ClientSessionBody, + Tower: tower, + SessionKeyECDH: sessionKeyECDH, + }, nil +}