summaryrefslogtreecommitdiff
path: root/src/types/extract.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/types/extract.rs')
-rw-r--r--src/types/extract.rs32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/types/extract.rs b/src/types/extract.rs
index 4d92a3b..64a3e73 100644
--- a/src/types/extract.rs
+++ b/src/types/extract.rs
@@ -19,7 +19,7 @@ use crate::{
http::{ResponseCode, Result},
session::Session,
user::User,
- },
+ }, admin,
};
pub struct AuthorizedUser(pub User);
@@ -53,6 +53,36 @@ where
}
}
+pub struct AdminUser;
+
+#[async_trait]
+impl<S> FromRequestParts<S> for AdminUser
+where
+ S: Send + Sync,
+{
+ type Rejection = Response;
+
+ 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.text("No cookies provided"))
+ };
+
+ let Some(secret) = cookies.get("admin") else {
+ return Err(ResponseCode::Forbidden.text("No admin secret provided"))
+ };
+
+ println!("{}", secret);
+
+ let check = admin::get_secret().await;
+
+ if check != secret {
+ return Err(ResponseCode::Unauthorized.text("Auth token invalid"))
+ }
+
+ Ok(Self)
+ }
+}
+
pub struct Log;
#[async_trait]