aboutsummaryrefslogtreecommitdiffstats
path: root/tests/pullimap
diff options
context:
space:
mode:
authorGuilhem Moulin <guilhem@fripost.org>2019-11-18 03:41:08 +0100
committerGuilhem Moulin <guilhem@fripost.org>2019-11-18 04:37:21 +0100
commit54bed5e78cacc017ad95521f3a50ebcfe344895d (patch)
treef040957c8aa17da16d9623b27ef9fbc6408a290c /tests/pullimap
parentee040747f5f8b096f6c6ea3172826fd4c3c14053 (diff)
pullimap: Fix mangling of data lines starting with a dot.
Some LMTP servers, Dovecot's in particular, trims leading dots that are not doubled (e.g. “.foo” would become “foo”). In RFC 5322 sec. 4.5.2 explicitly says that when an RFC 5322 line starts with a '.', the character needs to be doubled.
Diffstat (limited to 'tests/pullimap')
-rw-r--r--tests/pullimap/t61
1 files changed, 55 insertions, 6 deletions
diff --git a/tests/pullimap/t b/tests/pullimap/t
index 7ae0c5f..79da3e0 100644
--- a/tests/pullimap/t
+++ b/tests/pullimap/t
@@ -6,12 +6,9 @@ step_start "\`pullimap --idle\` refuses to create the state file"
! pullimap --idle "remote" || error
step_done
-# make sure remote UIDs are 11-bytes long
-doveadm -u "remote" mailbox update --min-next-uid 1000000000 "$MAILBOX"
-
# compare mailboxes; can't compare the RFC 3501 TEXT as LMTP adds a
# Received: header.
-# TODO unset lmtp_add_received_header once avaisable in Sid:
+# TODO unset lmtp_add_received_header once available in sid:
# https://doc.dovecot.org/settings/dovecot_core_settings/#lmtp-add-received-header
list_mails_sha256() {
local u="$1" guid uid
@@ -26,7 +23,59 @@ check() {
<( list_mails_sha256 "remote" ) \
|| error "mailboxes differ"
}
+message_from() {
+ local date="$(date +"%s.%N")" sender="$1"
+ cat <<-EOF
+ From: $sender
+ To: <me@example.net>
+ Date: $(date -R -d@"$date")
+ Message-ID: <$date@example.net>
+
+ EOF
+ xxd -ps -l8 /dev/urandom
+}
+step_start "Quote envelope sender address"
+declare -a senders=("sender" "first.last" "foo-bar" \"\" "\"x\\\" #&\\\\y\"")
+for s in "${senders[@]}"; do
+ message_from "$s@example.net" | deliver -u "remote" -- -m "$MAILBOX"
+done
+pullimap "remote" || error
+check
+for s in "${senders[@]}"; do
+ grep -F " from <$s@example.net> " <"$STDERR" || error "$s"
+done
+step_done
+
+step_start "Mail without data"
+deliver -u "remote" -- -m "$MAILBOX" </dev/null
+pullimap "remote" || error
+check
+step_done
+
+step_start "Dot-leading lines"
+deliver -u "remote" -- -m "$MAILBOX" <<-EOF
+ From: alice@example.net
+ To: bob@example.net
+ Date: $(date -R)
+ Message-ID: <$(xxd -ps -l8 /dev/urandom)@example.net>
+
+ foo
+ .
+ .bar
+ ..baz
+EOF
+# we can't add a test for message data not ending with CRLF, because the
+# LMTP/SMTP client needs to add a CRLF so local and remote message
+# bodies would differ. that said, while such a message could be added
+# by IMAP and LDA, it's not valid for SMTP (RFC 5321 sec. 4.1.1.4)
+pullimap "remote" || error
+check
+step_done
+
+
+# make sure remote UIDs are 11-bytes long
+doveadm -u "remote" mailbox update --min-next-uid 1000000000 "$MAILBOX"
# Add some messages and sync
step_start "Fetching messages"
@@ -40,11 +89,11 @@ check
# same thing, but with some missing messages
for ((i = 0; i < N; i+=2)); do
sample_message | deliver -u "remote" -- -m "$MAILBOX"
- deliver -u "remote" -- -m "$MAILBOX" </dev/null # even seqnum
+ deliver -u "remote" -- -m "$MAILBOX" </dev/null # odd seqnum
done
for ((i = 0; i < N; i+=2)); do
# expunge every other message
- doveadm -u "remote" expunge mailbox "$MAILBOX" $((N-i+32))
+ doveadm -u "remote" expunge mailbox "$MAILBOX" $((N-i+32+7))
sample_message | deliver -u "remote" -- -m "$MAILBOX"
done