about summary refs log tree commit homepage
path: root/lib
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
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')
-rw-r--r--lib/PublicInbox/AltId.pm4
-rw-r--r--lib/PublicInbox/Filter/RubyLang.pm63
-rw-r--r--lib/PublicInbox/WatchMaildir.pm2
3 files changed, 66 insertions, 3 deletions
diff --git a/lib/PublicInbox/AltId.pm b/lib/PublicInbox/AltId.pm
index 6fdc3a2d..73fecd5e 100644
--- a/lib/PublicInbox/AltId.pm
+++ b/lib/PublicInbox/AltId.pm
@@ -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
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;
diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm
index c436742c..8588f16c 100644
--- a/lib/PublicInbox/WatchMaildir.pm
+++ b/lib/PublicInbox/WatchMaildir.pm
@@ -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+/;