From de741f451ed871995f2c03774f820758c1d45b51 Mon Sep 17 00:00:00 2001 From: supercmmetry Date: Fri, 26 Jun 2020 08:14:19 +0530 Subject: [PATCH] refactor: Remove unused code - DbConn moved to /src/api/guards/db.rs - Removed redundant imports in /src/api/routes Signed-off-by: supercmmetry --- src/api/guards/auth.rs | 103 ---------------------------------------- src/api/guards/db.rs | 29 +++++++++++ src/api/guards/mod.rs | 2 +- src/api/routes/paste.rs | 7 +-- src/utils/db.rs | 38 +-------------- src/utils/errors.rs | 29 ----------- 6 files changed, 35 insertions(+), 173 deletions(-) delete mode 100644 src/api/guards/auth.rs create mode 100644 src/api/guards/db.rs diff --git a/src/api/guards/auth.rs b/src/api/guards/auth.rs deleted file mode 100644 index 1f3dcc5..0000000 --- a/src/api/guards/auth.rs +++ /dev/null @@ -1,103 +0,0 @@ -use std::env; -use std::result::Result; -use chrono::prelude::*; -use jsonwebtoken::{Header, Algorithm, EncodingKey, Validation, DecodingKey}; -use rocket::request::{FromRequest, Outcome}; -use rocket::{Request}; - -use crate::utils::errors::Error; -use crate::utils::errors::ErrorCode; - -#[derive(Serialize, Deserialize, Clone)] -pub struct Claims { - pub user_id: String, - #[serde(with = "date_serializer")] - iat: DateTime, - #[serde(with = "date_serializer")] - exp: DateTime -} - -mod date_serializer { - use chrono::{DateTime, TimeZone, Utc}; - use serde::{self, Deserialize, Deserializer, Serializer}; - use serde::de::Error; - - /// Serializes a DateTime to a Unix timestamp (milliseconds since 1970/1/1T00:00:00T) - pub fn serialize(date: &DateTime, serializer: S) -> Result - where - S: Serializer, - { - let timestamp = date.timestamp(); - serializer.serialize_i64(timestamp) - } - - /// Attempts to deserialize an i64 and use as a Unix timestamp - pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - Utc.timestamp_opt(i64::deserialize(deserializer)?, 0) - .single() // If there are multiple or no valid DateTimes from timestamp, return None - .ok_or_else(|| Error::custom("invalid Unix timestamp value")) - } -} - -impl Claims { - pub fn new(user_id: String) -> Claims { - let iat = Utc::now(); - let exp = iat + chrono::Duration::days(1); - - Claims { - user_id, - iat: iat.date().and_hms_milli(iat.hour(), iat.minute(), iat.second(), 0), - exp: exp.date().and_hms_milli(exp.hour(), exp.minute(), exp.second(), 0) - } - } - - pub fn jwt(&self) -> Result { - let mut header = Header::default(); - header.alg = Algorithm::HS512; - header.kid = Some(env::var("JWT_SIGNING_KEY").unwrap()); - let key = env::var("JWT_PASSWORD").unwrap(); - - - match jsonwebtoken::encode(&header, self, &EncodingKey::from_secret(key.as_bytes())) { - Ok(token) => Ok(token), - Err(_) => Err(Error::new(ErrorCode::AuthTokenCreationFailed)) - } - } - - pub fn from(token: String) -> Result { - let key = env::var("JWT_PASSWORD").unwrap(); - match jsonwebtoken::decode::(&token, &DecodingKey::from_secret(key.as_bytes()), - &Validation::new(Algorithm::HS512)) { - Ok(token_data) => Ok(token_data.claims), - Err(_) => Err(Error::new(ErrorCode::MalformedAuthToken)) - } - } -} - -pub struct ClaimResult(Result); - -impl ClaimResult { - pub fn inner(&self) -> Result { - self.0.clone() - } -} - -impl<'a, 'r> FromRequest<'a, 'r> for ClaimResult { - type Error = Error; - - fn from_request(request: &'a Request<'r>) -> Outcome { - let values: Vec<_> = request.headers().get("Authorization").collect(); - if values.len() > 1 { - return Outcome::Success(ClaimResult(Err(Error::new(ErrorCode::MultipleAuthToken)))); - } else if values.len() == 0 { - return Outcome::Success(ClaimResult(Err(Error::new(ErrorCode::NoAuthToken)))); - } - - let token = values[0].to_string(); - - Outcome::Success(ClaimResult(Claims::from(token))) - } -} \ No newline at end of file diff --git a/src/api/guards/db.rs b/src/api/guards/db.rs new file mode 100644 index 0000000..540b205 --- /dev/null +++ b/src/api/guards/db.rs @@ -0,0 +1,29 @@ +use diesel::PgConnection; +use diesel::r2d2::{PooledConnection, ConnectionManager}; +use rocket::{Request, request, State, Outcome}; +use rocket::request::FromRequest; +use rocket::http::Status; +use crate::utils::db::Pool; +use std::ops::Deref; + +pub struct DbConn(pub PooledConnection>); + +impl<'a, 'r> FromRequest<'a, 'r> for DbConn { + type Error = (); + + fn from_request(request: &'a Request<'r>) -> request::Outcome { + let pool = request.guard::>()?; + match pool.get() { + Ok(conn) => Outcome::Success(DbConn(conn)), + Err(_) => Outcome::Failure((Status::ServiceUnavailable, ())), + } + } +} + +impl Deref for DbConn { + type Target = PgConnection; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} \ No newline at end of file diff --git a/src/api/guards/mod.rs b/src/api/guards/mod.rs index 5696e21..8c5eabd 100644 --- a/src/api/guards/mod.rs +++ b/src/api/guards/mod.rs @@ -1 +1 @@ -pub mod auth; \ No newline at end of file +pub mod db; \ No newline at end of file diff --git a/src/api/routes/paste.rs b/src/api/routes/paste.rs index 8ab6678..774991e 100644 --- a/src/api/routes/paste.rs +++ b/src/api/routes/paste.rs @@ -7,8 +7,9 @@ use serde_json::Value; use crate::core::paste::{entity::Paste, service::create_paste, service::fetch_paste}; use crate::core::users::{service::create_or_fetch_user}; -use crate::utils::{db, phonetic_key}; -use crate::utils::phonetic_key::get_random_id; +use crate::utils::phonetic_key; +use crate::api::guards::db; + use diesel::result::Error; #[post("/", data = "")] @@ -17,7 +18,7 @@ fn create(mut paste: Json, conn: db::DbConn, mut ck: Cookies) -> Custom c.value().to_string(), None => { - let user_id = get_random_id(); + let user_id = phonetic_key::get_random_id(); ck.add_private(Cookie::new("session", user_id.clone())); user_id } diff --git a/src/utils/db.rs b/src/utils/db.rs index 7cf5f07..2ec6a54 100644 --- a/src/utils/db.rs +++ b/src/utils/db.rs @@ -1,12 +1,7 @@ use diesel::pg::PgConnection; use diesel::{r2d2, Connection}; -use diesel::r2d2::{PooledConnection, ConnectionManager}; -use rocket::{Outcome, Request, State}; -use rocket::http::Status; -use rocket::request::{self, FromRequest}; +use diesel::r2d2::ConnectionManager; use std::env; -use std::ops::Deref; -use crate::utils::errors::{Error, ErrorCode}; pub type Pool = r2d2::Pool>; @@ -21,35 +16,4 @@ fn database_url() -> String { pub fn pg_connection() -> PgConnection { PgConnection::establish(database_url().as_str()).unwrap() -} - -pub struct DbConn(pub r2d2::PooledConnection>); - -impl<'a, 'r> FromRequest<'a, 'r> for DbConn { - type Error = (); - - fn from_request(request: &'a Request<'r>) -> request::Outcome { - let pool = request.guard::>()?; - match pool.get() { - Ok(conn) => Outcome::Success(DbConn(conn)), - Err(_) => Outcome::Failure((Status::ServiceUnavailable, ())), - } - } -} - -impl Deref for DbConn { - type Target = PgConnection; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -pub fn get_connection(pool: &Pool) -> Result>, Error> { - let result = pool.get(); - if let Err(e) = result { - return Err(Error::custom(ErrorCode::DatabaseError, e.to_string())); - } - - Ok(result.unwrap()) } \ No newline at end of file diff --git a/src/utils/errors.rs b/src/utils/errors.rs index e8c17bf..ae287e7 100644 --- a/src/utils/errors.rs +++ b/src/utils/errors.rs @@ -94,33 +94,4 @@ impl<'r> Responder<'r> for Error { .sized_body(Cursor::new(serde_json::to_string(&self).unwrap())) .ok() } -} - -#[derive(Serialize)] -pub struct Success { - msg: String -} - -impl Success { - pub fn new(msg: &str) -> Success { - Success { - msg: msg.to_string() - } - } -} - -impl<'r> Responder<'r> for Success { - fn respond_to(self, request: &Request) -> response::Result<'r> { - let logger = request.guard::>(); - - if let Outcome::Success(logger) = logger { - info!(logger, "{}", serde_json::to_string(&self).unwrap()); - } - - Response::build() - .status(Status::Ok) - .header(ContentType::JSON) - .sized_body(Cursor::new(serde_json::to_string(&self).unwrap())) - .ok() - } } \ No newline at end of file