diff options
Diffstat (limited to 'src/api/signature')
-rw-r--r-- | src/api/signature/error.rs | 54 | ||||
-rw-r--r-- | src/api/signature/mod.rs | 5 | ||||
-rw-r--r-- | src/api/signature/payload.rs | 2 | ||||
-rw-r--r-- | src/api/signature/streaming.rs | 2 |
4 files changed, 59 insertions, 4 deletions
diff --git a/src/api/signature/error.rs b/src/api/signature/error.rs new file mode 100644 index 00000000..69f3c6c5 --- /dev/null +++ b/src/api/signature/error.rs @@ -0,0 +1,54 @@ +use err_derive::Error; + +use garage_util::error::Error as GarageError; + +use crate::common_error::CommonError; +pub use crate::common_error::{OkOrBadRequest, OkOrInternalError}; + +/// Errors of this crate +#[derive(Debug, Error)] +pub enum Error { + #[error(display = "{}", _0)] + /// Error from common error + CommonError(CommonError), + + /// Authorization Header Malformed + #[error(display = "Authorization header malformed, expected scope: {}", _0)] + AuthorizationHeaderMalformed(String), + + /// No proper api key was used, or the signature was invalid + #[error(display = "Forbidden: {}", _0)] + Forbidden(String), + + // Category: bad request + /// The request contained an invalid UTF-8 sequence in its path or in other parameters + #[error(display = "Invalid UTF-8: {}", _0)] + InvalidUtf8Str(#[error(source)] std::str::Utf8Error), + + /// The client sent a header with invalid value + #[error(display = "Invalid header value: {}", _0)] + InvalidHeader(#[error(source)] hyper::header::ToStrError), +} + +impl<T> From<T> for Error +where + CommonError: From<T>, +{ + fn from(err: T) -> Self { + Error::CommonError(CommonError::from(err)) + } +} + + +impl Error { + pub fn internal_error<M: ToString>(msg: M) -> Self { + Self::CommonError(CommonError::InternalError(GarageError::Message( + msg.to_string(), + ))) + } + + pub fn bad_request<M: ToString>(msg: M) -> Self { + Self::CommonError(CommonError::BadRequest(msg.to_string())) + } +} + diff --git a/src/api/signature/mod.rs b/src/api/signature/mod.rs index 4679747f..dd5b590c 100644 --- a/src/api/signature/mod.rs +++ b/src/api/signature/mod.rs @@ -4,11 +4,12 @@ use sha2::Sha256; use garage_util::data::{sha256sum, Hash}; -use crate::s3::error::*; - +pub mod error; pub mod payload; pub mod streaming; +use error::*; + pub const SHORT_DATE: &str = "%Y%m%d"; pub const LONG_DATETIME: &str = "%Y%m%dT%H%M%SZ"; diff --git a/src/api/signature/payload.rs b/src/api/signature/payload.rs index 47445bc7..155a6f94 100644 --- a/src/api/signature/payload.rs +++ b/src/api/signature/payload.rs @@ -15,7 +15,7 @@ use super::LONG_DATETIME; use super::{compute_scope, signing_hmac}; use crate::encoding::uri_encode; -use crate::s3::error::*; +use crate::signature::error::*; pub async fn check_payload_signature( garage: &Garage, diff --git a/src/api/signature/streaming.rs b/src/api/signature/streaming.rs index 06a0512e..c8358c4f 100644 --- a/src/api/signature/streaming.rs +++ b/src/api/signature/streaming.rs @@ -12,7 +12,7 @@ use garage_util::data::Hash; use super::{compute_scope, sha256sum, HmacSha256, LONG_DATETIME}; -use crate::s3::error::*; +use crate::signature::error::*; pub fn parse_streaming_body( api_key: &Key, |