pick(1) decode rfc2047-fields
authorDavid Levine <levinedl@acm.org>
Sun, 25 Nov 2012 15:06:20 +0000 (09:06 -0600)
committerPhilipp Takacs <philipp@bureaucracy.de>
Wed, 16 Sep 2015 12:12:01 +0000 (14:12 +0200)
Attempt to decode each header field as if it were
MIME encoded.

test/tests/pick/test-rfc2047 [new file with mode: 0644]
uip/pick.c

diff --git a/test/tests/pick/test-rfc2047 b/test/tests/pick/test-rfc2047
new file mode 100644 (file)
index 0000000..b89a71a
--- /dev/null
@@ -0,0 +1,32 @@
+#!/bin/sh
+######################################################
+#
+# Test pick parse rfc2047-header
+#
+######################################################
+
+set -e
+
+expected_err=$MH_TEST_DIR/$$.expected_err
+expected_out=$MH_TEST_DIR/$$.expected_out
+actual_err=$MH_TEST_DIR/$$.actual_err
+actual_out=$MH_TEST_DIR/$$.actual_out
+
+# Test MIME-encoded header.
+cat >"$MH_TEST_DIR/Mail/inbox/13" <<EOF
+From: Test13 <test13@example.com>
+To: Some User <user@example.com>
+Date: Fri, 29 Sep 2006 00:00:00
+Message-Id: 13@test.nmh
+Subject: =?us-ascii?q?=66=6f=6f?=
+ =?utf-8?q?=62=61=72?=
+
+This is message number 13, with MIME-encoded Subject "foobar".
+EOF
+
+echo 13 >"$expected_out"
+cat /dev/null > $expected_err
+
+pick -subject foobar 13 > $actual_out 2> $actual_err
+diff -u $expected_err $actual_err
+diff -u $expected_out $actual_out
index 819d81a..8448d96 100644 (file)
@@ -381,6 +381,7 @@ static struct swit parswit[] = {
 
 
 static char linebuf[LBSIZE + 1];
+static char decoded_linebuf[LBSIZE + 1];
 
 /* the magic array for case-independence */
 static char cc[] = {
@@ -1016,6 +1017,13 @@ plist
                p1 = linebuf;
                p2 = n->n_expbuf;
 
+               /* Attempt to decode as a MIME header.  If it's the last header,
+                * body will be 1 and lf will be at least 1. */
+               if ((body == 0 || lf > 0)  &&
+                    decode_rfc2047 (linebuf, decoded_linebuf, sizeof decoded_linebuf)) {
+                               p1 = decoded_linebuf;
+               }
+
                if (n->n_circf) {
                        if (advance(p1, p2))
                                return 1;