跳到正文

权限系统

涉及文件路径的 Bridge API 会先由 BridgeCore 的路径安全 spec 校验;非法路径直接返回 PERMISSION_DENIED,不会进入文件系统或 foobar2000 SDK 的路径副作用。

权威计数来自当前 src/api/**RegisterApi 路径安全 spec(形态为 { param, SecurityLevel::... }):

级别spec 条数含义
Read9普通文件系统只读校验
Write1严格写入目标(配置/临时目录策略)
MediaRead40媒体上下文只读校验
MediaWrite17媒体上下文写校验
合计6764 个唯一 API

五级权限模型

级别说明校验逻辑
None不涉及文件路径无路径校验
Read只读文件系统操作禁止系统保护目录、设备路径与 .. 遍历
Write严格写入目标仅允许 PathSecurity 接受的配置/临时等写入目标
MediaRead读取媒体元数据/内容Read 规则 + 媒体库/播放列表上下文信任
MediaWrite修改媒体文件MediaRead 规则 + 写黑名单,且无非系统盘自动放行

权限层级关系

None < Read < Write 是普通文件系统通道。 None < Read < MediaRead < MediaWrite 是媒体通道。 WriteMediaWrite 是两条独立写通道。

错误响应

json
{
  "success": false,
  "error": "Path rejected by security policy: C:\\Windows\\System32\\config.ini",
  "code": "PERMISSION_DENIED"
}
javascript
const result = await fb2k.invoke('file.read', { path: somePath });
if (!result.success && result.code === 'PERMISSION_DENIED') {
  console.warn('路径被安全策略拒绝:', result.error);
}

API 权限对照表

Read — 只读文件系统(9 条)

API参数数组嵌套键说明
artwork.getFolderImagesdirectory权威源:ArtworkApi.cpp
clipboard.writeFilespaths权威源:ClipboardApi.cpp
file.copysource权威源:FileApi.cpp
file.existspath权威源:FileApi.cpp
file.getInfopath权威源:FileApi.cpp
file.listpath权威源:FileApi.cpp
file.readpath权威源:FileApi.cpp
shell.openWithpath权威源:ShellApi.cpp
shell.showInExplorerpath权威源:ShellApi.cpp

Write — 严格写入目标(1 条)

API参数数组嵌套键说明
http.downloadsaveTo权威源:HttpApi.cpp

MediaRead — 读取媒体文件(40 条)

API参数数组嵌套键说明
artwork.getAvailableArtworkpath权威源:ArtworkApi.cpp
artwork.getAvailableTypespath权威源:ArtworkApi.cpp
artwork.getBatchpaths权威源:ArtworkApi.cpp
artwork.getByPathpath权威源:ArtworkApi.cpp
artwork.getFb2kUrlByPathpath权威源:ArtworkApi.cpp
artwork.getFb2kUrlByPathBatchpaths权威源:ArtworkApi.cpp
artwork.getFb2kUrlByPathBatchitemspath权威源:ArtworkApi.cpp
artwork.getForTrackpath权威源:ArtworkApi.cpp
artwork.getLyricspath权威源:ArtworkApi.cpp
artwork.getMetadatapath权威源:ArtworkApi.cpp
audio.analyzeBPMpath权威源:AudioApi.cpp
audio.generateFullWaveformpath权威源:AudioApi.cpp
audio.generateWaveformpath权威源:AudioApi.cpp
discovery.executeContextMenuByPathtrackPath权威源:DiscoveryApi.cpp
jitQueue.enqueueNexturl权威源:QueueApi.cpp
jitQueue.playNowurl权威源:QueueApi.cpp
jitQueue.preloadBatchurls权威源:QueueApi.cpp
library.getByPathpath权威源:LibraryApi.cpp
lyrics.existspath权威源:LyricsApi.cpp
lyrics.getpath权威源:LyricsApi.cpp
metadata.readpath权威源:MetadataApi.cpp
metadata.readBatchpaths权威源:MetadataApi.cpp
metadata.readByPathpath权威源:MetadataApi.cpp
metadata.readRawpath权威源:MetadataApi.cpp
playback.playPathpath权威源:PlaybackApi.cpp
playback.playPathspaths权威源:PlaybackApi.cpp
playcount.getpaths权威源:PlaycountApi.cpp
playcount.getBatchpaths权威源:PlaycountApi.cpp
playlist.addPathspaths权威源:PlaylistApi.cpp
playlist.addPathsAsyncpaths权威源:PlaylistApi.cpp
playlist.addPathsSequentialpaths权威源:PlaylistApi.cpp
playlist.replaceAllAndPlaypaths权威源:PlaylistApi.cpp
queue.addPathspaths权威源:QueueApi.cpp
rating.getpath权威源:MetadataApi.cpp
replaygain.getpaths权威源:ReplayGainApi.cpp
replaygain.scanpaths权威源:ReplayGainApi.cpp
titleformat.evalpath权威源:TitleformatApi.cpp
titleformat.evalBatchpaths权威源:TitleformatApi.cpp
titleformat.evalFieldspath权威源:TitleformatApi.cpp
titleformat.evalFieldsBatchpaths权威源:TitleformatApi.cpp

MediaWrite — 修改媒体文件(17 条)

API参数数组嵌套键说明
file.copydestination权威源:FileApi.cpp
file.deletepath权威源:FileApi.cpp
file.mkdirpath权威源:FileApi.cpp
file.movedestination权威源:FileApi.cpp
file.movesource权威源:FileApi.cpp
file.renamepath权威源:FileApi.cpp
file.writepath权威源:FileApi.cpp
lyrics.savepath权威源:LyricsApi.cpp
metadata.embedArtworkpath权威源:MetadataApi.cpp
metadata.removeEmbeddedArtpath权威源:MetadataApi.cpp
metadata.removeFieldpath权威源:MetadataApi.cpp
metadata.removeTagpath权威源:MetadataApi.cpp
metadata.writepath权威源:MetadataApi.cpp
metadata.writeBatchitemspath权威源:MetadataApi.cpp
playcount.setpath权威源:PlaycountApi.cpp
rating.setpath权威源:MetadataApi.cpp
replaygain.clearpaths权威源:ReplayGainApi.cpp

嵌套数组校验

metadata.writeBatchitems 是对象数组,系统会提取每个元素的 path 字段进行校验。

自定义策略 API

API校验方式
shell.exec无命令白名单;可选 cwd 仍走 PathSecurity
shell.spawn无可执行白名单;绝对可执行路径与 cwd 做路径校验
console.log日志目录限制 + 保留设备名过滤 + .log / .txt 扩展名白名单
playlist.insertTracks参数为 playlist handle,不是原始文件路径

路径安全规则详解

通用拦截

  • 设备路径:\\.\...\\?\...
  • 目录遍历:包含 ..
  • 空路径 / 相对路径:必须是绝对路径

Read

系统盘保护目录包括:

保护目录原因
C:\\Windows\\系统文件
C:\\Program Files\\程序文件
C:\\Program Files (x86)\\32 位程序文件
C:\\ProgramData\\系统配置数据

非系统盘在 Read 下通常放行,以支持 NAS / 便携版场景。

Write

仅允许严格写策略接受的目标目录;实践上为 foobar2000 配置目录与系统临时目录。

MediaRead

在 Read 之上,目标还必须能解析到:

  • foobar2000 媒体库,或
  • 任意播放列表中的曲目(扫描上限由运行时实现界定)。

MediaWrite

在 MediaRead 之上:

  • 即使目标出现在媒体库/播放列表中,系统保护目录仍禁止写入
  • 不会因为位于非系统盘就自动放行

统计

权限级别spec 条数该级别唯一 API 数
Read99
Write11
MediaRead4039
MediaWrite1716
合计6764

以上计数由组件源码中的 C++ RegisterApi 路径安全 spec 动态生成。