Fix cloud features staying off after login when the setup wizard was closed

Reported on #15239: after signing in to Orca Cloud on a fresh install, no sync
prompt appears and File > Sync Presets is greyed out with nothing to explain why.

CAUSE. AppConfig::get_stealth_mode() returns true whenever `firstguide/finish` is
unset, and that flag is written in exactly one place — GuideFrame::SaveProfile(),
i.e. only when the setup wizard is COMPLETED. Closing the wizard is what people do
today to reach the login (the wizard never offers it, which is #15239 itself), so a
new user ends up permanently in a stealth mode they never chose. Every cloud gate
keyed on get_stealth_mode() then switches off silently, including:

  * GUI_App::on_user_login_handle(), which returns EARLY on stealth — so the whole
    post-login flow is skipped: preset migration, plugin fetch, user-preset load and
    show_sync_dialog(). That is the missing sync prompt.
  * the Sync Presets item in both the top menu and the File menu, whose enable
    lambda was `is_user_login() && !get_stealth_mode()`. That is the greyed item.

The result is indistinguishable from real Stealth mode, and nothing in the UI says
so, because the one place that DOES explain it — the "Quit Stealth Mode" dialog in
handle_web_request() — only covers the homepage login commands.

FIX, two parts.

1. The pre-wizard value is a DEFAULT for "the user has not been asked yet", not a
   setting, so it must not survive the user answering. Signing in to a cloud account
   is that answer. AppConfig now carries a session-only `m_cloud_logged_in` mirrored
   from the network agent (on login, on logout, and at agent start so a restored
   session counts), and get_stealth_mode() consults it before falling back to the
   pre-wizard default. An explicit Stealth mode setting is untouched and still wins:
   a user who turned it on deliberately stays offline whether or not they sign in.

2. Sync Presets no longer greys itself out. Both refusal paths already had a message
   to show — "You must be logged in…" and now one for Stealth mode naming the
   Preferences toggle — and the enable lambda was making both unreachable. A disabled
   item that cannot say why is the reason this took a bug report to find.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Tommaso Bianchi
2026-08-15 21:14:35 +02:00
co-authored by Claude Opus 5
parent 8e5d0d195c
commit 7d313159df
4 changed files with 50 additions and 8 deletions
+11 -2
View File
@@ -86,8 +86,17 @@ std::string AppConfig::get_hms_host()
bool AppConfig::get_stealth_mode()
{
// always return true when user did not finish setup wizard yet
if (!get_bool("firstguide","finish")) {
// Before the setup wizard has been completed the user has not been asked whether the app may
// use the network, so default to no. Signing in to a cloud account IS that answer, though, and
// the latch must not survive it: a user who closes the wizard and logs in from the account menu
// — the workaround people share for the wizard never offering login — otherwise gets every
// cloud feature silently switched off. No post-login sync prompt, no user presets fetched, and
// "Sync Presets" greyed out with nothing to say why, because on_user_login_handle() returns
// early on stealth. Upstream #15239.
//
// This releases the pre-wizard DEFAULT only. An explicit Stealth mode setting still wins, so a
// user who deliberately turned it on stays offline whether or not they are signed in.
if (!m_cloud_logged_in && !get_bool("firstguide","finish")) {
return true;
}
return get_bool("stealth_mode");
+6
View File
@@ -91,6 +91,9 @@ public:
std::string get_language_code();
std::string get_hms_host();
bool get_stealth_mode();
// Session state, not a setting: mirrors whether a cloud account is currently signed in, so
// get_stealth_mode() can tell "the user has not been asked yet" from "the user said no".
void set_cloud_logged_in(bool logged_in) { m_cloud_logged_in = logged_in; }
bool get_hide_login_side_panel();
// Clear and reset to defaults.
@@ -424,6 +427,9 @@ private:
Semver m_orig_version;
// Whether the existing version is before system profiles & configuration updating
bool m_legacy_datadir;
// A cloud account is signed in right now. Deliberately NOT persisted: it is mirrored from the
// network agent on login/logout, so a stale value cannot outlive the session that set it.
bool m_cloud_logged_in{false};
std::string m_loading_path;
+11
View File
@@ -3834,6 +3834,10 @@ bool GUI_App::on_init_network(bool try_backup)
std::string country_code = app_config->get_country_code();
m_agent->set_country_code(country_code);
m_agent->start();
// A session restored from a saved token fires no login event, so seed the flag here too —
// otherwise the pre-wizard stealth default would come back on the next launch for a user
// who is already signed in.
app_config->set_cloud_logged_in(m_agent->is_user_login(ORCA_CLOUD_PROVIDER));
// Orca: disable Bambu telemetry up-front (before any login) so it never starts.
check_track_enable();
}
@@ -5003,6 +5007,7 @@ void GUI_App::request_user_logout(const std::string& provider/* = ORCA_CLOUD_PRO
{
if (m_agent && m_agent->is_user_login(provider)) {
m_agent->user_logout(true, provider);
app_config->set_cloud_logged_in(m_agent->is_user_login(ORCA_CLOUD_PROVIDER));
if (provider == get_printer_cloud_provider()) {
m_agent->set_user_selected_machine("");
@@ -5588,6 +5593,12 @@ void GUI_App::on_update_machine_list(wxCommandEvent &evt)
void GUI_App::on_user_login_handle(wxCommandEvent &evt)
{
if (!m_agent) { return; }
// Tell AppConfig a cloud account is signed in BEFORE asking about stealth: an unfinished setup
// wizard makes get_stealth_mode() report stealth by default, and without this the early return
// below would swallow the whole post-login flow — presets, plugins and the sync prompt — for
// anyone who closed the wizard and signed in afterwards. An explicit Stealth mode setting is
// unaffected and still returns here.
app_config->set_cloud_logged_in(m_agent->is_user_login(ORCA_CLOUD_PROVIDER));
if (app_config->get_stealth_mode()) {
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": stealth mode enabled, skipping cloud connection";
return;
+22 -6
View File
@@ -3402,14 +3402,22 @@ void MainFrame::init_menubar_as_editor()
info_dlg.ShowModal();
return;
}
if (wxGetApp().app_config->get_stealth_mode()) {
MessageDialog info_dlg(this,
_L("Stealth mode is on, so Orca Cloud syncing is switched off. "
"Turn Stealth mode off in Preferences to sync your presets."),
_L("Sync Presets"), wxOK | wxICON_INFORMATION);
info_dlg.ShowModal();
return;
}
if (m_plater)
m_plater->get_notification_manager()->push_notification(
into_u8(_L("Syncing presets from cloud\u2026")));
wxGetApp().restart_sync_user_preset();
}, "", nullptr,
[this]() {
return wxGetApp().is_user_login() && !wxGetApp().app_config->get_stealth_mode();
}, this);
// Stays ENABLED whatever the cloud state: both refusals above name their reason, and a
// greyed-out item names none. A user who could not sync had no way to find out why.
[]() { return true; }, this);
top_menu->AppendSeparator();
append_menu_item(
@@ -3539,14 +3547,22 @@ void MainFrame::init_menubar_as_editor()
info_dlg.ShowModal();
return;
}
if (wxGetApp().app_config->get_stealth_mode()) {
MessageDialog info_dlg(this,
_L("Stealth mode is on, so Orca Cloud syncing is switched off. "
"Turn Stealth mode off in Preferences to sync your presets."),
_L("Sync Presets"), wxOK | wxICON_INFORMATION);
info_dlg.ShowModal();
return;
}
if (m_plater)
m_plater->get_notification_manager()->push_notification(
into_u8(_L("Syncing presets from cloud\u2026")));
wxGetApp().restart_sync_user_preset();
}, "", nullptr,
[this]() {
return wxGetApp().is_user_login() && !wxGetApp().app_config->get_stealth_mode();
}, this);
// Stays ENABLED whatever the cloud state: both refusals above name their reason, and a
// greyed-out item names none. A user who could not sync had no way to find out why.
[]() { return true; }, this);
fileMenu->AppendSeparator();
append_menu_item(