diff --git a/src/bin/dosh-client.rs b/src/bin/dosh-client.rs index 72eb0a6..7149da2 100644 --- a/src/bin/dosh-client.rs +++ b/src/bin/dosh-client.rs @@ -451,7 +451,8 @@ async fn main() -> Result<()> { }; let cache_requested_env = requested_env(&config, &host, resolved_ssh_config.as_ref()); - let socket = bind_udp_for_peer(resolve_addr(&target_udp_host, dosh_port)?).await?; + let target_udp_addr = resolve_addr(&target_udp_host, dosh_port)?; + let socket = bind_udp_for_peer(target_udp_addr).await?; if let Some(mut cached) = credential.clone() { cached.udp_host = target_udp_host.clone(); @@ -541,6 +542,7 @@ async fn main() -> Result<()> { let native_start = Instant::now(); match try_native_auth( &socket, + target_udp_addr, &config, &requested_server, &server, @@ -1947,23 +1949,28 @@ async fn run_doctor_for_host( ) { println!("[warn] native endpoint: {warning}"); } - match resolve_addr(&udp_host, dosh_port) { - Ok(addr) => println!("[ok] udp resolve: {addr}"), - Err(err) => println!("[fail] udp resolve: {err:#}"), - } + let udp_addr = match resolve_addr(&udp_host, dosh_port) { + Ok(addr) => { + println!("[ok] udp resolve: {addr}"); + addr + } + Err(err) => { + println!("[fail] udp resolve: {err:#}"); + return Err(err.context("resolve UDP target for native doctor")); + } + }; println!( "[info] forwarding requested by config: agent={} default_session={}", config.forward_agent, config.default_session ); - let socket = bind_udp_for_peer(resolve_addr(&udp_host, dosh_port)?).await?; + let socket = bind_udp_for_peer(udp_addr).await?; match try_native_auth_check( &socket, + udp_addr, config, requested, &server, ssh_port, - &udp_host, - dosh_port, args.ssh_key.as_deref(), Some(&parsed_ssh_config), ) @@ -2393,7 +2400,8 @@ async fn run_proxy_stdio_command(config: &dosh::config::ClientConfig, args: &Arg let target_udp_host = selected_udp_host(requested_udp_host.as_deref(), &server, &resolved_ssh_config)?; let dosh_port = args.dosh_port.or(host.port).unwrap_or(config.dosh_port); - let socket = bind_udp_for_peer(resolve_addr(&target_udp_host, dosh_port)?).await?; + let target_udp_addr = resolve_addr(&target_udp_host, dosh_port)?; + let socket = bind_udp_for_peer(target_udp_addr).await?; let session = args .session .clone() @@ -2407,6 +2415,7 @@ async fn run_proxy_stdio_command(config: &dosh::config::ClientConfig, args: &Arg }]; let (_frame, cred) = try_native_auth( &socket, + target_udp_addr, config, &requested_server, &server, @@ -5367,6 +5376,7 @@ async fn send_terminal_udp(socket: &UdpSocket, packet: &[u8], addr: SocketAddr) #[allow(clippy::too_many_arguments)] async fn try_native_auth( socket: &UdpSocket, + addr: SocketAddr, config: &dosh::config::ClientConfig, requested_server: &str, server: &str, @@ -5383,7 +5393,6 @@ async fn try_native_auth( requested_env: Vec, allow_passphrase_prompt: bool, ) -> Result<(Frame, CachedCredential)> { - let addr = resolve_addr(udp_host, udp_port)?; let owned_ssh_config; let ssh_config = if let Some(ssh_config) = ssh_config_hint { ssh_config @@ -5525,16 +5534,14 @@ async fn try_native_auth( #[allow(clippy::too_many_arguments)] async fn try_native_auth_check( socket: &UdpSocket, + addr: SocketAddr, config: &dosh::config::ClientConfig, requested_server: &str, server: &str, ssh_port: Option, - udp_host: &str, - udp_port: u16, cli_identity: Option<&Path>, ssh_config_hint: Option<&SshConfig>, ) -> Result { - let addr = resolve_addr(udp_host, udp_port)?; let owned_ssh_config; let ssh_config = if let Some(ssh_config) = ssh_config_hint { ssh_config