From b9e2c87025a695ea7fcd2184d4ebf6ccd3fa297f Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Mon, 12 Dec 2022 22:44:04 -0500 Subject: [PATCH] use UserToken in an existing flow --- .../user/lookup_user_for_login_by_email.rs | 7 ++++++- .../user/lookup_user_for_login_by_username.rs | 7 ++++++- .../users/user/lookup_user_for_login_result.rs | 4 +++- crates/lib/tokens/src/users/user.rs | 17 ++++++++++++++++- .../users/src/endpoints/login_handler.rs | 6 +++--- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_by_email.rs b/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_by_email.rs index 7df74d3ac7..0d9b7e82a5 100644 --- a/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_by_email.rs +++ b/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_by_email.rs @@ -7,7 +7,12 @@ pub async fn lookup_user_for_login_by_email(email: &str, pool: &MySqlPool) -> An let record = sqlx::query_as!( UserRecordForLogin, r#" -SELECT token, username, email_address, password_hash, is_banned +SELECT + token as `token: tokens::users::user::UserToken`, + username, + email_address, + password_hash, + is_banned FROM users WHERE email_address = ? LIMIT 1 diff --git a/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_by_username.rs b/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_by_username.rs index 69fcc17529..199372214c 100644 --- a/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_by_username.rs +++ b/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_by_username.rs @@ -8,7 +8,12 @@ pub async fn lookup_user_for_login_by_username(username: &str, pool: &MySqlPool) let record = sqlx::query_as!( UserRecordForLogin, r#" -SELECT token, username, email_address, password_hash, is_banned +SELECT + token as `token: tokens::users::user::UserToken`, + username, + email_address, + password_hash, + is_banned FROM users WHERE username = ? LIMIT 1 diff --git a/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_result.rs b/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_result.rs index 764d366805..82ef60b0fd 100644 --- a/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_result.rs +++ b/crates/lib/database_queries/src/queries/users/user/lookup_user_for_login_result.rs @@ -1,7 +1,9 @@ +use tokens::users::user::UserToken; + /// Shared result type for user lookups for login (via email or username) #[derive(Debug)] pub struct UserRecordForLogin { - pub token: String, + pub token: UserToken, pub username: String, pub email_address: String, pub password_hash: Vec, diff --git a/crates/lib/tokens/src/users/user.rs b/crates/lib/tokens/src/users/user.rs index 571d33f7dc..3e442f3ca5 100644 --- a/crates/lib/tokens/src/users/user.rs +++ b/crates/lib/tokens/src/users/user.rs @@ -3,12 +3,27 @@ use serde::{Deserializer, Serializer}; use sqlx_core::database::{Database, HasValueRef}; use sqlx_core::decode::Decode; use std::error::Error; +use std::fmt::{Debug, Display, Formatter}; -#[derive(Clone, PartialEq, Eq, Debug, sqlx::Type)] +#[derive(Clone, PartialEq, Eq, sqlx::Type)] pub struct UserToken { pub value: String, } +// TODO: Macros should implement all of the following: + +impl Display for UserToken { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.value) + } +} + +impl Debug for UserToken { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.value) + } +} + impl serde::Serialize for UserToken { fn serialize(&self, serializer: S) -> Result { serializer.serialize_str(&self.value) diff --git a/crates/plugins/users/src/endpoints/login_handler.rs b/crates/plugins/users/src/endpoints/login_handler.rs index 3a232e5277..8d21a2b558 100644 --- a/crates/plugins/users/src/endpoints/login_handler.rs +++ b/crates/plugins/users/src/endpoints/login_handler.rs @@ -137,7 +137,7 @@ pub async fn login_handler( let ip_address = get_request_ip(&http_request); let create_session_result = - create_user_session(&user.token, &ip_address, &mysql_pool).await; + create_user_session(&user.token.value, &ip_address, &mysql_pool).await; let session_token = match create_session_result { Ok(token) => token, @@ -147,9 +147,9 @@ pub async fn login_handler( } }; - info!("login session created"); + info!("login session created for user: {}", &user.token); - let session_cookie = match session_cookie_manager.create_cookie(&session_token, &user.token) { + let session_cookie = match session_cookie_manager.create_cookie(&session_token, &user.token.value) { Ok(cookie) => cookie, Err(_) => return Err(LoginErrorResponse::server_error()), };