From f1a799d8647f959c51f0444c5b8b8c6250b58603 Mon Sep 17 00:00:00 2001 From: "Piotr F. Mieszkowski" Date: Thu, 6 Jan 2022 16:23:10 +0100 Subject: [PATCH] Adjust E2E tests to work with all scenarios Since it's not so easy to encrypt a message exactly the same way twice, we only verify if the message has been encrypted or not. Introduce minor changes to the library itself, because it doesn't work very well with modern GnuPG. Also, include GnuPG directory (pointed at by --homedir option). --- GnuPG/__init__.py | 20 ++++++++++++--- Makefile | 1 + test/e2e.ini | 6 ++--- test/e2e_test.py | 50 +++++++++++++++++++++++------------- test/keyhome/crls.d/DIR.txt | 1 + test/keyhome/pubring.kbx | Bin 0 -> 3088 bytes test/keyhome/random_seed | Bin 0 -> 600 bytes test/keyhome/tofu.db | Bin 0 -> 49152 bytes test/keyhome/trustdb.gpg | Bin 0 -> 1200 bytes test/relay.py | 8 ++++++ 10 files changed, 62 insertions(+), 24 deletions(-) create mode 100644 test/keyhome/crls.d/DIR.txt create mode 100644 test/keyhome/pubring.kbx create mode 100644 test/keyhome/random_seed create mode 100644 test/keyhome/tofu.db create mode 100644 test/keyhome/trustdb.gpg diff --git a/GnuPG/__init__.py b/GnuPG/__init__.py index c9bbee0..294f8c9 100644 --- a/GnuPG/__init__.py +++ b/GnuPG/__init__.py @@ -23,6 +23,13 @@ import subprocess import shutil import random import string +import sys + + +LINE_FINGERPRINT = 'fpr' +LINE_USER_ID = 'uid' + +POS_FINGERPRINT = 9 def private_keys( keyhome ): cmd = ['/usr/bin/gpg', '--homedir', keyhome, '--list-secret-keys', '--with-colons'] @@ -42,14 +49,21 @@ def public_keys( keyhome ): cmd = ['/usr/bin/gpg', '--homedir', keyhome, '--list-keys', '--with-colons'] p = subprocess.Popen( cmd, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) p.wait() + keys = dict() + fingerprint = None + email = None for line in p.stdout.readlines(): - if line[0:3] == 'uid' or line[0:3] == 'pub': + if line[0:3] == LINE_FINGERPRINT: + fingerprint = line.split(':')[POS_FINGERPRINT] + if line[0:3] == LINE_USER_ID: if ('<' not in line or '>' not in line): continue email = line.split('<')[1].split('>')[0] - fingerprint = line.split(':')[4] + if not (fingerprint is None or email is None): keys[fingerprint] = email + fingerprint = None + email = None return keys # confirms a key has a given email address @@ -147,4 +161,4 @@ class GPGDecryptor: def _command(self): cmd = ["/usr/bin/gpg", "--trust-model", "always", "--homedir", self._keyhome, "--batch", "--yes", "--no-secmem-warning", "-a", "-d"] - return cmd \ No newline at end of file + return cmd diff --git a/Makefile b/Makefile index 5c50c1d..629a04b 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ test: test/tmp test/logs pre-clean pre-clean: rm -fv test/gpg-mailgate.conf + rm -f test/logs/*.log test/tmp: mkdir test/tmp diff --git a/test/e2e.ini b/test/e2e.ini index 3e0899f..b65d0dc 100644 --- a/test/e2e.ini +++ b/test/e2e.ini @@ -8,16 +8,16 @@ cases = 3 descr = Clear text message to a user without a key to = carlos@disposlab in = test/msgin/clear2clear.msg -out = test/msgout/clear2clear.msg +out = Body of the message. [case-2] descr = Clear text message to a user with an RSA key to = alice@disposlab in = test/msgin/clear2rsa.msg -out = test/msgout/clear2rsa.msg +out = -----BEGIN PGP MESSAGE----- [case-3] descr = Clear text message to a user with an Ed25519 key to = bob@disposlab in = test/msgin/clear2ed.msg -out = test/msgout/clear2ed.msg +out = -----BEGIN PGP MESSAGE----- diff --git a/test/e2e_test.py b/test/e2e_test.py index 37ccbb0..c730144 100644 --- a/test/e2e_test.py +++ b/test/e2e_test.py @@ -36,6 +36,10 @@ def build_config(config): cp.set("relay", "host", "localhost") cp.set("relay", "port", config["port"]) + cp.add_section("enc_keymap") + cp.set("enc_keymap", "alice@disposlab", "1CD245308F0963D038E88357973CF4D9387C44D7") + cp.set("enc_keymap", "bob@disposlab", "19CF4B47ECC9C47AFA84D4BD96F39FDA0E31BB67") + logging.debug("Created config with keyhome=%s, cert_path=%s and relay at port %d" % (config["gpg_keyhome"], config["smime_certpath"], config["port"])) return cp @@ -68,18 +72,27 @@ def compare(result, expected): fromfile='expected', tofile='output') -def report_result(message_file, expected_file, test_output): - expected = load_file(expected_file) - diff = compare(test_output, expected) - if len(list(diff)) > 0: - print "Output and the expected message (%s) don't match:" % (expected_file) +def report_result(message_file, expected, test_output): + status = None + if expected in test_output: + status = "Success" else: - print "Message %s processed properly" % (message_file) - for diff_line in diff: - print diff_line + status = "Failure" -def execute_e2e_test(message_file, expected_file, **kwargs): - test_command = "GPG_MAILGATE_CONFIG=%s %s gpg-mailgate.py %s < %s" % (kwargs["config_path"], PYTHON_BIN, kwargs["to_addr"], message_file) + print "%s %s" % (message_file.ljust(30, '.'), status) + +def frozen_time_expr(timestamp): + if timestamp is None: + return "" + else: + return "GPG_FROZEN_TIME=%s" % (timestamp) + +def execute_e2e_test(message_file, expected, **kwargs): + test_command = "GPG_MAILGATE_CONFIG=%s %s gpg-mailgate.py %s < %s" % ( + kwargs["config_path"], + PYTHON_BIN, + kwargs["to_addr"], + message_file) result_command = "%s %s %d" % (PYTHON_BIN, RELAY_SCRIPT, kwargs["port"]) logging.debug("Spawning: '%s'" % (result_command)) @@ -95,16 +108,16 @@ def execute_e2e_test(message_file, expected_file, **kwargs): logging.debug("Read %d characters of test output: '%s'" % (len(testout), testout)) - report_result(message_file, expected_file, testout) + report_result(message_file, expected, testout) -def load_config(): +def load_test_config(): cp = ConfigParser.ConfigParser() cp.read("test/e2e.ini") return cp -config = load_config() +config = load_test_config() logging.basicConfig(filename = "test/logs/e2e.log", format = "%(asctime)s %(pathname)s:%(lineno)d %(levelname)s [%(funcName)s] %(message)s", @@ -123,9 +136,10 @@ for case_no in range(1, config.getint("tests", "cases")+1): case_name = "case-%d" % (case_no) print "Executing: %s" % (config.get(case_name, "descr")) - execute_e2e_test(config.get(case_name, "in"), config.get(case_name, "out"), - config_path = config_path, - to_addr = config.get(case_name, "to"), - port = config.getint("relay", "port")) + execute_e2e_test(config.get(case_name, "in"), + config.get(case_name, "out"), + config_path = config_path, + to_addr = config.get(case_name, "to"), + port = config.getint("relay", "port")) - sleep(DELAY) + # sleep(DELAY) diff --git a/test/keyhome/crls.d/DIR.txt b/test/keyhome/crls.d/DIR.txt new file mode 100644 index 0000000..2a29a47 --- /dev/null +++ b/test/keyhome/crls.d/DIR.txt @@ -0,0 +1 @@ +v:1: diff --git a/test/keyhome/pubring.kbx b/test/keyhome/pubring.kbx new file mode 100644 index 0000000000000000000000000000000000000000..83e1be16f71dfa5c39e580f11efc92404693ebe4 GIT binary patch literal 3088 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 literal 0 HcmV?d00001 diff --git a/test/keyhome/random_seed b/test/keyhome/random_seed new file mode 100644 index 0000000000000000000000000000000000000000..960176317c5bd65a613745e2a1e40002c132c17a GIT binary patch literal 600 zcmV-e0;m0x7F#IZ%)U+ZOVphWztfSW%lqKz4IZtwX4T{y12-_@Hyy%MB#xsB_C0V%YsYhNnj25XQn? z6|qjVS~1x#705R9-Igwmkt|E=T7)XY8>Uw32WdzC=xx{=dpd*!SOx-$&n<$BaFazd zNbBP(a5{d0t1ZsHIaU(E#1Xh&|C|;aaUVykp2cNVVcJpXXwn`20BcUhV`Bi^1k+#( z|M3=TpA_`n)e8gXwrFmvS!VnHWYU#^0EGLrsV!?eQo|BlG7lr-B0Q|Tzlwe;r%fzE zEgFvGr{_Xm_sL^Ct-6RUmaT_{@3xs2#{^IvcR(V3RNvO7O=x-opoFLNA9!#(+1cii zf4d2*SgC;=5IZ*{QozD^?l~=lf2>j6MY3IY&!0b||@`^B&VW`#{a`OQxPY-eDG7K^iRr06BdDisnY@ zV-L@wph$J_P3XvZ;I>pdDh);p|M*s#9J{lB4NU5S*6#2}HSAe5VuL$tPmD0;XQD|0u0ft|&FQRsQ mc35E8&ZulJ|9348SS32JwKm?Ha2J`1dz3JZ^b0M<=Oib=*CGJ` literal 0 HcmV?d00001 diff --git a/test/keyhome/tofu.db b/test/keyhome/tofu.db new file mode 100644 index 0000000000000000000000000000000000000000..16104b58d2fd2658e1693b733251d6a74c9db7f1 GIT binary patch literal 49152 zcmeI&!Ef4D9KdlqZ6P5^*-k!GXul{ItXf+$wo?x)OT7%05=x2GoGc2D$SRl=o2ne9 zDb@Nv?7shD(k}bUcGxr6!Css7T3KH!i0Aj7f6wpp`w7W%o21od-{_eJGyZ@J<;Fs_@@rj`1#9evePx6^kjB4Zs+%`fME5J}&C z(RV~m2mT~!FG4l#Wnw4DgG6UCPu4y}`ed(OF+m1*!3HH?w<+62fV7_au)(QQKU=S_l zD%`ZTbE|Cn<^NXE)4Y*?p~AE%WH$FNwD-CY;^FLlIJvvhH>vAsI+!ozm0DgeL5I_I{1Q0*~0R#|0009ILD82yi a|BIhvc8CB12q1s}0tg_000IagfWW^;-obqU literal 0 HcmV?d00001 diff --git a/test/keyhome/trustdb.gpg b/test/keyhome/trustdb.gpg new file mode 100644 index 0000000000000000000000000000000000000000..769130320fc347ef0dcc957040c55c75dea82098 GIT binary patch literal 1200 zcmZQfFGy!*W@Ke#Vqi$@G5gAZ9WZiX7sn7CRfiEIV1dza84VXu2#lr!%F+P