]> git.g-eek.se Git - interimap.git/commitdiff
pullimap: quote the local part if need be (cf. RFC 5321).
authorGuilhem Moulin <guilhem@fripost.org>
Sat, 25 Jun 2016 16:34:58 +0000 (18:34 +0200)
committerGuilhem Moulin <guilhem@fripost.org>
Sat, 25 Jun 2016 16:34:58 +0000 (18:34 +0200)
pullimap
pullimap.md

index e971f64670bb863d4727477fc202ac4d3fbc4e86..18572e6be52e188b4e5627443ba9dba0646e1490 100755 (executable)
--- a/pullimap
+++ b/pullimap
@@ -269,13 +269,25 @@ sub purge() {
 my $ATTRS = "ENVELOPE INTERNALDATE";
 $ATTRS .= " BODY.PEEK[]" unless $CONFIG{'no-delivery'};
 
+my $RE_ATOM = qr/[A-Za-z0-9\x21\x23-\x27\x2A\x2B\x2D\x2F\x3D\x3F\x5E-\x60\x7B-\x7E]+/;
 sub pull_callback($$) {
     my ($uids, $mail) = @_;
     return unless exists $mail->{RFC822} or $CONFIG{'no-delivery'}; # not for us
 
     my $uid = $mail->{UID};
     my $from = first { defined $_ and @$_ } @{$mail->{ENVELOPE}}[2,3,4];
-    $from = (defined $from and @$from) ? $from->[0]->[2].'@'.$from->[0]->[3] : '';
+    if (defined $from and @$from) {
+        my ($l, $d) = ($from->[0]->[2], $from->[0]->[3]);
+        if ($l !~ qr/\A$RE_ATOM(?:\.$RE_ATOM)*\z/o) { # Dot-string, RFC 5321
+            # quote the local part
+            $IMAP->panic("Invalid MAIL FROM: <$l\@$d>") unless $l =~ qr/\A[\x20-\x7E]*\z/;
+            $l =~ s/([\x22\x5C])/\\$1/g; # escape double-quote and backslash
+            $l = '"' .$l. '"';
+        }
+        $from = $l .'@'. $d;
+    } else {
+        $from = '';
+    }
     $IMAP->log("UID $uid from <$from> ($mail->{INTERNALDATE})") unless $CONFIG{quiet};
 
     sendmail($from, $mail->{RFC822}) unless $CONFIG{'no-delivery'};
index 5ff3af16094615f44316d5c56d9917a7cd640687..06e5988e9884804267e6e6e4877d97a424dabfdb 100644 (file)
@@ -110,7 +110,8 @@ Valid options are:
 
 *deliver-rcpt*
 
-:   Message recipient.
+:   Message recipient.  Note that the local part needs to quoted if it
+    contains special characters; see [RFC 5321] for details.
     (Default: the username associated with the effective uid of the
     `pullimap` process.)