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 <lgoldst...@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:d...@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:d...@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:d...@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:d...@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:d...@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:d...@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:d...@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:d...@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:d...@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:d...@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:d...@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:d...@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:d...@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:d...@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:d...@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:d...@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())); }