This commit is contained in:
asonix 2020-04-25 20:41:21 -05:00
parent a0974299c5
commit 85932442fe
5 changed files with 22 additions and 27 deletions

View file

@ -74,11 +74,7 @@ impl FromRequest for DigestVerified {
type Config = (); type Config = ();
fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future { fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future {
let res = req let res = req.extensions().get::<Self>().copied().ok_or(VerifyError);
.extensions()
.get::<Self>()
.map(|s| *s)
.ok_or(VerifyError);
if res.is_err() { if res.is_err() {
debug!("Failed to fetch DigestVerified from request"); debug!("Failed to fetch DigestVerified from request");
@ -108,6 +104,8 @@ where
} }
} }
type FutResult<T, E> = dyn Future<Output = Result<T, E>>;
impl<T, S, B> Service for VerifyMiddleware<T, S> impl<T, S, B> Service for VerifyMiddleware<T, S>
where where
T: DigestVerify + Clone + 'static, T: DigestVerify + Clone + 'static,
@ -119,7 +117,7 @@ where
type Request = ServiceRequest; type Request = ServiceRequest;
type Response = ServiceResponse<B>; type Response = ServiceResponse<B>;
type Error = actix_web::Error; type Error = actix_web::Error;
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>; type Future = Pin<Box<FutResult<Self::Response, Self::Error>>>;
fn poll_ready(&mut self, cx: &mut Context) -> Poll<Result<(), Self::Error>> { fn poll_ready(&mut self, cx: &mut Context) -> Poll<Result<(), Self::Error>> {
self.0.poll_ready(cx) self.0.poll_ready(cx)
@ -140,7 +138,7 @@ where
let f1 = verify_payload(vec, self.2.clone(), payload, tx); let f1 = verify_payload(vec, self.2.clone(), payload, tx);
let payload: Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static>> = let payload: Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static>> =
Box::pin(rx.map(|bytes| Ok(bytes))); Box::pin(rx.map(Ok));
req.set_payload(payload.into()); req.set_payload(payload.into());
req.extensions_mut().insert(DigestVerified); req.extensions_mut().insert(DigestVerified);
@ -190,11 +188,11 @@ where
} }
fn parse_digest(h: &HeaderValue) -> Option<Vec<DigestPart>> { fn parse_digest(h: &HeaderValue) -> Option<Vec<DigestPart>> {
let h = h.to_str().ok()?.split(";").next()?; let h = h.to_str().ok()?.split(';').next()?;
let v: Vec<_> = h let v: Vec<_> = h
.split(",") .split(',')
.filter_map(|p| { .filter_map(|p| {
let mut iter = p.splitn(2, "="); let mut iter = p.splitn(2, '=');
iter.next() iter.next()
.and_then(|alg| iter.next().map(|value| (alg, value))) .and_then(|alg| iter.next().map(|value| (alg, value)))
}) })

View file

@ -25,9 +25,9 @@ fn verify(digest: &mut impl sha2::Digest, name: &str, parts: &[DigestPart], byte
parts.iter().fold(String::new(), |mut acc, item| { parts.iter().fold(String::new(), |mut acc, item| {
if acc.is_empty() { if acc.is_empty() {
} else { } else {
acc.extend(", ".chars()); acc.push_str(", ");
} }
acc.extend(item.algorithm.chars()); acc.push_str(&item.algorithm);
acc acc
}) })
); );

View file

@ -28,9 +28,9 @@ fn verify(digest: &mut impl sha2::Digest, name: &str, parts: &[DigestPart], byte
parts.iter().fold(String::new(), |mut acc, item| { parts.iter().fold(String::new(), |mut acc, item| {
if acc.is_empty() { if acc.is_empty() {
} else { } else {
acc.extend(", ".chars()); acc.push_str(", ");
} }
acc.extend(item.algorithm.chars()); acc.push_str(&item.algorithm);
acc acc
}) })
); );

View file

@ -382,7 +382,7 @@ impl Config {
let path_and_query = path_and_query let path_and_query = path_and_query
.map(|p| p.to_string()) .map(|p| p.to_string())
.unwrap_or(String::from("/")); .unwrap_or_else(|| "/".to_string());
let unsigned = self let unsigned = self
.config .config
@ -405,7 +405,7 @@ impl Config {
let path_and_query = path_and_query let path_and_query = path_and_query
.map(|p| p.to_string()) .map(|p| p.to_string())
.unwrap_or(String::from("/")); .unwrap_or_else(|| "/".to_string());
let unverified = self let unverified = self
.config .config

View file

@ -130,7 +130,7 @@ where
} }
}; };
let algorithm = unverified.algorithm().map(|a| a.clone()); let algorithm = unverified.algorithm().cloned();
let key_id = unverified.key_id().to_owned(); let key_id = unverified.key_id().to_owned();
let f1 = unverified.verify(|signature, signing_string| { let f1 = unverified.verify(|signature, signing_string| {
@ -158,12 +158,12 @@ where
} }
impl HeaderKind { impl HeaderKind {
pub fn is_authorization(&self) -> bool { pub fn is_authorization(self) -> bool {
HeaderKind::Authorization == *self HeaderKind::Authorization == self
} }
pub fn is_signature(&self) -> bool { pub fn is_signature(self) -> bool {
HeaderKind::Signature == *self HeaderKind::Signature == self
} }
} }
@ -173,11 +173,7 @@ impl FromRequest for SignatureVerified {
type Config = (); type Config = ();
fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future { fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future {
let res = req let res = req.extensions().get::<Self>().cloned().ok_or(VerifyError);
.extensions()
.get::<Self>()
.map(|s| s.clone())
.ok_or(VerifyError);
if res.is_err() { if res.is_err() {
debug!("Failed to fetch SignatureVerified from request"); debug!("Failed to fetch SignatureVerified from request");
@ -213,6 +209,7 @@ where
} }
} }
type FutResult<T, E> = dyn Future<Output = Result<T, E>>;
impl<T, S, B> Service for VerifyMiddleware<T, S> impl<T, S, B> Service for VerifyMiddleware<T, S>
where where
T: SignatureVerify + Clone + 'static, T: SignatureVerify + Clone + 'static,
@ -224,7 +221,7 @@ where
type Request = ServiceRequest; type Request = ServiceRequest;
type Response = ServiceResponse<B>; type Response = ServiceResponse<B>;
type Error = actix_web::Error; type Error = actix_web::Error;
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>; type Future = Pin<Box<FutResult<Self::Response, Self::Error>>>;
fn poll_ready(&mut self, cx: &mut Context) -> Poll<Result<(), Self::Error>> { fn poll_ready(&mut self, cx: &mut Context) -> Poll<Result<(), Self::Error>> {
self.0.poll_ready(cx) self.0.poll_ready(cx)