summaryrefslogtreecommitdiff
path: root/src/login/routes.rs
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-09-28 01:40:22 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-09-28 20:48:40 -0400
commit4d0bb0709b168a24ab6a8dbc86da45d7503596ee (patch)
tree031f2e35f07cef7305809e3a1d310bf304d15460 /src/login/routes.rs
parent72efedf8e96ca6e159ce6146809ee6d3a9e5a0e7 (diff)
Wrap credential and credential-holding types to prevent `Debug` leaks.
The following values are considered confidential, and should never be logged, even by accident: * `Password`, which is a durable bearer token for a specific Login; * `IdentitySecret`, which is an ephemeral but potentially long-lived bearer token for a specific Login; or * `IdentityToken`, which may hold cookies containing an `IdentitySecret`. These values are now wrapped in types whose `Debug` impls output opaque values, so that they can be included in structs that `#[derive(Debug)]` without requiring any additional care. The wrappers also avoid implementing `Display`, to prevent inadvertent `to_string()`s. We don't bother obfuscating `IdentitySecret`s in memory or in the `.hi` database. There's no point: we'd also need to store the information needed to de-obfuscate them, and they can be freely invalidated and replaced by blanking that table and asking everyone to log in again. Passwords _are_ obfuscated for storage, as they're intended to be durable.
Diffstat (limited to 'src/login/routes.rs')
-rw-r--r--src/login/routes.rs10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/login/routes.rs b/src/login/routes.rs
index 31a68d0..4664063 100644
--- a/src/login/routes.rs
+++ b/src/login/routes.rs
@@ -6,7 +6,9 @@ use axum::{
Router,
};
-use crate::{app::App, clock::RequestedAt, error::Internal, repo::login::Login};
+use crate::{
+ app::App, clock::RequestedAt, error::Internal, password::Password, repo::login::Login,
+};
use super::{app, extract::IdentityToken};
@@ -38,7 +40,7 @@ impl IntoResponse for Boot {
#[derive(serde::Deserialize)]
struct LoginRequest {
name: String,
- password: String,
+ password: Password,
}
async fn on_login(
@@ -52,7 +54,7 @@ async fn on_login(
.login(&request.name, &request.password, &now)
.await
.map_err(LoginError)?;
- let identity = identity.set(&token);
+ let identity = identity.set(token);
Ok((identity, StatusCode::NO_CONTENT))
}
@@ -82,7 +84,7 @@ async fn on_logout(
Json(LogoutRequest {}): Json<LogoutRequest>,
) -> Result<(IdentityToken, StatusCode), LogoutError> {
if let Some(secret) = identity.secret() {
- app.logins().logout(secret).await.map_err(LogoutError)?;
+ app.logins().logout(&secret).await.map_err(LogoutError)?;
}
let identity = identity.clear();