用途:列出本仓运行时可注册的 CloudFile HTTP 接口及认证/开关边界。 适用版本:Seafile CE 14.x。 状态:已完成(路由与视图方法已核对,2026-08-11;真实部署联调仍按能力状态执行)。
- 用户接口沿用 Seahub 的
TokenAuthentication与SessionAuthentication;token 使用 Seahub 原生Authorization: Token ...形式,浏览器会话使用 CSRF。 - 管理接口使用
IsAdminUser;普通用户接口使用IsAuthenticated,并由UserRateThrottle限流。 - URL 以部署的 Seahub 根地址和
SITE_ROOT为准;本仓不定义生产域名。 - 功能关闭时能力接口返回 404 或根本不注册。前端隐藏入口不是鉴权依据。
- 表中
{repo_id}为 UUID,{source_id}为整数,{session_id}为 UUID。
| 方法 | 路径 | 认证 | 开关 | 说明 |
|---|---|---|---|---|
| GET | /api/v2.1/cloudfile/features/ |
用户 | 始终注册 | 返回全部开关、provider selected/available 和菜单项 |
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| GET/POST/DELETE | /api/v2.1/cloudfile/repos/{repo_id}/dir-acl/ |
用户 | 查询、新增/更新、删除当前用户有权管理的目录规则 |
| GET | /api/v2.1/cloudfile/repos/{repo_id}/dir-acl/effective/ |
用户 | 解释指定路径/用户的有效权限 |
| GET/POST/DELETE | /api/v2.1/admin/cloudfile/repos/{repo_id}/dir-acl/ |
管理员 | 管理员绕过规则自身的锁出风险管理 ACL |
全部接口由 CF_ENABLE_DIR_ACL 控制。规则主体类型为 user、dept、group;权限为 rw、r、none、invisible,路径由服务端规范化。
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| GET | /api/v2.1/admin/cloudfile/sso/sync/ |
管理员 | 查看 source、上次同步状态与映射摘要 |
| POST | /api/v2.1/admin/cloudfile/sso/sync/ |
管理员 | 触发一次同步 |
| GET/DELETE | /api/v2.1/admin/cloudfile/sso/group-map/ |
管理员 | 列出映射或解除一个受管组映射 |
| POST | /api/v2.1/cloudfile/sso/directory-webhook/ |
共享 secret | 接收目录变更通知并触发同步 |
这些接口由 CF_ENABLE_SSO 控制。Webhook 不使用 Seahub 用户登录,而是按 CF_SERVICE_SSO_DIRECTORY_SECRET 验证;具体 SSO/Authentik 部署说明由跨仓文档维护。
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| GET | /api/v2.1/cloudfile/audit/ |
管理员 | 分页查询 Activity 中的文件/目录事件 |
支持 repo_id、user、op_type、obj_type、page、per_page;per_page 最大 200。op_type 允许 create、edit、delete、rename、move、recover,由 CF_ENABLE_AUDIT 控制。
该接口查询资料库提交差异,不返回预览、读取、下载或分享链接访问事件。
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| GET | /api2/search/ |
用户 | 覆盖上游 Pro gate,继续使用上游请求/响应形状 |
| GET | /api/v2.1/published-repo-search/ |
读者 | 覆盖上游公开库搜索 gate |
由 CF_ENABLE_SEARCH 控制。CF_PROVIDER_SEARCH='' 保持原生 SeaSearch/Elasticsearch;meilisearch 才进入 CloudFile provider。
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| POST | /api/v2.1/monitored-repos/ |
用户 | 复用 CE endpoint 监控一个有权限访问的库 |
| DELETE | /api/v2.1/monitored-repos/{repo_id}/ |
用户 | 取消当前用户的库监控 |
CF_ENABLE_WATCH 只把上游 is_pro_version() gate 扩展为“Pro 或 CloudFile 开关开启”;模型、接口形状和缓存仍由 CE 提供。当前没有 CloudFile 专项测试或通知消费链的本仓验收。
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| GET | /api/v2.1/cloudfile/repos/{repo_id}/file-actions/ |
用户 | 根据真实路径权限、扩展名和锁 provider 返回可用动作 |
| POST | /api/v2.1/cloudfile/edit/v1/open/ |
用户 | 按 {repo_id, path, mode} 签发 scoped JWT,返回 cloudfile-open://v2/open?instance=&session=&ticket= |
| GET | /api/v2.1/cloudfile/edit/v1/lock-info/ |
用户 | 查当前 Checkout 可见性(?repo_id=&path=);只读,不是发布凭据 |
mode 只有三个值,能力由签发方与数据面共同执行:
| mode | 允许的数据面操作 | 前置条件 |
|---|---|---|
local-view |
仅 read |
用户对目标路径可读;只读是硬限制,不因账号可写而放宽 |
optimistic-edit |
read / status / publish(X-CF-Action: optimistic) |
用户可写;不创建 Guard,Checkout 关闭时仍可用 |
exclusive-edit |
checkout / renew / release / publish |
CF_ENABLE_CHECKOUT 开启且 cf_edit_guard 可用,否则 409 |
票据是 HS256 scoped JWT(iss=cloudfile-v2-edit、aud=cloudfile-edit-agent、exp 上限 24 小时(86400 秒)),绑定 repo_id/path/file_id/mode。有效期按一个工作日给:Guard 租约只有 10 分钟且靠 renew 滚动续期,票据却是硬过期,1 小时会让长编辑在 Guard 仍有效时被 401 打断。Hub 的 MAX_TICKET_SECONDS 与 Go fileserver cfEditClaimsFor 的 24 小时上限必须同批发布,改一处而漏另一处会让所有票据被服务端拒绝。Agent 只拿到这枚票据,不接收浏览器 cookie、完整 API token 或 Seafile 登录凭据。数据面在 Go fileserver 的 /seafhttp/cf-edit/v1/*,每次请求重新判定权限并校验原生 file_id;服务端不保存 Session/Intent/Device 表,独占编辑只写 cf_edit_guard 单行,未确认任务留在 Agent 本地 Journal。
已退役且不得按旧契约开发:POST /api/v2.1/cloudfile/repos/{repo_id}/local-sessions/、POST /api/v2.1/cloudfile/agent-sessions/claim/、PATCH .../agent-sessions/{session_id}/heartbeat/、PUT .../agent-sessions/{session_id}/content/。一次性 ticket 换 capability 的通道已删除,调用不会获得服务。
未启用(2026-10-21 决定:不启用,无实际使用):POST/DELETE /api/v2.1/cloudfile/repos/{repo_id}/checkout/、GET/PUT/PATCH/DELETE /api/v2.1/cloudfile/repos/{repo_id}/file-lock/、POST /api/v2.1/admin/cloudfile/repos/{repo_id}/file-lock/force-release/。Hub 侧没有注册这三个前缀,CF_ENABLE_FILE_LOCK 保持关闭,前端 seafile-api.js 的 lockfile/unlockfile 只在开关打开时才会走到该路径,因此维持现状、不补路由也不改调用点。锁与 Checkout 的执行面在 C/Go 侧,独占编辑请走本文上面的 exclusive-edit。
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| GET | /api/v2.1/cloudfile/external-sources/ |
用户 | 列出当前用户可读的外部源 |
| GET | /api/v2.1/cloudfile/external-sources/{source_id}/dir/ |
用户 | 浏览目录,查询参数 p |
| GET | /api/v2.1/cloudfile/external-sources/{source_id}/file/ |
用户 | 查看/下载文件,查询参数 p |
| GET | /api/v2.1/cloudfile/external-sources/search/ |
用户 | 搜索已授权外部源 |
| GET/PUT | /api/v2.1/cloudfile/external-sources/{source_id}/overlay/ |
用户 | 读取/更新路径 metadata/tags overlay |
| GET/POST | /api/v2.1/admin/cloudfile/external-sources/ |
管理员 | 列出/创建 source |
| PUT/DELETE | /api/v2.1/admin/cloudfile/external-sources/{source_id}/ |
管理员 | 更新/删除 source |
| GET/POST/DELETE | /api/v2.1/admin/cloudfile/external-sources/{source_id}/grants/ |
管理员 | 管理 user/group 只读授权 |
由 CF_ENABLE_EXTERNAL_SOURCES 控制。内容路径每次访问都重新做允许根目录、路径穿越和 symlink 逃逸校验。
启用外部源时还会在原生路由之前注册下列 shadow:
/api/v2.1/repos/
/api/v2.1/repos/{repo_id}/
/api/v2.1/repos/{repo_id}/dir/
/api/v2.1/repos/{repo_id}/file/
/api2/repos/{repo_id}/file/
/api2/repos/{repo_id}/file/detail/
合成 repo ID 由 CloudFile 只读处理;真实 repo ID 委派回上游视图。外部源不进入 repo/commit/block 模型,因此不提供写入、历史、WebDAV、同步或 zip 能力。
以下为服务端页面入口,不是稳定的外部 REST 契约:
/cloudfile/acl//cloudfile/audit//cloudfile/external-sources//cloudfile/file-actions/
OnlyOffice 的 onlyoffice/editor-callback/ 保护视图虽然存在于代码中,但当前未由 CloudFileConfig.ready() 注册,不能列为有效 CloudFile API。