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
The following commit(s) were added to refs/heads/master by this push:
new f3cbdce [SSHD-1076] Break down ClientUserAuthService#auth method into
several to allow for flexible override
f3cbdce is described below
commit f3cbdce88ef863dec20a20b5b43e95991368d840
Author: Lyor Goldstein <[email protected]>
AuthorDate: Sun Sep 13 19:58:40 2020 +0300
[SSHD-1076] Break down ClientUserAuthService#auth method into several to
allow for flexible override
---
CHANGES.md | 1 +
.../sshd/client/session/ClientUserAuthService.java | 65 ++++++++++++++--------
2 files changed, 42 insertions(+), 24 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index 1893207..a86f891 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -26,6 +26,7 @@ or `-key-file` command line option.
* [SSHD-1040](https://issues.apache.org/jira/browse/SSHD-1040) Make server key
available after KEX completed.
* [SSHD-1060](https://issues.apache.org/jira/browse/SSHD-1060) Do not store
logger level in fields.
* [SSHD-1064](https://issues.apache.org/jira/browse/SSHD-1064) Fixed
`ClientSession#executeRemoteCommand` handling of STDERR in case of exception to
behave according to its documentation
+* [SSHD-1076](https://issues.apache.org/jira/browse/SSHD-1076) Break down
`ClientUserAuthService#auth` method into several to allow for flexible override
## Behavioral changes and enhancements
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 52410b7..ab2b55c 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
@@ -39,6 +39,7 @@ 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.io.IoWriteFuture;
import org.apache.sshd.common.session.Session;
import org.apache.sshd.common.util.GenericUtils;
import org.apache.sshd.common.util.ValidateUtils;
@@ -56,15 +57,15 @@ public class ClientUserAuthService extends
AbstractCloseable implements Service,
* The AuthFuture that is being used by the current auth request. This
encodes the state. isSuccess ->
* authenticated, else if isDone -> server waiting for user auth, else
authenticating.
*/
- private final AtomicReference<AuthFuture> authFutureHolder = new
AtomicReference<>();
- private final Map<String, Object> properties = new ConcurrentHashMap<>();
+ protected final AtomicReference<AuthFuture> authFutureHolder = new
AtomicReference<>();
+ protected final ClientSessionImpl clientSession;
+ protected final List<UserAuthFactory> authFactories;
+ protected final List<String> clientMethods;
+ protected List<String> serverMethods;
- private final ClientSessionImpl clientSession;
- private final List<String> clientMethods;
- private final List<UserAuthFactory> authFactories;
+ private final Map<String, Object> properties = new ConcurrentHashMap<>();
private String service;
- private List<String> serverMethods;
private UserAuth userAuth;
private int currentMethod;
@@ -125,24 +126,15 @@ public class ClientUserAuthService extends
AbstractCloseable implements Service,
// ignored
}
+ public String getCurrentServiceName() {
+ return service;
+ }
+
public AuthFuture auth(String service) throws IOException {
this.service = ValidateUtils.checkNotNullAndNotEmpty(service, "No
service name");
ClientSession session = getClientSession();
- // check if any previous future in use
- AuthFuture authFuture = new DefaultAuthFuture(service,
clientSession.getFutureLock());
- AuthFuture currentFuture = authFutureHolder.getAndSet(authFuture);
- boolean debugEnabled = log.isDebugEnabled();
- if (currentFuture != null) {
- if (currentFuture.isDone()) {
- if (debugEnabled) {
- log.debug("auth({})[{}] request new authentication",
session, service);
- }
- } else {
- currentFuture.setException(
- new InterruptedIOException("New authentication started
before previous completed"));
- }
- }
+ AuthFuture authFuture = updateCurrentAuthFuture(session, service);
// start from scratch
serverMethods = null;
@@ -155,7 +147,34 @@ public class ClientUserAuthService extends
AbstractCloseable implements Service,
}
}
- if (debugEnabled) {
+ sendInitialAuthRequest(session, service);
+ return authFuture;
+ }
+
+ protected AuthFuture updateCurrentAuthFuture(ClientSession session, String
service) throws IOException {
+ // check if any previous future in use
+ AuthFuture authFuture = createAuthFuture(session, service);
+ AuthFuture currentFuture = authFutureHolder.getAndSet(authFuture);
+ if (currentFuture != null) {
+ if (currentFuture.isDone()) {
+ if (log.isDebugEnabled()) {
+ log.debug("updateCurrentAuthFuture({})[{}] request new
authentication", session, service);
+ }
+ } else {
+ currentFuture.setException(
+ new InterruptedIOException("New authentication started
before previous completed"));
+ }
+ }
+
+ return authFuture;
+ }
+
+ protected AuthFuture createAuthFuture(ClientSession session, String
service) throws IOException {
+ return new DefaultAuthFuture(service, clientSession.getFutureLock());
+ }
+
+ protected IoWriteFuture sendInitialAuthRequest(ClientSession session,
String service) throws IOException {
+ if (log.isDebugEnabled()) {
log.debug("auth({})[{}] send SSH_MSG_USERAUTH_REQUEST for 'none'",
session, service);
}
@@ -165,9 +184,7 @@ public class ClientUserAuthService extends
AbstractCloseable implements Service,
buffer.putString(username);
buffer.putString(service);
buffer.putString("none");
- session.writePacket(buffer);
-
- return authFuture;
+ return session.writePacket(buffer);
}
@Override