mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 10:06:32 +08:00 
			
		
		
		
	feat: add new error response for 403 (#1330)
Co-authored-by: harsh_sharma_juspay <harsh.sharma@juspay.in> Co-authored-by: Sampras Lopes <lsampras@protonmail.com>
This commit is contained in:
		| @ -367,6 +367,7 @@ impl From<errors::ApiErrorResponse> for StripeErrorCode { | |||||||
|             errors::ApiErrorResponse::Unauthorized |             errors::ApiErrorResponse::Unauthorized | ||||||
|             | errors::ApiErrorResponse::InvalidJwtToken |             | errors::ApiErrorResponse::InvalidJwtToken | ||||||
|             | errors::ApiErrorResponse::GenericUnauthorized { .. } |             | errors::ApiErrorResponse::GenericUnauthorized { .. } | ||||||
|  |             | errors::ApiErrorResponse::AccessForbidden | ||||||
|             | errors::ApiErrorResponse::InvalidEphemeralKey => Self::Unauthorized, |             | errors::ApiErrorResponse::InvalidEphemeralKey => Self::Unauthorized, | ||||||
|             errors::ApiErrorResponse::InvalidRequestUrl |             errors::ApiErrorResponse::InvalidRequestUrl | ||||||
|             | errors::ApiErrorResponse::InvalidHttpMethod |             | errors::ApiErrorResponse::InvalidHttpMethod | ||||||
|  | |||||||
| @ -89,6 +89,8 @@ pub enum ApiErrorResponse { | |||||||
|     FlowNotSupported { flow: String, connector: String }, |     FlowNotSupported { flow: String, connector: String }, | ||||||
|     #[error(error_type = ErrorType::InvalidRequestError, code = "IR_21", message = "Missing required params")] |     #[error(error_type = ErrorType::InvalidRequestError, code = "IR_21", message = "Missing required params")] | ||||||
|     MissingRequiredFields { field_names: Vec<&'static str> }, |     MissingRequiredFields { field_names: Vec<&'static str> }, | ||||||
|  |     #[error(error_type = ErrorType::InvalidRequestError, code = "IR_22", message = "Access forbidden. Not authorized to access this resource")] | ||||||
|  |     AccessForbidden, | ||||||
|     #[error(error_type = ErrorType::ConnectorError, code = "CE_00", message = "{code}: {message}", ignore = "status_code")] |     #[error(error_type = ErrorType::ConnectorError, code = "CE_00", message = "{code}: {message}", ignore = "status_code")] | ||||||
|     ExternalConnectorError { |     ExternalConnectorError { | ||||||
|         code: String, |         code: String, | ||||||
| @ -243,8 +245,9 @@ impl actix_web::ResponseError for ApiErrorResponse { | |||||||
|             Self::ExternalConnectorError { status_code, .. } => { |             Self::ExternalConnectorError { status_code, .. } => { | ||||||
|                 StatusCode::from_u16(*status_code).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR) |                 StatusCode::from_u16(*status_code).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR) | ||||||
|             } |             } | ||||||
|  |             Self::AccessForbidden => StatusCode::FORBIDDEN, // 403 | ||||||
|             Self::InvalidRequestUrl | Self::WebhookResourceNotFound => StatusCode::NOT_FOUND, // 404 |             Self::InvalidRequestUrl | Self::WebhookResourceNotFound => StatusCode::NOT_FOUND, // 404 | ||||||
|             Self::InvalidHttpMethod => StatusCode::METHOD_NOT_ALLOWED,                        // 405 |             Self::InvalidHttpMethod => StatusCode::METHOD_NOT_ALLOWED, // 405 | ||||||
|             Self::MissingRequiredField { .. } |             Self::MissingRequiredField { .. } | ||||||
|             | Self::MissingRequiredFields { .. } |             | Self::MissingRequiredFields { .. } | ||||||
|             | Self::InvalidDataValue { .. } |             | Self::InvalidDataValue { .. } | ||||||
| @ -415,6 +418,7 @@ impl common_utils::errors::ErrorSwitch<api_models::errors::types::ApiErrorRespon | |||||||
|             Self::MissingRequiredFields { field_names } => AER::BadRequest( |             Self::MissingRequiredFields { field_names } => AER::BadRequest( | ||||||
|                 ApiError::new("IR", 21, "Missing required params".to_string(), Some(Extra {data: Some(serde_json::json!(field_names)), ..Default::default() })), |                 ApiError::new("IR", 21, "Missing required params".to_string(), Some(Extra {data: Some(serde_json::json!(field_names)), ..Default::default() })), | ||||||
|             ), |             ), | ||||||
|  |             Self::AccessForbidden => AER::ForbiddenCommonResource(ApiError::new("IR", 22, "Access forbidden. Not authorized to access this resource", None)), | ||||||
|             Self::ExternalConnectorError { |             Self::ExternalConnectorError { | ||||||
|                 code, |                 code, | ||||||
|                 message, |                 message, | ||||||
|  | |||||||
| @ -241,7 +241,7 @@ where | |||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct JWTAuth; | pub(crate) struct JWTAuth; | ||||||
|  |  | ||||||
| #[derive(serde::Deserialize)] | #[derive(serde::Deserialize)] | ||||||
| struct JwtAuthPayloadFetchUnit { | struct JwtAuthPayloadFetchUnit { | ||||||
| @ -315,19 +315,6 @@ impl ClientSecretFetch for api_models::cards_info::CardsInfoRequest { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| pub fn jwt_auth_or<'a, T: AuthInfo, A: AppStateInfo>( |  | ||||||
|     default_auth: &'a dyn AuthenticateAndFetch<T, A>, |  | ||||||
|     headers: &HeaderMap, |  | ||||||
| ) -> Box<&'a dyn AuthenticateAndFetch<T, A>> |  | ||||||
| where |  | ||||||
|     JWTAuth: AuthenticateAndFetch<T, A>, |  | ||||||
| { |  | ||||||
|     if is_jwt_auth(headers) { |  | ||||||
|         return Box::new(&JWTAuth); |  | ||||||
|     } |  | ||||||
|     Box::new(default_auth) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| pub fn get_auth_type_and_flow<A: AppStateInfo + Sync>( | pub fn get_auth_type_and_flow<A: AppStateInfo + Sync>( | ||||||
|     headers: &HeaderMap, |     headers: &HeaderMap, | ||||||
| ) -> RouterResult<( | ) -> RouterResult<( | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Mani Chandra
					Mani Chandra