diff --git a/src/db/repository/auth.rs b/src/db/repository/auth.rs index 8bd7905..3aafa05 100644 --- a/src/db/repository/auth.rs +++ b/src/db/repository/auth.rs @@ -1,6 +1,5 @@ use chrono::DateTime; use diesel::prelude::*; -use rand::Rng; use super::SqliteRepository; use crate::{ @@ -30,113 +29,6 @@ impl From for gpodder::User { } } -impl gpodder::AuthRepository for SqliteRepository { - fn validate_credentials( - &self, - username: &str, - password: &str, - ) -> Result { - if let Some(user) = users::table - .select(db::User::as_select()) - .filter(users::username.eq(username)) - .first(&mut self.pool.get()?) - .optional()? - { - if user.verify_password(password) { - Ok(gpodder::User { - id: user.id, - username: user.username, - password_hash: user.password_hash, - }) - } else { - Err(gpodder::AuthErr::InvalidPassword) - } - } else { - Err(gpodder::AuthErr::UnknownUser) - } - } - - fn validate_session(&self, session_id: i64) -> Result { - match sessions::dsl::sessions - .inner_join(users::table) - .filter(sessions::id.eq(session_id)) - .select(db::User::as_select()) - .get_result(&mut self.pool.get()?) - { - Ok(user) => Ok(gpodder::User { - id: user.id, - username: user.username, - password_hash: user.password_hash, - }), - Err(diesel::result::Error::NotFound) => Err(gpodder::AuthErr::UnknownSession), - Err(err) => Err(gpodder::AuthErr::Other(Box::new(err))), - } - } - - fn create_session( - &self, - username: &str, - password: &str, - ) -> Result<(i64, gpodder::models::User), gpodder::AuthErr> { - if let Some(user) = users::table - .select(db::User::as_select()) - .filter(users::username.eq(username)) - .first(&mut self.pool.get()?) - .optional()? - { - if user.verify_password(password) { - let id: i64 = rand::thread_rng().gen(); - - let session_id = db::Session { - id, - user_id: user.id, - last_seen: chrono::Utc::now().timestamp(), - } - .insert_into(sessions::table) - .returning(sessions::id) - .get_result(&mut self.pool.get()?)?; - - Ok(( - session_id, - gpodder::User { - id: user.id, - username: user.username, - password_hash: user.password_hash, - }, - )) - } else { - Err(gpodder::AuthErr::InvalidPassword) - } - } else { - Err(gpodder::AuthErr::UnknownUser) - } - } - - fn remove_session(&self, username: &str, session_id: i64) -> Result<(), gpodder::AuthErr> { - let conn = &mut self.pool.get()?; - - if let Some(user) = sessions::table - .inner_join(users::table) - .filter(sessions::id.eq(session_id)) - .select(db::User::as_select()) - .get_result(conn) - .optional()? - { - if user.username == username { - Ok( - diesel::delete(sessions::table.filter(sessions::id.eq(session_id))) - .execute(conn) - .map(|_| ())?, - ) - } else { - Err(AuthErr::UnknownUser) - } - } else { - Ok(()) - } - } -} - impl gpodder::AuthStore for SqliteRepository { fn get_user(&self, username: &str) -> Result, AuthErr> { Ok(users::table diff --git a/src/gpodder/mod.rs b/src/gpodder/mod.rs index d8ff790..fe904d4 100644 --- a/src/gpodder/mod.rs +++ b/src/gpodder/mod.rs @@ -38,24 +38,6 @@ impl Store for T where { } -pub trait AuthRepository { - /// Validate the given session ID and return its user. - fn validate_session(&self, session_id: i64) -> Result; - - /// Validate the credentials, returning the user if the credentials are correct. - fn validate_credentials(&self, username: &str, password: &str) - -> Result; - - /// Create a new session for the given user. - fn create_session( - &self, - username: &str, - password: &str, - ) -> Result<(i64, models::User), AuthErr>; - - fn remove_session(&self, username: &str, session_id: i64) -> Result<(), AuthErr>; -} - pub trait AuthStore { /// Retrieve the session with the given session ID fn get_session(&self, session_id: i64) -> Result, AuthErr>;