Repository: mina-sshd
Updated Branches:
  refs/heads/master e88a08326 -> fc7a8e7c2


[SSHD-865] 'SshClient' and 'ClientSession' use only a KeyIdentityProvider 
instead of KeyPairProvider


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

Branch: refs/heads/master
Commit: e849cc5a4c1fc1d14ad556cd656b6bca54dd0840
Parents: e88a083
Author: Lyor Goldstein <[email protected]>
Authored: Sun Nov 18 15:32:47 2018 +0200
Committer: Lyor Goldstein <[email protected]>
Committed: Mon Nov 19 14:50:09 2018 +0200

----------------------------------------------------------------------
 CHANGES.md                                      |  3 ++
 .../sshd/cli/client/SshClientCliSupport.java    |  5 +--
 .../keys/DefaultClientIdentitiesWatcher.java    |  3 +-
 .../keyprovider/KeyIdentityProviderHolder.java  | 36 ++++++++++++++++++++
 .../client/ClientAuthenticationManager.java     |  7 ++--
 .../java/org/apache/sshd/client/SshClient.java  | 34 ++++++++++++------
 .../client/session/AbstractClientSession.java   | 13 +++++++
 .../sshd/client/session/ClientSession.java      |  2 +-
 .../common/kex/AbstractKexFactoryManager.java   | 14 --------
 .../sshd/common/kex/KexFactoryManager.java      |  3 +-
 .../server/ServerAuthenticationManager.java     |  3 +-
 .../java/org/apache/sshd/server/SshServer.java  | 12 +++++++
 .../server/global/OpenSshHostKeysHandler.java   | 11 +++---
 .../server/session/AbstractServerSession.java   | 15 ++++++++
 .../client/ClientAuthenticationManagerTest.java | 14 ++++----
 .../hosts/HostConfigEntryResolverTest.java      | 12 +++----
 .../sshd/common/auth/AuthenticationTest.java    |  3 +-
 .../sshd/common/kex/KexFactoryManagerTest.java  | 11 ------
 .../server/ServerAuthenticationManagerTest.java | 11 ++++++
 .../sshd/util/test/CoreTestSupportUtils.java    |  4 +--
 20 files changed, 150 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/CHANGES.md
----------------------------------------------------------------------
diff --git a/CHANGES.md b/CHANGES.md
index 60f941b..3ca0d3d 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -57,6 +57,9 @@ accept also an `AttributeRepository` connection context 
argument (propagated fro
 
 * `ApacheSshdSftpSessionFactory#get/setPrivateKey` has been renamed to 
`get/setPrivateKeyLocation`.
 
+* `SshClient` and `ClientSession` use a `KeyIdentityProvider` instead of a 
full blown `KeyPairProvider`.
+`KeyPairProvider` is used only in the context of an `SshServer` and/or 
`ServerSession`.
+
 ## Behavioral changes and enhancements
 
 * [SSHD-849](https://issues.apache.org/jira/browse/SSHD-849) - Data forwarding 
code makes sure all

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java
----------------------------------------------------------------------
diff --git 
a/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java 
b/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java
index 9286324..4741e72 100644
--- a/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java
+++ b/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java
@@ -343,7 +343,8 @@ public abstract class SshClientCliSupport extends 
CliSupport {
         }
     }
 
-    public static FileKeyPairProvider 
setupSessionIdentities(ClientFactoryManager client, Collection<? extends Path> 
identities,
+    public static FileKeyPairProvider setupSessionIdentities(
+            ClientFactoryManager client, Collection<? extends Path> identities,
             BufferedReader stdin, PrintStream stdout, PrintStream stderr)
                 throws Throwable {
         client.setFilePasswordProvider((session, file, index) -> {
@@ -362,7 +363,7 @@ public abstract class SshClientCliSupport extends 
CliSupport {
             }
         };
         provider.setPaths(identities);
-        client.setKeyPairProvider(provider);
+        client.setKeyIdentityProvider(provider);
         return provider;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/DefaultClientIdentitiesWatcher.java
----------------------------------------------------------------------
diff --git 
a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/DefaultClientIdentitiesWatcher.java
 
b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/DefaultClientIdentitiesWatcher.java
index 3afa129..ee710c3 100644
--- 
a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/DefaultClientIdentitiesWatcher.java
+++ 
b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/DefaultClientIdentitiesWatcher.java
@@ -40,7 +40,8 @@ public class DefaultClientIdentitiesWatcher extends 
BuiltinClientIdentitiesWatch
         this(true, loader, provider, strict);
     }
 
-    public DefaultClientIdentitiesWatcher(boolean supportedOnly, 
ClientIdentityLoader loader, FilePasswordProvider provider, boolean strict) {
+    public DefaultClientIdentitiesWatcher(
+            boolean supportedOnly, ClientIdentityLoader loader, 
FilePasswordProvider provider, boolean strict) {
         this(supportedOnly,
              GenericUtils.supplierOf(Objects.requireNonNull(loader, "No client 
identity loader")),
              GenericUtils.supplierOf(Objects.requireNonNull(provider, "No 
password provider")),

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProviderHolder.java
----------------------------------------------------------------------
diff --git 
a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProviderHolder.java
 
b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProviderHolder.java
new file mode 100644
index 0000000..b33064a
--- /dev/null
+++ 
b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProviderHolder.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sshd.common.keyprovider;
+
+/**
+ * TODO Add javadoc
+ *
+ * @author <a href="mailto:[email protected]";>Apache MINA SSHD Project</a>
+ */
+public interface KeyIdentityProviderHolder {
+    /**
+     * @return The {@link KeyIdentityProvider} used to provide key-pair(s)
+     * for public key authentication
+     */
+    KeyIdentityProvider getKeyIdentityProvider();
+
+    void setKeyIdentityProvider(KeyIdentityProvider provider);
+
+}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
 
b/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
index a9ae68c..4b84752 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
@@ -33,7 +33,7 @@ import 
org.apache.sshd.client.auth.password.PasswordIdentityProvider;
 import org.apache.sshd.client.keyverifier.ServerKeyVerifier;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.NamedResource;
-import org.apache.sshd.common.keyprovider.KeyPairProviderHolder;
+import org.apache.sshd.common.keyprovider.KeyIdentityProviderHolder;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
 
@@ -41,7 +41,7 @@ import org.apache.sshd.common.util.ValidateUtils;
  * Holds information required for the client to perform authentication with 
the server
  * @author <a href="mailto:[email protected]";>Apache MINA SSHD Project</a>
  */
-public interface ClientAuthenticationManager extends KeyPairProviderHolder {
+public interface ClientAuthenticationManager extends KeyIdentityProviderHolder 
{
 
     /**
      * Ordered comma separated list of authentications methods.
@@ -74,7 +74,8 @@ public interface ClientAuthenticationManager extends 
KeyPairProviderHolder {
      * candidates
      *
      * @return The {@link PasswordIdentityProvider} instance - ignored if 
{@code null}
-     * (i.e., no passwords available)
+     * (i.e., no passwords available).
+     * @see #addPasswordIdentity(String)
      */
     PasswordIdentityProvider getPasswordIdentityProvider();
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java 
b/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java
index fba078c..796d781 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java
@@ -80,6 +80,7 @@ import org.apache.sshd.common.helpers.AbstractFactoryManager;
 import org.apache.sshd.common.io.IoConnectFuture;
 import org.apache.sshd.common.io.IoConnector;
 import org.apache.sshd.common.io.IoSession;
+import org.apache.sshd.common.keyprovider.KeyIdentityProvider;
 import org.apache.sshd.common.keyprovider.KeyPairProvider;
 import org.apache.sshd.common.session.helpers.AbstractSession;
 import org.apache.sshd.common.util.GenericUtils;
@@ -167,6 +168,7 @@ public class SshClient extends AbstractFactoryManager 
implements ClientFactoryMa
     private ServerKeyVerifier serverKeyVerifier;
     private HostConfigEntryResolver hostConfigEntryResolver;
     private ClientIdentityLoader clientIdentityLoader;
+    private KeyIdentityProvider keyIdentityProvider;
     private FilePasswordProvider filePasswordProvider;
     private PasswordIdentityProvider passwordIdentityProvider;
 
@@ -325,6 +327,16 @@ public class SshClient extends AbstractFactoryManager 
implements ClientFactoryMa
     }
 
     @Override
+    public KeyIdentityProvider getKeyIdentityProvider() {
+        return keyIdentityProvider;
+    }
+
+    @Override
+    public void setKeyIdentityProvider(KeyIdentityProvider 
keyIdentityProvider) {
+        this.keyIdentityProvider = keyIdentityProvider;
+    }
+
+    @Override
     protected void checkConfig() {
         super.checkConfig();
 
@@ -335,17 +347,17 @@ public class SshClient extends AbstractFactoryManager 
implements ClientFactoryMa
         Objects.requireNonNull(getFilePasswordProvider(), 
"FilePasswordProvider not set");
 
         // if no client identities override use the default
-        KeyPairProvider defaultIdentities = getKeyPairProvider();
+        KeyIdentityProvider defaultIdentities = getKeyIdentityProvider();
         if (defaultIdentities == null) {
-            setKeyPairProvider(new 
DefaultClientIdentitiesWatcher(this::getClientIdentityLoader, 
this::getFilePasswordProvider));
+            setKeyIdentityProvider(new 
DefaultClientIdentitiesWatcher(this::getClientIdentityLoader, 
this::getFilePasswordProvider));
         }
 
         // Register the additional agent forwarding channel if needed
         SshAgentFactory agentFactory = getAgentFactory();
         if (agentFactory != null) {
             List<NamedFactory<Channel>> forwarders =
-                    ValidateUtils.checkNotNullAndNotEmpty(
-                            agentFactory.getChannelForwardingFactories(this), 
"No agent channel forwarding factories for %s", agentFactory);
+                ValidateUtils.checkNotNullAndNotEmpty(
+                    agentFactory.getChannelForwardingFactories(this), "No 
agent channel forwarding factories for %s", agentFactory);
             List<NamedFactory<Channel>> factories = getChannelFactories();
             if (GenericUtils.isEmpty(factories)) {
                 factories = forwarders;
@@ -656,15 +668,15 @@ public class SshClient extends AbstractFactoryManager 
implements ClientFactoryMa
 
     protected void setupDefaultSessionIdentities(ClientSession session) {
         // check if session listener intervened
-        KeyPairProvider kpSession = session.getKeyPairProvider();
-        KeyPairProvider kpClient = getKeyPairProvider();
+        KeyIdentityProvider kpSession = session.getKeyIdentityProvider();
+        KeyIdentityProvider kpClient = getKeyIdentityProvider();
         boolean debugEnabled = log.isDebugEnabled();
         if (kpSession == null) {
-            session.setKeyPairProvider(kpClient);
+            session.setKeyIdentityProvider(kpClient);
         } else {
             if (kpSession != kpClient) {
                 if (debugEnabled) {
-                    log.debug("setupDefaultSessionIdentities({}) key-pair 
provider override", session);
+                    log.debug("setupDefaultSessionIdentities({}) key identity 
provider override", session);
                 }
             }
         }
@@ -828,7 +840,7 @@ public class SshClient extends AbstractFactoryManager 
implements ClientFactoryMa
      * @param options       The {@link LinkOption}s to apply when checking
      *                      for existence
      * @return The updated <tt>client</tt> instance - provided a non-{@code 
null}
-     * {@link KeyPairProvider} was generated
+     * {@link KeyIdentityProvider} was generated
      * @throws IOException              If failed to access the file system
      * @throws GeneralSecurityException If failed to load the keys
      * @see ClientIdentity#loadDefaultKeyPairProvider(Path, boolean, boolean, 
FilePasswordProvider, LinkOption...)
@@ -836,10 +848,10 @@ public class SshClient extends AbstractFactoryManager 
implements ClientFactoryMa
     public static <C extends SshClient> C setKeyPairProvider(
             C client, Path dir, boolean strict, boolean supportedOnly, 
FilePasswordProvider provider, LinkOption... options)
                 throws IOException, GeneralSecurityException {
-        KeyPairProvider kpp =
+        KeyIdentityProvider kpp =
             ClientIdentity.loadDefaultKeyPairProvider(dir, strict, 
supportedOnly, provider, options);
         if (kpp != null) {
-            client.setKeyPairProvider(kpp);
+            client.setKeyIdentityProvider(kpp);
         }
 
         return client;

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
 
b/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
index 1c329ef..57485ad 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
@@ -58,6 +58,7 @@ import org.apache.sshd.common.io.IoSession;
 import org.apache.sshd.common.io.IoWriteFuture;
 import org.apache.sshd.common.kex.KexProposalOption;
 import org.apache.sshd.common.kex.KexState;
+import org.apache.sshd.common.keyprovider.KeyIdentityProvider;
 import org.apache.sshd.common.session.ConnectionService;
 import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.session.helpers.AbstractConnectionService;
@@ -80,6 +81,7 @@ public abstract class AbstractClientSession extends 
AbstractSession implements C
     private ServerKeyVerifier serverKeyVerifier;
     private UserInteraction userInteraction;
     private PasswordIdentityProvider passwordIdentityProvider;
+    private KeyIdentityProvider keyIdentityProvider;
     private List<NamedFactory<UserAuth>> userAuthFactories;
     private SocketAddress connectAddress;
     private ClientProxyConnector proxyConnector;
@@ -160,6 +162,17 @@ public abstract class AbstractClientSession extends 
AbstractSession implements C
     }
 
     @Override
+    public KeyIdentityProvider getKeyIdentityProvider() {
+        ClientFactoryManager manager = getFactoryManager();
+        return resolveEffectiveProvider(KeyIdentityProvider.class, 
keyIdentityProvider, manager.getKeyIdentityProvider());
+    }
+
+    @Override
+    public void setKeyIdentityProvider(KeyIdentityProvider 
keyIdentityProvider) {
+        this.keyIdentityProvider = keyIdentityProvider;
+    }
+
+    @Override
     public ClientProxyConnector getClientProxyConnector() {
         ClientFactoryManager manager = getFactoryManager();
         return resolveEffectiveProvider(ClientProxyConnector.class, 
proxyConnector, manager.getClientProxyConnector());

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java 
b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java
index b7b5377..59df28c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java
@@ -381,7 +381,7 @@ public interface ClientSession
         return (session == null)
             ? KeyIdentityProvider.EMPTY_KEYS_PROVIDER
             : KeyIdentityProvider.resolveKeyIdentityProvider(
-                session.getRegisteredIdentities(), 
session.getKeyPairProvider());
+                session.getRegisteredIdentities(), 
session.getKeyIdentityProvider());
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractKexFactoryManager.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractKexFactoryManager.java
 
b/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractKexFactoryManager.java
index aa111af..eb502e4 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractKexFactoryManager.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractKexFactoryManager.java
@@ -25,7 +25,6 @@ import java.util.List;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.cipher.Cipher;
 import org.apache.sshd.common.compression.Compression;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
 import org.apache.sshd.common.mac.Mac;
 import org.apache.sshd.common.signature.Signature;
 import org.apache.sshd.common.util.GenericUtils;
@@ -43,7 +42,6 @@ public abstract class AbstractKexFactoryManager
     private List<NamedFactory<Compression>> compressionFactories;
     private List<NamedFactory<Mac>> macFactories;
     private List<NamedFactory<Signature>> signatureFactories;
-    private KeyPairProvider keyPairProvider;
 
     protected AbstractKexFactoryManager() {
         this(null);
@@ -117,18 +115,6 @@ public abstract class AbstractKexFactoryManager
         this.signatureFactories = signatureFactories;
     }
 
-    @Override
-    public KeyPairProvider getKeyPairProvider() {
-        KexFactoryManager parent = getDelegate();
-        return resolveEffectiveProvider(KeyPairProvider.class, keyPairProvider,
-            (parent == null) ? null : parent.getKeyPairProvider());
-    }
-
-    @Override
-    public void setKeyPairProvider(KeyPairProvider keyPairProvider) {
-        this.keyPairProvider = keyPairProvider;
-    }
-
     protected <V> List<NamedFactory<V>> resolveEffectiveFactories(
             Class<V> factoryType, List<NamedFactory<V>> local, 
List<NamedFactory<V>> inherited) {
         if (GenericUtils.isEmpty(local)) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/main/java/org/apache/sshd/common/kex/KexFactoryManager.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/common/kex/KexFactoryManager.java 
b/sshd-core/src/main/java/org/apache/sshd/common/kex/KexFactoryManager.java
index 7aa8cba..6e46154 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/kex/KexFactoryManager.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/KexFactoryManager.java
@@ -30,7 +30,6 @@ import org.apache.sshd.common.cipher.BuiltinCiphers;
 import org.apache.sshd.common.cipher.Cipher;
 import org.apache.sshd.common.compression.BuiltinCompressions;
 import org.apache.sshd.common.compression.Compression;
-import org.apache.sshd.common.keyprovider.KeyPairProviderHolder;
 import org.apache.sshd.common.mac.BuiltinMacs;
 import org.apache.sshd.common.mac.Mac;
 import org.apache.sshd.common.signature.SignatureFactoriesManager;
@@ -41,7 +40,7 @@ import org.apache.sshd.common.util.ValidateUtils;
  * Holds KEX negotiation stage configuration
  * @author <a href="mailto:[email protected]";>Apache MINA SSHD Project</a>
  */
-public interface KexFactoryManager extends KeyPairProviderHolder, 
SignatureFactoriesManager {
+public interface KexFactoryManager extends SignatureFactoriesManager {
     /**
      * Retrieve the list of named factories for <code>KeyExchange</code>.
      *

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
index 1d3a96d..c9a1b51 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
@@ -27,6 +27,7 @@ import java.util.List;
 
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.NamedResource;
+import org.apache.sshd.common.keyprovider.KeyPairProviderHolder;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.server.auth.BuiltinUserAuthFactories;
@@ -46,7 +47,7 @@ import 
org.apache.sshd.server.auth.pubkey.UserAuthPublicKeyFactory;
  * Holds providers and helpers related to the server side authentication 
process
  * @author <a href="mailto:[email protected]";>Apache MINA SSHD Project</a>
  */
-public interface ServerAuthenticationManager {
+public interface ServerAuthenticationManager extends KeyPairProviderHolder {
     /**
      * Key used to retrieve the value in the configuration properties map
      * of the maximum number of failed authentication requests before the

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java 
b/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
index c5a6918..72ed860 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
@@ -40,6 +40,7 @@ import org.apache.sshd.common.helpers.AbstractFactoryManager;
 import org.apache.sshd.common.io.IoAcceptor;
 import org.apache.sshd.common.io.IoServiceFactory;
 import org.apache.sshd.common.io.IoSession;
+import org.apache.sshd.common.keyprovider.KeyPairProvider;
 import org.apache.sshd.common.session.helpers.AbstractSession;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
@@ -103,6 +104,7 @@ public class SshServer extends AbstractFactoryManager 
implements ServerFactoryMa
     private CommandFactory commandFactory;
     private List<NamedFactory<Command>> subsystemFactories;
     private List<NamedFactory<UserAuth>> userAuthFactories;
+    private KeyPairProvider keyPairProvider;
     private PasswordAuthenticator passwordAuthenticator;
     private PublickeyAuthenticator publickeyAuthenticator;
     private KeyboardInteractiveAuthenticator interactiveAuthenticator;
@@ -249,6 +251,16 @@ public class SshServer extends AbstractFactoryManager 
implements ServerFactoryMa
     }
 
     @Override
+    public KeyPairProvider getKeyPairProvider() {
+        return keyPairProvider;
+    }
+
+    @Override
+    public void setKeyPairProvider(KeyPairProvider keyPairProvider) {
+        this.keyPairProvider = keyPairProvider;
+    }
+
+    @Override
     protected void checkConfig() {
         super.checkConfig();
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/main/java/org/apache/sshd/server/global/OpenSshHostKeysHandler.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/global/OpenSshHostKeysHandler.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/global/OpenSshHostKeysHandler.java
index 35a7d68..c3f9477 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/global/OpenSshHostKeysHandler.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/global/OpenSshHostKeysHandler.java
@@ -40,6 +40,7 @@ import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.common.util.buffer.Buffer;
 import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
 import org.apache.sshd.common.util.buffer.keys.BufferPublicKeyParser;
+import org.apache.sshd.server.session.ServerSession;
 
 /**
  * An initial handler for &quot;[email protected]&quot; request
@@ -90,10 +91,10 @@ public class OpenSshHostKeysHandler extends 
AbstractOpenSshHostKeysHandler imple
         // according to the specification there MUST be reply required by the 
server
         ValidateUtils.checkTrue(wantReply, "No reply required for host keys of 
%s", session);
         Collection<? extends NamedFactory<Signature>> factories =
-                ValidateUtils.checkNotNullAndNotEmpty(
-                        
SignatureFactoriesManager.resolveSignatureFactories(this, session),
-                        "No signature factories available for host keys of 
session=%s",
-                        session);
+            ValidateUtils.checkNotNullAndNotEmpty(
+                    SignatureFactoriesManager.resolveSignatureFactories(this, 
session),
+                    "No signature factories available for host keys of 
session=%s",
+                    session);
         if (log.isDebugEnabled()) {
             log.debug("handleHostKeys({})[want-reply={}] received {} keys - 
factories={}",
                       session, wantReply, GenericUtils.size(keys), 
NamedResource.getNames(factories));
@@ -104,7 +105,7 @@ public class OpenSshHostKeysHandler extends 
AbstractOpenSshHostKeysHandler imple
 
         Buffer buf = new ByteArrayBuffer();
         byte[] sessionId = session.getSessionId();
-        KeyPairProvider kpp = 
Objects.requireNonNull(session.getKeyPairProvider(), "No server keys provider");
+        KeyPairProvider kpp = Objects.requireNonNull(((ServerSession) 
session).getKeyPairProvider(), "No server keys provider");
         for (PublicKey k : keys) {
             String keyType = KeyUtils.getKeyType(k);
             Signature verifier = ValidateUtils.checkNotNull(

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/main/java/org/apache/sshd/server/session/AbstractServerSession.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/session/AbstractServerSession.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/session/AbstractServerSession.java
index 6af869e..2a5209c 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/session/AbstractServerSession.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/session/AbstractServerSession.java
@@ -40,6 +40,7 @@ import 
org.apache.sshd.common.auth.AbstractUserAuthServiceFactory;
 import org.apache.sshd.common.io.IoService;
 import org.apache.sshd.common.io.IoSession;
 import org.apache.sshd.common.io.IoWriteFuture;
+import org.apache.sshd.common.kex.KexFactoryManager;
 import org.apache.sshd.common.kex.KexProposalOption;
 import org.apache.sshd.common.kex.KexState;
 import org.apache.sshd.common.keyprovider.KeyPairProvider;
@@ -50,6 +51,7 @@ import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.common.util.buffer.Buffer;
 import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
+import org.apache.sshd.server.ServerAuthenticationManager;
 import org.apache.sshd.server.ServerFactoryManager;
 import org.apache.sshd.server.auth.UserAuth;
 import org.apache.sshd.server.auth.WelcomeBannerPhase;
@@ -73,6 +75,7 @@ public abstract class AbstractServerSession extends 
AbstractSession implements S
     private GSSAuthenticator gssAuthenticator;
     private HostBasedAuthenticator hostBasedAuthenticator;
     private List<NamedFactory<UserAuth>> userAuthFactories;
+    private KeyPairProvider keyPairProvider;
 
     protected AbstractServerSession(ServerFactoryManager factoryManager, 
IoSession ioSession) {
         super(true, factoryManager, ioSession);
@@ -168,6 +171,18 @@ public abstract class AbstractServerSession extends 
AbstractSession implements S
         this.userAuthFactories = userAuthFactories; // OK if null/empty - 
inherit from parent
     }
 
+    @Override
+    public KeyPairProvider getKeyPairProvider() {
+        KexFactoryManager parent = getDelegate();
+        return resolveEffectiveProvider(KeyPairProvider.class, keyPairProvider,
+            (parent == null) ? null : ((ServerAuthenticationManager) 
parent).getKeyPairProvider());
+    }
+
+    @Override
+    public void setKeyPairProvider(KeyPairProvider keyPairProvider) {
+        this.keyPairProvider = keyPairProvider;
+    }
+
     /**
      * Sends the server identification + any extra header lines
      *

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java
 
b/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java
index 30ce313..d4279f9 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java
@@ -43,7 +43,7 @@ import org.apache.sshd.common.forward.DefaultForwarderFactory;
 import org.apache.sshd.common.forward.PortForwardingEventListener;
 import org.apache.sshd.common.io.IoSession;
 import org.apache.sshd.common.io.IoWriteFuture;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
+import org.apache.sshd.common.keyprovider.KeyIdentityProvider;
 import org.apache.sshd.common.random.JceRandomFactory;
 import org.apache.sshd.common.random.Random;
 import org.apache.sshd.common.random.SingletonRandomFactory;
@@ -81,13 +81,13 @@ public class ClientAuthenticationManagerTest extends 
BaseTestSupport {
             }
 
             @Override
-            public KeyPairProvider getKeyPairProvider() {
+            public KeyIdentityProvider getKeyIdentityProvider() {
                 return null;
             }
 
             @Override
-            public void setKeyPairProvider(KeyPairProvider keyPairProvider) {
-                throw new UnsupportedOperationException("setKeyPairProvider(" 
+ keyPairProvider + ")");
+            public void setKeyIdentityProvider(KeyIdentityProvider provider) {
+                throw new 
UnsupportedOperationException("setKeyIdentityProvider(" + provider + ")");
             }
 
             @Override
@@ -183,7 +183,7 @@ public class ClientAuthenticationManagerTest extends 
BaseTestSupport {
                     PasswordIdentityProvider.class,
                     ServerKeyVerifier.class,
                     UserInteraction.class,
-                    KeyPairProvider.class
+                    KeyIdentityProvider.class
                 }) {
                     testClientProvidersPropagation(provider, client, session);
                 }
@@ -191,7 +191,9 @@ public class ClientAuthenticationManagerTest extends 
BaseTestSupport {
         }
     }
 
-    private void testClientProvidersPropagation(Class<?> type, 
ClientAuthenticationManager client, ClientAuthenticationManager session) throws 
Exception {
+    private void testClientProvidersPropagation(
+            Class<?> type, ClientAuthenticationManager client, 
ClientAuthenticationManager session)
+                throws Exception {
         String baseName = type.getSimpleName();
         outputDebugMessage("testClientProvidersPropagation(%s)", baseName);
         assertTrue(baseName + ": not an interface", type.isInterface());

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryResolverTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryResolverTest.java
 
b/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryResolverTest.java
index 1a767c6..b76e46c 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryResolverTest.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryResolverTest.java
@@ -43,7 +43,7 @@ import 
org.apache.sshd.common.config.keys.FilePasswordProvider;
 import org.apache.sshd.common.config.keys.KeyUtils;
 import org.apache.sshd.common.io.IoSession;
 import org.apache.sshd.common.keyprovider.AbstractKeyPairProvider;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
+import org.apache.sshd.common.keyprovider.KeyIdentityProvider;
 import org.apache.sshd.common.session.Session;
 import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.ValidateUtils;
@@ -185,13 +185,13 @@ public class HostConfigEntryResolverTest extends 
BaseTestSupport {
     @Test
     public void testUseIdentitiesOnly() throws Exception {
         Path clientIdFile = 
assertHierarchyTargetFolderExists(getTempTargetRelativeFile(getClass().getSimpleName()));
-        KeyPairProvider clientIdProvider =
+        KeyIdentityProvider clientIdProvider =
             
CommonTestSupportUtils.createTestHostKeyProvider(clientIdFile.resolve(getCurrentTestName()
 + ".pem"));
         KeyPair specificIdentity = 
CommonTestSupportUtils.getFirstKeyPair(sshd);
         KeyPair defaultIdentity = 
CommonTestSupportUtils.getFirstKeyPair(clientIdProvider);
         ValidateUtils.checkTrue(!KeyUtils.compareKeyPairs(specificIdentity, 
defaultIdentity),
                 "client identity not different then entry one");
-        client.setKeyPairProvider(clientIdProvider);
+        client.setKeyIdentityProvider(clientIdProvider);
 
         String user = getCurrentTestName();
         AtomicBoolean defaultClientIdentityAttempted = new 
AtomicBoolean(false);
@@ -234,17 +234,17 @@ public class HostConfigEntryResolverTest extends 
BaseTestSupport {
         PropertyResolverUtils.updateProperty(client, 
ClientFactoryManager.IGNORE_INVALID_IDENTITIES, false);
 
         Collection<KeyPair> clientIdentities = 
Collections.singletonList(defaultIdentity);
-        KeyPairProvider provider = new AbstractKeyPairProvider() {
+        KeyIdentityProvider provider = new AbstractKeyPairProvider() {
             @Override
             public Iterable<KeyPair> loadKeys(SessionContext session) {
                 return clientIdentities;
             }
         };
-        client.setKeyPairProvider(provider);
+        client.setKeyIdentityProvider(provider);
 
         client.start();
         try (ClientSession session = client.connect(entry).verify(7L, 
TimeUnit.SECONDS).getSession()) {
-            assertSame("Unexpected session key pairs provider", provider, 
session.getKeyPairProvider());
+            assertSame("Unexpected session key pairs provider", provider, 
session.getKeyIdentityProvider());
             session.auth().verify(5L, TimeUnit.SECONDS);
             assertFalse("Unexpected default client identity attempted", 
defaultClientIdentityAttempted.get());
             assertNull("Default client identity auto-added", 
session.removePublicKeyIdentity(defaultIdentity));

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java 
b/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java
index e55d150..34c418b 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java
@@ -53,6 +53,7 @@ import 
org.apache.sshd.common.config.keys.FilePasswordProvider;
 import org.apache.sshd.common.config.keys.KeyUtils;
 import org.apache.sshd.common.io.IoSession;
 import org.apache.sshd.common.io.IoWriteFuture;
+import org.apache.sshd.common.keyprovider.KeyIdentityProvider;
 import org.apache.sshd.common.keyprovider.KeyPairProvider;
 import org.apache.sshd.common.session.Session;
 import org.apache.sshd.common.session.SessionContext;
@@ -916,7 +917,7 @@ public class AuthenticationTest extends BaseTestSupport {
                         return "super secret passphrase";
                     }
                 };
-                s.setKeyPairProvider(new KeyPairProvider() {
+                s.setKeyIdentityProvider(new KeyIdentityProvider() {
                     @Override
                     public Iterable<KeyPair> loadKeys(SessionContext session) 
throws IOException, GeneralSecurityException {
                         assertSame("Mismatched session context", s, session);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/test/java/org/apache/sshd/common/kex/KexFactoryManagerTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/common/kex/KexFactoryManagerTest.java 
b/sshd-core/src/test/java/org/apache/sshd/common/kex/KexFactoryManagerTest.java
index 63c0346..8242a62 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/common/kex/KexFactoryManagerTest.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/common/kex/KexFactoryManagerTest.java
@@ -27,7 +27,6 @@ import org.apache.sshd.common.cipher.BuiltinCiphers;
 import org.apache.sshd.common.cipher.Cipher;
 import org.apache.sshd.common.compression.BuiltinCompressions;
 import org.apache.sshd.common.compression.Compression;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
 import org.apache.sshd.common.mac.BuiltinMacs;
 import org.apache.sshd.common.mac.Mac;
 import org.apache.sshd.common.signature.BuiltinSignatures;
@@ -129,16 +128,6 @@ public class KexFactoryManagerTest extends BaseTestSupport 
{
         }
 
         @Override
-        public KeyPairProvider getKeyPairProvider() {
-            return null;
-        }
-
-        @Override
-        public void setKeyPairProvider(KeyPairProvider keyPairProvider) {
-            throw new UnsupportedOperationException("N/A");
-        }
-
-        @Override
         public List<NamedFactory<Signature>> getSignatureFactories() {
             return signatures;
         }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/test/java/org/apache/sshd/server/ServerAuthenticationManagerTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/server/ServerAuthenticationManagerTest.java
 
b/sshd-core/src/test/java/org/apache/sshd/server/ServerAuthenticationManagerTest.java
index fc7b11c..9be1cb0 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/server/ServerAuthenticationManagerTest.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/server/ServerAuthenticationManagerTest.java
@@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.NamedResource;
+import org.apache.sshd.common.keyprovider.KeyPairProvider;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.server.auth.BuiltinUserAuthFactories;
 import org.apache.sshd.server.auth.UserAuth;
@@ -113,6 +114,16 @@ public class ServerAuthenticationManagerTest extends 
BaseTestSupport {
             public void setHostBasedAuthenticator(HostBasedAuthenticator 
hostBasedAuthenticator) {
                 throw new 
UnsupportedOperationException("setHostBasedAuthenticator(" + 
hostBasedAuthenticator + ")");
             }
+
+            @Override
+            public KeyPairProvider getKeyPairProvider() {
+                return null;
+            }
+
+            @Override
+            public void setKeyPairProvider(KeyPairProvider keyPairProvider) {
+                throw new UnsupportedOperationException("setKeyPairProvider(" 
+ keyPairProvider + ")");
+            }
         };
         assertEquals("Mismatched initial factories list", "", 
manager.getUserAuthFactoriesNameList());
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e849cc5a/sshd-core/src/test/java/org/apache/sshd/util/test/CoreTestSupportUtils.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/util/test/CoreTestSupportUtils.java 
b/sshd-core/src/test/java/org/apache/sshd/util/test/CoreTestSupportUtils.java
index e6bb6cb..7d2b9b9 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/util/test/CoreTestSupportUtils.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/util/test/CoreTestSupportUtils.java
@@ -25,7 +25,7 @@ import java.net.ServerSocket;
 import org.apache.sshd.client.SshClient;
 import org.apache.sshd.client.config.hosts.HostConfigEntryResolver;
 import org.apache.sshd.client.keyverifier.AcceptAllServerKeyVerifier;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
+import org.apache.sshd.common.keyprovider.KeyIdentityProvider;
 import org.apache.sshd.server.SshServer;
 import org.apache.sshd.server.auth.pubkey.AcceptAllPublickeyAuthenticator;
 import org.apache.sshd.server.shell.UnknownCommandFactory;
@@ -47,7 +47,7 @@ public final class CoreTestSupportUtils {
         SshClient client = SshClient.setUpDefaultClient();
         client.setServerKeyVerifier(AcceptAllServerKeyVerifier.INSTANCE);
         client.setHostConfigEntryResolver(HostConfigEntryResolver.EMPTY);
-        client.setKeyPairProvider(KeyPairProvider.EMPTY_KEYPAIR_PROVIDER);
+        client.setKeyIdentityProvider(KeyIdentityProvider.EMPTY_KEYS_PROVIDER);
         return client;
     }
 

Reply via email to