From 141e84691844b0f7ff86c6578341d04ceae57892 Mon Sep 17 00:00:00 2001 From: smail Date: Mon, 7 Sep 2026 11:42:59 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E9=AA=8C=E8=AF=81=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E7=AD=96=E7=95=A5=E5=88=86=E7=BB=84=E5=B9=B6=E5=B0=86?= =?UTF-8?q?=E4=B8=AD=E7=BB=A7=E5=AF=86=E7=A0=81=E5=90=88=E5=B9=B6=E5=85=A5?= =?UTF-8?q?=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConfigSettings/ConfigField/ConfigField.vue | 4 +++- .../ConfigSettings/ConfigForm/ConfigForm.js | 7 ++----- .../components/ConfigSettings/ConfigSettings.js | 14 +++++++++----- test/frontend/config-form.test.mjs | 5 ++--- test/frontend/config-settings.test.mjs | 4 ++-- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/frontend/src/views/components/ConfigSettings/ConfigField/ConfigField.vue b/frontend/src/views/components/ConfigSettings/ConfigField/ConfigField.vue index 33779379..e66627a5 100644 --- a/frontend/src/views/components/ConfigSettings/ConfigField/ConfigField.vue +++ b/frontend/src/views/components/ConfigSettings/ConfigField/ConfigField.vue @@ -121,7 +121,9 @@ :placeholder="field.placeholder || '填写内容'" :aria-describedby="descriptionId" :aria-invalid="!!error" - autocomplete="off" + :type="field.type === 'password' ? 'password' : 'text'" + :show-password="field.type === 'password'" + :autocomplete="field.type === 'password' ? 'new-password' : 'off'" @update:model-value="update" /> secretField.value ? '密码不会回填,修改请使用下方独立输入框,留空保持原值' : '') @@ -524,6 +521,12 @@ export function usePage(pageKey = 'base') { } if (selectedSection.value === 'smtp') { delete payload.relayPasswordStatus + if (payload.relay && 'password' in payload.relay) { + delete payload.relay.password + if (Object.keys(payload.relay).length === 0) { + delete payload.relay + } + } } if (apiSection() === 'plugins' && payload.plugins && typeof payload.plugins === 'object') { Object.values(payload.plugins).forEach(plugin => { @@ -545,8 +548,9 @@ export function usePage(pageKey = 'base') { if (value && selectedSection.value === 'base' && secretField.value) { secretChanges['database.password'] = { operation: 'replace', value: { plaintext: value } } } - if (value && selectedSection.value === 'smtp') { - secretChanges['relay.password'] = { operation: 'replace', value: { plaintext: value } } + const relayPassword = formConfig.value?.relay?.password + if (relayPassword && selectedSection.value === 'smtp') { + secretChanges['relay.password'] = { operation: 'replace', value: { plaintext: relayPassword } } } return { expectedGeneration: Number(status.activeGeneration), diff --git a/test/frontend/config-form.test.mjs b/test/frontend/config-form.test.mjs index 3a12df7b..7458e810 100644 --- a/test/frontend/config-form.test.mjs +++ b/test/frontend/config-form.test.mjs @@ -40,7 +40,7 @@ test('七个页面使用分组表单,控件和样式能编译且不再提供 J const keys = groups.flatMap(group => group.fields.map(field => field.path.join('.'))) assert.equal(keys.length, new Set(keys).size) assert.ok(groups.every(group => /[\u4e00-\u9fff]/.test(group.title))) - assert.ok(!keys.some(key => /generation|password|encryptionKey|capabilities/.test(key))) + assert.ok(!keys.some(key => /generation|database\.password|encryptionKey|capabilities/.test(key))) } }) @@ -320,8 +320,7 @@ test('加密配置校验拦截监听冲突、远程明文和已启用但未选 for (const relayHost of ['smtp.example.com', '127.0.0.999', '127.1', '127.0.0.1.evil.com', '192.168.1.1']) { assert.ok(validateFormConfig('smtp', { relay: { relayHost, security: 'plain', relayPort: 25 } })['relay.relayHost']) } - const errors = validateFormConfig('smtp', { relay: { verificationEnabled: true, relayHost: 'smtp.example.com', relayPort: 0 } }) - assert.ok(errors['relay.security']) + const errors = validateFormConfig('smtp', { relay: { relayHost: 'smtp.example.com', security: 'starttls', relayPort: 0 } }) assert.ok(errors['relay.relayPort']) assert.deepEqual(validateFormConfig('smtp', { relay: {} }), {}) assert.deepEqual(validateFormConfig('smtp', { relay: { security: 'starttls', relayPort: 2525, relayHost: 'smtp.example.com' } }), {}) diff --git a/test/frontend/config-settings.test.mjs b/test/frontend/config-settings.test.mjs index 3959b128..3d0c4493 100644 --- a/test/frontend/config-settings.test.mjs +++ b/test/frontend/config-settings.test.mjs @@ -512,7 +512,7 @@ test('独立页保持验证、保存、应用端点和代次协议,敏感值 } }) await page.loadAll() - page.secretValue.value = 'test-only-value' + page.updateField(['relay', 'password'], 'test-only-value') page.confirmed.value = true await page.validateConfig() await page.saveConfig() @@ -618,7 +618,7 @@ test('SQLite 不显示或发送密码,网络数据库和中继密码留空保 http: { post: async (path, body) => { request = body; return { errorNo: 0, data: { valid: true } } } } }) await page.loadSection() - page.updateSecret(' smtp-test-only ') + page.updateField(['relay', 'password'], ' smtp-test-only ') await page.validateConfig() assert.equal(request.secretChanges['relay.password'].value.plaintext, ' smtp-test-only ') })