diff --git a/examples/src/cli.rs b/examples/src/cli.rs index 68ff2612..6fdd62aa 100644 --- a/examples/src/cli.rs +++ b/examples/src/cli.rs @@ -156,6 +156,11 @@ enum Commands { help = "parent VID of the sender, used to listen for a response" )] parent_vid: Option, + #[arg( + long, + help = "Ask for confirmation before interacting with unknown end-points" + )] + ask: bool, #[arg(long, help = "wait for a response")] wait: bool, }, @@ -259,6 +264,33 @@ async fn read_wallet( } } +async fn ensure_vid_verified( + vid_wallet: &AsyncSecureStore, + receiver_vid: &str, + wallet_name: &str, + ask: bool, +) -> Result<(), Error> { + if vid_wallet.has_verified_vid(receiver_vid)? { + return Ok(()); + }; + + if !ask + || prompt(format!( + "Do you want to verify receiver DID {}", + receiver_vid + )) + { + vid_wallet.verify_vid(receiver_vid, None).await?; + info!("{receiver_vid} is verified and added to the wallet {wallet_name}"); + Ok(()) + } else { + tracing::error!("Message cannot be sent without verifying the receiver's DID."); + Err(Error::UnverifiedVid( + "Message cannot be sent without verifying the receiver's DID.".to_string(), + )) + } +} + fn prompt(message: String) -> bool { use std::io::{self, BufRead, Write}; print!("{message}? [y/n]"); @@ -581,18 +613,7 @@ async fn run() -> Result<(), Error> { let non_confidential_data = non_confidential_data.as_deref().map(|s| s.as_bytes()); let receiver_vid = vid_wallet.try_resolve_alias(&receiver_vid)?; - if !vid_wallet.has_verified_vid(&receiver_vid)? { - if !ask || prompt(format!("Do you want to verify receiver DID {receiver_vid}")) { - vid_wallet.verify_vid(&receiver_vid, None).await?; - info!( - "{receiver_vid} is verified and added to the wallet {}", - &args.wallet - ); - } else { - tracing::error!("Message cannot be sent without verifying the receiver's DID."); - return Ok(()); - } - } + ensure_vid_verified(&vid_wallet, &receiver_vid, &args.wallet, ask).await?; let mut message = Vec::new(); tokio::io::stdin() @@ -853,8 +874,11 @@ async fn run() -> Result<(), Error> { receiver_vid, nested, parent_vid, + ask, wait, } => { + ensure_vid_verified(&vid_wallet, &receiver_vid, &args.wallet, ask).await?; + // Setup receive stream before sending the request let listener_vid = parent_vid.unwrap_or(sender_vid.clone()); let mut messages = vid_wallet.receive(&listener_vid).await?; diff --git a/examples/tests/cli_tests.rs b/examples/tests/cli_tests.rs index 81895c00..79ac49bf 100644 --- a/examples/tests/cli_tests.rs +++ b/examples/tests/cli_tests.rs @@ -163,7 +163,7 @@ fn test_send_command_unverified_receiver_ask_flag() { .stderr(predicate::str::contains( "Message cannot be sent without verifying the receiver's DID", )) - .success(); + .failure(); // Send a message from Marlon to Marc with --ask flag, answer yes thread::scope(|s| {