summaryrefslogtreecommitdiff
path: root/src/types
diff options
context:
space:
mode:
authorTyler Murphy <tylermurphy534@gmail.com>2023-01-28 02:51:34 -0500
committerTyler Murphy <tylermurphy534@gmail.com>2023-01-28 02:51:34 -0500
commitc01b8b8c90fa762f25bf52437611643e3ca16e5a (patch)
treec93293c5c074a03808cdd4b85cdf6001f2f17dd6 /src/types
parentrusty boio finished (diff)
downloadxssbook-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.rs55
-rw-r--r--src/types/post.rs12
-rw-r--r--src/types/response.rs16
-rw-r--r--src/types/session.rs6
-rw-r--r--src/types/user.rs14
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)