From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 911161F8C4 for ; Thu, 7 May 2020 21:05:57 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 03/13] filter/rubylang: avoid recursing subparts to strip trailers Date: Thu, 7 May 2020 21:05:46 +0000 Message-Id: <20200507210556.22995-4-e@yhbt.net> In-Reply-To: <20200507210556.22995-1-e@yhbt.net> References: <20200507210556.22995-1-e@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Mailman only seems to add trailers (or signatures) as attachments at the top-level of MIME messages. So don't bother recursing with ->walk_parts since ->walk_parts is non-trivial to recreate in the Email::MIME replacement I'm working on. --- lib/PublicInbox/Filter/RubyLang.pm | 32 ++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/PublicInbox/Filter/RubyLang.pm b/lib/PublicInbox/Filter/RubyLang.pm index a65a5971..06e4ea75 100644 --- a/lib/PublicInbox/Filter/RubyLang.pm +++ b/lib/PublicInbox/Filter/RubyLang.pm @@ -28,19 +28,29 @@ sub new { $self; } +sub scrub_part ($) { + my ($part) = @_; + 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); + return 1; + } + } + 0; +} + sub scrub { my ($self, $mime, $for_remove) = @_; - # 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); - } - } - }); + # no msg_iter here, msg_iter is only for read-only access + if (my @sub = $mime->subparts) { + my $changed = 0; + $changed |= scrub_part($_) for @sub; + $mime->parts_set(\@sub) if $changed; + } else { + scrub_part($mime); + } my $altid = $self->{-altid}; if ($altid && !$for_remove) { my $hdr = $mime->header_obj;