diff --git a/src/claims.rs b/src/claims.rs index cfbeccac..a4eb4d73 100644 --- a/src/claims.rs +++ b/src/claims.rs @@ -272,7 +272,6 @@ where } } -// TODO: Check whether claims from a scope are essential or not. impl From<&Scope> for StandardClaimsRequests { fn from(value: &Scope) -> Self { value diff --git a/src/provider.rs b/src/provider.rs index a5533eab..e3838954 100644 --- a/src/provider.rs +++ b/src/provider.rs @@ -53,7 +53,6 @@ where }) } - // TODO: needs refactoring. /// Generates a [`Response`] in response to a [`SiopRequest`] and the user's claims. The [`Response`] /// contains an [`IdToken`], which is signed by the [`Subject`] of the [`Provider`]. pub async fn generate_response(&self, request: SiopRequest, user_claims: StandardClaimsValues) -> Result { diff --git a/src/request/request_builder.rs b/src/request/request_builder.rs index 1f69011d..67cfa53e 100644 --- a/src/request/request_builder.rs +++ b/src/request/request_builder.rs @@ -54,7 +54,6 @@ impl RequestUrlBuilder { .take() .ok_or(anyhow!("client_id parameter is required."))?, scope: self.scope.take().ok_or(anyhow!("scope parameter is required."))?, - // claims: self.claims.take().and_then(|c| c.ok()), claims: self.claims.take().transpose()?, redirect_uri: self .redirect_uri diff --git a/src/response.rs b/src/response.rs index c63f6826..8f3adf54 100644 --- a/src/response.rs +++ b/src/response.rs @@ -67,7 +67,15 @@ impl ResponseBuilder { })), (None, None, Some(response)) => Ok(Some(Openid4vpParams::Jwt { response })), (None, None, None) => Ok(None), - _ => Err(anyhow!("Invalid combination of openid4vp response parameters.")), + (Some(_), None, None) => Err(anyhow!( + "`presentation_submission` parameter is required when using `vp_token` parameter." + )), + (None, Some(_), None) => Err(anyhow!( + "`vp_token` parameter is required when using `presentation_submission` parameter." + )), + _ => Err(anyhow!( + "`response` parameter can not be used with `vp_token` and `presentation_submission` parameters." + )), }?; Ok(Response { @@ -86,32 +94,74 @@ impl ResponseBuilder { builder_fn!(state, String); } -// TODO: Improve tests #[cfg(test)] mod tests { use super::*; #[test] - fn test_openid4vp_response() { - let response = Response::builder() + fn test_valid_response() { + assert!(Response::builder() + .redirect_uri("redirect".to_string()) + .id_token("id_token".to_string()) + .build() + .is_ok()); + + assert!(Response::builder() .redirect_uri("redirect".to_string()) .vp_token("vp_token".to_string()) .presentation_submission("presentation_submission".to_string()) .build() - .unwrap(); + .is_ok()); + + assert!(Response::builder() + .redirect_uri("redirect".to_string()) + .id_token("id_token".to_string()) + .vp_token("vp_token".to_string()) + .presentation_submission("presentation_submission".to_string()) + .build() + .is_ok()); + } - let response_string = serde_json::to_string(&response).unwrap(); + #[test] + fn test_invalid_response() { + assert_eq!( + Response::builder() + .id_token("id_token".to_string()) + .build() + .unwrap_err() + .to_string(), + "redirect_uri parameter is required." + ); + + assert_eq!( + Response::builder() + .redirect_uri("redirect".to_string()) + .vp_token("vp_token".to_string()) + .build() + .unwrap_err() + .to_string(), + "`presentation_submission` parameter is required when using `vp_token` parameter." + ); + + assert_eq!( + Response::builder() + .redirect_uri("redirect".to_string()) + .presentation_submission("presentation_submission".to_string()) + .build() + .unwrap_err() + .to_string(), + "`vp_token` parameter is required when using `presentation_submission` parameter." + ); assert_eq!( - Response { - id_token: None, - openid4vp_response: Some(Openid4vpParams::Params { - vp_token: "vp_token".to_string(), - presentation_submission: "presentation_submission".to_string(), - }), - ..Default::default() - }, - serde_json::from_str(&response_string).unwrap() + Response::builder() + .redirect_uri("redirect".to_string()) + .presentation_submission("presentation_submission".to_string()) + .openid4vp_response_jwt("response".to_string()) + .build() + .unwrap_err() + .to_string(), + "`response` parameter can not be used with `vp_token` and `presentation_submission` parameters." ); } }