From 625df8abe6eae096fd69a604cc3e7a44e33c2feb Mon Sep 17 00:00:00 2001 From: DanS Date: Tue, 14 Jul 2026 11:13:44 -0500 Subject: [PATCH] feat(settings): redesign encrypt & change-passphrase modals onto reference design MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrate the Encrypt Wallet (3-phase) and Change Passphrase dialogs in renderEncryptWalletDialog onto the settings-modal reference design — presentation-only, no change to the crypto/state-machine/secret-wipe logic: - struct-form BeginOverlayDialog(OverlayDialogSpec{BlurFloat, cardWidth, idSuffix}) replacing the legacy positional overload (same visual style, dp-scaled width) - amber TextWrapped warning -> material::DialogWarningHeader(wiz_encrypt_warning) - drop redundant Separator dividers - every hardcoded English string -> TR() (13 new enc_*/change_pass_* keys added to the English source + all 8 res/lang/*.json additively; CJK subset rebuilt) The strength-meter math, 3-phase transitions, "cannot close while encrypting" guard, memset/SecureVault buffer wipes, and the encrypt/changePassphrase/vault async paths are byte-for-byte unchanged. Verified: build + ctest + hygiene clean, wiz_strength %s format-string safe across all languages, and a 3-lens adversarial review (secret-hygiene / presentation-only / ui-i18n) returned zero findings. Co-Authored-By: Claude Opus 4.8 (1M context) --- res/fonts/NotoSansCJK-Subset.ttf | Bin 625524 -> 626528 bytes res/lang/de.json | 13 +++++ res/lang/es.json | 13 +++++ res/lang/fr.json | 13 +++++ res/lang/ja.json | 13 +++++ res/lang/ko.json | 13 +++++ res/lang/pt.json | 13 +++++ res/lang/ru.json | 13 +++++ res/lang/zh.json | 13 +++++ src/app_security.cpp | 80 +++++++++++++++---------------- src/util/i18n.cpp | 14 ++++++ 11 files changed, 157 insertions(+), 41 deletions(-) diff --git a/res/fonts/NotoSansCJK-Subset.ttf b/res/fonts/NotoSansCJK-Subset.ttf index 9455b8d0e21c84c14fcc2bddb1607e845271e4df..1b8c96876470395951034a9c30591a2e4b040b9c 100644 GIT binary patch delta 23376 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 RdKv?yR($)P{fudO{||2!sk8t9 delta 22401 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 cwsRT3Z-3R<{@UE$wU^yXZ@= 8) tier = 1; // Downgrade one tier when only a single character class is used. if (classes <= 1 && tier > 0) tier -= 1; - if (tier == 3) { strengthLabel = "Strong"; strengthCol = ImVec4(0.3f,0.9f,0.5f,1); strengthPct = 1.0f; } - else if (tier == 2) { strengthLabel = "Good"; strengthCol = ImVec4(0.3f,0.9f,0.5f,1); strengthPct = 0.75f; } - else if (tier == 1) { strengthLabel = "Fair"; strengthCol = ImVec4(1,0.7f,0.3f,1); strengthPct = 0.5f; } + if (tier == 3) { strengthLabel = TR("wiz_strength_strong"); strengthCol = ImVec4(0.3f,0.9f,0.5f,1); strengthPct = 1.0f; } + else if (tier == 2) { strengthLabel = TR("wiz_strength_good"); strengthCol = ImVec4(0.3f,0.9f,0.5f,1); strengthPct = 0.75f; } + else if (tier == 1) { strengthLabel = TR("wiz_strength_fair"); strengthCol = ImVec4(1,0.7f,0.3f,1); strengthPct = 0.5f; } float barW = ImGui::GetContentRegionAvail().x; float barH = 4.0f; @@ -1197,7 +1195,7 @@ void App::renderEncryptWalletDialog() { dl->AddRectFilled(p, ImVec2(p.x + barW * strengthPct, p.y + barH), ImGui::ColorConvertFloat4ToU32(strengthCol), 2.0f); ImGui::Dummy(ImVec2(barW, barH)); - ImGui::Text("Strength: %s", strengthLabel); + ImGui::Text(TR("wiz_strength"), strengthLabel); } if (!encrypt_status_.empty()) { @@ -1210,7 +1208,7 @@ void App::renderEncryptWalletDialog() { float btnW = (ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ItemSpacing.x) * 0.5f; ImGui::BeginDisabled(!valid || encrypt_in_progress_); - if (ui::material::TactileButton("Encrypt Wallet", ImVec2(btnW, 40))) { + if (ui::material::TactileButton(TR("settings_encrypt_wallet"), ImVec2(btnW, 40))) { std::string pass(encrypt_pass_buf_); enc_dlg_saved_passphrase_ = pass; memset(encrypt_pass_buf_, 0, sizeof(encrypt_pass_buf_)); @@ -1222,7 +1220,7 @@ void App::renderEncryptWalletDialog() { ImGui::EndDisabled(); ImGui::SameLine(); - if (ui::material::TactileButton("Cancel", ImVec2(btnW, 40))) { + if (ui::material::TactileButton(TR("cancel"), ImVec2(btnW, 40))) { memset(encrypt_pass_buf_, 0, sizeof(encrypt_pass_buf_)); memset(encrypt_confirm_buf_, 0, sizeof(encrypt_confirm_buf_)); show_encrypt_dialog_ = false; @@ -1231,7 +1229,7 @@ void App::renderEncryptWalletDialog() { // ---- Phase 2: Encrypting in progress ---- } else if (encrypt_dialog_phase_ == EncryptDialogPhase::Encrypting) { const char* statusTitle = encrypt_in_progress_ - ? "Encrypting wallet..." : encrypt_status_.c_str(); + ? TR("enc_encrypting") : encrypt_status_.c_str(); ImGui::Text("%s", statusTitle); ImGui::Spacing(); @@ -1258,7 +1256,7 @@ void App::renderEncryptWalletDialog() { } ImGui::Spacing(); - ImGui::TextColored(ImVec4(1,1,1,0.4f), "Please wait, do not close the application."); + ImGui::TextColored(ImVec4(1,1,1,0.4f), "%s", TR("enc_wait")); // Transition to PIN phase when encryption finishes successfully if (!encrypt_in_progress_ && encrypt_dialog_phase_ == EncryptDialogPhase::Encrypting) { @@ -1268,23 +1266,20 @@ void App::renderEncryptWalletDialog() { // ---- Phase 3: PIN setup (after successful encryption) ---- } else if (encrypt_dialog_phase_ == EncryptDialogPhase::PinSetup) { ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.3f, 0.9f, 0.5f, 1)); - ImGui::Text(ICON_MD_CHECK_CIRCLE " Wallet encrypted successfully!"); + ImGui::Text(ICON_MD_CHECK_CIRCLE " %s", TR("enc_success")); ImGui::PopStyleColor(); ImGui::Spacing(); - ImGui::TextWrapped("A 4-8 digit PIN lets you unlock your wallet " - "without typing the full passphrase every time."); - ImGui::Spacing(); - ImGui::Separator(); + ImGui::TextWrapped("%s", TR("enc_pin_desc")); ImGui::Spacing(); - ImGui::Text("PIN (4-8 digits):"); + ImGui::TextUnformatted(TR("wiz_pin_label")); ImGui::PushItemWidth(-1); ImGui::InputText("##enc_dlg_pin", enc_dlg_pin_buf_, sizeof(enc_dlg_pin_buf_), ImGuiInputTextFlags_Password | ImGuiInputTextFlags_CharsDecimal); ImGui::PopItemWidth(); - ImGui::Text("Confirm PIN:"); + ImGui::TextUnformatted(TR("wiz_pin_confirm")); ImGui::PushItemWidth(-1); ImGui::InputText("##enc_dlg_pin_confirm", enc_dlg_pin_confirm_buf_, sizeof(enc_dlg_pin_confirm_buf_), @@ -1304,7 +1299,7 @@ void App::renderEncryptWalletDialog() { float btnW = (ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ItemSpacing.x) * 0.5f; ImGui::BeginDisabled(!pinValid || !hasPassphrase || pin_in_progress_); - if (ui::material::TactileButton("Set PIN", ImVec2(btnW, 40))) { + if (ui::material::TactileButton(TR("settings_set_pin"), ImVec2(btnW, 40))) { pin_in_progress_ = true; enc_dlg_pin_status_.clear(); std::string savedPass = enc_dlg_saved_passphrase_; @@ -1317,7 +1312,7 @@ void App::renderEncryptWalletDialog() { settings_->setPinEnabled(true); settings_->save(); pin_in_progress_ = false; - ui::Notifications::instance().info("PIN set successfully"); + ui::Notifications::instance().info(TR("enc_pin_set_ok")); // Clean up if (!enc_dlg_saved_passphrase_.empty()) { util::SecureVault::secureZero(&enc_dlg_saved_passphrase_[0], @@ -1328,20 +1323,20 @@ void App::renderEncryptWalletDialog() { memset(enc_dlg_pin_confirm_buf_, 0, sizeof(enc_dlg_pin_confirm_buf_)); show_encrypt_dialog_ = false; } else { - enc_dlg_pin_status_ = "Failed to create PIN vault"; + enc_dlg_pin_status_ = TR("enc_pin_vault_fail"); pin_in_progress_ = false; } }; }); } else { - enc_dlg_pin_status_ = "Failed to create PIN vault"; + enc_dlg_pin_status_ = TR("enc_pin_vault_fail"); pin_in_progress_ = false; } } ImGui::EndDisabled(); ImGui::SameLine(); - if (ui::material::TactileButton("Skip", ImVec2(btnW, 40))) { + if (ui::material::TactileButton(TR("wiz_skip"), ImVec2(btnW, 40))) { if (!enc_dlg_saved_passphrase_.empty()) { util::SecureVault::secureZero(&enc_dlg_saved_passphrase_[0], enc_dlg_saved_passphrase_.size()); @@ -1350,8 +1345,7 @@ void App::renderEncryptWalletDialog() { memset(enc_dlg_pin_buf_, 0, sizeof(enc_dlg_pin_buf_)); memset(enc_dlg_pin_confirm_buf_, 0, sizeof(enc_dlg_pin_confirm_buf_)); show_encrypt_dialog_ = false; - ui::Notifications::instance().info( - "PIN skipped. You can set one later in Settings."); + ui::Notifications::instance().info(TR("enc_pin_skipped")); } } EndOverlayDialog(); @@ -1367,21 +1361,25 @@ void App::renderEncryptWalletDialog() { // Change passphrase dialog if (show_change_passphrase_) { - if (BeginOverlayDialog("Change Passphrase", &show_change_passphrase_, 440.0f, 0.94f)) { - - ImGui::Text("Current Passphrase:"); + OverlayDialogSpec ov; + ov.title = TR("change_pass_title"); ov.p_open = &show_change_passphrase_; + ov.style = OverlayStyle::BlurFloat; + ov.cardWidth = 460.0f; ov.idSuffix = "changepass"; + if (BeginOverlayDialog(ov)) { + + ImGui::TextUnformatted(TR("change_pass_current")); ImGui::PushItemWidth(-1); ImGui::InputText("##chg_old", change_old_pass_buf_, sizeof(change_old_pass_buf_), ImGuiInputTextFlags_Password); ImGui::PopItemWidth(); - ImGui::Text("New Passphrase:"); + ImGui::TextUnformatted(TR("change_pass_new")); ImGui::PushItemWidth(-1); ImGui::InputText("##chg_new", change_new_pass_buf_, sizeof(change_new_pass_buf_), ImGuiInputTextFlags_Password); ImGui::PopItemWidth(); - ImGui::Text("Confirm New:"); + ImGui::TextUnformatted(TR("change_pass_confirm")); ImGui::PushItemWidth(-1); ImGui::InputText("##chg_confirm", change_confirm_buf_, sizeof(change_confirm_buf_), ImGuiInputTextFlags_Password); @@ -1396,7 +1394,7 @@ void App::renderEncryptWalletDialog() { strlen(change_new_pass_buf_) >= 8 && strcmp(change_new_pass_buf_, change_confirm_buf_) == 0; ImGui::BeginDisabled(!valid || encrypt_in_progress_); - if (ui::material::TactileButton("Change Passphrase", ImVec2(-1, 40))) { + if (ui::material::TactileButton(TR("change_pass_title"), ImVec2(-1, 40))) { changePassphrase(std::string(change_old_pass_buf_), std::string(change_new_pass_buf_)); } diff --git a/src/util/i18n.cpp b/src/util/i18n.cpp index 93f28a3..79b68bc 100644 --- a/src/util/i18n.cpp +++ b/src/util/i18n.cpp @@ -508,6 +508,20 @@ void I18n::loadBuiltinEnglish() strings_["wiz_encrypt_desc"] = "Encrypt your wallet to protect private keys with a passphrase."; strings_["wiz_encrypt_warning"] = "If you lose your passphrase, you lose access to your funds."; strings_["wiz_passphrase"] = "Passphrase:"; + // --- Encrypt / change-passphrase dialogs (settings) --- + strings_["enc_desc"] = "Encrypting your wallet protects your private keys with a passphrase. After encryption, the daemon will restart."; + strings_["enc_confirm"] = "Confirm:"; + strings_["enc_encrypting"] = "Encrypting wallet..."; + strings_["enc_wait"] = "Please wait, do not close the application."; + strings_["enc_success"] = "Wallet encrypted successfully!"; + strings_["enc_pin_desc"] = "A 4-8 digit PIN lets you unlock your wallet without typing the full passphrase every time."; + strings_["enc_pin_set_ok"] = "PIN set successfully"; + strings_["enc_pin_vault_fail"] = "Failed to create PIN vault"; + strings_["enc_pin_skipped"] = "PIN skipped. You can set one later in Settings."; + strings_["change_pass_title"] = "Change Passphrase"; + strings_["change_pass_current"] = "Current Passphrase:"; + strings_["change_pass_new"] = "New Passphrase:"; + strings_["change_pass_confirm"] = "Confirm New:"; strings_["wiz_confirm"] = "Confirm:"; strings_["wiz_strength_weak"] = "Weak"; strings_["wiz_strength_fair"] = "Fair";