unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
blob ba1d8c294d66c46b86c67d0a11b3c78b50cac6c8 8102 bytes (raw)
name: test/T356-protected-headers.sh 	 # note: path name is non-authoritative(*)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
 
#!/usr/bin/env bash

# TODO:
#  * check S/MIME as well as PGP/MIME

test_description='Message decryption with protected headers'
. $(dirname "$0")/test-lib.sh || exit 1

##################################################

add_gnupg_home
# Change this if we ship a new test key
FINGERPRINT="5AEAB11F5E33DCE875DDB75B6D92612D94E46381"

add_email_corpus protected-headers

test_begin_subtest "verify protected header is not visible without decryption"
output=$(notmuch show --format=json id:protected-header@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'no_crypto:[0][0][0]!"crypto"' \
                'subject:[0][0][0]["headers"]["Subject"]="encrypted message"'

test_begin_subtest "verify protected header is visible with decryption"
output=$(notmuch show --decrypt=true --format=json id:protected-header@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:[0][0][0]["crypto"]={"decrypted": {"status": "full", "masked-headers": {"Subject": "encrypted message"}}}' \
                'subject:[0][0][0]["headers"]["Subject"]="This is a protected header"'

test_begin_subtest "when no external header is present, show masked subject as null"
output=$(notmuch show --decrypt=true --format=json id:subjectless-protected-header@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:[0][0][0]["crypto"]={"decrypted": {"status": "full", "masked-headers": {"Subject": null}}}' \
                'subject:[0][0][0]["headers"]["Subject"]="This is a protected header"'

test_begin_subtest "misplaced protected headers should not be made visible during decryption"
output=$(notmuch show --decrypt=true --format=json id:misplaced-protected-header@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:[0][0][0]["crypto"]={"decrypted": {"status": "full"}}' \
                'subject:[0][0][0]["headers"]["Subject"]="encrypted message"'

test_begin_subtest "verify double-wrapped phony protected header is not visible when inner decryption fails"
output=$(notmuch show --decrypt=true --format=json id:double-wrapped-with-phony-protected-header@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:[0][0][0]["crypto"]={"decrypted": {"status": "full"}}' \
                'subject:[0][0][0]["headers"]["Subject"]="encrypted message"'

test_begin_subtest "cleartext phony protected headers should not be made visible when decryption fails"
output=$(notmuch show --decrypt=true --format=json id:phony-protected-header-bad-encryption@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'no_crypto:[0][0][0]!"crypto"' \
                'subject:[0][0][0]["headers"]["Subject"]="encrypted message"'

test_begin_subtest "wrapped protected headers should not be made visible during decryption"
output=$(notmuch show --decrypt=true --format=json id:wrapped-protected-header@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:[0][0][0]["crypto"]={"decrypted": {"status": "partial"}}' \
                'subject:[0][0][0]["headers"]["Subject"]="[mailing-list] encrypted message"'

test_begin_subtest "internal headers without protected-header attribute should be skipped"
output=$(notmuch show --decrypt=true --format=json id:no-protected-header-attribute@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:[0][0][0]["crypto"]={"decrypted": {"status": "full"}}' \
                'subject:[0][0][0]["headers"]["Subject"]="encrypted message"'

test_begin_subtest "verify nested message/rfc822 protected header is visible"
output=$(notmuch show --decrypt=true --format=json id:nested-rfc822-message@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:[0][0][0]["crypto"]={"decrypted": {"status": "full", "masked-headers": {"Subject": "encrypted message"}}}' \
                'subject:[0][0][0]["headers"]["Subject"]="This is a message using draft-melnikov-smime-header-signing"'

test_begin_subtest "show cryptographic envelope on signed mail"
output=$(notmuch show --verify --format=json id:simple-signed-mail@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:[0][0][0]["crypto"]={"signed": {"status": [{"created": 1525609971, "fingerprint": "5AEAB11F5E33DCE875DDB75B6D92612D94E46381", "status": "good"}]}}'

test_begin_subtest "verify signed protected header"
output=$(notmuch show --verify --format=json id:signed-protected-header@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:[0][0][0]["crypto"]={"signed": {"status": [{"created": 1525350527, "fingerprint": "5AEAB11F5E33DCE875DDB75B6D92612D94E46381", "status": "good"}], "headers": ["Subject"]}}'

test_begin_subtest "protected subject does not leak by default in replies"
output=$(notmuch reply --decrypt=true --format=json id:protected-header@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:["original"]["crypto"]={"decrypted": {"status": "full", "masked-headers": {"Subject": "encrypted message"}}}' \
                'subject:["original"]["headers"]["Subject"]="This is a protected header"' \
                'reply-subject:["reply-headers"]["Subject"]="Re: encrypted message"'

test_begin_subtest "emit protected subject in reply when client is safe"
output=$(notmuch reply --decrypt=true --format=json --protected-subject id:protected-header@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:["original"]["crypto"]={"decrypted": {"status": "full", "masked-headers": {"Subject": "encrypted message"}}}' \
                'subject:["original"]["headers"]["Subject"]="This is a protected header"' \
                'reply-subject:["reply-headers"]["Subject"]="Re: This is a protected header"'

test_begin_subtest "protected subject is not indexed by default"
output=$(notmuch search --output=messages 'subject:"This is a protected header"')
test_expect_equal "$output" ''

test_begin_subtest "protected subject is indexed when cleartext is indexed"
notmuch reindex --decrypt=true id:protected-header@crypto.notmuchmail.org
output=$(notmuch search --output=messages 'subject:"This is a protected header"')
test_expect_equal "$output" 'id:protected-header@crypto.notmuchmail.org'

test_begin_subtest "indexed protected subject is visible in search"
notmuch reindex --decrypt=true id:protected-header@crypto.notmuchmail.org
output=$(notmuch search --format=json 'id:protected-header@crypto.notmuchmail.org')
test_json_nodes <<<"$output" \
                'subject:[0]["subject"]="This is a protected header"'

test_begin_subtest "protected subject is indexed when cleartext is indexed"
notmuch reindex --decrypt=true id:protected-header@crypto.notmuchmail.org
output=$(notmuch search --output=messages 'subject:"This is a protected header"')
test_expect_equal "$output" 'id:protected-header@crypto.notmuchmail.org'

test_begin_subtest "verify protected header is both signed and encrypted"
output=$(notmuch show --decrypt=true --format=json id:encrypted-signed@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:[0][0][0]["crypto"]={
                   "signed":{"status": [{"status": "good", "fingerprint": "5AEAB11F5E33DCE875DDB75B6D92612D94E46381", "created": 1525812676}],
                   "encrypted": true, "headers": ["Subject"]},"decrypted": {"status": "full", "masked-headers": {"Subject": "encrypted message"}}}' \
                'subject:[0][0][0]["headers"]["Subject"]="Rhinoceros dinner"'

test_begin_subtest "verify protected header is signed even when not masked"
output=$(notmuch show --decrypt=true --format=json id:encrypted-signed-not-masked@crypto.notmuchmail.org)
test_json_nodes <<<"$output" \
                'crypto:[0][0][0]["crypto"]={
                   "signed":{"status": [{"status": "good", "fingerprint": "5AEAB11F5E33DCE875DDB75B6D92612D94E46381", "created": 1525812676}],
                   "encrypted": true, "headers": ["Subject"]},"decrypted": {"status": "full"}}' \
                'subject:[0][0][0]["headers"]["Subject"]="Rhinoceros dinner"'

test_done

debug log:

solving ba1d8c29 ...
found ba1d8c29 in https://yhetil.org/notmuch/20180511055544.13676-20-dkg@fifthhorseman.net/
found 035b3e01 in https://yhetil.org/notmuch/20180511055544.13676-19-dkg@fifthhorseman.net/
found a77dae6d in https://yhetil.org/notmuch/20180511055544.13676-18-dkg@fifthhorseman.net/
found 687681ff in https://yhetil.org/notmuch/20180511055544.13676-16-dkg@fifthhorseman.net/
found 67d2e0cb in https://yhetil.org/notmuch/20180511055544.13676-15-dkg@fifthhorseman.net/
found 901ee60c in https://yhetil.org/notmuch/20180511055544.13676-14-dkg@fifthhorseman.net/
found c6838995 in https://yhetil.org/notmuch/20180511055544.13676-13-dkg@fifthhorseman.net/
found 242ad105 in https://yhetil.org/notmuch/20180511055544.13676-12-dkg@fifthhorseman.net/
found 9c6fe467 in https://yhetil.org/notmuch/20180511055544.13676-11-dkg@fifthhorseman.net/

applying [1/9] https://yhetil.org/notmuch/20180511055544.13676-11-dkg@fifthhorseman.net/
diff --git a/test/T356-protected-headers.sh b/test/T356-protected-headers.sh
new file mode 100755
index 00000000..9c6fe467


applying [2/9] https://yhetil.org/notmuch/20180511055544.13676-12-dkg@fifthhorseman.net/
diff --git a/test/T356-protected-headers.sh b/test/T356-protected-headers.sh
index 9c6fe467..242ad105 100755


applying [3/9] https://yhetil.org/notmuch/20180511055544.13676-13-dkg@fifthhorseman.net/
diff --git a/test/T356-protected-headers.sh b/test/T356-protected-headers.sh
index 242ad105..c6838995 100755


applying [4/9] https://yhetil.org/notmuch/20180511055544.13676-14-dkg@fifthhorseman.net/
diff --git a/test/T356-protected-headers.sh b/test/T356-protected-headers.sh
index c6838995..901ee60c 100755


applying [5/9] https://yhetil.org/notmuch/20180511055544.13676-15-dkg@fifthhorseman.net/
diff --git a/test/T356-protected-headers.sh b/test/T356-protected-headers.sh
index 901ee60c..67d2e0cb 100755


applying [6/9] https://yhetil.org/notmuch/20180511055544.13676-16-dkg@fifthhorseman.net/
diff --git a/test/T356-protected-headers.sh b/test/T356-protected-headers.sh
index 67d2e0cb..687681ff 100755


applying [7/9] https://yhetil.org/notmuch/20180511055544.13676-18-dkg@fifthhorseman.net/
diff --git a/test/T356-protected-headers.sh b/test/T356-protected-headers.sh
index 687681ff..a77dae6d 100755


applying [8/9] https://yhetil.org/notmuch/20180511055544.13676-19-dkg@fifthhorseman.net/
diff --git a/test/T356-protected-headers.sh b/test/T356-protected-headers.sh
index a77dae6d..035b3e01 100755


applying [9/9] https://yhetil.org/notmuch/20180511055544.13676-20-dkg@fifthhorseman.net/
diff --git a/test/T356-protected-headers.sh b/test/T356-protected-headers.sh
index 035b3e01..ba1d8c29 100755

Checking patch test/T356-protected-headers.sh...
Applied patch test/T356-protected-headers.sh cleanly.
Checking patch test/T356-protected-headers.sh...
Applied patch test/T356-protected-headers.sh cleanly.
Checking patch test/T356-protected-headers.sh...
Applied patch test/T356-protected-headers.sh cleanly.
Checking patch test/T356-protected-headers.sh...
Applied patch test/T356-protected-headers.sh cleanly.
Checking patch test/T356-protected-headers.sh...
Applied patch test/T356-protected-headers.sh cleanly.
Checking patch test/T356-protected-headers.sh...
Applied patch test/T356-protected-headers.sh cleanly.
Checking patch test/T356-protected-headers.sh...
Applied patch test/T356-protected-headers.sh cleanly.
Checking patch test/T356-protected-headers.sh...
Applied patch test/T356-protected-headers.sh cleanly.
Checking patch test/T356-protected-headers.sh...
Applied patch test/T356-protected-headers.sh cleanly.

index at:
100755 ba1d8c294d66c46b86c67d0a11b3c78b50cac6c8	test/T356-protected-headers.sh

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).