multi: give firewallDB access to session ID index

This commit is contained in:
Elle Mouton 2023-08-24 11:30:20 +02:00
parent 7c7e467d03
commit 73110b6472
No known key found for this signature in database
GPG key ID: D7D916376026F177
6 changed files with 45 additions and 36 deletions

View file

@ -12,7 +12,7 @@ import (
func TestActionStorage(t *testing.T) {
tmpDir := t.TempDir()
db, err := NewDB(tmpDir, "test.db")
db, err := NewDB(tmpDir, "test.db", nil)
require.NoError(t, err)
t.Cleanup(func() {
_ = db.Close()
@ -147,7 +147,7 @@ func TestActionStorage(t *testing.T) {
func TestListActions(t *testing.T) {
tmpDir := t.TempDir()
db, err := NewDB(tmpDir, "test.db")
db, err := NewDB(tmpDir, "test.db", nil)
require.NoError(t, err)
t.Cleanup(func() {
_ = db.Close()

View file

@ -8,6 +8,7 @@ import (
"path/filepath"
"time"
"github.com/lightninglabs/lightning-terminal/session"
"go.etcd.io/bbolt"
)
@ -40,10 +41,14 @@ var (
// DB is a bolt-backed persistent store.
type DB struct {
*bbolt.DB
sessionIDIndex session.IDToGroupIndex
}
// NewDB creates a new bolt database that can be found at the given directory.
func NewDB(dir, fileName string) (*DB, error) {
func NewDB(dir, fileName string, sessionIDIndex session.IDToGroupIndex) (*DB,
error) {
firstInit := false
path := filepath.Join(dir, fileName)
@ -66,7 +71,10 @@ func NewDB(dir, fileName string) (*DB, error) {
return nil, err
}
return &DB{DB: db}, nil
return &DB{
DB: db,
sessionIDIndex: sessionIDIndex,
}, nil
}
// fileExists reports whether the named file or directory exists.

View file

@ -18,7 +18,7 @@ func TestKVStoreTxs(t *testing.T) {
ctx := context.Background()
tmpDir := t.TempDir()
db, err := NewDB(tmpDir, "test.db")
db, err := NewDB(tmpDir, "test.db", nil)
require.NoError(t, err)
t.Cleanup(func() {
_ = db.Close()
@ -65,7 +65,7 @@ func TestTempAndPermStores(t *testing.T) {
ctx := context.Background()
tmpDir := t.TempDir()
db, err := NewDB(tmpDir, "test.db")
db, err := NewDB(tmpDir, "test.db", nil)
require.NoError(t, err)
t.Cleanup(func() {
_ = db.Close()
@ -113,7 +113,7 @@ func TestTempAndPermStores(t *testing.T) {
require.NoError(t, db.Close())
// Restart it.
db, err = NewDB(tmpDir, "test.db")
db, err = NewDB(tmpDir, "test.db", nil)
require.NoError(t, err)
t.Cleanup(func() {
_ = db.Close()
@ -147,7 +147,7 @@ func TestKVStoreNameSpaces(t *testing.T) {
ctx := context.Background()
tmpDir := t.TempDir()
db, err := NewDB(tmpDir, "test.db")
db, err := NewDB(tmpDir, "test.db", nil)
require.NoError(t, err)
t.Cleanup(func() {
_ = db.Close()

View file

@ -10,7 +10,7 @@ import (
// TestPrivacyMapStorage tests the privacy mapper CRUD logic.
func TestPrivacyMapStorage(t *testing.T) {
tmpDir := t.TempDir()
db, err := NewDB(tmpDir, "test.db")
db, err := NewDB(tmpDir, "test.db", nil)
require.NoError(t, err)
t.Cleanup(func() {
_ = db.Close()
@ -68,7 +68,7 @@ func TestPrivacyMapStorage(t *testing.T) {
// `Update` function, then all the changes prior should be rolled back.
func TestPrivacyMapTxs(t *testing.T) {
tmpDir := t.TempDir()
db, err := NewDB(tmpDir, "test.db")
db, err := NewDB(tmpDir, "test.db", nil)
require.NoError(t, err)
t.Cleanup(func() {
_ = db.Close()

View file

@ -41,7 +41,6 @@ type sessionRpcServer struct {
litrpc.UnimplementedAutopilotServer
cfg *sessionRpcServerConfig
db *session.DB
sessionServer *session.Server
// sessRegMu is a mutex that should be held between acquiring an unused
@ -57,8 +56,8 @@ type sessionRpcServer struct {
// sessionRpcServerConfig holds the values used to configure the
// sessionRpcServer.
type sessionRpcServerConfig struct {
db *session.DB
basicAuth string
dbDir string
grpcOptions []grpc.ServerOption
registerGrpcServers func(server *grpc.Server)
superMacBaker session.MacaroonBaker
@ -74,12 +73,6 @@ type sessionRpcServerConfig struct {
func newSessionRPCServer(cfg *sessionRpcServerConfig) (*sessionRpcServer,
error) {
// Create an instance of the local Terminal Connect session store DB.
db, err := session.NewDB(cfg.dbDir, session.DBFilename)
if err != nil {
return nil, fmt.Errorf("error creating session DB: %v", err)
}
// Create the gRPC server that handles adding/removing sessions and the
// actual mailbox server that spins up the Terminal Connect server
// interface.
@ -96,7 +89,6 @@ func newSessionRPCServer(cfg *sessionRpcServerConfig) (*sessionRpcServer,
return &sessionRpcServer{
cfg: cfg,
db: db,
sessionServer: server,
quit: make(chan struct{}),
}, nil
@ -106,7 +98,7 @@ func newSessionRPCServer(cfg *sessionRpcServerConfig) (*sessionRpcServer,
// requests. This includes resuming all non-revoked sessions.
func (s *sessionRpcServer) start() error {
// Start up all previously created sessions.
sessions, err := s.db.ListSessions(nil)
sessions, err := s.cfg.db.ListSessions(nil)
if err != nil {
return fmt.Errorf("error listing sessions: %v", err)
}
@ -157,7 +149,7 @@ func (s *sessionRpcServer) start() error {
err)
if perm {
err := s.db.RevokeSession(
err := s.cfg.db.RevokeSession(
sess.LocalPublicKey,
)
if err != nil {
@ -182,7 +174,7 @@ func (s *sessionRpcServer) start() error {
func (s *sessionRpcServer) stop() error {
var returnErr error
s.stopOnce.Do(func() {
if err := s.db.Close(); err != nil {
if err := s.cfg.db.Close(); err != nil {
log.Errorf("Error closing session DB: %v", err)
returnErr = err
}
@ -323,7 +315,7 @@ func (s *sessionRpcServer) AddSession(_ context.Context,
s.sessRegMu.Lock()
defer s.sessRegMu.Unlock()
id, localPrivKey, err := s.db.GetUnusedIDAndKeyPair()
id, localPrivKey, err := s.cfg.db.GetUnusedIDAndKeyPair()
if err != nil {
return nil, err
}
@ -336,7 +328,7 @@ func (s *sessionRpcServer) AddSession(_ context.Context,
return nil, fmt.Errorf("error creating new session: %v", err)
}
if err := s.db.CreateSession(sess); err != nil {
if err := s.cfg.db.CreateSession(sess); err != nil {
return nil, fmt.Errorf("error storing session: %v", err)
}
@ -375,7 +367,7 @@ func (s *sessionRpcServer) resumeSession(sess *session.Session) error {
log.Debugf("Not resuming session %x with expiry %s",
pubKeyBytes, sess.Expiry)
if err := s.db.RevokeSession(pubKey); err != nil {
if err := s.cfg.db.RevokeSession(pubKey); err != nil {
return fmt.Errorf("error revoking session: %v", err)
}
@ -455,7 +447,7 @@ func (s *sessionRpcServer) resumeSession(sess *session.Session) error {
log.Debugf("Deadline for session %x has already "+
"passed. Revoking session", pubKeyBytes)
return s.db.RevokeSession(pubKey)
return s.cfg.db.RevokeSession(pubKey)
}
// Start the deadline timer.
@ -490,7 +482,7 @@ func (s *sessionRpcServer) resumeSession(sess *session.Session) error {
authData := []byte(fmt.Sprintf("%s: %s", HeaderMacaroon, mac))
sessionClosedSub, err := s.sessionServer.StartSession(
sess, authData, s.db.UpdateSessionRemotePubKey, onNewStatus,
sess, authData, s.cfg.db.UpdateSessionRemotePubKey, onNewStatus,
)
if err != nil {
return err
@ -535,7 +527,7 @@ func (s *sessionRpcServer) resumeSession(sess *session.Session) error {
log.Debugf("Error stopping session: %v", err)
}
err = s.db.RevokeSession(pubKey)
err = s.cfg.db.RevokeSession(pubKey)
if err != nil {
log.Debugf("error revoking session: %v", err)
}
@ -548,7 +540,7 @@ func (s *sessionRpcServer) resumeSession(sess *session.Session) error {
func (s *sessionRpcServer) ListSessions(_ context.Context,
_ *litrpc.ListSessionsRequest) (*litrpc.ListSessionsResponse, error) {
sessions, err := s.db.ListSessions(nil)
sessions, err := s.cfg.db.ListSessions(nil)
if err != nil {
return nil, fmt.Errorf("error fetching sessions: %v", err)
}
@ -577,7 +569,7 @@ func (s *sessionRpcServer) RevokeSession(ctx context.Context,
return nil, fmt.Errorf("error parsing public key: %v", err)
}
if err := s.db.RevokeSession(pubKey); err != nil {
if err := s.cfg.db.RevokeSession(pubKey); err != nil {
return nil, fmt.Errorf("error revoking session: %v", err)
}
@ -995,7 +987,7 @@ func (s *sessionRpcServer) AddAutopilotSession(ctx context.Context,
s.sessRegMu.Lock()
defer s.sessRegMu.Unlock()
id, localPrivKey, err := s.db.GetUnusedIDAndKeyPair()
id, localPrivKey, err := s.cfg.db.GetUnusedIDAndKeyPair()
if err != nil {
return nil, err
}
@ -1037,7 +1029,7 @@ func (s *sessionRpcServer) AddAutopilotSession(ctx context.Context,
// We only persist this session if we successfully retrieved the
// autopilot's static key.
sess.RemotePublicKey = remoteKey
if err := s.db.CreateSession(sess); err != nil {
if err := s.cfg.db.CreateSession(sess); err != nil {
return nil, fmt.Errorf("error storing session: %v", err)
}
@ -1061,7 +1053,7 @@ func (s *sessionRpcServer) ListAutopilotSessions(_ context.Context,
_ *litrpc.ListAutopilotSessionsRequest) (
*litrpc.ListAutopilotSessionsResponse, error) {
sessions, err := s.db.ListSessions(func(s *session.Session) bool {
sessions, err := s.cfg.db.ListSessions(func(s *session.Session) bool {
return s.Type == session.TypeAutopilot
})
if err != nil {
@ -1092,7 +1084,7 @@ func (s *sessionRpcServer) RevokeAutopilotSession(ctx context.Context,
return nil, fmt.Errorf("error parsing public key: %v", err)
}
sess, err := s.db.GetSession(pubKey)
sess, err := s.cfg.db.GetSession(pubKey)
if err != nil {
return nil, err
}

View file

@ -184,6 +184,7 @@ type LightningTerminal struct {
accountRpcServer *accounts.RPCServer
firewallDB *firewalldb.DB
sessionDB *session.DB
restHandler http.Handler
restCancel func()
@ -317,12 +318,20 @@ func (g *LightningTerminal) start() error {
g.ruleMgrs = rules.NewRuleManagerSet()
// Create an instance of the local Terminal Connect session store DB.
networkDir := filepath.Join(g.cfg.LitDir, g.cfg.Network)
g.firewallDB, err = firewalldb.NewDB(networkDir, firewalldb.DBFilename)
g.sessionDB, err = session.NewDB(networkDir, session.DBFilename)
if err != nil {
return fmt.Errorf("error creating session DB: %v", err)
}
g.firewallDB, err = firewalldb.NewDB(
networkDir, firewalldb.DBFilename, g.sessionDB,
)
if err != nil {
return fmt.Errorf("error creating firewall DB: %v", err)
}
if !g.cfg.Autopilot.Disable {
if g.cfg.Autopilot.Address == "" &&
len(g.cfg.Autopilot.DialOpts) == 0 {
@ -353,8 +362,8 @@ func (g *LightningTerminal) start() error {
}
g.sessionRpcServer, err = newSessionRPCServer(&sessionRpcServerConfig{
db: g.sessionDB,
basicAuth: g.rpcProxy.basicAuth,
dbDir: filepath.Join(g.cfg.LitDir, g.cfg.Network),
grpcOptions: []grpc.ServerOption{
grpc.CustomCodec(grpcProxy.Codec()), // nolint: staticcheck,
grpc.ChainStreamInterceptor(