Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build/seafile_14.0/package_provenance.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
COMMIT_RE = re.compile(r"^[0-9a-f]{40}$")
REQUIRED_FILES = (
"seafile/bin/seaf-server", "seafile/bin/fileserver", "seafile/bin/seaf-fuse",
"seafile/lib/libcloudfile_acl.so.1", "seahub/cloudfile_extensions/apps.py",
"seahub/cloudfile_extensions/apps.py",
"seahub/thirdpart/bin/gunicorn",
)

Expand Down
26 changes: 0 additions & 26 deletions deploy/compose/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -208,21 +208,8 @@ services:
JWT_PRIVATE_KEY: ${JWT_PRIVATE_KEY:-}
CF_LOCK_BACKEND: ${CF_LOCK_BACKEND:-cloudfile}
CF_ENABLE_CHECKOUT: ${CF_ENABLE_CHECKOUT:-false}
CLOUDFILE_OIDC_ENABLED: ${CLOUDFILE_OIDC_ENABLED:-false}
CLOUDFILE_OIDC_JIT_ENABLED: ${CLOUDFILE_OIDC_JIT_ENABLED:-false}
CLOUDFILE_OIDC_CONFIG_JSON: ${CLOUDFILE_OIDC_CONFIG_JSON:-}
CLOUDFILE_POLICY_CONFIG_JSON: ${CLOUDFILE_POLICY_CONFIG_JSON:-}
# Keep explicit policy/transfer settings effective on both app and worker.
CLOUDFILE_AUTHORIZATION_ENABLED: ${CLOUDFILE_AUTHORIZATION_ENABLED:-false}
CLOUDFILE_TRANSFER_ENABLED: ${CLOUDFILE_TRANSFER_ENABLED:-false}
CLOUDFILE_POLICY_WORKER_HOOKS: ${CLOUDFILE_POLICY_WORKER_HOOKS:-false}
CLOUDFILE_LOCAL_EDIT_ENABLED: ${CLOUDFILE_LOCAL_EDIT_ENABLED:-false}
# Native administrator policy is initialized automatically from existing SQL settings.
CLOUDFILE_LOCAL_EDIT_INSTANCE: ${CLOUDFILE_LOCAL_EDIT_INSTANCE:-}
CLOUDFILE_AGENT2_OPTIMISTIC_UPLOAD_ENABLED: ${CLOUDFILE_AGENT2_OPTIMISTIC_UPLOAD_ENABLED:-false}
CLOUDFILE_AGENT2_EXCLUSIVE_ENABLED: ${CLOUDFILE_AGENT2_EXCLUSIVE_ENABLED:-false}
CLOUDFILE_EDITING_ENABLED: ${CLOUDFILE_EDITING_ENABLED:-false}
CLOUDFILE_RESOURCE_SECRET: ${CLOUDFILE_RESOURCE_SECRET:-}
CF_ENABLE_LOCAL_APP: ${CF_ENABLE_LOCAL_APP:-false}
CF_LIBRARY_STORAGE: ${CF_LIBRARY_STORAGE:-}
CF_ENABLE_S3_STORAGE: ${CF_ENABLE_S3_STORAGE:-false}
Expand Down Expand Up @@ -471,21 +458,8 @@ services:
CF_ENABLE_CONVERT_EXPORT: ${CF_ENABLE_CONVERT_EXPORT:-false}
CF_LOCK_BACKEND: ${CF_LOCK_BACKEND:-cloudfile}
CF_ENABLE_CHECKOUT: ${CF_ENABLE_CHECKOUT:-false}
CLOUDFILE_OIDC_ENABLED: ${CLOUDFILE_OIDC_ENABLED:-false}
CLOUDFILE_OIDC_JIT_ENABLED: ${CLOUDFILE_OIDC_JIT_ENABLED:-false}
CLOUDFILE_OIDC_CONFIG_JSON: ${CLOUDFILE_OIDC_CONFIG_JSON:-}
CLOUDFILE_POLICY_CONFIG_JSON: ${CLOUDFILE_POLICY_CONFIG_JSON:-}
# Keep explicit policy/transfer settings effective on both app and worker.
CLOUDFILE_AUTHORIZATION_ENABLED: ${CLOUDFILE_AUTHORIZATION_ENABLED:-false}
CLOUDFILE_TRANSFER_ENABLED: ${CLOUDFILE_TRANSFER_ENABLED:-false}
CLOUDFILE_POLICY_WORKER_HOOKS: ${CLOUDFILE_POLICY_WORKER_HOOKS:-false}
CLOUDFILE_LOCAL_EDIT_ENABLED: ${CLOUDFILE_LOCAL_EDIT_ENABLED:-false}
# Native administrator policy is initialized automatically from existing SQL settings.
CLOUDFILE_LOCAL_EDIT_INSTANCE: ${CLOUDFILE_LOCAL_EDIT_INSTANCE:-}
CLOUDFILE_AGENT2_OPTIMISTIC_UPLOAD_ENABLED: ${CLOUDFILE_AGENT2_OPTIMISTIC_UPLOAD_ENABLED:-false}
CLOUDFILE_AGENT2_EXCLUSIVE_ENABLED: ${CLOUDFILE_AGENT2_EXCLUSIVE_ENABLED:-false}
CLOUDFILE_EDITING_ENABLED: ${CLOUDFILE_EDITING_ENABLED:-false}
CLOUDFILE_RESOURCE_SECRET: ${CLOUDFILE_RESOURCE_SECRET:-}
CF_ENABLE_LOCAL_APP: ${CF_ENABLE_LOCAL_APP:-false}
CF_LIBRARY_STORAGE: ${CF_LIBRARY_STORAGE:-}
CF_ENABLE_S3_STORAGE: ${CF_ENABLE_S3_STORAGE:-false}
Expand Down
2 changes: 1 addition & 1 deletion docs/EXTENSION-POINTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ core 依据适用的目录 ACL/共享授予资格(`server/cloudfile-policy.h:4
- 库根与任何未共享路径一律不放行,答案由 `cf_v2_share.c` 向 Hub 的
`/cloudfile/acl/check/` 求证(同 Go fileserver 用的那个内部 JWT 通道,见
`cf_v2_acl_check_json()`),响应里的 `permissions` 逐检查项给出级别;
- 注册仅检查标准 V2 三表 `cf_library_storage`、`cf_dir_acl`、`cf_sso_group_map` 与内部 Hub 通道;不依赖已退役的 `cf_managed_library` 或新增功能开关。未安装 V2、表不齐或通道不可用时保留原生拒绝;实际路径授权仍由 Hub 判定。
- 注册仅检查共享目录接缝所需的 `cf_library_storage`、`cf_dir_acl`、`cf_sso_group_map`(当前完整扩展模型为五表) 与内部 Hub 通道;不依赖已退役的 `cf_managed_library` 或新增功能开关。未安装 V2、表不齐或通道不可用时保留原生拒绝;实际路径授权仍由 Hub 判定。
- C/Go 的终判不变:Go 写入口仍走 `cfACLPath`/`cfACLFinal`,C 仍走提交事务内的检查。

这条缝**只覆盖 API 写入口**(上传链接、新建目录、重命名、移动、删除、seafdav)。
Expand Down
3 changes: 3 additions & 0 deletions docs/directory-access-v09-http.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# v0.9 目录管理与地址接口

> 历史记录,非当前 V2 契约。文中旧 managed marker、Resource/Intent、委托与旧授权路由已退役;当前实施以 [权限终判契约](/docs/permission-adjudication-contract.md) 和现行源码为准。


状态:目录管理、发现、地址解析和目录分页 API 已实现,新增目录访问下载/上传预检查与原生 scoped 终判已接通;管理界面已统一编辑 ACL 权限与共享开关。完整发布验收仍需真实身份 HTTP 及制品验证。权限语义见 [目录资格契约](directory-access-v09.md)。

## 接口
Expand Down
3 changes: 3 additions & 0 deletions docs/features/local-migration.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# 本地文件迁移与大资料库评估

> 历史记录,非当前 V2 契约。文中旧 managed marker、Resource/Intent、委托与旧授权路由已退役;当前实施以 [权限终判契约](/docs/permission-adjudication-contract.md) 和现行源码为准。


## v0.2 离线管理员单库导入

CF02-07 MVP 复用 v0.1 `a963c177e9e6e5e122c2e088620b2cc2bb63c2b1` 的
Expand Down
15 changes: 14 additions & 1 deletion docs/permission-adjudication-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

## 1. 唯一权威与边界

默认复用 Seafile CE 原生能力,只在已确认的目录 ACL 与共享目录需求上补足执行接缝。新增表、权限引擎、共享机制或配置开关等设计须先确认,不以修复缺陷为由扩大架构。

CloudFile 不存在托管库这一概念。每个库均保留 Seafile CE 原生 RepoOwner/SharedRepo/RepoGroup 的库资格,以及同一 `cf_dir_acl` 存储的目录 ACL 和共享目录资格。目录规则是路径级事实,不能使整个库进入另一权限模式。

- 库级资格由 CE 原生权限和可信身份计算,正常情况下 `r/rw`;目录规则默认继承,可在有效作用域内缩权或扩权。
Expand All @@ -28,6 +30,7 @@ CloudFile 不存在托管库这一概念。每个库均保留 Seafile CE 原生

- 明确权限拒绝返回 403;授权来源/SQL/内部 HTTP 不可用应在支持的入口返回 503;**禁止授权异常时回退到原生宽权限**。
- Commit 最终事务必须重验可信操作者和实际变更路径,保留 Branch CAS、Checkout Guard 和必要的锁,不能仅依靠上传开始时的检查。
- 撤权不要求实时生效:允许既有权限缓存存活至配置的 TTL,到期后的新裁决必须重新读取授权来源;来源不可用时不得继续沿用已过期的允许结果。保留既有缓存和失效机制,不增加实时撤权通道。
- 任何共享撤权或成员变动必须通过统一生效权限进入搜索、列表、票据、代理、本地编辑等路径。既有下载票据不能被视为永久内容授权。

## 4. 禁止恢复的旧设计
Expand All @@ -38,4 +41,14 @@ CloudFile 不存在托管库这一概念。每个库均保留 Seafile CE 原生

## 5. 验收

正常库根与兄弟目录访问;库 `r` 的局部扩权与库 `rw` 的局部缩权;个人/组织/角色冲突;无库权限共享根;撤权后搜索、下载、上传;原生整库协议的范围证明;ACL 不可用;最终提交并发。源码合入、定向测试、真实 DEV 验收必须分开报告。
正常库根与兄弟目录访问;库 `r` 的局部扩权与库 `rw` 的局部缩权;个人/组织/角色冲突;无库权限共享根;缓存过期后的撤权与搜索、下载、上传;原生整库协议的范围证明;ACL 不可用;最终提交并发。源码合入、定向测试、真实 DEV 验收必须分开报告。

## 6. 旧授权清理边界

已批准清理七类旧机制:C 独立 ACL 计算;Python PolicyHost/PolicyCore;目录管理员侧表;旧 ACL/share 写入账本;浏览器/Smart Link 双重裁决;委托、资源票据和 epoch 强刷链;旧授权 URL 别名及其专用契约。只保留当前 CE/V2 所需适配器和身份校验,不新增兼容授权入口。

- 旧 C/Go `/cloudfile/read` 及旧 ticket/publish RPC 注销,调用这些接口不再获得服务;不把旧凭据转译为新授权。原生 scoped download token 与现行 V2 编辑凭据保留。
- 原生 Branch 锁、CAS、Guard 仍保留。C 无用户/路径证明的整库提交仍须通过操作范围门禁;有范围的 V2 编辑由现有 Go 路径处理。
- Docker 不再生成旧 PolicyHost 设置或安装其共享库。显式启用已退役配置会报错;只清除生成器拥有的旧 gunicorn 区块,保留操作员配置。上线前应移除已退役环境变量。
- 删除依赖退役表、RPC 或票据的专用旧夹具;当前 V2 用例继续作为验证依据。历史验收记录不计入当前交付。
- 三仓需配套集成;此前 `partial`/503 语义要求 Hub 至少包含 `86a763cea`,本次还要求 Hub、Server、Docker 使用同批清理版本。构建发布时记录完整 SHA,不以历史绿色 CI 代替新版本验收。
13 changes: 13 additions & 0 deletions docs/upstream-patches/cloudfile-hub.txt
Original file line number Diff line number Diff line change
Expand Up @@ -112,3 +112,16 @@ tests/api/endpoints/test_file_tag.py
tests/api/endpoints/test_group_libraries.py
tests/api/test_group_repos.py
tests/api/test_repo_history_limit.py

# 2026-10-21 权限收敛修复:seahub/views/__init__.py:复用 ACLUnavailable 与现有权限中间件,避免策略故障被误报为 403;内容权限仍交给现有 Authority。

# 2026-10-21 七类权限清理:注销旧票据/PolicyHost/独立 ACL 引擎;现行 Authority、CE 入口、V2 编辑与 Guard/CAS 保留。
frontend/src/components/file-uploader/file-uploader.js
frontend/src/components/logout/index.js
frontend/src/features/library-view/toolbar/selected-dirents-toolbar/index.js
frontend/src/hooks/file-operations/download.js
seahub/templates/react_app.html

# 2026-10-21 复检修复:seahub/api2/endpoints/file_tag.py:原生标签接口复用现有 tag_native/Authority 按目标路径裁决,校验定义与绑定的库归属;旧标签读保留,写收敛 CE FileTags。

# 2026-10-21 VirtualRepo 兼容:cloudfile_ext/v2/acl_runtime.py 保留 CE 虚拟库共享资格,沿 origin_repo_id/origin_path 交给同一 Authority;不暴露源库路径,不创建新的共享表或引擎。轻量 share_mode 共享继续独立按目录资格处理。
13 changes: 12 additions & 1 deletion docs/upstream-patches/cloudfile-server.txt
Original file line number Diff line number Diff line change
Expand Up @@ -64,5 +64,16 @@ common/user-mgr.h
fileserver/fileserver.go
server/gc/seafile-session.c

# 2026-10-21:cf-lock.c/h 与 cloudfile-policy.c 是独立 CloudFile 文件。
# 2026-10-21:cf-lock.c/h 保留当前 Guard;cloudfile-policy.c 旧独立引擎与死函数已删除。
# C 普通写入/锁屏障使用 V2 单 Guard,Checkout 关闭不查询锁;不改原生调用点。

# 2026-10-21 权限收敛修复:common/branch-mgr.c:最终 ACL 检查移至原生 Branch 锁与旧 head 校验之后;fileserver/fileop.go:拒绝未绑定父目录的 block upload token,保留 CE 目录规范化行为。

# 2026-10-21 七类权限清理:注销旧票据/PolicyHost/独立 ACL 引擎;现行 Authority、CE 入口、V2 编辑与 Guard/CAS 保留。
common/branch-mgr.h
server/web-accesstoken-mgr.c
server/web-accesstoken-mgr.h

# 2026-10-21 复检修复:common/branch-mgr.c:add/del/update 三个 MySQL 分支写入口先锁 Branch(master),再执行现有最终 ACL 校验,与 ACLStore 写入锁顺序一致;允许原生新建库尚无 master。

# 2026-10-21 VirtualRepo 兼容:common/cf-v2-acl.c 公开链接复用 CE origin/path 映射;原生转存不再仅因虚拟库类型拒绝。缺少范围证明的受 ACL 限制操作仍保留现有边界。server/Makefile.am 删除已退役头文件引用。
Loading
Loading