fix session deserialize

This commit is contained in:
Robin Appelman 2023-11-26 16:42:21 +01:00
commit b36f989a23
4 changed files with 42 additions and 32 deletions

52
Cargo.lock generated
View file

@ -141,7 +141,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -242,7 +242,7 @@ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -747,7 +747,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"scratch", "scratch",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -764,7 +764,7 @@ checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -839,7 +839,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"structmeta", "structmeta",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -1122,7 +1122,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -2144,7 +2144,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -2334,7 +2334,7 @@ dependencies = [
"pest_meta", "pest_meta",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -2535,9 +2535,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.56" version = "1.0.70"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@ -2583,9 +2583,9 @@ dependencies = [
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.26" version = "1.0.33"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@ -3022,9 +3022,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.160" version = "1.0.193"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@ -3065,20 +3065,20 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.160" version = "1.0.193"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.96" version = "1.0.108"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
dependencies = [ dependencies = [
"itoa", "itoa",
"ryu", "ryu",
@ -3505,7 +3505,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"structmeta-derive", "structmeta-derive",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -3516,7 +3516,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -4389,9 +4389,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.15" version = "2.0.39"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -4500,7 +4500,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -4593,7 +4593,7 @@ checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]
@ -4759,7 +4759,7 @@ checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.39",
] ]
[[package]] [[package]]

View file

@ -1,6 +1,6 @@
use maud::Render; use maud::Render;
use sea_query::Value; use sea_query::Value;
use serde::{Deserialize, Deserializer, Serialize}; use serde::{de::Error, Deserialize, Deserializer, Serialize};
use sqlx::database::HasValueRef; use sqlx::database::HasValueRef;
use sqlx::error::BoxDynError; use sqlx::error::BoxDynError;
use sqlx::{Database, Decode, Type}; use sqlx::{Database, Decode, Type};
@ -89,13 +89,23 @@ where
} }
} }
#[derive(Deserialize)]
#[serde(untagged)]
enum RawSteamId<'a> {
String(&'a str),
Num(u64),
}
impl<'de> Deserialize<'de> for SteamId { impl<'de> Deserialize<'de> for SteamId {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where where
D: Deserializer<'de>, D: Deserializer<'de>,
{ {
let str = <&str as Deserialize>::deserialize(deserializer)?; let raw = RawSteamId::deserialize(deserializer)?;
Ok(str.parse().unwrap()) match raw {
RawSteamId::String(str) => str.parse().map_err(D::Error::custom),
RawSteamId::Num(num) => Ok(SteamId::Id(num)),
}
} }
} }

View file

@ -245,6 +245,7 @@ async fn login_callback(
error!("{e:?}"); error!("{e:?}");
Error::SteamAuth Error::SteamAuth
})?; })?;
info!(steam_id, "received steam login callback");
let steam_id = SteamId::new(steam_id); let steam_id = SteamId::new(steam_id);
let user = User::get(&app.connection, steam_id).await?; let user = User::get(&app.connection, steam_id).await?;
let mut session = Session::new(); let mut session = Session::new();

View file

@ -11,6 +11,7 @@ use tracing::debug;
pub const COOKIE_NAME: &str = "tf_session"; pub const COOKIE_NAME: &str = "tf_session";
#[derive(Debug)]
pub enum SessionData { pub enum SessionData {
Authenticated(User), Authenticated(User),
UnAuthenticated, UnAuthenticated,
@ -58,9 +59,7 @@ where
session_cookie.unwrap() session_cookie.unwrap()
); );
// continue to decode the session cookie // continue to decode the session cookie
let Ok(Some(session)) = store let Ok(Some(session)) = store.load_session(session_cookie.unwrap().to_owned()).await else {
.load_session(session_cookie.unwrap().to_owned())
.await else {
return Ok(Self::UnAuthenticated); return Ok(Self::UnAuthenticated);
}; };
let Some(user) = session.get::<User>("user") else { let Some(user) = session.get::<User>("user") else {