Reuse resolved UDP peer for native auth
ci / test (push) Canceled after 0s
ci / fuzz-smoke (push) Canceled after 0s
ci / macos-client (macos-aarch64, macos-14) (push) Canceled after 0s
ci / macos-client (macos-x86_64, macos-13) (push) Canceled after 0s
ci / windows-client (push) Canceled after 0s
ci / package-release (linux-x86_64, ubuntu-latest, , , ) (push) Canceled after 0s
ci / package-release (macos-aarch64, macos-14, , , ) (push) Canceled after 0s
ci / package-release (macos-x86_64, macos-13, , , ) (push) Canceled after 0s
ci / package-release (windows-aarch64, windows-latest, aarch64, windows, aarch64-pc-windows-msvc) (push) Canceled after 0s
ci / package-release (windows-x86_64, windows-latest, , , ) (push) Canceled after 0s
ci / remote-bench (push) Canceled after 0s
ci / publish-gitea-release (push) Canceled after 0s

This commit is contained in:
DuProcess
2026-07-16 20:49:40 -04:00
parent 2dc921b2d5
commit 9d2f3949e6
+20 -13
View File
@@ -451,7 +451,8 @@ async fn main() -> Result<()> {
}; };
let cache_requested_env = requested_env(&config, &host, resolved_ssh_config.as_ref()); 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() { if let Some(mut cached) = credential.clone() {
cached.udp_host = target_udp_host.clone(); cached.udp_host = target_udp_host.clone();
@@ -541,6 +542,7 @@ async fn main() -> Result<()> {
let native_start = Instant::now(); let native_start = Instant::now();
match try_native_auth( match try_native_auth(
&socket, &socket,
target_udp_addr,
&config, &config,
&requested_server, &requested_server,
&server, &server,
@@ -1947,23 +1949,28 @@ async fn run_doctor_for_host(
) { ) {
println!("[warn] native endpoint: {warning}"); println!("[warn] native endpoint: {warning}");
} }
match resolve_addr(&udp_host, dosh_port) { let udp_addr = match resolve_addr(&udp_host, dosh_port) {
Ok(addr) => println!("[ok] udp resolve: {addr}"), Ok(addr) => {
Err(err) => println!("[fail] udp resolve: {err:#}"), println!("[ok] udp resolve: {addr}");
} addr
}
Err(err) => {
println!("[fail] udp resolve: {err:#}");
return Err(err.context("resolve UDP target for native doctor"));
}
};
println!( println!(
"[info] forwarding requested by config: agent={} default_session={}", "[info] forwarding requested by config: agent={} default_session={}",
config.forward_agent, config.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( match try_native_auth_check(
&socket, &socket,
udp_addr,
config, config,
requested, requested,
&server, &server,
ssh_port, ssh_port,
&udp_host,
dosh_port,
args.ssh_key.as_deref(), args.ssh_key.as_deref(),
Some(&parsed_ssh_config), Some(&parsed_ssh_config),
) )
@@ -2393,7 +2400,8 @@ async fn run_proxy_stdio_command(config: &dosh::config::ClientConfig, args: &Arg
let target_udp_host = let target_udp_host =
selected_udp_host(requested_udp_host.as_deref(), &server, &resolved_ssh_config)?; 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 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 let session = args
.session .session
.clone() .clone()
@@ -2407,6 +2415,7 @@ async fn run_proxy_stdio_command(config: &dosh::config::ClientConfig, args: &Arg
}]; }];
let (_frame, cred) = try_native_auth( let (_frame, cred) = try_native_auth(
&socket, &socket,
target_udp_addr,
config, config,
&requested_server, &requested_server,
&server, &server,
@@ -5367,6 +5376,7 @@ async fn send_terminal_udp(socket: &UdpSocket, packet: &[u8], addr: SocketAddr)
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
async fn try_native_auth( async fn try_native_auth(
socket: &UdpSocket, socket: &UdpSocket,
addr: SocketAddr,
config: &dosh::config::ClientConfig, config: &dosh::config::ClientConfig,
requested_server: &str, requested_server: &str,
server: &str, server: &str,
@@ -5383,7 +5393,6 @@ async fn try_native_auth(
requested_env: Vec<EnvVar>, requested_env: Vec<EnvVar>,
allow_passphrase_prompt: bool, allow_passphrase_prompt: bool,
) -> Result<(Frame, CachedCredential)> { ) -> Result<(Frame, CachedCredential)> {
let addr = resolve_addr(udp_host, udp_port)?;
let owned_ssh_config; let owned_ssh_config;
let ssh_config = if let Some(ssh_config) = ssh_config_hint { let ssh_config = if let Some(ssh_config) = ssh_config_hint {
ssh_config ssh_config
@@ -5525,16 +5534,14 @@ async fn try_native_auth(
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
async fn try_native_auth_check( async fn try_native_auth_check(
socket: &UdpSocket, socket: &UdpSocket,
addr: SocketAddr,
config: &dosh::config::ClientConfig, config: &dosh::config::ClientConfig,
requested_server: &str, requested_server: &str,
server: &str, server: &str,
ssh_port: Option<u16>, ssh_port: Option<u16>,
udp_host: &str,
udp_port: u16,
cli_identity: Option<&Path>, cli_identity: Option<&Path>,
ssh_config_hint: Option<&SshConfig>, ssh_config_hint: Option<&SshConfig>,
) -> Result<NativeAuthCheckOkBody> { ) -> Result<NativeAuthCheckOkBody> {
let addr = resolve_addr(udp_host, udp_port)?;
let owned_ssh_config; let owned_ssh_config;
let ssh_config = if let Some(ssh_config) = ssh_config_hint { let ssh_config = if let Some(ssh_config) = ssh_config_hint {
ssh_config ssh_config