From 5aea3fc7ee442a3ed3b107aa73c9601308824392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Wed, 29 Aug 2018 13:29:38 +0300 Subject: [PATCH] Create a build system --- .gitignore | 2 ++ Makefile | 26 +++++++++++++++++ src/check_fingerprint.py | 29 ++++++------------- ...wn_hosts.py => main-export-known-hosts.py} | 0 src/process_known_hosts.py | 2 ++ src/read_file.py | 1 + 6 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 Makefile rename src/{export_known_hosts.py => main-export-known-hosts.py} (100%) diff --git a/.gitignore b/.gitignore index 0b0f584..ef98c70 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ __pycache__ *.pyc *.swp *.sshwot +build +sshwot-export-known-hosts diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9ab38d1 --- /dev/null +++ b/Makefile @@ -0,0 +1,26 @@ +BINS=sshwot-export-known-hosts + +SSHWOT_EXPORT_KNOWN_HOSTS_MAIN:=src/main-export-known-hosts.py +SSHWOT_EXPORT_KNOWN_HOSTS_DEPS:=$(SSHWOT_EXPORT_KNOWN_HOSTS_MAIN) src/entry.py src/hashing.py src/process_known_hosts.py src/write_file.py + +all: $(BINS) + +sshwot-export-known-hosts: $(SSHWOT_EXPORT_KNOWN_HOSTS_MAIN) $(SSHWOT_EXPORT_KNOWN_HOSTS_DEPS) + mkdir -p build/$@ + cp $(SSHWOT_EXPORT_KNOWN_HOSTS_DEPS) build/$@/ + cp $(SSHWOT_EXPORT_KNOWN_HOSTS_MAIN) build/$@/__main__.py + zip --quiet --junk-paths build/$@.zip build/$@/*.py + mkdir -p bin/ + echo '#!/usr/bin/env python3' > $@ + cat build/$@.zip >> $@ + chmod +x $@ + +.PHONY: all clean distclean buildclean + +clean: + rm -rf build $(BINS) + +distclean: clean + +buildclean: + rm -rf build diff --git a/src/check_fingerprint.py b/src/check_fingerprint.py index 3625d18..5d1d3a1 100644 --- a/src/check_fingerprint.py +++ b/src/check_fingerprint.py @@ -3,14 +3,12 @@ import enum import entry import hashing -class result(enum.Enum): - notfound, ok, fail = range(3) - def check_fingerprint(entries, domain, port, fingerprint): - """check_fingerprint([Entry], str, u16, bytes[32]) → (enum result: result, str / None: comment) + """check_fingerprint([Entry], str, u16, bytes[32]) → ([str]: successes, [str]: fails) Checks if the given host is found with the given fingerprint. - Will return the comment on the host if the host is found, regardless - of whether the fingerprint checks out.""" + The successes and fails lists returned by the function have the + comments for the hosts that match and have the same fingerpring and + the hosts that match but have a different fingerprint, respectively""" assert type(entries) == list and all(type(i) == entry.Entry for i in entries) assert type(domain) == str assert type(port) == int and 0 <= port <= (1<<16) - 1 @@ -26,26 +24,17 @@ def check_fingerprint(entries, domain, port, fingerprint): if port != 22: normalized_hosts.append(entry.normalize_host(domain, 22)) + successes = [] + fails = [] for possible_match in entries: for normalized_host in normalized_hosts: hashed_host = hashing.hash_with_salt(normalized_host, possible_match.salt) if hashed_host == possible_match.hashed_host: - # Convert the comment to a string - # We put replacement characters where - # decoding fails instead of throwing an - # error, because even whilethe comment - # field must be valid utf-8, failing in this - # situation is bad UX - comment = possible_match.comment.decode('utf-8', errors = 'replace') - # TODO: Justify this - # We only care about the first match, so we - # return here if fingerprint == possible_match.fingerprint: # Fingerprint matches, it passes - return (result.ok, comment) + successes.append(possible_match.comment) else: # Fingerprint different, it fails - return (result.fail, comment) + fails.append(possible_match.comment) - # We did not match, tell the caller so - return (result.notfound, None) + return successes, fails diff --git a/src/export_known_hosts.py b/src/main-export-known-hosts.py similarity index 100% rename from src/export_known_hosts.py rename to src/main-export-known-hosts.py diff --git a/src/process_known_hosts.py b/src/process_known_hosts.py index 886d0c1..55be930 100644 --- a/src/process_known_hosts.py +++ b/src/process_known_hosts.py @@ -3,11 +3,13 @@ import hashlib import entry +# TODO: Include line number in the error class KnownHostsSyntaxError(Exception): pass class HashedHostError(Exception): pass def process_line(line): + # TODO: Add a way to skip IPs """process_line(str) → [Entry] Given a string containing one line of .ssh/known_hosts file, create a list of Entries based on it.""" diff --git a/src/read_file.py b/src/read_file.py index 6158a5b..4d59d0a 100644 --- a/src/read_file.py +++ b/src/read_file.py @@ -2,6 +2,7 @@ import base64 import entry +# TODO: Include file number in the error info class FileFormatError(Exception): pass class VersionMismatch(Exception): pass