From a132d422af8a8e8cd05a5c70c4552c318c6ed84a Mon Sep 17 00:00:00 2001 From: Naian <126972030+nain-F49FF806@users.noreply.github.com> Date: Tue, 7 Nov 2023 16:46:11 +0100 Subject: [PATCH 1/8] Add support for mediator coordination messages Signed-off-by: Naian <126972030+nain-F49FF806@users.noreply.github.com> --- aries_vcx/src/handlers/util.rs | 22 ++++ messages/src/lib.rs | 10 +- .../protocols/coordinate_mediation/keylist.rs | 87 +++++++++++++ .../coordinate_mediation/keylist_query.rs | 71 ++++++++++ .../coordinate_mediation/keylist_update.rs | 75 +++++++++++ .../keylist_update_response.rs | 80 ++++++++++++ .../coordinate_mediation/mediate_deny.rs | 47 +++++++ .../coordinate_mediation/mediate_grant.rs | 57 +++++++++ .../coordinate_mediation/mediate_request.rs | 47 +++++++ .../protocols/coordinate_mediation/mod.rs | 121 ++++++++++++++++++ messages/src/msg_fields/protocols/mod.rs | 1 + .../protocols/coordinate_mediation.rs | 33 +++++ messages/src/msg_types/protocols/mod.rs | 13 +- 13 files changed, 658 insertions(+), 6 deletions(-) create mode 100644 messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs create mode 100644 messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs create mode 100644 messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs create mode 100644 messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs create mode 100644 messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs create mode 100644 messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs create mode 100644 messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs create mode 100644 messages/src/msg_fields/protocols/coordinate_mediation/mod.rs create mode 100644 messages/src/msg_types/protocols/coordinate_mediation.rs diff --git a/aries_vcx/src/handlers/util.rs b/aries_vcx/src/handlers/util.rs index ccfc7cf6e5..90a40dddff 100644 --- a/aries_vcx/src/handlers/util.rs +++ b/aries_vcx/src/handlers/util.rs @@ -1,6 +1,7 @@ use messages::{ msg_fields::protocols::{ connection::{invitation::Invitation, Connection}, + coordinate_mediation::CoordinateMediation, cred_issuance::{v1::CredentialIssuanceV1, v2::CredentialIssuanceV2, CredentialIssuance}, discover_features::DiscoverFeatures, notification::Notification, @@ -217,6 +218,27 @@ pub fn verify_thread_id(thread_id: &str, message: &AriesMessage) -> VcxResult<() AriesMessage::Pickup(Pickup::LiveDeliveryChange(msg)) => { matches_opt_thread_id!(msg, thread_id) } + AriesMessage::CoordinateMediation(CoordinateMediation::MediateRequest(msg)) => { + matches_opt_thread_id!(msg, thread_id) + } + AriesMessage::CoordinateMediation(CoordinateMediation::MediateDeny(msg)) => { + matches_opt_thread_id!(msg, thread_id) + } + AriesMessage::CoordinateMediation(CoordinateMediation::MediateGrant(msg)) => { + matches_opt_thread_id!(msg, thread_id) + } + AriesMessage::CoordinateMediation(CoordinateMediation::KeylistUpdate(msg)) => { + matches_opt_thread_id!(msg, thread_id) + } + AriesMessage::CoordinateMediation(CoordinateMediation::KeylistUpdateResponse(msg)) => { + matches_opt_thread_id!(msg, thread_id) + } + AriesMessage::CoordinateMediation(CoordinateMediation::KeylistQuery(msg)) => { + matches_opt_thread_id!(msg, thread_id) + } + AriesMessage::CoordinateMediation(CoordinateMediation::Keylist(msg)) => { + matches_opt_thread_id!(msg, thread_id) + } }; if !is_match { diff --git a/messages/src/lib.rs b/messages/src/lib.rs index 90c49c51c0..dd3cbbb61b 100644 --- a/messages/src/lib.rs +++ b/messages/src/lib.rs @@ -29,8 +29,8 @@ use crate::{ msg_fields::{ protocols::{ basic_message::BasicMessage, connection::Connection, - discover_features::DiscoverFeatures, notification::Notification, - out_of_band::OutOfBand, present_proof::v1::PresentProofV1, + coordinate_mediation::CoordinateMediation, discover_features::DiscoverFeatures, + notification::Notification, out_of_band::OutOfBand, present_proof::v1::PresentProofV1, report_problem::ProblemReport, revocation::Revocation, routing::Forward, trust_ping::TrustPing, }, @@ -68,6 +68,7 @@ pub enum AriesMessage { OutOfBand(OutOfBand), Notification(Notification), Pickup(Pickup), + CoordinateMediation(CoordinateMediation), } impl DelayedSerde for AriesMessage { @@ -180,6 +181,10 @@ impl DelayedSerde for AriesMessage { Protocol::PickupType(msg_type) => { Pickup::delayed_deserialize((msg_type, kind_str), deserializer).map(From::from) } + Protocol::CoordinateMediationType(msg_type) => { + CoordinateMediation::delayed_deserialize((msg_type, kind_str), deserializer) + .map(From::from) + } } } @@ -202,6 +207,7 @@ impl DelayedSerde for AriesMessage { Self::OutOfBand(v) => v.delayed_serialize(serializer), Self::Notification(v) => v.delayed_serialize(serializer), Self::Pickup(v) => v.delayed_serialize(serializer), + Self::CoordinateMediation(v) => v.delayed_serialize(serializer), } } } diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs new file mode 100644 index 0000000000..27d4938810 --- /dev/null +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs @@ -0,0 +1,87 @@ +use serde::{Deserialize, Serialize}; +use typed_builder::TypedBuilder; + +use crate::{decorators::thread::Thread, msg_parts::MsgParts}; + +pub type Keylist = MsgParts; + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct KeylistContent { + pub keys: Vec, + #[builder(default, setter(strip_option))] + #[serde(skip_serializing_if = "Option::is_none")] + pagination: Option, +} + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct KeylistItem { + pub recipient_key: String, +} + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct KeylistPagination { + #[builder(default, setter(strip_option))] + #[serde(skip_serializing_if = "Option::is_none")] + count: Option, + #[builder(default, setter(strip_option))] + #[serde(skip_serializing_if = "Option::is_none")] + offset: Option, + #[builder(default, setter(strip_option))] + #[serde(skip_serializing_if = "Option::is_none")] + remaining: Option, +} + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct KeylistDecorators { + #[builder(default, setter(strip_option))] + #[serde(rename = "~thread")] + #[serde(skip_serializing_if = "Option::is_none")] + pub thread: Option, +} + +#[cfg(test)] +#[allow(clippy::field_reassign_with_default)] +mod tests { + use serde_json::json; + + use super::*; + use crate::{ + misc::test_utils, msg_types::protocols::coordinate_mediation::CoordinateMediationTypeV1_0, + }; + + #[test] + fn test_status_request() { + let expected = json!( + { + "@id": "123456781", + "@type": "/keylist", + "keys": [ + { + "recipient_key": "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH" + } + ], + "pagination": { + "count": 30, + "offset": 30, + "remaining": 100 + } + } + ); + let key_item = KeylistItem::builder() + .recipient_key("did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH".to_owned()) + .build(); + let pagination_state = KeylistPagination::builder().count(30).offset(30).build(); + let content = KeylistContent::builder() + .pagination(pagination_state) + .keys(vec![key_item]) + .build(); + let decorators = KeylistDecorators::builder().build(); + + test_utils::test_msg( + content, + decorators, + CoordinateMediationTypeV1_0::Keylist, + expected, + ); + } +} diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs new file mode 100644 index 0000000000..891f737b26 --- /dev/null +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs @@ -0,0 +1,71 @@ +use serde::{Deserialize, Serialize}; +use typed_builder::TypedBuilder; + +use crate::{decorators::thread::Thread, msg_parts::MsgParts}; + +pub type KeylistQuery = MsgParts; + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct KeylistQueryContent { + #[builder(default, setter(strip_option))] + #[serde(skip_serializing_if = "Option::is_none")] + paginate: Option, +} + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct KeylistQueryPaginateParams { + #[builder(default, setter(strip_option))] + #[serde(skip_serializing_if = "Option::is_none")] + limit: Option, + #[builder(default, setter(strip_option))] + #[serde(skip_serializing_if = "Option::is_none")] + offset: Option, +} + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct KeylistQueryDecorators { + #[builder(default, setter(strip_option))] + #[serde(rename = "~thread")] + #[serde(skip_serializing_if = "Option::is_none")] + pub thread: Option, +} + +#[cfg(test)] +#[allow(clippy::field_reassign_with_default)] +mod tests { + use serde_json::json; + + use super::*; + use crate::{ + misc::test_utils, msg_types::protocols::coordinate_mediation::CoordinateMediationTypeV1_0, + }; + + #[test] + fn test_status_request() { + let expected = json!( + { + "@id": "123456781", + "@type": "https://didcomm.org/coordinate-mediation/1.0/keylist-query", + "paginate": { + "limit": 30, + "offset": 0 + } + } + ); + let paginate_params = KeylistQueryPaginateParams::builder() + .limit(30) + .offset(0) + .build(); + let content = KeylistQueryContent::builder() + .paginate(paginate_params) + .build(); + let decorators = KeylistQueryDecorators::builder().build(); + + test_utils::test_msg( + content, + decorators, + CoordinateMediationTypeV1_0::KeylistQuery, + expected, + ); + } +} diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs new file mode 100644 index 0000000000..d14f3fe57d --- /dev/null +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs @@ -0,0 +1,75 @@ +use serde::{Deserialize, Serialize}; +use typed_builder::TypedBuilder; + +use crate::{decorators::thread::Thread, msg_parts::MsgParts}; + +pub type KeylistUpdate = MsgParts; + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct KeylistUpdateContent { + pub updates: Vec, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, TypedBuilder)] +pub struct KeylistUpdateItem { + pub recipient_key: String, + pub action: KeylistUpdateItemAction, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +pub enum KeylistUpdateItemAction { + #[serde(rename = "add")] + Add, + #[serde(rename = "remove")] + Remove, +} + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct KeylistUpdateDecorators { + #[builder(default, setter(strip_option))] + #[serde(rename = "~thread")] + #[serde(skip_serializing_if = "Option::is_none")] + pub thread: Option, +} + +#[cfg(test)] +#[allow(clippy::field_reassign_with_default)] +mod tests { + use serde_json::json; + + use super::*; + use crate::{ + misc::test_utils, msg_types::protocols::coordinate_mediation::CoordinateMediationTypeV1_0, + }; + + #[test] + fn test_status_request() { + let expected = json!( + { + "@id": "123456781", + "@type": "https://didcomm.org/coordinate-mediation/1.0/keylist-update", + "updates":[ + { + "recipient_key": "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH", + "action": "add" + } + ] + } + ); + let update_item1 = KeylistUpdateItem::builder() + .recipient_key("did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH".to_owned()) + .action(KeylistUpdateItemAction::Add) + .build(); + let content = KeylistUpdateContent::builder() + .updates(vec![update_item1]) + .build(); + let decorators = KeylistUpdateDecorators::builder().build(); + + test_utils::test_msg( + content, + decorators, + CoordinateMediationTypeV1_0::KeylistUpdate, + expected, + ); + } +} diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs new file mode 100644 index 0000000000..417c9c6168 --- /dev/null +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs @@ -0,0 +1,80 @@ +use serde::{Deserialize, Serialize}; +use typed_builder::TypedBuilder; + +use super::keylist_update::KeylistUpdateItemAction; +use crate::{decorators::thread::Thread, msg_parts::MsgParts}; + +pub type KeylistUpdateResponse = + MsgParts; + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct KeylistUpdateResponseContent { + pub updates: Vec, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, TypedBuilder)] +pub struct KeylistUpdateResponseItem { + pub recipient_key: String, + pub action: KeylistUpdateItemAction, + pub result: KeylistUpdateItemResult, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +pub enum KeylistUpdateItemResult { + ClientError, + ServerError, + NoChange, + Success, +} + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct KeylistUpdateResponseDecorators { + #[builder(default, setter(strip_option))] + #[serde(rename = "~thread")] + #[serde(skip_serializing_if = "Option::is_none")] + pub thread: Option, +} + +#[cfg(test)] +#[allow(clippy::field_reassign_with_default)] +mod tests { + use serde_json::json; + + use super::*; + use crate::{ + misc::test_utils, msg_types::protocols::coordinate_mediation::CoordinateMediationTypeV1_0, + }; + + #[test] + fn test_status_request() { + let expected = json!( + { + "@id": "123456781", + "@type": "https://didcomm.org/coordinate-mediation/1.0/keylist-update-response", + "updated": [ + { + "recipient_key": "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH", + "action": "add", // "add" or "remove" + "result": "client_error" // [client_error | server_error | no_change | success] + } + ] + } + ); + let update_item1 = KeylistUpdateResponseItem::builder() + .recipient_key("did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH".to_owned()) + .action(KeylistUpdateItemAction::Add) + .result(KeylistUpdateItemResult::ClientError) + .build(); + let content = KeylistUpdateResponseContent::builder() + .updates(vec![update_item1]) + .build(); + let decorators = KeylistUpdateResponseDecorators::builder().build(); + + test_utils::test_msg( + content, + decorators, + CoordinateMediationTypeV1_0::KeylistUpdate, + expected, + ); + } +} diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs new file mode 100644 index 0000000000..a0f1fde46f --- /dev/null +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs @@ -0,0 +1,47 @@ +use serde::{Deserialize, Serialize}; +use typed_builder::TypedBuilder; + +use crate::{decorators::thread::Thread, msg_parts::MsgParts}; + +pub type MediateDeny = MsgParts; + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct MediateDenyContent {} + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct MediateDenyDecorators { + #[builder(default, setter(strip_option))] + #[serde(rename = "~thread")] + #[serde(skip_serializing_if = "Option::is_none")] + pub thread: Option, +} + +#[cfg(test)] +#[allow(clippy::field_reassign_with_default)] +mod tests { + use serde_json::json; + + use super::*; + use crate::{ + misc::test_utils, msg_types::protocols::coordinate_mediation::CoordinateMediationTypeV1_0, + }; + + #[test] + fn test_status_request() { + let expected = json!( + { + "@id": "123456781", + "@type": "https://didcomm.org/coordinate-mediation/1.0/mediate-deny", + } + ); + let content = MediateDenyContent::builder().build(); + let decorators = MediateDenyDecorators::builder().build(); + + test_utils::test_msg( + content, + decorators, + CoordinateMediationTypeV1_0::MediateDeny, + expected, + ); + } +} diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs new file mode 100644 index 0000000000..122d916087 --- /dev/null +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs @@ -0,0 +1,57 @@ +use serde::{Deserialize, Serialize}; +use typed_builder::TypedBuilder; + +use crate::{decorators::thread::Thread, msg_parts::MsgParts}; + +pub type MediateGrant = MsgParts; + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct MediateGrantContent { + pub endpoint: String, + pub routing_keys: Vec, +} + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct MediateGrantDecorators { + #[builder(default, setter(strip_option))] + #[serde(rename = "~thread")] + #[serde(skip_serializing_if = "Option::is_none")] + pub thread: Option, +} + +#[cfg(test)] +#[allow(clippy::field_reassign_with_default)] +mod tests { + use serde_json::json; + + use super::*; + use crate::{ + misc::test_utils, msg_types::protocols::coordinate_mediation::CoordinateMediationTypeV1_0, + }; + + #[test] + fn test_status_request() { + let expected = json!( + { + "@id": "123456781", + "@type": "https://didcomm.org/coordinate-mediation/1.0/mediate-grant", + "endpoint": "http://mediators-r-us.com", + "routing_keys": ["did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6"] + } + ); + let content = MediateGrantContent::builder() + .endpoint("http://mediators-r-us.com".to_owned()) + .routing_keys(vec![ + "did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6".to_owned(), + ]) + .build(); + let decorators = MediateGrantDecorators::builder().build(); + + test_utils::test_msg( + content, + decorators, + CoordinateMediationTypeV1_0::MediateGrant, + expected, + ); + } +} diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs new file mode 100644 index 0000000000..2c7dbbcc03 --- /dev/null +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs @@ -0,0 +1,47 @@ +use serde::{Deserialize, Serialize}; +use typed_builder::TypedBuilder; + +use crate::{decorators::thread::Thread, msg_parts::MsgParts}; + +pub type MediateRequest = MsgParts; + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct MediateRequestContent {} + +#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] +pub struct MediateRequestDecorators { + #[builder(default, setter(strip_option))] + #[serde(rename = "~thread")] + #[serde(skip_serializing_if = "Option::is_none")] + pub thread: Option, +} + +#[cfg(test)] +#[allow(clippy::field_reassign_with_default)] +mod tests { + use serde_json::json; + + use super::*; + use crate::{ + misc::test_utils, msg_types::protocols::coordinate_mediation::CoordinateMediationTypeV1_0, + }; + + #[test] + fn test_status_request() { + let expected = json!( + { + "@id": "123456781", + "@type": "https://didcomm.org/coordinate-mediation/1.0/mediate-request", + } + ); + let content = MediateRequestContent::builder().build(); + let decorators = MediateRequestDecorators::builder().build(); + + test_utils::test_msg( + content, + decorators, + CoordinateMediationTypeV1_0::MediateRequest, + expected, + ); + } +} diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mod.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mod.rs new file mode 100644 index 0000000000..4c248a64dc --- /dev/null +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mod.rs @@ -0,0 +1,121 @@ +mod keylist; +mod keylist_query; +mod keylist_update; +mod keylist_update_response; +mod mediate_deny; +mod mediate_grant; +mod mediate_request; +use derive_more::From; +use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer}; + +use self::{ + keylist::{Keylist, KeylistContent, KeylistDecorators}, + keylist_query::{KeylistQuery, KeylistQueryContent, KeylistQueryDecorators}, + keylist_update::{KeylistUpdate, KeylistUpdateContent, KeylistUpdateDecorators}, + keylist_update_response::{ + KeylistUpdateResponse, KeylistUpdateResponseContent, KeylistUpdateResponseDecorators, + }, + mediate_deny::{MediateDeny, MediateDenyContent, MediateDenyDecorators}, + mediate_grant::{MediateGrant, MediateGrantContent, MediateGrantDecorators}, + mediate_request::{MediateRequest, MediateRequestContent, MediateRequestDecorators}, +}; +use crate::{ + misc::utils::{into_msg_with_type, transit_to_aries_msg}, + msg_fields::traits::DelayedSerde, + msg_types::{ + protocols::coordinate_mediation::{ + CoordinateMediationType, CoordinateMediationTypeV1, CoordinateMediationTypeV1_0, + }, + MsgWithType, + }, +}; + +#[derive(Clone, Debug, From, PartialEq)] +pub enum CoordinateMediation { + MediateRequest(MediateRequest), + MediateDeny(MediateDeny), + MediateGrant(MediateGrant), + KeylistUpdate(KeylistUpdate), + KeylistUpdateResponse(KeylistUpdateResponse), + KeylistQuery(KeylistQuery), + Keylist(Keylist), +} + +impl DelayedSerde for CoordinateMediation { + type MsgType<'a> = (CoordinateMediationType, &'a str); + + fn delayed_deserialize<'de, D>( + msg_type: Self::MsgType<'de>, + deserializer: D, + ) -> Result + where + D: Deserializer<'de>, + { + let (protocol, kind_str) = msg_type; + + let kind = match protocol { + CoordinateMediationType::V1(CoordinateMediationTypeV1::V1_0(kind)) => { + kind.kind_from_str(kind_str) + } + }; + + match kind.map_err(D::Error::custom)? { + CoordinateMediationTypeV1_0::MediateRequest => { + MediateRequest::deserialize(deserializer).map(From::from) + } + CoordinateMediationTypeV1_0::MediateDeny => { + MediateDeny::deserialize(deserializer).map(From::from) + } + CoordinateMediationTypeV1_0::MediateGrant => { + MediateGrant::deserialize(deserializer).map(From::from) + } + CoordinateMediationTypeV1_0::KeylistUpdate => { + KeylistUpdate::deserialize(deserializer).map(From::from) + } + CoordinateMediationTypeV1_0::KeylistUpdateResponse => { + KeylistUpdateResponse::deserialize(deserializer).map(From::from) + } + CoordinateMediationTypeV1_0::KeylistQuery => { + KeylistQuery::deserialize(deserializer).map(From::from) + } + CoordinateMediationTypeV1_0::Keylist => { + Keylist::deserialize(deserializer).map(From::from) + } + } + } + + fn delayed_serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self { + Self::MediateRequest(v) => MsgWithType::from(v).serialize(serializer), + Self::MediateDeny(v) => MsgWithType::from(v).serialize(serializer), + Self::MediateGrant(v) => MsgWithType::from(v).serialize(serializer), + Self::KeylistUpdate(v) => MsgWithType::from(v).serialize(serializer), + Self::KeylistUpdateResponse(v) => MsgWithType::from(v).serialize(serializer), + Self::KeylistQuery(v) => MsgWithType::from(v).serialize(serializer), + Self::Keylist(v) => MsgWithType::from(v).serialize(serializer), + } + } +} + +transit_to_aries_msg!(MediateRequestContent: MediateRequestDecorators, CoordinateMediation); +transit_to_aries_msg!(MediateDenyContent: MediateDenyDecorators, CoordinateMediation); +transit_to_aries_msg!(MediateGrantContent: MediateGrantDecorators, CoordinateMediation); +transit_to_aries_msg!(KeylistUpdateContent: KeylistUpdateDecorators, CoordinateMediation); +transit_to_aries_msg!(KeylistUpdateResponseContent: KeylistUpdateResponseDecorators, CoordinateMediation); +transit_to_aries_msg!(KeylistQueryContent: KeylistQueryDecorators, CoordinateMediation); +transit_to_aries_msg!(KeylistContent: KeylistDecorators, CoordinateMediation); + +into_msg_with_type!(MediateRequest, CoordinateMediationTypeV1_0, MediateRequest); +into_msg_with_type!(MediateDeny, CoordinateMediationTypeV1_0, MediateDeny); +into_msg_with_type!(MediateGrant, CoordinateMediationTypeV1_0, MediateGrant); +into_msg_with_type!(KeylistUpdate, CoordinateMediationTypeV1_0, KeylistUpdate); +into_msg_with_type!( + KeylistUpdateResponse, + CoordinateMediationTypeV1_0, + KeylistUpdateResponse +); +into_msg_with_type!(KeylistQuery, CoordinateMediationTypeV1_0, KeylistQuery); +into_msg_with_type!(Keylist, CoordinateMediationTypeV1_0, Keylist); diff --git a/messages/src/msg_fields/protocols/mod.rs b/messages/src/msg_fields/protocols/mod.rs index ae5b4a78ad..2c00443e20 100644 --- a/messages/src/msg_fields/protocols/mod.rs +++ b/messages/src/msg_fields/protocols/mod.rs @@ -1,6 +1,7 @@ pub mod basic_message; pub mod common; pub mod connection; +pub mod coordinate_mediation; pub mod cred_issuance; pub mod discover_features; pub mod notification; diff --git a/messages/src/msg_types/protocols/coordinate_mediation.rs b/messages/src/msg_types/protocols/coordinate_mediation.rs new file mode 100644 index 0000000000..a863943419 --- /dev/null +++ b/messages/src/msg_types/protocols/coordinate_mediation.rs @@ -0,0 +1,33 @@ +use derive_more::{From, TryInto}; +use messages_macros::MessageType; +use strum_macros::{AsRefStr, EnumString}; +use transitive::Transitive; + +use super::Protocol; +use crate::msg_types::{MsgKindType, Role}; + +#[derive(Copy, Clone, Debug, From, TryInto, PartialEq, MessageType)] +#[msg_type(protocol = "coordinate-mediation")] +pub enum CoordinateMediationType { + V1(CoordinateMediationTypeV1), +} + +#[derive(Copy, Clone, Debug, From, TryInto, PartialEq, Transitive, MessageType)] +#[transitive(into(CoordinateMediationType, Protocol))] +#[msg_type(major = 1)] +pub enum CoordinateMediationTypeV1 { + #[msg_type(minor = 0, roles = "Role::Mediator")] + V1_0(MsgKindType), +} + +#[derive(Copy, Clone, Debug, AsRefStr, EnumString, PartialEq)] +#[strum(serialize_all = "kebab-case")] +pub enum CoordinateMediationTypeV1_0 { + MediateRequest, + MediateDeny, + MediateGrant, + KeylistUpdate, + KeylistUpdateResponse, + KeylistQuery, + Keylist, +} diff --git a/messages/src/msg_types/protocols/mod.rs b/messages/src/msg_types/protocols/mod.rs index 6064d636f7..412045f1b1 100644 --- a/messages/src/msg_types/protocols/mod.rs +++ b/messages/src/msg_types/protocols/mod.rs @@ -6,10 +6,11 @@ use shared_vcx::misc::utils::CowStr; use self::{ basic_message::BasicMessageType, connection::ConnectionType, - cred_issuance::CredentialIssuanceType, discover_features::DiscoverFeaturesType, - notification::NotificationType, out_of_band::OutOfBandType, pickup::PickupType, - present_proof::PresentProofType, report_problem::ReportProblemType, revocation::RevocationType, - routing::RoutingType, signature::SignatureType, trust_ping::TrustPingType, + coordinate_mediation::CoordinateMediationType, cred_issuance::CredentialIssuanceType, + discover_features::DiscoverFeaturesType, notification::NotificationType, + out_of_band::OutOfBandType, pickup::PickupType, present_proof::PresentProofType, + report_problem::ReportProblemType, revocation::RevocationType, routing::RoutingType, + signature::SignatureType, trust_ping::TrustPingType, }; use crate::{ error::{MsgTypeError, MsgTypeResult}, @@ -18,6 +19,7 @@ use crate::{ pub mod basic_message; pub mod connection; +pub mod coordinate_mediation; pub mod cred_issuance; pub mod discover_features; pub mod notification; @@ -60,6 +62,7 @@ pub enum Protocol { OutOfBandType(OutOfBandType), NotificationType(NotificationType), PickupType(PickupType), + CoordinateMediationType(CoordinateMediationType), } /// Utility macro to avoid harder to read and error prone calling @@ -96,6 +99,7 @@ impl Protocol { match_protocol!(OutOfBandType, protocol, major, minor); match_protocol!(NotificationType, protocol, major, minor); match_protocol!(PickupType, protocol, major, minor); + match_protocol!(CoordinateMediationType, protocol, major, minor); Err(MsgTypeError::unknown_protocol(protocol.to_owned())) } @@ -116,6 +120,7 @@ impl Protocol { Self::OutOfBandType(v) => v.as_protocol_parts(), Self::NotificationType(v) => v.as_protocol_parts(), Self::PickupType(v) => v.as_protocol_parts(), + Self::CoordinateMediationType(v) => v.as_protocol_parts(), } } From 3bd06ef33475415b5f3750a4f67b5c1da8d56ea6 Mon Sep 17 00:00:00 2001 From: Naian <126972030+nain-F49FF806@users.noreply.github.com> Date: Tue, 7 Nov 2023 16:47:15 +0100 Subject: [PATCH 2/8] Add recipient role to mediation related protocols Signed-off-by: Naian <126972030+nain-F49FF806@users.noreply.github.com> --- messages/src/msg_types/protocols/coordinate_mediation.rs | 2 +- messages/src/msg_types/protocols/pickup.rs | 2 +- messages/src/msg_types/role.rs | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/messages/src/msg_types/protocols/coordinate_mediation.rs b/messages/src/msg_types/protocols/coordinate_mediation.rs index a863943419..b6afa8a266 100644 --- a/messages/src/msg_types/protocols/coordinate_mediation.rs +++ b/messages/src/msg_types/protocols/coordinate_mediation.rs @@ -16,7 +16,7 @@ pub enum CoordinateMediationType { #[transitive(into(CoordinateMediationType, Protocol))] #[msg_type(major = 1)] pub enum CoordinateMediationTypeV1 { - #[msg_type(minor = 0, roles = "Role::Mediator")] + #[msg_type(minor = 0, roles = "Role::Mediator, Role::Recipient")] V1_0(MsgKindType), } diff --git a/messages/src/msg_types/protocols/pickup.rs b/messages/src/msg_types/protocols/pickup.rs index 90eb93fe89..381f5307e5 100644 --- a/messages/src/msg_types/protocols/pickup.rs +++ b/messages/src/msg_types/protocols/pickup.rs @@ -16,7 +16,7 @@ pub enum PickupType { #[transitive(into(PickupType, Protocol))] #[msg_type(major = 2)] pub enum PickupTypeV2 { - #[msg_type(minor = 0, roles = "Role::Mediator")] + #[msg_type(minor = 0, roles = "Role::Mediator, Role::Recipient")] V2_0(MsgKindType), } diff --git a/messages/src/msg_types/role.rs b/messages/src/msg_types/role.rs index 878f3624e5..2e570e63af 100644 --- a/messages/src/msg_types/role.rs +++ b/messages/src/msg_types/role.rs @@ -18,4 +18,5 @@ pub enum Role { Notified, Notifier, Mediator, + Recipient, } From b316584e02e05ef8c2fedfe4b868542c8dccde40 Mon Sep 17 00:00:00 2001 From: Naian <126972030+nain-F49FF806@users.noreply.github.com> Date: Tue, 7 Nov 2023 17:33:14 +0100 Subject: [PATCH 3/8] fix: typos, test code and serde renames. Signed-off-by: Naian <126972030+nain-F49FF806@users.noreply.github.com> --- .../protocols/coordinate_mediation/keylist.rs | 10 +++++++--- .../protocols/coordinate_mediation/keylist_query.rs | 2 +- .../protocols/coordinate_mediation/keylist_update.rs | 2 +- .../coordinate_mediation/keylist_update_response.rs | 12 ++++++++---- .../protocols/coordinate_mediation/mediate_deny.rs | 2 +- .../protocols/coordinate_mediation/mediate_grant.rs | 2 +- .../coordinate_mediation/mediate_request.rs | 2 +- 7 files changed, 20 insertions(+), 12 deletions(-) diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs index 27d4938810..10db5d5efe 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs @@ -50,11 +50,11 @@ mod tests { }; #[test] - fn test_status_request() { + fn test_keylist() { let expected = json!( { "@id": "123456781", - "@type": "/keylist", + "@type": "https://didcomm.org/coordinate-mediation/1.0/keylist", "keys": [ { "recipient_key": "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH" @@ -70,7 +70,11 @@ mod tests { let key_item = KeylistItem::builder() .recipient_key("did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH".to_owned()) .build(); - let pagination_state = KeylistPagination::builder().count(30).offset(30).build(); + let pagination_state = KeylistPagination::builder() + .count(30) + .offset(30) + .remaining(100) + .build(); let content = KeylistContent::builder() .pagination(pagination_state) .keys(vec![key_item]) diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs index 891f737b26..966bb60218 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs @@ -41,7 +41,7 @@ mod tests { }; #[test] - fn test_status_request() { + fn test_keylist_query() { let expected = json!( { "@id": "123456781", diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs index d14f3fe57d..fa86cc9f06 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs @@ -43,7 +43,7 @@ mod tests { }; #[test] - fn test_status_request() { + fn test_key_list_update() { let expected = json!( { "@id": "123456781", diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs index 417c9c6168..09e2a3cbf9 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs @@ -9,7 +9,7 @@ pub type KeylistUpdateResponse = #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] pub struct KeylistUpdateResponseContent { - pub updates: Vec, + pub updated: Vec, } #[derive(Clone, Debug, Deserialize, Serialize, PartialEq, TypedBuilder)] @@ -21,9 +21,13 @@ pub struct KeylistUpdateResponseItem { #[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] pub enum KeylistUpdateItemResult { + #[serde(rename = "client_error")] ClientError, + #[serde(rename = "server_error")] ServerError, + #[serde(rename = "no_change")] NoChange, + #[serde(rename = "success")] Success, } @@ -46,7 +50,7 @@ mod tests { }; #[test] - fn test_status_request() { + fn test_keylist_update_response() { let expected = json!( { "@id": "123456781", @@ -66,14 +70,14 @@ mod tests { .result(KeylistUpdateItemResult::ClientError) .build(); let content = KeylistUpdateResponseContent::builder() - .updates(vec![update_item1]) + .updated(vec![update_item1]) .build(); let decorators = KeylistUpdateResponseDecorators::builder().build(); test_utils::test_msg( content, decorators, - CoordinateMediationTypeV1_0::KeylistUpdate, + CoordinateMediationTypeV1_0::KeylistUpdateResponse, expected, ); } diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs index a0f1fde46f..772de625e4 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs @@ -27,7 +27,7 @@ mod tests { }; #[test] - fn test_status_request() { + fn test_mediate_deny() { let expected = json!( { "@id": "123456781", diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs index 122d916087..edf11f23c3 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs @@ -30,7 +30,7 @@ mod tests { }; #[test] - fn test_status_request() { + fn test_mediate_grant() { let expected = json!( { "@id": "123456781", diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs index 2c7dbbcc03..53393f67aa 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs @@ -27,7 +27,7 @@ mod tests { }; #[test] - fn test_status_request() { + fn test_mediate_request() { let expected = json!( { "@id": "123456781", From adf8f3e0e23ff7fa5f372d26213eb364469030f2 Mon Sep 17 00:00:00 2001 From: Naian <126972030+nain-F49FF806@users.noreply.github.com> Date: Tue, 7 Nov 2023 17:33:55 +0100 Subject: [PATCH 4/8] fix: add version to registry Signed-off-by: Naian <126972030+nain-F49FF806@users.noreply.github.com> --- messages/src/msg_types/registry.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/messages/src/msg_types/registry.rs b/messages/src/msg_types/registry.rs index addd216948..c3326e66bd 100644 --- a/messages/src/msg_types/registry.rs +++ b/messages/src/msg_types/registry.rs @@ -9,6 +9,7 @@ use crate::msg_types::{ protocols::{ basic_message::BasicMessageTypeV1, connection::ConnectionTypeV1, + coordinate_mediation::CoordinateMediationTypeV1, cred_issuance::{CredentialIssuanceTypeV1, CredentialIssuanceTypeV2}, discover_features::DiscoverFeaturesTypeV1, notification::NotificationTypeV1, @@ -93,6 +94,8 @@ lazy_static! { map_insert(&mut m, extract_parts!(RevocationTypeV2::new_v2_0())); map_insert(&mut m, extract_parts!(TrustPingTypeV1::new_v1_0())); map_insert(&mut m, extract_parts!(PickupTypeV2::new_v2_0())); + map_insert(&mut m, extract_parts!(CoordinateMediationTypeV1::new_v1_0())); + m }; From 9a12b468153ab0cf054bb0693ebe4935918fb57e Mon Sep 17 00:00:00 2001 From: Naian <126972030+nain-F49FF806@users.noreply.github.com> Date: Wed, 8 Nov 2023 12:46:41 +0100 Subject: [PATCH 5/8] fix: publish structs for external use Signed-off-by: Naian <126972030+nain-F49FF806@users.noreply.github.com> --- .../msg_fields/protocols/coordinate_mediation/mod.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mod.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mod.rs index 4c248a64dc..c96594f24c 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/mod.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mod.rs @@ -1,14 +1,14 @@ -mod keylist; -mod keylist_query; -mod keylist_update; -mod keylist_update_response; +pub mod keylist; +pub mod keylist_query; +pub mod keylist_update; +pub mod keylist_update_response; mod mediate_deny; mod mediate_grant; mod mediate_request; use derive_more::From; use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer}; -use self::{ +pub use self::{ keylist::{Keylist, KeylistContent, KeylistDecorators}, keylist_query::{KeylistQuery, KeylistQueryContent, KeylistQueryDecorators}, keylist_update::{KeylistUpdate, KeylistUpdateContent, KeylistUpdateDecorators}, From a4d69c3b870f7760d0ac80c3fedfbd5b4dcf6dbe Mon Sep 17 00:00:00 2001 From: Naian <126972030+nain-F49FF806@users.noreply.github.com> Date: Mon, 13 Nov 2023 11:56:51 +0100 Subject: [PATCH 6/8] Default NoDecorator for request type messages Request type messages do not need to quote a thread, so use of the provided decorator is unlikely. Response type message keep decorator, since server may want to quote the request msg id in decorator. If there is use case for adding decorator fields then the custom decorator can be reincluded at that point . Signed-off-by: Naian <126972030+nain-F49FF806@users.noreply.github.com> --- aries_vcx/src/handlers/util.rs | 6 +++--- .../protocols/coordinate_mediation/keylist_query.rs | 6 +++--- .../protocols/coordinate_mediation/keylist_update.rs | 7 +++---- .../protocols/coordinate_mediation/mediate_request.rs | 7 +++---- .../src/msg_fields/protocols/coordinate_mediation/mod.rs | 6 +++--- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/aries_vcx/src/handlers/util.rs b/aries_vcx/src/handlers/util.rs index 90a40dddff..bffb85c9e4 100644 --- a/aries_vcx/src/handlers/util.rs +++ b/aries_vcx/src/handlers/util.rs @@ -219,7 +219,7 @@ pub fn verify_thread_id(thread_id: &str, message: &AriesMessage) -> VcxResult<() matches_opt_thread_id!(msg, thread_id) } AriesMessage::CoordinateMediation(CoordinateMediation::MediateRequest(msg)) => { - matches_opt_thread_id!(msg, thread_id) + msg.id == thread_id } AriesMessage::CoordinateMediation(CoordinateMediation::MediateDeny(msg)) => { matches_opt_thread_id!(msg, thread_id) @@ -228,13 +228,13 @@ pub fn verify_thread_id(thread_id: &str, message: &AriesMessage) -> VcxResult<() matches_opt_thread_id!(msg, thread_id) } AriesMessage::CoordinateMediation(CoordinateMediation::KeylistUpdate(msg)) => { - matches_opt_thread_id!(msg, thread_id) + msg.id == thread_id } AriesMessage::CoordinateMediation(CoordinateMediation::KeylistUpdateResponse(msg)) => { matches_opt_thread_id!(msg, thread_id) } AriesMessage::CoordinateMediation(CoordinateMediation::KeylistQuery(msg)) => { - matches_opt_thread_id!(msg, thread_id) + msg.id == thread_id } AriesMessage::CoordinateMediation(CoordinateMediation::Keylist(msg)) => { matches_opt_thread_id!(msg, thread_id) diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs index 966bb60218..a05c8890be 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs @@ -3,7 +3,7 @@ use typed_builder::TypedBuilder; use crate::{decorators::thread::Thread, msg_parts::MsgParts}; -pub type KeylistQuery = MsgParts; +pub type KeylistQuery = MsgParts; #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] pub struct KeylistQueryContent { @@ -34,6 +34,7 @@ pub struct KeylistQueryDecorators { #[allow(clippy::field_reassign_with_default)] mod tests { use serde_json::json; + use shared_vcx::misc::serde_ignored::SerdeIgnored as NoDecorators; use super::*; use crate::{ @@ -59,11 +60,10 @@ mod tests { let content = KeylistQueryContent::builder() .paginate(paginate_params) .build(); - let decorators = KeylistQueryDecorators::builder().build(); test_utils::test_msg( content, - decorators, + NoDecorators, CoordinateMediationTypeV1_0::KeylistQuery, expected, ); diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs index fa86cc9f06..9ab38d4631 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs @@ -3,7 +3,7 @@ use typed_builder::TypedBuilder; use crate::{decorators::thread::Thread, msg_parts::MsgParts}; -pub type KeylistUpdate = MsgParts; +pub type KeylistUpdate = MsgParts; #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] pub struct KeylistUpdateContent { @@ -36,6 +36,7 @@ pub struct KeylistUpdateDecorators { #[allow(clippy::field_reassign_with_default)] mod tests { use serde_json::json; + use shared_vcx::misc::serde_ignored::SerdeIgnored as NoDecorators; use super::*; use crate::{ @@ -63,11 +64,9 @@ mod tests { let content = KeylistUpdateContent::builder() .updates(vec![update_item1]) .build(); - let decorators = KeylistUpdateDecorators::builder().build(); - test_utils::test_msg( content, - decorators, + NoDecorators, CoordinateMediationTypeV1_0::KeylistUpdate, expected, ); diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs index 53393f67aa..c3eb85801d 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs @@ -3,7 +3,7 @@ use typed_builder::TypedBuilder; use crate::{decorators::thread::Thread, msg_parts::MsgParts}; -pub type MediateRequest = MsgParts; +pub type MediateRequest = MsgParts; #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] pub struct MediateRequestContent {} @@ -20,6 +20,7 @@ pub struct MediateRequestDecorators { #[allow(clippy::field_reassign_with_default)] mod tests { use serde_json::json; + use shared_vcx::misc::serde_ignored::SerdeIgnored as NoDecorators; use super::*; use crate::{ @@ -35,11 +36,9 @@ mod tests { } ); let content = MediateRequestContent::builder().build(); - let decorators = MediateRequestDecorators::builder().build(); - test_utils::test_msg( content, - decorators, + NoDecorators, CoordinateMediationTypeV1_0::MediateRequest, expected, ); diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mod.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mod.rs index c96594f24c..1ac01de2db 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/mod.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mod.rs @@ -100,12 +100,12 @@ impl DelayedSerde for CoordinateMediation { } } -transit_to_aries_msg!(MediateRequestContent: MediateRequestDecorators, CoordinateMediation); +transit_to_aries_msg!(MediateRequestContent, CoordinateMediation); transit_to_aries_msg!(MediateDenyContent: MediateDenyDecorators, CoordinateMediation); transit_to_aries_msg!(MediateGrantContent: MediateGrantDecorators, CoordinateMediation); -transit_to_aries_msg!(KeylistUpdateContent: KeylistUpdateDecorators, CoordinateMediation); +transit_to_aries_msg!(KeylistUpdateContent, CoordinateMediation); transit_to_aries_msg!(KeylistUpdateResponseContent: KeylistUpdateResponseDecorators, CoordinateMediation); -transit_to_aries_msg!(KeylistQueryContent: KeylistQueryDecorators, CoordinateMediation); +transit_to_aries_msg!(KeylistQueryContent, CoordinateMediation); transit_to_aries_msg!(KeylistContent: KeylistDecorators, CoordinateMediation); into_msg_with_type!(MediateRequest, CoordinateMediationTypeV1_0, MediateRequest); From 8789e5de789e685ece3681e695156e227a8acb3a Mon Sep 17 00:00:00 2001 From: Naian <126972030+nain-F49FF806@users.noreply.github.com> Date: Mon, 13 Nov 2023 12:11:38 +0100 Subject: [PATCH 7/8] Provide complete pagination info in keylist response. Signed-off-by: Naian <126972030+nain-F49FF806@users.noreply.github.com> --- .../protocols/coordinate_mediation/keylist.rs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs index 10db5d5efe..c82899e216 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs @@ -20,15 +20,9 @@ pub struct KeylistItem { #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] pub struct KeylistPagination { - #[builder(default, setter(strip_option))] - #[serde(skip_serializing_if = "Option::is_none")] - count: Option, - #[builder(default, setter(strip_option))] - #[serde(skip_serializing_if = "Option::is_none")] - offset: Option, - #[builder(default, setter(strip_option))] - #[serde(skip_serializing_if = "Option::is_none")] - remaining: Option, + count: u64, + offset: u64, + remaining: u64, } #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] From a31e2767b19544d6bd65bef3ef0749d0a2cc6fe8 Mon Sep 17 00:00:00 2001 From: Naian <126972030+nain-F49FF806@users.noreply.github.com> Date: Mon, 13 Nov 2023 12:18:51 +0100 Subject: [PATCH 8/8] Add link to protocol spec as doc comments. Signed-off-by: Naian <126972030+nain-F49FF806@users.noreply.github.com> --- .../src/msg_fields/protocols/coordinate_mediation/keylist.rs | 1 + .../msg_fields/protocols/coordinate_mediation/keylist_query.rs | 1 + .../msg_fields/protocols/coordinate_mediation/keylist_update.rs | 1 + .../protocols/coordinate_mediation/keylist_update_response.rs | 1 + .../msg_fields/protocols/coordinate_mediation/mediate_deny.rs | 1 + .../msg_fields/protocols/coordinate_mediation/mediate_grant.rs | 1 + .../msg_fields/protocols/coordinate_mediation/mediate_request.rs | 1 + 7 files changed, 7 insertions(+) diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs index c82899e216..b3974327ff 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist.rs @@ -3,6 +3,7 @@ use typed_builder::TypedBuilder; use crate::{decorators::thread::Thread, msg_parts::MsgParts}; +/// https://github.com/hyperledger/aries-rfcs/blob/main/features/0211-route-coordination/README.md#key-list pub type Keylist = MsgParts; #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs index a05c8890be..04c06f6ffd 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_query.rs @@ -3,6 +3,7 @@ use typed_builder::TypedBuilder; use crate::{decorators::thread::Thread, msg_parts::MsgParts}; +/// https://github.com/hyperledger/aries-rfcs/blob/main/features/0211-route-coordination/README.md#key-list-query pub type KeylistQuery = MsgParts; #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs index 9ab38d4631..25f29dc557 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update.rs @@ -3,6 +3,7 @@ use typed_builder::TypedBuilder; use crate::{decorators::thread::Thread, msg_parts::MsgParts}; +/// https://github.com/hyperledger/aries-rfcs/blob/main/features/0211-route-coordination/README.md#keylist-update pub type KeylistUpdate = MsgParts; #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs index 09e2a3cbf9..7047adbfea 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/keylist_update_response.rs @@ -4,6 +4,7 @@ use typed_builder::TypedBuilder; use super::keylist_update::KeylistUpdateItemAction; use crate::{decorators::thread::Thread, msg_parts::MsgParts}; +/// https://github.com/hyperledger/aries-rfcs/blob/main/features/0211-route-coordination/README.md#keylist-update-response pub type KeylistUpdateResponse = MsgParts; diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs index 772de625e4..24e7fdd3aa 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_deny.rs @@ -3,6 +3,7 @@ use typed_builder::TypedBuilder; use crate::{decorators::thread::Thread, msg_parts::MsgParts}; +/// https://github.com/hyperledger/aries-rfcs/blob/main/features/0211-route-coordination/README.md#mediation-deny pub type MediateDeny = MsgParts; #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs index edf11f23c3..2c2b68a17b 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_grant.rs @@ -3,6 +3,7 @@ use typed_builder::TypedBuilder; use crate::{decorators::thread::Thread, msg_parts::MsgParts}; +/// https://github.com/hyperledger/aries-rfcs/blob/main/features/0211-route-coordination/README.md#mediation-grant pub type MediateGrant = MsgParts; #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)] diff --git a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs index c3eb85801d..ac92f053c9 100644 --- a/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs +++ b/messages/src/msg_fields/protocols/coordinate_mediation/mediate_request.rs @@ -3,6 +3,7 @@ use typed_builder::TypedBuilder; use crate::{decorators::thread::Thread, msg_parts::MsgParts}; +/// https://github.com/hyperledger/aries-rfcs/blob/main/features/0211-route-coordination/README.md#mediation-request pub type MediateRequest = MsgParts; #[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq, TypedBuilder)]