Implement revoking delegation

O01eg
Oct 22, 2022, 1:35 PM
D3RL62X5NQTWDZXMDHAXS7K5GSTCCEH7L3YT5JMTPWJON3WKRKUAC

Dependencies

  • [2] B7PYGLH3 Show delegate bold if it's logged user itself
  • [3] NY766BOQ Accept form to add player
  • [4] 5RQCVFRH Start leave game form
  • [5] HZDCKIXQ Use constants for templates
  • [6] EVP2FSBH Split index page
  • [7] LTQCLSBU Split database usage in pages
  • [8] YDWTHWAI Show form to revoke delegation
  • [9] WW3KRXX6 Add page for reset game password
  • [10] WVHXYKCV Add postgresql pools
  • [11] 6NYILMKI Add page for slow game
  • [12] DNFB7TNI Add new pages and links to slow games and reset game password
  • [13] OJO4B4QO Add login form and empty handler
  • [14] 6BDGQ4VM Show player names for registered players
  • [*] 4MZ4VIR7 Initial commit

Change contents

  • replacement in src/templates/slow-game.html at line 73
    [2.307][2.307:393]()
    <form id="revoke-delegate" action="revoke-delegate.do" method="post">
    [2.307]
    [2.393]
    <form id="revoke-delegate-{{ player.revoke_delegate_data.csrf }}" action="revoke-delegate.do" method="post">
  • edit in src/pages/slow_game.rs at line 384
    [3.2903]
    pub async fn post_revoke_delegate(
    request: HttpRequest,
    form: web::Form<JoinLeaveData>,
    data: web::Data<WebData<'_>>,
    data_rw: web::Data<DataBaseRw>,
    ) -> HttpResponse {
    let cached_data = {
    let mut cache = data.cache_revoke_delegation_game.lock().await;
    cache.remove(&form.csrf)
    };
    let cached_data = if let Some(cd) = cached_data {
    cd
    } else {
    log::warn!("Unknown data for CSRF: {}", form.csrf);
    return HttpResponse::BadRequest().body("Incorrect");
    };
    let jar = request_to_jar(request);
    if jar
    .private(&data.cookies_key)
    .get("auth")
    .map(|x| x.value().to_lowercase())
    .map_or(true, |x| x != cached_data.1 && x != cached_data.2)
    {
    log::warn!("Incorrect user");
    return HttpResponse::BadRequest().body("Incorrect");
    }
    let dbclient_rw = match data_rw.0.get().await {
    Ok(c) => c,
    Err(e) => {
    log::error!("Pool RW error {}", e);
    return HttpResponse::ServiceUnavailable().body(actix_web::body::None::new());
    }
    };
    let stmt = match dbclient_rw
    .prepare("update games.players set delegate_name = null where game_uid = $1 and player_name = $2 and delegate_name = $3;")
    .await
    {
    Ok(stmt) => stmt,
    Err(e) => {
    log::error!("Pool RW statement error {}", e);
    return HttpResponse::ServiceUnavailable().body(actix_web::body::None::new());
    }
    };
    let inserted = match dbclient_rw
    .execute(&stmt, &[&cached_data.0, &cached_data.1, &cached_data.2])
    .await
    {
    Ok(c) => c,
    Err(e) => {
    log::error!("Pool RW execute insert error {}", e);
    return HttpResponse::ServiceUnavailable().body(actix_web::body::None::new());
    }
    };
    if inserted == 0 {
    log::error!("Pool RW execute insert row error");
    return HttpResponse::ServiceUnavailable().body(actix_web::body::None::new());
    }
    HttpResponse::Found()
    .append_header((
    header::LOCATION,
    format!("slow-game-{}.html", cached_data.0),
    ))
    .finish()
    }
  • replacement in src/main.rs at line 22
    [3.1187][3.1644:1712]()
    use pages::slow_game::{post_join_game, post_leave_game, slow_game};
    [3.1187]
    [3.2243]
    use pages::slow_game::{post_join_game, post_leave_game, post_revoke_delegate, slow_game};
  • edit in src/main.rs at line 273
    [3.1877]
    [3.2328]
    .route("/revoke-delegate.do", web::post().to(post_revoke_delegate))