summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobey Pointer <robey@lag.net>2008-03-22 19:57:51 -0700
committerRobey Pointer <robey@lag.net>2008-03-22 19:57:51 -0700
commite5a1b4bf569599b53016374f96e53639799ed6d3 (patch)
tree0086bd5919af7e6e12c9230f53ec50aeec9304e4
parent7b819f0e917dadedb7cc9399d33fe7b5f9c63a9e (diff)
downloadparamiko-e5a1b4bf569599b53016374f96e53639799ed6d3.tar.gz
[project @ robey@lag.net-20080323025751-de0lem9pi4oydt2g]
bug 193779: catch EOFError in auth, and turn it into an auth exception. add a unit test to verify.
-rw-r--r--paramiko/auth_handler.py2
-rw-r--r--tests/test_auth.py20
2 files changed, 19 insertions, 3 deletions
diff --git a/paramiko/auth_handler.py b/paramiko/auth_handler.py
index 2b336e07..39a0194a 100644
--- a/paramiko/auth_handler.py
+++ b/paramiko/auth_handler.py
@@ -158,7 +158,7 @@ class AuthHandler (object):
event.wait(0.1)
if not self.transport.is_active():
e = self.transport.get_exception()
- if e is None:
+ if (e is None) or issubclass(e.__class__, EOFError):
e = AuthenticationException('Authentication failed.')
raise e
if event.isSet():
diff --git a/tests/test_auth.py b/tests/test_auth.py
index a18c57d0..fadd8cad 100644
--- a/tests/test_auth.py
+++ b/tests/test_auth.py
@@ -25,7 +25,8 @@ import threading
import unittest
from paramiko import Transport, ServerInterface, RSAKey, DSSKey, \
- SSHException, BadAuthenticationType, InteractiveQuery, ChannelException
+ SSHException, BadAuthenticationType, InteractiveQuery, ChannelException, \
+ AuthenticationException
from paramiko import AUTH_FAILED, AUTH_PARTIALLY_SUCCESSFUL, AUTH_SUCCESSFUL
from paramiko import OPEN_SUCCEEDED, OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED
from loop import LoopSocket
@@ -67,6 +68,8 @@ class NullServer (ServerInterface):
return AUTH_SUCCESSFUL
if (username == 'non-utf8') and (password == '\xff'):
return AUTH_SUCCESSFUL
+ if username == 'bad-server':
+ raise Exception("Ack!")
return AUTH_FAILED
def check_auth_publickey(self, username, key):
@@ -147,7 +150,7 @@ class AuthTest (unittest.TestCase):
self.assert_(False)
except:
etype, evalue, etb = sys.exc_info()
- self.assert_(issubclass(etype, SSHException))
+ self.assert_(issubclass(etype, AuthenticationException))
self.tc.auth_password(username='slowdive', password='pygmalion')
self.verify_finished()
@@ -213,3 +216,16 @@ class AuthTest (unittest.TestCase):
remain = self.tc.auth_password('non-utf8', '\xff')
self.assertEquals([], remain)
self.verify_finished()
+
+ def test_8_auth_gets_disconnected(self):
+ """
+ verify that we catch a server disconnecting during auth, and report
+ it as an auth failure.
+ """
+ self.start_server()
+ self.tc.connect(hostkey=self.public_host_key)
+ try:
+ remain = self.tc.auth_password('bad-server', 'hello')
+ except:
+ etype, evalue, etb = sys.exc_info()
+ self.assert_(issubclass(etype, AuthenticationException))