fix(lite): rebuild controller on lite-server change (stale-settings audit HIGH)

The LiteWalletController was constructed once at App::init() with the lite
connection settings known at startup; changing the lite server in Settings
persisted to disk but never reached the live controller, so the new server had
no effect until the next launch.

Factor the construction into App::rebuildLiteWallet() and call it after a
successful server-selection save. The rebuild deliberately preserves a live
session: if a wallet is already open (and possibly mid-sync), it no-ops and the
new selection applies on the next controller build, rather than discarding the
open wallet and its uninterruptible in-flight sync.

Closes the last remaining HIGH from the session audit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-05 11:32:54 -05:00
parent 043cdc7128
commit 4b9d6f7db5
3 changed files with 22 additions and 6 deletions

View File

@@ -169,12 +169,7 @@ bool App::init()
// Lite builds with a linked SDXL backend own a lite wallet controller that drives
// real create/open/restore through the bridge. Full-node and unlinked-lite builds
// leave lite_wallet_ null (the UI falls back to validation-only).
if (supportsLiteBackend()) {
lite_wallet_ = wallet::LiteWalletController::createLinked(
walletCapabilities(),
wallet::liteConnectionSettingsFromAppSettings(*settings_));
lite_wallet_->setPersistCallback([this]() { settings_->save(); });
}
rebuildLiteWallet();
// Apply verbose logging preference from saved settings
util::Logger::instance().setVerbose(settings_->getVerboseLogging());
@@ -370,6 +365,21 @@ void App::preFrame()
}
}
void App::rebuildLiteWallet()
{
if (!supportsLiteBackend() || !settings_) return;
// Don't tear down a live session: if a wallet is already open (and possibly mid-sync), the
// new server selection is already persisted to settings and will take effect the next time
// the controller is built (next launch, or before another wallet is opened). Rebuilding now
// would discard the open wallet and its in-flight, uninterruptible sync.
if (lite_wallet_ && lite_wallet_->walletOpen()) return;
lite_wallet_ = wallet::LiteWalletController::createLinked(
walletCapabilities(),
wallet::liteConnectionSettingsFromAppSettings(*settings_));
lite_wallet_->setPersistCallback([this]() { settings_->save(); });
}
void App::update()
{
PERF_SCOPE("Update.Total");