#proton #rest #api-bindings #api

proton-api-rs

Rust中Proton REST API的非官方实现

26个版本 (13个破坏性更新)

0.14.0 2023年9月13日
0.12.0 2023年8月7日
0.11.0 2023年7月16日
0.5.3 2023年3月26日

1582Web编程

Download history 11/week @ 2024-04-01

每月下载 149

AGPL-3.0-only

95KB
2.5K SLoC

Rust中对Proton REST API的非官方绑定

此项目旨在在Rust中实现Proton REST API。它完全基于从 go-proton-apiProton Bridge 仓库中可用的信息。

免责声明

这是一个 非官方 项目,处于 开发中。自行承担此仓库中代码的风险。如果发生数据丢失或账户被封锁,项目作者将不承担任何责任。

构建要求

  • Rust
  • Go >= 1.19

此库当前使用一个Go库来处理身份验证的SRP部分。虽然Rust有srpcrate可用,但为了避免与Proton服务器的问题,我们目前使用go-proton-api内部使用的库。

安全性

此项目当前需要使用unsafe与srp的Go绑定进行交互


lib.rs:

Proton REST API的非官方Rust绑定。它完全基于从 go-proton-apiProton Bridge 仓库中可用的信息。

免责声明

这些是 非官方 绑定,自行承担风险。如果你遇到数据丢失或账户被封锁,作者将不承担责任。

入门

异步登录新会话

use proton_api_rs::{http, Session, SessionType, http::Sequence};
use proton_api_rs::domain::SecretString;
async fn example<T:http::ClientAsync>() {
    let client = http::ClientBuilder::new()
        .user_agent("MyUserAgent/0.0.0")
        .base_url("server_url")
        .app_version("[email protected]")
        .build::<T>().unwrap();

    let session = match Session::login(&"[email protected]", &SecretString::new("my_proton_password".into()), None).do_async(&client).await.unwrap(){
        // Session is authenticated, no 2FA verifications necessary.
        SessionType::Authenticated(c) => c,
        // Session needs 2FA TOTP auth.
        SessionType::AwaitingTotp(t) => {
            t.submit_totp("000000").do_async(&client).await.unwrap()
        }
    };

    // session is now authenticated and can access the rest of the API.
    // ...

    session.logout().do_async(&client).await.unwrap();
}

同步登录新会话

use proton_api_rs::{Session, http, SessionType, http::Sequence};
use proton_api_rs::domain::SecretString;
fn example<T:http::ClientSync>() {
    let client = http::ClientBuilder::new()
        .user_agent("MyUserAgent/0.0.0")
        .base_url("server_url")
        .app_version("[email protected]")
        .build::<T>().unwrap();

    let session = match Session::login("[email protected]", &SecretString::new("my_proton_password".into()), None).do_sync(&client).unwrap(){
        // Session is authenticated, no 2FA verifications necessary.
        SessionType::Authenticated(c) => c,
        // Session needs 2FA TOTP auth.
        SessionType::AwaitingTotp(t) => {
            t.submit_totp("000000").do_sync(&client).unwrap()
        }
    };

    // session is now authenticated and can access the rest of the API.
    // ...

    session.logout().do_sync(&client).unwrap();
}

使用先前会话的令牌登录

use proton_api_rs::{http, Session, SessionType, http::Sequence};
use proton_api_rs::domain::UserUid;

async fn example<T:http::ClientAsync>() {
    let user_uid = "user_uid".into();
    let user_refresh_token = "token";
    let client = http::ClientBuilder::new()
        .user_agent("MyUserAgent/0.0.0")
        .base_url("server_url")
        .app_version("[email protected]")
        .build::<T>().unwrap();

    let session = Session::refresh(&user_uid, &user_refresh_token).do_async(&client).await.unwrap();

    // session is now authenticated and can access the rest of the API.
    // ...

    session.logout().do_async(&client).await.unwrap();
}

依赖项

~2–17MB
~258K SLoC