X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Ffilter.t;h=80a7c123ae41078ca42bba187803c4bb9daf6232;hb=f76f265a851944b5dedcc3be5f3b5224b6ebda89;hp=ac9f1f6f973d42f4ac4cb56f7bf42ec536bde1b4;hpb=62405fb60d3153fbacba4936086587860f495fce;p=public-inbox.git diff --git a/t/filter.t b/t/filter.t index ac9f1f6f..80a7c123 100644 --- a/t/filter.t +++ b/t/filter.t @@ -1,10 +1,9 @@ -# Copyright (C) 2013, Eric Wong and all contributors +# Copyright (C) 2013-2015 all contributors # License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt) use strict; use warnings; use Test::More; use Email::MIME; -use Email::Filter; use PublicInbox::Filter; sub count_body_parts { @@ -16,9 +15,56 @@ sub count_body_parts { $bodies->{$body}++; } +# multipart/alternative: HTML and quoted-printable, keep the plain-text +{ + my $html_body = "hi"; + my $parts = [ + Email::MIME->create( + attributes => { + content_type => 'text/html; charset=UTF-8', + encoding => 'base64', + }, + body => $html_body, + ), + Email::MIME->create( + attributes => { + content_type => 'text/plain', + encoding => 'quoted-printable', + }, + body => 'hi = "bye"', + ) + ]; + my $email = Email::MIME->create( + header_str => [ + From => 'a@example.com', + Subject => 'blah', + 'Content-Type' => 'multipart/alternative' + ], + parts => $parts, + ); + is(1, PublicInbox::Filter->run($email), "run was a success"); + my $parsed = Email::MIME->new($email->as_string); + is("text/plain", $parsed->header("Content-Type")); + is(scalar $parsed->parts, 1, "HTML part removed"); + my %bodies; + $parsed->walk_parts(sub { + my ($part) = @_; + return if $part->subparts; # walk_parts already recurses + count_body_parts(\%bodies, $part); + }); + is(scalar keys %bodies, 1, "one bodies"); + is($bodies{"hi =3D \"bye\"="}, 1, "QP text part unchanged"); + $parsed->walk_parts(sub { + my ($part) = @_; + my $b = $part->body; + $b =~ s/\s*\z//; + is($b, "hi = \"bye\"", "decoded body matches"); + }); +} + # plain-text email is passed through unchanged { - my $s = Email::Simple->create( + my $s = Email::MIME->create( header => [ From => 'a@example.com', To => 'b@example.com', @@ -27,29 +73,27 @@ sub count_body_parts { ], body => "hello world\n", ); - my $f = Email::Filter->new(data => $s->as_string); - is(1, PublicInbox::Filter->run($f->simple), "run was a success"); - is($s->as_string, $f->simple->as_string, "plain email unchanged"); + is(1, PublicInbox::Filter->run($s), "run was a success"); } # convert single-part HTML to plain-text { - my $s = Email::Simple->create( + my $s = Email::MIME->create( header => [ From => 'a@example.com', To => 'b@example.com', 'Content-Type' => 'text/html', Subject => 'HTML only badness', ], - body => "bad body\n", + body => "bad body\r\n\n", ); - my $f = Email::Filter->new(data => $s->as_string); - is(1, PublicInbox::Filter->run($f->simple), "run was a success"); - unlike($f->simple->as_string, qr//, "HTML removed"); - is("text/plain", $f->simple->header("Content-Type"), + is(1, PublicInbox::Filter->run($s), "run was a success"); + unlike($s->as_string, qr//, "HTML removed"); + is("text/plain", $s->header("Content-Type"), "content-type changed"); - like($f->simple->body, qr/\A\s*bad body\s*\z/, "body"); - like($f->simple->header("X-Content-Filtered-By"), + like($s->body, qr/\A\s*bad body\s*\z/, "body"); + unlike($s->body, qr/\r/, "body has no cr"); + like($s->header("X-Content-Filtered-By"), qr/PublicInbox::Filter/, "XCFB header added"); } @@ -79,9 +123,8 @@ sub count_body_parts { ], parts => $parts, ); - my $f = Email::Filter->new(data => $email->as_string); - is(1, PublicInbox::Filter->run($f->simple), "run was a success"); - my $parsed = Email::MIME->new($f->simple->as_string); + is(1, PublicInbox::Filter->run($email), "run was a success"); + my $parsed = Email::MIME->new($email->as_string); is("text/plain", $parsed->header("Content-Type")); is(scalar $parsed->parts, 1, "HTML part removed"); my %bodies; @@ -110,9 +153,8 @@ sub count_body_parts { header_str => [ From => 'a@example.com', Subject => 'blah' ], parts => $parts, ); - my $f = Email::Filter->new(data => $email->as_string); - is(1, PublicInbox::Filter->run($f->simple), "run was a success"); - my $parsed = Email::MIME->new($f->simple->as_string); + is(1, PublicInbox::Filter->run($email), "run was a success"); + my $parsed = Email::MIME->new($email->as_string); is(scalar $parsed->parts, 2, "still 2 parts"); my %bodies; $parsed->walk_parts(sub { @@ -149,9 +191,8 @@ sub count_body_parts { header_str => [ From => 'a@example.com', Subject => 'blah' ], parts => $parts, ); - my $f = Email::Filter->new(data => $email->as_string); - is(1, PublicInbox::Filter->run($f->simple), "run was a success"); - my $parsed = Email::MIME->new($f->simple->as_string); + is(1, PublicInbox::Filter->run($email), "run was a success"); + my $parsed = Email::MIME->new($email->as_string); is(scalar $parsed->parts, 2, "still 2 parts"); my %bodies; $parsed->walk_parts(sub { @@ -186,9 +227,8 @@ sub count_body_parts { header_str => [ From => 'a@example.com', Subject => 'blah' ], parts => $parts, ); - my $f = Email::Filter->new(data => $email->as_string); - is(1, PublicInbox::Filter->run($f->simple), "run was a success"); - my $parsed = Email::MIME->new($f->simple->as_string); + is(1, PublicInbox::Filter->run($email), "run was a success"); + my $parsed = Email::MIME->new($email->as_string); is(scalar $parsed->parts, 1, "image part removed"); my %bodies; $parsed->walk_parts(sub { @@ -226,10 +266,9 @@ sub count_body_parts { header_str => [ From => 'a@example.com', Subject => 'blah' ], parts => $parts, ); - my $f = Email::Filter->new(data => $email->as_string); - is(0, PublicInbox::Filter->run($f->simple), + is(0, PublicInbox::Filter->run($email), "run signaled to stop delivery"); - my $parsed = Email::MIME->new($f->simple->as_string); + my $parsed = Email::MIME->new($email->as_string); is(scalar $parsed->parts, 1, "bad parts removed"); my %bodies; $parsed->walk_parts(sub { @@ -245,7 +284,7 @@ sub count_body_parts { } { - my $s = Email::Simple->create( + my $s = Email::MIME->create( header => [ From => 'a@example.com', To => 'b@example.com', @@ -254,13 +293,12 @@ sub count_body_parts { ], body => "hello world\n", ); - my $f = Email::Filter->new(data => $s->as_string); - is(0, PublicInbox::Filter->run($f->simple), "run was a failure"); - like($f->simple->as_string, qr/scrubbed/, "scrubbed message"); + is(0, PublicInbox::Filter->run($s), "run was a failure"); + like($s->as_string, qr/scrubbed/, "scrubbed message"); } { - my $s = Email::Simple->create( + my $s = Email::MIME->create( header => [ From => 'a@example.com', To => 'b@example.com', @@ -273,9 +311,8 @@ sub count_body_parts { is('c@example.com', $s->header("Mail-Followup-To"), "mft set correctly"); - my $f = Email::Filter->new(data => $s->as_string); - is(1, PublicInbox::Filter->run($f->simple), "run succeeded for mft"); - is(undef, $f->simple->header("Mail-Followup-To"), "mft stripped"); + is(1, PublicInbox::Filter->run($s), "run succeeded for mft"); + is(undef, $s->header("Mail-Followup-To"), "mft stripped"); } # multi-part with application/octet-stream @@ -308,11 +345,10 @@ EOF header_str => [ From => 'a@example.com', Subject => 'blah' ], parts => $parts, ); - my $f = Email::Filter->new(data => $email->as_string); - is(1, PublicInbox::Filter->run($f->simple), "run was a success"); - my $parsed = Email::MIME->new($f->simple->as_string); + is(1, PublicInbox::Filter->run($email), "run was a success"); + my $parsed = Email::MIME->new($email->as_string); is(scalar $parsed->parts, 1, "only one remaining part"); - like($f->simple->header("X-Content-Filtered-By"), + like($parsed->header("X-Content-Filtered-By"), qr/PublicInbox::Filter/, "XCFB header added"); }