You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by lg...@apache.org on 2019/08/07 11:20:01 UTC
[mina-sshd] 02/03: [SSHD-937] Provide session instance to
UserAuthFactory creator method
This is an automated email from the ASF dual-hosted git repository.
lgoldstein pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mina-sshd.git
commit c6366e38302f4fe74c51dff605356e860f4ca80e
Author: Lyor Goldstein <lg...@apache.org>
AuthorDate: Tue Aug 6 19:51:44 2019 +0300
[SSHD-937] Provide session instance to UserAuthFactory creator method
---
CHANGES.md | 7 ++--
.../java/org/apache/sshd/common/NamedResource.java | 9 +++--
.../apache/sshd/common/auth/UserAuthInstance.java | 6 ++--
.../common/config/FactoriesListParseResult.java | 3 +-
.../config/NamedFactoriesListParseResult.java | 2 +-
.../sshd/client/ClientAuthenticationManager.java | 24 +++++++------
.../java/org/apache/sshd/client/SshClient.java | 15 ++++----
.../sshd/client/auth/AbstractUserAuthFactory.java | 5 ++-
.../apache/sshd/client/auth/UserAuthFactory.java | 3 +-
.../auth/hostbased/UserAuthHostBasedFactory.java | 4 ++-
.../UserAuthKeyboardInteractiveFactory.java | 5 ++-
.../auth/password/UserAuthPasswordFactory.java | 5 ++-
.../auth/pubkey/UserAuthPublicKeyFactory.java | 4 ++-
.../sshd/client/session/AbstractClientSession.java | 11 +++---
.../sshd/client/session/ClientUserAuthService.java | 11 +++---
.../common/auth/AbstractUserAuthMethodFactory.java | 6 +++-
.../sshd/common/auth/UserAuthMethodFactory.java | 41 +++++++++++++++++++---
.../sshd/common/kex/AbstractKexFactoryManager.java | 13 ++++---
.../sshd/server/ServerAuthenticationManager.java | 18 +++++-----
.../java/org/apache/sshd/server/SshServer.java | 11 +++---
.../sshd/server/auth/AbstractUserAuthFactory.java | 5 ++-
.../apache/sshd/server/auth/UserAuthFactory.java | 3 +-
.../sshd/server/auth/UserAuthNoneFactory.java | 6 +++-
.../sshd/server/auth/gss/UserAuthGSSFactory.java | 5 ++-
.../auth/hostbased/UserAuthHostBasedFactory.java | 4 ++-
.../UserAuthKeyboardInteractiveFactory.java | 5 ++-
.../auth/password/UserAuthPasswordFactory.java | 5 ++-
.../auth/pubkey/UserAuthPublicKeyFactory.java | 4 ++-
.../sshd/server/session/AbstractServerSession.java | 11 +++---
.../sshd/server/session/ServerUserAuthService.java | 17 ++++-----
.../client/ClientAuthenticationManagerTest.java | 14 ++++----
.../java/org/apache/sshd/client/ClientTest.java | 2 +-
.../sshd/common/auth/AuthenticationTest.java | 6 ++--
.../server/ServerAuthenticationManagerTest.java | 14 ++++----
34 files changed, 191 insertions(+), 113 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index 68722a2..57d62a7 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -18,10 +18,13 @@ session is initiated and protect their instance from shutdown when session is de
server.setSubsystemFactories(Collections.singletonList(factory));
```
-* `SubsystemFactory` is a proper interface and it has been refactored to contain a
+* `SubsystemFactory` is a proper interface and it has been refactored to contain a
`createSubsystem` method that accepts the `ChannelSession` through which the request
has been made
+* `UserAuthFactory` is a proper interface and it has been refactored to contain a
+`createUserAuth` method that accepts the session instance through which the request is made.
+
## Minor code helpers
* `SessionListener` supports `sessionPeerIdentificationReceived` that is invoked once successful
@@ -36,4 +39,4 @@ for the server's identification before sending its own.
* [SSHD-934](https://issues.apache.org/jira/browse/SSHD-934) - Fixed ECDSA public key encoding into OpenSSH format.
-* [SSHD-937](https://issues.apache.org/jira/browse/SSHD-937) - Provide ChannelSession instance when creating a subsystem instance.
\ No newline at end of file
+* [SSHD-937](https://issues.apache.org/jira/browse/SSHD-937) - Provide session instance when creating a subsystem or user authentication.
\ No newline at end of file
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/NamedResource.java b/sshd-common/src/main/java/org/apache/sshd/common/NamedResource.java
index 048d23f..c2299f1 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/NamedResource.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/NamedResource.java
@@ -41,7 +41,8 @@ public interface NamedResource {
* Compares 2 {@link NamedResource}s according to their {@link #getName()}
* value case <U>insensitive</U>
*/
- Comparator<NamedResource> BY_NAME_COMPARATOR = Comparator.comparing(NAME_EXTRACTOR, String.CASE_INSENSITIVE_ORDER);
+ Comparator<NamedResource> BY_NAME_COMPARATOR =
+ Comparator.comparing(NAME_EXTRACTOR, String.CASE_INSENSITIVE_ORDER);
/**
* @return The resource name
@@ -76,7 +77,8 @@ public interface NamedResource {
* @param resources The {@link NamedResource} to check - ignored if {@code null}/empty
* @return the removed resource from the list or {@code null} if not in the list
*/
- static <R extends NamedResource> R removeByName(String name, Comparator<? super String> c, Collection<? extends R> resources) {
+ static <R extends NamedResource> R removeByName(
+ String name, Comparator<? super String> c, Collection<? extends R> resources) {
R r = findByName(name, c, resources);
if (r != null) {
resources.remove(r);
@@ -93,7 +95,8 @@ public interface NamedResource {
* @return The <U>first</U> resource whose name matches the parameter (by invoking
* {@link Comparator#compare(Object, Object)} - {@code null} if no match found
*/
- static <R extends NamedResource> R findByName(String name, Comparator<? super String> c, Collection<? extends R> resources) {
+ static <R extends NamedResource> R findByName(
+ String name, Comparator<? super String> c, Collection<? extends R> resources) {
return GenericUtils.isEmpty(name)
? null
: GenericUtils.stream(resources)
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java b/sshd-common/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java
similarity index 89%
rename from sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java
rename to sshd-common/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java
index f7448e6..7e326ee 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java
@@ -20,7 +20,7 @@
package org.apache.sshd.common.auth;
import org.apache.sshd.common.NamedResource;
-import org.apache.sshd.common.session.Session;
+import org.apache.sshd.common.session.SessionContext;
/**
* Represents an authentication-in-progress tracker for a specific session
@@ -28,8 +28,7 @@ import org.apache.sshd.common.session.Session;
* @param <S> The type of session being tracked by the instance
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-//CHECKSTYLE:OFF
-public interface UserAuthInstance<S extends Session> extends NamedResource {
+public interface UserAuthInstance<S extends SessionContext> extends NamedResource {
/**
* @return The current session for which the authentication is being
* tracked. <B>Note:</B> may be {@code null} if the instance has not
@@ -37,4 +36,3 @@ public interface UserAuthInstance<S extends Session> extends NamedResource {
*/
S getSession();
}
-//CHECKSTYLE:ON
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/config/FactoriesListParseResult.java b/sshd-common/src/main/java/org/apache/sshd/common/config/FactoriesListParseResult.java
index 7a1cee1..ea529c1 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/config/FactoriesListParseResult.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/config/FactoriesListParseResult.java
@@ -22,13 +22,14 @@ package org.apache.sshd.common.config;
import java.util.List;
import org.apache.sshd.common.Factory;
+import org.apache.sshd.common.NamedResource;
/**
* @param <T> Result type
* @param <F> Factory type
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-public abstract class FactoriesListParseResult<T, F extends Factory<T>> extends ListParseResult<F> {
+public abstract class FactoriesListParseResult<T, F extends NamedResource> extends ListParseResult<F> {
protected FactoriesListParseResult(List<F> parsed, List<String> unsupported) {
super(parsed, unsupported);
}
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/config/NamedFactoriesListParseResult.java b/sshd-common/src/main/java/org/apache/sshd/common/config/NamedFactoriesListParseResult.java
index 246cae0..0ca8072 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/config/NamedFactoriesListParseResult.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/config/NamedFactoriesListParseResult.java
@@ -32,7 +32,7 @@ import org.apache.sshd.common.util.GenericUtils;
* @param <F> Factory type
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-public abstract class NamedFactoriesListParseResult<T, F extends NamedFactory<T>>
+public abstract class NamedFactoriesListParseResult<T, F extends NamedResource>
extends FactoriesListParseResult<T, F> {
protected NamedFactoriesListParseResult(List<F> parsed, List<String> unsupported) {
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 4b84752..b1fedc0 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
@@ -27,11 +27,10 @@ import java.util.List;
import org.apache.sshd.client.auth.AuthenticationIdentitiesProvider;
import org.apache.sshd.client.auth.BuiltinUserAuthFactories;
-import org.apache.sshd.client.auth.UserAuth;
+import org.apache.sshd.client.auth.UserAuthFactory;
import org.apache.sshd.client.auth.keyboard.UserInteraction;
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.KeyIdentityProviderHolder;
import org.apache.sshd.common.util.GenericUtils;
@@ -130,10 +129,10 @@ public interface ClientAuthenticationManager extends KeyIdentityProviderHolder {
void setUserInteraction(UserInteraction userInteraction);
/**
- * @return a {@link List} of {@link UserAuth} {@link NamedFactory}-ies - never
+ * @return a {@link List} of {@link UserAuthFactory}-ies - never
* {@code null}/empty
*/
- List<NamedFactory<UserAuth>> getUserAuthFactories();
+ List<UserAuthFactory> getUserAuthFactories();
default String getUserAuthFactoriesNameList() {
return NamedResource.getNames(getUserAuthFactories());
@@ -143,23 +142,26 @@ public interface ClientAuthenticationManager extends KeyIdentityProviderHolder {
return NamedResource.getNameList(getUserAuthFactories());
}
- void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories);
+ void setUserAuthFactories(List<UserAuthFactory> userAuthFactories);
default void setUserAuthFactoriesNameList(String names) {
setUserAuthFactoriesNames(GenericUtils.split(names, ','));
}
default void setUserAuthFactoriesNames(String... names) {
- setUserAuthFactoriesNames(GenericUtils.isEmpty((Object[]) names) ? Collections.emptyList() : Arrays.asList(names));
+ setUserAuthFactoriesNames(
+ GenericUtils.isEmpty((Object[]) names) ? Collections.emptyList() : Arrays.asList(names));
}
default void setUserAuthFactoriesNames(Collection<String> names) {
- BuiltinUserAuthFactories.ParseResult result = BuiltinUserAuthFactories.parseFactoriesList(names);
- @SuppressWarnings({ "rawtypes", "unchecked" })
- List<NamedFactory<UserAuth>> factories =
- (List) ValidateUtils.checkNotNullAndNotEmpty(result.getParsedFactories(), "No supported cipher factories: %s", names);
+ BuiltinUserAuthFactories.ParseResult result =
+ BuiltinUserAuthFactories.parseFactoriesList(names);
+ List<UserAuthFactory> factories =
+ ValidateUtils.checkNotNullAndNotEmpty(
+ result.getParsedFactories(), "No supported cipher factories: %s", names);
Collection<String> unsupported = result.getUnsupportedFactories();
- ValidateUtils.checkTrue(GenericUtils.isEmpty(unsupported), "Unsupported cipher factories found: %s", unsupported);
+ ValidateUtils.checkTrue(
+ GenericUtils.isEmpty(unsupported), "Unsupported cipher factories found: %s", unsupported);
setUserAuthFactories(factories);
}
}
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 4515b32..300ec3f 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
@@ -40,7 +40,7 @@ import java.util.stream.Collectors;
import org.apache.sshd.agent.SshAgentFactory;
import org.apache.sshd.client.auth.AuthenticationIdentitiesProvider;
-import org.apache.sshd.client.auth.UserAuth;
+import org.apache.sshd.client.auth.UserAuthFactory;
import org.apache.sshd.client.auth.keyboard.UserAuthKeyboardInteractiveFactory;
import org.apache.sshd.client.auth.keyboard.UserInteraction;
import org.apache.sshd.client.auth.password.PasswordIdentityProvider;
@@ -155,9 +155,9 @@ public class SshClient extends AbstractFactoryManager implements ClientFactoryMa
* Default user authentication preferences if not set
* @see <A HREF="http://linux.die.net/man/5/ssh_config">ssh_config(5) - PreferredAuthentications</A>
*/
- public static final List<NamedFactory<UserAuth>> DEFAULT_USER_AUTH_FACTORIES =
+ public static final List<UserAuthFactory> DEFAULT_USER_AUTH_FACTORIES =
Collections.unmodifiableList(
- Arrays.<NamedFactory<UserAuth>>asList(
+ Arrays.asList(
UserAuthPublicKeyFactory.INSTANCE,
UserAuthKeyboardInteractiveFactory.INSTANCE,
UserAuthPasswordFactory.INSTANCE
@@ -172,7 +172,7 @@ public class SshClient extends AbstractFactoryManager implements ClientFactoryMa
protected IoConnector connector;
protected SessionFactory sessionFactory;
protected UserInteraction userInteraction;
- protected List<NamedFactory<UserAuth>> userAuthFactories;
+ protected List<UserAuthFactory> userAuthFactories;
private ClientProxyConnector proxyConnector;
private ServerKeyVerifier serverKeyVerifier;
@@ -259,13 +259,14 @@ public class SshClient extends AbstractFactoryManager implements ClientFactoryMa
}
@Override
- public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+ public List<UserAuthFactory> getUserAuthFactories() {
return userAuthFactories;
}
@Override
- public void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories) {
- this.userAuthFactories = ValidateUtils.checkNotNullAndNotEmpty(userAuthFactories, "No user auth factories");
+ public void setUserAuthFactories(List<UserAuthFactory> userAuthFactories) {
+ this.userAuthFactories =
+ ValidateUtils.checkNotNullAndNotEmpty(userAuthFactories, "No user auth factories");
}
@Override
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuthFactory.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuthFactory.java
index 3c8f74d..e609ccd 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuthFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuthFactory.java
@@ -19,12 +19,15 @@
package org.apache.sshd.client.auth;
+import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.common.auth.AbstractUserAuthMethodFactory;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-public abstract class AbstractUserAuthFactory extends AbstractUserAuthMethodFactory<UserAuth> implements UserAuthFactory {
+public abstract class AbstractUserAuthFactory
+ extends AbstractUserAuthMethodFactory<ClientSession, UserAuth>
+ implements UserAuthFactory {
protected AbstractUserAuthFactory(String name) {
super(name);
}
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/UserAuthFactory.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/UserAuthFactory.java
index af77bb5..31426b1 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/auth/UserAuthFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/UserAuthFactory.java
@@ -18,13 +18,14 @@
*/
package org.apache.sshd.client.auth;
+import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.common.auth.UserAuthMethodFactory;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
// CHECKSTYLE:OFF
-public interface UserAuthFactory extends UserAuthMethodFactory<UserAuth> {
+public interface UserAuthFactory extends UserAuthMethodFactory<ClientSession, UserAuth> {
// nothing extra
}
//CHECKSTYLE:ON
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/hostbased/UserAuthHostBasedFactory.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/hostbased/UserAuthHostBasedFactory.java
index 1329d5a..de00c8c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/auth/hostbased/UserAuthHostBasedFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/hostbased/UserAuthHostBasedFactory.java
@@ -19,9 +19,11 @@
package org.apache.sshd.client.auth.hostbased;
+import java.io.IOException;
import java.util.List;
import org.apache.sshd.client.auth.AbstractUserAuthFactory;
+import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.signature.Signature;
import org.apache.sshd.common.signature.SignatureFactoriesManager;
@@ -126,7 +128,7 @@ public class UserAuthHostBasedFactory extends AbstractUserAuthFactory implements
}
@Override
- public UserAuthHostBased create() {
+ public UserAuthHostBased createUserAuth(ClientSession session) throws IOException {
UserAuthHostBased auth = new UserAuthHostBased(getClientHostKeys());
auth.setClientHostname(getClientHostname());
auth.setClientUsername(getClientUsername());
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractiveFactory.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
index 86bf005..eea5c65 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
@@ -18,7 +18,10 @@
*/
package org.apache.sshd.client.auth.keyboard;
+import java.io.IOException;
+
import org.apache.sshd.client.auth.AbstractUserAuthFactory;
+import org.apache.sshd.client.session.ClientSession;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
@@ -32,7 +35,7 @@ public class UserAuthKeyboardInteractiveFactory extends AbstractUserAuthFactory
}
@Override
- public UserAuthKeyboardInteractive create() {
+ public UserAuthKeyboardInteractive createUserAuth(ClientSession session) throws IOException {
return new UserAuthKeyboardInteractive();
}
}
\ No newline at end of file
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPasswordFactory.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPasswordFactory.java
index b52206c..ffc9b49 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPasswordFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPasswordFactory.java
@@ -18,7 +18,10 @@
*/
package org.apache.sshd.client.auth.password;
+import java.io.IOException;
+
import org.apache.sshd.client.auth.AbstractUserAuthFactory;
+import org.apache.sshd.client.session.ClientSession;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
@@ -32,7 +35,7 @@ public class UserAuthPasswordFactory extends AbstractUserAuthFactory {
}
@Override
- public UserAuthPassword create() {
+ public UserAuthPassword createUserAuth(ClientSession session) throws IOException {
return new UserAuthPassword();
}
}
\ No newline at end of file
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyFactory.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyFactory.java
index 176df0a..de74667 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyFactory.java
@@ -18,9 +18,11 @@
*/
package org.apache.sshd.client.auth.pubkey;
+import java.io.IOException;
import java.util.List;
import org.apache.sshd.client.auth.AbstractUserAuthFactory;
+import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.signature.Signature;
import org.apache.sshd.common.signature.SignatureFactoriesManager;
@@ -67,7 +69,7 @@ public class UserAuthPublicKeyFactory extends AbstractUserAuthFactory implements
}
@Override
- public UserAuthPublicKey create() {
+ public UserAuthPublicKey createUserAuth(ClientSession session) throws IOException {
return new UserAuthPublicKey(getSignatureFactories());
}
}
\ No newline at end of file
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 1d865aa..91bac20 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
@@ -31,7 +31,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.sshd.client.ClientFactoryManager;
import org.apache.sshd.client.auth.AuthenticationIdentitiesProvider;
-import org.apache.sshd.client.auth.UserAuth;
+import org.apache.sshd.client.auth.UserAuthFactory;
import org.apache.sshd.client.auth.keyboard.UserInteraction;
import org.apache.sshd.client.auth.password.PasswordIdentityProvider;
import org.apache.sshd.client.channel.ChannelDirectTcpip;
@@ -42,7 +42,6 @@ import org.apache.sshd.client.channel.ClientChannel;
import org.apache.sshd.client.keyverifier.ServerKeyVerifier;
import org.apache.sshd.common.AttributeRepository;
import org.apache.sshd.common.FactoryManager;
-import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.NamedResource;
import org.apache.sshd.common.PropertyResolverUtils;
import org.apache.sshd.common.RuntimeSshException;
@@ -89,7 +88,7 @@ public abstract class AbstractClientSession extends AbstractSession implements C
private UserInteraction userInteraction;
private PasswordIdentityProvider passwordIdentityProvider;
private KeyIdentityProvider keyIdentityProvider;
- private List<NamedFactory<UserAuth>> userAuthFactories;
+ private List<UserAuthFactory> userAuthFactories;
private SocketAddress connectAddress;
private ClientProxyConnector proxyConnector;
@@ -145,13 +144,13 @@ public abstract class AbstractClientSession extends AbstractSession implements C
}
@Override
- public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+ public List<UserAuthFactory> getUserAuthFactories() {
ClientFactoryManager manager = getFactoryManager();
- return resolveEffectiveFactories(UserAuth.class, userAuthFactories, manager.getUserAuthFactories());
+ return resolveEffectiveFactories(userAuthFactories, manager.getUserAuthFactories());
}
@Override
- public void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories) {
+ public void setUserAuthFactories(List<UserAuthFactory> userAuthFactories) {
this.userAuthFactories = userAuthFactories; // OK if null/empty - inherit from parent
}
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java
index a8cb5e9..cccbc87 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java
@@ -30,15 +30,16 @@ import java.util.concurrent.atomic.AtomicReference;
import org.apache.sshd.client.ClientAuthenticationManager;
import org.apache.sshd.client.auth.UserAuth;
+import org.apache.sshd.client.auth.UserAuthFactory;
import org.apache.sshd.client.auth.keyboard.UserInteraction;
import org.apache.sshd.client.future.AuthFuture;
import org.apache.sshd.client.future.DefaultAuthFuture;
-import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.NamedResource;
import org.apache.sshd.common.RuntimeSshException;
import org.apache.sshd.common.Service;
import org.apache.sshd.common.SshConstants;
import org.apache.sshd.common.SshException;
+import org.apache.sshd.common.auth.UserAuthMethodFactory;
import org.apache.sshd.common.session.Session;
import org.apache.sshd.common.session.SessionHolder;
import org.apache.sshd.common.util.GenericUtils;
@@ -64,7 +65,7 @@ public class ClientUserAuthService
private final ClientSessionImpl clientSession;
private final List<String> clientMethods;
- private final List<NamedFactory<UserAuth>> authFactories;
+ private final List<UserAuthFactory> authFactories;
private String service;
private List<String> serverMethods;
@@ -81,7 +82,7 @@ public class ClientUserAuthService
String prefs = s.getString(ClientAuthenticationManager.PREFERRED_AUTHS);
boolean debugEnabled = log.isDebugEnabled();
if (GenericUtils.isEmpty(prefs)) {
- for (NamedFactory<UserAuth> factory : authFactories) {
+ for (UserAuthFactory factory : authFactories) {
clientMethods.add(factory.getName());
}
} else {
@@ -90,7 +91,7 @@ public class ClientUserAuthService
}
for (String pref : GenericUtils.split(prefs, ',')) {
- NamedFactory<UserAuth> factory =
+ UserAuthFactory factory =
NamedResource.findByName(pref, String.CASE_INSENSITIVE_ORDER, authFactories);
if (factory != null) {
clientMethods.add(pref);
@@ -333,7 +334,7 @@ public class ClientUserAuthService
return;
}
- userAuth = NamedFactory.create(authFactories, method);
+ userAuth = UserAuthMethodFactory.createUserAuth(session, authFactories, method);
if (userAuth == null) {
throw new UnsupportedOperationException("Failed to find a user-auth factory for method=" + method);
}
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/auth/AbstractUserAuthMethodFactory.java b/sshd-core/src/main/java/org/apache/sshd/common/auth/AbstractUserAuthMethodFactory.java
index 73e8015..62d7191 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/auth/AbstractUserAuthMethodFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/auth/AbstractUserAuthMethodFactory.java
@@ -19,14 +19,18 @@
package org.apache.sshd.common.auth;
+import org.apache.sshd.common.session.SessionContext;
import org.apache.sshd.common.util.ValidateUtils;
import org.apache.sshd.common.util.logging.AbstractLoggingBean;
/**
+ * @param <S> The type of {@link SessionContext} being provided
* @param <M> Type of user authentication method
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-public abstract class AbstractUserAuthMethodFactory<M> extends AbstractLoggingBean implements UserAuthMethodFactory<M> {
+public abstract class AbstractUserAuthMethodFactory<S extends SessionContext, M extends UserAuthInstance<S>>
+ extends AbstractLoggingBean
+ implements UserAuthMethodFactory<S, M> {
private final String name;
protected AbstractUserAuthMethodFactory(String name) {
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthMethodFactory.java b/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthMethodFactory.java
index 9b632e7..4004120 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthMethodFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthMethodFactory.java
@@ -19,16 +19,21 @@
package org.apache.sshd.common.auth;
-import org.apache.sshd.common.NamedFactory;
+import java.io.IOException;
+import java.util.Collection;
+
+import org.apache.sshd.common.NamedResource;
+import org.apache.sshd.common.session.SessionContext;
/**
* Represents a user authentication method
*
+ * @param <S> The type of {@link SessionContext} being provided
+ * to the instance creator
* @param <M> The authentication method factory type
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-// CHECKSTYLE:OFF
-public interface UserAuthMethodFactory<M> extends NamedFactory<M> {
+public interface UserAuthMethodFactory<S extends SessionContext, M extends UserAuthInstance<S>> extends NamedResource {
/**
* Password authentication method name
*/
@@ -48,5 +53,33 @@ public interface UserAuthMethodFactory<M> extends NamedFactory<M> {
* Host-based authentication method
*/
String HOST_BASED = "hostbased";
+
+ /**
+ * @param session The session for which authentication is required
+ * @return The authenticator instance
+ * @throws IOException If failed to create the instance
+ */
+ M createUserAuth(S session) throws IOException;
+
+ /**
+ * @param <S> The type of {@link SessionContext} being provided
+ * to the instance creator
+ * @param <M> The authentication method factory type
+ * @param session The session through which the request is being made
+ * @param factories The available factories
+ * @param name The requested factory name
+ * @return The created authenticator instance - {@code null} if no matching factory
+ * @throws IOException If failed to create the instance
+ */
+ static <S extends SessionContext, M extends UserAuthInstance<S>> M createUserAuth(
+ S session, Collection<? extends UserAuthMethodFactory<S, M>> factories, String name)
+ throws IOException {
+ UserAuthMethodFactory<S, M> f =
+ NamedResource.findByName(name, String.CASE_INSENSITIVE_ORDER, factories);
+ if (f != null) {
+ return f.createUserAuth(session);
+ } else {
+ return null;
+ }
+ }
}
-//CHECKSTYLE:ON
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 da4ed0e..8f1d159 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
@@ -60,7 +60,7 @@ public abstract class AbstractKexFactoryManager
@Override
public List<NamedFactory<KeyExchange>> getKeyExchangeFactories() {
KexFactoryManager parent = getDelegate();
- return resolveEffectiveFactories(KeyExchange.class, keyExchangeFactories,
+ return resolveEffectiveFactories(keyExchangeFactories,
(parent == null) ? Collections.emptyList() : parent.getKeyExchangeFactories());
}
@@ -72,7 +72,7 @@ public abstract class AbstractKexFactoryManager
@Override
public List<NamedFactory<Cipher>> getCipherFactories() {
KexFactoryManager parent = getDelegate();
- return resolveEffectiveFactories(Cipher.class, cipherFactories,
+ return resolveEffectiveFactories(cipherFactories,
(parent == null) ? Collections.emptyList() : parent.getCipherFactories());
}
@@ -84,7 +84,7 @@ public abstract class AbstractKexFactoryManager
@Override
public List<NamedFactory<Compression>> getCompressionFactories() {
KexFactoryManager parent = getDelegate();
- return resolveEffectiveFactories(Compression.class, compressionFactories,
+ return resolveEffectiveFactories(compressionFactories,
(parent == null) ? Collections.emptyList() : parent.getCompressionFactories());
}
@@ -96,7 +96,7 @@ public abstract class AbstractKexFactoryManager
@Override
public List<NamedFactory<Mac>> getMacFactories() {
KexFactoryManager parent = getDelegate();
- return resolveEffectiveFactories(Mac.class, macFactories,
+ return resolveEffectiveFactories(macFactories,
(parent == null) ? Collections.emptyList() : parent.getMacFactories());
}
@@ -108,7 +108,7 @@ public abstract class AbstractKexFactoryManager
@Override
public List<NamedFactory<Signature>> getSignatureFactories() {
KexFactoryManager parent = getDelegate();
- return resolveEffectiveFactories(Signature.class, signatureFactories,
+ return resolveEffectiveFactories(signatureFactories,
(parent == null) ? Collections.emptyList() : parent.getSignatureFactories());
}
@@ -129,8 +129,7 @@ public abstract class AbstractKexFactoryManager
this.kexExtensionHandler = kexExtensionHandler;
}
- protected <V> List<NamedFactory<V>> resolveEffectiveFactories(
- Class<V> factoryType, List<NamedFactory<V>> local, List<NamedFactory<V>> inherited) {
+ protected <V> List<V> resolveEffectiveFactories(List<V> local, List<V> inherited) {
if (GenericUtils.isEmpty(local)) {
return inherited;
} else {
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 c9a1b51..ad4406e 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
@@ -32,6 +32,7 @@ import org.apache.sshd.common.util.GenericUtils;
import org.apache.sshd.common.util.ValidateUtils;
import org.apache.sshd.server.auth.BuiltinUserAuthFactories;
import org.apache.sshd.server.auth.UserAuth;
+import org.apache.sshd.server.auth.UserAuthFactory;
import org.apache.sshd.server.auth.WelcomeBannerPhase;
import org.apache.sshd.server.auth.gss.GSSAuthenticator;
import org.apache.sshd.server.auth.gss.UserAuthGSSFactory;
@@ -157,7 +158,7 @@ public interface ServerAuthenticationManager extends KeyPairProviderHolder {
*
* @return a list of named <code>UserAuth</code> factories, never {@code null}/empty
*/
- List<NamedFactory<UserAuth>> getUserAuthFactories();
+ List<UserAuthFactory> getUserAuthFactories();
default String getUserAuthFactoriesNameList() {
return NamedResource.getNames(getUserAuthFactories());
@@ -167,7 +168,7 @@ public interface ServerAuthenticationManager extends KeyPairProviderHolder {
return NamedResource.getNameList(getUserAuthFactories());
}
- void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories);
+ void setUserAuthFactories(List<UserAuthFactory> userAuthFactories);
default void setUserAuthFactoriesNameList(String names) {
setUserAuthFactoriesNames(GenericUtils.split(names, ','));
@@ -179,9 +180,8 @@ public interface ServerAuthenticationManager extends KeyPairProviderHolder {
default void setUserAuthFactoriesNames(Collection<String> names) {
BuiltinUserAuthFactories.ParseResult result = BuiltinUserAuthFactories.parseFactoriesList(names);
- @SuppressWarnings({ "rawtypes", "unchecked" })
- List<NamedFactory<UserAuth>> factories =
- (List) ValidateUtils.checkNotNullAndNotEmpty(result.getParsedFactories(), "No supported cipher factories: %s", names);
+ List<UserAuthFactory> factories =
+ ValidateUtils.checkNotNullAndNotEmpty(result.getParsedFactories(), "No supported cipher factories: %s", names);
Collection<String> unsupported = result.getUnsupportedFactories();
ValidateUtils.checkTrue(GenericUtils.isEmpty(unsupported), "Unsupported cipher factories found: %s", unsupported);
setUserAuthFactories(factories);
@@ -255,7 +255,7 @@ public interface ServerAuthenticationManager extends KeyPairProviderHolder {
* @return The resolved {@link List} of {@link NamedFactory} for the {@link UserAuth}s
* @see #resolveUserAuthFactories(ServerAuthenticationManager, List)
*/
- static List<NamedFactory<UserAuth>> resolveUserAuthFactories(ServerAuthenticationManager manager) {
+ static List<UserAuthFactory> resolveUserAuthFactories(ServerAuthenticationManager manager) {
if (manager == null) {
return Collections.emptyList();
} else {
@@ -273,8 +273,8 @@ public interface ServerAuthenticationManager extends KeyPairProviderHolder {
* {@code null}/empty then they are used as-is.
* @return The resolved {@link List} of {@link NamedFactory} for the {@link UserAuth}s
*/
- static List<NamedFactory<UserAuth>> resolveUserAuthFactories(
- ServerAuthenticationManager manager, List<NamedFactory<UserAuth>> userFactories) {
+ static List<UserAuthFactory> resolveUserAuthFactories(
+ ServerAuthenticationManager manager, List<UserAuthFactory> userFactories) {
if (GenericUtils.size(userFactories) > 0) {
return userFactories; // use whatever the user decided
}
@@ -283,7 +283,7 @@ public interface ServerAuthenticationManager extends KeyPairProviderHolder {
return Collections.emptyList();
}
- List<NamedFactory<UserAuth>> factories = new ArrayList<>();
+ List<UserAuthFactory> factories = new ArrayList<>();
if (manager.getPasswordAuthenticator() != null) {
factories.add(DEFAULT_USER_AUTH_PASSWORD_FACTORY);
factories.add(DEFAULT_USER_AUTH_KB_INTERACTIVE_FACTORY);
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 b617cae..7096d9f 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
@@ -33,7 +33,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.sshd.common.Closeable;
import org.apache.sshd.common.Factory;
-import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.PropertyResolverUtils;
import org.apache.sshd.common.ServiceFactory;
import org.apache.sshd.common.helpers.AbstractFactoryManager;
@@ -44,7 +43,7 @@ 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;
-import org.apache.sshd.server.auth.UserAuth;
+import org.apache.sshd.server.auth.UserAuthFactory;
import org.apache.sshd.server.auth.gss.GSSAuthenticator;
import org.apache.sshd.server.auth.hostbased.HostBasedAuthenticator;
import org.apache.sshd.server.auth.keyboard.KeyboardInteractiveAuthenticator;
@@ -104,7 +103,7 @@ public class SshServer extends AbstractFactoryManager implements ServerFactoryMa
private SessionFactory sessionFactory;
private CommandFactory commandFactory;
private List<SubsystemFactory> subsystemFactories;
- private List<NamedFactory<UserAuth>> userAuthFactories;
+ private List<UserAuthFactory> userAuthFactories;
private KeyPairProvider keyPairProvider;
private PasswordAuthenticator passwordAuthenticator;
private PublickeyAuthenticator publickeyAuthenticator;
@@ -147,12 +146,12 @@ public class SshServer extends AbstractFactoryManager implements ServerFactoryMa
}
@Override
- public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+ public List<UserAuthFactory> getUserAuthFactories() {
return userAuthFactories;
}
@Override
- public void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories) {
+ public void setUserAuthFactories(List<UserAuthFactory> userAuthFactories) {
this.userAuthFactories = userAuthFactories;
}
@@ -267,7 +266,7 @@ public class SshServer extends AbstractFactoryManager implements ServerFactoryMa
ValidateUtils.checkTrue(getPort() >= 0 /* zero means not set yet */, "Bad port number: %d", Integer.valueOf(getPort()));
- List<NamedFactory<UserAuth>> authFactories = ServerAuthenticationManager.resolveUserAuthFactories(this);
+ List<UserAuthFactory> authFactories = ServerAuthenticationManager.resolveUserAuthFactories(this);
setUserAuthFactories(ValidateUtils.checkNotNullAndNotEmpty(authFactories, "UserAuthFactories not set"));
ValidateUtils.checkNotNullAndNotEmpty(getChannelFactories(), "ChannelFactories not set");
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/AbstractUserAuthFactory.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/AbstractUserAuthFactory.java
index af83768..a5968eb 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/AbstractUserAuthFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/AbstractUserAuthFactory.java
@@ -20,11 +20,14 @@
package org.apache.sshd.server.auth;
import org.apache.sshd.common.auth.AbstractUserAuthMethodFactory;
+import org.apache.sshd.server.session.ServerSession;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-public abstract class AbstractUserAuthFactory extends AbstractUserAuthMethodFactory<UserAuth> implements UserAuthFactory {
+public abstract class AbstractUserAuthFactory
+ extends AbstractUserAuthMethodFactory<ServerSession, UserAuth>
+ implements UserAuthFactory {
protected AbstractUserAuthFactory(String name) {
super(name);
}
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthFactory.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthFactory.java
index 49d45dc..fd73f0e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthFactory.java
@@ -20,12 +20,13 @@
package org.apache.sshd.server.auth;
import org.apache.sshd.common.auth.UserAuthMethodFactory;
+import org.apache.sshd.server.session.ServerSession;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
// CHECKSTYLE:OFF
-public interface UserAuthFactory extends UserAuthMethodFactory<UserAuth> {
+public interface UserAuthFactory extends UserAuthMethodFactory<ServerSession, UserAuth> {
// nothing extra
}
//CHECKSTYLE:ON
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthNoneFactory.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthNoneFactory.java
index e42db13..75a0639 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthNoneFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthNoneFactory.java
@@ -18,6 +18,10 @@
*/
package org.apache.sshd.server.auth;
+import java.io.IOException;
+
+import org.apache.sshd.server.session.ServerSession;
+
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
@@ -30,7 +34,7 @@ public class UserAuthNoneFactory extends AbstractUserAuthFactory {
}
@Override
- public UserAuthNone create() {
+ public UserAuthNone createUserAuth(ServerSession session) throws IOException {
return new UserAuthNone();
}
}
\ No newline at end of file
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSSFactory.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSSFactory.java
index 2e61411..56b77f9 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSSFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSSFactory.java
@@ -18,8 +18,11 @@
*/
package org.apache.sshd.server.auth.gss;
+import java.io.IOException;
+
import org.apache.sshd.server.auth.UserAuth;
import org.apache.sshd.server.auth.UserAuthFactory;
+import org.apache.sshd.server.session.ServerSession;
/**
* Factory class.
@@ -38,7 +41,7 @@ public class UserAuthGSSFactory implements UserAuthFactory {
}
@Override
- public UserAuth create() {
+ public UserAuth createUserAuth(ServerSession session) throws IOException {
return new UserAuthGSS();
}
}
\ No newline at end of file
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBasedFactory.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBasedFactory.java
index 9eaec57..56d6488 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBasedFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBasedFactory.java
@@ -19,6 +19,7 @@
package org.apache.sshd.server.auth.hostbased;
+import java.io.IOException;
import java.util.List;
import org.apache.sshd.common.NamedFactory;
@@ -26,6 +27,7 @@ import org.apache.sshd.common.signature.Signature;
import org.apache.sshd.common.signature.SignatureFactoriesManager;
import org.apache.sshd.common.util.GenericUtils;
import org.apache.sshd.server.auth.AbstractUserAuthFactory;
+import org.apache.sshd.server.session.ServerSession;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
@@ -68,7 +70,7 @@ public class UserAuthHostBasedFactory extends AbstractUserAuthFactory implements
}
@Override
- public UserAuthHostBased create() {
+ public UserAuthHostBased createUserAuth(ServerSession session) throws IOException {
return new UserAuthHostBased(getSignatureFactories());
}
}
\ No newline at end of file
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractiveFactory.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
index 7166d24..b8e65a3 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
@@ -18,7 +18,10 @@
*/
package org.apache.sshd.server.auth.keyboard;
+import java.io.IOException;
+
import org.apache.sshd.server.auth.AbstractUserAuthFactory;
+import org.apache.sshd.server.session.ServerSession;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
@@ -32,7 +35,7 @@ public class UserAuthKeyboardInteractiveFactory extends AbstractUserAuthFactory
}
@Override
- public UserAuthKeyboardInteractive create() {
+ public UserAuthKeyboardInteractive createUserAuth(ServerSession session) throws IOException {
return new UserAuthKeyboardInteractive();
}
}
\ No newline at end of file
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPasswordFactory.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPasswordFactory.java
index 322f552..00388fd 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPasswordFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPasswordFactory.java
@@ -18,7 +18,10 @@
*/
package org.apache.sshd.server.auth.password;
+import java.io.IOException;
+
import org.apache.sshd.server.auth.AbstractUserAuthFactory;
+import org.apache.sshd.server.session.ServerSession;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
@@ -32,7 +35,7 @@ public class UserAuthPasswordFactory extends AbstractUserAuthFactory {
}
@Override
- public UserAuthPassword create() {
+ public UserAuthPassword createUserAuth(ServerSession session) throws IOException {
return new UserAuthPassword();
}
}
\ No newline at end of file
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKeyFactory.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKeyFactory.java
index d53a02a..84569b5 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKeyFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKeyFactory.java
@@ -18,6 +18,7 @@
*/
package org.apache.sshd.server.auth.pubkey;
+import java.io.IOException;
import java.util.List;
import org.apache.sshd.common.NamedFactory;
@@ -25,6 +26,7 @@ import org.apache.sshd.common.signature.Signature;
import org.apache.sshd.common.signature.SignatureFactoriesManager;
import org.apache.sshd.common.util.GenericUtils;
import org.apache.sshd.server.auth.AbstractUserAuthFactory;
+import org.apache.sshd.server.session.ServerSession;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
@@ -67,7 +69,7 @@ public class UserAuthPublicKeyFactory extends AbstractUserAuthFactory implements
}
@Override
- public UserAuthPublicKey create() {
+ public UserAuthPublicKey createUserAuth(ServerSession session) throws IOException {
return new UserAuthPublicKey(getSignatureFactories());
}
}
\ No newline at end of file
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 1d5eceb..4043017 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
@@ -30,7 +30,6 @@ import java.util.Map;
import java.util.Objects;
import org.apache.sshd.common.FactoryManager;
-import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.NamedResource;
import org.apache.sshd.common.RuntimeSshException;
import org.apache.sshd.common.ServiceFactory;
@@ -59,7 +58,7 @@ 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.UserAuthFactory;
import org.apache.sshd.server.auth.WelcomeBannerPhase;
import org.apache.sshd.server.auth.gss.GSSAuthenticator;
import org.apache.sshd.server.auth.hostbased.HostBasedAuthenticator;
@@ -80,7 +79,7 @@ public abstract class AbstractServerSession extends AbstractSession implements S
private KeyboardInteractiveAuthenticator interactiveAuthenticator;
private GSSAuthenticator gssAuthenticator;
private HostBasedAuthenticator hostBasedAuthenticator;
- private List<NamedFactory<UserAuth>> userAuthFactories;
+ private List<UserAuthFactory> userAuthFactories;
private KeyPairProvider keyPairProvider;
protected AbstractServerSession(ServerFactoryManager factoryManager, IoSession ioSession) {
@@ -167,13 +166,13 @@ public abstract class AbstractServerSession extends AbstractSession implements S
}
@Override
- public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+ public List<UserAuthFactory> getUserAuthFactories() {
ServerFactoryManager manager = getFactoryManager();
- return resolveEffectiveFactories(UserAuth.class, userAuthFactories, manager.getUserAuthFactories());
+ return resolveEffectiveFactories(userAuthFactories, manager.getUserAuthFactories());
}
@Override
- public void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories) {
+ public void setUserAuthFactories(List<UserAuthFactory> userAuthFactories) {
this.userAuthFactories = userAuthFactories; // OK if null/empty - inherit from parent
}
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 e3e046b..242267e 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
@@ -40,8 +40,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
-import org.apache.sshd.common.Factory;
-import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.NamedResource;
import org.apache.sshd.common.PropertyResolverUtils;
import org.apache.sshd.common.Service;
@@ -61,6 +59,7 @@ import org.apache.sshd.server.ServerAuthenticationManager;
import org.apache.sshd.server.ServerFactoryManager;
import org.apache.sshd.server.auth.AsyncAuthException;
import org.apache.sshd.server.auth.UserAuth;
+import org.apache.sshd.server.auth.UserAuthFactory;
import org.apache.sshd.server.auth.UserAuthNoneFactory;
import org.apache.sshd.server.auth.WelcomeBannerPhase;
@@ -72,7 +71,7 @@ public class ServerUserAuthService extends AbstractCloseable implements Service,
private final Map<String, Object> properties = new ConcurrentHashMap<>();
private final ServerSession serverSession;
private final WelcomeBannerPhase welcomePhase;
- private List<NamedFactory<UserAuth>> userAuthFactories;
+ private List<UserAuthFactory> userAuthFactories;
private List<List<String>> authMethods;
private String authUserName;
private String authMethod;
@@ -96,7 +95,7 @@ public class ServerUserAuthService extends AbstractCloseable implements Service,
maxAuthRequests = this.getIntProperty(
ServerAuthenticationManager.MAX_AUTH_REQUESTS, ServerAuthenticationManager.DEFAULT_MAX_AUTH_REQUESTS);
- List<NamedFactory<UserAuth>> factories = ValidateUtils.checkNotNullAndNotEmpty(
+ List<UserAuthFactory> factories = ValidateUtils.checkNotNullAndNotEmpty(
serverSession.getUserAuthFactories(), "No user auth factories for %s", s);
userAuthFactories = new ArrayList<>(factories);
// Get authentication methods
@@ -104,7 +103,7 @@ public class ServerUserAuthService extends AbstractCloseable implements Service,
String mths = this.getString(ServerAuthenticationManager.AUTH_METHODS);
if (GenericUtils.isEmpty(mths)) {
- for (NamedFactory<UserAuth> uaf : factories) {
+ for (UserAuthFactory uaf : factories) {
authMethods.add(new ArrayList<>(Collections.singletonList(uaf.getName())));
}
} else {
@@ -118,7 +117,7 @@ public class ServerUserAuthService extends AbstractCloseable implements Service,
// Verify all required methods are supported
for (List<String> l : authMethods) {
for (String m : l) {
- NamedFactory<UserAuth> factory =
+ UserAuthFactory factory =
NamedResource.findByName(m, String.CASE_INSENSITIVE_ORDER, userAuthFactories);
if (factory == null) {
throw new SshException("Configured method is not supported: " + m);
@@ -329,7 +328,8 @@ public class ServerUserAuthService extends AbstractCloseable implements Service,
session, username, service, method, nbAuthRequests, maxAuthRequests);
}
- Factory<UserAuth> factory = NamedResource.findByName(method, String.CASE_INSENSITIVE_ORDER, userAuthFactories);
+ UserAuthFactory factory = NamedResource.findByName(
+ method, String.CASE_INSENSITIVE_ORDER, userAuthFactories);
if (factory == null) {
if (debugEnabled) {
log.debug("handleUserAuthRequestMessage({}) no authentication factory for method={}", session, method);
@@ -338,7 +338,8 @@ public class ServerUserAuthService extends AbstractCloseable implements Service,
return true;
}
- currentAuth = ValidateUtils.checkNotNull(factory.create(), "No authenticator created for method=%s", method);
+ currentAuth = ValidateUtils.checkNotNull(
+ factory.createUserAuth(session), "No authenticator created for method=%s", method);
try {
Boolean authed = currentAuth.auth(session, username, service, buffer);
authHolder.set(authed);
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 d4279f9..37b0bd0 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
@@ -29,14 +29,13 @@ import java.util.concurrent.atomic.AtomicReference;
import org.apache.sshd.client.auth.AuthenticationIdentitiesProvider;
import org.apache.sshd.client.auth.BuiltinUserAuthFactories;
-import org.apache.sshd.client.auth.UserAuth;
+import org.apache.sshd.client.auth.UserAuthFactory;
import org.apache.sshd.client.auth.keyboard.UserInteraction;
import org.apache.sshd.client.auth.password.PasswordIdentityProvider;
import org.apache.sshd.client.keyverifier.ServerKeyVerifier;
import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.client.session.ClientSessionImpl;
import org.apache.sshd.common.Factory;
-import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.NamedResource;
import org.apache.sshd.common.channel.ChannelListener;
import org.apache.sshd.common.forward.DefaultForwarderFactory;
@@ -67,16 +66,16 @@ public class ClientAuthenticationManagerTest extends BaseTestSupport {
@Test
public void testDefaultUserAuthFactoriesMethods() {
- AtomicReference<List<NamedFactory<UserAuth>>> factoriesHolder = new AtomicReference<>();
+ AtomicReference<List<UserAuthFactory>> factoriesHolder = new AtomicReference<>();
@SuppressWarnings("checkstyle:anoninnerlength")
ClientAuthenticationManager manager = new ClientAuthenticationManager() {
@Override
- public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+ public List<UserAuthFactory> getUserAuthFactories() {
return factoriesHolder.get();
}
@Override
- public void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories) {
+ public void setUserAuthFactories(List<UserAuthFactory> userAuthFactories) {
assertNull("Unexpected multiple invocation", factoriesHolder.getAndSet(userAuthFactories));
}
@@ -151,8 +150,9 @@ public class ClientAuthenticationManagerTest extends BaseTestSupport {
manager.setUserAuthFactoriesNameList(expected);
assertEquals("Mismatched updated factories names", expected, manager.getUserAuthFactoriesNameList());
- List<NamedFactory<UserAuth>> factories = factoriesHolder.get();
- assertEquals("Mismatched factories count", BuiltinUserAuthFactories.VALUES.size(), GenericUtils.size(factories));
+ List<UserAuthFactory> factories = factoriesHolder.get();
+ assertEquals("Mismatched factories count",
+ BuiltinUserAuthFactories.VALUES.size(), GenericUtils.size(factories));
for (BuiltinUserAuthFactories f : BuiltinUserAuthFactories.VALUES) {
assertTrue("Missing factory=" + f.name(), factories.contains(f.create()));
}
diff --git a/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java b/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java
index f77839d..015e0c7 100644
--- a/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java
@@ -1145,7 +1145,7 @@ public class ClientTest extends BaseTestSupport {
Collection<String> mismatchedPrompts = new LinkedList<>();
client.setUserAuthFactories(Collections.singletonList(new UserAuthKeyboardInteractiveFactory() {
@Override
- public UserAuthKeyboardInteractive create() {
+ public UserAuthKeyboardInteractive createUserAuth(ClientSession session) throws IOException {
return new UserAuthKeyboardInteractive() {
@Override
protected boolean useCurrentPassword(
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 d1992d5..07e1a76 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
@@ -187,7 +187,7 @@ public class AuthenticationTest extends BaseTestSupport {
sshd.setUserAuthFactories(Collections.singletonList(
new org.apache.sshd.server.auth.password.UserAuthPasswordFactory() {
@Override
- public org.apache.sshd.server.auth.password.UserAuthPassword create() {
+ public org.apache.sshd.server.auth.password.UserAuthPassword createUserAuth(ServerSession session) throws IOException {
return new org.apache.sshd.server.auth.password.UserAuthPassword() {
@Override
protected Boolean handleClientPasswordChangeRequest(
@@ -235,7 +235,7 @@ public class AuthenticationTest extends BaseTestSupport {
client.setUserAuthFactories(Collections.singletonList(
new org.apache.sshd.client.auth.password.UserAuthPasswordFactory() {
@Override
- public org.apache.sshd.client.auth.password.UserAuthPassword create() {
+ public org.apache.sshd.client.auth.password.UserAuthPassword createUserAuth(ClientSession session) throws IOException {
return new org.apache.sshd.client.auth.password.UserAuthPassword() {
@Override
protected IoWriteFuture sendPassword(
@@ -717,7 +717,7 @@ public class AuthenticationTest extends BaseTestSupport {
sshd.setUserAuthFactories(Collections.singletonList(
new org.apache.sshd.server.auth.pubkey.UserAuthPublicKeyFactory() {
@Override
- public org.apache.sshd.server.auth.pubkey.UserAuthPublicKey create() {
+ public org.apache.sshd.server.auth.pubkey.UserAuthPublicKey createUserAuth(ServerSession session) throws IOException {
return new org.apache.sshd.server.auth.pubkey.UserAuthPublicKey() {
@Override
protected void sendPublicKeyResponse(
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 9be1cb0..40eebac 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
@@ -22,12 +22,11 @@ package org.apache.sshd.server;
import java.util.List;
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;
+import org.apache.sshd.server.auth.UserAuthFactory;
import org.apache.sshd.server.auth.gss.GSSAuthenticator;
import org.apache.sshd.server.auth.hostbased.HostBasedAuthenticator;
import org.apache.sshd.server.auth.keyboard.KeyboardInteractiveAuthenticator;
@@ -52,16 +51,16 @@ public class ServerAuthenticationManagerTest extends BaseTestSupport {
@Test
public void testDefaultUserAuthFactoriesMethods() {
- AtomicReference<List<NamedFactory<UserAuth>>> factoriesHolder = new AtomicReference<>();
+ AtomicReference<List<UserAuthFactory>> factoriesHolder = new AtomicReference<>();
@SuppressWarnings("checkstyle:anoninnerlength")
ServerAuthenticationManager manager = new ServerAuthenticationManager() {
@Override
- public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+ public List<UserAuthFactory> getUserAuthFactories() {
return factoriesHolder.get();
}
@Override
- public void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories) {
+ public void setUserAuthFactories(List<UserAuthFactory> userAuthFactories) {
assertNull("Unexpected multiple invocation", factoriesHolder.getAndSet(userAuthFactories));
}
@@ -131,8 +130,9 @@ public class ServerAuthenticationManagerTest extends BaseTestSupport {
manager.setUserAuthFactoriesNameList(expected);
assertEquals("Mismatched updated factories names", expected, manager.getUserAuthFactoriesNameList());
- List<NamedFactory<UserAuth>> factories = factoriesHolder.get();
- assertEquals("Mismatched factories count", BuiltinUserAuthFactories.VALUES.size(), GenericUtils.size(factories));
+ List<UserAuthFactory> factories = factoriesHolder.get();
+ assertEquals("Mismatched factories count",
+ BuiltinUserAuthFactories.VALUES.size(), GenericUtils.size(factories));
for (BuiltinUserAuthFactories f : BuiltinUserAuthFactories.VALUES) {
assertTrue("Missing factory=" + f.name(), factories.contains(f.create()));
}