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 2015/03/23 09:47:05 UTC

mina-sshd git commit: [SSHD-434] Use a standard helper API for accessing FactoryManager properties

Repository: mina-sshd
Updated Branches:
  refs/heads/master 0f547d822 -> 421faf51a


[SSHD-434] Use a standard helper API for accessing FactoryManager properties


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

Branch: refs/heads/master
Commit: 421faf51ae8c69029c482f3bb38b2042ac4db9cb
Parents: 0f547d8
Author: Guillaume Nodet <gn...@apache.org>
Authored: Mon Mar 23 09:46:57 2015 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Mon Mar 23 09:46:57 2015 +0100

----------------------------------------------------------------------
 .../sshd/agent/local/ProxyAgentFactory.java     | 12 +++--
 .../sshd/agent/unix/ChannelAgentForwarding.java |  4 +-
 .../sshd/agent/unix/UnixAgentFactory.java       | 11 +++--
 .../client/session/ClientConnectionService.java | 41 +++++++---------
 .../session/ClientUserAuthServiceNew.java       | 30 +++++-------
 .../sshd/common/AbstractFactoryManager.java     | 21 +++-----
 .../org/apache/sshd/common/SshException.java    |  2 +
 .../sshd/common/channel/AbstractChannel.java    | 11 +----
 .../common/io/AbstractIoServiceFactory.java     | 16 +++---
 .../sshd/common/io/mina/MinaAcceptor.java       | 17 +++----
 .../apache/sshd/common/io/mina/MinaService.java |  7 ++-
 .../sshd/common/io/nio2/Nio2Acceptor.java       | 10 ++--
 .../apache/sshd/common/io/nio2/Nio2Service.java |  7 +--
 .../sshd/common/session/AbstractSession.java    |  1 +
 .../sshd/server/channel/ChannelSession.java     | 23 ++++-----
 .../java/org/apache/sshd/server/kex/DHGEX.java  | 51 ++++++++++++++------
 .../sshd/server/session/ServerSession.java      | 13 +++--
 .../server/session/ServerUserAuthService.java   | 48 +++++++++---------
 18 files changed, 170 insertions(+), 155 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/agent/local/ProxyAgentFactory.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/local/ProxyAgentFactory.java b/sshd-core/src/main/java/org/apache/sshd/agent/local/ProxyAgentFactory.java
index fd918c0..197d04d 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/local/ProxyAgentFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/local/ProxyAgentFactory.java
@@ -27,9 +27,11 @@ import org.apache.sshd.agent.SshAgentFactory;
 import org.apache.sshd.agent.SshAgentServer;
 import org.apache.sshd.common.Channel;
 import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.Session;
 import org.apache.sshd.common.session.ConnectionService;
+import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.server.session.ServerSession;
 
 public class ProxyAgentFactory implements SshAgentFactory {
@@ -41,14 +43,16 @@ public class ProxyAgentFactory implements SshAgentFactory {
     }
 
     public SshAgent createClient(FactoryManager manager) throws IOException {
-        String proxyId = manager.getProperties().get(SshAgent.SSH_AUTHSOCKET_ENV_NAME);
-        if (proxyId == null) {
+        String proxyId = FactoryManagerUtils.getString(manager, SshAgent.SSH_AUTHSOCKET_ENV_NAME);
+        if (GenericUtils.isEmpty(proxyId)) {
             throw new IllegalStateException("No " + SshAgent.SSH_AUTHSOCKET_ENV_NAME + " environment variable set");
         }
+
         AgentServerProxy proxy = proxies.get(proxyId);
         if (proxy == null) {
-            throw new IllegalStateException("No ssh agent found");
+            throw new IllegalStateException("No ssh agent found for ID=" + proxyId);
         }
+
         return proxy.createClient();
     }
 
@@ -57,12 +61,14 @@ public class ProxyAgentFactory implements SshAgentFactory {
         if (!(session instanceof ServerSession)) {
             throw new IllegalStateException("The session used to create an agent server proxy must be a server session");
         }
+
         final AgentServerProxy proxy = new AgentServerProxy(service);
         proxies.put(proxy.getId(), proxy);
         return new SshAgentServer() {
             public String getId() {
                 return proxy.getId();
             }
+
             public void close() {
                 proxies.remove(proxy.getId());
                 proxy.close();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
index 572c4d0..4f6516e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
@@ -25,11 +25,11 @@ import org.apache.sshd.agent.SshAgent;
 import org.apache.sshd.client.future.DefaultOpenFuture;
 import org.apache.sshd.client.future.OpenFuture;
 import org.apache.sshd.common.Channel;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.channel.ChannelOutputStream;
 import org.apache.sshd.common.future.CloseFuture;
-import org.apache.sshd.common.future.SshFuture;
 import org.apache.sshd.common.future.SshFutureListener;
 import org.apache.sshd.common.util.Buffer;
 import org.apache.sshd.server.channel.AbstractServerChannel;
@@ -67,7 +67,7 @@ public class ChannelAgentForwarding extends AbstractServerChannel {
         final OpenFuture f = new DefaultOpenFuture(this);
         try {
             out = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_DATA);
-            authSocket = session.getFactoryManager().getProperties().get(SshAgent.SSH_AUTHSOCKET_ENV_NAME);
+            authSocket = FactoryManagerUtils.getString(session, SshAgent.SSH_AUTHSOCKET_ENV_NAME);
             pool = Pool.create(AprLibrary.getInstance().getRootPool());
             handle = Local.create(authSocket, pool);
             int result = Local.connect(handle, 0);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/agent/unix/UnixAgentFactory.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/UnixAgentFactory.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/UnixAgentFactory.java
index 87797d3..be5b8a7 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/UnixAgentFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/UnixAgentFactory.java
@@ -25,9 +25,12 @@ import org.apache.sshd.agent.SshAgentFactory;
 import org.apache.sshd.agent.SshAgentServer;
 import org.apache.sshd.common.Channel;
 import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.Session;
+import org.apache.sshd.common.SshException;
 import org.apache.sshd.common.session.ConnectionService;
+import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.server.session.ServerSession;
 
 public class UnixAgentFactory implements SshAgentFactory {
@@ -37,9 +40,11 @@ public class UnixAgentFactory implements SshAgentFactory {
     }
 
     public SshAgent createClient(FactoryManager manager) throws IOException {
-        String authSocket = manager.getProperties().get(SshAgent.SSH_AUTHSOCKET_ENV_NAME);
-        SshAgent agent = new AgentClient(authSocket);
-        return agent;
+        String authSocket = FactoryManagerUtils.getString(manager, SshAgent.SSH_AUTHSOCKET_ENV_NAME);
+        if (GenericUtils.isEmpty(authSocket)) {
+            throw new SshException("No " + SshAgent.SSH_AUTHSOCKET_ENV_NAME + " value");
+        }
+        return new AgentClient(authSocket);
     }
 
     public SshAgentServer createServer(ConnectionService service) throws IOException {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java
index 44bfdeb..7c03fb8 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java
@@ -19,21 +19,19 @@
 package org.apache.sshd.client.session;
 
 import java.io.IOException;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.sshd.client.ClientFactoryManager;
-import org.apache.sshd.client.future.OpenFuture;
-import org.apache.sshd.common.Channel;
-import org.apache.sshd.common.NamedFactory;
+import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.Service;
 import org.apache.sshd.common.ServiceFactory;
 import org.apache.sshd.common.Session;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.SshException;
-import org.apache.sshd.common.future.SshFutureListener;
 import org.apache.sshd.common.session.AbstractConnectionService;
 import org.apache.sshd.common.util.Buffer;
-import org.apache.sshd.server.channel.OpenChannelException;
 
 /**
  * Client side <code>ssh-connection</code> service.
@@ -42,6 +40,9 @@ import org.apache.sshd.server.channel.OpenChannelException;
  */
 public class ClientConnectionService extends AbstractConnectionService {
 
+    public static final String DEFAULT_KEEP_ALIVE_HEARTBEAT_STRING = "keepalive@sshd.apache.org";
+    public static final long DEFAULT_HEARTBEAT_INTERVAL = 0L;
+
     public static class Factory implements ServiceFactory {
 
         public String getName() {
@@ -69,33 +70,28 @@ public class ClientConnectionService extends AbstractConnectionService {
     }
 
     protected void startHeartBeat() {
-        String intervalStr = session.getFactoryManager().getProperties().get(ClientFactoryManager.HEARTBEAT_INTERVAL);
-        try {
-            int interval = intervalStr != null ? Integer.parseInt(intervalStr) : 0;
-            if (interval > 0) {
-                session.getFactoryManager().getScheduledExecutorService().scheduleAtFixedRate(new Runnable() {
-                    public void run() {
-                        sendHeartBeat();
-                    }
-                }, interval, interval, TimeUnit.MILLISECONDS);
-            }
-        } catch (NumberFormatException e) {
-            log.warn("Ignoring bad heartbeat interval: {}", intervalStr);
+        long interval = FactoryManagerUtils.getLongProperty(session, ClientFactoryManager.HEARTBEAT_INTERVAL, DEFAULT_HEARTBEAT_INTERVAL);
+        if (interval > 0L) {
+            FactoryManager manager = session.getFactoryManager();
+            ScheduledExecutorService service = manager.getScheduledExecutorService();
+            service.scheduleAtFixedRate(new Runnable() {
+                public void run() {
+                    sendHeartBeat();
+                }
+            }, interval, interval, TimeUnit.MILLISECONDS);
+            log.debug("startHeartbeat - started at interval={}", interval);
         }
     }
 
     protected void sendHeartBeat() {
+        String request = FactoryManagerUtils.getStringProperty(session, ClientFactoryManager.HEARTBEAT_REQUEST, DEFAULT_KEEP_ALIVE_HEARTBEAT_STRING);
         try {
             Buffer buf = session.createBuffer(SshConstants.SSH_MSG_GLOBAL_REQUEST);
-            String request = session.getFactoryManager().getProperties().get(ClientFactoryManager.HEARTBEAT_REQUEST);
-            if (request == null) {
-                request = "keepalive@sshd.apache.org";
-            }
             buf.putString(request);
             buf.putBoolean(false);
             session.writePacket(buf);
         } catch (IOException e) {
-            log.info("Error sending keepalive message", e);
+            log.info("Error sending keepalive message=" + request, e);
         }
     }
 
@@ -108,5 +104,4 @@ public class ClientConnectionService extends AbstractConnectionService {
     public String createX11Display(boolean singleConnection, String authenticationProtocol, String authenticationCookie, int screen) throws IOException {
         throw new IllegalStateException("Server side operation");
     }
-
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthServiceNew.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthServiceNew.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthServiceNew.java
index 5616c0d..7e1f310 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthServiceNew.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthServiceNew.java
@@ -26,24 +26,17 @@ import java.util.List;
 import org.apache.sshd.client.ClientFactoryManager;
 import org.apache.sshd.client.UserAuth;
 import org.apache.sshd.client.UserInteraction;
-import org.apache.sshd.client.auth.UserAuthKeyboardInteractive;
-import org.apache.sshd.client.auth.UserAuthPassword;
-import org.apache.sshd.client.auth.UserAuthPublicKey;
 import org.apache.sshd.client.future.AuthFuture;
 import org.apache.sshd.client.future.DefaultAuthFuture;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.Service;
 import org.apache.sshd.common.Session;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.SshException;
-import org.apache.sshd.common.future.CloseFuture;
-import org.apache.sshd.common.future.DefaultCloseFuture;
 import org.apache.sshd.common.util.Buffer;
 import org.apache.sshd.common.util.CloseableUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.apache.sshd.common.util.KeyUtils.getKeyType;
+import org.apache.sshd.common.util.GenericUtils;
 
 /**
  * Client side <code>ssh-auth</code> service.
@@ -63,10 +56,10 @@ public class ClientUserAuthServiceNew extends CloseableUtils.AbstractCloseable i
     private List<Object> identities;
     private String service;
 
-    List<NamedFactory<UserAuth>> authFactories;
-    List<String> clientMethods;
-    List<String> serverMethods;
-    UserAuth userAuth;
+    private List<NamedFactory<UserAuth>> authFactories;
+    private List<String> clientMethods;
+    private List<String> serverMethods;
+    private UserAuth userAuth;
 
     public ClientUserAuthServiceNew(Session s) {
         if (!(s instanceof ClientSessionImpl)) {
@@ -76,11 +69,14 @@ public class ClientUserAuthServiceNew extends CloseableUtils.AbstractCloseable i
         authFuture = new DefaultAuthFuture(session.getLock());
         authFactories = session.getFactoryManager().getUserAuthFactories();
         clientMethods = new ArrayList<String>();
-        String prefs = session.getFactoryManager().getProperties().get(ClientFactoryManager.PREFERRED_AUTHS);
-        if (prefs != null) {
+
+        String prefs = FactoryManagerUtils.getString(session, ClientFactoryManager.PREFERRED_AUTHS);
+        if (!GenericUtils.isEmpty(prefs)) {
             for (String pref : prefs.split(",")) {
                 if (NamedFactory.Utils.get(authFactories, pref) != null) {
                     clientMethods.add(pref);
+                } else {
+                    log.debug("Skip unknown prefered authentication method: {}", pref);
                 }
             }
         } else {
@@ -121,7 +117,7 @@ public class ClientUserAuthServiceNew extends CloseableUtils.AbstractCloseable i
         } else if (cmd == SshConstants.SSH_MSG_USERAUTH_BANNER) {
             String welcome = buffer.getString();
             String lang = buffer.getString();
-            log.debug("Welcome banner: {}", welcome);
+            log.debug("Welcome banner(lang={}): {}", lang, welcome);
             UserInteraction ui = session.getFactoryManager().getUserInteraction();
             if (ui != null) {
                 ui.welcome(welcome);
@@ -132,7 +128,7 @@ public class ClientUserAuthServiceNew extends CloseableUtils.AbstractCloseable i
         }
     }
 
-    int currentMethod;
+    private int currentMethod;
 
     /**
      * execute one step in user authentication.

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/common/AbstractFactoryManager.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/AbstractFactoryManager.java b/sshd-core/src/main/java/org/apache/sshd/common/AbstractFactoryManager.java
index f8404a6..5ae8d91 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/AbstractFactoryManager.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/AbstractFactoryManager.java
@@ -158,13 +158,10 @@ public abstract class AbstractFactoryManager extends CloseableUtils.AbstractInne
     protected void loadVersion() {
         this.version = "SSHD-UNKNOWN";
         try {
-            InputStream input = getClass().getClassLoader().getResourceAsStream("org/apache/sshd/sshd-version.properties");
-            try {
+            try (InputStream input = getClass().getClassLoader().getResourceAsStream("org/apache/sshd/sshd-version.properties")) {
                 Properties props = new Properties();
                 props.load(input);
                 this.version = props.getProperty("version").toUpperCase();
-            } finally {
-                input.close();
             }
         } catch (Exception e) {
             log.warn("Unable to load version from resources. Missing org/apache/sshd/sshd-version.properties ?", e);
@@ -180,21 +177,19 @@ public abstract class AbstractFactoryManager extends CloseableUtils.AbstractInne
     }
 
     public int getNioWorkers() {
-        String nioWorkers = getProperties().get(NIO_WORKERS);
-        if (nioWorkers != null && nioWorkers.length() > 0) {
-            int nb = Integer.parseInt(nioWorkers);
-            if (nb > 0) {
-                return nb;
-            }
+        int nb=FactoryManagerUtils.getIntProperty(this, NIO_WORKERS, DEFAULT_NIO_WORKERS);
+        if (nb > 0) {
+            return nb;
+        } else {    // it may have been configured to a negative value
+            return DEFAULT_NIO_WORKERS;
         }
-        return DEFAULT_NIO_WORKERS;
     }
 
     public void setNioWorkers(int nioWorkers) {
         if (nioWorkers > 0) {
-            getProperties().put(NIO_WORKERS, Integer.toString(nioWorkers));
+            FactoryManagerUtils.updateProperty(this, NIO_WORKERS, nioWorkers);
         } else {
-            getProperties().remove(NIO_WORKERS);
+            FactoryManagerUtils.updateProperty(this, NIO_WORKERS, null);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/common/SshException.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/SshException.java b/sshd-core/src/main/java/org/apache/sshd/common/SshException.java
index 170d75b..5883560 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/SshException.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/SshException.java
@@ -27,6 +27,8 @@ import java.io.IOException;
  */
 public class SshException extends IOException {
 
+    private static final long serialVersionUID = -7349477687125144606L;
+
     private final int disconnectCode;
 
     public SshException() {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
index 1d04b17..fd2aa0f 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
@@ -27,6 +27,7 @@ import java.util.concurrent.atomic.AtomicReference;
 import org.apache.sshd.common.Channel;
 import org.apache.sshd.common.Closeable;
 import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.RequestHandler;
 import org.apache.sshd.common.Session;
 import org.apache.sshd.common.SshConstants;
@@ -174,15 +175,7 @@ public abstract class AbstractChannel extends CloseableUtils.AbstractInnerClosea
                 Buffer buffer = session.createBuffer(SshConstants.SSH_MSG_CHANNEL_CLOSE);
                 buffer.putInt(recipient);
                 try {
-                    long timeout = DEFAULT_CHANNEL_CLOSE_TIMEOUT;
-                    String val = getSession().getFactoryManager().getProperties().get(FactoryManager.CHANNEL_CLOSE_TIMEOUT);
-                    if (val != null) {
-                        try {
-                            timeout = Long.parseLong(val);
-                        } catch (NumberFormatException e) {
-                            // Ignore
-                        }
-                    }
+                    long timeout = FactoryManagerUtils.getLongProperty(getSession(), FactoryManager.CHANNEL_CLOSE_TIMEOUT, DEFAULT_CHANNEL_CLOSE_TIMEOUT);
                     session.writePacket(buffer, timeout, TimeUnit.MILLISECONDS).addListener(new SshFutureListener<IoWriteFuture>() {
                         public void operationComplete(IoWriteFuture future) {
                             if (future.isWritten()) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/common/io/AbstractIoServiceFactory.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/AbstractIoServiceFactory.java b/sshd-core/src/main/java/org/apache/sshd/common/io/AbstractIoServiceFactory.java
index f244cb4..6682884 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/AbstractIoServiceFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/AbstractIoServiceFactory.java
@@ -19,11 +19,11 @@
 
 package org.apache.sshd.common.io;
 
-import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.util.CloseableUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -78,15 +78,11 @@ public abstract class AbstractIoServiceFactory extends CloseableUtils.AbstractCl
     }
 
     public static int getNioWorkers(FactoryManager manager) {
-        Map<String, String> properties = manager.getProperties();
-        String nioWorkers = properties.get(FactoryManager.NIO_WORKERS);
-        if ((nioWorkers != null) && (nioWorkers.length() > 0)) {
-            int nb = Integer.parseInt(nioWorkers);
-            if (nb > 0) {
-                return nb;
-            }
+        int nb = FactoryManagerUtils.getIntProperty(manager, FactoryManager.NIO_WORKERS, FactoryManager.DEFAULT_NIO_WORKERS);
+        if (nb > 0) {
+            return nb;
+        } else {
+            return FactoryManager.DEFAULT_NIO_WORKERS;
         }
-
-        return FactoryManager.DEFAULT_NIO_WORKERS;
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/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 7a20d78..2e92590 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
@@ -30,27 +30,24 @@ import org.apache.mina.core.service.IoService;
 import org.apache.mina.transport.socket.nio.NioSession;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.FactoryManagerUtils;
 
 /**
  */
 public class MinaAcceptor extends MinaService implements org.apache.sshd.common.io.IoAcceptor, IoHandler {
+    public static final int DEFAULT_BACKLOG=0;
+    public static final boolean DEFAULT_REUSE_ADDRESS=true;
 
     protected volatile IoAcceptor acceptor;
     // Acceptor
-    protected int backlog = 0;
-    protected boolean reuseAddress = true;
+    protected int backlog = DEFAULT_BACKLOG;
+    protected boolean reuseAddress = DEFAULT_REUSE_ADDRESS;
 
     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);
-        }
+        backlog = FactoryManagerUtils.getIntProperty(manager, FactoryManager.SOCKET_BACKLOG, DEFAULT_BACKLOG);
+        reuseAddress = FactoryManagerUtils.getBooleanProperty(manager, FactoryManager.SOCKET_REUSEADDR, DEFAULT_REUSE_ADDRESS);
     }
 
     protected IoAcceptor createAcceptor() {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/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 ee795b3..5eefd24 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
@@ -32,6 +32,7 @@ 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;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.util.CloseableUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -141,13 +142,11 @@ public abstract class MinaService extends CloseableUtils.AbstractCloseable imple
     }
 
     protected Integer getInteger(String property) {
-        String strVal = manager.getProperties().get(property);
-        return (strVal != null) ? Integer.parseInt(strVal) : null;
+        return FactoryManagerUtils.getInteger(manager, property);
     }
 
     protected Boolean getBoolean(String property) {
-        String strVal = manager.getProperties().get(property);
-        return (strVal != null) ? Boolean.parseBoolean(strVal) : null;
+        return FactoryManagerUtils.getBoolean(manager, property);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/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 9bba704..5d1a0ae 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
@@ -32,6 +32,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.future.CloseFuture;
 import org.apache.sshd.common.io.IoAcceptor;
 import org.apache.sshd.common.io.IoHandler;
@@ -39,18 +40,15 @@ import org.apache.sshd.common.io.IoHandler;
 /**
  */
 public class Nio2Acceptor extends Nio2Service implements IoAcceptor {
+    public static final int DEFAULT_BACKLOG=0;
 
     private final Map<SocketAddress, AsynchronousServerSocketChannel> channels;
-    private int backlog = 0;
+    private int backlog = DEFAULT_BACKLOG;
 
     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);
-        }
+        backlog = FactoryManagerUtils.getIntProperty(manager, FactoryManager.SOCKET_BACKLOG, DEFAULT_BACKLOG);
     }
 
     public void bind(Collection<? extends SocketAddress> addresses) throws IOException {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/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 4bdb8f7..419e234 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
@@ -29,10 +29,12 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.sshd.common.Closeable;
 import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.io.IoHandler;
 import org.apache.sshd.common.io.IoService;
 import org.apache.sshd.common.io.IoSession;
 import org.apache.sshd.common.util.CloseableUtils;
+import org.apache.sshd.common.util.GenericUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -77,9 +79,9 @@ public abstract class Nio2Service extends CloseableUtils.AbstractInnerCloseable
     }
 
     protected <T> void setOption(NetworkChannel socket, String property, SocketOption<T> option, T defaultValue) throws IOException {
-        String valStr = manager.getProperties().get(property);
+        String valStr = FactoryManagerUtils.getString(manager, property);
         T val = defaultValue;
-        if (valStr != null) {
+        if (!GenericUtils.isEmpty(valStr)) {
             Class<T> type = option.type();
             if (type == Integer.class) {
                 val = type.cast(Integer.parseInt(valStr));
@@ -97,5 +99,4 @@ public abstract class Nio2Service extends CloseableUtils.AbstractInnerCloseable
             }
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
index 6c342a9..7d44beb 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
@@ -800,6 +800,7 @@ public abstract class AbstractSession extends CloseableUtils.AbstractInnerClosea
      * @param ident our identification to send
      */
     protected void sendIdentification(String ident) {
+        log.debug("Send identification: {}", ident);
         byte[] data = (ident + "\r\n").getBytes();
         ioSession.write(new Buffer(data));
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
index 658c050..a9d98a0 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
@@ -29,16 +29,20 @@ import java.util.Set;
 import java.util.TimerTask;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.sshd.agent.SshAgent;
 import org.apache.sshd.agent.SshAgentFactory;
 import org.apache.sshd.common.Channel;
 import org.apache.sshd.common.Closeable;
+import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.ForwardingFilter;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.PtyMode;
 import org.apache.sshd.common.RequestHandler;
+import org.apache.sshd.common.Session;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.channel.ChannelAsyncOutputStream;
 import org.apache.sshd.common.channel.ChannelOutputStream;
@@ -172,7 +176,7 @@ public class ChannelSession extends AbstractServerChannel {
                 synchronized (listeners) {
                     ls = listeners.get(signal);
                     if (ls == null) {
-                        ls = new CopyOnWriteArraySet<SignalListener>();
+                        ls = new CopyOnWriteArraySet<>();
                         listeners.put(signal, ls);
                     }
                 }
@@ -232,17 +236,14 @@ public class ChannelSession extends AbstractServerChannel {
                         commandExitFuture.setClosed();
                     }
                 };
-                long timeout = DEFAULT_COMMAND_EXIT_TIMEOUT;
-                String val = getSession().getFactoryManager().getProperties().get(ServerFactoryManager.COMMAND_EXIT_TIMEOUT);
-                if (val != null) {
-                    try {
-                        timeout = Long.parseLong(val);
-                    } catch (NumberFormatException e) {
-                        // Ignore
-                    }
+
+                FactoryManager manager = getSession().getFactoryManager();
+                long timeout = FactoryManagerUtils.getLongProperty(manager, ServerFactoryManager.COMMAND_EXIT_TIMEOUT, DEFAULT_COMMAND_EXIT_TIMEOUT);
+                if (log.isDebugEnabled()) {
+                    log.debug("Wait {} ms for shell to exit cleanly", timeout);
                 }
-                log.debug("Wait {} ms for shell to exit cleanly", timeout);
-                getSession().getFactoryManager().getScheduledExecutorService().schedule(task, timeout, TimeUnit.MILLISECONDS);
+
+                manager.getScheduledExecutorService().schedule(task, timeout, TimeUnit.MILLISECONDS);
                 commandExitFuture.addListener(new SshFutureListener<CloseFuture>() {
                     public void operationComplete(CloseFuture future) {
                         task.cancel();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEX.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEX.java b/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEX.java
index 007b3a8..ef777d6 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEX.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEX.java
@@ -18,6 +18,7 @@
  */
 package org.apache.sshd.server.kex;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.math.BigInteger;
 import java.net.URL;
@@ -27,6 +28,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.sshd.common.Digest;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.KeyExchange;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.Random;
@@ -39,6 +41,7 @@ import org.apache.sshd.common.kex.DHGroupData;
 import org.apache.sshd.common.session.AbstractSession;
 import org.apache.sshd.common.util.Buffer;
 import org.apache.sshd.common.util.BufferUtils;
+import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.SecurityUtils;
 import org.apache.sshd.server.ServerFactoryManager;
 import org.apache.sshd.server.session.ServerSession;
@@ -221,21 +224,7 @@ public class DHGEX implements KeyExchange {
     }
 
     private DH chooseDH(int min, int prf, int max) throws Exception {
-        List<Moduli.DhGroup> groups = null;
-        URL moduli;
-        String moduliStr = session.getFactoryManager().getProperties().get(ServerFactoryManager.MODULI_URL);
-        if (moduliStr != null) {
-            try {
-                moduli = new URL(moduliStr);
-                groups = Moduli.parseModuli(moduli);
-            } catch (IOException e) {
-                log.warn("Error loading external moduli", e);
-            }
-        }
-        if (groups == null) {
-            moduli = getClass().getResource("/org/apache/sshd/moduli");
-            groups = Moduli.parseModuli(moduli);
-        }
+        List<Moduli.DhGroup> groups = loadModuliGroups();
 
         min = Math.max(min, 1024);
         prf = Math.max(prf, 1024);
@@ -267,6 +256,38 @@ public class DHGEX implements KeyExchange {
         return getDH(group.p, group.g);
     }
 
+    protected List<Moduli.DhGroup> loadModuliGroups() throws IOException {
+        List<Moduli.DhGroup> groups = null;
+        URL moduli;
+        String moduliStr = FactoryManagerUtils.getString(session, ServerFactoryManager.MODULI_URL);
+        if (!GenericUtils.isEmpty(moduliStr)) {
+            try {
+                moduli = new URL(moduliStr);
+                groups = Moduli.parseModuli(moduli);
+            } catch (IOException e) {   // OK - use internal moduli
+                log.warn("Error (" + e.getClass().getSimpleName() + ") loading external moduli from " + moduliStr + ": " + e.getMessage());
+            }
+        }
+
+        if (groups == null) {
+            moduliStr = "/org/apache/sshd/moduli";
+            try {
+                if ((moduli = getClass().getResource(moduliStr)) == null) {
+                    throw new FileNotFoundException("Missing internal moduli file");
+                }
+
+                moduliStr = moduli.toExternalForm();
+                groups = Moduli.parseModuli(moduli);
+            } catch (IOException e) {
+                log.warn("Error (" + e.getClass().getSimpleName() + ") loading internal moduli from " + moduliStr + ": " + e.getMessage());
+                throw e;    // this time we MUST throw the exception
+            }
+        }
+
+        log.debug("Loaded moduli groups from {}", moduliStr);
+        return groups;
+    }
+
     protected DH getDH(BigInteger p, BigInteger g) throws Exception {
         DH dh = new DH(new SHA1.Factory());
         dh.setP(p);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
index 4799c69..fa87cb4 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
@@ -23,6 +23,7 @@ import java.security.KeyPair;
 import java.util.List;
 
 import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.KeyPairProvider;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.ServiceFactory;
@@ -33,6 +34,7 @@ import org.apache.sshd.common.io.IoSession;
 import org.apache.sshd.common.io.IoWriteFuture;
 import org.apache.sshd.common.session.AbstractSession;
 import org.apache.sshd.common.util.Buffer;
+import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.server.ServerFactoryManager;
 
 /**
@@ -42,6 +44,7 @@ import org.apache.sshd.server.ServerFactoryManager;
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
 public class ServerSession extends AbstractSession {
+    public static final String  DEFAULT_SSH_VERSION_PREFIX="SSH-2.0-";
 
     protected static final long MAX_PACKETS = (1l << 31);
 
@@ -89,10 +92,12 @@ public class ServerSession extends AbstractSession {
     }
 
     private void sendServerIdentification() {
-        if (getFactoryManager().getProperties() != null && getFactoryManager().getProperties().get(ServerFactoryManager.SERVER_IDENTIFICATION) != null) {
-            serverVersion = "SSH-2.0-" + getFactoryManager().getProperties().get(ServerFactoryManager.SERVER_IDENTIFICATION);
+        FactoryManager manager = getFactoryManager();
+        String ident = FactoryManagerUtils.getString(manager, ServerFactoryManager.SERVER_IDENTIFICATION);
+        if (GenericUtils.isEmpty(ident)) {
+            serverVersion = DEFAULT_SSH_VERSION_PREFIX + manager.getVersion();
         } else {
-            serverVersion = "SSH-2.0-" + getFactoryManager().getVersion();
+            serverVersion = DEFAULT_SSH_VERSION_PREFIX + ident;
         }
         sendIdentification(serverVersion);
     }
@@ -155,7 +160,7 @@ public class ServerSession extends AbstractSession {
             return false;
         }
         log.debug("Client version string: {}", clientVersion);
-        if (!clientVersion.startsWith("SSH-2.0-")) {
+        if (!clientVersion.startsWith(DEFAULT_SSH_VERSION_PREFIX)) {
             String msg = "Unsupported protocol version: " + clientVersion;
             ioSession.write(new Buffer((msg + "\n").getBytes())).addListener(new SshFutureListener<IoWriteFuture>() {
                 @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/421faf51/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
index 1d7ea3d..baa0e83 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
@@ -25,20 +25,19 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.sshd.SshServer;
+import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.FactoryManagerUtils;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.Service;
 import org.apache.sshd.common.ServiceFactory;
 import org.apache.sshd.common.Session;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.SshException;
-import org.apache.sshd.common.future.CloseFuture;
-import org.apache.sshd.common.future.DefaultCloseFuture;
 import org.apache.sshd.common.util.Buffer;
 import org.apache.sshd.common.util.CloseableUtils;
+import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.server.ServerFactoryManager;
 import org.apache.sshd.server.UserAuth;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
@@ -77,17 +76,19 @@ public class ServerUserAuthService extends CloseableUtils.AbstractCloseable impl
         }
         maxAuthRequests = session.getIntProperty(ServerFactoryManager.MAX_AUTH_REQUESTS, maxAuthRequests);
 
-        userAuthFactories = new ArrayList<NamedFactory<UserAuth>>(getFactoryManager().getUserAuthFactories());
+        userAuthFactories = new ArrayList<>(getFactoryManager().getUserAuthFactories());
         // Get authentication methods
-        authMethods = new ArrayList<List<String>>();
-        String mths = getFactoryManager().getProperties().get(SshServer.AUTH_METHODS);
-        if (mths == null) {
-            for (NamedFactory<UserAuth> uaf : getFactoryManager().getUserAuthFactories()) {
-                authMethods.add(new ArrayList<String>(Collections.singletonList(uaf.getName())));
+        authMethods = new ArrayList<>();
+        
+        ServerFactoryManager  manager=getFactoryManager();
+        String mths = FactoryManagerUtils.getString(manager, SshServer.AUTH_METHODS);
+        if (GenericUtils.isEmpty(mths)) {
+            for (NamedFactory<UserAuth> uaf : manager.getUserAuthFactories()) {
+                authMethods.add(new ArrayList<>(Collections.singletonList(uaf.getName())));
             }
         } else {
             for (String mthl : mths.split("\\s")) {
-                authMethods.add(new ArrayList<String>(Arrays.asList(mthl.split(","))));
+                authMethods.add(new ArrayList<>(Arrays.asList(mthl.split(","))));
             }
         }
         // Verify all required methods are supported
@@ -98,7 +99,10 @@ public class ServerUserAuthService extends CloseableUtils.AbstractCloseable impl
                 }
             }
         }
-        log.debug("Authorized authentication methods: {}", NamedFactory.Utils.getNames(userAuthFactories));
+        
+        if (log.isDebugEnabled()) {
+            log.debug("Authorized authentication methods: {}", NamedFactory.Utils.getNames(userAuthFactories));
+        }
     }
 
     public void start() {
@@ -177,20 +181,20 @@ public class ServerUserAuthService extends CloseableUtils.AbstractCloseable impl
                     success |= l.isEmpty();
                 }
             }
+
             if (success) {
-                if (getFactoryManager().getProperties() != null) {
-                    String maxSessionCountAsString = getFactoryManager().getProperties().get(ServerFactoryManager.MAX_CONCURRENT_SESSIONS);
-                    if (maxSessionCountAsString != null) {
-                        int maxSessionCount = Integer.parseInt(maxSessionCountAsString);
-                        int currentSessionCount = session.getActiveSessionCountForUser(username);
-                        if (currentSessionCount >= maxSessionCount) {
-                            session.disconnect(SshConstants.SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE, "Too many concurrent connections");
-                            return;
-                        }
+                FactoryManager manager = getFactoryManager();
+                Integer maxSessionCount = FactoryManagerUtils.getInteger(manager, ServerFactoryManager.MAX_CONCURRENT_SESSIONS);
+                if (maxSessionCount != null) {
+                    int currentSessionCount = session.getActiveSessionCountForUser(username);
+                    if (currentSessionCount >= maxSessionCount.intValue()) {
+                        session.disconnect(SshConstants.SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE,
+                                "Too many concurrent connections (" + currentSessionCount + ") - max. allowed: " + maxSessionCount);
+                        return;
                     }
                 }
 
-                String welcomeBanner = getFactoryManager().getProperties().get(ServerFactoryManager.WELCOME_BANNER);
+                String welcomeBanner = FactoryManagerUtils.getString(manager, ServerFactoryManager.WELCOME_BANNER);
                 if (welcomeBanner != null) {
                     buffer = session.createBuffer(SshConstants.SSH_MSG_USERAUTH_BANNER);
                     buffer.putString(welcomeBanner);