Use individual redirect url for each Mastodon domain

O01eg
Jul 31, 2024, 1:21 PM
V47NQLKFHWLZMRGEVV2K6IBBKRSPHR672ATFGARCCM7Z7LJZKQHAC

Dependencies

  • [2] RSIBXP3S Fix redirect URL
  • [3] MGRTVGLJ Redirect to Mastodon domain
  • [4] WXRGEQOE Add HTTP client dependency
  • [5] KDKRTAYJ Register application on Mastodon domain
  • [6] MUTHALNP Detect user and domain in Mastodon fediverse
  • [7] BUW254XB Update toml dependency
  • [8] ZQIIC7C3 Add field to store timestamp of joining game
  • [9] QEK76JYT Process and log template render error
  • [10] GPDKRFZZ Update dependencies
  • [11] G4JCZ5F7 Store try to register on Mastodon domain
  • [12] BCMU6UYK Start login mastodon form
  • [13] BCXEUKX6 Add config, static files and web server
  • [14] WM64YAQL Fix warnings
  • [*] FUCFD4UV Add log in and log out support
  • [*] 4MZ4VIR7 Initial commit
  • [*] HTYEGVBU Add data to reset password page
  • [*] FJBHDA5F Update dependencies
  • [*] K7FOI6UN Update dependencies and fix game link
  • [*] OWZ67OEC Add openssl dependency
  • [*] BKHQHXZQ Manage secure key for cookies
  • [*] WVHXYKCV Add postgresql pools

Change contents

  • replacement in src/pages/log_in.rs at line 157
    [4.382][2.0:79]()
    let website_redirect = format!("{}{}", website, "mastodon-redirect.html");
    [4.382]
    [4.382]
    let website_redirect = format!("{}mastodon-redirect-{}.html", website, domain);
  • edit in src/pages/log_in.rs at line 297
    [4.713]
    [4.713]
    return HttpResponse::ServiceUnavailable().body(actix_web::body::None::new());
    }
    };
    let stmt_save = match dbclient_rw
    .prepare(
    "UPDATE auth.mastodon_apps
    SET client_id = $1
    , client_secret = $2
    WHERE client_id IS NULL
    AND client_secret IS NULL
    AND reg_sess_id = $3
    AND domain = $4;",
    )
    .await
    {
    Ok(stmt) => stmt,
    Err(e) => {
    log::error!("Pool RW statement save error {}", e);
  • replacement in src/pages/log_in.rs at line 347
    [4.1726][4.3224:3919]()
    let (client_id, _client_secret) =
    if let (Some(client_id), Some(client_secret)) = (opt_client_id, opt_client_secret) {
    (client_id, client_secret)
    } else {
    if reg_sess_id != old_reg_sess_id {
    // Some one else registering same domain, try again later
    log::warn!(
    "Mastodon domain {} registration session {} conflict with {}",
    domain,
    reg_sess_id,
    old_reg_sess_id
    );
    return HttpResponse::Found()
    .append_header((header::LOCATION, "index.html"))
    .finish();
    }
    [4.1726]
    [4.3919]
    let (client_id, _client_secret) = if let (Some(client_id), Some(client_secret)) =
    (opt_client_id, opt_client_secret)
    {
    (client_id, client_secret)
    } else {
    if reg_sess_id != old_reg_sess_id {
    // Some one else registering same domain, try again later
    log::warn!(
    "Mastodon domain {} registration session {} conflict with {}",
    domain,
    reg_sess_id,
    old_reg_sess_id
    );
    return HttpResponse::Found()
    .append_header((header::LOCATION, "index.html"))
    .finish();
    }
  • replacement in src/pages/log_in.rs at line 365
    [4.3920][4.3920:4107]()
    // Try to register on Mastodon domain
    match register_in_mastodon(&domain, &reg_sess_id, &data).await {
    Ok(res) => res,
    Err(_) => {
    [4.3920]
    [4.4107]
    // Try to register on Mastodon domain
    match register_in_mastodon(&domain, &reg_sess_id, &data).await {
    Ok(res) => {
    let updated = match dbclient_rw
    .execute(&stmt_save, &[&res.0, &res.1, &reg_sess_id, &domain])
    .await
    {
    Ok(c) => c,
    Err(e) => {
    log::error!("Pool RW execute update error {}", e);
    return HttpResponse::ServiceUnavailable()
    .body(actix_web::body::None::new());
    }
    };
    if updated == 1 {
    res
    } else {
    log::error!("Pool RW execute update row error {}", updated);
  • replacement in src/pages/log_in.rs at line 386
    [4.4237][4.4237:4248]()
    };
    [4.4237]
    [4.1488]
    Err(_) => {
    return HttpResponse::ServiceUnavailable().body(actix_web::body::None::new());
    }
    }
    };
  • replacement in src/pages/log_in.rs at line 400
    [3.75][3.75:317]()
    let website_redirect = format!("{}{}", website, "mastodon-redirect.html");
    let location = format!("https://{}/oauth/authorize?client_id={}&scope=read:accounts&redirect_uri={}&response_type=code", domain, client_id, website_redirect);
    [3.75]
    [4.1531]
    let website_redirect = format!("{}mastodon-redirect-{}.html", website, domain);
    let location = format!("https://{}/oauth/authorize?client_id={}&scope=read:accounts&redirect_uri={}&response_type=code", domain, pct_str::PctString::encode(client_id.chars(), pct_str::URIReserved).as_str(), pct_str::PctString::encode(website_redirect.chars(), pct_str::URIReserved).as_str());
  • edit in Cargo.toml at line 18
    [4.73][4.73:87]()
    awc = "3.0.0"
  • edit in Cargo.toml at line 29
    [18.2576]
    [18.2576]
    [dependencies.awc]
    version = "3.0"
    features = ["openssl"]
  • edit in Cargo.lock at line 160
    [19.1040]
    [4.11397]
    "openssl",
  • edit in Cargo.lock at line 163
    [19.1051]
    [20.277]
    "tokio-openssl",
  • edit in Cargo.lock at line 429
    [4.882]
    [4.882]
    "openssl",
  • edit in Cargo.lock at line 836
    [21.272]
    [4.20150]
    name = "foreign-types"
    version = "0.3.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
    dependencies = [
    "foreign-types-shared",
    ]
    [[package]]
    name = "foreign-types-shared"
    version = "0.1.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
    [[package]]
  • edit in Cargo.lock at line 1406
    [19.12263]
    [22.3452]
    [[package]]
    name = "openssl"
    version = "0.10.66"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1"
    dependencies = [
    "bitflags 2.6.0",
    "cfg-if",
    "foreign-types",
    "libc",
    "once_cell",
    "openssl-macros",
    "openssl-sys",
    ]
    [[package]]
    name = "openssl-macros"
    version = "0.1.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
    dependencies = [
    "proc-macro2",
    "quote",
    "syn",
    ]
  • edit in Cargo.lock at line 1434
    [22.3465]
    [4.27883]
    name = "openssl-sys"
    version = "0.9.103"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6"
    dependencies = [
    "cc",
    "libc",
    "pkg-config",
    "vcpkg",
    ]
    [[package]]
  • edit in Cargo.lock at line 2088
    [23.8311]
    [23.8311]
    name = "tokio-openssl"
    version = "0.6.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "6ffab79df67727f6acf57f1ff743091873c24c579b1e2ce4d8f53e47ded4d63d"
    dependencies = [
    "futures-util",
    "openssl",
    "openssl-sys",
    "tokio",
    ]
    [[package]]
  • edit in Cargo.lock at line 2328
    [4.42650]
    [19.22220]
    name = "vcpkg"
    version = "0.2.15"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
    [[package]]