You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2014/03/18 08:53:34 UTC

git commit: [SSHD-304] ClientSession.WAIT_AUTH does not wait for server key to be available

Repository: mina-sshd
Updated Branches:
  refs/heads/master 1055d489a -> 28adb0e1e


[SSHD-304] ClientSession.WAIT_AUTH does not wait for server key to be available

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

Branch: refs/heads/master
Commit: 28adb0e1e29fcd14e546f8d54906a2b89d6edf57
Parents: 1055d48
Author: Guillaume Nodet <gn...@apache.org>
Authored: Tue Mar 18 08:53:19 2014 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Tue Mar 18 08:53:19 2014 +0100

----------------------------------------------------------------------
 .../sshd/client/session/ClientSessionImpl.java  |  2 +-
 .../sshd/common/session/AbstractSession.java    |  3 +++
 .../test/java/org/apache/sshd/ClientTest.java   | 27 ++++++++++++++++++++
 3 files changed, 31 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/28adb0e1/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
index 1298acf..741372c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
@@ -278,7 +278,7 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession
                 if (authed) { // authFuture.isSuccess()
                     cond |= AUTHED;
                 }
-                if (authFuture.isFailure()) {
+                if (kexState.get() == KEX_STATE_DONE && authFuture.isFailure()) {
                     cond |= WAIT_AUTH;
                 }
                 if ((cond & mask) != 0) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/28adb0e1/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
index 22b8229..e2933bf 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
@@ -380,6 +380,9 @@ public abstract class AbstractSession extends CloseableUtils.AbstractInnerClosea
                     }
                     kexState.set(KEX_STATE_DONE);
                 }
+                synchronized (lock) {
+                    lock.notifyAll();
+                }
                 break;
             default:
                 if (cmd >= SshConstants.SSH_MSG_KEX_FIRST && cmd <= SshConstants.SSH_MSG_KEX_LAST) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/28adb0e1/sshd-core/src/test/java/org/apache/sshd/ClientTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/ClientTest.java b/sshd-core/src/test/java/org/apache/sshd/ClientTest.java
index c928930..fd2bea6 100644
--- a/sshd-core/src/test/java/org/apache/sshd/ClientTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/ClientTest.java
@@ -24,13 +24,16 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PipedInputStream;
 import java.io.PipedOutputStream;
+import java.net.SocketAddress;
 import java.security.KeyPair;
 import java.security.PublicKey;
 import java.util.Arrays;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.sshd.client.ClientFactoryManager;
+import org.apache.sshd.client.ServerKeyVerifier;
 import org.apache.sshd.client.UserAuth;
 import org.apache.sshd.client.UserInteraction;
 import org.apache.sshd.client.auth.UserAuthKeyboardInteractive;
@@ -554,6 +557,30 @@ public class ClientTest extends BaseTest {
         }
     }
 
+    @Test
+    public void testWaitAuth() throws Exception {
+        SshClient client = SshClient.setUpDefaultClient();
+        final AtomicBoolean ok = new AtomicBoolean();
+        client.setServerKeyVerifier(
+                new ServerKeyVerifier() {
+                    public boolean verifyServerKey(
+                            ClientSession sshClientSession,
+                            SocketAddress remoteAddress,
+                            PublicKey serverKey
+                    ) {
+                        System.out.println(serverKey);
+                        ok.set(true);
+                        return true;
+                    }
+                }
+        );
+        client.start();
+        ClientSession session = client.connect("localhost", port).await().getSession();
+        session.waitFor(ClientSession.WAIT_AUTH, 10000);
+        assertTrue(ok.get());
+        client.stop();
+    }
+
     private void suspend(IoSession ioSession) {
         if (ioSession instanceof MinaSession) {
             ((MinaSession) ioSession).suspend();