mirror of
https://github.com/lightninglabs/lightning-terminal.git
synced 2026-08-13 12:33:36 +02:00
multi: give firewallDB access to session ID index
This commit is contained in:
parent
7c7e467d03
commit
73110b6472
6 changed files with 45 additions and 36 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
13
terminal.go
13
terminal.go
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue