]> Sergey Matveev's repositories - public-inbox.git/commitdiff
add filter for RubyLang lists
authorEric Wong <e@80x24.org>
Wed, 21 Jun 2017 23:33:49 +0000 (23:33 +0000)
committerEric Wong <e@80x24.org>
Thu, 22 Jun 2017 00:31:58 +0000 (00:31 +0000)
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

MANIFEST
lib/PublicInbox/AltId.pm
lib/PublicInbox/Filter/RubyLang.pm [new file with mode: 0644]
lib/PublicInbox/WatchMaildir.pm

index d0b7f2be44421345d93de630e7e10be114865ddc..c7c4a9206520ac706bff61d72396eb929586da61 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -51,6 +51,7 @@ lib/PublicInbox/ExtMsg.pm
 lib/PublicInbox/Feed.pm
 lib/PublicInbox/Filter/Base.pm
 lib/PublicInbox/Filter/Mirror.pm
+lib/PublicInbox/Filter/RubyLang.pm
 lib/PublicInbox/Filter/SubjectTag.pm
 lib/PublicInbox/Filter/Vger.pm
 lib/PublicInbox/GetlineBody.pm
index 6fdc3a2d4df6c141a8b76181ad30829bf43abeb3..73fecd5e4cb426f1940ddbfc6c602414ea910b80 100644 (file)
@@ -9,7 +9,7 @@ use URI::Escape qw(uri_unescape);
 # spec: TYPE:PREFIX:param1=value1&param2=value2&...
 # Example: serial:gmane:file=/path/to/altmsgmap.sqlite3
 sub new {
-       my ($class, $inbox, $spec) = @_;
+       my ($class, $inbox, $spec, $writable) = @_;
        my ($type, $prefix, $query) = split(/:/, $spec, 3);
        $type eq 'serial' or die "non-serial not supported, yet\n";
 
@@ -25,7 +25,7 @@ sub new {
                $f = "$inbox->{mainrepo}/public-inbox/$f";
        }
        bless {
-               mm_alt => PublicInbox::Msgmap->new_file($f),
+               mm_alt => PublicInbox::Msgmap->new_file($f, $writable),
                xprefix => 'X'.uc($prefix),
        }, $class;
 }
diff --git a/lib/PublicInbox/Filter/RubyLang.pm b/lib/PublicInbox/Filter/RubyLang.pm
new file mode 100644 (file)
index 0000000..ec4bc32
--- /dev/null
@@ -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;
index c436742cfa6244a191ea62503ac6771cb2a57edb..8588f16c836a449366c0be375fea745c3c1651ed 100644 (file)
@@ -242,7 +242,7 @@ sub _scrubber_for {
        my ($inbox) = @_;
        my $f = $inbox->{filter};
        if ($f && $f =~ /::/) {
-               my @args;
+               my @args = (-inbox => $inbox);
                # basic line splitting, only
                # Perhaps we can have proper quote splitting one day...
                ($f, @args) = split(/\s+/, $f) if $f =~ /\s+/;