
anarlog settings 插件权限体系全解析从 reference.md 到 Tauri 命令级 ACL 的完整指南【免费下载链接】anarlogOpen source Granola AI Alternative项目地址: https://gitcode.com/GitHub_Trending/hy/anarlog导读anarlog开源 Granola AI 替代方案桌面端的设置功能被封装为独立的 Tauri 插件tauri-plugin-settings而本文讲解的 reference.md 正是该插件权限体系的权威参考文档它定义了settings插件对外暴露的 10 个 IPC 命令各自对应的 allow/deny 权限标识符以及插件默认启用的权限集合。读完本文你将掌握 settings 插件的每一个权限标识符对应哪个命令、默认权限集包含什么、如何在应用级权限配置中覆写默认行为以及这些权限在命令实现与底层存储层的实际语义。settings 插件权限文档的定位与结构文档在仓库中的位置权限参考文档位于插件目录的permissions/autogenerated/下与仓库内其余 46 个插件如 transcription、tray 等采用同一套自动生成规范。该目录下同时存放着与文档一一对应的命令级权限源文件plugins/settings/permissions/ ├── autogenerated/ │ ├── commands/ # 每个命令一个 TOML定义 allow/deny 权限 │ ├── reference.md # 本文讲解的权限总览文档自动生成 ├── schemas/schema.json # 权限文件的 JSON Schema 校验规范 ├── default.toml # 插件默认权限集文档结构分两部分Default Permission默认权限集即插件安装后自动授予的权限列表与Permission Table全部 20 个权限标识符的完整表格。这正是 Tauri 插件权限体系的标准形态allow-*与deny-*成对出现分别用于启用命令与禁用命令。文档由谁生成、为何可信从 copy_vault.toml 首行的# Automatically generated - DO NOT EDIT!可以看出这些权限文件与 reference.md 均出自自动生成流程源头是 lib.rs 中通过tauri_specta::collect_commands!收集的命令清单。这意味着权限文档中列出的标识符与命令实现是一一对应的、可验证的不会出现文档与代码脱节的情况。默认权限集settings 插件开箱即用的能力边界默认权限包含什么default.toml 是默认权限集的权威来源其内容与文档Default Permission一节完全一致[default] description Default permissions for the plugin permissions [ allow-global-base, allow-vault-base, allow-copy-vault, allow-move-vault, allow-set-vault-base, allow-is-empty-or-missing-dir, allow-obsidian-vaults, allow-path, allow-load, allow-save, ]这 10 个allow-*权限意味着只要应用注册了tauri-plugin-settings插件前端即可无需额外配置调用global_base、vault_base、copy_vault、move_vault、set_vault_base、is_empty_or_missing_dir、obsidian_vaults、path、load、save共 10 个命令。默认全量放行是设置类插件的合理设计——设置读写与 vault 迁移是应用基础功能不应让用户陷入繁琐的权限配置。默认权限集的 schema 约束schema.json 中DefaultPermission的定义约束了[default]表的结构必填permissions数组可选description与version整数最小值为 1。若自定义权限集需要版本管理可在此声明。该 schema 同时定义了更通用的Permission结构见下节供在应用中内联扩展权限时使用。权限表逐项解读20 个标识符与 10 个命令的映射reference.md的 Permission Table 列出了 20 个标识符10 个命令 × allow/deny 各一全部遵循 Tauri 命名规范settings:前缀 allow-/deny- 命令名。下面按命令分组结合 commands.rs 的实现逐一说明其语义。设置与 vault 路径查询类标识符对应命令语义settings:allow-global-base/settings:deny-global-baseglobal_base启用/禁用查询全局设置基目录settings:allow-vault-base/settings:deny-vault-basevault_base启用/禁用查询当前 vault 基目录settings:allow-path/settings:deny-pathpath启用/禁用查询 settings.json 完整路径这三个命令对应源码中 commands.rs 的global_base、vault_base、settings_pathglobal_base返回应用数据目录中的全局配置根路径底层由 ext.rs 根据应用identifier通过anlg_storage::global::compute_default_base计算并自动create_dir_all创建vault_base从StartupSnapshot状态中读取启动时解析出的 vault 基目录pathTOML 源文件中命令名为path实现函数名为settings_path返回vault_base/settings.json的完整路径。vault 迁移类标识符对应命令语义settings:allow-copy-vault/settings:deny-copy-vaultcopy_vault启用/禁用复制 vault 到新路径settings:allow-move-vault/settings:deny-move-vaultmove_vault启用/禁用迁移 vault 到新路径settings:allow-set-vault-base/settings:deny-set-vault-baseset_vault_base启用/禁用将新路径持久化为 vault 基目录这是 settings 插件最具业务价值的一组命令实现集中在 ext.rscopy_vault(new_path)先做原地复制调用validate_vault_base_change校验新旧路径关系再ensure_vault_dir确保目标存在最后异步复制全部 vault 内容到新位置不修改配置指向move_vault(new_path)三步走——复制内容到新位置 → 通过set_vault_base持久化新路径 → 尽力清理旧位置数据remove_vault_items失败仅忽略因为数据已安全拷贝。注意移动前要求目标目录为空或不存在否则返回VaultBaseIsNotEmpty错误set_vault_base(new_path)调用 path.rs 的persist_vault_path把vault_path键写入全局配置。若新路径等于默认基目录则清除该覆盖键否则写入新值。写入使用原子写保证配置完整性。底层校验逻辑在 path.rs 的validate_vault_base_change拒绝相对路径PathNotAbsolute、拒绝新路径是旧路径的子目录VaultBaseIsSubdirectory或父目录VaultBaseIsParent防止造成数据循环或越权访问同时vault-backup这类相似前缀目录则被允许有对应测试用例佐证。辅助与读写类标识符对应命令语义settings:allow-is-empty-or-missing-dir/settings:deny-is-empty-or-missing-diris_empty_or_missing_dir启用/禁用目录为空或不存在检查settings:allow-obsidian-vaults/settings:deny-obsidian-vaultsobsidian_vaults启用/禁用枚举本机 Obsidian vault 列表settings:allow-load/settings:deny-loadload启用/禁用读取设置 JSONsettings:allow-save/settings:deny-savesave启用/禁用写入设置 JSONis_empty_or_missing_dir(path)封装anlg_storage::vault::fs::is_empty_or_missing_dir供前端在迁移 vault 前做目标目录预检obsidian_vaults()通过anlg_storage::obsidian::list_vaults返回VecObsidianVault该类型经 lib.rs 公开导出用于引导用户选择已有 Obsidian vault 作为设置目录load()/save(settings)核心设置读写。load支持旧版配置回退见下节save采用读取现有 → 浅合并 → 原子写回策略。权限背后的实现load/save 与 vault 解析的底层原理load 的旧配置回退机制state.rs 的load_with_legacy_fallback实现了一套优雅的兼容策略优先读取自定义 vault 下的settings.json存在即返回若自定义 vault 无配置则回退读取全局基目录下的旧版settings.json且仅当其为非空对象时才采用is_non_empty_object判断显式写入空对象{}的自定义 vault 会压过全局旧配置代表用户主动清空设置有测试用例load_preserves_an_explicit_custom_vault_reset验证。历史字段名自动迁移normalize_legacy_namesstate.rs会在 load/save 时把旧版hyprnote命名的 AI provider 字段自动改写为anarlogfor key in [current_llm_provider, current_stt_provider] { if ai.get(key).and_then(serde_json::Value::as_str) Some(hyprnote) { ai.insert(key.to_string(), serde_json::Value::String(anarlog.to_string())); } }对应测试save_migrates_legacy_provider_names验证了hyprnote → anarlog的完整迁移链路。save 的合并语义merge_settingsstate.rs对两个 JSON 对象做顶层浅合并以现有配置为基底新值按 key 覆盖任一非对象值直接整体替换。save全程持有io_lock写锁并经由anlg_storage::fs::atomic_write_async原子落盘避免并发读写产生半写文件。vault 基目录的解析优先级resolve_startup_vault_baseext.rs在插件 setup 阶段解析一次并存入StartupSnapshot。解析优先级在 path.rs 的resolve_custom中定义环境变量CHAR_VAULT_BASE支持~/、$VAR、DEFAULT占位符展开DEFAULT指代默认基目录全局配置文件中持久化的vault_path键均不存在则回退默认基目录。测试用例env_var_takes_precedence、reads_from_vault_config证实了该优先级顺序。如何在实际应用中使用这些权限方式一直接依赖插件默认权限注册tauri-plugin-settings后无需任何权限配置10 个命令全部可用。对大多数桌面应用而言这是推荐做法——settings 命令本身只暴露路径查询、vault 迁移与设置读写风险面可控。方式二应用级覆写与收紧在应用自身的capabilities/*.json或权限配置中可通过deny-*权限收紧暴露面例如禁止前端调用move_vault{ identifier: default, windows: [main], permissions: [ settings:default, settings:deny-move-vault, settings:deny-copy-vault ] }schema.json中Commands的定义schema.json明确了一条规则同一命令同时出现在 allow 与 deny 中时deny 优先。因此只需追加deny-*即可安全收紧无需移除默认权限。方式三自定义权限集与内联权限若需要更细粒度的组合可在插件权限配置中使用set定义命名权限集、或用permission内联定义含commands.allow/commands.deny、scope、platforms字段。platforms支持macOS、windows、linux、android、iOS枚举见 schema.json可实现平台差异化授权。前端调用示例权限放行后前端可通过tauri-apps/api/core直接调用以global_base与save为例import { invoke } from tauri-apps/api/core; // 查询全局基目录 const globalBase: string await invoke(plugin:settings|global_base); // 读取设置 const settings await invoke(plugin:settings|load); // 写入设置顶层浅合并后原子落盘 await invoke(plugin:settings|save, { settings: { ai: { current_llm_provider: anarlog } } });插件注册后lib.rs 的init会在 setup 阶段解析启动 vault 基目录、挂载StartupSnapshot状态并注册全部命令前端即可立即调用。相关文件索引用途仓库路径权限总览文档本文主题plugins/settings/permissions/autogenerated/reference.md默认权限集plugins/settings/permissions/default.toml权限文件 JSON Schemaplugins/settings/permissions/schemas/schema.json命令级权限源文件plugins/settings/permissions/autogenerated/commands/命令实现plugins/settings/src/commands.rs业务逻辑与插件扩展plugins/settings/src/ext.rs设置读写与状态管理plugins/settings/src/state.rs插件入口与命令注册plugins/settings/src/lib.rsvault 路径解析与持久化crates/storage/src/vault/path.rs前端类型绑定plugins/settings/js/bindings.gen.ts【免费下载链接】anarlogOpen source Granola AI Alternative项目地址: https://gitcode.com/GitHub_Trending/hy/anarlog创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考