about summary refs log tree commit homepage
path: root/lib/PublicInbox/Filter
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2017-06-21 23:33:49 +0000
committerEric Wong <e@80x24.org>2017-06-22 00:31:58 +0000
commit9b80f2bedbe5a8a9154dfa0ba3c7e63012287bea (patch)
tree03fbd5e076b24e9a1fa9e8e942cc8a7fc810452b /lib/PublicInbox/Filter
parent3ef89f98a662a135ae18dddf3ff3e61e8e3ca996 (diff)
downloadpublic-inbox-9b80f2bedbe5a8a9154dfa0ba3c7e63012287bea.tar.gz
Unfortunately, it appears we have to reject this and instead add
support filtering at View time(*), due to DKIM signatures in
messages from ruby-lang.org.

(*) which may not be worth it
Diffstat (limited to 'lib/PublicInbox/Filter')
-rw-r--r--lib/PublicInbox/Filter/RubyLang.pm63
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/PublicInbox/Filter/RubyLang.pm b/lib/PublicInbox/Filter/RubyLang.pm
new file mode 100644
index 00000000..ec4bc320
--- /dev/null
+++ b/lib/PublicInbox/Filter/RubyLang.pm
@@ -0,0 +1,63 @@
+# Copyright (C) 2017 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+
+# Filter for lists.ruby-lang.org trailers
+package PublicInbox::Filter::RubyLang;
+use base qw(PublicInbox::Filter::Base);
+use strict;
+use warnings;
+
+my $l1 = qr/Unsubscribe:\s
+        <mailto:ruby-\w+-request\@ruby-lang\.org\?subject=unsubscribe>/x;
+my $l2 = qr{<http://lists\.ruby-lang\.org/cgi-bin/mailman/options/ruby-\w+>};
+
+sub new {
+        my ($class, %opts) = @_;
+        my $altid = delete $opts{-altid};
+        my $self = $class->SUPER::new(%opts);
+        # altid = serial:ruby-core:file=msgmap.sqlite3
+        if ($altid) {
+                require PublicInbox::MID; # mid_clean
+                my $ibx = $self->{-inbox};
+                require PublicInbox::AltId;
+                $self->{-altid} = PublicInbox::AltId->new($ibx, $altid, 1);
+        }
+        $self;
+}
+
+sub scrub {
+        my ($self, $mime) = @_;
+        # no msg_iter here, that is only for read-only access
+        $mime->walk_parts(sub {
+                my ($part) = $_[0];
+                my $ct = $part->content_type;
+                if (!$ct || $ct =~ m{\btext/plain\b}i) {
+                        my $s = eval { $part->body_str };
+                        if (defined $s && $s =~ s/\n?$l1\n$l2\n\z//os) {
+                                $part->body_str_set($s);
+                        }
+                }
+        });
+        my $altid = $self->{-altid};
+        if ($altid) {
+                my $hdr = $mime->header_obj;
+                my $mid = $hdr->header_raw('Message-ID');
+                unless (defined $mid) {
+                        return $self->REJECT('Message-Id missing');
+                }
+                my $n = $hdr->header_raw('X-Mail-Count');
+                if (!defined($n) || $n !~ /\A\s*\d+\s*\z/) {
+                        return $self->REJECT('X-Mail-Count not numeric');
+                }
+                $mid = PublicInbox::MID::mid_clean($mid);
+                $altid->{mm_alt}->mid_set($n, $mid);
+        }
+        $self->ACCEPT($mime);
+}
+
+sub delivery {
+        my ($self, $mime) = @_;
+        $self->scrub($mime);
+}
+
+1;