Skip to content
Snippets Groups Projects
Commit ac165c385b7d authored by Jeff Forcier's avatar Jeff Forcier
Browse files

Merge pull request #153 from glasserc/log_bad_hostkeys

Warn on parse failure when reading known_hosts
No related branches found
No related tags found
No related merge requests found
......@@ -32,6 +32,8 @@
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
& patch.
......
......@@ -28,6 +28,7 @@
from paramiko.common import *
from paramiko.dsskey import DSSKey
from paramiko.rsakey import RSAKey
from paramiko.util import get_logger
class InvalidHostKey(Exception):
......@@ -48,7 +49,7 @@
self.hostnames = hostnames
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,
the type of key, and the key data. The line is expected to be in the
......@@ -61,6 +62,7 @@
@param line: a line from an OpenSSH known_hosts file
@type line: str
"""
log = get_logger('paramiko.hostkeys')
fields = line.split(' ')
if len(fields) < 3:
# Bad number of fields
......@@ -64,6 +66,8 @@
fields = line.split(' ')
if len(fields) < 3:
# Bad number of fields
log.warn("Not enough fields found in known_hosts in line %s (%r)" %
(lineno, line))
return None
fields = fields[:3]
......@@ -78,6 +82,7 @@
elif keytype == 'ssh-dss':
key = DSSKey(data=base64.decodestring(key))
else:
log.warn("Unable to handle key of type %s" % (keytype,))
return None
except binascii.Error, e:
raise InvalidHostKey(line, e)
......@@ -160,7 +165,7 @@
@raise IOError: if there was an error reading the file
"""
f = open(filename, 'r')
for line in f:
for lineno, line in enumerate(f):
line = line.strip()
if (len(line) == 0) or (line[0] == '#'):
continue
......@@ -164,7 +169,7 @@
line = line.strip()
if (len(line) == 0) or (line[0] == '#'):
continue
e = HostKeyEntry.from_line(line)
e = HostKeyEntry.from_line(line, lineno)
if e is not None:
_hostnames = e.hostnames
for h in _hostnames:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment