You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2014/12/12 14:18:10 UTC

[1/6] mina-sshd git commit: [SSHD-380] Refactor tests to let the system choose the port instead of using getFreePort() which can lead to problems

Repository: mina-sshd
Updated Branches:
  refs/heads/master 158785367 -> f3d58b906


[SSHD-380] Refactor tests to let the system choose the port instead of using getFreePort() which can lead to problems

Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/24a5f7de
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/24a5f7de
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/24a5f7de

Branch: refs/heads/master
Commit: 24a5f7ded90becf4bcb8b174c23d9e0fee948d58
Parents: 1587853
Author: Guillaume Nodet <gn...@apache.org>
Authored: Mon Dec 1 09:30:39 2014 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Thu Dec 4 10:42:47 2014 +0100

----------------------------------------------------------------------
 .../org/apache/sshd/common/util/IoUtils.java    | 10 ----
 .../test/java/org/apache/sshd/AgentTest.java    |  9 ++-
 .../org/apache/sshd/AuthenticationTest.java     |  4 +-
 .../test/java/org/apache/sshd/CipherTest.java   |  4 +-
 .../test/java/org/apache/sshd/ClientTest.java   |  4 +-
 .../test/java/org/apache/sshd/EcdsaTest.java    |  5 +-
 .../java/org/apache/sshd/KeepAliveTest.java     |  4 +-
 .../src/test/java/org/apache/sshd/KexTest.java  |  4 +-
 .../java/org/apache/sshd/KeyReExchangeTest.java |  4 +-
 .../src/test/java/org/apache/sshd/LoadTest.java |  4 +-
 .../src/test/java/org/apache/sshd/MacTest.java  |  4 +-
 .../org/apache/sshd/PortForwardingLoadTest.java | 33 +++++------
 .../org/apache/sshd/PortForwardingTest.java     | 59 +++++---------------
 .../test/java/org/apache/sshd/ProxyTest.java    |  9 +--
 .../src/test/java/org/apache/sshd/ScpTest.java  |  5 +-
 .../test/java/org/apache/sshd/ServerTest.java   |  4 +-
 .../src/test/java/org/apache/sshd/SftpTest.java |  4 +-
 .../apache/sshd/SinglePublicKeyAuthTest.java    |  3 +-
 .../java/org/apache/sshd/WelcomeBannerTest.java |  4 +-
 .../test/java/org/apache/sshd/util/Utils.java   |  6 +-
 20 files changed, 59 insertions(+), 124 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/main/java/org/apache/sshd/common/util/IoUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/IoUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/IoUtils.java
index 77f1de2..da53e91 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/IoUtils.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/IoUtils.java
@@ -20,7 +20,6 @@ package org.apache.sshd.common.util;
 
 import java.io.Closeable;
 import java.io.IOException;
-import java.net.ServerSocket;
 
 /**
  * TODO Add javadoc
@@ -29,15 +28,6 @@ import java.net.ServerSocket;
  */
 public class IoUtils {
 
-    public static int getFreePort() throws IOException {
-        ServerSocket s = new ServerSocket(0);
-        try {
-            return s.getLocalPort();
-        } finally {
-            s.close();
-        }
-    }
-
     public static void closeQuietly(Closeable... closeables) {
         for (Closeable c : closeables) {
             try {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/AgentTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/AgentTest.java b/sshd-core/src/test/java/org/apache/sshd/AgentTest.java
index c7caba5..c268d76 100644
--- a/sshd-core/src/test/java/org/apache/sshd/AgentTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/AgentTest.java
@@ -43,7 +43,6 @@ import org.apache.sshd.util.Utils;
 import org.junit.Test;
 
 import static org.apache.sshd.util.Utils.createTestKeyPairProvider;
-import static org.apache.sshd.util.Utils.getFreePort;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -99,8 +98,8 @@ public class AgentTest extends BaseTest {
             return;
         }
 
-        int port1 = getFreePort();
-        int port2 = getFreePort();
+        int port1;
+        int port2;
 
         TestEchoShellFactory shellFactory = new TestEchoShellFactory();
         ProxyAgentFactory agentFactory = new ProxyAgentFactory();
@@ -110,22 +109,22 @@ public class AgentTest extends BaseTest {
         localAgentFactory.getAgent().addIdentity(pair, "smx");
 
         SshServer sshd1 = SshServer.setUpDefaultServer();
-        sshd1.setPort(port1);
         sshd1.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd1.setShellFactory(shellFactory);
         sshd1.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd1.setPublickeyAuthenticator(new BogusPublickeyAuthenticator());
         sshd1.setAgentFactory(agentFactory);
         sshd1.start();
+        port1 = sshd1.getPort();
 
         SshServer sshd2 = SshServer.setUpDefaultServer();
-        sshd2.setPort(port2);
         sshd2.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd2.setShellFactory(new TestEchoShellFactory());
         sshd2.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd2.setPublickeyAuthenticator(new BogusPublickeyAuthenticator());
         sshd2.setAgentFactory(new ProxyAgentFactory());
         sshd2.start();
+        port2 = sshd2.getPort();
 
         SshClient client1 = SshClient.setUpDefaultClient();
         client1.setAgentFactory(localAgentFactory);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/AuthenticationTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/AuthenticationTest.java b/sshd-core/src/test/java/org/apache/sshd/AuthenticationTest.java
index 5a7ce51..8c1fb0b 100644
--- a/sshd-core/src/test/java/org/apache/sshd/AuthenticationTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/AuthenticationTest.java
@@ -48,10 +48,7 @@ public class AuthenticationTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        port = Utils.getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.setPublickeyAuthenticator(new BogusPublickeyAuthenticator());
@@ -64,6 +61,7 @@ public class AuthenticationTest extends BaseTest {
             }
         });
         sshd.start();
+        port = sshd.getPort();
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/CipherTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/CipherTest.java b/sshd-core/src/test/java/org/apache/sshd/CipherTest.java
index 7d2334f..af53004 100644
--- a/sshd-core/src/test/java/org/apache/sshd/CipherTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/CipherTest.java
@@ -116,15 +116,13 @@ public class CipherTest extends BaseTest {
 
 
     protected void setUp(NamedFactory<org.apache.sshd.common.Cipher> cipher) throws Exception {
-        port = Utils.getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setCipherFactories(Arrays.<NamedFactory<org.apache.sshd.common.Cipher>>asList(cipher));
         sshd.setShellFactory(new EchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.start();
+        port = sshd.getPort();
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/ClientTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/ClientTest.java b/sshd-core/src/test/java/org/apache/sshd/ClientTest.java
index 22d738d..245973d 100644
--- a/sshd-core/src/test/java/org/apache/sshd/ClientTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/ClientTest.java
@@ -105,12 +105,10 @@ public class ClientTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        port = Utils.getFreePort();
         authLatch = new CountDownLatch(0);
         channelLatch = new CountDownLatch(0);
 
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setShellFactory(new TestEchoShellFactory());
         sshd.setCommandFactory(new CommandFactory() {
@@ -159,6 +157,7 @@ public class ClientTest extends BaseTest {
                 },
                 new TcpipServerChannel.DirectTcpipFactory()));
         sshd.start();
+        port = sshd.getPort();
 
         client = SshClient.setUpDefaultClient();
     }
@@ -620,7 +619,6 @@ public class ClientTest extends BaseTest {
     @Test
     public void testKeyboardInteractiveWithFailures() throws Exception {
         final AtomicInteger count = new AtomicInteger();
-        SshClient client = SshClient.setUpDefaultClient();
         client.getProperties().put(ClientFactoryManager.PASSWORD_PROMPTS, "3");
         client.setUserAuthFactories(Arrays.<NamedFactory<UserAuth>>asList(new UserAuthKeyboardInteractive.Factory()));
         client.setUserInteraction(new UserInteraction() {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/EcdsaTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/EcdsaTest.java b/sshd-core/src/test/java/org/apache/sshd/EcdsaTest.java
index 894c9a9..ae60071 100644
--- a/sshd-core/src/test/java/org/apache/sshd/EcdsaTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/EcdsaTest.java
@@ -90,10 +90,7 @@ public class EcdsaTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        port = Utils.getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
 //        sshd.setShellFactory(new TestEchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.setSessionFactory(new org.apache.sshd.server.session.SessionFactory());
@@ -127,6 +124,7 @@ public class EcdsaTest extends BaseTest {
                 }
             });
             sshd.start();
+            port = sshd.getPort();
 
             client = SshClient.setUpDefaultClient();
             client.setSignatureFactories(Arrays.<NamedFactory<Signature>>asList(
@@ -150,6 +148,7 @@ public class EcdsaTest extends BaseTest {
                 }
             });
             sshd.start();
+            port  = sshd.getPort();
 
             client = SshClient.setUpDefaultClient();
             client.start();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/KeepAliveTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/KeepAliveTest.java b/sshd-core/src/test/java/org/apache/sshd/KeepAliveTest.java
index 3c3f5a2..0b51c33 100644
--- a/sshd-core/src/test/java/org/apache/sshd/KeepAliveTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/KeepAliveTest.java
@@ -51,16 +51,14 @@ public class KeepAliveTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        port = Utils.getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
         sshd.getProperties().put(ServerFactoryManager.IDLE_TIMEOUT, Integer.toString(timeout));
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setShellFactory(new TestEchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.setPublickeyAuthenticator(new BogusPublickeyAuthenticator());
         sshd.start();
+        port  = sshd.getPort();
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/KexTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/KexTest.java b/sshd-core/src/test/java/org/apache/sshd/KexTest.java
index ecca320..2b866e5 100644
--- a/sshd-core/src/test/java/org/apache/sshd/KexTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/KexTest.java
@@ -58,14 +58,12 @@ public class KexTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        port = Utils.getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setShellFactory(new EchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.start();
+        port  = sshd.getPort();
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/KeyReExchangeTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/KeyReExchangeTest.java b/sshd-core/src/test/java/org/apache/sshd/KeyReExchangeTest.java
index d94d768..34e1560 100644
--- a/sshd-core/src/test/java/org/apache/sshd/KeyReExchangeTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/KeyReExchangeTest.java
@@ -60,8 +60,6 @@ public class KeyReExchangeTest extends BaseTest {
     }
 
     protected void setUp(long bytesLimit, long timeLimit) throws Exception {
-        port = Utils.getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
         if (bytesLimit > 0) {
             sshd.getProperties().put(ServerFactoryManager.REKEY_BYTES_LIMIT, Long.toString(bytesLimit));
@@ -69,11 +67,11 @@ public class KeyReExchangeTest extends BaseTest {
         if (timeLimit > 0) {
             sshd.getProperties().put(ServerFactoryManager.REKEY_TIME_LIMIT, Long.toString(timeLimit));
         }
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setShellFactory(new EchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.start();
+        port  = sshd.getPort();
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/LoadTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/LoadTest.java b/sshd-core/src/test/java/org/apache/sshd/LoadTest.java
index 067bb08..cd73484 100644
--- a/sshd-core/src/test/java/org/apache/sshd/LoadTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/LoadTest.java
@@ -47,14 +47,12 @@ public class LoadTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        port = Utils.getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setShellFactory(new EchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.start();
+        port  = sshd.getPort();
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/MacTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/MacTest.java b/sshd-core/src/test/java/org/apache/sshd/MacTest.java
index 478d9be..54e8d4a 100644
--- a/sshd-core/src/test/java/org/apache/sshd/MacTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/MacTest.java
@@ -127,15 +127,13 @@ public class MacTest extends BaseTest {
 
 
     protected void setUp(NamedFactory<Mac> mac) throws Exception {
-        port = Utils.getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setMacFactories(Arrays.<NamedFactory<Mac>>asList(mac));
         sshd.setShellFactory(new EchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.start();
+        port  = sshd.getPort();
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/PortForwardingLoadTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/PortForwardingLoadTest.java b/sshd-core/src/test/java/org/apache/sshd/PortForwardingLoadTest.java
index 66b2584..bee776c 100644
--- a/sshd-core/src/test/java/org/apache/sshd/PortForwardingLoadTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/PortForwardingLoadTest.java
@@ -23,6 +23,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
@@ -76,16 +77,13 @@ public class PortForwardingLoadTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        sshPort = getFreePort();
-        echoPort = getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(sshPort);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setShellFactory(new EchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.setTcpipForwardingFilter(new BogusForwardingFilter());
         sshd.start();
+        sshPort = sshd.getPort();
 
         NioSocketAcceptor acceptor = new NioSocketAcceptor();
         acceptor.setHandler(new IoHandlerAdapter() {
@@ -99,7 +97,8 @@ public class PortForwardingLoadTest extends BaseTest {
             }
         });
         acceptor.setReuseAddress(true);
-        acceptor.bind(new InetSocketAddress(echoPort));
+        acceptor.bind(new InetSocketAddress(0));
+        echoPort = acceptor.getLocalAddress().getPort();
         this.acceptor = acceptor;
 
     }
@@ -129,10 +128,11 @@ public class PortForwardingLoadTest extends BaseTest {
         }
         final String PAYLOAD = sb.toString();
         Session session = createSession();
-        final ServerSocket ss = new ServerSocket(0);
+        final ServerSocket ss = new ServerSocket();
+        ss.setReuseAddress(true);
+        ss.bind(new InetSocketAddress((InetAddress) null, 0));
         int forwardedPort = ss.getLocalPort();
-        int sinkPort = getFreePort();
-        session.setPortForwardingL(sinkPort, "localhost", forwardedPort);
+        int sinkPort = session.setPortForwardingL(0, "localhost", forwardedPort);
         final AtomicInteger conCount = new AtomicInteger(0);
 
         new Thread() {
@@ -188,6 +188,7 @@ public class PortForwardingLoadTest extends BaseTest {
             }
         }
         session.delPortForwardingL(sinkPort);
+        ss.close();
     }
 
     @Test
@@ -200,7 +201,9 @@ public class PortForwardingLoadTest extends BaseTest {
                 "longer Test Data. This is significantly longer Test Data. This is significantly "+
                 "longer Test Data. ";
         Session session = createSession();
-        final ServerSocket ss = new ServerSocket(0);
+        final ServerSocket ss = new ServerSocket();
+        ss.setReuseAddress(true);
+        ss.bind(new InetSocketAddress((InetAddress) null, 0));
         int forwardedPort = ss.getLocalPort();
         int sinkPort = getFreePort();
         session.setPortForwardingR(sinkPort, "localhost", forwardedPort);
@@ -262,6 +265,7 @@ public class PortForwardingLoadTest extends BaseTest {
             Assert.assertTrue(dataOK[i]);
         }
         session.delPortForwardingR(forwardedPort);
+        ss.close();
     }
 
     @Test
@@ -276,7 +280,6 @@ public class PortForwardingLoadTest extends BaseTest {
         final int nbDownloads = 2;
         final int nbLoops = 2;
 
-        final int port = getFreePort();
         StringBuilder resp = new StringBuilder();
         resp.append("<html><body>\n");
         for (int i = 0; i < 1000; i++) {
@@ -297,17 +300,15 @@ public class PortForwardingLoadTest extends BaseTest {
             }
         });
         acceptor.setReuseAddress(true);
-        acceptor.bind(new InetSocketAddress(port));
-
+        acceptor.bind(new InetSocketAddress(0));
+        final int port = acceptor.getLocalAddress().getPort();
 
         Session session = createSession();
 
-        final int forwardedPort1 = getFreePort();
+        final int forwardedPort1 = session.setPortForwardingL(0, host, port);
         final int forwardedPort2 = getFreePort();
-        System.err.println("URL: http://localhost:" + forwardedPort2);
-
-        session.setPortForwardingL(forwardedPort1, host, port);
         session.setPortForwardingR(forwardedPort2, "localhost", forwardedPort1);
+        System.err.println("URL: http://localhost:" + forwardedPort2);
 
 
         final CountDownLatch latch = new CountDownLatch(nbThread * nbDownloads * nbLoops);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/PortForwardingTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/PortForwardingTest.java b/sshd-core/src/test/java/org/apache/sshd/PortForwardingTest.java
index 4f8be1c..cd21784 100644
--- a/sshd-core/src/test/java/org/apache/sshd/PortForwardingTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/PortForwardingTest.java
@@ -33,8 +33,6 @@ import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.sshd.client.channel.ChannelDirectTcpip;
-import org.apache.sshd.client.future.AuthFuture;
-import org.apache.sshd.client.future.ConnectFuture;
 import org.apache.sshd.common.SshdSocketAddress;
 import org.apache.sshd.util.BaseTest;
 import org.apache.sshd.util.BogusForwardingFilter;
@@ -67,18 +65,15 @@ public class PortForwardingTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        sshPort = getFreePort();
-        echoPort = getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
         sshd.getProperties().put(SshServer.WINDOW_SIZE, "2048");
         sshd.getProperties().put(SshServer.MAX_PACKET_SIZE, "256");
-        sshd.setPort(sshPort);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setShellFactory(new EchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.setTcpipForwardingFilter(new BogusForwardingFilter());
         sshd.start();
+        sshPort = sshd.getPort();
 
         NioSocketAcceptor acceptor = new NioSocketAcceptor();
         acceptor.setHandler(new IoHandlerAdapter() {
@@ -92,7 +87,8 @@ public class PortForwardingTest extends BaseTest {
             }
         });
         acceptor.setReuseAddress(true);
-        acceptor.bind(new InetSocketAddress(echoPort));
+        acceptor.bind(new InetSocketAddress(0));
+        echoPort = acceptor.getLocalAddress().getPort();
         this.acceptor = acceptor;
 
     }
@@ -135,13 +131,12 @@ public class PortForwardingTest extends BaseTest {
     public void testRemoteForwardingNative() throws Exception {
         ClientSession session = createNativeSession();
 
-        int forwardedPort = getFreePort();
-        SshdSocketAddress remote = new SshdSocketAddress("", forwardedPort);
+        SshdSocketAddress remote = new SshdSocketAddress("", 0);
         SshdSocketAddress local = new SshdSocketAddress("localhost", echoPort);
 
-        session.startRemotePortForwarding(remote, local);
+        SshdSocketAddress bound = session.startRemotePortForwarding(remote, local);
 
-        Socket s = new Socket(remote.getHostName(), remote.getPort());
+        Socket s = new Socket(bound.getHostName(), bound.getPort());
         s.getOutputStream().write("Hello".getBytes());
         s.getOutputStream().flush();
         byte[] buf = new byte[1024];
@@ -158,15 +153,14 @@ public class PortForwardingTest extends BaseTest {
     public void testRemoteForwardingNativeBigPayload() throws Exception {
         ClientSession session = createNativeSession();
 
-        int forwardedPort = getFreePort();
-        SshdSocketAddress remote = new SshdSocketAddress("", forwardedPort);
+        SshdSocketAddress remote = new SshdSocketAddress("", 0);
         SshdSocketAddress local = new SshdSocketAddress("localhost", echoPort);
 
-        session.startRemotePortForwarding(remote, local);
+        SshdSocketAddress bound = session.startRemotePortForwarding(remote, local);
 
         byte[] buf = new byte[1024];
 
-        Socket s = new Socket(remote.getHostName(), remote.getPort());
+        Socket s = new Socket(bound.getHostName(), bound.getPort());
         for (int i = 0; i < 1000; i++) {
             s.getOutputStream().write("0123456789".getBytes());
             s.getOutputStream().flush();
@@ -181,28 +175,6 @@ public class PortForwardingTest extends BaseTest {
     }
 
     @Test
-    public void testRemoteForwardingNativeNoExplicitPort() throws Exception {
-        ClientSession session = createNativeSession();
-
-        SshdSocketAddress remote = new SshdSocketAddress("0.0.0.0", 0);
-        SshdSocketAddress local = new SshdSocketAddress("localhost", echoPort);
-
-        SshdSocketAddress bound = session.startRemotePortForwarding(remote, local);
-
-        Socket s = new Socket(bound.getHostName(), bound.getPort());
-        s.getOutputStream().write("Hello".getBytes());
-        s.getOutputStream().flush();
-        byte[] buf = new byte[1024];
-        int n = s.getInputStream().read(buf);
-        String res = new String(buf, 0, n);
-        assertEquals("Hello", res);
-        s.close();
-
-        session.stopRemotePortForwarding(bound);
-        session.close(false).await();
-    }
-
-    @Test
     public void testLocalForwarding() throws Exception {
         Session session = createSession();
 
@@ -248,9 +220,7 @@ public class PortForwardingTest extends BaseTest {
     public void testLocalForwardingNativeReuse() throws Exception {
         ClientSession session = createNativeSession();
 
-        int port = getFreePort();
-
-        SshdSocketAddress local = new SshdSocketAddress("", port);
+        SshdSocketAddress local = new SshdSocketAddress("", 0);
         SshdSocketAddress remote = new SshdSocketAddress("localhost", echoPort);
 
         SshdSocketAddress bound = session.startLocalPortForwarding(local, remote);
@@ -266,7 +236,7 @@ public class PortForwardingTest extends BaseTest {
     public void testLocalForwardingNativeBigPayload() throws Exception {
         ClientSession session = createNativeSession();
 
-        SshdSocketAddress local = new SshdSocketAddress("", getFreePort());
+        SshdSocketAddress local = new SshdSocketAddress("", 0);
         SshdSocketAddress remote = new SshdSocketAddress("localhost", echoPort);
 
         SshdSocketAddress bound = session.startLocalPortForwarding(local, remote);
@@ -290,8 +260,7 @@ public class PortForwardingTest extends BaseTest {
     public void testForwardingChannel() throws Exception {
         ClientSession session = createNativeSession();
 
-        int forwardedPort = getFreePort();
-        SshdSocketAddress local = new SshdSocketAddress("", forwardedPort);
+        SshdSocketAddress local = new SshdSocketAddress("", 0);
         SshdSocketAddress remote = new SshdSocketAddress("localhost", echoPort);
 
         ChannelDirectTcpip channel = session.createDirectTcpipChannel(local, remote);
@@ -317,7 +286,7 @@ public class PortForwardingTest extends BaseTest {
         session.setPortForwardingR(forwardedPort, "localhost", echoPort);
 
         // 2. Establish a connection through it
-        new Socket("localhost", forwardedPort);
+        Socket s = new Socket("localhost", forwardedPort);
 
         // 3. Simulate the client going away
         rudelyDisconnectJschSession(session);
@@ -348,6 +317,8 @@ public class PortForwardingTest extends BaseTest {
 
         session.delPortForwardingR(forwardedPort);
         session.disconnect();
+
+        s.close();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/ProxyTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/ProxyTest.java b/sshd-core/src/test/java/org/apache/sshd/ProxyTest.java
index e8170a5..0bb3dba 100644
--- a/sshd-core/src/test/java/org/apache/sshd/ProxyTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/ProxyTest.java
@@ -42,7 +42,6 @@ import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.sshd.util.Utils.getFreePort;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -61,18 +60,15 @@ public class ProxyTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        sshPort = getFreePort();
-        echoPort = getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
         sshd.getProperties().put(SshServer.WINDOW_SIZE, "2048");
         sshd.getProperties().put(SshServer.MAX_PACKET_SIZE, "256");
-        sshd.setPort(sshPort);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setShellFactory(new EchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.setTcpipForwardingFilter(new BogusForwardingFilter());
         sshd.start();
+        sshPort = sshd.getPort();
 
         NioSocketAcceptor acceptor = new NioSocketAcceptor();
         acceptor.setHandler(new IoHandlerAdapter() {
@@ -86,7 +82,8 @@ public class ProxyTest extends BaseTest {
             }
         });
         acceptor.setReuseAddress(true);
-        acceptor.bind(new InetSocketAddress(echoPort));
+        acceptor.bind(new InetSocketAddress(0));
+        echoPort = acceptor.getLocalAddress().getPort();
         this.acceptor = acceptor;
 
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/ScpTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/ScpTest.java b/sshd-core/src/test/java/org/apache/sshd/ScpTest.java
index 66322b1..0c6679b 100644
--- a/sshd-core/src/test/java/org/apache/sshd/ScpTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/ScpTest.java
@@ -63,16 +63,13 @@ public class ScpTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        port = Utils.getFreePort();
-//        port = 8102;
-
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setCommandFactory(new ScpCommandFactory());
         sshd.setShellFactory(new EchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.start();
+        port = sshd.getPort();
     }
 
     protected com.jcraft.jsch.Session getJschSession() throws JSchException {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/ServerTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/ServerTest.java b/sshd-core/src/test/java/org/apache/sshd/ServerTest.java
index 87b59e5..a1ce149 100644
--- a/sshd-core/src/test/java/org/apache/sshd/ServerTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/ServerTest.java
@@ -63,15 +63,13 @@ public class ServerTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        port = Utils.getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setShellFactory(new TestEchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.setSessionFactory(new org.apache.sshd.server.session.SessionFactory());
         sshd.start();
+        port = sshd.getPort();
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/SftpTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/SftpTest.java b/sshd-core/src/test/java/org/apache/sshd/SftpTest.java
index 2d1b341..6585966 100644
--- a/sshd-core/src/test/java/org/apache/sshd/SftpTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/SftpTest.java
@@ -62,16 +62,14 @@ public class SftpTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        port = Utils.getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setSubsystemFactories(Arrays.<NamedFactory<Command>>asList(new SftpSubsystem.Factory()));
         sshd.setCommandFactory(new ScpCommandFactory());
         sshd.setShellFactory(new EchoShellFactory());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.start();
+        port = sshd.getPort();
 
         JSchLogger.init();
         JSch sch = new JSch();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/SinglePublicKeyAuthTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/SinglePublicKeyAuthTest.java b/sshd-core/src/test/java/org/apache/sshd/SinglePublicKeyAuthTest.java
index 5341bbb..240ba1f 100644
--- a/sshd-core/src/test/java/org/apache/sshd/SinglePublicKeyAuthTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/SinglePublicKeyAuthTest.java
@@ -57,9 +57,7 @@ public class SinglePublicKeyAuthTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        port = Utils.getFreePort();
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setCommandFactory(new CommandFactory() {
             public Command createCommand(String command) {
@@ -73,6 +71,7 @@ public class SinglePublicKeyAuthTest extends BaseTest {
             }
         });
         sshd.start();
+        port = sshd.getPort();
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/WelcomeBannerTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/WelcomeBannerTest.java b/sshd-core/src/test/java/org/apache/sshd/WelcomeBannerTest.java
index cafdc34..9fae759 100644
--- a/sshd-core/src/test/java/org/apache/sshd/WelcomeBannerTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/WelcomeBannerTest.java
@@ -40,15 +40,13 @@ public class WelcomeBannerTest extends BaseTest {
 
     @Before
     public void setUp() throws Exception {
-        port = Utils.getFreePort();
-
         sshd = SshServer.setUpDefaultServer();
-        sshd.setPort(port);
         sshd.setKeyPairProvider(Utils.createTestHostKeyProvider());
         sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator());
         sshd.setPublickeyAuthenticator(new BogusPublickeyAuthenticator());
         sshd.getProperties().put(SshServer.WELCOME_BANNER, WELCOME);
         sshd.start();
+        port = sshd.getPort();
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/24a5f7de/sshd-core/src/test/java/org/apache/sshd/util/Utils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/util/Utils.java b/sshd-core/src/test/java/org/apache/sshd/util/Utils.java
index ae91d64..7cdf950 100644
--- a/sshd-core/src/test/java/org/apache/sshd/util/Utils.java
+++ b/sshd-core/src/test/java/org/apache/sshd/util/Utils.java
@@ -19,6 +19,8 @@
 package org.apache.sshd.util;
 
 import java.io.File;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.URISyntaxException;
 import java.net.URL;
@@ -39,8 +41,10 @@ public class Utils {
     }
 
     public static int getFreePort() throws Exception {
-        ServerSocket s = new ServerSocket(0);
+        ServerSocket s = new ServerSocket();
         try {
+            s.setReuseAddress(true);
+            s.bind(new InetSocketAddress((InetAddress) null, 0));
             return s.getLocalPort();
         } finally {
             s.close();


[5/6] mina-sshd git commit: [SSHD-385] Fix log statement when a window is unblocked

Posted by gn...@apache.org.
[SSHD-385] Fix log statement when a window is unblocked

Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/55bc6815
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/55bc6815
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/55bc6815

Branch: refs/heads/master
Commit: 55bc68154d6c4f9d62aaacf84f97911e4f0023d5
Parents: 41b261c
Author: Guillaume Nodet <gn...@apache.org>
Authored: Fri Dec 12 10:54:56 2014 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Fri Dec 12 10:54:56 2014 +0100

----------------------------------------------------------------------
 .../java/org/apache/sshd/common/channel/Window.java     | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55bc6815/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
index bc7e685..cf7534c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
@@ -127,7 +127,11 @@ public class Window {
                 lock.wait();
             }
             if (waiting) {
-                log.debug("Space available for {}", name);
+                if (closed) {
+                    log.debug("Window {} has been closed", name);
+                } else {
+                    log.debug("Space available for {}", name);
+                }
                 waiting = false;
             }
             if (closed) {
@@ -148,7 +152,11 @@ public class Window {
                 lock.wait();
             }
             if (waiting) {
-                log.debug("Space available for {}", name);
+                if (closed) {
+                    log.debug("Window {} has been closed", name);
+                } else {
+                    log.debug("Space available for {}", name);
+                }
                 waiting = false;
             }
             if (closed) {


[6/6] mina-sshd git commit: [SSHD-386] Allow controlling socket options

Posted by gn...@apache.org.
[SSHD-386] Allow controlling socket options

Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/f3d58b90
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/f3d58b90
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/f3d58b90

Branch: refs/heads/master
Commit: f3d58b906d795bac587f77eedb4647ad421b260d
Parents: 55bc681
Author: Guillaume Nodet <gn...@apache.org>
Authored: Fri Dec 12 14:07:55 2014 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Fri Dec 12 14:07:55 2014 +0100

----------------------------------------------------------------------
 .../org/apache/sshd/common/FactoryManager.java  | 42 ++++++++++++++++++++
 .../sshd/common/io/mina/MinaAcceptor.java       | 35 +++++-----------
 .../sshd/common/io/mina/MinaConnector.java      |  6 +--
 .../apache/sshd/common/io/mina/MinaService.java | 37 +++++++++++++++++
 .../sshd/common/io/nio2/Nio2Acceptor.java       | 14 ++++++-
 .../sshd/common/io/nio2/Nio2Connector.java      |  7 ++++
 .../apache/sshd/common/io/nio2/Nio2Service.java | 26 ++++++++++++
 7 files changed, 136 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/f3d58b90/sshd-core/src/main/java/org/apache/sshd/common/FactoryManager.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/FactoryManager.java b/sshd-core/src/main/java/org/apache/sshd/common/FactoryManager.java
index 037b718..c78f8e8 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/FactoryManager.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/FactoryManager.java
@@ -71,6 +71,48 @@ public interface FactoryManager {
     public static final String IDLE_TIMEOUT = "idle-timeout";
 
     /**
+     * Socket backlog.
+     * See {@link java.nio.channels.AsynchronousServerSocketChannel#bind(java.net.SocketAddress, int)}
+     */
+    public static final String SOCKET_BACKLOG = "socket-backlog";
+
+    /**
+     * Socket keep-alive.
+     * See {@link java.net.StandardSocketOptions#SO_KEEPALIVE}
+     */
+    public static final String SOCKET_KEEPALIVE = "socket-keepalive";
+
+    /**
+     * Socket send buffer size.
+     * See {@link java.net.StandardSocketOptions#SO_SNDBUF}
+     */
+    public static final String SOCKET_SNDBUF = "socket-sndbuf";
+
+    /**
+     * Socket receive buffer size.
+     * See {@link java.net.StandardSocketOptions#SO_RCVBUF}
+     */
+    public static final String SOCKET_RCVBUF = "socket-rcvbuf";
+
+    /**
+     * Socket reuse address.
+     * See {@link java.net.StandardSocketOptions#SO_REUSEADDR}
+     */
+    public static final String SOCKET_REUSEADDR = "socket-reuseaddr";
+
+    /**
+     * Socket linger.
+     * See {@link java.net.StandardSocketOptions#SO_LINGER}
+     */
+    public static final String SOCKET_LINGER = "socket-linger";
+
+    /**
+     * Socket tcp no-delay.
+     * See {@link java.net.StandardSocketOptions#TCP_NODELAY}
+     */
+    public static final String TCP_NODELAY = "tcp-nodelay";
+
+    /**
      * A map of properties that can be used to configure the SSH server
      * or client.  This map will never be changed by either the server or
      * client and is not supposed to be changed at runtime (changes are not

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/f3d58b90/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaAcceptor.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaAcceptor.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaAcceptor.java
index 107972e..7a20d78 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaAcceptor.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaAcceptor.java
@@ -19,7 +19,6 @@
 package org.apache.sshd.common.io.mina;
 
 import java.io.IOException;
-import java.net.Socket;
 import java.net.SocketAddress;
 import java.util.Collection;
 import java.util.Set;
@@ -28,7 +27,6 @@ import org.apache.mina.core.service.IoAcceptor;
 import org.apache.mina.core.service.IoHandler;
 import org.apache.mina.core.service.IoProcessor;
 import org.apache.mina.core.service.IoService;
-import org.apache.mina.core.session.IoSessionConfig;
 import org.apache.mina.transport.socket.nio.NioSession;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.sshd.common.FactoryManager;
@@ -39,12 +37,20 @@ public class MinaAcceptor extends MinaService implements org.apache.sshd.common.
 
     protected volatile IoAcceptor acceptor;
     // Acceptor
-    protected int backlog = 50;
+    protected int backlog = 0;
     protected boolean reuseAddress = true;
-    protected IoSessionConfig sessionConfig;
 
     public MinaAcceptor(FactoryManager manager, org.apache.sshd.common.io.IoHandler handler, IoProcessor<NioSession> ioProcessor) {
         super(manager, handler, ioProcessor);
+
+        String valStr = manager.getProperties().get(FactoryManager.SOCKET_BACKLOG);
+        if (valStr != null) {
+            backlog = Integer.parseInt(valStr);
+        }
+        valStr = manager.getProperties().get(FactoryManager.SOCKET_REUSEADDR);
+        if (valStr != null) {
+            reuseAddress = Boolean.parseBoolean(valStr);
+        }
     }
 
     protected IoAcceptor createAcceptor() {
@@ -52,26 +58,7 @@ public class MinaAcceptor extends MinaService implements org.apache.sshd.common.
         acceptor.setCloseOnDeactivation(false);
         acceptor.setReuseAddress(reuseAddress);
         acceptor.setBacklog(backlog);
-
-        // MINA itself forces our socket receive buffer to 1024 bytes
-        // by default, despite what the operating system defaults to.
-        // This limits us to about 3 MB/s incoming data transfer.  By
-        // forcing back to the operating system default we can get a
-        // decent transfer rate again.
-        //
-        final Socket s = new Socket();
-        try {
-            try {
-                acceptor.getSessionConfig().setReceiveBufferSize(s.getReceiveBufferSize());
-            } finally {
-                s.close();
-            }
-        } catch (IOException e) {
-            log.warn("cannot adjust SO_RCVBUF back to system default", e);
-        }
-        if (sessionConfig != null) {
-            acceptor.getSessionConfig().setAll(sessionConfig);
-        }
+        configure(acceptor.getSessionConfig());
         return acceptor;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/f3d58b90/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java
index 8181652..6e4e368 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java
@@ -25,7 +25,6 @@ import org.apache.mina.core.future.IoFutureListener;
 import org.apache.mina.core.service.IoConnector;
 import org.apache.mina.core.service.IoHandler;
 import org.apache.mina.core.service.IoProcessor;
-import org.apache.mina.core.session.IoSessionConfig;
 import org.apache.mina.transport.socket.nio.NioSession;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
 import org.apache.sshd.common.FactoryManager;
@@ -37,7 +36,6 @@ import org.apache.sshd.common.io.IoConnectFuture;
 public class MinaConnector extends MinaService implements org.apache.sshd.common.io.IoConnector, IoHandler {
 
     protected volatile IoConnector connector;
-    protected IoSessionConfig sessionConfig;
 
     public MinaConnector(FactoryManager manager, org.apache.sshd.common.io.IoHandler handler, IoProcessor<NioSession> ioProcessor) {
         super(manager, handler, ioProcessor);
@@ -45,9 +43,7 @@ public class MinaConnector extends MinaService implements org.apache.sshd.common
 
     protected IoConnector createConnector() {
         NioSocketConnector connector = new NioSocketConnector(ioProcessor);
-        if (sessionConfig != null) {
-            connector.getSessionConfig().setAll(sessionConfig);
-        }
+        configure(connector.getSessionConfig());
         return connector;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/f3d58b90/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaService.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaService.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaService.java
index 6d962ed..1981eb8 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaService.java
@@ -28,6 +28,8 @@ import org.apache.mina.core.service.IoProcessor;
 import org.apache.mina.core.service.IoService;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
+import org.apache.mina.core.session.IoSessionConfig;
+import org.apache.mina.transport.socket.SocketSessionConfig;
 import org.apache.mina.transport.socket.nio.NioSession;
 import org.apache.sshd.common.Closeable;
 import org.apache.sshd.common.FactoryManager;
@@ -45,6 +47,7 @@ public abstract class MinaService extends IoHandlerAdapter implements org.apache
     protected final FactoryManager manager;
     protected final org.apache.sshd.common.io.IoHandler handler;
     protected final IoProcessor<NioSession> ioProcessor;
+    protected IoSessionConfig sessionConfig;
 
     public MinaService(FactoryManager manager, org.apache.sshd.common.io.IoHandler handler, IoProcessor<NioSession> ioProcessor) {
         this.manager = manager;
@@ -106,4 +109,38 @@ public abstract class MinaService extends IoHandlerAdapter implements org.apache
         return (org.apache.sshd.common.io.IoSession)
                 session.getAttribute(org.apache.sshd.common.io.IoSession.class);
     }
+
+    protected void configure(SocketSessionConfig config) {
+        Integer intVal;
+        Boolean boolVal;
+        if ((boolVal = getBoolean(FactoryManager.SOCKET_KEEPALIVE)) != null) {
+            config.setKeepAlive(boolVal);
+        }
+        if ((intVal = getInteger(FactoryManager.SOCKET_SNDBUF)) != null) {
+            config.setSendBufferSize(intVal);
+        }
+        if ((intVal = getInteger(FactoryManager.SOCKET_RCVBUF)) != null) {
+            config.setReceiveBufferSize(intVal);
+        }
+        if ((intVal = getInteger(FactoryManager.SOCKET_LINGER)) != null) {
+            config.setSoLinger(intVal);
+        }
+        if ((boolVal = getBoolean(FactoryManager.SOCKET_LINGER)) != null) {
+            config.setTcpNoDelay(boolVal);
+        }
+        if (sessionConfig != null) {
+            config.setAll(sessionConfig);
+        }
+    }
+
+    protected Integer getInteger(String property) {
+        String strVal = manager.getProperties().get(property);
+        return (strVal != null) ? Integer.parseInt(strVal) : null;
+    }
+
+    protected Boolean getBoolean(String property) {
+        String strVal = manager.getProperties().get(property);
+        return (strVal != null) ? Boolean.parseBoolean(strVal) : null;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/f3d58b90/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java
index f9fab11..9bba704 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java
@@ -41,18 +41,28 @@ import org.apache.sshd.common.io.IoHandler;
 public class Nio2Acceptor extends Nio2Service implements IoAcceptor {
 
     private final Map<SocketAddress, AsynchronousServerSocketChannel> channels;
-    private int backlog = 50;
+    private int backlog = 0;
 
     public Nio2Acceptor(FactoryManager manager, IoHandler handler, AsynchronousChannelGroup group) {
         super(manager, handler, group);
         channels = new ConcurrentHashMap<SocketAddress, AsynchronousServerSocketChannel>();
+
+        String valStr = manager.getProperties().get(FactoryManager.SOCKET_BACKLOG);
+        if (valStr != null) {
+            backlog = Integer.parseInt(valStr);
+        }
     }
 
     public void bind(Collection<? extends SocketAddress> addresses) throws IOException {
         for (SocketAddress address : addresses) {
             logger.debug("Binding Nio2Acceptor to address {}", address);
             AsynchronousServerSocketChannel socket = AsynchronousServerSocketChannel.open(group);
-            socket.setOption(StandardSocketOptions.SO_REUSEADDR, Boolean.TRUE);
+            setOption(socket, FactoryManager.SOCKET_KEEPALIVE, StandardSocketOptions.SO_KEEPALIVE, null);
+            setOption(socket, FactoryManager.SOCKET_LINGER, StandardSocketOptions.SO_LINGER, null);
+            setOption(socket, FactoryManager.SOCKET_RCVBUF, StandardSocketOptions.SO_RCVBUF, null);
+            setOption(socket, FactoryManager.SOCKET_REUSEADDR, StandardSocketOptions.SO_REUSEADDR, Boolean.TRUE);
+            setOption(socket, FactoryManager.SOCKET_SNDBUF, StandardSocketOptions.SO_SNDBUF, null);
+            setOption(socket, FactoryManager.TCP_NODELAY, StandardSocketOptions.TCP_NODELAY, null);
             socket.bind(address, backlog);
             SocketAddress local = socket.getLocalAddress();
             channels.put(local, socket);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/f3d58b90/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
index d427ef4..0ad182b 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
@@ -20,6 +20,7 @@ package org.apache.sshd.common.io.nio2;
 
 import java.io.IOException;
 import java.net.SocketAddress;
+import java.net.StandardSocketOptions;
 import java.nio.channels.AsynchronousChannelGroup;
 import java.nio.channels.AsynchronousSocketChannel;
 
@@ -43,6 +44,12 @@ public class Nio2Connector extends Nio2Service implements IoConnector {
         final IoConnectFuture future = new DefaultIoConnectFuture(null);
         try {
             final AsynchronousSocketChannel socket = AsynchronousSocketChannel.open(group);
+            setOption(socket, FactoryManager.SOCKET_KEEPALIVE, StandardSocketOptions.SO_KEEPALIVE, null);
+            setOption(socket, FactoryManager.SOCKET_LINGER, StandardSocketOptions.SO_LINGER, null);
+            setOption(socket, FactoryManager.SOCKET_RCVBUF, StandardSocketOptions.SO_RCVBUF, null);
+            setOption(socket, FactoryManager.SOCKET_REUSEADDR, StandardSocketOptions.SO_REUSEADDR, Boolean.TRUE);
+            setOption(socket, FactoryManager.SOCKET_SNDBUF, StandardSocketOptions.SO_SNDBUF, null);
+            setOption(socket, FactoryManager.TCP_NODELAY, StandardSocketOptions.TCP_NODELAY, null);
             socket.connect(address, null, new Nio2CompletionHandler<Void, Object>() {
                 protected void onCompleted(Void result, Object attachment) {
                     try {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/f3d58b90/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java
index 3c5a2b7..4bdb8f7 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java
@@ -18,7 +18,10 @@
  */
 package org.apache.sshd.common.io.nio2;
 
+import java.io.IOException;
+import java.net.SocketOption;
 import java.nio.channels.AsynchronousChannelGroup;
+import java.nio.channels.NetworkChannel;
 import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -72,4 +75,27 @@ public abstract class Nio2Service extends CloseableUtils.AbstractInnerCloseable
     public void sessionClosed(Nio2Session session) {
         sessions.remove(session.getId());
     }
+
+    protected <T> void setOption(NetworkChannel socket, String property, SocketOption<T> option, T defaultValue) throws IOException {
+        String valStr = manager.getProperties().get(property);
+        T val = defaultValue;
+        if (valStr != null) {
+            Class<T> type = option.type();
+            if (type == Integer.class) {
+                val = type.cast(Integer.parseInt(valStr));
+            } else if (type == Boolean.class) {
+                val = type.cast(Boolean.parseBoolean(valStr));
+            } else {
+                throw new IllegalStateException("Unsupported socket option type " + type);
+            }
+        }
+        if (val != null) {
+            try {
+                socket.setOption(option, val);
+            } catch (IOException e) {
+                logger.warn("Unable to set socket option " + option + " to " + val, e);
+            }
+        }
+    }
+
 }


[4/6] mina-sshd git commit: [SSHD-384] Fix broken client demo when executing a command

Posted by gn...@apache.org.
[SSHD-384] Fix broken client demo when executing a command

Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/41b261c7
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/41b261c7
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/41b261c7

Branch: refs/heads/master
Commit: 41b261c75a0e19e95dc328dd50b601b4429de8c8
Parents: 3b1308e
Author: Guillaume Nodet <gn...@apache.org>
Authored: Fri Dec 12 10:52:04 2014 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Fri Dec 12 10:52:04 2014 +0100

----------------------------------------------------------------------
 sshd-core/src/main/java/org/apache/sshd/SshClient.java | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/41b261c7/sshd-core/src/main/java/org/apache/sshd/SshClient.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/SshClient.java b/sshd-core/src/main/java/org/apache/sshd/SshClient.java
index 7156bf0..1b2e6aa 100644
--- a/sshd-core/src/main/java/org/apache/sshd/SshClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/SshClient.java
@@ -557,15 +557,12 @@ public class SshClient extends AbstractFactoryManager implements ClientFactoryMa
                 ((ChannelShell) channel).setAgentForwarding(agentForward);
                 channel.setIn(new NoCloseInputStream(System.in));
             } else {
-                channel = session.createChannel(ClientChannel.CHANNEL_EXEC);
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                Writer w = new OutputStreamWriter(baos);
+                StringWriter w = new StringWriter();
                 for (String cmd : command) {
                     w.append(cmd).append(" ");
                 }
-                w.append("\n");
                 w.close();
-                channel.setIn(new ByteArrayInputStream(baos.toByteArray()));
+                channel = session.createChannel(ClientChannel.CHANNEL_EXEC, w.toString());
             }
             channel.setOut(new NoCloseOutputStream(System.out));
             channel.setErr(new NoCloseOutputStream(System.err));


[3/6] mina-sshd git commit: [SSHD-383] Support for loading ecdsa keys in the client demo

Posted by gn...@apache.org.
[SSHD-383] Support for loading ecdsa keys in the client demo

Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/3b1308e8
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/3b1308e8
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/3b1308e8

Branch: refs/heads/master
Commit: 3b1308e8f17e042d13c9a2ef63675b1939efe0fd
Parents: 71ad6a0
Author: Guillaume Nodet <gn...@apache.org>
Authored: Fri Dec 12 10:50:51 2014 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Fri Dec 12 10:50:51 2014 +0100

----------------------------------------------------------------------
 sshd-core/src/main/java/org/apache/sshd/SshClient.java | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/3b1308e8/sshd-core/src/main/java/org/apache/sshd/SshClient.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/SshClient.java b/sshd-core/src/main/java/org/apache/sshd/SshClient.java
index ef34288..7156bf0 100644
--- a/sshd-core/src/main/java/org/apache/sshd/SshClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/SshClient.java
@@ -474,6 +474,10 @@ public class SshClient extends AbstractFactoryManager implements ClientFactoryMa
         if (f.exists() && f.isFile() && f.canRead()) {
             files.add(f.getAbsolutePath());
         }
+        f = new File(System.getProperty("user.home"), ".ssh/id_ecdsa");
+        if (f.exists() && f.isFile() && f.canRead()) {
+            files.add(f.getAbsolutePath());
+        }
         if (files.size() > 0) {
             // SSHD-292: we need to use a different class to load the FileKeyPairProvider
             //  in order to break the link between SshClient and BouncyCastle


[2/6] mina-sshd git commit: [SSHD-382] Add support for custom properties on the command line for client and server

Posted by gn...@apache.org.
[SSHD-382] Add support for custom properties on the command line for client and server

Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/71ad6a07
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/71ad6a07
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/71ad6a07

Branch: refs/heads/master
Commit: 71ad6a07607ce1178ef913b3d3f3040114603617
Parents: 24a5f7d
Author: Guillaume Nodet <gn...@apache.org>
Authored: Fri Dec 12 10:48:27 2014 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Fri Dec 12 10:48:27 2014 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/sshd/SshClient.java    | 20 +++++++++++++++++++-
 .../main/java/org/apache/sshd/SshServer.java    | 20 +++++++++++++++++++-
 2 files changed, 38 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/71ad6a07/sshd-core/src/main/java/org/apache/sshd/SshClient.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/SshClient.java b/sshd-core/src/main/java/org/apache/sshd/SshClient.java
index 461b8ca..ef34288 100644
--- a/sshd-core/src/main/java/org/apache/sshd/SshClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/SshClient.java
@@ -33,7 +33,9 @@ import java.net.SocketAddress;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.logging.ConsoleHandler;
 import java.util.logging.Formatter;
@@ -374,6 +376,7 @@ public class SshClient extends AbstractFactoryManager implements ClientFactoryMa
         int socksPort = -1;
         boolean error = false;
         List<String> identities = new ArrayList<String>();
+        Map<String, String> options = new LinkedHashMap<String, String>();
 
         for (int i = 0; i < args.length; i++) {
             if (command == null && "-p".equals(args[i])) {
@@ -414,6 +417,20 @@ public class SshClient extends AbstractFactoryManager implements ClientFactoryMa
                     break;
                 }
                 identities.add(args[++i]);
+            } else if (command == null && "-o".equals(args[i])) {
+                if (i + 1 >= args.length) {
+                    System.err.println("option requires and argument: " + args[i]);
+                    error = true;
+                    break;
+                }
+                String opt = args[++i];
+                int idx = opt.indexOf('=');
+                if (idx <= 0) {
+                    System.err.println("bad syntax for option: " + opt);
+                    error = true;
+                    break;
+                }
+                options.put(opt.substring(0, idx), opt.substring(idx + 1));
             } else if (command == null && args[i].startsWith("-")) {
                 System.err.println("illegal option: " + args[i]);
                 error = true;
@@ -434,7 +451,7 @@ public class SshClient extends AbstractFactoryManager implements ClientFactoryMa
             error = true;
         }
         if (error) {
-            System.err.println("usage: ssh [-A|-a] [-v[v][v]] [-D socksPort] [-l login] [-p port] hostname [command]");
+            System.err.println("usage: ssh [-A|-a] [-v[v][v]] [-D socksPort] [-l login] [-p port] [-o option=value] hostname [command]");
             System.exit(-1);
         }
         if (logLevel <= 0) {
@@ -486,6 +503,7 @@ public class SshClient extends AbstractFactoryManager implements ClientFactoryMa
         }
 
         SshClient client = SshClient.setUpDefaultClient();
+        client.getProperties().putAll(options);
         client.start();
         client.setKeyPairProvider(provider);
         client.setUserInteraction(new UserInteraction() {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/71ad6a07/sshd-core/src/main/java/org/apache/sshd/SshServer.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/SshServer.java b/sshd-core/src/main/java/org/apache/sshd/SshServer.java
index 2424df4..d29ef9e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/SshServer.java
+++ b/sshd-core/src/main/java/org/apache/sshd/SshServer.java
@@ -25,7 +25,9 @@ import java.security.PublicKey;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.EnumSet;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.sshd.common.AbstractFactoryManager;
 import org.apache.sshd.common.Closeable;
@@ -372,6 +374,7 @@ public class SshServer extends AbstractFactoryManager implements ServerFactoryMa
         int port = 8000;
         String provider;
         boolean error = false;
+        Map<String, String> options = new LinkedHashMap<String, String>();
 
         for (int i = 0; i < args.length; i++) {
             if ("-p".equals(args[i])) {
@@ -394,6 +397,20 @@ public class SshServer extends AbstractFactoryManager implements ServerFactoryMa
                     System.err.println("provider should be mina or nio2: " + args[i]);
                     break;
                 }
+            } else if ("-o".equals(args[i])) {
+                if (i + 1 >= args.length) {
+                    System.err.println("option requires and argument: " + args[i]);
+                    error = true;
+                    break;
+                }
+                String opt = args[++i];
+                int idx = opt.indexOf('=');
+                if (idx <= 0) {
+                    System.err.println("bad syntax for option: " + opt);
+                    error = true;
+                    break;
+                }
+                options.put(opt.substring(0, idx), opt.substring(idx + 1));
             } else if (args[i].startsWith("-")) {
                 System.err.println("illegal option: " + args[i]);
                 error = true;
@@ -405,13 +422,14 @@ public class SshServer extends AbstractFactoryManager implements ServerFactoryMa
             }
         }
         if (error) {
-            System.err.println("usage: sshd [-p port] [-io mina|nio2]");
+            System.err.println("usage: sshd [-p port] [-io mina|nio2] [-o option=value]");
             System.exit(-1);
         }
 
         System.err.println("Starting SSHD on port " + port);
                                                     
         SshServer sshd = SshServer.setUpDefaultServer();
+        sshd.getProperties().putAll(options);
         sshd.setPort(port);
         sshd.getProperties().put(SshServer.WELCOME_BANNER, "Welcome to SSHD\n");
         if (SecurityUtils.isBouncyCastleRegistered()) {