summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrew <andrew@poundpay.com>2012-08-02 22:56:40 -0700
committerJeff Forcier <jeff@bitprophet.org>2012-09-24 18:54:30 -0700
commit38dec6fc5b2e2c07eec83a36f43d75d884cc6960 (patch)
tree31654f7a9b04c73ea18bd1984ea697c78dd3dd94
parentb592eb1074bb158643bccfef45c2d47c0233f93f (diff)
- make sure we honor 2-factor for all auth_pkey blocks
- explicit check for ['password'] as remaining auth type (cherry picked from commit 53a3421da6d74333c4679fd6289d418917833b44)
-rw-r--r--paramiko/client.py50
1 files changed, 28 insertions, 22 deletions
diff --git a/paramiko/client.py b/paramiko/client.py
index a142c0e9..859d6008 100644
--- a/paramiko/client.py
+++ b/paramiko/client.py
@@ -423,27 +423,33 @@ class SSHClient (object):
The password is required for two-factor authentication.
"""
saved_exception = None
+ two_factor = False
if pkey is not None:
try:
self._log(DEBUG, 'Trying SSH key %s' % hexlify(pkey.get_fingerprint()))
- self._transport.auth_publickey(username, pkey)
- return
+ allowed_types = self._transport.auth_publickey(username, pkey)
+ two_factor = (allowed_types == ['password'])
+ if not two_factor:
+ return
except SSHException, e:
saved_exception = e
- for key_filename in key_filenames:
- for pkey_class in (RSAKey, DSSKey):
- try:
- key = pkey_class.from_private_key_file(key_filename, password)
- self._log(DEBUG, 'Trying key %s from %s' % (hexlify(key.get_fingerprint()), key_filename))
- self._transport.auth_publickey(username, key)
- return
- except SSHException, e:
- saved_exception = e
-
- two_factor = False
- if allow_agent:
+ if not two_factor:
+ for key_filename in key_filenames:
+ for pkey_class in (RSAKey, DSSKey):
+ try:
+ key = pkey_class.from_private_key_file(key_filename, password)
+ self._log(DEBUG, 'Trying key %s from %s' % (hexlify(key.get_fingerprint()), key_filename))
+ self._transport.auth_publickey(username, key)
+ two_factor = (allowed_types == ['password'])
+ if not two_factor:
+ return
+ break
+ except SSHException, e:
+ saved_exception = e
+
+ if not two_factor and allow_agent:
if self._agent == None:
self._agent = Agent()
@@ -451,14 +457,15 @@ class SSHClient (object):
try:
self._log(DEBUG, 'Trying SSH agent key %s' % hexlify(key.get_fingerprint()))
# for 2-factor auth a successfully auth'd key will result in ['password']
- remaining_auth_types = self._transport.auth_publickey(username, key)
- if not remaining_auth_types:
+ allowed_types = self._transport.auth_publickey(username, key)
+ two_factor = (allowed_types == ['password'])
+ if not two_factor:
return
- two_factor = True
break
except SSHException, e:
saved_exception = e
- else:
+
+ if not two_factor:
keyfiles = []
rsa_key = os.path.expanduser('~/.ssh/id_rsa')
dsa_key = os.path.expanduser('~/.ssh/id_dsa')
@@ -482,10 +489,10 @@ class SSHClient (object):
key = pkey_class.from_private_key_file(filename, password)
self._log(DEBUG, 'Trying discovered key %s in %s' % (hexlify(key.get_fingerprint()), filename))
# for 2-factor auth a successfully auth'd key will result in ['password']
- remaining_auth_types = self._transport.auth_publickey(username, key)
- if not remaining_auth_types:
+ allowed_types = self._transport.auth_publickey(username, key)
+ two_factor = (allowed_types == ['password'])
+ if not two_factor:
return
- two_factor = True
break
except SSHException, e:
saved_exception = e
@@ -499,7 +506,6 @@ class SSHClient (object):
except SSHException, e:
saved_exception = e
elif two_factor:
- # for 2-factor auth requires a password
raise SSHException('Two-factor authentication requires a password')
# if we got an auth-failed exception earlier, re-raise it