Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 36 additions & 12 deletions examples/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,11 @@ enum Commands {
help = "parent VID of the sender, used to listen for a response"
)]
parent_vid: Option<String>,
#[arg(
long,
help = "Ask for confirmation before interacting with unknown end-points"
)]
ask: bool,
#[arg(long, help = "wait for a response")]
wait: bool,
},
Expand Down Expand Up @@ -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]");
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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?;
Expand Down
2 changes: 1 addition & 1 deletion examples/tests/cli_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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| {
Expand Down