From 5ccfcbd96f88a599dd16d315b074b75dad0b50c9 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Tue, 11 Oct 2022 15:08:53 -0400 Subject: [PATCH] Fix SftpSession for host:port resolution The plain `SocketAddress.toString()` may resolve to `hostName/IP` pair which is not parsed properly via `URI.getHost()` downstream leaving `/IP` part for `uri.getPath()` request. In the end this may lead to wrong file name to be used in the SFTP logic * Fix `SftpSession.getHostPort()` to use `SshdSocketAddress` utility to resolve host and port properly from the provided `SocketAddress` --- .../integration/sftp/session/SftpSession.java | 5 ++++- .../org/springframework/integration/sftp/dsl/SftpTests.java | 2 +- .../sftp/inbound/SftpStreamingMessageSourceTests.java | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/SftpSession.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/SftpSession.java index 522b7ec17a..0942800455 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/SftpSession.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/SftpSession.java @@ -20,10 +20,12 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UncheckedIOException; +import java.net.SocketAddress; import java.time.Duration; import java.util.stream.Stream; import java.util.stream.StreamSupport; +import org.apache.sshd.common.util.net.SshdSocketAddress; import org.apache.sshd.sftp.SftpModuleProperties; import org.apache.sshd.sftp.client.SftpClient; import org.apache.sshd.sftp.common.SftpConstants; @@ -200,7 +202,8 @@ public class SftpSession implements Session { @Override public String getHostPort() { - return this.sftpClient.getSession().getConnectAddress().toString(); + SocketAddress connectAddress = this.sftpClient.getSession().getConnectAddress(); + return SshdSocketAddress.toAddressString(connectAddress) + ':' + SshdSocketAddress.toAddressPort(connectAddress); } @Override diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/dsl/SftpTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/dsl/SftpTests.java index c6f851acf1..9947289e0c 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/dsl/SftpTests.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/dsl/SftpTests.java @@ -123,7 +123,7 @@ public class SftpTests extends SftpTestSupport { assertThat(message).isNotNull(); assertThat(message.getPayload()).isInstanceOf(InputStream.class); assertThat(message.getHeaders().get(FileHeaders.REMOTE_FILE)).isIn(" sftpSource1.txt", "sftpSource2.txt"); - assertThat(message.getHeaders().get(FileHeaders.REMOTE_HOST_PORT, String.class)).contains("localhost"); + assertThat(message.getHeaders().get(FileHeaders.REMOTE_HOST_PORT, String.class)).contains("localhost:"); ((InputStream) message.getPayload()).close(); new IntegrationMessageHeaderAccessor(message).getCloseableResource().close(); diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSourceTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSourceTests.java index 2c2c28b126..e126e35376 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSourceTests.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSourceTests.java @@ -119,7 +119,7 @@ public class SftpStreamingMessageSourceTests extends SftpTestSupport { received = (Message) this.data.receive(10000); assertThat(received).isNotNull(); assertThat(received.getHeaders().get(FileHeaders.REMOTE_FILE_INFO)).isInstanceOf(SftpFileInfo.class); - assertThat(received.getHeaders().get(FileHeaders.REMOTE_HOST_PORT, String.class)).contains("localhost"); + assertThat(received.getHeaders().get(FileHeaders.REMOTE_HOST_PORT, String.class)).contains("localhost:"); this.adapter.stop(); }