Files
HomeAgent/cmd/gui/preload.js
JianFeeeee ba5785036a feat: 设备鉴权迁移至客户端 + 插件卸载保护
安全修复(客户端鉴权):
- remotedevice 服务端移除授权状态存储(authorized map/SetAuthorized/handleDeviceAuth)
- DeviceMeta.Authorized 改为设备 hello 自报,服务端仅透传展示
- device_ctl_* 工具移除服务端授权检查,无条件转发,设备端自行决定是否执行
- 共享设备桥库 Bridge 新增本地 authorized 状态,未授权收到 cmd 直接拒绝
- waiter: --device-authorized / device_authorized 配置控制本地授权
- GUI: 授权存 gui-prefs 本地文件;设备页仅本机可切换开关
- webui /device/auth 旧路径返回 410 Gone
- 根因:agent 可经 config_set 篡改服务端授权配置自行授权设备

插件管理强化:
- 内置插件禁止卸载(IsBuiltinPlugin + 409),外部插件卸载即时生效
- 卸载不存在插件返回 404;移除误导性 reload_required 提示
- webui 插件路由:名称白名单校验防路径穿越、保留字路径保护
2026-08-24 19:26:11 +08:00

57 lines
1.9 KiB
JavaScript

const { contextBridge, ipcRenderer } = require("electron");
contextBridge.exposeInMainWorld("homeagent", {
win: {
minimize: () => ipcRenderer.invoke("window:minimize"),
toggleMaximize: () => ipcRenderer.invoke("window:toggleMaximize"),
close: () => ipcRenderer.invoke("window:close"),
},
connections: {
list: () => ipcRenderer.invoke("connections:list"),
add: (conn) => ipcRenderer.invoke("connections:add", conn),
update: (id, updates) =>
ipcRenderer.invoke("connections:update", { id, updates }),
delete: (id) => ipcRenderer.invoke("connections:delete", id),
setCurrent: (id) => ipcRenderer.invoke("connections:setCurrent", id),
},
cli: {
request: (socketPath, apiKey, line) =>
ipcRenderer.invoke("cli:request", { socketPath, apiKey, line }),
},
webui: {
setAuth: (url, cookie, headers, username, password) =>
ipcRenderer.invoke("webui:setAuth", {
url,
cookie,
headers,
username,
password,
}),
openLogin: (url, username, password) =>
ipcRenderer.invoke("webui:openLogin", { url, username, password }),
onLoginResult: (cb) =>
ipcRenderer.on("webui:login-result", (_e, d) => cb(d)),
},
cacheBg: (src) => ipcRenderer.invoke("bg:cache", { src }),
log: (m) => ipcRenderer.invoke("log:r", m),
prefs: {
get: () => ipcRenderer.invoke("prefs:get"),
set: (p) => ipcRenderer.invoke("prefs:set", p),
},
device: {
identity: () => ipcRenderer.invoke("device:identity"),
},
deviceBridge: {
get: () => ipcRenderer.invoke("device-bridge:get"),
set: (cfg) => ipcRenderer.invoke("device-bridge:set", cfg),
setAuthorized: (auth) =>
ipcRenderer.invoke("device-bridge:setAuthorized", auth),
},
displays: {
list: () => ipcRenderer.invoke("displays:list"),
},
audio: {
list: () => ipcRenderer.invoke("audio:list"),
},
});