diff options
author | Tyler Murphy <tylermurphy534@gmail.com> | 2023-01-28 02:51:34 -0500 |
---|---|---|
committer | Tyler Murphy <tylermurphy534@gmail.com> | 2023-01-28 02:51:34 -0500 |
commit | c01b8b8c90fa762f25bf52437611643e3ca16e5a (patch) | |
tree | c93293c5c074a03808cdd4b85cdf6001f2f17dd6 /src/types | |
parent | rusty boio finished (diff) | |
download | xssbook-c01b8b8c90fa762f25bf52437611643e3ca16e5a.tar.gz xssbook-c01b8b8c90fa762f25bf52437611643e3ca16e5a.tar.bz2 xssbook-c01b8b8c90fa762f25bf52437611643e3ca16e5a.zip |
fix rerendering logout button, console page
Diffstat (limited to 'src/types')
-rw-r--r-- | src/types/extract.rs | 55 | ||||
-rw-r--r-- | src/types/post.rs | 12 | ||||
-rw-r--r-- | src/types/response.rs | 16 | ||||
-rw-r--r-- | src/types/session.rs | 6 | ||||
-rw-r--r-- | src/types/user.rs | 14 |
5 files changed, 73 insertions, 30 deletions
diff --git a/src/types/extract.rs b/src/types/extract.rs index 1379828..399fe67 100644 --- a/src/types/extract.rs +++ b/src/types/extract.rs @@ -15,25 +15,60 @@ impl<S> FromRequestParts<S> for AuthorizedUser where S: Send + Sync { async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self> { let Ok(Some(cookies)) = Option::<TypedHeader<Cookie>>::from_request_parts(parts, state).await else { - return Err(ResponseCode::Forbidden.msg("No cookies provided")) + return Err(ResponseCode::Forbidden.text("No cookies provided")) }; let Some(token) = cookies.get("auth") else { - return Err(ResponseCode::Forbidden.msg("No auth token provided")) + return Err(ResponseCode::Forbidden.text("No auth token provided")) }; let Ok(session) = Session::from_token(&token) else { - return Err(ResponseCode::Unauthorized.msg("Auth token invalid")) + return Err(ResponseCode::Unauthorized.text("Auth token invalid")) }; let Ok(user) = User::from_user_id(session.user_id, true) else { - return Err(ResponseCode::InternalServerError.msg("Valid token but no valid user")) + return Err(ResponseCode::InternalServerError.text("Valid token but no valid user")) }; Ok(AuthorizedUser(user)) } } +pub struct Log; +#[async_trait] +impl<S, B> FromRequest<S, B> for Log where + B: HttpBody + Sync + Send + 'static, + B::Data: Send, + B::Error: Into<BoxError>, + S: Send + Sync, +{ + type Rejection = Response; + + async fn from_request(mut req: Request<B>, state: &S) -> Result<Self> { + + let Ok(ConnectInfo(info)) = req.extract_parts::<ConnectInfo<SocketAddr>>().await else { + return Ok(Log) + }; + let method = req.method().clone(); + let path = req.extensions().get::<RouterURI>().unwrap().0; + let uri = req.uri().clone(); + + let Ok(bytes) = Bytes::from_request(req, state).await else { + console::log(info.ip().clone(), method.clone(), uri.clone(), Some(path.to_string()), None).await; + return Ok(Log) + }; + + let Ok(body) = String::from_utf8(bytes.bytes().flatten().collect()) else { + console::log(info.ip().clone(), method.clone(), uri.clone(), Some(path.to_string()), None).await; + return Ok(Log) + }; + + console::log(info.ip().clone(), method.clone(), uri.clone(), Some(path.to_string()), Some(body.to_string())).await; + + Ok(Log) + } +} + pub struct Json<T>(pub T); #[async_trait] @@ -49,28 +84,28 @@ impl<T, S, B> FromRequest<S, B> for Json<T> where async fn from_request(mut req: Request<B>, state: &S) -> Result<Self> { let Ok(ConnectInfo(info)) = req.extract_parts::<ConnectInfo<SocketAddr>>().await else { - return Err(ResponseCode::InternalServerError.msg("Failed to read connection info")); + return Err(ResponseCode::InternalServerError.text("Failed to read connection info")); }; let method = req.method().clone(); let path = req.extensions().get::<RouterURI>().unwrap().0; let uri = req.uri().clone(); let Ok(bytes) = Bytes::from_request(req, state).await else { - return Err(ResponseCode::InternalServerError.msg("Failed to read request body")); + return Err(ResponseCode::InternalServerError.text("Failed to read request body")); }; let Ok(body) = String::from_utf8(bytes.bytes().flatten().collect()) else { - return Err(ResponseCode::BadRequest.msg("Invalid utf8 body")) + return Err(ResponseCode::BadRequest.text("Invalid utf8 body")) }; - console::log(&info.ip(), &method, &uri, Some(path), Some(&body)).await; + console::log(info.ip().clone(), method.clone(), uri.clone(), Some(path.to_string()), Some(body.to_string())).await; let Ok(value) = serde_json::from_str::<T>(&body) else { - return Err(ResponseCode::BadRequest.msg("Invalid request body")) + return Err(ResponseCode::BadRequest.text("Invalid request body")) }; if let Err(msg) = value.check() { - return Err(ResponseCode::BadRequest.msg(&msg)); + return Err(ResponseCode::BadRequest.text(&msg)); } Ok(Json(value)) diff --git a/src/types/post.rs b/src/types/post.rs index 94f0a9e..7805a4e 100644 --- a/src/types/post.rs +++ b/src/types/post.rs @@ -18,7 +18,7 @@ impl Post { pub fn from_post_id(post_id: u64) -> Result<Self> { let Ok(Some(post)) = database::posts::get_post(post_id) else { - return Err(ResponseCode::BadRequest.msg("Post does not exist")) + return Err(ResponseCode::BadRequest.text("Post does not exist")) }; Ok(post) @@ -35,21 +35,21 @@ impl Post { pub fn from_post_page(page: u64) -> Result<Vec<Self>> { let Ok(posts) = database::posts::get_post_page(page) else { - return Err(ResponseCode::BadRequest.msg("Failed to fetch posts")) + return Err(ResponseCode::BadRequest.text("Failed to fetch posts")) }; Ok(posts) } pub fn from_user_id(user_id: u64) -> Result<Vec<Self>> { let Ok(posts) = database::posts::get_users_posts(user_id) else { - return Err(ResponseCode::BadRequest.msg("Failed to fetch posts")) + return Err(ResponseCode::BadRequest.text("Failed to fetch posts")) }; Ok(posts) } pub fn new(user_id: u64, content: String) -> Result<Self> { let Ok(post) = database::posts::add_post(user_id, &content) else { - return Err(ResponseCode::InternalServerError.msg("Failed to create post")) + return Err(ResponseCode::InternalServerError.text("Failed to create post")) }; Ok(post) @@ -59,7 +59,7 @@ impl Post { self.comments.push((user_id, content)); if database::posts::update_post(self.post_id, &self.likes, &self.comments).is_err() { - return Err(ResponseCode::InternalServerError.msg("Failed to comment on post")) + return Err(ResponseCode::InternalServerError.text("Failed to comment on post")) } Ok(()) @@ -74,7 +74,7 @@ impl Post { } if database::posts::update_post(self.post_id, &self.likes, &self.comments).is_err() { - return Err(ResponseCode::InternalServerError.msg("Failed to comment on post")) + return Err(ResponseCode::InternalServerError.text("Failed to comment on post")) } Ok(()) diff --git a/src/types/response.rs b/src/types/response.rs index bea3406..72c1334 100644 --- a/src/types/response.rs +++ b/src/types/response.rs @@ -28,7 +28,7 @@ impl ResponseCode { } } - pub fn msg(self, msg: &str) -> Response { + pub fn text(self, msg: &str) -> Response { (self.code(), msg.to_owned()).into_response() } @@ -40,17 +40,25 @@ impl ResponseCode { res } + pub fn html(self, json: &str) -> Response { + let mut res = (self.code(), json.to_owned()).into_response(); + res.headers_mut().insert( + HeaderName::from_static("content-type"), HeaderValue::from_static("text/html"), + ); + res + } + pub async fn file(self, path: &str) -> Result<Response> { if path.chars().position(|c| c == '.' ).is_none() { - return Err(ResponseCode::BadRequest.msg("Folders cannot be served")); + return Err(ResponseCode::BadRequest.text("Folders cannot be served")); } let path = format!("public{}", path); let svc = ServeFile::new(path); let Ok(mut res) = svc.oneshot(Request::new(Body::empty())).await else { - return Err(ResponseCode::InternalServerError.msg("Error wile fetching file")); + return Err(ResponseCode::InternalServerError.text("Error wile fetching file")); }; if res.status() != StatusCode::OK { - return Err(ResponseCode::NotFound.msg("File not found")); + return Err(ResponseCode::NotFound.text("File not found")); } *res.status_mut() = self.code(); Ok(res.into_response()) diff --git a/src/types/session.rs b/src/types/session.rs index 8064fb1..9b949be 100644 --- a/src/types/session.rs +++ b/src/types/session.rs @@ -14,7 +14,7 @@ impl Session { pub fn from_token(token: &str) -> Result<Self> { let Ok(Some(session)) = database::sessions::get_session(token) else { - return Err(ResponseCode::BadRequest.msg("Invalid auth token")); + return Err(ResponseCode::BadRequest.text("Invalid auth token")); }; Ok(session) @@ -23,14 +23,14 @@ impl Session { pub fn new(user_id: u64) -> Result<Self> { let token: String = rand::thread_rng().sample_iter(&Alphanumeric).take(32).map(char::from).collect(); match database::sessions::set_session(user_id, &token) { - Err(_) => return Err(ResponseCode::BadRequest.msg("Failed to create session")), + Err(_) => return Err(ResponseCode::BadRequest.text("Failed to create session")), Ok(_) => return Ok(Session {user_id, token}) }; } pub fn delete(user_id: u64) -> Result<()> { if let Err(_) = database::sessions::delete_session(user_id) { - return Err(ResponseCode::InternalServerError.msg("Failed to logout")); + return Err(ResponseCode::InternalServerError.text("Failed to logout")); }; Ok(()) } diff --git a/src/types/user.rs b/src/types/user.rs index 1213a75..56ef467 100644 --- a/src/types/user.rs +++ b/src/types/user.rs @@ -22,7 +22,7 @@ impl User { pub fn from_user_id(user_id: u64, hide_password: bool) -> Result<Self> { let Ok(Some(user)) = database::users::get_user_by_id(user_id, hide_password) else { - return Err(ResponseCode::BadRequest.msg("User does not exist")) + return Err(ResponseCode::BadRequest.text("User does not exist")) }; Ok(user) @@ -39,14 +39,14 @@ impl User { pub fn from_user_page(page: u64) -> Result<Vec<Self>> { let Ok(users) = database::users::get_user_page(page, true) else { - return Err(ResponseCode::BadRequest.msg("Failed to fetch users")) + return Err(ResponseCode::BadRequest.text("Failed to fetch users")) }; Ok(users) } pub fn from_email(email: &str) -> Result<Self> { let Ok(Some(user)) = database::users::get_user_by_email(email, false) else { - return Err(ResponseCode::BadRequest.msg("User does not exist")) + return Err(ResponseCode::BadRequest.text("User does not exist")) }; Ok(user) @@ -54,7 +54,7 @@ impl User { pub fn from_password(password: &str) -> Result<Self> { let Ok(Some(user)) = database::users::get_user_by_password(password, true) else { - return Err(ResponseCode::BadRequest.msg("User does not exist")) + return Err(ResponseCode::BadRequest.text("User does not exist")) }; Ok(user) @@ -62,15 +62,15 @@ impl User { pub fn new(firstname: String, lastname: String, email: String, password: String, gender: String, day: u8, month: u8, year: u32) -> Result<Self> { if let Ok(_) = User::from_email(&email) { - return Err(ResponseCode::BadRequest.msg(&format!("Email is already in use by {}", &email))) + return Err(ResponseCode::BadRequest.text(&format!("Email is already in use by {}", &email))) } if let Ok(user) = User::from_password(&password) { - return Err(ResponseCode::BadRequest.msg(&format!("Password is already in use by {}", user.email))) + return Err(ResponseCode::BadRequest.text(&format!("Password is already in use by {}", user.email))) } let Ok(user) = database::users::add_user(&firstname, &lastname, &email, &password, &gender, day, month, year) else { - return Err(ResponseCode::InternalServerError.msg("Failed to create new uesr")) + return Err(ResponseCode::InternalServerError.text("Failed to create new uesr")) }; Ok(user) |