From cb76cfac16f9f4db6d24449585b87aa048f55e1a Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Mon, 13 Mar 2017 12:50:28 -0400 Subject: [PATCH] Upgrade to sshd-1.4, Gradle 2.14.1 https://build.spring.io/browse/INT-B41-625/ Relates to https://jira.spring.io/browse/INT-4243 --- build.gradle | 8 +-- gradle/wrapper/gradle-wrapper.jar | Bin 52271 -> 53324 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 52 ++++++++--------- gradlew.bat | 8 +-- .../integration/sftp/SftpTestSupport.java | 24 +++----- .../integration/sftp/TestSftpServer.java | 25 +++----- .../SftpStreamingMessageSourceTests.java | 12 ++-- .../session/SftpRemoteFileTemplateTests.java | 26 +++++---- .../sftp/session/SftpServerTests.java | 54 ++++++------------ .../sftp/session/SftpSessionFactoryTests.java | 35 +++--------- 11 files changed, 97 insertions(+), 151 deletions(-) diff --git a/build.gradle b/build.gradle index ebe896db64..364dc4d55d 100644 --- a/build.gradle +++ b/build.gradle @@ -83,7 +83,7 @@ subprojects { subproject -> ext { activeMqVersion = '5.12.3' aspectjVersion = '1.8.7' - apacheSshdVersion = '0.14.0' + apacheSshdVersion = '1.4.0' boonVersion = '0.33' chronicleVersion = '3.4.3' commonsDbcpVersion = '1.4' @@ -953,9 +953,3 @@ task dist(dependsOn: assemble) { group = 'Distribution' description = 'Builds -dist, -docs and -schema distribution archives.' } - -task wrapper(type: Wrapper) { - description = 'Generates gradlew[.bat] scripts' - gradleVersion = '2.5' - distributionUrl = "http://services.gradle.org/distributions/gradle-${gradleVersion}-all.zip" -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 30d399d8d2bf522ff5de94bf434a7cc43a9a74b5..3baa851b28c65f87dd36a6748e1a85cf360c1301 100644 GIT binary patch delta 15582 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 JC_8?u|37MY1^fU2 delta 14568 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 Cm39CC diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2580126796..5958e1e76d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Jul 23 15:28:51 EDT 2015 +#Mon Mar 13 12:28:08 EDT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-2.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip diff --git a/gradlew b/gradlew index 91a7e269e1..27309d9231 100755 --- a/gradlew +++ b/gradlew @@ -6,12 +6,30 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,31 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -90,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -114,6 +113,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` diff --git a/gradlew.bat b/gradlew.bat index aec99730b4..f6d5974e72 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,7 +46,7 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args if "%@eval[2+2]" == "4" goto 4NT_args diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpTestSupport.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpTestSupport.java index 32f7b1a650..faf3fd1219 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpTestSupport.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpTestSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,13 +19,10 @@ package org.springframework.integration.sftp; import java.io.File; import java.util.Collections; -import org.apache.sshd.SshServer; -import org.apache.sshd.common.NamedFactory; import org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory; -import org.apache.sshd.server.Command; -import org.apache.sshd.server.PasswordAuthenticator; +import org.apache.sshd.server.SshServer; import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; -import org.apache.sshd.server.sftp.SftpSubsystem; +import org.apache.sshd.server.subsystem.sftp.SftpSubsystemFactory; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -59,18 +56,11 @@ public class SftpTestSupport extends RemoteFileTestSupport { @BeforeClass public static void createServer() throws Exception { server = SshServer.setUpDefaultServer(); - server.setPasswordAuthenticator(new PasswordAuthenticator() { - - @Override - public boolean authenticate(String username, String password, - org.apache.sshd.server.session.ServerSession session) { - return true; - } - }); + server.setPasswordAuthenticator((username, password, session) -> true); server.setPort(0); - server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser")); - server.setSubsystemFactories(Collections.>singletonList(new SftpSubsystem.Factory())); - server.setFileSystemFactory(new VirtualFileSystemFactory(remoteTemporaryFolder.getRoot().getAbsolutePath())); + server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("hostkey.ser"))); + server.setSubsystemFactories(Collections.singletonList(new SftpSubsystemFactory())); + server.setFileSystemFactory(new VirtualFileSystemFactory(remoteTemporaryFolder.getRoot().toPath())); server.start(); port = server.getPort(); } diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/TestSftpServer.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/TestSftpServer.java index 8befdcdd8b..a4a80541b6 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/TestSftpServer.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/TestSftpServer.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 the original author or authors. + * Copyright 2014-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,14 +21,10 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.Collections; -import org.apache.sshd.SshServer; -import org.apache.sshd.common.NamedFactory; import org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory; -import org.apache.sshd.server.Command; -import org.apache.sshd.server.PasswordAuthenticator; +import org.apache.sshd.server.SshServer; import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; -import org.apache.sshd.server.session.ServerSession; -import org.apache.sshd.server.sftp.SftpSubsystem; +import org.apache.sshd.server.subsystem.sftp.SftpSubsystemFactory; import org.junit.rules.TemporaryFolder; import org.springframework.beans.factory.DisposableBean; @@ -120,18 +116,11 @@ public class TestSftpServer implements InitializingBean, DisposableBean { public void afterPropertiesSet() throws Exception { this.sftpFolder.create(); this.localFolder.create(); - server.setPasswordAuthenticator(new PasswordAuthenticator() { - - @Override - public boolean authenticate(String arg0, String arg1, ServerSession arg2) { - return true; - } - - }); + server.setPasswordAuthenticator((arg0, arg1, arg2) -> true); server.setPort(0); - server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser")); - this.server.setSubsystemFactories(Collections.>singletonList(new SftpSubsystem.Factory())); - this.server.setFileSystemFactory(new VirtualFileSystemFactory(sftpRootFolder.getAbsolutePath())); + server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("hostkey.ser"))); + this.server.setSubsystemFactories(Collections.singletonList(new SftpSubsystemFactory())); + this.server.setFileSystemFactory(new VirtualFileSystemFactory(sftpRootFolder.toPath())); server.start(); } 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 f4ced9d76f..c3c229953d 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 @@ -22,6 +22,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import java.io.InputStream; +import java.util.Comparator; import org.junit.Test; import org.junit.runner.RunWith; @@ -35,10 +36,12 @@ import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.config.EnableIntegration; import org.springframework.integration.core.MessageSource; -import org.springframework.integration.file.filters.AcceptOnceFileListFilter; +import org.springframework.integration.file.remote.FileInfo; import org.springframework.integration.file.remote.session.SessionFactory; +import org.springframework.integration.metadata.SimpleMetadataStore; import org.springframework.integration.scheduling.PollerMetadata; import org.springframework.integration.sftp.SftpTestSupport; +import org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter; import org.springframework.integration.sftp.session.SftpRemoteFileTemplate; import org.springframework.integration.transformer.StreamTransformer; import org.springframework.messaging.Message; @@ -73,7 +76,7 @@ public class SftpStreamingMessageSourceTests extends SftpTestSupport { received = (Message) this.data.receive(10000); assertNotNull(received); assertThat(new String(received.getPayload()), equalTo("source2")); - assertNull(this.data.receive(0)); + assertNull(this.data.receive(10)); } @Configuration @@ -96,9 +99,10 @@ public class SftpStreamingMessageSourceTests extends SftpTestSupport { @Bean @InboundChannelAdapter("stream") public MessageSource ftpMessageSource() { - SftpStreamingMessageSource messageSource = new SftpStreamingMessageSource(template(), null); + SftpStreamingMessageSource messageSource = new SftpStreamingMessageSource(template(), + Comparator.comparing(FileInfo::getFilename)); messageSource.setRemoteDirectory("sftpSource/"); - messageSource.setFilter(new AcceptOnceFileListFilter()); + messageSource.setFilter(new SftpPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "streaming")); return messageSource; } diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpRemoteFileTemplateTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpRemoteFileTemplateTests.java index 84d6776845..e47ae85d08 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpRemoteFileTemplateTests.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpRemoteFileTemplateTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014 the original author or authors. + * Copyright 2014-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,13 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.integration.sftp.session; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; import org.junit.Test; import org.junit.runner.RunWith; @@ -30,7 +36,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.expression.common.LiteralExpression; import org.springframework.integration.file.DefaultFileNameGenerator; import org.springframework.integration.file.remote.ClientCallbackWithoutResult; -import org.springframework.integration.file.remote.SessionCallback; import org.springframework.integration.file.remote.SessionCallbackWithoutResult; import org.springframework.integration.file.remote.session.Session; import org.springframework.integration.file.remote.session.SessionFactory; @@ -51,7 +56,7 @@ import com.jcraft.jsch.SftpException; * @since 4.1 * */ -@ContextConfiguration(classes=TestSftpServerConfig.class) +@ContextConfiguration(classes = TestSftpServerConfig.class) @RunWith(SpringJUnit4ClassRunner.class) @DirtiesContext public class SftpRemoteFileTemplateTests extends SftpTestSupport { @@ -67,14 +72,9 @@ public class SftpRemoteFileTemplateTests extends SftpTestSupport { template.setFileNameGenerator(fileNameGenerator); template.setRemoteDirectoryExpression(new LiteralExpression("foo/")); template.setUseTemporaryFileName(false); - template.execute(new SessionCallback() { - - @Override - public Boolean doInSession(Session session) throws IOException { - session.mkdir("foo/"); - return session.mkdir("foo/bar/"); - } - + template.execute(session -> { + session.mkdir("foo/"); + return session.mkdir("foo/bar/"); }); template.append(new GenericMessage("foo")); template.append(new GenericMessage("bar")); @@ -99,7 +99,9 @@ public class SftpRemoteFileTemplateTests extends SftpTestSupport { assertTrue(session.remove("foo/foobar.txt")); assertTrue(session.rmdir("foo/bar/")); LsEntry[] files = session.list("foo/"); - assertEquals(0, files.length); + List list = Arrays.asList(files); + assertThat(list.stream().map(LsEntry::getFilename).collect(Collectors.toList()), + containsInAnyOrder(".", "..")); assertTrue(session.rmdir("foo/")); } }); diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpServerTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpServerTests.java index 8f6c169c7a..1c020ec9c1 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpServerTests.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpServerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2016 the original author or authors. + * Copyright 2014-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,18 +29,13 @@ import java.security.KeyFactory; import java.security.PublicKey; import java.security.spec.RSAPublicKeySpec; import java.util.Arrays; +import java.util.Base64; import java.util.Collections; -import org.apache.sshd.SshServer; -import org.apache.sshd.common.NamedFactory; import org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory; -import org.apache.sshd.common.util.Base64; -import org.apache.sshd.server.Command; -import org.apache.sshd.server.PasswordAuthenticator; -import org.apache.sshd.server.PublickeyAuthenticator; +import org.apache.sshd.server.SshServer; import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; -import org.apache.sshd.server.session.ServerSession; -import org.apache.sshd.server.sftp.SftpSubsystem; +import org.apache.sshd.server.subsystem.sftp.SftpSubsystemFactory; import org.junit.Test; import org.springframework.core.io.ByteArrayResource; @@ -64,19 +59,14 @@ public class SftpServerTests { public void testUcPw() throws Exception { SshServer server = SshServer.setUpDefaultServer(); try { - server.setPasswordAuthenticator(new PasswordAuthenticator() { - - @Override - public boolean authenticate(String arg0, String arg1, ServerSession arg2) { - return true; - } - }); + server.setPasswordAuthenticator((arg0, arg1, arg2) -> true); server.setPort(0); - server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser")); - server.setSubsystemFactories(Collections.>singletonList(new SftpSubsystem.Factory())); + server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("hostkey.ser"))); + server.setSubsystemFactories(Collections.singletonList(new SftpSubsystemFactory())); final String pathname = System.getProperty("java.io.tmpdir") + File.separator + "sftptest" + File.separator; - new File(pathname).mkdirs(); - server.setFileSystemFactory(new VirtualFileSystemFactory(pathname)); + File rootPath = new File(pathname); + rootPath.mkdirs(); + server.setFileSystemFactory(new VirtualFileSystemFactory(rootPath.toPath())); server.start(); DefaultSftpSessionFactory f = new DefaultSftpSessionFactory(); @@ -108,20 +98,14 @@ public class SftpServerTests { SshServer server = SshServer.setUpDefaultServer(); final PublicKey allowedKey = decodePublicKey(pubKey); try { - server.setPublickeyAuthenticator(new PublickeyAuthenticator() { - - @Override - public boolean authenticate(String username, PublicKey key, ServerSession session) { - return key.equals(allowedKey); - } - - }); + server.setPublickeyAuthenticator((username, key, session) -> key.equals(allowedKey)); server.setPort(0); - server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser")); - server.setSubsystemFactories(Collections.>singletonList(new SftpSubsystem.Factory())); + server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("hostkey.ser"))); + server.setSubsystemFactories(Collections.singletonList(new SftpSubsystemFactory())); final String pathname = System.getProperty("java.io.tmpdir") + File.separator + "sftptest" + File.separator; - new File(pathname).mkdirs(); - server.setFileSystemFactory(new VirtualFileSystemFactory(pathname)); + File rootPath = new File(pathname); + rootPath.mkdirs(); + server.setFileSystemFactory(new VirtualFileSystemFactory(rootPath.toPath())); server.start(); DefaultSftpSessionFactory f = new DefaultSftpSessionFactory(); @@ -145,9 +129,9 @@ public class SftpServerTests { byte[] keyBytes = StreamUtils.copyToByteArray(stream); // strip any newline chars while (keyBytes[keyBytes.length - 1] == 0x0a || keyBytes[keyBytes.length - 1] == 0x0d) { - keyBytes = Arrays.copyOf(keyBytes, keyBytes.length - 1); + keyBytes = Arrays.copyOf(keyBytes, keyBytes.length - 1); } - byte[] decodeBuffer = Base64.decodeBase64(keyBytes); + byte[] decodeBuffer = Base64.getDecoder().decode(keyBytes); ByteBuffer bb = ByteBuffer.wrap(decodeBuffer); int len = bb.getInt(); byte[] type = new byte[len]; @@ -179,7 +163,7 @@ public class SftpServerTests { } session.write(new ByteArrayInputStream("foo".getBytes()), "bar"); list = session.list("."); - assertEquals("bar", list[0].getFilename()); + assertEquals("bar", list[1].getFilename()); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); session.read("bar", outputStream); assertEquals("foo", new String(outputStream.toByteArray())); diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpSessionFactoryTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpSessionFactoryTests.java index 1f376f179c..53b2825f0b 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpSessionFactoryTests.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/session/SftpSessionFactoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2016 the original author or authors. + * Copyright 2014-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,19 +28,14 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import java.io.File; import java.io.IOException; import java.net.ConnectException; -import java.security.PublicKey; import java.util.Collections; -import org.apache.sshd.SshServer; -import org.apache.sshd.common.NamedFactory; -import org.apache.sshd.server.Command; -import org.apache.sshd.server.PasswordAuthenticator; -import org.apache.sshd.server.PublickeyAuthenticator; +import org.apache.sshd.server.SshServer; import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; -import org.apache.sshd.server.session.ServerSession; -import org.apache.sshd.server.sftp.SftpSubsystem; +import org.apache.sshd.server.subsystem.sftp.SftpSubsystemFactory; import org.junit.Test; import org.springframework.core.io.ClassPathResource; @@ -65,15 +60,9 @@ public class SftpSessionFactoryTests { public void testConnectFailSocketOpen() throws Exception { SshServer server = SshServer.setUpDefaultServer(); try { - server.setPasswordAuthenticator(new PasswordAuthenticator() { - - @Override - public boolean authenticate(String arg0, String arg1, ServerSession arg2) { - return true; - } - }); + server.setPasswordAuthenticator((arg0, arg1, arg2) -> true); server.setPort(0); - server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser")); + server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("hostkey.ser"))); server.start(); DefaultSftpSessionFactory f = new DefaultSftpSessionFactory(); @@ -221,16 +210,10 @@ public class SftpSessionFactoryTests { @SuppressWarnings("unchecked") private DefaultSftpSessionFactory createServerAndClient(SshServer server) throws IOException { - server.setPublickeyAuthenticator(new PublickeyAuthenticator() { - - @Override - public boolean authenticate(String username, PublicKey key, ServerSession session) { - return true; - } - }); + server.setPublickeyAuthenticator((username, key, session) -> true); server.setPort(0); - server.setSubsystemFactories(Collections.>singletonList(new SftpSubsystem.Factory())); - server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser")); + server.setSubsystemFactories(Collections.singletonList(new SftpSubsystemFactory())); + server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("hostkey.ser"))); server.start(); DefaultSftpSessionFactory f = new DefaultSftpSessionFactory();