diff --git a/set_version.sh b/set_version.sh index 1a80dcde..6ddded04 100755 --- a/set_version.sh +++ b/set_version.sh @@ -1,3 +1,3 @@ #!/bin/bash -export version=0.5.3-alpha.4 +export version=0.5.3-alpha.4-patch.0 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs diff --git a/src/database/guards/user.rs b/src/database/guards/user.rs index 48253b84..b8ddae91 100644 --- a/src/database/guards/user.rs +++ b/src/database/guards/user.rs @@ -10,90 +10,72 @@ impl<'r> FromRequest<'r> for User { type Error = rauth::util::Error; async fn from_request(request: &'r Request<'_>) -> request::Outcome { - let header_bot_token = request - .headers() - .get("x-bot-token") - .next() - .map(|x| x.to_string()); + let user: &Option = request.local_cache_async(async { + let header_bot_token = request + .headers() + .get("x-bot-token") + .next() + .map(|x| x.to_string()); - if let Some(bot_token) = header_bot_token { - return if let Ok(result) = get_collection("bots") - .find_one( - doc! { - "token": bot_token - }, - None, - ) - .await - { - if let Some(doc) = result { - let id = doc.get_str("_id").unwrap(); - if let Ok(result) = get_collection("users") - .find_one( - doc! { - "_id": &id - }, - None, - ) - .await - { - if let Some(doc) = result { - Outcome::Success(from_document(doc).unwrap()) - } else { - Outcome::Failure(( - Status::Forbidden, - rauth::util::Error::InvalidSession, - )) - } - } else { - Outcome::Failure(( - Status::InternalServerError, - rauth::util::Error::DatabaseError { - operation: "find_one", - with: "user", - }, - )) - } - } else { - Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession)) - } - } else { - Outcome::Failure(( - Status::InternalServerError, - rauth::util::Error::DatabaseError { - operation: "find_one", - with: "bot", - }, - )) - }; - } else { - if let Outcome::Success(session) = request.guard::().await { - if let Ok(result) = get_collection("users") + if let Some(bot_token) = header_bot_token { + if let Ok(result) = get_collection("bots") .find_one( doc! { - "_id": &session.user_id + "token": bot_token }, None, ) .await { if let Some(doc) = result { - Outcome::Success(from_document(doc).unwrap()) - } else { - Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession)) + let id = doc.get_str("_id").unwrap(); + if let Ok(result) = get_collection("users") + .find_one( + doc! { + "_id": &id + }, + None, + ) + .await + { + if let Some(doc) = result { + if let Ok(user) = from_document(doc) { + return Some(user) + } + } + } } - } else { - Outcome::Failure(( - Status::InternalServerError, - rauth::util::Error::DatabaseError { - operation: "find_one", - with: "user", - }, - )) } } else { - Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession)) + if let Outcome::Success(session) = request.guard::().await { + if let Ok(result) = get_collection("users") + .find_one( + doc! { + "_id": &session.user_id + }, + None, + ) + .await + { + if let Some(doc) = result { + if let Ok(user) = from_document(doc) { + return Some(user) + } + } + } + } } + + None + }).await; + + if let Some(user) = user { + Outcome::Success(user.clone()) + } else { + Outcome::Failure(( + Status::Forbidden, + rauth::util::Error::InvalidSession, + )) } } } diff --git a/src/routes/channels/message_send.rs b/src/routes/channels/message_send.rs index 747050dd..bf2183ec 100644 --- a/src/routes/channels/message_send.rs +++ b/src/routes/channels/message_send.rs @@ -35,7 +35,7 @@ lazy_static! { } #[post("//messages", data = "")] -pub async fn message_send(_r: Ratelimiter, user: User, target: Ref, message: Json) -> Result> { +pub async fn message_send(user: User, _r: Ratelimiter, target: Ref, message: Json) -> Result> { let message = message.into_inner(); message .validate() diff --git a/src/util/ratelimit.rs b/src/util/ratelimit.rs index 8af34a4c..a7881d6d 100644 --- a/src/util/ratelimit.rs +++ b/src/util/ratelimit.rs @@ -1,7 +1,6 @@ use rocket::{async_trait, http::Status, request::{Outcome, FromRequest}, response}; use std::{collections::{HashMap, hash_map::DefaultHasher}, time}; -use rauth::entities::Session; -use crate::util::result::Error; +use crate::{database::User, util::result::Error}; use std::hash::{Hash, Hasher}; use std::sync::{Arc, Mutex}; @@ -121,14 +120,15 @@ impl<'r> FromRequest<'r> for Ratelimiter { let res = request.local_cache_async(async { if let Some(route) = request.route() { if let Some(route_name) = &route.name { - let session = request.guard::().await.unwrap(); + let user = request.guard::().await.unwrap(); + let state = request.guard::<&rocket::State>().await.unwrap().inner(); let arc = Arc::clone(&state.0); let mut mutex = arc.lock().unwrap(); let mapping = mutex.get_mut(route_name.as_ref()).unwrap(); // create a unique key tied to the user id and route they use - let key = format!("{}:{}:{}", session.user_id, route.method.as_str(), route.uri.as_str()); + let key = format!("{}:{}:{}", user.id, route.method.as_str(), route.uri.as_str()); let mut hasher = DefaultHasher::new(); key.hash(&mut hasher); diff --git a/src/version.rs b/src/version.rs index 4955c73a..0d8a24a0 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "0.5.3-alpha.4"; +pub const VERSION: &str = "0.5.3-alpha.4-patch.0";