fix: show sensitive config fields as empty with placeholder, skip masked values on save

This commit is contained in:
2026-05-14 17:07:39 +08:00
parent 69efff3cb4
commit 809cc5fd81
+27 -2
View File
@@ -39,13 +39,22 @@
v-for="(value, key) in config[activeTab]" v-for="(value, key) in config[activeTab]"
:key="key" :key="key"
class="field-row" class="field-row"
:class="{ edited: edited[activeTab]?.[key] !== undefined && edited[activeTab][key] !== value }" :class="{ edited: isEdited(activeTab, key, value) }"
> >
<label class="field-label"> <label class="field-label">
{{ key }} {{ key }}
<span v-if="edited[activeTab]?.[key] !== undefined && edited[activeTab][key] !== value" class="edited-dot"></span> <span v-if="isEdited(activeTab, key, value)" class="edited-dot"></span>
</label> </label>
<el-input <el-input
v-if="isSensitive(key)"
:model-value="edited[activeTab]?.[key] ?? ''"
@update:model-value="setEditedValue(activeTab, key, $event)"
placeholder="已设置,留空保持不变"
size="small"
show-password
/>
<el-input
v-else
:model-value="getEditedValue(activeTab, key, value)" :model-value="getEditedValue(activeTab, key, value)"
@update:model-value="setEditedValue(activeTab, key, $event)" @update:model-value="setEditedValue(activeTab, key, $event)"
size="small" size="small"
@@ -80,6 +89,18 @@ const sectionLabels: Record<string, string> = {
WebAuth: 'Web 认证', WebAuth: 'Web 认证',
} }
const SENSITIVE_KEYS = new Set(['api_key', 'secret_key', 'token', 'password', 'api_secret', 'access_key'])
function isSensitive(key: string): boolean {
return SENSITIVE_KEYS.has(key.toLowerCase())
}
function isEdited(section: string, key: string, original: string): boolean {
const val = edited[section]?.[key]
if (val === undefined) return false
if (isSensitive(key)) return val !== ''
return val !== original
async function loadConfig() { async function loadConfig() {
loading.value = true loading.value = true
try { try {
@@ -109,6 +130,10 @@ async function saveAll() {
const updates: { section: string; key: string; value: string }[] = [] const updates: { section: string; key: string; value: string }[] = []
for (const [section, keys] of Object.entries(edited)) { for (const [section, keys] of Object.entries(edited)) {
for (const [key, value] of Object.entries(keys)) { for (const [key, value] of Object.entries(keys)) {
// Skip empty sensitive fields (user left placeholder unchanged)
if (isSensitive(key) && !value) continue
// Skip masked values that somehow got through
if (isSensitive(key) && value.includes('*')) continue
updates.push({ section, key, value }) updates.push({ section, key, value })
} }
} }