protected void tryNext()

in sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java [396:476]


    protected void tryNext(int cmd, AuthFuture authFuture) throws Exception {
        ClientSession session = getClientSession();
        // Loop until we find something to try
        for (boolean debugEnabled = log.isDebugEnabled();; debugEnabled = log.isDebugEnabled()) {
            if (currentUserAuth == null) {
                if (debugEnabled) {
                    log.debug("tryNext({}) starting authentication mechanisms: client={}, client index={}, server={}", session,
                            clientMethods, currentMethod, serverMethods);
                }
            } else if (!currentUserAuth.process(null)) {
                if (debugEnabled) {
                    log.debug("tryNext({}) no initial request sent by method={}", session, currentUserAuth.getName());
                }
                if (currentUserAuth == pubkeyAuth) {
                    // Don't destroy it yet. It might re-appear later if the server requires multiple methods.
                    // It doesn't have any more keys, but we don't want to re-create it from scratch and re-try
                    // all the keys already tried again.
                    currentUserAuth = null;
                } else {
                    destroyUserAuth();
                }
                currentMethod++;
            } else {
                if (debugEnabled) {
                    log.debug("tryNext({}) successfully processed initial buffer by method={}",
                            session, currentUserAuth.getName());
                }
                return;
            }

            String method = null;
            for (; currentMethod < clientMethods.size(); currentMethod++) {
                method = clientMethods.get(currentMethod);
                if (serverMethods.contains(method)) {
                    break;
                }
            }

            if (currentMethod >= clientMethods.size()) {
                if (debugEnabled) {
                    log.debug("tryNext({}) exhausted all methods - client={}, server={}",
                            session, clientMethods, serverMethods);
                }
                clearUserAuth();
                // also wake up anyone sitting in waitFor
                authFuture.setException(new SshException(SshConstants.SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE,
                        "No more authentication methods available"));
                return;
            }

            authFuture.setCancellable(false);
            if (authFuture.isCanceled()) {
                authFuture.getCancellation().setCanceled();
                clearUserAuth();
                return;
            }
            if (UserAuthPublicKey.NAME.equals(method) && pubkeyAuth != null) {
                currentUserAuth = pubkeyAuth;
            } else {
                currentUserAuth = UserAuthMethodFactory.createUserAuth(session, authFactories, method);
                if (currentUserAuth == null) {
                    throw new UnsupportedOperationException("Failed to find a user-auth factory for method=" + method);
                }
            }
            if (debugEnabled) {
                log.debug("tryNext({}) attempting method={}", session, method);
            }
            if (currentUserAuth != pubkeyAuth) {
                currentUserAuth.init(session, service);
            }
            if (UserAuthPublicKey.NAME.equals(currentUserAuth.getName())) {
                pubkeyAuth = currentUserAuth;
            }
            authFuture.setCancellable(currentUserAuth.isCancellable());
            if (authFuture.isCanceled()) {
                authFuture.getCancellation().setCanceled();
                clearUserAuth();
                return;
            }
        }
    }