mirror of
https://git.asonix.dog/asonix/http-signature-normalization.git
synced 2024-11-22 01:11:00 +00:00
Add prepare_unverified for warp
also Cargo fmt
This commit is contained in:
parent
58871c67ac
commit
029ada114a
2 changed files with 47 additions and 8 deletions
|
@ -1,11 +1,43 @@
|
||||||
use http::{header::HeaderMap, Method};
|
use http::{header::HeaderMap, Method};
|
||||||
pub use http_signature_normalization_http::{Config, verify::Unverified};
|
pub use http_signature_normalization_http::{
|
||||||
|
verify::{Algorithm, DeprecatedAlgorithm, Unverified},
|
||||||
|
Config,
|
||||||
|
};
|
||||||
use std::{future::Future, pin::Pin};
|
use std::{future::Future, pin::Pin};
|
||||||
use warp::{path::FullPath, Filter, Rejection};
|
use warp::{path::FullPath, Filter, Rejection};
|
||||||
|
|
||||||
|
pub fn prepare_unverified(
|
||||||
|
config: Config,
|
||||||
|
) -> impl Filter<Extract = (Unverified,), Error = Rejection> + Clone {
|
||||||
|
warp::any()
|
||||||
|
.map(move || config.clone())
|
||||||
|
.and(warp::header::headers_cloned())
|
||||||
|
.and(warp::method())
|
||||||
|
.and(warp::path::full())
|
||||||
|
.and(warp::query::raw())
|
||||||
|
.and_then(
|
||||||
|
move |config: Config,
|
||||||
|
headers: HeaderMap,
|
||||||
|
method: Method,
|
||||||
|
path: FullPath,
|
||||||
|
query: String| {
|
||||||
|
let path_and_query = format!("{}?{}", path.as_str(), query).parse().unwrap();
|
||||||
|
|
||||||
|
async move {
|
||||||
|
config
|
||||||
|
.begin_verify(&method, Some(&path_and_query), headers)
|
||||||
|
.map_err(|_| warp::reject::not_found())
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn verify<T>(
|
pub fn verify<T>(
|
||||||
config: Config,
|
config: Config,
|
||||||
verifier: impl Fn(Unverified) -> Pin<Box<dyn Future<Output = Result<T, ()>> + Send>> + Clone + Send + Sync,
|
verifier: impl Fn(Unverified) -> Pin<Box<dyn Future<Output = Result<T, ()>> + Send>>
|
||||||
|
+ Clone
|
||||||
|
+ Send
|
||||||
|
+ Sync,
|
||||||
) -> impl Filter<Extract = (T,), Error = Rejection> + Clone
|
) -> impl Filter<Extract = (T,), Error = Rejection> + Clone
|
||||||
where
|
where
|
||||||
T: Send,
|
T: Send,
|
||||||
|
@ -32,9 +64,7 @@ async fn do_verify<T>(
|
||||||
let path_and_query = format!("{}?{}", path.as_str(), query).parse().unwrap();
|
let path_and_query = format!("{}?{}", path.as_str(), query).parse().unwrap();
|
||||||
|
|
||||||
match config.begin_verify(&method, Some(&path_and_query), headers) {
|
match config.begin_verify(&method, Some(&path_and_query), headers) {
|
||||||
Ok(v) => verifier(v)
|
Ok(v) => verifier(v).await.map_err(|_| warp::reject::not_found()),
|
||||||
.await
|
|
||||||
.map_err(|_| warp::reject::not_found()),
|
|
||||||
Err(_) => Err(warp::reject::not_found()),
|
Err(_) => Err(warp::reject::not_found()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -347,7 +347,10 @@ mod tests {
|
||||||
let time1 = Utc::now().timestamp();
|
let time1 = Utc::now().timestamp();
|
||||||
let time2 = Utc::now().timestamp();
|
let time2 = Utc::now().timestamp();
|
||||||
|
|
||||||
let h = format!(r#"Signature keyId="my-key-id",algorithm="hs2019",created="{}",expires="{}",headers="(request-target) (created) (expires) date content-type",signature="blah blah blah""#, time1, time2);
|
let h = format!(
|
||||||
|
r#"Signature keyId="my-key-id",algorithm="hs2019",created="{}",expires="{}",headers="(request-target) (created) (expires) date content-type",signature="blah blah blah""#,
|
||||||
|
time1, time2
|
||||||
|
);
|
||||||
|
|
||||||
parse_signature(&h)
|
parse_signature(&h)
|
||||||
}
|
}
|
||||||
|
@ -357,7 +360,10 @@ mod tests {
|
||||||
let time1 = Utc::now().timestamp();
|
let time1 = Utc::now().timestamp();
|
||||||
let time2 = Utc::now().timestamp();
|
let time2 = Utc::now().timestamp();
|
||||||
|
|
||||||
let h = format!(r#"Signature keyId="my-key-id",algorithm="rsa-sha256",created="{}",expires="{}",signature="blah blah blah""#, time1, time2);
|
let h = format!(
|
||||||
|
r#"Signature keyId="my-key-id",algorithm="rsa-sha256",created="{}",expires="{}",signature="blah blah blah""#,
|
||||||
|
time1, time2
|
||||||
|
);
|
||||||
|
|
||||||
parse_signature(&h)
|
parse_signature(&h)
|
||||||
}
|
}
|
||||||
|
@ -366,7 +372,10 @@ mod tests {
|
||||||
fn parses_header_succesfully_3() {
|
fn parses_header_succesfully_3() {
|
||||||
let time1 = Utc::now().timestamp();
|
let time1 = Utc::now().timestamp();
|
||||||
|
|
||||||
let h = format!(r#"Signature keyId="my-key-id",algorithm="rsa-sha256",created="{}",headers="(request-target) (created) date content-type",signature="blah blah blah""#, time1);
|
let h = format!(
|
||||||
|
r#"Signature keyId="my-key-id",algorithm="rsa-sha256",created="{}",headers="(request-target) (created) date content-type",signature="blah blah blah""#,
|
||||||
|
time1
|
||||||
|
);
|
||||||
|
|
||||||
parse_signature(&h)
|
parse_signature(&h)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue