about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/View.pm11
-rw-r--r--t/view.t14
2 files changed, 23 insertions, 2 deletions
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index 30d8e3e8..38e35bf3 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -455,6 +455,15 @@ sub _parent_headers {
         $rv;
 }
 
+sub squote_maybe ($) {
+        my ($val) = @_;
+        if ($val =~ m{([^\w@\./,\%\+\-])}) {
+                $val =~ s/(['!])/'\\$1'/g; # '!' for csh
+                return "'$val'";
+        }
+        $val;
+}
+
 sub mailto_arg_link {
         my ($hdr) = @_;
         my %cc; # everyone else
@@ -475,7 +484,7 @@ sub mailto_arg_link {
         my $subj = $hdr->header('Subject') || '';
         $subj = "Re: $subj" unless $subj =~ /\bRe:/i;
         my $mid = $hdr->header_raw('Message-ID');
-        push @arg, "--in-reply-to='" . ascii_html($mid) . "'";
+        push @arg, '--in-reply-to='.ascii_html(squote_maybe(mid_clean($mid)));
         my $irt = uri_escape_utf8($mid);
         delete $cc{$to};
         push @arg, '--to=' . ascii_html($to);
diff --git a/t/view.t b/t/view.t
index 4ce3c773..8a898feb 100644
--- a/t/view.t
+++ b/t/view.t
@@ -4,8 +4,20 @@ use strict;
 use warnings;
 use Test::More;
 use Email::MIME;
-use PublicInbox::View;
 use Plack::Util;
+use_ok 'PublicInbox::View';
+
+my @q = (
+        'foo@bar', 'foo@bar',
+        'a b', "'a b'",
+        "a'b", "'a'\\''b'",
+);
+while (@q) {
+        my $input = shift @q;
+        my $expect = shift @q;
+        my $res = PublicInbox::View::squote_maybe($input);
+        is($res, $expect, "quote $input => $res");
+}
 
 # FIXME: make this test less fragile
 my $ctx = {