mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 04:18:08 +01:00
c6b49ae752
Since commit 2f8871df6e
notmuch has been
using a function (show_part_content) originally written only for text
parts to save all MIME parts. The problem with this is that this
function converts CRLF pairs to LF only and optionally converts to
UTF-8 encoding. These two conversions have the potential to corrupt
binary data when passed through the function.
This test demonstrates that corruption, and so fails currently, until
we fix the bug.
365 lines
14 KiB
Bash
Executable file
365 lines
14 KiB
Bash
Executable file
#!/usr/bin/env bash
|
||
test_description="output of multipart message"
|
||
. ./test-lib.sh
|
||
|
||
cat <<EOF > ${MAIL_DIR}/multipart
|
||
From: Carl Worth <cworth@cworth.org>
|
||
To: cworth@cworth.org
|
||
Subject: Multipart message
|
||
Date: Tue, 05 Jan 2001 15:43:57 -0000
|
||
User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
|
||
Message-ID: <87liy5ap00.fsf@yoom.home.cworth.org>
|
||
MIME-Version: 1.0
|
||
Content-Type: multipart/signed; boundary="==-=-=";
|
||
micalg=pgp-sha1; protocol="application/pgp-signature"
|
||
|
||
--==-=-=
|
||
Content-Type: multipart/mixed; boundary="=-=-="
|
||
|
||
--=-=-=
|
||
Content-Type: message/rfc822
|
||
Content-Disposition: inline
|
||
|
||
From: Carl Worth <cworth@cworth.org>
|
||
To: cworth@cworth.org
|
||
Subject: html message
|
||
Date: Tue, 05 Jan 2001 15:42:57 -0000
|
||
User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
|
||
Message-ID: <87liy5ap01.fsf@yoom.home.cworth.org>
|
||
MIME-Version: 1.0
|
||
Content-Type: text/html
|
||
|
||
<p>This is an embedded message, with a single html part.</p>
|
||
|
||
--=-=-=
|
||
Content-Disposition: attachment; filename=attachment
|
||
|
||
This is a text attachment.
|
||
|
||
--=-=-=
|
||
|
||
And this message is signed.
|
||
|
||
-Carl
|
||
|
||
--=-=-=--
|
||
|
||
--==-=-=
|
||
Content-Type: application/pgp-signature
|
||
|
||
-----BEGIN PGP SIGNATURE-----
|
||
Version: GnuPG v1.4.11 (GNU/Linux)
|
||
|
||
iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
|
||
W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
|
||
=zkga
|
||
-----END PGP SIGNATURE-----
|
||
--==-=-=--
|
||
EOF
|
||
|
||
cat <<EOF > ${MAIL_DIR}/base64-part-with-crlf
|
||
From: Carl Worth <cworth@cworth.org>
|
||
To: cworth@cworth.org
|
||
Subject: Test message with a BASE64 encoded binary containing CRLF pair
|
||
Date: Tue, 05 Jan 2001 15:43:57 -0000
|
||
User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
|
||
Message-ID: <base64-part-with-crlf>
|
||
MIME-Version: 1.0
|
||
Content-Type: multipart/mixed; boundary="==-=-=";
|
||
|
||
--==-=-=
|
||
|
||
The attached BASE64-encoded part expands to a binary containing a CRLF
|
||
pair (that is one bye of 0x0D followed by one byte of 0x0A). This is
|
||
designed to ensure that notmuch is not corrupting the output of this
|
||
part by converting the CRLF pair to an LF only (as would be appropriate
|
||
for display of a text part on a Linux system, for example).
|
||
|
||
The part should be a 3-byte file with the following sequence of 3
|
||
hexadecimal bytes:
|
||
|
||
EF 0D 0A
|
||
|
||
--==-=-=
|
||
Content-Type: application/octet-stream
|
||
Content-Disposition: attachment; filename=crlf.bin
|
||
Content-Transfer-Encoding: base64
|
||
|
||
7w0K
|
||
--==-=-=--
|
||
EOF
|
||
increment_mtime "$MAIL_DIR"
|
||
notmuch new > /dev/null
|
||
|
||
test_begin_subtest "--format=text --part=0, full message"
|
||
output=$(notmuch show --format=text --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
"message{ id:87liy5ap00.fsf@yoom.home.cworth.org depth:0 match:1 filename:${MAIL_DIR}/multipart
|
||
header{
|
||
Carl Worth <cworth@cworth.org> (2001-01-05) (attachment inbox signed unread)
|
||
Subject: Multipart message
|
||
From: Carl Worth <cworth@cworth.org>
|
||
To: cworth@cworth.org
|
||
Date: Tue, 05 Jan 2001 15:43:57 -0000
|
||
header}
|
||
body{
|
||
part{ ID: 1, Content-type: multipart/signed
|
||
part{ ID: 2, Content-type: multipart/mixed
|
||
part{ ID: 3, Content-type: message/rfc822
|
||
part{ ID: 4, Content-type: text/html
|
||
Non-text part: text/html
|
||
part}
|
||
part}
|
||
attachment{ ID: 5, Content-type: text/plain
|
||
Attachment: attachment (text/plain)
|
||
This is a text attachment.
|
||
attachment}
|
||
part{ ID: 6, Content-type: text/plain
|
||
And this message is signed.
|
||
|
||
-Carl
|
||
part}
|
||
part}
|
||
part{ ID: 7, Content-type: application/pgp-signature
|
||
Non-text part: application/pgp-signature
|
||
part}
|
||
part}
|
||
body}
|
||
message}"
|
||
|
||
test_begin_subtest "--format=text --part=1, message body"
|
||
output=$(notmuch show --format=text --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
"part{ ID: 1, Content-type: multipart/signed
|
||
part{ ID: 2, Content-type: multipart/mixed
|
||
part{ ID: 3, Content-type: message/rfc822
|
||
part{ ID: 4, Content-type: text/html
|
||
Non-text part: text/html
|
||
part}
|
||
part}
|
||
attachment{ ID: 5, Content-type: text/plain
|
||
Attachment: attachment (text/plain)
|
||
This is a text attachment.
|
||
attachment}
|
||
part{ ID: 6, Content-type: text/plain
|
||
And this message is signed.
|
||
|
||
-Carl
|
||
part}
|
||
part}
|
||
part{ ID: 7, Content-type: application/pgp-signature
|
||
Non-text part: application/pgp-signature
|
||
part}
|
||
part}"
|
||
|
||
test_begin_subtest "--format=text --part=2, multipart/mixed"
|
||
output=$(notmuch show --format=text --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
"part{ ID: 2, Content-type: multipart/mixed
|
||
part{ ID: 3, Content-type: message/rfc822
|
||
part{ ID: 4, Content-type: text/html
|
||
Non-text part: text/html
|
||
part}
|
||
part}
|
||
attachment{ ID: 5, Content-type: text/plain
|
||
Attachment: attachment (text/plain)
|
||
This is a text attachment.
|
||
attachment}
|
||
part{ ID: 6, Content-type: text/plain
|
||
And this message is signed.
|
||
|
||
-Carl
|
||
part}
|
||
part}"
|
||
|
||
test_begin_subtest "--format=text --part=3, rfc822 multipart"
|
||
output=$(notmuch show --format=text --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
"part{ ID: 3, Content-type: message/rfc822
|
||
part{ ID: 4, Content-type: text/html
|
||
Non-text part: text/html
|
||
part}
|
||
part}"
|
||
|
||
test_begin_subtest "--format=text --part=4, html part"
|
||
output=$(notmuch show --format=text --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
"part{ ID: 4, Content-type: text/html
|
||
Non-text part: text/html
|
||
part}"
|
||
|
||
test_begin_subtest "--format=text --part=5, inline attachement"
|
||
output=$(notmuch show --format=text --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
"attachment{ ID: 5, Content-type: text/plain
|
||
Attachment: attachment (text/plain)
|
||
This is a text attachment.
|
||
attachment}"
|
||
|
||
test_begin_subtest "--format=text --part=6, plain text part"
|
||
output=$(notmuch show --format=text --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
"part{ ID: 6, Content-type: text/plain
|
||
And this message is signed.
|
||
|
||
-Carl
|
||
part}"
|
||
|
||
test_begin_subtest "--format=text --part=7, pgp signature (unverified)"
|
||
output=$(notmuch show --format=text --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
"part{ ID: 7, Content-type: application/pgp-signature
|
||
Non-text part: application/pgp-signature
|
||
part}"
|
||
|
||
test_expect_success \
|
||
"--format=text --part=8, no part, expect error" \
|
||
"notmuch show --format=text --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
|
||
|
||
test_begin_subtest "--format=json --part=0, full message"
|
||
output=$(notmuch show --format=json --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'{"id": "87liy5ap00.fsf@yoom.home.cworth.org", "match": true, "filename": "'"${MAIL_DIR}/multipart"'", "timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["attachment","inbox","signed","unread"], "headers": {"Subject": "Multipart message", "From": "Carl Worth <cworth@cworth.org>", "To": "cworth@cworth.org", "Cc": "", "Bcc": "", "Date": "Tue, 05 Jan 2001 15:43:57 -0000"}, "body": [{"id": 1, "content-type": "multipart/signed", "content": [{"id": 2, "content-type": "multipart/mixed", "content": [{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}, {"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, {"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}, {"id": 7, "content-type": "application/pgp-signature"}]}]}'
|
||
|
||
test_begin_subtest "--format=json --part=1, message body"
|
||
output=$(notmuch show --format=json --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'{"id": 1, "content-type": "multipart/signed", "content": [{"id": 2, "content-type": "multipart/mixed", "content": [{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}, {"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, {"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}, {"id": 7, "content-type": "application/pgp-signature"}]}'
|
||
|
||
test_begin_subtest "--format=json --part=2, multipart/mixed"
|
||
output=$(notmuch show --format=json --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'{"id": 2, "content-type": "multipart/mixed", "content": [{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}, {"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, {"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}'
|
||
|
||
test_begin_subtest "--format=json --part=3, rfc822 multipart"
|
||
output=$(notmuch show --format=json --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}'
|
||
|
||
test_begin_subtest "--format=json --part=4, html part"
|
||
output=$(notmuch show --format=json --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'{"id": 4, "content-type": "text/html"}'
|
||
|
||
test_begin_subtest "--format=json --part=5, inline attachment"
|
||
output=$(notmuch show --format=json --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'{"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}'
|
||
|
||
test_begin_subtest "--format=json --part=6, plain text part"
|
||
output=$(notmuch show --format=json --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'{"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}'
|
||
|
||
test_begin_subtest "--format=json --part=7, pgp signature (unverified)"
|
||
output=$(notmuch show --format=json --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'{"id": 7, "content-type": "application/pgp-signature"}'
|
||
|
||
test_expect_success \
|
||
"--format=json --part=8, no part, expect error" \
|
||
"notmuch show --format=json --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
|
||
|
||
test_begin_subtest "--format=raw"
|
||
output=$(notmuch show --format=raw 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" "$(cat "${MAIL_DIR}"/multipart)"
|
||
|
||
test_begin_subtest "--format=raw --part=0, full message"
|
||
output=$(notmuch show --format=raw --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" "$(cat "${MAIL_DIR}"/multipart)"
|
||
|
||
test_begin_subtest "--format=raw --part=1, message body"
|
||
output=$(notmuch show --format=raw --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'<p>This is an embedded message, with a single html part.</p>
|
||
This is a text attachment.
|
||
And this message is signed.
|
||
|
||
-Carl
|
||
-----BEGIN PGP SIGNATURE-----
|
||
Version: GnuPG v1.4.11 (GNU/Linux)
|
||
|
||
iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
|
||
W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
|
||
=zkga
|
||
-----END PGP SIGNATURE-----'
|
||
|
||
test_begin_subtest "--format=raw --part=2, multipart/mixed"
|
||
output=$(notmuch show --format=raw --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'<p>This is an embedded message, with a single html part.</p>
|
||
This is a text attachment.
|
||
And this message is signed.
|
||
|
||
-Carl'
|
||
|
||
test_begin_subtest "--format=raw --part=3, rfc822 multipart"
|
||
output=$(notmuch show --format=raw --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'<p>This is an embedded message, with a single html part.</p>'
|
||
|
||
test_begin_subtest "--format=raw --part=4, html part"
|
||
output=$(notmuch show --format=raw --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'<p>This is an embedded message, with a single html part.</p>'
|
||
|
||
test_begin_subtest "--format=raw --part=5, inline attachment"
|
||
output=$(notmuch show --format=raw --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'This is a text attachment.'
|
||
|
||
test_begin_subtest "--format=raw --part=6, plain text part"
|
||
output=$(notmuch show --format=raw --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'And this message is signed.
|
||
|
||
-Carl'
|
||
|
||
test_begin_subtest "--format=raw --part=7, pgp signature (unverified)"
|
||
output=$(notmuch show --format=raw --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" \
|
||
'-----BEGIN PGP SIGNATURE-----
|
||
Version: GnuPG v1.4.11 (GNU/Linux)
|
||
|
||
iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
|
||
W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
|
||
=zkga
|
||
-----END PGP SIGNATURE-----'
|
||
|
||
test_expect_success \
|
||
"--format=raw --part=8, no part, expect error" \
|
||
"notmuch show --format=raw --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
|
||
|
||
test_begin_subtest "--format=mbox"
|
||
output=$(notmuch show --format=mbox 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" "$(printf "From cworth@cworth.org Fri Jan 5 15:43:57 2001\n"; cat "${MAIL_DIR}"/multipart)"
|
||
|
||
test_expect_success \
|
||
"--format=mbox --part=1, incompatible, expect error" \
|
||
"! notmuch show --format=mbox --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
|
||
|
||
test_begin_subtest "'notmuch reply' to a multipart message"
|
||
output=$(notmuch reply 'id:87liy5ap00.fsf@yoom.home.cworth.org')
|
||
test_expect_equal "$output" "From: Notmuch Test Suite <test_suite@notmuchmail.org>
|
||
Subject: Re: Multipart message
|
||
To: Carl Worth <cworth@cworth.org>, cworth@cworth.org
|
||
In-Reply-To: <87liy5ap00.fsf@yoom.home.cworth.org>
|
||
References: <87liy5ap00.fsf@yoom.home.cworth.org>
|
||
|
||
On Tue, 05 Jan 2001 15:43:57 -0000, Carl Worth <cworth@cworth.org> wrote:
|
||
Non-text part: multipart/signed
|
||
Non-text part: multipart/mixed
|
||
Non-text part: message/rfc822
|
||
Non-text part: text/html
|
||
> This is a text attachment.
|
||
> And this message is signed.
|
||
>
|
||
> -Carl
|
||
Non-text part: application/pgp-signature"
|
||
|
||
test_begin_subtest "'notmuch show --part' does not corrupt a part with CRLF pair"
|
||
notmuch show --format=raw --part=3 id:base64-part-with-crlf > crlf.out
|
||
echo -n -e "\xEF\x0D\x0A" > crlf.expected
|
||
test_expect_equal_file crlf.out crlf.expected
|
||
|
||
test_done
|