From 57f7e85004ca69ff6d71e1de2f7e0238be8c8bf4 Mon Sep 17 00:00:00 2001 From: ThreeFold Tech Date: Tue, 27 Aug 2024 10:19:32 +0200 Subject: [PATCH] Improved error messages when using wrong TUN name --- mycelium/src/tun/darwin.rs | 27 +++++---- myceliumd/Cargo.lock | 113 +++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 11 deletions(-) diff --git a/mycelium/src/tun/darwin.rs b/mycelium/src/tun/darwin.rs index d010013..529b1b6 100644 --- a/mycelium/src/tun/darwin.rs +++ b/mycelium/src/tun/darwin.rs @@ -82,6 +82,7 @@ pub async fn new( ), Box, > { + println!("TUN NAME FROM CONFIG: {}", tun_config.name); let tun_name = find_available_utun_name(&tun_config.name)?; let mut tun = match create_tun_interface(&tun_name) { @@ -89,7 +90,7 @@ pub async fn new( Err(e) => { error!( "Could not create tun device named \"{}\", make sure the name is not yet in use, and you have sufficient privileges to create a network device", - tun_config.name, + tun_name, ); return Err(e); } @@ -172,21 +173,23 @@ fn validate_utun_name(input: &str) -> bool { } /// Find an available utun interface name -fn find_available_utun_name(preferred_name: &str) -> Result> { +fn find_available_utun_name(preferred_name: &str) -> Result { let interfaces = datalink::interfaces(); let utun_interfaces: Vec<_> = interfaces .iter() .filter(|iface| iface.name.starts_with("utun")) .collect(); - if !preferred_name.is_empty() && validate_utun_name(preferred_name) { - if !utun_interfaces - .iter() - .any(|iface| iface.name == preferred_name) - { - return Ok(preferred_name.to_string()); - } - error!("Preferred utun name '{}' is already in use", preferred_name); + if !preferred_name.is_empty() { + if !validate_utun_name(preferred_name) { + error!("Invalid TUN name: {preferred_name}. Name must start with 'utun' followed by digits"); + return Err(io::Error::new(io::ErrorKind::InvalidInput, "Invalid TUN name")); + } + if interfaces.iter().any(|iface| iface.name == preferred_name) { + error!("TUN name {preferred_name} already in use"); + return Err(io::Error::new(io::ErrorKind::AlreadyExists, "TUN name already in use")); + } + return Ok(preferred_name.to_string()); } let max_utun_number = utun_interfaces @@ -199,9 +202,11 @@ fn find_available_utun_name(preferred_name: &str) -> Result