Proton Drive
Proton Drive 是一个端到端加密的瑞士文件保险箱,可保护你的数据。
这是一个用于 Proton Drive 的 rclone 后端,它使用相同的客户端加密技术,支持 Proton Drive 的文件传输功能。
由于 Proton Drive 并未公布其 API 文档,此后端是通过阅读开源的客户端源代码并观察浏览器中的 Proton Drive 流量,尽力实现的。
注意:此后端目前处于测试版。我们认为它是正确的,并且所有集成测试都已通过。然而,Proton Drive 协议会随着时间不断发展,可能存在某些账户与之不兼容的情况。如果你发现不兼容的问题,请在 rclone 论坛上发帖反馈。
路径的指定格式为 remote:path
。
路径可以根据需要设置得很深,例如 remote:directory/subdirectory
。
配置
以下是一个创建名为 remote
的远程存储的示例。首先运行:
rclone config
这将引导你完成一个交互式的设置过程:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Proton Drive
\ "protondrive"
[snip]
Storage> protondrive
User name
user> [email protected]
Password.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank
y/g/n> y
Enter the password:
password:
Confirm the password:
password:
Option 2fa.
2FA code (if the account requires one)
Enter a value. Press Enter to leave empty.
2fa> 123456
Remote config
Configuration complete.
Options:
- type: protondrive
- user: [email protected]
- pass: *** ENCRYPTED ***
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
注意:Proton Drive 加密密钥需要在通过浏览器正常登录后已经生成,否则尝试在 rclone
中使用这些凭证将会失败。
配置完成后,你可以像这样使用 rclone
:
列出 Proton Drive 顶层目录
rclone lsd remote:
列出 Proton Drive 中的所有文件
rclone ls remote:
将本地目录复制到 Proton Drive 中名为 backup 的目录
rclone copy /home/source remote:backup
修改时间和哈希值
Proton Drive Bridge 目前尚不支持更新修改时间。
支持 SHA1 哈希算法。
受限文件名字符
无效的 UTF-8 字节将被替换,同时左右空格也会被移除(代码参考)
重复文件
Proton Drive 中不能存在两个名称和路径完全相同的文件。如果发生冲突,根据高级配置,文件可能会被覆盖,也可能不会。
邮箱密码
请在高级配置部分设置你的邮箱密码。
缓存
当前的缓存机制是基于 rclone 是唯一对挂载点执行操作的实例这一情况构建的。事件系统(即 Proton API 系统,用于提供驱动器上更改情况的可见性)尚未实现,因此其他客户端的更新不会反映在缓存中。因此,如果有多个客户端同时访问同一个挂载点,可能会出现缓存陈旧数据的问题。
标准选项
以下是 Proton Drive 特定的标准选项。
–protondrive-username
你的 Proton 账户用户名
属性:
- 配置项:username
- 环境变量:RCLONE_PROTONDRIVE_USERNAME
- 类型:字符串
- 是否必需:是
–protondrive-password
你的 Proton 账户密码。
注意:输入此选项的值必须进行加密处理 - 请参阅 rclone obscure。
属性:
- 配置项:password
- 环境变量:RCLONE_PROTONDRIVE_PASSWORD
- 类型:字符串
- 是否必需:是
–protondrive-2fa
2FA 验证码
该值也可以通过 --protondrive-2fa=000000
来提供。
如果你的 Proton Drive 账户启用了双因素认证,则需要提供 2FA 验证码。
属性:
- 配置项:2fa
- 环境变量:RCLONE_PROTONDRIVE_2FA
- 类型:字符串
- 是否必需:否
高级选项
以下是 Proton Drive 特定的高级选项。
–protondrive-mailbox-password
你的双密码 Proton 账户的邮箱密码。
有关邮箱密码的更多信息,请查看以下官方知识库文章: https://proton.me/support/the-difference-between-the-mailbox-password-and-login-password
注意:输入此选项的值必须进行加密处理 - 请参阅 rclone obscure。
属性:
- 配置项:mailbox_password
- 环境变量:RCLONE_PROTONDRIVE_MAILBOX_PASSWORD
- 类型:字符串
- 是否必需:否
–protondrive-client-uid
客户端 UID 密钥(仅供内部使用)
属性:
- 配置项:client_uid
- 环境变量:RCLONE_PROTONDRIVE_CLIENT_UID
- 类型:字符串
- 是否必需:否
–protondrive-client-access-token
客户端访问令牌密钥(仅供内部使用)
属性:
- 配置项:client_access_token
- 环境变量:RCLONE_PROTONDRIVE_CLIENT_ACCESS_TOKEN
- 类型:字符串
- 是否必需:否
–protondrive-client-refresh-token
客户端刷新令牌密钥(仅供内部使用)
属性:
- 配置项:client_refresh_token
- 环境变量:RCLONE_PROTONDRIVE_CLIENT_REFRESH_TOKEN
- 类型:字符串
- 是否必需:否
–protondrive-client-salted-key-pass
客户端加盐密钥密码(仅供内部使用)
属性:
- 配置项:client_salted_key_pass
- 环境变量:RCLONE_PROTONDRIVE_CLIENT_SALTED_KEY_PASS
- 类型:字符串
- 是否必需:否
–protondrive-encoding
后端的编码方式。
有关更多信息,请参阅 概述中的编码部分。
属性:
- 配置项:encoding
- 环境变量:RCLONE_PROTONDRIVE_ENCODING
- 类型:Encoding
- 默认值:Slash,LeftSpace,RightSpace,InvalidUtf8,Dot
–protondrive-original-file-size
返回加密前的文件大小
加密后的文件大小与原始文件大小不同(通常更大)。除非有必要返回加密后的文件大小,否则请将此选项设置为 true,因为像 Open()
这样需要提供原始内容大小的功能将无法正常工作。
属性:
- 配置项:original_file_size
- 环境变量:RCLONE_PROTONDRIVE_ORIGINAL_FILE_SIZE
- 类型:布尔值
- 默认值:true
–protondrive-app-version
应用程序版本字符串
应用程序版本字符串表示当前执行 API 请求的客户端。此信息是必需的,并且会随每个 API 请求一起发送。
属性:
- 配置项:app_version
- 环境变量:RCLONE_PROTONDRIVE_APP_VERSION
- 类型:字符串
- 默认值:“[email protected]+rclone”
–protondrive-replace-existing-draft
检测到文件名冲突时创建新的版本
当文件上传在完成前被取消或失败时,会创建一个草稿,后续将同一文件上传到同一位置时会被报告为冲突。
该值也可以通过 --protondrive-replace-existing-draft=true
来设置。
如果将此选项设置为 true,草稿将被替换,然后上传操作将重新开始。如果有其他客户端同时在同一文件位置上传文件,当前行为未知。集成测试需要将此选项设置为 true。 如果将此选项设置为 false,将返回错误信息 “存在草稿 - 通常这意味着有其他客户端正在上传文件,或者之前的上传尝试失败”,并且不会进行上传操作。
属性:
- 配置项:replace_existing_draft
- 环境变量:RCLONE_PROTONDRIVE_REPLACE_EXISTING_DRAFT
- 类型:布尔值
- 默认值:false
–protondrive-enable-caching
缓存文件和文件夹的元数据以减少 API 调用
注意:如果将 ProtonDrive 作为 VFS 挂载,请禁用此功能,因为当前实现无法在外部发生更改时更新或清除缓存。
ProtonDrive 上的文件和文件夹以带有密钥环的链接形式表示,可以对其进行缓存以提高性能并减轻 API 服务器的负担。
当前的缓存机制是基于 rclone 是唯一对挂载点执行操作的实例这一情况构建的。事件系统(即 Proton API 系统,用于提供驱动器上更改情况的可见性)尚未实现,因此其他客户端的更新不会反映在缓存中。因此,如果有多个客户端同时访问同一个挂载点,可能会出现缓存陈旧数据的问题。
属性:
- 配置项:enable_caching
- 环境变量:RCLONE_PROTONDRIVE_ENABLE_CACHING
- 类型:布尔值
- 默认值:true
–protondrive-description
远程存储的描述。
属性:
- 配置项:description
- 环境变量:RCLONE_PROTONDRIVE_DESCRIPTION
- 类型:字符串
- 是否必需:否
限制
此后端使用了 Proton-API-Bridge,它基于 go-proton-api,而后者是 官方仓库 的一个分支。
Proton Drive 没有提供官方的 API 文档。不过,由于 Proton 开源了 proton-go-api 以及 Web、iOS 和 Android 客户端代码库,我们无需通过观察 Web 客户端流量来完全逆向工程这些 API!
proton-go-api 提供了 API 调用和错误处理的基本构建块,例如 429 指数退避,但它基本上只是 Proton API 的一个基础接口。例如,该库没有提供 Proton Drive 文件的加密和解密功能。
Proton-API-Bridge 试图填补这一空白,以便可以在此基础上快速构建 rclone。该代码库处理调用 Proton API 前后的复杂任务,特别是复杂的加密方案,使开发人员能够在此代码库的基础上为其他软件实现功能。由于没有官方文档,这个库可能存在不少错误。