feat(ui): 安全增强 — 修改密码 / 自动锁定 / HOTP 提示 / 配置备份
- 修改密码对话框引入旧密码校验:通过 store.VerifyPassword 走 constant-time 比较,对话框自身不持有 live passphrase 副本。 - 配置加密且 auto_lock_minutes>0 时启用自动锁定;明文配置不受影响。 锁定时刻意保留 store.passphrase,避免解锁瞬间出现保存竞态——进程内存 无论如何都是威胁边界。 - HOTP 点击后 toast 仅显示推进后的计数器值,绝不携带验证码字符串。 - SaveYAML 每次写入前将旧文件轮转为 .bak(0o600),防止加密/序列化失败 导致用户无可恢复副本。 - Preferences 对话框新增"自动锁定(分钟)"输入项。
This commit is contained in:
@@ -15,6 +15,7 @@ type settingsAction int
|
||||
const (
|
||||
settingsActionNone settingsAction = iota
|
||||
settingsActionSetPassword
|
||||
settingsActionChangePassword
|
||||
settingsActionImportLegacy
|
||||
settingsActionPreferences
|
||||
settingsActionAbout
|
||||
@@ -23,11 +24,12 @@ const (
|
||||
// settingsMenu is the small popup that opens when the user clicks the
|
||||
// gear button in the main window's top bar.
|
||||
type settingsMenu struct {
|
||||
setPwBtn widget.Clickable
|
||||
importBtn widget.Clickable
|
||||
prefsBtn widget.Clickable
|
||||
aboutBtn widget.Clickable
|
||||
cancelBtn widget.Clickable
|
||||
setPwBtn widget.Clickable
|
||||
changePwBtn widget.Clickable
|
||||
importBtn widget.Clickable
|
||||
prefsBtn widget.Clickable
|
||||
aboutBtn widget.Clickable
|
||||
cancelBtn widget.Clickable
|
||||
}
|
||||
|
||||
func newSettingsMenu() *settingsMenu { return &settingsMenu{} }
|
||||
@@ -37,6 +39,8 @@ func (m *settingsMenu) Pick(gtx layout.Context) (settingsAction, bool) {
|
||||
switch {
|
||||
case m.setPwBtn.Clicked(gtx):
|
||||
return settingsActionSetPassword, true
|
||||
case m.changePwBtn.Clicked(gtx):
|
||||
return settingsActionChangePassword, true
|
||||
case m.importBtn.Clicked(gtx):
|
||||
return settingsActionImportLegacy, true
|
||||
case m.prefsBtn.Clicked(gtx):
|
||||
@@ -75,6 +79,7 @@ func (m *settingsMenu) Layout(gtx layout.Context, th *material.Theme) layout.Dim
|
||||
layout.Rigid(material.H6(th, i18n.T("menu_settings")).Layout),
|
||||
layout.Rigid(layout.Spacer{Height: unit.Dp(12)}.Layout),
|
||||
row(&m.setPwBtn, i18n.T("menu_set_password")),
|
||||
row(&m.changePwBtn, i18n.T("menu_change_password")),
|
||||
row(&m.importBtn, i18n.T("menu_import_legacy")),
|
||||
row(&m.prefsBtn, i18n.T("menu_preferences")),
|
||||
row(&m.aboutBtn, i18n.T("menu_about")),
|
||||
|
||||
Reference in New Issue
Block a user