Skip to content

Commit 24baf78

Browse files
artembilangaryrussell
authored andcommitted
GH-3373: Support IPV6 in AbstractInboundFileSynch
Fixes #3373 The `AbstractInboundFileSynchronizer` doesn't consider that `hostPort` from `Session` could be in an IPv6 syntax * Parse the `hostPort` from `Session` in a manner that only the last `:` is treated as a port delimiter **Cherry-pick to 5.3.x & 5.2.x**
1 parent e0d77a3 commit 24baf78

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

spring-integration-file/src/main/java/org/springframework/integration/file/remote/synchronizer/AbstractInboundFileSynchronizer.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2019 the original author or authors.
2+
* Copyright 2002-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -493,10 +493,13 @@ protected boolean copyFileToLocalDirectory(String remoteDirectoryPath, F remoteF
493493
if (this.preserveTimestamp && !localFile.setLastModified(modified)) {
494494
throw new IllegalStateException("Could not sent last modified on file: " + localFile);
495495
}
496-
String[] hostPort = session.getHostPort().split(":");
496+
String hostPort = session.getHostPort();
497+
int colonIndex = hostPort.lastIndexOf(":");
498+
String host = hostPort.substring(0, colonIndex);
499+
String port = hostPort.substring(colonIndex + 1);
497500
try {
498501
String remoteFileMetadata =
499-
new URI(protocol(), null, hostPort[0], Integer.parseInt(hostPort[1]),
502+
new URI(protocol(), null, host, Integer.parseInt(port),
500503
'/' + remoteDirectoryPath, null, remoteFileName)
501504
.toString();
502505
this.remoteFileMetadataStore.put(buildMetadataKey(localFile), remoteFileMetadata);

spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpInboundRemoteFileSystemSynchronizerTests.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.integration.sftp.inbound;
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
20+
import static org.mockito.BDDMockito.willReturn;
2021
import static org.mockito.Mockito.mock;
2122
import static org.mockito.Mockito.spy;
2223
import static org.mockito.Mockito.times;
@@ -25,10 +26,12 @@
2526

2627
import java.io.File;
2728
import java.io.FileInputStream;
29+
import java.net.URI;
2830
import java.util.ArrayList;
2931
import java.util.Calendar;
3032
import java.util.Collection;
3133
import java.util.List;
34+
import java.util.Map;
3235
import java.util.Vector;
3336

3437
import org.junit.After;
@@ -65,11 +68,14 @@
6568
*/
6669
public class SftpInboundRemoteFileSystemSynchronizerTests {
6770

68-
private static com.jcraft.jsch.Session jschSession = mock(com.jcraft.jsch.Session.class);
71+
private static final com.jcraft.jsch.Session jschSession = mock(com.jcraft.jsch.Session.class);
6972

7073
@Before
7174
@After
7275
public void cleanup() {
76+
willReturn("::1")
77+
.given(jschSession)
78+
.getHost();
7379
File file = new File("test");
7480
if (file.exists()) {
7581
String[] files = file.list();
@@ -103,7 +109,7 @@ public void testCopyFileToLocalDir() throws Exception {
103109
List<FileListFilter<LsEntry>> filters = new ArrayList<>();
104110
filters.add(persistFilter);
105111
filters.add(patternFilter);
106-
CompositeFileListFilter<LsEntry> filter = new CompositeFileListFilter<LsEntry>(filters);
112+
CompositeFileListFilter<LsEntry> filter = new CompositeFileListFilter<>(filters);
107113
synchronizer.setFilter(filter);
108114
synchronizer.setBeanFactory(mock(BeanFactory.class));
109115
synchronizer.afterPropertiesSet();
@@ -129,6 +135,13 @@ public void testCopyFileToLocalDir() throws Exception {
129135
assertThat(atestFile.getHeaders())
130136
.containsKeys(FileHeaders.REMOTE_HOST_PORT, FileHeaders.REMOTE_DIRECTORY, FileHeaders.REMOTE_FILE);
131137

138+
@SuppressWarnings("unchecked")
139+
Map<String, String> remoteFileMetadataStore =
140+
TestUtils.getPropertyValue(synchronizer, "remoteFileMetadataStore.metadata", Map.class);
141+
142+
String next = remoteFileMetadataStore.values().iterator().next();
143+
assertThat(URI.create(next).getHost()).isEqualTo("[::1]");
144+
132145
Message<File> btestFile = ms.receive();
133146
assertThat(btestFile).isNotNull();
134147
assertThat(btestFile.getPayload().getName()).isEqualTo("b.test");

0 commit comments

Comments
 (0)