#!/usr/bin/perl -w
-# Copyright (C) 2015-2016 all contributors <meta@public-inbox.org>
+# Copyright (C) 2015-2021 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
#
# A work-in-progress, but one day I hope this script is no longer
use Email::Simple;
use URI::Escape qw/uri_escape_utf8/;
use File::Temp qw/tempfile/;
-my ($fh, $filename) = tempfile('pi-replay-XXXXXXXX');
-my $msg = eval {
- local $/;
- Email::Simple->new(<STDIN>);
-};
+my ($fh, $filename) = tempfile('ssoma-replay-XXXX', TMPDIR => 1);
+my $msg = Email::Simple->new(do { local $/; <STDIN> });
select $fh;
# Note: the archive URL makes assumptions about where the
my $list_id = $header_obj->header('List-Id');
my ($archive_url, $user, $domain);
if (defined $list_id) {
- ($user, $domain) = ($list_id =~ /<(.+)\@(.+)>/g);
+ # due to a bug in old versions of public-inbox, <user@domain> was used
+ # as the list-Id instead of <user.domain> as recommended in RFC2919
+ ($user, $domain) = ($list_id =~ /<([^\.@]+)[\.@](.+)>/g);
if (defined $domain) {
$archive_url = "https://$domain/$user/";
my $mid = $header_obj->header('Message-Id');
- if ($mid =~ /\A<(.+)>\z/) {
+ if ($mid =~ /<[ \t]*([^>]+)?[ \t]*>/s) {
$mid = $1;
}
- $mid = uri_escape_utf8($mid);
+ $mid = uri_escape_utf8($mid,
+ '^A-Za-z0-9\-\._~!\$\&\';\(\)\*\+,;=:@');
$header_obj->header_set('List-Archive', "<$archive_url>");
foreach my $h (qw(Help Unsubscribe Subscribe Owner)) {