diff options
Diffstat (limited to 'crates/sellershut/src/server/middleware/sign_request.rs')
-rw-r--r-- | crates/sellershut/src/server/middleware/sign_request.rs | 49 |
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 }) } } |