Skip to content

Commit 636c295

Browse files
authored
Connection protocol: add encrypt_message, remove auto-problem-report sending (#982)
Connection protocol: add encrypt_message, remove auto-problem-report sending (#982) Signed-off-by: Patrik Stas <patrik.stas@absa.africa>
1 parent ed39a52 commit 636c295

File tree

22 files changed

+69
-204
lines changed

22 files changed

+69
-204
lines changed

agents/rust/aries-vcx-agent/src/services/connection.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ impl ServiceConnections {
9898
request,
9999
self.service_endpoint.clone(),
100100
vec![],
101-
&HttpClient,
102101
)
103102
.await?;
104103

@@ -122,7 +121,7 @@ impl ServiceConnections {
122121
pub async fn accept_response(&self, thread_id: &str, response: Response) -> AgentResult<()> {
123122
let invitee: Connection<_, _> = self.connections.get(thread_id)?.try_into()?;
124123
let invitee = invitee
125-
.handle_response(&self.profile.inject_wallet(), response, &HttpClient)
124+
.handle_response(&self.profile.inject_wallet(), response)
126125
.await?;
127126

128127
self.connections.insert(thread_id, invitee.into())?;

aries_vcx/src/common/credentials/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ mod integration_tests {
112112

113113
assert_eq!(prover_cred.schema_id, schema.schema_id);
114114
assert_eq!(prover_cred.cred_def_id, cred_def.get_cred_def_id());
115-
assert_eq!(prover_cred.cred_rev_id.unwrap().to_string(), cred_rev_id);
115+
assert_eq!(prover_cred.cred_rev_id.unwrap(), cred_rev_id);
116116
assert_eq!(prover_cred.rev_reg_id.unwrap(), rev_reg.rev_reg_id);
117117
})
118118
.await;

aries_vcx/src/core/profile/ledger.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ pub fn indyvdr_build_ledger_read(
6565
let response_cacher = Arc::new(InMemoryResponseCacher::new(cache_config));
6666

6767
let config_read = IndyVdrLedgerReadConfig {
68-
request_submitter: request_submitter.clone(),
68+
request_submitter,
6969
response_parser,
7070
response_cacher,
7171
protocol_version: ProtocolVersion::node_1_4(),

aries_vcx/src/handlers/proof_presentation/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ impl SelectedCredentials {
135135
with_tails_dir: Option<String>,
136136
) {
137137
self.credential_for_referent.insert(
138-
referent.to_string(),
138+
referent,
139139
SelectedCredentialForReferent {
140140
credential: SelectedCredentialForReferentCredential::from(retrieved_cred),
141141
tails_dir: with_tails_dir,

aries_vcx/src/protocols/connection/generic/mod.rs

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use diddoc_legacy::aries::diddoc::AriesDidDoc;
88
use messages::AriesMessage;
99

1010
pub use self::thin_state::{State, ThinState};
11-
use super::{trait_bounds::BootstrapDidDoc, wrap_and_send_msg};
11+
use super::trait_bounds::BootstrapDidDoc;
1212
use crate::{
1313
errors::error::{AriesVcxError, AriesVcxErrorKind, VcxResult},
1414
handlers::util::AnyInvitation,
@@ -194,13 +194,16 @@ impl GenericConnection {
194194
where
195195
T: Transport,
196196
{
197-
let sender_verkey = &self.pairwise_info().pw_vk;
198197
let did_doc = self.their_did_doc().ok_or(AriesVcxError::from_msg(
199198
AriesVcxErrorKind::NotReady,
200199
"No DidDoc present",
201200
))?;
202201

203-
wrap_and_send_msg(wallet, message, sender_verkey, did_doc, transport).await
202+
let msg = self.encrypt_message(wallet, message).await?.0;
203+
let service_endpoint = did_doc.get_endpoint().ok_or_else(|| {
204+
AriesVcxError::from_msg(AriesVcxErrorKind::InvalidUrl, "No URL in DID Doc")
205+
})?;
206+
transport.send_message(msg, service_endpoint).await
204207
}
205208
}
206209

@@ -445,10 +448,7 @@ mod connection_serde_tests {
445448
.decorators(decorators)
446449
.build();
447450

448-
let con = con
449-
.handle_response(&wallet, response, &MockTransport)
450-
.await
451-
.unwrap();
451+
let con = con.handle_response(&wallet, response).await.unwrap();
452452

453453
con.send_message(&wallet, &con.get_ack().into(), &MockTransport)
454454
.await
@@ -497,15 +497,9 @@ mod connection_serde_tests {
497497
.decorators(decorators)
498498
.build();
499499

500-
con.handle_request(
501-
&wallet,
502-
request,
503-
new_service_endpoint,
504-
new_routing_keys,
505-
&MockTransport,
506-
)
507-
.await
508-
.unwrap()
500+
con.handle_request(&wallet, request, new_service_endpoint, new_routing_keys)
501+
.await
502+
.unwrap()
509503
}
510504

511505
async fn make_inviter_completed() -> InviterConnection<InviterCompleted> {

aries_vcx/src/protocols/connection/invitee/mod.rs

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ use crate::{
3232
errors::error::{AriesVcxError, AriesVcxErrorKind, VcxResult},
3333
handlers::util::{matches_thread_id, AnyInvitation},
3434
protocols::connection::trait_bounds::ThreadId,
35-
transport::Transport,
3635
};
3736

3837
/// Convenience alias
@@ -169,15 +168,11 @@ impl InviteeConnection<Requested> {
169168
/// * the thread ID of the response does not match the connection thread ID
170169
/// * no recipient verkeys are provided in the response.
171170
/// * decoding the signed response fails
172-
pub async fn handle_response<T>(
171+
pub async fn handle_response(
173172
self,
174173
wallet: &Arc<dyn BaseWallet>,
175174
response: Response,
176-
transport: &T,
177-
) -> VcxResult<InviteeConnection<Completed>>
178-
where
179-
T: Transport,
180-
{
175+
) -> VcxResult<InviteeConnection<Completed>> {
181176
let is_match = matches_thread_id!(response, self.state.thread_id());
182177

183178
if !is_match {
@@ -197,25 +192,9 @@ impl InviteeConnection<Requested> {
197192
"Cannot handle response: remote verkey not found",
198193
))?;
199194

200-
let did_doc =
201-
match decode_signed_connection_response(wallet, response.content, their_vk).await {
202-
Ok(con_data) => Ok(con_data.did_doc),
203-
Err(err) => {
204-
error!("Request DidDoc validation failed! Sending ProblemReport...");
205-
206-
self.send_problem_report(
207-
wallet,
208-
&err,
209-
self.thread_id(),
210-
&self.state.did_doc,
211-
transport,
212-
)
213-
.await;
214-
215-
Err(err)
216-
}
217-
}?;
218-
195+
let did_doc = decode_signed_connection_response(wallet, response.content, their_vk)
196+
.await?
197+
.did_doc;
219198
let state = Completed::new(did_doc, self.state.did_doc, self.state.thread_id, None);
220199

221200
Ok(Connection {

aries_vcx/src/protocols/connection/inviter/mod.rs

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ use crate::{
2727
errors::error::VcxResult,
2828
handlers::util::{verify_thread_id, AnyInvitation},
2929
protocols::connection::trait_bounds::ThreadId,
30-
transport::Transport,
3130
};
3231

3332
pub type InviterConnection<S> = Connection<Inviter, S>;
@@ -163,17 +162,13 @@ impl InviterConnection<Invited> {
163162
/// invitation
164163
/// * the [`Request`]'s DidDoc is not valid
165164
/// * generating new [`PairwiseInfo`] fails
166-
pub async fn handle_request<T>(
165+
pub async fn handle_request(
167166
self,
168167
wallet: &Arc<dyn BaseWallet>,
169168
request: Request,
170169
new_service_endpoint: Url,
171170
new_routing_keys: Vec<String>,
172-
transport: &T,
173-
) -> VcxResult<InviterConnection<Requested>>
174-
where
175-
T: Transport,
176-
{
171+
) -> VcxResult<InviterConnection<Requested>> {
177172
trace!(
178173
"Connection::process_request >>> request: {:?}, service_endpoint: {}, routing_keys: \
179174
{:?}",
@@ -185,28 +180,7 @@ impl InviterConnection<Invited> {
185180
// There must be some other way to validate the thread ID other than cloning the entire
186181
// Request
187182
verify_thread_id(self.thread_id(), &request.clone().into())?;
188-
189-
// If the request's DidDoc validation fails, we generate and send a ProblemReport.
190-
// We then return early with the provided error.
191-
if let Err(err) = request.content.connection.did_doc.validate() {
192-
error!("Request DidDoc validation failed! Sending ProblemReport...");
193-
194-
self.send_problem_report(
195-
wallet,
196-
&err,
197-
request
198-
.decorators
199-
.thread
200-
.as_ref()
201-
.map(|t| t.thid.as_str())
202-
.unwrap_or(request.id.as_str()),
203-
&request.content.connection.did_doc,
204-
transport,
205-
)
206-
.await;
207-
208-
Err(err)?;
209-
}
183+
request.content.connection.did_doc.validate()?;
210184

211185
// Generate new pairwise info that will be used from this point on
212186
// and incorporate that into the response.

aries_vcx/src/protocols/connection/mod.rs

Lines changed: 18 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,22 @@ pub mod pairwise_info;
66
mod serializable;
77
mod trait_bounds;
88

9-
use std::{error::Error, sync::Arc};
9+
use std::sync::Arc;
1010

1111
use aries_vcx_core::wallet::base_wallet::BaseWallet;
12-
use chrono::Utc;
1312
use diddoc_legacy::aries::diddoc::AriesDidDoc;
1413
use messages::{
15-
decorators::{thread::Thread, timing::Timing},
16-
msg_fields::protocols::{
17-
connection::problem_report::{
18-
ProblemReport, ProblemReportContent, ProblemReportDecorators,
19-
},
20-
discover_features::{disclose::Disclose, query::QueryContent, ProtocolDescriptor},
14+
msg_fields::protocols::discover_features::{
15+
disclose::Disclose, query::QueryContent, ProtocolDescriptor,
2116
},
2217
AriesMessage,
2318
};
24-
use uuid::Uuid;
2519

2620
pub use self::generic::{GenericConnection, State, ThinState};
2721
use self::{
2822
generic::GenericState,
2923
pairwise_info::PairwiseInfo,
30-
trait_bounds::{CompletedState, HandleProblem, TheirDidDoc, ThreadId},
24+
trait_bounds::{CompletedState, TheirDidDoc, ThreadId},
3125
};
3226
use crate::{
3327
errors::error::{AriesVcxError, AriesVcxErrorKind, VcxResult},
@@ -102,6 +96,15 @@ where
10296
self.state.their_did_doc()
10397
}
10498

99+
pub async fn encrypt_message(
100+
&self,
101+
wallet: &Arc<dyn BaseWallet>,
102+
message: &AriesMessage,
103+
) -> VcxResult<EncryptionEnvelope> {
104+
let sender_verkey = &self.pairwise_info().pw_vk;
105+
EncryptionEnvelope::create(wallet, message, Some(sender_verkey), self.their_did_doc()).await
106+
}
107+
105108
pub fn remote_did(&self) -> &str {
106109
&self.their_did_doc().id
107110
}
@@ -126,63 +129,11 @@ where
126129
where
127130
T: Transport,
128131
{
129-
let sender_verkey = &self.pairwise_info().pw_vk;
130-
let did_doc = self.their_did_doc();
131-
wrap_and_send_msg(wallet, message, sender_verkey, did_doc, transport).await
132-
}
133-
}
134-
135-
impl<I, S> Connection<I, S>
136-
where
137-
S: HandleProblem,
138-
{
139-
fn create_problem_report<E>(&self, err: &E, thread_id: &str) -> ProblemReport
140-
where
141-
E: Error,
142-
{
143-
let content = ProblemReportContent::builder()
144-
.explain(err.to_string())
145-
.build();
146-
147-
let decorators = ProblemReportDecorators::builder()
148-
.thread(Thread::builder().thid(thread_id.to_owned()).build())
149-
.timing(Timing::builder().out_time(Utc::now()).build())
150-
.build();
151-
152-
ProblemReport::builder()
153-
.id(Uuid::new_v4().to_string())
154-
.content(content)
155-
.decorators(decorators)
156-
.build()
157-
}
158-
159-
async fn send_problem_report<E, T>(
160-
&self,
161-
wallet: &Arc<dyn BaseWallet>,
162-
err: &E,
163-
thread_id: &str,
164-
did_doc: &AriesDidDoc,
165-
transport: &T,
166-
) where
167-
E: Error,
168-
T: Transport,
169-
{
170-
let sender_verkey = &self.pairwise_info().pw_vk;
171-
let problem_report = self.create_problem_report(err, thread_id);
172-
let res = wrap_and_send_msg(
173-
wallet,
174-
&problem_report.into(),
175-
sender_verkey,
176-
did_doc,
177-
transport,
178-
)
179-
.await;
180-
181-
if let Err(e) = res {
182-
trace!("Error encountered when sending ProblemReport: {}", e);
183-
} else {
184-
info!("Error report sent!");
185-
}
132+
let msg = self.encrypt_message(wallet, message).await?.0;
133+
let service_endpoint = self.their_did_doc().get_endpoint().ok_or_else(|| {
134+
AriesVcxError::from_msg(AriesVcxErrorKind::InvalidUrl, "No URL in DID Doc")
135+
})?;
136+
transport.send_message(msg, service_endpoint).await
186137
}
187138
}
188139

@@ -198,22 +149,3 @@ where
198149
self.state.handle_disclose(disclose)
199150
}
200151
}
201-
202-
pub(crate) async fn wrap_and_send_msg<T>(
203-
wallet: &Arc<dyn BaseWallet>,
204-
message: &AriesMessage,
205-
sender_verkey: &str,
206-
did_doc: &AriesDidDoc,
207-
transport: &T,
208-
) -> VcxResult<()>
209-
where
210-
T: Transport,
211-
{
212-
let env = EncryptionEnvelope::create(wallet, message, Some(sender_verkey), did_doc).await?;
213-
let msg = env.0;
214-
let service_endpoint = did_doc.get_endpoint().ok_or_else(|| {
215-
AriesVcxError::from_msg(AriesVcxErrorKind::InvalidUrl, "No URL in DID Doc")
216-
})?; // This, like many other things, shouldn't clone...
217-
218-
transport.send_message(msg, service_endpoint).await
219-
}

aries_vcx/src/protocols/proof_presentation/verifier/state_machine.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,7 @@ impl VerifierSM {
282282
(state, presentation, PresentationVerificationStatus::Invalid)
283283
.into(),
284284
),
285-
_ => {
286-
VerifierFullState::Finished((state, problem_report.clone()).into())
287-
}
285+
_ => VerifierFullState::Finished((state, problem_report).into()),
288286
}
289287
}
290288
}

aries_vcx/src/utils/devsetup.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ pub fn dev_build_profile_vdrtools(
176176
) -> Arc<dyn Profile> {
177177
info!("dev_build_profile_vdrtools >>");
178178
let vcx_pool_config = VcxPoolConfig {
179-
genesis_file_path: genesis_file_path.clone(),
179+
genesis_file_path,
180180
indy_vdr_config: None,
181181
response_cache_config: None,
182182
};
@@ -185,10 +185,10 @@ pub fn dev_build_profile_vdrtools(
185185
build_ledger_components(wallet.clone(), vcx_pool_config).unwrap();
186186
let anoncreds_ledger_read: Arc<dyn AnoncredsLedgerRead> = ledger_read.clone();
187187
let anoncreds_ledger_write: Arc<dyn AnoncredsLedgerWrite> = ledger_write.clone();
188-
let indy_ledger_read: Arc<dyn IndyLedgerRead> = ledger_read.clone();
189-
let indy_ledger_write: Arc<dyn IndyLedgerWrite> = ledger_write.clone();
188+
let indy_ledger_read: Arc<dyn IndyLedgerRead> = ledger_read;
189+
let indy_ledger_write: Arc<dyn IndyLedgerWrite> = ledger_write;
190190
Arc::new(VdrtoolsProfile::init(
191-
wallet.clone(),
191+
wallet,
192192
anoncreds_ledger_read,
193193
anoncreds_ledger_write,
194194
indy_ledger_read,
@@ -203,7 +203,7 @@ pub fn dev_build_profile_modular(
203203
) -> Arc<dyn Profile> {
204204
info!("dev_build_profile_modular >>");
205205
let vcx_pool_config = VcxPoolConfig {
206-
genesis_file_path: genesis_file_path.clone(),
206+
genesis_file_path,
207207
indy_vdr_config: None,
208208
response_cache_config: None,
209209
};

0 commit comments

Comments
 (0)