Merge pull request #153 from glasserc/log_bad_hostkeys

Warn on parse failure when reading known_hosts
This commit is contained in:
Jeff Forcier 2013-04-28 18:08:55 -07:00
commit 675d79d743
2 changed files with 10 additions and 3 deletions

2
NEWS
View File

@ -32,6 +32,8 @@ v1.11.0 (DD MM YYYY)
v1.10.2 (DD MM 2013) v1.10.2 (DD MM 2013)
-------------------- --------------------
* #153, #67: Warn on parse failure when reading known_hosts
file. Thanks to `@glasserc` for patch.
* #146: Indentation fixes for readability. Thanks to Abhinav Upadhyay for catch * #146: Indentation fixes for readability. Thanks to Abhinav Upadhyay for catch
& patch. & patch.

View File

@ -28,6 +28,7 @@ import UserDict
from paramiko.common import * from paramiko.common import *
from paramiko.dsskey import DSSKey from paramiko.dsskey import DSSKey
from paramiko.rsakey import RSAKey from paramiko.rsakey import RSAKey
from paramiko.util import get_logger
class InvalidHostKey(Exception): class InvalidHostKey(Exception):
@ -48,7 +49,7 @@ class HostKeyEntry:
self.hostnames = hostnames self.hostnames = hostnames
self.key = key self.key = key
def from_line(cls, line): def from_line(cls, line, lineno=None):
""" """
Parses the given line of text to find the names for the host, Parses the given line of text to find the names for the host,
the type of key, and the key data. The line is expected to be in the the type of key, and the key data. The line is expected to be in the
@ -61,9 +62,12 @@ class HostKeyEntry:
@param line: a line from an OpenSSH known_hosts file @param line: a line from an OpenSSH known_hosts file
@type line: str @type line: str
""" """
log = get_logger('paramiko.hostkeys')
fields = line.split(' ') fields = line.split(' ')
if len(fields) < 3: if len(fields) < 3:
# Bad number of fields # Bad number of fields
log.warn("Not enough fields found in known_hosts in line %s (%r)" %
(lineno, line))
return None return None
fields = fields[:3] fields = fields[:3]
@ -78,6 +82,7 @@ class HostKeyEntry:
elif keytype == 'ssh-dss': elif keytype == 'ssh-dss':
key = DSSKey(data=base64.decodestring(key)) key = DSSKey(data=base64.decodestring(key))
else: else:
log.warn("Unable to handle key of type %s" % (keytype,))
return None return None
except binascii.Error, e: except binascii.Error, e:
raise InvalidHostKey(line, e) raise InvalidHostKey(line, e)
@ -160,11 +165,11 @@ class HostKeys (UserDict.DictMixin):
@raise IOError: if there was an error reading the file @raise IOError: if there was an error reading the file
""" """
f = open(filename, 'r') f = open(filename, 'r')
for line in f: for lineno, line in enumerate(f):
line = line.strip() line = line.strip()
if (len(line) == 0) or (line[0] == '#'): if (len(line) == 0) or (line[0] == '#'):
continue continue
e = HostKeyEntry.from_line(line) e = HostKeyEntry.from_line(line, lineno)
if e is not None: if e is not None:
_hostnames = e.hostnames _hostnames = e.hostnames
for h in _hostnames: for h in _hostnames: