Releases: AsterCommunity/AsterDrive
Release list
AsterDrive v0.3.2
Release Highlights
AsterDrive v0.3.2 是 0.3.1 之后的快速热修复版本,主线是前端公共认证路由的初始化与 token refresh 行为收敛。 在邀请注册、密码重置、邮箱验证、OIDC callback 等公共页面上,应用启动时不再发起无谓的 bootstrap auth 检查,401 错误时也不再尝试 token refresh,从而减少无效 API 调用并避免把公共流程错误地重定向到登录页;同时补全了多个认证相关页面、回收站页面和错误页的 i18n namespace 加载,分享视图页面补齐 tasks namespace,并新增对应测试覆盖。
- 公共认证路由跳过初始化检查 —
/invite/:token、/reset-password不再触发 bootstrap auth check - 公共端点跳过 token refresh — 密码重置、邮箱验证、OIDC callback、邀请相关端点 401 时不再尝试刷新 token
- URL 匹配只比较 pathname — 修复 query/fragment 导致公共端点未被识别的问题
- i18n namespace 补全 — 强制改密、重置密码、邀请注册、团队详情、回收站、错误页加载正确 namespace;分享视图补充 tasks
Fixed
- 前端公共认证页面(邀请注册、密码重置)启动时不再执行 bootstrap auth check
- 公共 auth 端点 401 错误时不再尝试 token refresh
- token refresh skip 匹配改用 pathname,避免 query/fragment 干扰
- 补全 ForcePasswordChangePage / ResetPasswordPage / InviteRegisterPage / AdminTeamDetailPage / TrashPage / ErrorPage 的 i18n namespace 加载
- ShareViewPage 增加 tasks namespace
Statistics
- 6 files changed, 133 insertions(+), 13 deletions(-)
- 1 commit
Download
| Platform | Architecture | Archive |
|---|---|---|
| Linux | x86_64 | aster_drive_v0.3.2_linux_x86_64.tar.gz |
| Linux | x86 | aster_drive_v0.3.2_linux_i686.tar.gz |
| Linux | ARM64 | aster_drive_v0.3.2_linux_aarch64.tar.gz |
| Linux | ARMv7 | aster_drive_v0.3.2_linux_armv7.tar.gz |
| Windows | x86_64 | aster_drive_v0.3.2_windows_x86_64.exe.zip |
| Windows | x86 | aster_drive_v0.3.2_windows_i686.exe.zip |
| Windows | ARM64 | aster_drive_v0.3.2_windows_arm64.zip |
| macOS | x86_64 | aster_drive_v0.3.2_macos_x86_64.tar.gz |
| macOS | ARM64 | aster_drive_v0.3.2_macos_aarch64.tar.gz |
Extract with tar -xzf (Linux/macOS) or unzip (Windows).
Checksums: checksums.txt
Verify signatures
All release archives are signed with Sigstore cosign. To verify:
# Download checksums + signature + certificate
wget https://github.com/AsterCommunity/AsterDrive/releases/download/v0.3.2/{checksums.txt,checksums.txt.sig,checksums.txt.pem}
# Verify signature
cosign verify-blob checksums.txt \
--signature checksums.txt.sig \
--certificate checksums.txt.pem \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp 'github.com/AsterCommunity/AsterDrive'
# Verify archive integrity
sha256sum -c checksums.txtAsterDrive v0.3.1
Release Highlights
AsterDrive v0.3.1 是 0.3.0 系列的架构整理与性能打磨版本,主线是服务层领域模块化重组、WebDAV 性能与 HTTP 条件请求合规性提升、以及上传 finalize 路径契约化。 服务层从扁平的 *_service 文件重组为按领域嵌套的模块树(auth / files / share / user / mail / remote / workspace / preview / webdav / media 等),纯路径迁移不改 API 与 schema;WebDAV 落地 RFC 9110 条件请求(If-Match / If-None-Match / If-Modified-Since / If-Unmodified-Since)与 Last-Modified 响应,range 读取与大型 PROPFIND 显著提速,读写 DB 分离修复写后读一致性;上传 finalize 路径引入 VerifiedUploadedBlob 等不可变值对象,把 size / policy / path 校验与清理计划收敛到类型层。配套把 "managed ingress profile" 重命名为语义更清晰的 "remote storage target",远程存储策略可绑定到具体 target;本版本还顺带合并了贡献者提交的 SFTP 存储后端。
- 服务层领域模块化重组 — 扁平
*_service文件按领域嵌套为模块树,纯路径迁移,无 API / schema 变化 - WebDAV 性能与合规性 — RFC 9110 条件请求与
Last-Modified响应、range 读取与大型 PROPFIND 显著提速、读写 DB 分离修复写后读一致性、下载审计窗口合并 - 上传 finalize 路径契约化 —
VerifiedUploadedBlob/VerifiedTempStoreBlob等不可变值对象收敛校验与清理计划,固化 complete 重试幂等与配额超限不扣配额不变量 - 远程存储 target 化 —
managed ingress profile重命名为remote storage target,远程策略绑定具体 target,旧 API 路径与配置 key 保留兼容(deprecated) - SFTP 存储后端 — 基于
russh,支持连接池、host key 强制固定(TOFU)、高效 range 读;纯服务端中继上传,不支持 presigned / multipart
Added
-
远程节点 driver descriptor 发现
- 新增
ManagedIngressDriverDescriptor与字段 descriptor(Text / Secret / Boolean / Number + required / secret / label_key / placeholder / help_key),内置 local + S3 两个 driver 描述 - 新 API 从远程节点拉取支持的 driver 描述,管理后台按当前 driver 动态渲染字段、显示 driver 专属 help / placeholder,选远程不支持的 driver 时给出校验错误
- 远程内部协议版本 v4 → v5;
RemoteStorageCapabilities新增managed_ingress能力字段;v4 兼容层保留(MIN_SUPPORTED_PROTOCOL_VERSION仍为 v4)
- 新增
-
远程存储策略绑定 target
storage_policies表新增remote_storage_target_key列与索引;策略创建 / 更新时校验 target 已 applied 且无错误,非远程策略拒绝带 target key- 内部 / presigned 请求按策略指定的 target 路由,而非总走 binding 默认
- 管理后台策略对话框新增 target 二级选择(loading / empty / error / hint),支持在策略表单内直接快速创建 target
-
下载 disposition 参数 + resource-handle 端点
DownloadQuery新增可选disposition(inline/attachment),非法值返回校验错误;贯穿 personal / team / share 下载链路(空值 = attachment 旧行为,向后兼容)- 新端点
POST /api/v1/files/{id}/resource-handle与 team 对应端点,返回FileResourceHandle;Auto模式下为不可渲染图片(HEIC / RAW / TIFF)选派生 WebP 表示、HTML 等沙箱 MIME 强制同源
-
WebDAV HTTP 条件请求合规
- 新增
src/utils/http_validators.rs实现 RFC 9110 的If-Match(强 ETag)/If-None-Match(弱 ETag)/If-Modified-Since/If-Unmodified-Since求值与 header 优先级;GET / HEAD 响应携带Last-Modified
- 新增
-
WebDAV 下载审计合并
- 新配置项
webdav_download_audit_coalesce_window_secs(默认 30s);同一账号 + 文件 + 请求类型(full / ranged)+ 客户端指纹(IP + User-Agent 的 SHA256)在窗口内的重复下载合并为一条审计记录,设为 0 表示每次都记录
- 新配置项
-
SFTP 存储后端
- 新增
DriverType::Sftp(持久化字符串"sftp",sea-orm 以字符串存储,老库无需 migration),基于russh 0.62.1+russh-sftp 2.3.0 - 连接池(默认 4,空闲 TTL 60s,获取超时 30s,RAII lease 归还)、强制 host key 固定(TOFU,未配置指纹直接拒绝并回传服务器实际
SHA256:指纹)、高效 range 读(SFTP seek + take) - 上传走服务端中继流式,不支持 presigned / multipart / 浏览器直传——能力边界与 S3 不同
- 新增
Changed
-
服务层重组为领域模块(纯内部,无 API / schema 变化)
src/services/下扁平*_service文件 → 按领域嵌套模块树,绝大部分是use路径迁移- 新增
developer-docs/{en,zh-CN}/backend-service-ownership.md服务层责任边界文档
-
术语统一:managed ingress profile → remote storage target
- API 端点
/ingress-profiles→/storage-targets,旧路径保留为 deprecated 别名(计划于0.4.0移除) - 配置项
server.follower.managed_ingress_local_root→server.follower.remote_storage_target_local_root,loader 同时接受新旧两个键;默认值managed-ingress→remote-storage-targets - 保留兼容项:API 错误码仍为
managed_ingress.*;审计日志 entity type / action 仍为RemoteIngressProfile;wire protocol capabilities 仍用managed_ingress字段名
- API 端点
-
max_file_size从 target 层上移到 policy 层- 删除
remote_storage_targets.max_file_size列;改从请求的max_file_size签名查询参数读取(值来源于存储策略),负值 clamp 到 0 - target 创建表单移除 max_file_size,target 卡片移除 revision 显示
- 删除
-
WebDAV 读写 DB 分离与缓存精细化
resolve_path_cached_in_scope拆 read / write 两变体:写操作(PUT / MKCOL / COPY / MOVE / DELETE / LOCK)走writer_db(),读操作走reader_db(),避免写后读命中过期缓存- 引入
CacheInvalidationTargets支持 prefix + 定向 key 删除;文件夹变更改为定向删 key 而非全前缀刷;PROPFIND 只请求标准 live property 时跳过 dead property 与锁发现加载
-
WebDAV range 读与 PROPFIND 路径优化
- 下载路径一次解析 file + blob + meta,消除重复 metadata 查询;流式块大小 16 KiB → 64 KiB
read_dir去 N+1:直接用file记录构造目录项;ETag 改用结构化file_etag,不再依赖 blob hash- 团队成员变更触发的 WebDAV auth 缓存失效改为 fire-and-forget(带重试 + 日志),不再阻塞成员操作
-
上传 finalize 路径契约化(纯内部,无 API / 行为变化)
- 新增
VerifiedUploadedBlob/VerifiedTempStoreBlob/VerifiedPreuploadedNondedupStoreBlob不可变值对象,把 size / policy / path 校验与清理计划收敛到类型层 - 新增回归测试固化不变量:complete 重试不重复扣配额、配额超限时 session 置 Failed 且不扣配额(错误码
E032)
- 新增
-
前端 admin / 文件操作改造为插件可扩展
- 新增 admin settings action / editor / invalidation / save-transaction 四个 registry;文件操作
fileActionRegistry(声明式 action descriptor,支持 builtin + plugin action) AdminPoliciesPage从 1595 行减到 235 行(抽 5 个 controller hook + 3 个工具模块);12 个 controller 迁移到通用useManagedListQueryState/useManagedAdminList,减少约 800 行样板
- 新增 admin settings action / editor / invalidation / save-transaction 四个 registry;文件操作
-
S3 remote target 编辑强制输入 access_key
- 新增
src/storage/field_contract.rs统一 required / secret / boolean 字段语义;编辑 S3 remote target 时每次必须输入access_key,secret_key未变更时保留原值 - 前端从硬编码
driver_type === "s3"改为查 descriptorsecretKeyField?.secret === true
- 新增
Fixed
- WebDAV 写后读一致性 — 写操作走
writer_db()权威解析,新增测试覆盖 PUT / COPY / MOVE / LOCK / DELETE 后立即 GET / PROPFIND - 音乐播放 metadata 刷新打断播放 — track metadata 按 resource path 而非全对象做 key;跨域重定向资源跳过 range probe
- WebDAV 团队归档 / 恢复后 auth 缓存陈旧 — 归档 / 恢复团队时失效 WebDAV auth 缓存
- k6 基准测试 token 复用 —
refreshSession原本一直复用旧 refresh token;mixed-ramp.js/soak-mixed.js每个 VU 改为单独login()
Security
- SFTP host key 强制固定 — 从盲信任意 host key 收紧到 TOFU + pin,防 MITM;未配置指纹时拒绝连接并回传服务器实际
SHA256:指纹引导管理员确认 - S3 remote target 编辑强制 access_key — 公开凭证每次必须输入,仅
secret_key在未变更时保留原值 - 负值
max_file_size被拒 —normalize_storage_policy_max_file_size拒绝负值 - remote target 相对路径逃逸检测 —
normalize_relative_local_target_path检测路径逃逸段
Database Migrations
m20260704_000001_rename_managed_ingress_profiles_to_remote_storage_targets(表 / 列改名,可回滚)m20260704_000002_add_remote_storage_target_key_to_storage_policies(加列 + 索引)m20260705_000001_drop_remote_storage_target_max_file_size(删max_file_size列,改走策略查询参数)
Configuration Changes
server.follower.managed_ingress_local_root→server.follower.remote_storage_target_local_root(loader 同时接受新旧 key,旧 key deprecated,计划于0.4.0移除)- 默认值
managed-ingress→remote-storage-targets - 新增
webdav_download_audit_coalesce_window_secs(默认 30s,设为 0 表示每次下载都记录审计)
Statistics
- 916 files changed, 45826 insertions(+), 17459 deletions(-)
- 30 commits(含若干
[skip ci]仓库迁移 / 测试镜像固定) - 3 个数据库 migration(自动执行,可回滚)
- 新增后端驱动:1(SFTP)
Notes
- 从
v0.3.0升级:3 个 DB migration 在启动时自动执行;API 旧路径/ingress-profiles与旧配置 key 保留兼容(deprecated),建议尽快迁移到/storage-targets/remote_storage_target_local_root - SFTP 策略首次配置需走 host key TOFU 确认流程:未配
sftp_host_key_fingerprint时连接测试会返回服务器实际SHA256:指纹,确认后写入即可 - SFTP 后端为纯服务端中继,不支持 presigned / multipart / 浏览器直传,能力边界与 S3 不同
- 远程内部协议 v4 → v5:
MIN_SUPPORTED_PROTOCOL_VERSION仍为 v4,旧 follower 靠兼容层继续工作;primary + follower 混合部署建议一并升级 - Docker 用户建议使用
v0.3.1/stable/latest镜像标签
Download
| Platform | Architecture | Archive |
|---|---|---|
| Linux | x86_64 | aster_drive_v0.3.1_linux_x86_64.tar.gz |
| Linux | x86 | aster_drive_v0.3.1_linux_i686.tar.gz |
| Linux | ARM64 | aster_drive_v0.3.1_linux_aarch64.tar.gz |
| Linux | ARMv7 | aster_drive_v0.3.1_linux_armv7.tar.gz |
| Windows | x86_64 | aster_drive_v0.3.1_windows_x86_64.exe.zip |
| Windows | x86 | aster_drive_v0.3.1_windows_i686.exe.zip |
| Windows | ARM64 | aster_drive_v0.3.1_windows_arm64.zip |
| macOS | x86_64 | aster_drive_v0.3.1_macos_x86_64.tar.gz |
| macOS | ARM64 | aster_drive_v0.3.1_macos_aarch64.tar.gz |
Extract with tar -xzf (Linux/macOS) or unzip (Windows).
Checksums: checksums.txt
Verify signatures
All release archives are signed with Sigstore cosign. To verify:
# Download checksums + signature + certificate
wget https://github.com/AsterCommunity/AsterDrive/releases/download/v0.3.1/{checksums.txt,checksums.txt.sig,checksums.txt.pem}
# Verify signature
cosign verify-blob checksums.txt \
--signature checksums.txt.sig \
--certificate checksums.txt.pem \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp 'github.com/AsterCommunity/AsterDrive'
# Verify archive integrity
sha256sum -c checksums.txtAsterDrive v0.3.0
Release Highlights
AsterDrive 0.3.0 正式发布。 在 v0.3.0 beta / RC 线(Azure Blob 与 OneDrive 驱动、统一 StorageConnector 抽象、对象存储术语统一与凭据脱敏、内联预览走预签名直链、审计日志无限期保留等)基础上,本版本收口公开分享预览的缓存稳定性与 CI 构建流水线,把 0.3.0 系列从 RC 阶段推进到稳定发布。
- 预览资源缓存身份稳定化 — 公开分享预览响应返回 canonical ETag(blob hash),前端按 stable identity 复用 blob / text 缓存,跨过期 preview token 共享同一份资源
- 条件请求 no longer 触发 CORS 预检 —
If-None-Match条件请求留在 same-origin,不再 302 到预签名对象存储 URL - CI 前端构建独立化 — GitHub Actions 把前端构建拆成独立
build-frontendjob,下游 build / integration-backends 通过 artifact 下载产物,避免重复构建与 Rust cache 污染 - 依赖升级 —
react-image-crop11.0.10 → 11.1.2,@typescript/native-preview升至7.0.0-dev.20260622.1
Added
- 预览资源 stable identity 类型
- 前端新增
ResourceRequest类型区分cacheKey/etag/requestPath,新增resourceCacheKey/resourceRequestPath/resourceCanonicalEtag辅助函数集中处理 useBlobUrl/useTextContent按 stable identity 缓存,提供 canonical ETag 时跳过If-None-Match条件请求- 各预览组件(
BlobImagePreview/PdfPreview/CsvTablePreview/JsonPreview/MarkdownPreview/TextCodePreview/XmlPreview/FilePreviewBody/ImagePreviewPanel)接受ResourcePath(string |ResourceRequest) PreviewLinkInfo新增 canonical etag 字段(blob hash),公开分享预览响应携带稳定身份- 新增
resourceRequest/useBlobUrl/useTextContent单元测试覆盖 cache key 回落与条件重验证逻辑
- 前端新增
Changed
-
条件请求 same-origin 收敛
file_service::download::build在 presigned redirect 前拒绝条件请求(If-None-Match),避免浏览器跨 origin 携带条件触发 CORS 预检preview_link_service在响应中携带 canonical ETag,供前端复用缓存
-
CI 前端构建独立 job
rust.yml新增build-frontendjob 单独构建前端并上传 artifact,build/integration-backends改为needs: build-frontend并通过download-artifact拉取frontend-panel/dist- 移除原先散落在
build/integration-backends中的Setup bun与Build frontend步骤,避免 Rust cache 被前端产物污染
-
预览组件路径类型统一
- 前端预览组件从内联类型定义改为导入公共
ResourcePath类型,测试中的 mock helper 收敛到resourceCacheKey/resourceCanonicalEtag工具
- 前端预览组件从内联类型定义改为导入公共
-
依赖升级
react-image-crop11.0.10 → 11.1.2@typescript/native-preview升至7.0.0-dev.20260622.1
Fixed
OverviewRecentEventsSection表格列改为固定宽度 +max-w-0截断,修复内容过长时列宽抖动
Notes
- 本版本为
0.3.0系列正式发布版 - 从
v0.3.0-rc.2升级到v0.3.0没有新增数据库 migration - 生产配置 schema 未新增必需项
- Docker 用户建议使用
v0.3.0、stable或latest镜像标签;edge继续保留给后续预发布版本 - 统计数据:31 files changed, 923 insertions(+), 174 deletions(-)
- 本次范围共 2 个提交
Download
| Platform | Architecture | Archive |
|---|---|---|
| Linux | x86_64 | aster_drive_v0.3.0_linux_x86_64.tar.gz |
| Linux | x86 | aster_drive_v0.3.0_linux_i686.tar.gz |
| Linux | ARM64 | aster_drive_v0.3.0_linux_aarch64.tar.gz |
| Linux | ARMv7 | aster_drive_v0.3.0_linux_armv7.tar.gz |
| Windows | x86_64 | aster_drive_v0.3.0_windows_x86_64.exe.zip |
| Windows | x86 | aster_drive_v0.3.0_windows_i686.exe.zip |
| Windows | ARM64 | aster_drive_v0.3.0_windows_arm64.zip |
| macOS | x86_64 | aster_drive_v0.3.0_macos_x86_64.tar.gz |
| macOS | ARM64 | aster_drive_v0.3.0_macos_aarch64.tar.gz |
Extract with tar -xzf (Linux/macOS) or unzip (Windows).
Checksums: checksums.txt
Verify signatures
All release archives are signed with Sigstore cosign. To verify:
# Download checksums + signature + certificate
wget https://github.com/AsterCommunity/AsterDrive/releases/download/v0.3.0/{checksums.txt,checksums.txt.sig,checksums.txt.pem}
# Verify signature
cosign verify-blob checksums.txt \
--signature checksums.txt.sig \
--certificate checksums.txt.pem \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp 'github.com/AptS-1547/AsterDrive'
# Verify archive integrity
sha256sum -c checksums.txtAsterDrive v0.3.0-rc.2
Release Highlights
AsterDrive 0.3.0-rc.2 是 0.3.0 发布候选线的预览体验与审计保留补强版本,主线是内联预览走对象存储预签名直链与审计日志无限期保留。 Inline 预览(图片 / 视频 / 音频 / PDF / Markdown / 代码 / 表格 / JSON / XML 等)在策略允许且 MIME 不需要 same-origin CSP sandbox 时直接 302 到对象存储预签名 URL,不再由服务端统一加 CSP 与缓存头转流,降低服务端带宽与转发延迟;公开分享预览(preview link)下载路径切换到统一下载出口以同样享受预签名。前端 apiUrl 把后端 API origin 的 URL 从「外部资源」中排除并新增 shouldSendResourceCredentials——预签名 URL 落在对象存储 origin 时不会携带会话凭据,避免 CORS 预检失败与凭据外泄;各预览组件 path 改为可空,加载期间显示 loading 占位。审计日志保留期 audit_log_retention_days 设为 0 时跳过自动清理,实现永久保留。
- Inline 预览走预签名直链 — 策略允许且 MIME 不需 same-origin sandbox 时 inline 预览直接 302 到对象存储预签名 URL,preview link 同步切换到统一下载出口
- CORS 安全的凭据处理 — 后端 API origin 的 URL 不再被前端误判为外部资源,新增
shouldSendResourceCredentials集中判断;预签名 URL 属于对象存储 origin 时不携带会话凭据 - 审计日志无限期保留 —
audit_log_retention_days = 0跳过自动清理,i18n 文案补充「设为 0 表示永久保留」 - 存储操作审计文案补全 — 新增「管理员触发存储操作」i18n 文案(en / zh)
Added
- 审计日志无限期保留
audit_service::cleanup_expired在retention_days <= 0时跳过清理并返回 0,管理员可将audit_log_retention_days设为0实现永久保留settings-operationsi18n 文案补充「设为 0 表示永久保留,不自动清理」- 新增
audit_action_admin_trigger_storage_actioni18n 文案(en / zh)覆盖存储操作审计 - 新增
test_audit_cleanup_retention_zero_keeps_logs集成测试断言 365 天前的记录在 retention=0 时仍被保留
Changed
-
Inline 预览走预签名直链
file_service::download::build中should_presign从「仅 Attachment」改为「除需 same-origin CSP sandbox 的 inline MIME 类型外均走 presigned redirect」;build_presigned_redirect_outcome接受disposition参数,content-disposition 不再硬编码 Attachmentpreview_link_service::download_file由直接调用build_stream_outcome_with_disposition_and_range改为build_download_outcome_with_disposition_and_range,公开分享预览同样享受预签名- 前端新增
useContentPreviewResourcePathhook:存在previewLinkFactory时优先解析 preview link 路径,否则回落 downloadPath - 前端各预览组件(
PdfPreview/BlobImagePreview/MusicPreview/VideoPreview/MarkdownPreview/CsvTablePreview/XmlPreview/JsonPreview/TextCodePreview)从downloadPath切换到contentPreviewPath,path改为可空并在加载期间显示 loading tests/test_upload.rs中 direct-link inline presigned 测试断言改为 302 redirect +Cache-Control: no-store+Location携带response-content-disposition
-
前端资源凭据判断收紧
apiUrl.ts新增isConfiguredApiUrl判断 URL 是否属于后端 API origin;isExternalResourceUrl不再把后端 API URL 当作外部资源- 新增
shouldSendResourceCredentials(path):仅在「非外部资源且非公开资源」时携带会话凭据,authenticatedResource改用该判断 - 预签名 URL 落在对象存储 origin(与 API origin 不同)时不会被携带凭据,避免 CORS 预检失败与凭据泄露
-
S3 / MinIO / R2 文档补全
docs/storage/s3-minio-r2.md与docs/en/storage/s3-minio-r2.md补全内联预览走预签名直链所需的 CORS 与凭据配置说明
Statistics
- 35 files changed, 1641 insertions(+), 116 deletions(-)
- 3 commits
Download
| Platform | Architecture | Archive |
|---|---|---|
| Linux | x86_64 | aster_drive_v0.3.0-rc.2_linux_x86_64.tar.gz |
| Linux | x86 | aster_drive_v0.3.0-rc.2_linux_i686.tar.gz |
| Linux | ARM64 | aster_drive_v0.3.0-rc.2_linux_aarch64.tar.gz |
| Linux | ARMv7 | aster_drive_v0.3.0-rc.2_linux_armv7.tar.gz |
| Windows | x86_64 | aster_drive_v0.3.0-rc.2_windows_x86_64.exe.zip |
| Windows | x86 | aster_drive_v0.3.0-rc.2_windows_i686.exe.zip |
| Windows | ARM64 | aster_drive_v0.3.0-rc.2_windows_arm64.zip |
| macOS | x86_64 | aster_drive_v0.3.0-rc.2_macos_x86_64.tar.gz |
| macOS | ARM64 | aster_drive_v0.3.0-rc.2_macos_aarch64.tar.gz |
Extract with tar -xzf (Linux/macOS) or unzip (Windows).
Checksums: checksums.txt
Verify signatures
All release archives are signed with Sigstore cosign. To verify:
# Download checksums + signature + certificate
wget https://github.com/AsterCommunity/AsterDrive/releases/download/v0.3.0-rc.2/{checksums.txt,checksums.txt.sig,checksums.txt.pem}
# Verify signature
cosign verify-blob checksums.txt \
--signature checksums.txt.sig \
--certificate checksums.txt.pem \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp 'github.com/AptS-1547/AsterDrive'
# Verify archive integrity
sha256sum -c checksums.txtAsterDrive v0.3.0-rc.1
Release Highlights
AsterDrive 0.3.0-rc.1 是 0.3.0 系列的发布候选版本,主线是存储策略术语统一与凭据安全加固。 将面向 S3 命名的策略字段统一为通用对象存储术语(s3_upload_strategy → object_storage_upload_strategy 等,serde alias 保留旧名向后兼容),Microsoft Graph 的 client secret / token 用 secrecy::SecretString 包装并在所有持有凭据的类型上手动实现 Debug 确保日志脱敏;reverse tunnel stream lane 在离线 / 关闭 / 超时时自动回退 poll 模式而非直接失败。
- 存储策略术语统一(Object Storage,向后兼容) — S3 专属字段名改为通用对象存储命名,旧名通过 serde alias 与前端 legacy fallback 继续可用
- 凭据安全加固 — Microsoft Graph client secret / token 用
SecretString包装,相关 entity 与 provider 手动实现Debug保证日志脱敏 - Reverse tunnel 可靠性 — stream lane 离线 / 关闭 / 超时自动回退 poll 请求
- OneDrive / Azure Blob 文档补完 — admin API 与存储后端文档补齐新驱动说明
Changed
-
存储策略术语统一(Breaking,向后兼容)
StoragePolicyOptionsJSON 字段s3_upload_strategy/s3_download_strategy→object_storage_upload_strategy/object_storage_download_strategy,旧名通过#[serde(alias = "...")]与前端 legacy fallback 继续可用- enum 类型
S3UploadStrategy/S3DownloadStrategy→ObjectStorageUploadStrategy/ObjectStorageDownloadStrategy(Rust + OpenAPI + 前端 types),枚举值relay_stream/presigned不变 - connector capability
s3_transfer_strategy→object_storage_transfer_strategy - 前端管理面板文案从"S3 上传 / 下载方式"改为"对象存储上传 / 下载方式"
-
OneDrive 授权请求体收紧
POST /admin/policies/{id}/storage-authorization/start仅接受{ "provider": "microsoft_graph" },Client ID / Secret / tenant / scopes 必须先保存到application_config.microsoft_graph
Security
- 新增
secrecy = "0.10"依赖,Microsoft Graphclient_secret/refresh_token/access_token用SecretString包装,仅在调用 Microsoft Graph 时通过expose_secret()取出 storage_policy/managed_follower/master_binding/managed_ingress_profileentity 与所有 Microsoft Graph token provider / request 类型手动实现Debug,日志中access_key/secret_key显示为***REDACTED***,每个类型带单元测试断言不泄露明文
Fixed
- reverse tunnel stream lane 在
reverse tunnel is offline/lane closed/response channel closed/ 流式等待超时时自动回退 poll 请求,此前直接失败 - RenameDialog 重命名提交期间禁用按钮并用 ref 守卫,防止用户快速重复点击触发多次重命名请求
Statistics
- 109 files changed, 1808 insertions(+), 691 deletions(-)
- 3 commits
Download
| Platform | Architecture | Archive |
|---|---|---|
| Linux | x86_64 | aster_drive_v0.3.0-rc.1_linux_x86_64.tar.gz |
| Linux | x86 | aster_drive_v0.3.0-rc.1_linux_i686.tar.gz |
| Linux | ARM64 | aster_drive_v0.3.0-rc.1_linux_aarch64.tar.gz |
| Linux | ARMv7 | aster_drive_v0.3.0-rc.1_linux_armv7.tar.gz |
| Windows | x86_64 | aster_drive_v0.3.0-rc.1_windows_x86_64.exe.zip |
| Windows | x86 | aster_drive_v0.3.0-rc.1_windows_i686.exe.zip |
| Windows | ARM64 | aster_drive_v0.3.0-rc.1_windows_arm64.zip |
| macOS | x86_64 | aster_drive_v0.3.0-rc.1_macos_x86_64.tar.gz |
| macOS | ARM64 | aster_drive_v0.3.0-rc.1_macos_aarch64.tar.gz |
Extract with tar -xzf (Linux/macOS) or unzip (Windows).
Checksums: checksums.txt
Verify signatures
All release archives are signed with Sigstore cosign. To verify:
# Download checksums + signature + certificate
wget https://github.com/AsterCommunity/AsterDrive/releases/download/v0.3.0-rc.1/{checksums.txt,checksums.txt.sig,checksums.txt.pem}
# Verify signature
cosign verify-blob checksums.txt \
--signature checksums.txt.sig \
--certificate checksums.txt.pem \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp 'github.com/AptS-1547/AsterDrive'
# Verify archive integrity
sha256sum -c checksums.txtAsterDrive v0.3.0-beta.2
Release Highlights
AsterDrive 0.3.0-beta.2 是 0.3.0 beta 线的稳定性与错误处理打磨版本,主线是连接器抽象的健壮性收口与 OneDrive 授权流程修正。 全面将 panic 路径(expect/unwrap)替换为 Result 错误传播,统一存储连接测试的诊断返回(从成功响应 payload 迁移到 error metadata);OneDrive 授权改为"先保存凭据再授权",draft 策略连接测试支持复用已保存凭据;各 service 缓存逻辑下沉到独立 cache 子模块。
- 错误处理健壮性收口 —
expect/unwrap全面替换为Result,multipart 读取失败映射 BAD_REQUEST,connector 注册缺失改为显式错误而非静默回退 local - 存储连接测试 API 契约统一 — 诊断信息从成功响应 payload 迁移到
ApiErrorInfo.diagnostic,前端从ApiError.diagnostic读取 - OneDrive 授权流程修正 — 授权请求只发 provider type,要求先保存凭据变更才能发起授权
- draft 策略凭据复用 — 连接测试可选
policy_id,空白凭据字段复用已保存凭据(S3 / Azure Blob / Tencent COS) - cache 模块抽取 — 各 service 缓存逻辑下沉到独立 cache 子模块
Added
- draft 策略凭据复用
- 连接测试端点新增可选
policy_id,S3 / Azure Blob / Tencent COS 在凭据字段为空时复用已保存凭据,管理员改配置时无需重输敏感信息
- 连接测试端点新增可选
Changed
-
错误处理重构
- CORS、加密、shutdown handler、CLI 序列化、时间/时区运算、内存 mail sender mutex 中毒等 panic 路径替换为
Result传播与日志降级 - signal handler 安装失败不再 panic;archive preview / offline download / WOPI discovery client 构建失败由静默 fallback 改为错误传播
connector_or_local静默回退 local 改为connector_or_registered显式报错;故意不可达分支加#[allow(clippy::expect_used)]标注不变式
- CORS、加密、shutdown handler、CLI 序列化、时间/时区运算、内存 mail sender mutex 中毒等 panic 路径替换为
-
存储连接测试 API 契约统一
- 移除
StoragePolicyProbeResult与probe_connection*端点,改用标准错误响应携带ApiErrorInfo.diagnostic - 新增
ApiErrorDiagnosticschema,对外暴露 message / kind,api_code / retryable 内部保留 - 前端连接测试从
ApiError.diagnostic读取失败原因
- 移除
-
OneDrive 授权流程
- 授权请求不再携带 draft Microsoft Graph 凭据,仅发送 provider type,后端复用已保存 application_config
- 凭据变更后必须先保存才能发起授权
-
连接器 descriptor 配置
- driver-type 条件分支改为显式 input struct(
ObjectStorageConnectorDescriptorInput/ObjectStorageFieldDescriptorInput) - descriptor UI 逻辑从集中函数下沉到各 connector;multipart ETag 要求改为显式 input 字段
- driver-type 条件分支改为显式 input struct(
-
cache 模块抽取
- admin / auth / folder / passkey / preview link / share stream / stream ticket / workspace scope / WebDAV auth / WebDAV path resolver 的缓存操作下沉到独立 cache 子模块,补全作用域与失效测试
share_streammarker 编码移入 cache 模块,reserve_count_marker/store_count_marker改为Result传播
-
依赖升级
- actix-web 4.13.0 → 4.14.0、actix-multipart 0.7.2 → 0.8.0、actix-http 3.12.1 → 3.13.0、actix-multipart-derive 0.7.0 → 0.8.0
- derive_more 统一为 2.1.1、foldhash 0.2.0、impl-more 0.3.1;parse-size 替换为 bytesize 2.4.0
- 前端
@typescript/native-preview升至7.0.0-dev.20260621.1
Fixed
- multipart 上传读取失败(
UploadFieldReadFailed/AvatarUploadReadFailed)映射为 BAD_REQUEST,此前为 500 - offline download 循环在 shutdown 信号下不再静默中断,改为返回 transient 错误
- WOPI discovery client 构建失败不再回退
reqwest::Client::new,改为传播错误
Statistics
- 114 files changed, 3665 insertions(+), 1347 deletions(-)
- 4 commits
Download
| Platform | Architecture | Archive |
|---|---|---|
| Linux | x86_64 | aster_drive_v0.3.0-beta.2_linux_x86_64.tar.gz |
| Linux | x86 | aster_drive_v0.3.0-beta.2_linux_i686.tar.gz |
| Linux | ARM64 | aster_drive_v0.3.0-beta.2_linux_aarch64.tar.gz |
| Linux | ARMv7 | aster_drive_v0.3.0-beta.2_linux_armv7.tar.gz |
| Windows | x86_64 | aster_drive_v0.3.0-beta.2_windows_x86_64.exe.zip |
| Windows | x86 | aster_drive_v0.3.0-beta.2_windows_i686.exe.zip |
| Windows | ARM64 | aster_drive_v0.3.0-beta.2_windows_arm64.zip |
| macOS | x86_64 | aster_drive_v0.3.0-beta.2_macos_x86_64.tar.gz |
| macOS | ARM64 | aster_drive_v0.3.0-beta.2_macos_aarch64.tar.gz |
Extract with tar -xzf (Linux/macOS) or unzip (Windows).
Checksums: checksums.txt
Verify signatures
All release archives are signed with Sigstore cosign. To verify:
# Download checksums + signature + certificate
wget https://github.com/AsterCommunity/AsterDrive/releases/download/v0.3.0-beta.2/{checksums.txt,checksums.txt.sig,checksums.txt.pem}
# Verify signature
cosign verify-blob checksums.txt \
--signature checksums.txt.sig \
--certificate checksums.txt.pem \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp 'github.com/AptS-1547/AsterDrive'
# Verify archive integrity
sha256sum -c checksums.txtAsterDrive v0.3.0-beta.1
Release Highlights
AsterDrive 0.3.0-beta.1 是 0.3.0 系列的第一个 beta 版本,主线是存储后端扩展与连接器抽象统一。 本版本新增 Azure Blob Storage 与 OneDrive(含 SharePoint site / Group drive)两类云盘驱动,引入统一的 StorageConnector 抽象让六个驱动以一致的 descriptor 暴露能力与表单字段;OneDrive 凭据走 Microsoft Graph OAuth + PKCE,token 用 HKDF 派生密钥 + AES-256-GCM 加密落库。缓存后端精简为 memory / Redis 两种并移除已失效的 cache.enabled 开关,Redis 引入本地 memory 二级回退;存储策略连接探测改为结构化诊断端点,失败返回 200 + 脱敏原因。同时补全审计日志结构化详情、Tencent COS CORS 一键配置、PWA precache 重构与 toast 视觉重做。
- Azure Blob Storage 驱动 — Block Blob CRUD、SAS URL 预签名上传/下载、分块上传
- OneDrive 驱动 + OAuth 凭据管理 — personal / work_or_school / SharePoint site / group drive,PKCE 流程,>250MiB 分块续传
- StorageConnector 统一抽象 — 六驱动统一 descriptor、字段与上传工作流,新增
/admin/policies/storage-drivers - 缓存后端精简与 Redis 二级回退(Breaking) — 移除
cache.enabled,Redis 故障时回落 memory - 存储策略诊断端点 — 结构化
StoragePolicyDiagnostic,SAS / account key 脱敏 - 审计日志结构化 — 文件 / 用户 / 策略 / 会话操作补全上下文
- Tencent COS CORS 自动配置 — 从
public_site_url派生多 origin,一键应用 - PWA precache 与 toast 重做 — glob 化预缓存清单 + 预算告警,toast 主题化
Added
-
Azure Blob Storage 驱动
- 新增
azure_blobdriver type,完整 CRUD、SAS URL 预签名上传 / 下载、Block Blob 分块上传 InitUploadResponse新增presigned_require_etag字段;presigned_put_requires_etagtrait 方法区分驱动(Azure Blob = false,S3 / remote = true)AzureBlobConfigError:生产环境 SASspr协议限 https,loopback / Azurite 放行 https + http- 前端表单字段改为 Storage Account Name / Key,预签名请求附带
x-ms-blob-type: BlockBlob头
- 新增
-
OneDrive 驱动与 OAuth 凭据管理
- 新增
onedrivedriver type +OneDriveAccountMode(personal / work_or_school / sharepoint_site / group_drive) - 7 个
onedrive_*策略字段;Microsoft Graph OAuth + PKCE 授权流程 - token 与 client secret 用
auth.storage_credential_secret_key经 HKDF 派生 + AES-256-GCM 加密落库 -
250MiB 走 Graph 原生分块上传 session
- 驱动根动态解析(personal / work / site / group)
- 前端凭据面板含授权状态徽章、授权 / 回调入口
- 新增
-
StorageConnector 统一抽象与驱动 descriptor
- 引入
StorageConnectortrait +StorageConnectorDescriptor,六驱动统一暴露 capabilities / fields / upload workflows / actions - 新增
GET /admin/policies/storage-drivers端点;前端用 TTL 缓存的 descriptor 取代 driver-type 字符串判断 - 新增
ProviderResumableUploadDrivertrait(OneDrive / Graph 原生断点续传) - 新增 DB 表
storage_connector_application_configs,Microsoft Graph app 配置从 policy key 字段迁移到 connector application config
- 引入
-
存储策略诊断端点
- 连接探测返回结构化
StoragePolicyDiagnostic(api_code / kind / message / retryable) - 探测失败改为 200 +
ok:false而非 4xx - SAS token、account key 在响应中脱敏
- 连接探测返回结构化
-
Tencent COS CORS 自动配置
- 新增
POST /admin/policies/action与POST /admin/policies/{id}/action,StoragePolicyActionType可扩展动作枚举 configure_tencent_cos_cors从public_site_url派生多 origin,仅替换 ID 为asterdrive-presigned-access的规则- 草稿动作支持复用已保存 policy 凭据
- 触发审计日志
- 新增
-
审计日志结构化详情
- 用户管理、存储策略、团队、会话撤销等操作补全审计快照与展示文案
- 文件 / 文件夹操作补全 location 与 transfer 路径细节
- 标签批量操作、MFA 挑战、passkey 登录、WebDAV、WOPI 改为结构化详情
- 新增
ShareDeleteAuditDetails、UserMfaManageAuditDetails、ExternalAuthUnlinkAuditDetails等 struct
Changed
-
缓存后端精简(Breaking)
- 移除
cache.enabled配置项与 noop cache backend,仅保留 memory / Redis - CacheBackend trait 新增
take_bytes/delete_many - Redis 引入二级回退:Redis 失败或熔断时落本地 MemoryCache,恢复后清理影子条目
- 抽出
RedisClienttrait +FakeRedisClient测试替身
- 移除
-
存储策略前端判断重构
- 移除
isS3CompatibleDriver/isOneDriveDriver/isObjectStorageDriver,改 field-presence 检测 POLICY_OPTION_SERIALIZERS替换为buildPolicyOptionsFallback,仅写非默认值
- 移除
-
上传会话字段统一(DB 迁移自动处理)
- 重命名
s3_temp_key→object_temp_key、s3_multipart_id→object_multipart_id S3_MULTIPART_MIN_PART_SIZE→OBJECT_MULTIPART_MIN_PART_SIZE- OneDrive 凭据存储从
storage_policies.access_key/secret_key迁移到storage_connector_application_configs,旧字段自动清空(代码兼容旧字段回退读取)
- 重命名
-
PWA precache 与 toast 重做
- vite-plugin-pwa 改用 glob 通配 + 关键资源校验,移除手动 precache 清单与 forbidden 列表
- 预缓存预算软告警:entries ≤450、raw size ≤5MB;排除 admin / file browser / music player / PDF / office 等大模块
pwaWarmup区分 user / admin 路由独立追踪- Toaster 主题化(oklch、backdrop-blur、4.2s 时长、i18n.dir 方向)
-
审计日志穷举化
detail_message通配分支改为穷举 match,防止新增 action 被静默遗漏mfa_factor_repo::list_for_user泛化为ConnectionTrait,支持事务内调用
-
依赖升级
- Rust:sea-orm 2.0.0-rc.41、aws-sdk-s3 1.137、h2 0.4.15
- 前端:@base-ui/react 1.6、axios 1.18、react-router-dom 7.18、tailwindcss 4.3.1、biome 2.5、@types/node 26、@typescript/native-preview 7.0.0-dev.20260620.1
Fixed
- PWA precache 大小写敏感漏排除
- 大小写敏感文件系统漏排除补全:新增
assets/**/*admin*、assets/**/*musicPlayer*小写 / camelCase 变体
- 大小写敏感文件系统漏排除补全:新增
Security
- OneDrive OAuth token 与 Client Secret 用 HKDF 派生密钥 + AES-256-GCM 加密落库,API 与审计只暴露
client_secret_configured布尔状态 - 存储策略连接诊断在响应中脱敏 SAS token 与 account key
- OneDrive 创建 / 更新策略时清空 legacy
storage_policies.access_key/secret_key字段,避免明文 secret 长期驻留
Database Migrations
- 新增
m20260612_000001:storage_policy_credential、storage_policy_authorization_flow表(OneDrive OAuth token 加密存储) - 新增
m20260620_000001:3 个 JSON 列 backfill{}并强制 NOT NULL(跨 MySQL / SQLite / PostgreSQL)
Configuration Changes
- 移除
cache.enabled(Breaking) — 缓存开关已失效,仅保留 memory / Redis 两种 backend;已有配置中的cache.enabled字段不再生效 - 新增
auth.storage_credential_secret_key— OneDrive / 后续 OAuth 驱动的凭据加密主密钥(缺失时启动自动生成) - 新增 OneDrive 策略字段:
onedrive_account_mode、onedrive_tenant、onedrive_site_id、onedrive_drive_id、onedrive_group_id、onedrive_scopes等
Statistics
- 316 files changed, 36108 insertions(+), 3381 deletions(-)
- 9 commits
Download
| Platform | Architecture | Archive |
|---|---|---|
| Linux | x86_64 | aster_drive_v0.3.0-beta.1_linux_x86_64.tar.gz |
| Linux | x86 | aster_drive_v0.3.0-beta.1_linux_i686.tar.gz |
| Linux | ARM64 | aster_drive_v0.3.0-beta.1_linux_aarch64.tar.gz |
| Linux | ARMv7 | aster_drive_v0.3.0-beta.1_linux_armv7.tar.gz |
| Windows | x86_64 | aster_drive_v0.3.0-beta.1_windows_x86_64.exe.zip |
| Windows | x86 | aster_drive_v0.3.0-beta.1_windows_i686.exe.zip |
| Windows | ARM64 | aster_drive_v0.3.0-beta.1_windows_arm64.zip |
| macOS | x86_64 | aster_drive_v0.3.0-beta.1_macos_x86_64.tar.gz |
| macOS | ARM64 | aster_drive_v0.3.0-beta.1_macos_aarch64.tar.gz |
Extract with tar -xzf (Linux/macOS) or unzip (Windows).
Checksums: checksums.txt
Verify signatures
All release archives are signed with Sigstore cosign. To verify:
# Download checksums + signature + certificate
wget https://github.com/AsterCommunity/AsterDrive/releases/download/v0.3.0-beta.1/{checksums.txt,checksums.txt.sig,checksums.txt.pem}
# Verify signature
cosign verify-blob checksums.txt \
--signature checksums.txt.sig \
--certificate checksums.txt.pem \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp 'github.com/AptS-1547/AsterDrive'
# Verify archive integrity
sha256sum -c checksums.txtAsterDrive v0.3.0-alpha.5
Release Highlights
AsterDrive 0.3.0-alpha.5 是 0.3.0 系列的第五个预发布版本,聚焦安全加固、文件夹级存储策略绑定、激活流程防枚举以及只读浏览/分享归档下载体验。 本版本将公开分享密码 Cookie、公共直链、预览链接和分享流式播放会话从 auth.jwt_secret 拆分到专用 HMAC 密钥,并在 WebDAV 路径、XML 解析、上传大小校验、分享下载并发等多处加固边界检查;新增文件夹级存储策略绑定(管理员独占)与策略继承解析;激活邮件重发改为防账号枚举的统一响应;文件浏览器引入只读模式并支持分享归档下载;上传重试、缩略图懒加载与 i18n 分包拆分进一步优化前端性能。
- 认证与公开链接密钥隔离(Breaking) — 新增
share_cookie_secret、direct_link_secret,拆分直链/预览/流式播放 token 验签 - 文件夹级存储策略绑定 — 管理员可绑定/清除文件夹策略,上传走最近祖先策略,完整继承解析
- 激活重发防枚举流程 — 登录与激活重发统一响应、强制时延、按结果细分指标
- 分享归档下载与只读浏览 —
FileBrowserProvider只读模式、/s/{token}/archive-download端点、下载限额与中断回滚 - 多模块安全加固 — XXE 防护、WebDAV 路径规范化、锁数量限额、分享 Cookie 绑定客户端、上传实际大小校验
- schema drift 检测 — SeaORM 实体与迁移产物的列定义跨 SQLite/Postgres/MySQL 一致性校验
- 前端性能优化 — i18n 按需分包、登录后 PWA 预热路径、缩略图视窗内拉取、上传重试去抖
Added
-
文件夹级存储策略绑定
- 新增
PUT /api/v1/admin/folders/{id}/policy端点(管理员独占),设置或清除文件夹策略绑定 - 策略继承解析:文件夹继承最近祖先的显式策略,回落至用户/团队策略组
- 上传服务沿文件夹层级解析有效策略
- 审计日志新增
folder_policy_change动作(记录原策略 ID 和新策略 ID) - 访问控制:仅管理员可设置/清除文件夹策略;普通 PATCH 请求拒绝
policy_id字段 - 校验:拒绝不可用策略、锁定/已删除文件夹和断裂的层级链
- 前端
FolderPolicyDialog组件(策略选择、继承可视化、有效策略提示) - 仅管理员可见的右键菜单入口与对话框预加载
- 新增
-
激活重发防枚举流程
- 新增
ActivationResendRequestPanel组件(登录表单内入口、不暴露账号是否存在) - 邮箱字段自动从登录标识符填充
- 后端引入
RegisterActivationResendOutcome枚举(Sent / EmailNotFound / AlreadyActive / AccountDisabled / Cooldown / EmailPolicyRejected) - 通过
record_auth_event按 outcome 发出结构化指标,外部仅看到通用 200 响应 - 邮件策略拒绝时返回通用 200 而非 400,避免泄漏账号状态
apply_auth_mail_response_floor在setup/register/login强制最小响应时延,缓解时序枚举攻击- 登录失败统一收敛为
auth.credentials_failed(凭据错误、待激活、账号禁用同响应) - 引入
LoginFailureReason枚举保留内部上下文用于指标,不写入 API 响应
- 新增
-
分享归档下载(共享 ZIP)
- 新增
POST /s/{token}/archive-download与GET /s/{token}/archive-download/{ticket}端点 stream_ticket_service新增SharedArchiveDownload票据类型task_service::archive::selection新增prepare_shared_archive_download、stream_shared_archive_download- 新增
archive_download_user_enabled、archive_download_share_enabled运行时配置开关 - 新增 API 错误码
ArchiveDownloadUserDisabled、ArchiveDownloadShareDisabled - 分享下载额度与归档下载共用:创建/消费票据时预留与回滚下载计数,客户端中断流式传输时自动回滚
- 新增
-
文件浏览器只读模式
FileBrowserContextValue新增readOnly、selectionEnabled标志FileBrowserContextValue新增getThumbnailPath回调(只读场景注入缩略图)- 只读模式下抑制选择、拖拽、排序和右键菜单,可独立通过
selectionEnabled解锁 - 删除/标签/移动按钮在没有对应 handler 时自动隐藏
useFileBrowserBatchActions新增allowDelete、allowTagManagement选项- 移除
ReadOnlyFileCollection/ReadOnlyFileGrid/ReadOnlyFileTable,用FileBrowserProvider+readOnly模式替代 ShareFolderView改用FileBrowserProvider+ 只读模式,归档下载走shareService.streamArchiveDownload
-
schema drift 检测
- 新增
tests/test_schema_drift.rs::test_entity_columns_match_migrated_database_schema - 跨 SQLite(PRAGMA)、PostgreSQL/MySQL(information_schema.columns)做架构内省
- 通过宏化注册表收集 42 个实体的列定义并与迁移结果比对
- 使用
BTreeSet保证比对顺序确定性
- 新增
-
管理员系统信息端点
- 新增
GET /api/v1/admin/system-info(认证后才暴露构建版本与构建时间) - 前端管理"关于"页展示后端构建时间,缺失/无效时回落到本地化的"未知"
- 新增
formatBuildTime校验时间戳并复用formatDateTime
- 新增
-
WebDAV 单用户锁数量上限
- 新增
webdav.max_active_locks_per_user配置(默认 1024) - 新增
count_active_by_owner仓库函数(统计未过期与无超时锁) - 引入
DavLockPreflightError、DavLockSystem::prepare_lock钩子,事务内复核避免 TOCTOU - 超限返回 HTTP 507 Insufficient Storage(
webdav.lock_limit_exceeded) - 增加用户行级锁(
lock_by_id)确保并发场景下额度判断准确
- 新增
Changed
-
认证与公开链接密钥隔离(Breaking)
- 新增
auth.share_cookie_secret、auth.direct_link_secret,并将公开分享密码验证 Cookie、公共直链、预览链接和分享流式播放会话从auth.jwt_secret拆分到专用 HMAC 密钥 - 已有
data/config.toml在启动时会自动补齐缺失的auth.jwt_secret、auth.share_cookie_secret、auth.direct_link_secret和auth.mfa_secret_key,不会覆盖已有值 - 由于 direct link / preview / stream token 不再接受
auth.jwt_secret验签,升级前生成的公共直链、预览链接和分享流式播放会话 token 会失效,需要重新生成 - 分享密码验证 Cookie 会因
auth.share_cookie_secret切换而失效,用户需要重新输入分享密码
- 新增
-
下载文件名编码(Content-Disposition)
DownloadDisposition抽离到独立download_headers模块- 改为 RFC 5987
filename*=UTF-8''<percent-encoded>格式,使用 actix-web 的ContentDisposition构造器 - 净化
\r、\n、\0等控制字符防止头部注入 - 覆盖所有下载端点(直链、预览链接、归档流)
-
分享密码 Cookie 客户端绑定
- 引入
ShareCookieBinding:将 Cookie MAC 绑定到 user agent SHA256 哈希 + IP 子网(IPv4 /24、IPv6 /64) - HMAC 结构:
share_verified:{token}:ua:{hash}:ip:{subnet} - 合并重复的 cookie 校验为
check_share_cookie/check_share_cookie_ignoring_download_limit - 同子网与同 user agent 内 Cookie 仍有效,阻断跨客户端/跨网络重放
- 引入
-
公共健康检查信息收敛
/health与/ready不再裸返回version、build_time,避免未认证客户端获取构建元数据- 存储就绪失败响应移除
error字段防止驱动细节泄漏 - 健康检查接口直接返回
HealthResponse,不再包裹ApiResponse - 构建元数据移至上文新增的认证后
/admin/system-info端点
-
多部分/直传上传实际大小校验
UploadedMultipartPart携带 part number + size 元数据list_uploaded_parts重命名为list_uploaded_part_details,返回带大小信息- S3 完成流程:拉取每个分片的实际大小、校验序号连续、对比声明总大小,不一致直接
AbortMultipartUpload - 直传流式上传完成后回读 blob 元数据,比对声明大小并对照策略上限,复核配额
- 校验失败清理 preuploaded blob,防止客户端绕过配额
-
WebDAV 路径规范化与 XXE 防护
- 引入
PathEscape错误,先做百分号解码、再做./..段折叠 - 拒绝带前置
..段(含%2e%2e等编码变体)逃逸挂载根的路径 - 集合资源保留尾部斜杠
- 在 PROPFIND / PROPPATCH / LOCK / REPORT 解析前调用
reject_xml_dtd_or_entity,检测<!DOCTYPE、<!ENTITY - 触发时返回 403 +
<no-external-entities/>错误体(带xmlns:D命名空间)
- 引入
-
WebDAV 锁错误模型
- 引入
DavLockError(Conflict/LimitExceeded/Backend)取代Result<DavLock, DavLock>,使锁冲突与额度耗尽返回不同响应 Backend用于数据库失败,映射 HTTP 500- 增加结构化 tracing:包含路径、实体类型/ID 与错误细节
- 锁额度校验从
prepare_lockno-op 修正为实际生效,刷新 timeout 前先校验 scope - 默认无 Timeout 头时使用
MAX_LOCK_DURATION_SECS(7 天)替代"无限"语义,并拒绝可能溢出 chrono 的超大值
- 引入
-
WebDAV 缓存认证复核
CachedWebdavAuth新增account_id,命中缓存时通过 DB 直接复核validate_cached_scope替换为validate_cached_account:复核账号 username、user/team/folder ID 与启用状态- 账号被禁用或字段变化时立即让缓存失效并返回
AuthForbidden - 校验 cached 密码哈希,防止旧凭据继续命中
-
WOPI 安全增强
- 新增
X-WOPI-Token头作为首选认证途径,query 参数 fallback 兼容旧客户端 - 所有 WOPI 响应附加
Cache-Control: no-store,避免 token 通过浏览器缓存泄漏 access_tokenquery 参数由必填改为可选- 默认 WOPI access token TTL 从 60 分钟降为 15 分钟
- 新增
-
分享下载计数原子性
increment_download_count成功后立即重读 share 记录,避免使用 stale 内存值做 limit 检查- 用直接
>=重读后的计数器替代saturating_add(1)比较 - 重载失败时记录 warning 并回落缓存失效
- 调试日志补充
share_id、download_count、max_downloads
-
管理后台量纲单位输入控件
- 新增
AdminNumberUnitInput通用数值 + 单位下拉控件 - 配额输入由硬编码 MB 替换为
AdminStorageQuotaInput(字节 → TB) - 系统设置中的缩放数值字段统一使用共享的单位组件
- 系统设置说明文案移到 help trigger tooltip 后面,降低视觉噪音
- 缩放数值控件加入实时校验:拒绝超
Number.MAX_SAFE_INTEGER的换算结果、保留无效草稿与显示单位 AdminTeamDetailDialog配额状态合并为单一quotaDraftOveride,修正 save/delete/restore 时的 stale draft 行为- 配额校验接受 0 与正整数;非正乘数与负向换算被 schema 拒绝
- 新增
-
前端缩略图与认证缓存隔离
- 持久化用户缓存仅保留 profile、preferences、token 过期时间,剥离
id/email/role/storage - 读取既有缓存时迁移并清除敏感字段
- 缩略图缓存命名空间从用户 ID 派生改为 sessionStorage 中的 session UUID
- 会话过期时清理命名空间
- 持久化用户缓存仅保留 profile、preferences、token 过期时间,剥离
-
前端 i18n 与 PWA 预热重排
- 拆分 i18n 加载为 authenticated shell 与完整 bundle,shell 仅含 core/files/tasks/share/search/errors/offline
- 登录成功路径直接预热 shell i18n 与文件浏览器路由
- 用户路由预热在登录后路径触发后跳过,避免重复
- 预览引擎按需在进入文件浏览器时预热
App鉴权检查与 shell i18n 全部 ready 后再渲染认证路由,避免未翻译闪烁- Service Worker 静态资源缓存策略由 StaleWhileRevalidate 改为 CacheFirst,离线场景更稳
-
前端文件浏览器 / 上传 / 缩略图体验
useEnteredViewport增加trackVisibility/isInViewport;FileThumbnail仅在视窗内拉取- 持久化缩略图按 ETag 做后台 revalidation;离开视窗时清理 blob URL 释放内存
useUploadAreaUploads增加retryingTaskIdsRef集合,去抖并发重试触发summarizeUploadTasks进度分母改用progressCount,按尺寸加权UploadPanel引入taskRowKey、向 virtualizer 传getItemKey,状态变化时不复用旧行FolderPolicyDialog与FileBrowserPage多个 UI 状态迁移到useReducer,加入targetKey哨兵丢弃过期异步结果- 升级到
@testing-library/user-event模拟真实交互
-
路由与延迟加载
- 引入
localizedLazyPagehelper,在渲染 lazy 页面前预加载所需 i18n 命名空间 AdminRoute渲染前预加载admin、core命名空间,失败降级并 warn- 调整
/external-auth/links路由顺序,避免被/{kind}/{provider}通配吞掉
- 引入
-
token 生成方案
new_share_token()由 8 字符 base62 改为 32 字符 UUID v4 hex- 移除自定义字符集与未使用的
rand::RngExt引用
-
窗口跳转安全属性
- 分享视图下载与文件夹下载的
window.open全部传入noopener,noreferrer三参数
- 分享视图下载与文件夹下载的
-
依赖更新
nom-exif3.6.0 → 3.6.1,aws-smithy-types1.4.9 → 1.5.0,aws-smithy-eventstream0.60.20 → 0.60.21block-buffer、cc、memchr、regex、regex-syntax、rust_decimal、smallvec、time/time-core/time-macros、uuid、zerocopy/zerocopy-derive等小幅更新- 移除未使用的
powerfmt依赖 Cargo.toml新增AptS-1543作为作者
Fixed
-
分享归档下载并发与回滚
- 创建/消费归档票据时预留并回滚分享下载计数
- 客户端中断或下游流失败时将下载计数回滚到 0,错误日志补充
share_id - 缓存校验后的文件夹 ID,避免重复鉴权
FileCardcheckbox 的onChangefallback 防止未定义 handler 报错
-
管理员配额草稿
quotaValueToBytes比较实际字节值而非显示字符串,避免误判变化AdminNumberUnitInput在invalidState时为数字输入和单位选择器都加 destructive 边框- 单位变化 handler 改为基于 units 数组匹配,避免空值类型不安全比较
- 草稿无效时保留显示而非静默丢弃
UserDetailDialogBody拆分为 Content / Footer / Profile / Security 子组件,提高可读性
-
路由防护与并发刷新
test_concurrent_refresh_same_token_has_single_winner中为获胜 token 种入 CSRF tokenrouteGuards.test.tsx补充ensureI18nNamespaces与 logger mock,新增管理员 locale 加载失败用例
-
杂项修复
- 远端驱动
list_uploaded_part_details过滤无效 part number(≤0) - S3
list_parts翻页缺next_part_number_marker时正确处理 - MFA 测试断言更新为
401 UNAUTHORIZED+auth.credentials_failed,与未验证邮箱登录现行行为一致 - 分享下载并发测试隔离到独立的 SQLite 文件,并使用 pool-size-1 的连接避免共享态干扰
- 远端驱动
Security
- 公开分享密码 Cookie / 公共直链 / 预览链接 / 分享流式播放会话切换到独立 HMAC 密钥
- 分享密码 Cookie 绑定 user agent 哈希与 IP 子网,阻断跨客户端重放
- 多部分与直传上传校验实际上传大小、对照策略上限、按真实大小判额
- WebDAV 路径规范化阻断目录穿越(含百分号编码
..变体) - WebDAV XML 端点拒绝 DTD/ENTITY,缓解 XXE
- WebDAV 单用户活跃锁数量限额,避免资源滥用
- 登录与激活重发统一错误码 + 响应时延下限,缓解账号枚举
- 健康检查不再泄漏版本与构建时间,存储就绪不再泄漏驱动错误细节
- WOPI 优先头部认证、响应
Cache-Control: no-store、默认 TTL 缩短到 15 分钟 - 持久化的用户缓存剥离 ID/email/role/storage 等敏感字段
- 缩略图缓存命名空间从用户 ID 切换为 session UUID
- 共享 RFC 5987 编码净化
\r/\n/\0,防 Content-Disposition 头注入 window.open调用统一附加noopener,noreferrer,防 tabnabbing 与 referrer 泄漏- WebDAV 缓存认证命中时复核账号状态与密码哈希
Testi...
AsterDrive v0.3.0-alpha.4
Release Highlights
AsterDrive 0.3.0-alpha.4 聚焦 PWA 启动性能审计、API 错误码细粒度分类、Service Worker 缓存优化和数据库类型约束统一。 本版本新增启动性能监测工具链,可自动生成性能报告和 Web Vitals 指标;API 错误码按模块(search, policy, storage, tasks)分层细化,提升调试和文档准确度;Service Worker 缓存策略重构以支持精细粒度版本控制;运行时数据库类型约束统一为 DatabaseConnection,移除 ConnectionTrait 泛型冗余。同时更新安全策略文档支持分支标识为 master,修复文档示例。
- PWA 启动性能审计 — 自动化性能测试脚本、Web Vitals 指标收集、HTML 报告生成
- API 错误码细粒度分类 — search / policy / storage / tasks 模块独立错误码集
- Service Worker 缓存优化 — 支持版本级别缓存隔离和更新策略
- 数据库类型约束统一 —
ConnectionTrait泛型移除,使用DatabaseConnectiontrait object - 文档和配置更新 — 安全策略分支引用更新、Cargo.toml 优化
Added
-
PWA 启动性能审计工具
- 新增
frontend-panel/scripts/audit-startup.mjs自动化审计脚本 - Web Vitals 指标收集(LCP、FID、CLS、FCP、TTFB)
- HTML 报告生成,支持分数评级和详细指标
- 性能基线和阈值检测
- 新增
-
API 错误码细粒度分类(Breaking)
search模块:search.invalid_query、search.query_timeout等policy模块:policy.not_found、policy.driver_type_mismatch等storage模块:storage.quota_exceeded、storage.access_denied等tasks模块:tasks.not_found、tasks.invalid_state等- 文档同步更新,所有错误码映射到细分类别
-
Service Worker 缓存版本隔离
- 版本级别缓存键支持(cache name 包含应用版本)
- PWA 路由预热阶段增强
- 缓存更新和清理策略优化
Changed
-
数据库访问类型统一(Breaking on internal API)
ConnectionTrait泛型完全移除- 所有服务层和 API 路由使用
DatabaseConnectiontrait object - 零成本抽象,行为完全一致
- 影响 40+ 个文件
-
文档和配置更新
SECURITY.md支持分支从main更新为masterCONTRIBUTING.md示例仓库 URL 更新Cargo.tomlrelease 配置:strip = false→strip = true
Fixed
- 启动性能测试覆盖
- 新增
frontend-panel/src/lib/pwaWarmupLoaders.test.ts单元测试 - 改进初始化路由加载逻辑验证
- 新增
Database Migrations
无新增迁移。
Statistics
- 150 files changed, 3676 insertions(+), 1022 deletions(-)
- 6 commits
Download
| Platform | Architecture | Archive |
|---|---|---|
| Linux | x86_64 | aster_drive_v0.3.0-alpha.4_linux_x86_64.tar.gz |
| Linux | x86 | aster_drive_v0.3.0-alpha.4_linux_i686.tar.gz |
| Linux | ARM64 | aster_drive_v0.3.0-alpha.4_linux_aarch64.tar.gz |
| Linux | ARMv7 | aster_drive_v0.3.0-alpha.4_linux_armv7.tar.gz |
| Windows | x86_64 | aster_drive_v0.3.0-alpha.4_windows_x86_64.exe.zip |
| Windows | x86 | aster_drive_v0.3.0-alpha.4_windows_i686.exe.zip |
| Windows | ARM64 | aster_drive_v0.3.0-alpha.4_windows_arm64.zip |
| macOS | x86_64 | aster_drive_v0.3.0-alpha.4_macos_x86_64.tar.gz |
| macOS | ARM64 | aster_drive_v0.3.0-alpha.4_macos_aarch64.tar.gz |
Extract with tar -xzf (Linux/macOS) or unzip (Windows).
Checksums: checksums.txt
Verify signatures
All release archives are signed with Sigstore cosign. To verify:
# Download checksums + signature + certificate
wget https://github.com/AptS-1547/AsterDrive/releases/download/v0.3.0-alpha.4/{checksums.txt,checksums.txt.sig,checksums.txt.pem}
# Verify signature
cosign verify-blob checksums.txt \
--signature checksums.txt.sig \
--certificate checksums.txt.pem \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp 'github.com/AptS-1547/AsterDrive'
# Verify archive integrity
sha256sum -c checksums.txtAsterDrive v0.3.0-alpha.3
Release Highlights
AsterDrive 0.3.0-alpha.3 是 0.3.0-alpha.2 的发布流水线修正版。二者在应用代码、数据库迁移、运行时配置和用户可见功能上等价;alpha.3 仅用于重新发布完整的 GitHub Release 资产。 0.3.0-alpha.2 的首次发布触发了 GitHub immutable release 限制,导致部分归档资产未能上传完成;本版本通过先创建 draft release、上传全部资产后再发布,修复该发布流程问题。由于本次修正只影响 GitHub Release 发布流程,Docker 镜像或镜像内版本元数据可能仍标识为 0.3.0-alpha.2,这与 0.3.0-alpha.3 的应用层内容等价。
Changed
- 发布流程修复
- GitHub Release 现在先以 draft 形式创建并上传全部归档资产,再发布为正式 release / prerelease
- 避免 immutable release 仓库中 release 已发布后继续上传 assets 导致失败
v0.3.0-alpha.3与v0.3.0-alpha.2的应用层变更等价,完整功能变更见v0.3.0-alpha.2- Docker 镜像或镜像内版本元数据可能仍显示为
0.3.0-alpha.2,属于发布标识差异,不代表功能或代码差异
Download
| Platform | Architecture | Archive |
|---|---|---|
| Linux | x86_64 | aster_drive_v0.3.0-alpha.3_linux_x86_64.tar.gz |
| Linux | x86 | aster_drive_v0.3.0-alpha.3_linux_i686.tar.gz |
| Linux | ARM64 | aster_drive_v0.3.0-alpha.3_linux_aarch64.tar.gz |
| Linux | ARMv7 | aster_drive_v0.3.0-alpha.3_linux_armv7.tar.gz |
| Windows | x86_64 | aster_drive_v0.3.0-alpha.3_windows_x86_64.exe.zip |
| Windows | x86 | aster_drive_v0.3.0-alpha.3_windows_i686.exe.zip |
| Windows | ARM64 | aster_drive_v0.3.0-alpha.3_windows_arm64.zip |
| macOS | x86_64 | aster_drive_v0.3.0-alpha.3_macos_x86_64.tar.gz |
| macOS | ARM64 | aster_drive_v0.3.0-alpha.3_macos_aarch64.tar.gz |
Extract with tar -xzf (Linux/macOS) or unzip (Windows).
Checksums: checksums.txt
Verify signatures
All release archives are signed with Sigstore cosign. To verify:
# Download checksums + signature + certificate
wget https://github.com/AptS-1547/AsterDrive/releases/download/v0.3.0-alpha.3/{checksums.txt,checksums.txt.sig,checksums.txt.pem}
# Verify signature
cosign verify-blob checksums.txt \
--signature checksums.txt.sig \
--certificate checksums.txt.pem \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp 'github.com/AptS-1547/AsterDrive'
# Verify archive integrity
sha256sum -c checksums.txt