新增: ScriptNode 白名单跨 crate 配置打通(IPC+OnceLock) - 新增 set_script_safety / get_script_safety IPC - ScriptNode.check_command_policy 优先读运行时配置 - 前端设置页保存时同步注入后端运行时 - 核验确认小程序心跳/文件树刷新/项目分页三项已就绪

This commit is contained in:
2026-07-01 12:38:21 +08:00
parent 535525c2f6
commit 2af24f0db8
5 changed files with 114 additions and 27 deletions

View File

@@ -79,7 +79,8 @@
import { ref, onMounted } from 'vue'
import { open } from '@tauri-apps/plugin-dialog'
import { useI18n } from 'vue-i18n'
import { aiApi } from '@/api'
import { invoke } from '@tauri-apps/api/core'
import { aiApi, settingsApi } from '@/api'
import { useAppSettingsStore } from '@/stores/appSettings'
import SettingRow from './SettingRow.vue'
@@ -177,21 +178,36 @@ async function reload() {
// ScriptNode 命令执行安全 — 白/黑名单 UI
// ------------------------------------------------------------
// 前端持久化到 appSettings KV 表(df-script-whitelist / df-script-blacklist)。
// 后端 ScriptNode 从环境变量 DF_SCRIPT_WHITELIST / DF_SCRIPT_BLACKLIST 读取(同语义逗号分隔)。
// 前后端打通需跨 crate 接口变更(script_node.execute 接受参数注入),当前标注为已知限制
// 临时方案:启动时用脚本注入环境变量(export DF_SCRIPT_WHITELIST=...)。
// 后端 ScriptNode 通过 set_script_safety IPC 注入运行时白/黑名单(即时生效)。
// 本组件同时持久化到前端 KV(localStorage)和后端(app_settings 表+ OnceLock 全局态)
// ============================================================
const scriptWhitelist = ref(appSettings.get<string>('df-script-whitelist', ''))
const scriptBlacklist = ref(appSettings.get<string>('df-script-blacklist', ''))
async function syncScriptSafety() {
try {
await settingsApi.set('df-script-whitelist', scriptWhitelist.value.trim())
await settingsApi.set('df-script-blacklist', scriptBlacklist.value.trim())
// 走新的 set_script_safety IPC 同时持久化 + 注入运行时(一次调用完成两件事)
await invoke('set_script_safety', {
whitelist: scriptWhitelist.value.trim(),
blacklist: scriptBlacklist.value.trim(),
})
emit('toast', t('settings.savedHint'), 'info')
} catch (e) {
console.error('[SCRIPT-SAFETY] 同步后端失败:', e)
emit('toast', t('settings.toastSaveFail', { msg: String(e) }), 'error')
}
}
function onScriptWhitelistCommit() {
appSettings.set('df-script-whitelist', scriptWhitelist.value.trim())
emit('toast', t('settings.savedHint'), 'info')
syncScriptSafety()
}
function onScriptBlacklistCommit() {
appSettings.set('df-script-blacklist', scriptBlacklist.value.trim())
emit('toast', t('settings.savedHint'), 'info')
syncScriptSafety()
}
onMounted(load)