fix(security): don't penalise a correct PIN after a passphrase change
A passphrase change left the PIN vault sealing the old passphrase. The next PIN unlock opened the vault, walletpassphrase answered RPC -14, and the generic catch ran the lockout curve on a correct PIN, while Settings kept showing the PIN as active. - Passphrase change: when the active wallet's vault exists at completion (same vault path as at dispatch, passphrase actually changed), the vault is marked out of date for the session and kept on disk: PIN entry is no longer offered, a warning toast says so, and Settings shows "PIN out of date" with a tooltip on how to fix it. The Change Passphrase dialog notes beforehand that a PIN will go out of date. - PIN unlock: RPC -14 after the vault opened is treated as "PIN out of date": passphrase entry, a message, no attempt counted, no lockout, and the vault is not deleted (-14 is only the daemon's answer; the vault may hold the only copy of a passphrase that opens an older backup). After a restart Settings shows the PIN as active until the first PIN attempt. - A malformed vault (zero-filled by a removeVault() whose unlink failed, truncated, unknown version) is treated as missing: passphrase entry, "PIN file unreadable", no penalty. New SecureVault::isWellFormed(). - Race guards: Set/Change/Remove PIN are disabled while a passphrase change runs, and Change Passphrase while a PIN operation runs. - Setting or removing the PIN, or switching wallets, clears the mark; setting a PIN offers PIN entry again. Change PIN keeps the mark (the vault still seals the same passphrase). - Pure decisions in data/pin_vault_policy.h, unit-tested. New strings in all 8 languages. No vault, wallet or settings format change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -237,6 +237,7 @@
|
||||
"change_pass_confirm": "新しいパスフレーズ(確認):",
|
||||
"change_pass_current": "現在のパスフレーズ:",
|
||||
"change_pass_new": "新しいパスフレーズ:",
|
||||
"change_pass_pin_note": "このウォレットにはクイックアンロック PIN が設定されています。変更後は古くなるため、設定で PIN を削除してから再設定してください。",
|
||||
"change_pass_title": "パスフレーズを変更",
|
||||
"characters": "文字",
|
||||
"chat": "チャット",
|
||||
@@ -1688,10 +1689,13 @@
|
||||
"sec_mode_passphrase": " パスフレーズ",
|
||||
"sec_not_connected_to_daemon": "デーモンに接続されていません",
|
||||
"sec_not_connected_to_daemon_pin": "デーモンに接続されていません",
|
||||
"sec_passphrase_changed_pin_stale": "パスフレーズを変更しました。PIN は古くなりました",
|
||||
"sec_passphrase_changed_successfully": "パスフレーズを変更しました",
|
||||
"sec_pin_changed_successfully": "PINを変更しました",
|
||||
"sec_pin_removed": "PINを削除しました",
|
||||
"sec_pin_set_successfully": "PINを設定しました",
|
||||
"sec_pin_stale_msg": "PIN が古くなっています。パスフレーズを使用してください。",
|
||||
"sec_pin_unreadable": "PIN ファイルが読めません。パスフレーズで解除してください。",
|
||||
"sec_restart_daemon_for_encryption": "暗号化を有効にするには、デーモンを再起動してください。",
|
||||
"sec_too_many_attempts_wait": "試行回数が多すぎます。%.0f秒お待ちください...",
|
||||
"sec_total_elapsed_fmt": "合計経過時間: %d分 %02d秒",
|
||||
@@ -1840,6 +1844,7 @@
|
||||
"settings_open_log_folder": "ログフォルダを開く",
|
||||
"settings_other": "その他",
|
||||
"settings_pin_active": "PIN",
|
||||
"settings_pin_out_of_date": "PIN が古くなっています",
|
||||
"settings_privacy": "プライバシー",
|
||||
"settings_quick_unlock_pin": "クイックアンロック PIN",
|
||||
"settings_reduce_transparency": "透明度を下げる",
|
||||
@@ -2097,6 +2102,7 @@
|
||||
"tt_open_data_dir": "ファイルマネージャーでウォレットとブロックチェーンデータのフォルダを開きます",
|
||||
"tt_open_dir": "クリックしてファイルエクスプローラーで開く",
|
||||
"tt_open_log_folder": "デバッグログとクラッシュログが入ったフォルダを開きます",
|
||||
"tt_pin_out_of_date": "この PIN の設定後にウォレットのパスフレーズが変更されたため、PIN ではウォレットをアンロックできません。PIN を削除して再設定してください。",
|
||||
"tt_reduce_motion": "アクセシビリティのためにアニメーション遷移と残高補間を無効にする",
|
||||
"tt_remove_encrypt": "暗号化を解除してウォレットを保護なしで保存",
|
||||
"tt_remove_pin": "PIN を削除しアンロックにパスフレーズを要求",
|
||||
|
||||
Reference in New Issue
Block a user