diff --git a/src/api.rs b/src/api.rs index a4f070d..1546150 100644 --- a/src/api.rs +++ b/src/api.rs @@ -122,7 +122,19 @@ impl<'a, 'r> FromRequest<'a, 'r> for Auth { fn from_request(request: &'a Request<'r>) -> request::Outcome { let mut cookies = request.guard::>().unwrap(); + let db = match request.guard::>>() { + Outcome::Success(d) => d, + _ => return Outcome::Failure((Status::InternalServerError, ())), + }; + if let Some(u) = cookies.get_private(COOKIE_SESSION) { + let exists = match user::exists(db.deref().deref(), u.value()) { + Ok(e) => e, + Err(_) => return Outcome::Failure((Status::InternalServerError, ())), + }; + if !exists { + return Outcome::Failure((Status::Unauthorized, ())); + } return Outcome::Success(Auth { username: u.value().to_string(), }); @@ -135,10 +147,6 @@ impl<'a, 'r> FromRequest<'a, 'r> for Auth { password: Some(password), }) = Basic::from_str(auth_header_string.trim_start_matches("Basic ")) { - let db = match request.guard::>>() { - Outcome::Success(d) => d, - _ => return Outcome::Failure((Status::InternalServerError, ())), - }; if user::auth(db.deref().deref(), &username, &password).unwrap_or(false) { let is_admin = match user::is_admin(db.deref().deref(), &username) { Ok(a) => a, diff --git a/src/user.rs b/src/user.rs index ad68da4..a4055f7 100644 --- a/src/user.rs +++ b/src/user.rs @@ -68,6 +68,19 @@ where Ok(count) } +pub fn exists(db: &T, username: &str) -> Result +where + T: ConnectionSource, +{ + use crate::db::users::dsl::*; + let connection = db.get_connection(); + let results: Vec = users + .select(name) + .filter(name.eq(username)) + .get_results(connection.deref())?; + Ok(results.len() > 0) +} + pub fn is_admin(db: &T, username: &str) -> Result where T: ConnectionSource,