summaryrefslogtreecommitdiffstats
path: root/crates/sellershut/src/server/middleware/sign_request.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/sellershut/src/server/middleware/sign_request.rs')
-rw-r--r--crates/sellershut/src/server/middleware/sign_request.rs49
1 files changed, 39 insertions, 10 deletions
diff --git a/crates/sellershut/src/server/middleware/sign_request.rs b/crates/sellershut/src/server/middleware/sign_request.rs
index a8f2f3a..889984f 100644
--- a/crates/sellershut/src/server/middleware/sign_request.rs
+++ b/crates/sellershut/src/server/middleware/sign_request.rs
@@ -1,14 +1,20 @@
+mod signature;
+
use activitypub_federation::config::FederationConfig;
-use axum::{body::Body, extract::Request, response::Response};
+use axum::{
+ body::Body,
+ extract::Request,
+ http::HeaderValue,
+ response::Response,
+};
use futures_util::future::BoxFuture;
-use hmac::{Hmac, Mac};
-use sha2::{Sha256, digest::KeyInit};
-use std::task::{Context, Poll};
+use std::{
+ task::{Context, Poll},
+};
use tower::{Layer, Service};
-use crate::state::AppHandle;
+use crate::{server::middleware::sign_request::signature::Signature, state::AppHandle};
-type HmacSha256 = Hmac<Sha256>;
#[derive(Clone)]
pub struct SignRequestLayer {
@@ -42,7 +48,7 @@ pub struct SignRequestMiddleware<S> {
impl<S> Service<Request> for SignRequestMiddleware<S>
where
- S: Service<Request, Response = Response> + Send + 'static,
+ S: Service<Request, Response = Response> + Clone + Send + 'static,
S::Future: Send + 'static,
{
type Response = S::Response;
@@ -55,10 +61,33 @@ where
}
fn call(&mut self, request: Request) -> Self::Future {
- let future = self.inner.call(request);
+ let mut inner = self.inner.clone();
+ let (parts, body) = request.into_parts();
+
Box::pin(async move {
- let response: Response = future.await?;
- Ok(response)
+ let bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
+
+ let signature = Signature::create(
+ ""
+ .as_bytes(),
+ bytes,
+ )
+ .unwrap();
+
+ let mut new_request = Request::from_parts(parts, Body::from(signature.body));
+
+ let head = new_request.headers_mut();
+ let header = format!(
+ "keyId=\"http://localhost/users/sellershut#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) host date digest\",signature=\"{}\"",
+ signature.signature,
+ );
+ println!("{header}");
+ head.insert("Host", HeaderValue::from_str(&signature.host).unwrap());
+ head.insert("Date", HeaderValue::from_str(&signature.date).unwrap());
+ head.insert("Digest", HeaderValue::from_str(&signature.digest).unwrap());
+ head.insert("Signature", HeaderValue::from_str(&header).unwrap());
+
+ inner.call(new_request).await
})
}
}