From 9ffe842acc92184189caefd899cb19296055b6b9 Mon Sep 17 00:00:00 2001 From: Andrey Bocharnikov Date: Thu, 6 Jun 2024 18:08:17 +0400 Subject: [PATCH] fix(config)_: fix TorrentConfig when loading node config from DB * Fix TorrentConfig validation condition * Add tests * Should help existing users who cannot login to the app fixes #14813 --- api/defaults.go | 7 ++-- appdatabase/node_config_test.go | 61 +++++++++++++++++++++++++++++++++ params/config.go | 12 ++++++- params/defaults.go | 3 ++ server/pairing/common.go | 4 +-- 5 files changed, 79 insertions(+), 8 deletions(-) diff --git a/api/defaults.go b/api/defaults.go index f6ef6d001..8a90925d7 100644 --- a/api/defaults.go +++ b/api/defaults.go @@ -28,9 +28,6 @@ const walletAccountDefaultName = "Account 1" const keystoreRelativePath = "keystore" const DefaultKeycardPairingDataFile = "/ethereum/mainnet_rpc/keycard/pairings.json" -const DefaultArchivesRelativePath = "data/archivedata" -const DefaultTorrentTorrentsRelativePath = "data/torrents" - const DefaultDataDir = "/ethereum/mainnet_rpc" const DefaultNodeName = "StatusIM" const DefaultLogFile = "geth.log" @@ -325,8 +322,8 @@ func defaultNodeConfig(installationID string, request *requests.CreateAccount, o nodeConfig.TorrentConfig = params.TorrentConfig{ Enabled: false, Port: 0, - DataDir: filepath.Join(nodeConfig.RootDataDir, DefaultArchivesRelativePath), - TorrentDir: filepath.Join(nodeConfig.RootDataDir, DefaultTorrentTorrentsRelativePath), + DataDir: filepath.Join(nodeConfig.RootDataDir, params.ArchivesRelativePath), + TorrentDir: filepath.Join(nodeConfig.RootDataDir, params.TorrentTorrentsRelativePath), } if request.TorrentConfigEnabled != nil { diff --git a/appdatabase/node_config_test.go b/appdatabase/node_config_test.go index f36c0bab6..697220b25 100644 --- a/appdatabase/node_config_test.go +++ b/appdatabase/node_config_test.go @@ -253,3 +253,64 @@ func randomNodeConfig() *params.NodeConfig { }, } } + +func TestConfigValidate(t *testing.T) { + // GIVEN + db, stop := setupTestDB(t) + defer stop() + + tmpdir := t.TempDir() + nodeConfig, err := params.NewNodeConfig(tmpdir, 1777) + + require.NoError(t, err) + require.NoError(t, nodeConfig.Validate()) + require.NoError(t, nodecfg.SaveNodeConfig(db, nodeConfig)) + + // WHEN + dbNodeConfig, err := nodecfg.GetNodeConfigFromDB(db) + require.NoError(t, err) + + // THEN + require.NoError(t, dbNodeConfig.Validate()) +} + +func TestRepairLoadedTorrentConfig(t *testing.T) { + // GIVEN + db, stop := setupTestDB(t) + defer stop() + + tmpdir := t.TempDir() + nodeConfig, err := params.NewNodeConfig(tmpdir, 1777) + require.NoError(t, err) + + require.NoError(t, nodeConfig.Validate()) + + // Write config to db + require.NoError(t, nodecfg.SaveNodeConfig(db, nodeConfig)) + + // WHEN: Corrupt the torrent config data as described in the ticket + // (https://github.com/status-im/status-desktop/issues/14643) + // Write invalid torrent config to database + nodeConfig.TorrentConfig.DataDir = "" + nodeConfig.TorrentConfig.TorrentDir = "" + nodeConfig.TorrentConfig.Enabled = true + require.Error(t, nodeConfig.Validate()) + + _, err = db.Exec(`INSERT OR REPLACE INTO torrent_config ( + enabled, port, data_dir, torrent_dir, synthetic_id + ) VALUES (?, ?, ?, ?, 'id')`, + nodeConfig.TorrentConfig.Enabled, + nodeConfig.TorrentConfig.Port, + nodeConfig.TorrentConfig.DataDir, + nodeConfig.TorrentConfig.TorrentDir, + ) + require.NoError(t, err) + + dbNodeConfig, err := nodecfg.GetNodeConfigFromDB(db) + require.NoError(t, err) + + // THEN The invalid torrent config should be repaired + require.Error(t, dbNodeConfig.Validate()) + require.NoError(t, dbNodeConfig.UpdateWithDefaults()) + require.NoError(t, dbNodeConfig.Validate()) +} diff --git a/params/config.go b/params/config.go index 624e7551a..9bfdc3ab4 100644 --- a/params/config.go +++ b/params/config.go @@ -819,6 +819,16 @@ func (c *NodeConfig) UpdateWithDefaults() error { c.WakuConfig.MinimumPoW = WakuMinimumPoW } + // Ensure TorrentConfig is valid + if c.TorrentConfig.Enabled { + if c.TorrentConfig.DataDir == "" { + c.TorrentConfig.DataDir = filepath.Join(c.RootDataDir, ArchivesRelativePath) + } + if c.TorrentConfig.TorrentDir == "" { + c.TorrentConfig.TorrentDir = filepath.Join(c.RootDataDir, TorrentTorrentsRelativePath) + } + } + return c.setDefaultPushNotificationsServers() } @@ -1124,7 +1134,7 @@ func (c *TorrentConfig) Validate(validate *validator.Validate) error { return err } - if c.Enabled && c.DataDir == "" || c.TorrentDir == "" { + if c.Enabled && (c.DataDir == "" || c.TorrentDir == "") { return fmt.Errorf("TorrentConfig.DataDir and TorrentConfig.TorrentDir cannot be \"\"") } return nil diff --git a/params/defaults.go b/params/defaults.go index 5c1a32ad0..5685ffd91 100644 --- a/params/defaults.go +++ b/params/defaults.go @@ -6,6 +6,9 @@ const ( // StatusDatabase path relative to DataDir. StatusDatabase = "status-db" + ArchivesRelativePath = "data/archivedata" + TorrentTorrentsRelativePath = "data/torrents" + // SendTransactionMethodName https://docs.walletconnect.com/advanced/rpc-reference/ethereum-rpc#eth_sendtransaction SendTransactionMethodName = "eth_sendTransaction" diff --git a/server/pairing/common.go b/server/pairing/common.go index fa52c413d..e06bfb1b3 100644 --- a/server/pairing/common.go +++ b/server/pairing/common.go @@ -347,8 +347,8 @@ func setDefaultNodeConfig(c *params.NodeConfig) error { c.TorrentConfig = params.TorrentConfig{ Enabled: specifiedTorrentConfigEnabled, Port: specifiedTorrentConfigPort, - DataDir: filepath.Join(c.RootDataDir, api.DefaultArchivesRelativePath), - TorrentDir: filepath.Join(c.RootDataDir, api.DefaultTorrentTorrentsRelativePath), + DataDir: filepath.Join(c.RootDataDir, params.ArchivesRelativePath), + TorrentDir: filepath.Join(c.RootDataDir, params.TorrentTorrentsRelativePath), } return nil