fix(ui): Admin password change didn't update the saved login copy

Same fix as hotfix/admin-login-timeout (05609019). Tools > Admin >
System > "Admin password" changes the remote's admin credential but
never updated this device's saved copy, so the next login retried the
password just replaced -- likely the actual trigger behind the
"stuck on Logging in..." report. Parses CommonCLI's "password now: <v>"
success echo and saves that as the new on-device password.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-07-24 18:13:33 +02:00
parent 220d46de8e
commit 0ab74bdd41
2 changed files with 18 additions and 0 deletions

View File

@@ -410,6 +410,23 @@ public:
openValueKb(trimmed); // _pending_set_prefix is already set from activateField()
return;
}
// The "Admin password" row (SYSTEM_FIELDS, set-only) just changed the
// remote's own admin credential -- CommonCLI::handleCommand() always
// echoes it back as "password now: <value>" (see src/helpers/CommonCLI.cpp),
// truncation and all, so parsing that confirms the exact value now
// required to log back in. Without this, our saved password goes stale
// the instant this command succeeds, guaranteeing the next login attempt
// fails (see the LOGIN-phase timeout fix above for what that used to look
// like: a permanent "Logging in..." hang with a stale saved password).
static const char PW_ECHO_PREFIX[] = "password now: ";
if (!strncmp(text, PW_ECHO_PREFIX, sizeof(PW_ECHO_PREFIX) - 1)) {
char newpw[32];
strncpy(newpw, text + sizeof(PW_ECHO_PREFIX) - 1, sizeof(newpw) - 1);
newpw[sizeof(newpw) - 1] = '\0';
size_t n = strlen(newpw);
while (n > 0 && (newpw[n-1] == '\n' || newpw[n-1] == '\r' || newpw[n-1] == ' ')) newpw[--n] = '\0';
the_mesh.saveRoomPassword(_target.id.pub_key, newpw);
}
strncpy(_reply_text, text, sizeof(_reply_text) - 1);
_reply_text[sizeof(_reply_text) - 1] = '\0';
_reply_view.begin();