[PATCH] restore: Be more liberal in which data to accept.

Thomas Schwinge thomas at schwinge.name
Sat Oct 29 03:40:07 PDT 2011


From: Thomas Schwinge <thomas at schwinge.name>

There are ``Message-ID''s out in the wild that contain spaces.

---


Hi!

Carl, the main question for you is: does this break sup-import
operability?


Spammers are quite inventive for creating ``interesting Messages-ID''s.
Apparently, notmuch handles these fine internally, but it breaks a
dump/restore cycle:

    $ notmuch restore < ~/tmp/Mail-notmuch_dump/dump
    No filename given. Reading dump from stdin.
    Warning: Ignoring invalid input line: 3791856948.991306994491 at m0.net Received:fromdialup-62.215.274.4.dial1.stamford([62.215.274.4]  ([...])
    Warning: Ignoring invalid input line: PM200010:29:54 AM ([...])
    Warning: Ignoring invalid input line: PM200010:51:48 AM ([...])
    Warning: Ignoring invalid input line: PM200011:47:35 AM ([...])
    Warning: Ignoring invalid input line: PM200011:48:46 AM ([...])
    Warning: Ignoring invalid input line: PM200011:50:10 AM ([...])
    Warning: Ignoring invalid input line: PM200012:21:05 AM ([...])
    Warning: Ignoring invalid input line: PM200012:21:17 AM ([...])
    Warning: Ignoring invalid input line: PM200012:21:18 AM ([...])
    Warning: Ignoring invalid input line: PM200012:21:32 AM ([...])
    Warning: Ignoring invalid input line: PM20001:48:38 PM ([...])
    Warning: Ignoring invalid input line: PM20001:53:07 PM ([...])
    Warning: Ignoring invalid input line: PM20004:01:48 AM ([...])
    Warning: Ignoring invalid input line: PM20004:01:59 AM ([...])
    Warning: Ignoring invalid input line: PM20004:10:44 AM ([...])
    Warning: Ignoring invalid input line: PM20004:20:00 AM ([...])
    Warning: Ignoring invalid input line: PM20005:06:50 PM ([...])
    Warning: Ignoring invalid input line: PM20005:14:17 AM ([...])
    Warning: Ignoring invalid input line: PM20005:32:15 PM ([...])
    Warning: Ignoring invalid input line: PM20005:32:22 PM ([...])
    Warning: Ignoring invalid input line: PM20005:33:05 PM ([...])
    Warning: Ignoring invalid input line: PM20005:33:57 AM ([...])
    Warning: Ignoring invalid input line: PM20006:24:12 AM ([...])
    Warning: Ignoring invalid input line: PM20006:25:04 AM ([...])
    Warning: Ignoring invalid input line: PM20006:25:49 AM ([...])
    Warning: Ignoring invalid input line: PM20006:26:11 AM ([...])
    Warning: Ignoring invalid input line: PM20007:05:34 PM ([...])
    Warning: Ignoring invalid input line: PM2000PM 04:09:15 ([...])
    Warning: Ignoring invalid input line: PM2000¿ÀÀü 11:07:41 ([...])
    Warning: Ignoring invalid input line: PM2000¿ÀÈÄ 12:42:47 ([...])
    Warning: Ignoring invalid input line: PM2000¿ÀÈÄ 12:42:48 ([...])
    Warning: Ignoring invalid input line: PM2000¿ÀÈÄ 5:58:28 ([...])
    Warning: Ignoring invalid input line: PM2000¿ÀÈÄ 6:30:51 ([...])
    Warning: Ignoring invalid input line: Prospect Mailer 20000:37:04 ([...])
    Warning: Ignoring invalid input line: Prospect Mailer 20000:37:09 ([...])
    Warning: Ignoring invalid input line: Prospect Mailer 20000:37:11 ([...])
    Warning: Ignoring invalid input line: Prospect Mailer 20000:37:12 ([...])
    Warning: Ignoring invalid input line: Prospect Mailer 20000:37:45 ([...])
    Warning: Ignoring invalid input line: Prospect Mailer 20000:38:10 ([...])

Thus, dump; remove all tags; restore is not nullipotent, which it should
be.

Especially noteworthy is probably the first one: it happens to have
gotten a Received line mangled into the Message-ID, and it ends with a
space character.

Some more from the freak show:

    $MESSAGE_ID ([...])
    %CUSTOM_CHAR[8-10]$%CUSTOM_CHAR[8-10]$%CUSTOM_CHAR[8-10]@%CUSTOM_DOMAIN.msn.com ([...])
    %RNDDIGIT1025.%RNDDIGIT15%RNDLCCHAR15%RNDDIGIT110%RNDLCCHAR13@ ([...])
    %RNDDIGIT1025.%RNDDIGIT15%RNDLCCHAR15%RNDDIGIT110ucp at yahoo.com ([...])
    %RNDDIGIT1025.%RNDDIGIT15%RNDLCCHAR15%RNDDIGIT110vs at yahoo.com ([...])
    %RNDDIGIT27eq52md1$9rg57p%RNDDIGIT14$277ts40lsh@%RNDWORD13ivo4068 ([...])
    %RNDDIGIT27g10u874$3cqh62f%RNDDIGIT14$7fgo121wnwt@%RNDWORD13quw32712 ([...])
    %RNDDIGIT27mog75vx711$541xqm480xc%RNDDIGIT14$031nq1pk@%RNDWORD13av2979 ([...])
    %RNDDIGIT27nqf761drk7$7l4mza%RNDDIGIT14$96ijq17zq@%RNDWORD13b1779 ([...])
    %RNDDIGIT27q0tcg10$94pcn1mw%RNDDIGIT14$7x77pztx@%RNDWORD13ny7619 ([...])
    %RNDDIGIT27uiw866tv49$5c3rg%RNDDIGIT14$6jl43vv@%RNDWORD13uwh17820 ([...])
    %RNDDIGIT27x966lug3$0pr016r%RNDDIGIT14$8ye15k@%RNDWORD13qps90907 ([...])
    %RNDDIGIT310%RNDLCCHAR15%RNDDIGIT15%RNDLCCHAR15$%RNDDIGIT17%RNDDIGIT13%RNDLCCHAR13%RNDDIGIT13$%RNDDIGIT15%RNDLCCHAR13%RNDDIGIT13%RNDLCCHAR13%RNDDIGIT13@ ([...])
    %RNDDIGIT310%RNDLCCHAR15%RNDDIGIT15%RNDLCCHAR15$%RNDDIGIT17%RNDDIGIT13%RNDLCCHAR13%RNDDIGIT13$%RNDDIGIT15%RNDLCCHAR13%RNDDIGIT13%RNDLCCHAR13%RNDDIGIT13 at bambi ([...])
    %RNDDIGIT310%RNDLCCHAR15%RNDDIGIT15%RNDLCCHAR15$%RNDDIGIT17%RNDDIGIT13%RNDLCCHAR13%RNDDIGIT13$%RNDDIGIT15%RNDLCCHAR13%RNDDIGIT13%RNDLCCHAR13%RNDDIGIT13 at wheelchair ([...])
    %RNDDIGIT520.%RNDDIGIT110.%RNDDIGIT110 at -%RNDLCCHAR13%RNDDIGIT13. ([...])
    %RNDDIGIT520.%RNDDIGIT110.%RNDDIGIT110 at -hi3.yahoo.com ([...])
    %RNDDIGIT520.%RNDDIGIT110.%RNDDIGIT110 at -xz24.yahoo.com ([...])
    %RNDDIGIT520.%RNDDIGIT110.%RNDDIGIT110 at lutanist-%RNDLCCHAR13%RNDDIGIT13.msn.com ([...])
    %RNDDIGIT520.%RNDDIGIT110.%RNDDIGIT110 at millipede-jfq402.yahoo.com ([...])
    %RNDDIGIT520.%RNDDIGIT110.%RNDDIGIT110 at referenda-sgw04.yahoo.com ([...])
    %RNDDIGIT715.h8OheY%RNDDIGIT28 at proffer5.o'brien%RNDDIGIT2yahoo.com ([...])
    %RNDDIGIT715.jt36NNBvbF%RNDDIGIT28 at schematic5.myers%RNDDIGIT2yahoo.com ([...])
    %RNDDIGIT715.wz394MICrdY%RNDDIGIT28 at agriculture6.city%RNDDIGIT2yahoo.com ([...])
    %RNDLCCHAR13%RNDDIGIT13%RNDLCCHAR13%RNDDIGIT13-%RNDDIGIT520-%RNDDIGIT1035@%RNDDIGIT13 ([...])
    %RNDLCCHAR13%RNDDIGIT13%RNDLCCHAR13%RNDDIGIT13-%RNDDIGIT520-%RNDDIGIT1035 at pontiac%RNDDIGIT13 ([...])

Someone needs to improve their scripting language abilities...  But on
the other hand:

    $ notmuch search --output=files -- 'id:"$MESSAGE_ID"' | wc -l
    25

This goes by the lines of ``notmuch as a spam filter'': these are
different spam messages, but due to notmuch's Message-ID-based keying,
they are all coalesced into one.  ;-)

    000010ff21d1$00005c94$000024ca at smtp.mail.gr^M ([...])
    0000247e7459$0000617b$000030b1 at mx1.777.net.cn^M ([...])
    200107261918.PAA15837 at unix.harrisondigital.com^M ([...])
    20050131113558.GB4396 at dragonfly.hU^S at hU^S@ ([...])
    5614105.1027079773228.JavaMail.à^U±@à^U± ([...])
    6428921.1027079772968.JavaMail.à^U±@à^U± ([...])
    6864195.1027080005012.JavaMail.à^U±@à^U± ([...])

Yes, these are really embedded carriage returns (^M; and whatever ^S and
^U are).  These are handled fine.  (Replaced in this text by their ^x
representation.)

    1IO\225y at -00094R-XB@BSN-77-184-114.dsl.siol.net ([...])
    1IP\225o at -000C29-BR@shcn-4.unm.edu ([...])
    SAK.2002.05.10.kmfogibc@\212ù\222è ([...])
    SAK.2002.05.11.ckbbpbpe@\212ù\222è ([...])
    SAK.2002.05.11.qmgoaoai@\212ù\222è ([...])
    SAK.2002.05.12.cfolrrgc@\212ù\222è ([...])
    SAK.2002.05.12.chpbngla@\212ù\222è ([...])
    SAK.2002.05.12.cooajnlj@\212ù\222è ([...])
    SAK.2002.05.12.folfrldb@\212ù\222è ([...])
    SAK.2002.05.12.ncphnarn@\212ù\222è ([...])
    SAK.2002.05.12.tcjbjsoo@\212ù\222è ([...])

Embedded non-ASCII characters \212, \222, \225.  These are handled fine.
(Replaced in this text by their octal \xxx representation.)


Another approach would be to detect invalid Message-IDs (only allow valid
ones as per the standard) at notmuch new time, and replace these with a
generated Message-ID (as if it's missing completely).  But I don't think
we should generated a Message-ID unless we really need to.


Grüße,
 Thomas


---

 notmuch-restore.c |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/notmuch-restore.c b/notmuch-restore.c
index e4a5355..122c3e7 100644
--- a/notmuch-restore.c
+++ b/notmuch-restore.c
@@ -56,12 +56,11 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
 	input = stdin;
     }
 
-    /* Dump output is one line per message. We match a sequence of
-     * non-space characters for the message-id, then one or more
-     * spaces, then a list of space-separated tags as a sequence of
+    /* The input data is one line per message.  First comes the message-id,
+     * then one space, then a list of space-separated tags as a sequence of
      * characters within literal '(' and ')'. */
     xregcomp (&regex,
-	      "^([^ ]+) \\(([^)]*)\\)$",
+	      "^(.+) \\(([^)]*)\\)$",
 	      REG_EXTENDED);
 
     while ((line_len = getline (&line, &line_size, input)) != -1) {
-- 
tg: (3bafdfc..) t/restore_liberal_regex (depends on: baseline)


More information about the notmuch mailing list