Skip to content

Commit 4800bcb

Browse files
authored
Include ~timing decorator on presentation request messages (#545)
* Include ~timing decorator on presentation request messages Signed-off-by: Patrik Stas <[email protected]> * Include ~timing decorator on all outgoing messages Signed-off-by: Patrik Stas <[email protected]> * Add tests to verify messages built by presentation verifier Signed-off-by: Patrik Stas <[email protected]> * Add ~timing on ProblemReport, add message tests for issues Signed-off-by: Patrik Stas <[email protected]> * Reformat Signed-off-by: Patrik Stas <[email protected]> * Add messages tests for credential issuance Signed-off-by: Patrik Stas <[email protected]> * Cargo fix Signed-off-by: Patrik Stas <[email protected]> * Refactor and test building handshake-reuse messages Signed-off-by: Patrik Stas <[email protected]> * Move building trustping messages to protocols module Signed-off-by: Patrik Stas <[email protected]> * Add tests for message building of invitee side of connection protocol Signed-off-by: Patrik Stas <[email protected]> * Refactor, add tests for message building of inviter side of connection protocol Signed-off-by: Patrik Stas <[email protected]> * Cargo fmt Signed-off-by: Patrik Stas <[email protected]> * Cargo fix Signed-off-by: Patrik Stas <[email protected]> * Address code review Signed-off-by: Patrik Stas <[email protected]> * Cargo fix Signed-off-by: Patrik Stas <[email protected]> Signed-off-by: Patrik Stas <[email protected]>
1 parent 0ae7459 commit 4800bcb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1044
-343
lines changed

aries_vcx/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,4 @@ derive_builder = "0.10.2"
5454
tokio = { version = "1.15.0" }
5555

5656
[target.'cfg(target_os = "android")'.dependencies]
57-
android_logger = "0.5"
57+
android_logger = "0.5"

aries_vcx/src/handlers/connection/connection.rs

+23-9
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ use crate::handlers::connection::cloud_agent::CloudAgentInfo;
1919
use crate::handlers::connection::legacy_agent_info::LegacyAgentInfo;
2020
use crate::handlers::connection::public_agent::PublicAgent;
2121
use crate::handlers::discovery::{respond_discovery_query, send_discovery_query};
22-
use crate::handlers::out_of_band::receiver::send_handshake_reuse;
23-
use crate::handlers::out_of_band::sender::send_handshake_reuse_accepted;
24-
use crate::handlers::trust_ping::util::handle_ping;
2522
use crate::handlers::trust_ping::TrustPingSender;
2623
use crate::messages::a2a::protocol_registry::ProtocolRegistry;
2724
use crate::messages::a2a::A2AMessage;
@@ -32,6 +29,8 @@ use crate::messages::discovery::disclose::{Disclose, ProtocolDescriptor};
3229
use crate::protocols::connection::invitee::state_machine::{InviteeFullState, InviteeState, SmConnectionInvitee};
3330
use crate::protocols::connection::inviter::state_machine::{InviterFullState, InviterState, SmConnectionInviter};
3431
use crate::protocols::connection::pairwise_info::PairwiseInfo;
32+
use crate::protocols::oob::{build_handshake_reuse_accepted_msg, build_handshake_reuse_msg};
33+
use crate::protocols::trustping::build_ping_response;
3534
use crate::protocols::SendClosure;
3635
use crate::utils::send_message;
3736
use crate::utils::serialization::SerializableObjectWithState;
@@ -417,14 +416,23 @@ impl Connection {
417416
match message {
418417
A2AMessage::Ping(ping) => {
419418
info!("Answering ping, thread: {}", ping.get_thread_id());
420-
handle_ping(wallet_handle, &ping, pw_vk, &did_doc, send_message).await?;
419+
if ping.response_requested {
420+
send_message(
421+
wallet_handle,
422+
pw_vk.to_string(),
423+
did_doc.clone(),
424+
build_ping_response(&ping).to_a2a_message(),
425+
)
426+
.await?;
427+
}
421428
}
422429
A2AMessage::OutOfBandHandshakeReuse(handshake_reuse) => {
423430
info!(
424431
"Answering OutOfBandHandshakeReuse message, thread: {}",
425432
handshake_reuse.get_thread_id()
426433
);
427-
send_handshake_reuse_accepted(wallet_handle, &handshake_reuse, pw_vk, &did_doc).await?;
434+
let msg = build_handshake_reuse_accepted_msg(&handshake_reuse)?;
435+
send_message(wallet_handle, pw_vk.to_string(), did_doc.clone(), msg.to_a2a_message()).await?;
428436
}
429437
A2AMessage::Query(query) => {
430438
let supported_protocols = ProtocolRegistry::init().get_protocols_for_query(query.query.as_deref());
@@ -691,19 +699,20 @@ impl Connection {
691699
}))
692700
}
693701

694-
fn parse_generic_message(message: &str) -> A2AMessage {
702+
fn build_basic_message(message: &str) -> A2AMessage {
695703
match ::serde_json::from_str::<A2AMessage>(message) {
696704
Ok(a2a_message) => a2a_message,
697705
Err(_) => BasicMessage::create()
698706
.set_content(message.to_string())
699707
.set_time()
708+
.set_out_time()
700709
.to_a2a_message(),
701710
}
702711
}
703712

704713
pub async fn send_generic_message(&self, wallet_handle: WalletHandle, message: &str) -> VcxResult<String> {
705714
trace!("Connection::send_generic_message >>> message: {:?}", message);
706-
let message = Self::parse_generic_message(message);
715+
let message = Self::build_basic_message(message);
707716
let send_message = self.send_message_closure(wallet_handle)?;
708717
send_message(message).await.map(|_| String::new())
709718
}
@@ -748,8 +757,13 @@ impl Connection {
748757
VcxErrorKind::NotReady,
749758
format!("Can't send handshake-reuse to the counterparty, because their did doc is not available"),
750759
))?;
751-
send_handshake_reuse(wallet_handle, &oob.id.0, &self.pairwise_info().pw_vk, &did_doc).await?;
752-
Ok(())
760+
send_message(
761+
wallet_handle,
762+
self.pairwise_info().pw_vk.clone(),
763+
did_doc.clone(),
764+
build_handshake_reuse_msg(&oob).to_a2a_message(),
765+
)
766+
.await
753767
}
754768

755769
pub async fn delete(&self, agency_client: &AgencyClient) -> VcxResult<()> {

aries_vcx/src/handlers/discovery/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub async fn send_discovery_query(
1414
did_doc: &DidDoc,
1515
pw_vk: &str,
1616
) -> VcxResult<()> {
17-
let query_ = Query::create().set_query(query).set_comment(comment);
17+
let query_ = Query::create().set_query(query).set_comment(comment).set_out_time();
1818
send_message(
1919
wallet_handle,
2020
pw_vk.to_string(),
@@ -33,7 +33,8 @@ pub async fn respond_discovery_query(
3333
) -> VcxResult<()> {
3434
let disclose = Disclose::create()
3535
.set_protocols(supported_protocols)
36-
.set_thread_id(&query.id.0.clone());
36+
.set_thread_id(&query.id.0.clone())
37+
.set_out_time();
3738

3839
send_message(
3940
wallet_handle,

aries_vcx/src/handlers/issuance/issuer.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::error::prelude::*;
88
use crate::handlers::connection::connection::Connection;
99
use crate::libindy::utils::anoncreds::libindy_issuer_create_credential_offer;
1010
use crate::messages::a2a::A2AMessage;
11-
use crate::messages::issuance::credential_offer::{CredentialOffer, OfferInfo};
11+
use crate::messages::issuance::credential_offer::OfferInfo;
1212
use crate::messages::issuance::credential_proposal::CredentialProposal;
1313
use crate::messages::issuance::CredentialPreviewData;
1414
use crate::messages::mime_type::MimeType;
@@ -105,17 +105,17 @@ impl Issuer {
105105
) -> VcxResult<()> {
106106
let credential_preview = _build_credential_preview(&offer_info.credential_json)?;
107107
let libindy_cred_offer = libindy_issuer_create_credential_offer(wallet_handle, &offer_info.cred_def_id).await?;
108-
let cred_offer_msg = CredentialOffer::create()
109-
.set_id(&self.issuer_sm.thread_id()?)
110-
.set_offers_attach(&libindy_cred_offer)?
111-
.set_credential_preview_data(credential_preview)
112-
.set_comment(comment);
113-
self.issuer_sm = self.issuer_sm.clone().set_offer(cred_offer_msg, &offer_info)?;
108+
self.issuer_sm = self.issuer_sm.clone().build_credential_offer_msg(
109+
&libindy_cred_offer,
110+
credential_preview,
111+
comment,
112+
&offer_info,
113+
)?;
114114
Ok(())
115115
}
116116

117117
pub fn get_credential_offer_msg(&self) -> VcxResult<A2AMessage> {
118-
let offer = self.issuer_sm.get_credential_offer()?;
118+
let offer = self.issuer_sm.get_credential_offer_msg()?;
119119
Ok(offer.to_a2a_message())
120120
}
121121

aries_vcx/src/handlers/out_of_band/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::messages::attachment::Attachments;
66
use crate::utils::service_resolvable::ServiceResolvable;
77
// TODO: move to messages
88
use crate::messages::mime_type::MimeType;
9+
use crate::messages::timing::Timing;
910

1011
pub mod receiver;
1112
pub mod sender;
@@ -44,6 +45,9 @@ pub struct OutOfBandInvitation {
4445
pub services: Vec<ServiceResolvable>,
4546
#[serde(rename = "requests~attach")]
4647
pub requests_attach: Attachments,
48+
#[serde(rename = "~timing")]
49+
#[serde(skip_serializing_if = "Option::is_none")]
50+
pub timing: Option<Timing>,
4751
}
4852

4953
a2a_message!(OutOfBandInvitation);

aries_vcx/src/handlers/out_of_band/receiver.rs

+2-25
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
use std::clone::Clone;
22

3-
use indy_sys::WalletHandle;
4-
53
use agency_client::agency_client::AgencyClient;
64

7-
use crate::did_doc::DidDoc;
85
use crate::error::prelude::*;
96
use crate::handlers::connection::connection::Connection;
107
use crate::handlers::out_of_band::OutOfBandInvitation;
@@ -14,37 +11,17 @@ use crate::messages::connection::invite::Invitation;
1411
use crate::messages::issuance::credential::Credential;
1512
use crate::messages::issuance::credential_offer::CredentialOffer;
1613
use crate::messages::issuance::credential_request::CredentialRequest;
17-
use crate::messages::out_of_band::handshake_reuse::OutOfBandHandshakeReuse;
14+
1815
use crate::messages::proof_presentation::presentation::Presentation;
1916
use crate::messages::proof_presentation::presentation_request::PresentationRequest;
20-
use crate::utils::send_message;
17+
2118
use crate::utils::service_resolvable::ServiceResolvable;
2219

2320
#[derive(Default, Debug, PartialEq, Clone)]
2421
pub struct OutOfBandReceiver {
2522
pub oob: OutOfBandInvitation,
2623
}
2724

28-
pub async fn send_handshake_reuse(
29-
wallet_handle: WalletHandle,
30-
oob_id: &str,
31-
pw_vk: &str,
32-
did_doc: &DidDoc,
33-
) -> VcxResult<()> {
34-
let reuse_msg = OutOfBandHandshakeReuse::default()
35-
.set_thread_id_matching_id()
36-
.set_parent_thread_id(oob_id);
37-
send_message(
38-
wallet_handle,
39-
pw_vk.to_string(),
40-
did_doc.clone(),
41-
reuse_msg.to_a2a_message(),
42-
)
43-
.await
44-
.ok();
45-
Ok(())
46-
}
47-
4825
impl OutOfBandReceiver {
4926
pub fn create_from_a2a_msg(msg: &A2AMessage) -> VcxResult<Self> {
5027
trace!("OutOfBandReceiver::create_from_a2a_msg >>> msg: {:?}", msg);

aries_vcx/src/handlers/out_of_band/sender.rs

+1-29
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,17 @@
1-
use indy_sys::WalletHandle;
2-
3-
use crate::did_doc::DidDoc;
41
use crate::error::prelude::*;
52
use crate::handlers::out_of_band::{GoalCode, HandshakeProtocol, OutOfBandInvitation};
63
use crate::messages::a2a::message_family::MessageFamilies;
74
use crate::messages::a2a::message_type::MessageType;
85
use crate::messages::a2a::A2AMessage;
96
use crate::messages::attachment::AttachmentId;
10-
use crate::messages::out_of_band::handshake_reuse::OutOfBandHandshakeReuse;
11-
use crate::messages::out_of_band::handshake_reuse_accepted::OutOfBandHandshakeReuseAccepted;
12-
use crate::utils::send_message;
7+
138
use crate::utils::service_resolvable::ServiceResolvable;
149

1510
#[derive(Default, Debug, PartialEq, Clone)]
1611
pub struct OutOfBandSender {
1712
pub oob: OutOfBandInvitation,
1813
}
1914

20-
pub async fn send_handshake_reuse_accepted(
21-
wallet_handle: WalletHandle,
22-
handshake_reuse: &OutOfBandHandshakeReuse,
23-
pw_vk: &str,
24-
did_doc: &DidDoc,
25-
) -> VcxResult<()> {
26-
let thread_id = handshake_reuse.get_thread_id();
27-
let pthread_id = handshake_reuse.thread.pthid.as_deref().ok_or(VcxError::from_msg(
28-
VcxErrorKind::InvalidOption,
29-
"Parent thread id missing",
30-
))?;
31-
let ack_msg = OutOfBandHandshakeReuseAccepted::default()
32-
.set_thread_id(&thread_id)
33-
.set_parent_thread_id(pthread_id);
34-
send_message(
35-
wallet_handle,
36-
pw_vk.to_string(),
37-
did_doc.clone(),
38-
ack_msg.to_a2a_message(),
39-
)
40-
.await
41-
}
42-
4315
impl OutOfBandSender {
4416
pub fn create() -> Self {
4517
Self::default()

aries_vcx/src/handlers/trust_ping/mod.rs

+4-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
use crate::error::{VcxError, VcxErrorKind, VcxResult};
2-
use crate::messages::a2a::MessageId;
2+
33
use crate::messages::trust_ping::ping::Ping;
44
use crate::messages::trust_ping::ping_response::PingResponse;
5+
use crate::protocols::trustping::build_ping;
56
use crate::protocols::SendClosure;
6-
use crate::utils::uuid;
7-
8-
pub mod util;
97

108
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
119
pub struct TrustPingSender {
@@ -16,10 +14,7 @@ pub struct TrustPingSender {
1614

1715
impl TrustPingSender {
1816
pub fn build(request_response: bool, comment: Option<String>) -> TrustPingSender {
19-
// todo : Remove different Default implementation for MessageId in tests, then we can remove this override
20-
let ping = Ping::create(MessageId(uuid::uuid()))
21-
.set_request_response(request_response)
22-
.set_comment(comment);
17+
let ping = build_ping(request_response, comment);
2318
Self {
2419
ping,
2520
ping_sent: false,
@@ -64,9 +59,9 @@ impl TrustPingSender {
6459
#[cfg(feature = "general_test")]
6560
mod unit_tests {
6661
use crate::error::VcxResult;
67-
use crate::handlers::trust_ping::util::build_ping_response;
6862
use crate::handlers::trust_ping::TrustPingSender;
6963
use crate::messages::a2a::A2AMessage;
64+
use crate::protocols::trustping::build_ping_response;
7065
use crate::protocols::SendClosure;
7166
use crate::utils::devsetup::SetupMocks;
7267

aries_vcx/src/handlers/util.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::error::{VcxError, VcxErrorKind, VcxResult};
2-
use crate::global::settings;
2+
33
use crate::messages::a2a::A2AMessage;
44

55
pub fn verify_thread_id(thread_id: &str, message: &A2AMessage) -> VcxResult<()> {

aries_vcx/src/messages/a2a/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use serde::{de, ser, Deserialize, Deserializer, Serialize, Serializer};
2-
use serde_json::{Map, Value};
2+
use serde_json::Value;
33

44
use log;
55

@@ -410,6 +410,7 @@ pub mod test_a2a_serialization {
410410
label: "foobar".to_string(),
411411
connection: Default::default(),
412412
thread: None,
413+
timing: None,
413414
});
414415
let serialized = serde_json::to_string(&a2a_msg).unwrap();
415416

aries_vcx/src/messages/ack.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
use crate::messages::a2a::{A2AMessage, MessageId};
22
use crate::messages::thread::Thread;
3+
use crate::messages::timing::Timing;
4+
use crate::timing_optional;
35

46
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
57
pub struct Ack {
68
#[serde(rename = "@id")]
79
pub id: MessageId,
8-
status: AckStatus,
10+
pub status: AckStatus,
911
#[serde(rename = "~thread")]
1012
pub thread: Thread,
13+
#[serde(rename = "~timing")]
14+
#[serde(skip_serializing_if = "Option::is_none")]
15+
pub timing: Option<Timing>,
1116
}
1217

18+
threadlike!(Ack);
19+
a2a_message!(Ack);
20+
timing_optional!(Ack);
21+
1322
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1423
pub enum AckStatus {
1524
#[serde(rename = "OK")]
@@ -37,9 +46,6 @@ impl Ack {
3746
}
3847
}
3948

40-
threadlike!(Ack);
41-
a2a_message!(Ack);
42-
4349
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
4450
pub struct PleaseAck {}
4551

@@ -64,6 +70,7 @@ pub mod test_utils {
6470
id: MessageId::id(),
6571
status: AckStatus::Fail,
6672
thread: _thread(),
73+
timing: None,
6774
}
6875
}
6976

@@ -72,6 +79,7 @@ pub mod test_utils {
7279
id: MessageId::id(),
7380
status: AckStatus::Ok,
7481
thread: _thread_random(),
82+
timing: None,
7583
}
7684
}
7785

@@ -80,6 +88,7 @@ pub mod test_utils {
8088
id: MessageId::id(),
8189
status: AckStatus::Fail,
8290
thread: _thread_1(),
91+
timing: None,
8392
}
8493
}
8594
}

0 commit comments

Comments
 (0)