Proton Drive

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 前后的复杂任务,特别是复杂的加密方案,使开发人员能够在此代码库的基础上为其他软件实现功能。由于没有官方文档,这个库可能存在不少错误。