]> Sergey Matveev's repositories - public-inbox.git/commitdiff
SaPlugin::ListMirror: follow RFC 2919 List-ID rules
authorEric Wong <e@80x24.org>
Fri, 25 Nov 2022 11:44:35 +0000 (11:44 +0000)
committerEric Wong <e@80x24.org>
Sat, 26 Nov 2022 18:46:23 +0000 (18:46 +0000)
List-ID headers are sometimes populated with a descriptive phrase
before the angle-bracketed value and making things difficult to
match.

Tweak our handling to allow checking the angle-bracketed portion
only in accordance with RFC 2919.

Handling of all other headers and senselessly non-bracketed
values for List-ID remain unchanged.

lib/PublicInbox/SaPlugin/ListMirror.pm
lib/PublicInbox/SaPlugin/ListMirror.pod

index 9acf86c0f399100a058106166c131931d72fdaf8..06903cad6327732b397adff0237a0b66f7189f4d 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2016-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 
 # SpamAssassin rules useful for running a mailing list mirror.  We want to:
@@ -39,7 +39,11 @@ sub check_list_mirror_received {
                my $v = $pms->get($hdr) or next;
                local $/ = "\n";
                chomp $v;
-               next if $v ne $hval;
+               if (ref($hval)) {
+                       next if $v !~ $hval;
+               } else {
+                       next if $v ne $hval;
+               }
                return 1 if $recvd !~ $host_re;
        }
 
@@ -91,6 +95,8 @@ sub config_list_mirror {
        $host_glob =~ s!(.)!$patmap{$1} || "\Q$1"!ge;
        my $host_re = qr/\A\s*from\s+$host_glob(?:\s|$)/si;
 
+       (lc($hdr) eq 'list-id' && $hval =~ /<([^>]+)>/) and
+               $hval = qr/\A<\Q$1\E>\z/;
        push @{$self->{list_mirror_check}}, [ $hdr, $hval, $host_re, $addr ];
 }
 
index d931d762df3ec972227e60886f6768f64ec1f33d..e6a6c2add857a5376f42100586d936b3192873f0 100644 (file)
@@ -6,11 +6,11 @@ PublicInbox::SaPlugin::ListMirror - SpamAssassin plugin for mailing list mirrors
 
   loadplugin PublicInbox::SaPlugin::ListMirror
 
-Declare some mailing lists based on the expected List-Id value,
+Declare some mailing lists based on the expected List-ID value,
 expected servers, and mailing list address:
 
-  list_mirror List-Id <foo.example.com> *.example.com foo@example.com
-  list_mirror List-Id <bar.example.com> *.example.com bar@example.com
+  list_mirror List-ID <foo.example.com> *.example.com foo@example.com
+  list_mirror List-ID <bar.example.com> *.example.com bar@example.com
 
 Bump the score for messages which come from unexpected servers:
 
@@ -43,14 +43,25 @@ C<allow_user_rules 1>
 
 =item list_mirror HEADER HEADER_VALUE HOSTNAME_GLOB [LIST_ADDRESS]
 
-Declare a list based on an expected C<HEADER> matching C<HEADER_NAME>
-exactly coming from C<HOSTNAME_GLOB>.  C<LIST_ADDRESS> is optional,
+Declare a list based on an expected C<HEADER> matching C<HEADER_VALUE>
+coming from C<HOSTNAME_GLOB>.  C<LIST_ADDRESS> is optional,
 but may specify the address of the mailing list being mirrored.
 
-C<List-Id> or C<X-Mailing-List> are common values of C<HEADER>
+C<List-ID> is the recommended value of C<HEADER> as most
+mailing lists support it.
 
 An example of C<HEADER_VALUE> is C<E<lt>foo.example.orgE<gt>>
-if C<HEADER> is C<List-Id>.
+if C<HEADER> is C<List-ID>.
+
+As of public-inbox 2.0, using C<List-ID> as the C<HEADER> and a
+C<HEADER_VALUE> contained by angle brackets (E<lt>list-idE<gt>),
+matching is done in accordance with
+L<RFC 2919|https://tools.ietf.org/html/rfc2919>.  That is,
+C<HEADER_VALUE> will be a case-insensitive substring match
+and ignore the optional description C<phrase> as documented
+in RFC 2919.
+
+All other C<HEADER> values use exact matches for backwards-compatibility.
 
 C<HOSTNAME_GLOB> may be a wildcard match for machines where mail can
 come from or an exact match.
@@ -105,7 +116,7 @@ and L<http://4uok3hntl7oi7b4uf4rtfwefqeexfzil2w6kgk2jn5z2f764irre7byd.onion/meta
 
 =head1 COPYRIGHT
 
-Copyright (C) 2016-2021 all contributors L<mailto:meta@public-inbox.org>
+Copyright (C) all contributors L<mailto:meta@public-inbox.org>
 
 License: AGPL-3.0+ L<http://www.gnu.org/licenses/agpl-3.0.txt>