diff --git a/test/prepare-schleuder.sh b/test/prepare-schleuder.sh index 3de2e58..f32c5f2 100755 --- a/test/prepare-schleuder.sh +++ b/test/prepare-schleuder.sh @@ -44,6 +44,7 @@ gen_key andy.example@example.org mv /tmp/andy.example@example.org.asc /tmp/andy.example@example.org.1.asc gen_key aaron.example@example.org aaron.example@example.net gen_key amy.example@example.org +gen_key alice.example@example.org alice.example@example.net install -m 0700 -d /tmp/gpg export GNUPGHOME=/tmp/gpg @@ -75,6 +76,7 @@ schleuder-cli subscriptions new test-north@schleuder.example.org arno.example@ex subscribe test-east@schleuder.example.org anna.example@example.org # key should be updated subscribe test-east@schleuder.example.org anotherspammer@example.org # should not be subscribed subscribe test-east@schleuder.example.org aaron.example@example.org # should remain as-is +subscribe test-east@schleuder.example.org alice.example@example.net # should be subscriped despite conflict subscribe test-south@schleuder.example.org andy.example@example.org # should be subscribed despite key conflict subscribe test-south@schleuder.example.org amy.example@example.org # should be subscribed - conflict but same key @@ -84,6 +86,7 @@ sleep 5 # to get different subscription dates schleuder-cli subscriptions new test-west@schleuder.example.org andy.example@example.org /tmp/andy.example@example.org.1.asc # should not be subscribed subscribe test-west@schleuder.example.org amy.example@example.org # should be subscribed - conflict but same key +subscribe test-west@schleuder.example.org alice.example@example.org # should not be subscriped - key used by other UID schleuder-cli subscriptions new test2-global@schleuder.example.org arno.example@example.org # should be unsubscribed - no key diff --git a/test/report.py b/test/report.py index 05a21c1..e608fbf 100755 --- a/test/report.py +++ b/test/report.py @@ -38,6 +38,7 @@ expected_subscribers = subscribermap([ 'aaron.example@example.org', 'admin@example.org', 'alex.example@example.org', + 'alice.example@example.net', 'amy.example@example.org', 'andy.example@example.org', 'anna.example@example.org', @@ -62,6 +63,7 @@ expected_keys = keymap([ 'aaron.example@example.org', 'admin@example.org', 'alex.example@example.org', + 'alice.example@example.org', # schleuder returns the primary UID 'amy.example@example.org', 'andy.example@example.org', 'anna.example@example.org', @@ -84,20 +86,23 @@ if len(keysdiff) > 0: # Test mbox mbox = mailbox.mbox('/var/spool/mail/root') -if len(mbox) != 2: - print(f'Expected 2 messages in mbox, got {len(mbox)}') +if len(mbox) != 4: + print(f'Expected 4 messages in mbox, got {len(mbox)}') exit(1) -_, msg1 = mbox.popitem() -_, msg2 = mbox.popitem() +messages = [] +for i in range(4): + messages.append(mbox.popitem()[1]) mbox.close() -if 'X-MultiSchleuder-Digest' not in msg1: - msg1, msg2 = msg2, msg1 +msg1 = [m for m in messages if m['To'] == 'andy.example@example.org'][0] +msg2 = [m for m in messages if m['To'] == 'admin@example.org'][0] +msg3 = [m for m in messages if m['To'] == 'alice.example@example.org'][0] +msg4 = [m for m in messages if m['To'] == 'alice.example@example.net'][0] if 'X-MultiSchleuder-Digest' not in msg1: print(f'Key conflict message should have a X-MultiSchleuder-Digest header, missing') exit(1) -digest = msg1['X-MultiSchleuder-Digest'].strip() +digest1 = msg1['X-MultiSchleuder-Digest'].strip() if msg1['From'] != 'test-global-owner@schleuder.example.org': print(f'Expected "From: test-global-owner@schleuder.example.org", got {msg1["From"]}') exit(1) @@ -127,27 +132,74 @@ if msg2['Precedence'] != 'list': print(f'Expected "Precedence: list", got {msg2["Precedence"]}') exit(1) +if 'X-MultiSchleuder-Digest' not in msg3: + print(f'User conflict message should have a X-MultiSchleuder-Digest header, missing') + exit(1) +digest3 = msg3['X-MultiSchleuder-Digest'].strip() +if msg3['From'] != 'test-global-owner@schleuder.example.org': + print(f'Expected "From: test-global-owner@schleuder.example.org", got {msg3["From"]}') + exit(1) +if msg3['To'] != 'alice.example@example.org': + print(f'Expected "To: alice.example@example.org", got {msg3["To"]}') + exit(1) +if msg3['Auto-Submitted'] != 'auto-generated': + print(f'Expected "Auto-Submitted: auto-generated", got {msg3["Auto-Submitted"]}') + exit(1) +if msg3['Precedence'] != 'list': + print(f'Expected "Precedence: list", got {msg3["Precedence"]}') + exit(1) + +if 'X-MultiSchleuder-Digest' not in msg4: + print(f'User conflict message should have a X-MultiSchleuder-Digest header, missing') + exit(1) +digest4 = msg4['X-MultiSchleuder-Digest'].strip() +if msg4['From'] != 'test-global-owner@schleuder.example.org': + print(f'Expected "From: test-global-owner@schleuder.example.org", got {msg4["From"]}') + exit(1) +if msg4['To'] != 'alice.example@example.net': + print(f'Expected "To: alice.example@example.net", got {msg4["To"]}') + exit(1) +if msg4['Auto-Submitted'] != 'auto-generated': + print(f'Expected "Auto-Submitted: auto-generated", got {msg4["Auto-Submitted"]}') + exit(1) +if msg4['Precedence'] != 'list': + print(f'Expected "Precedence: list", got {msg4["Precedence"]}') + exit(1) + +if digest3 != digest4: + print(f'User conflict messages should have the same digest, got: "{digest3}" vs "{digest4}"') + exit(1) + gpg1 = subprocess.Popen(['/usr/bin/gpg', '-d'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) gpg1o, _ = gpg1.communicate(msg1.get_payload()[1].get_payload(decode=True)) -print(f'Key conflict message (decrypted):\n{gpg1o.decode()}') +print(f'\nKey conflict message (decrypted):\n{gpg1o.decode()}') gpg2 = subprocess.Popen(['/usr/bin/gpg', '-d'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) gpg2o, _ = gpg2.communicate(msg2.get_payload()[1].get_payload(decode=True)) -print(f'Admin report message (decrypted):\n{gpg2o.decode()}') +print(f'\nAdmin report message (decrypted):\n{gpg2o.decode()}') +gpg3 = subprocess.Popen(['/usr/bin/gpg', '-d'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) +gpg3o, _ = gpg3.communicate(msg3.get_payload()[1].get_payload(decode=True)) +print(f'\nUser conflict message (decrypted):\n{gpg3o.decode()}') # Test conflict statefile with open('/tmp/conflict.json', 'r') as f: conflict = json.load(f) -if len(conflict) != 1: +if len(conflict) != 2: print('Expected 1 entry in conflict statefile, got:') print(json.dumps(conflict)) exit(1) -if digest not in conflict: - print(f'Expected key "{digest}" in conflict statefile, got:') +if digest1 not in conflict: + print(f'Expected key "{digest1}" in conflict statefile, got:') + print(json.dumps(conflict)) + exit(1) +if digest3 not in conflict: + print(f'Expected key "{digest3}" in conflict statefile, got:') print(json.dumps(conflict)) exit(1)