public-inbox-learn | 19 ++++++++++--------- t/mda.t | 41 +++++++++++++++++++++++++++++++++++++++++ diff --git a/public-inbox-learn b/public-inbox-learn index 13b75b763cfc9d3280011b29a237065d013de987..db0a1bb35e5ec8115e007c4dcd8cd12fdee82a70 100755 --- a/public-inbox-learn +++ b/public-inbox-learn @@ -24,9 +24,16 @@ $dests{lc($recipient->address)} = 1; } } +my ($name, $email, $date); + +if ($train eq "ham") { + require PublicInbox::MDA; + require PublicInbox::Filter; + PublicInbox::Filter->run($mime); + ($name, $email, $date) = PublicInbox::MDA->author_info($mime); +} + my $in = $mime->as_string; -$mime->body_set(''); - my $err = 0; my @output = qw(> /dev/null > /dev/null); @@ -50,16 +57,10 @@ $err = 1; } } } else { # $train eq "ham" - require PublicInbox::MDA; - require PublicInbox::Filter; - - # no checking for errors here, we assume the message has + # no checking for spam here, we assume the message has # been reviewed by a human at this point: - PublicInbox::Filter->run($mime); PublicInbox::MDA->set_list_headers($mime, $dst); - my ($name, $email, $date) = - PublicInbox::MDA->author_info($mime); local $ENV{GIT_AUTHOR_NAME} = $name; local $ENV{GIT_AUTHOR_EMAIL} = $email; local $ENV{GIT_AUTHOR_DATE} = $date; diff --git a/t/mda.t b/t/mda.t index fad96e5bf44eb733600f5369c4dfed7130559a3b..53712a565e909a4c9bdf304e59c09a9f6d106eb6 100644 --- a/t/mda.t +++ b/t/mda.t @@ -205,14 +205,55 @@ EOF my $in = $simple->as_string; # now train it + # these should be overridden local $ENV{GIT_AUTHOR_EMAIL} = 'trainer@example.com'; local $ENV{GIT_COMMITTER_EMAIL} = 'trainer@example.com'; + run([$learn, "ham"], \$in); is($?, 0, "learned ham without failure"); my $msg = `ssoma cat $mid $maindir`; like($msg, qr/\Q$mid\E/, "ham message delivered"); run([$learn, "ham"], \$in); is($?, 0, "learned ham idempotently "); + + # ensure trained email is filtered, too + 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"', + ) + ]; + $mid = 'multipart-html-sucks@11'; + my $mime = Email::MIME->create( + header_str => [ + From => 'a@example.com', + Subject => 'blah', + Cc => $addr, + 'Message-ID' => "<$mid>", + 'Content-Type' => 'multipart/alternative', + ], + parts => $parts, + ); + + { + $in = $mime->as_string; + run([$learn, "ham"], \$in); + is($?, 0, "learned ham without failure"); + $msg = `ssoma cat $mid $maindir`; + like($msg, qr/<\Q$mid\E>/, "ham message delivered"); + unlike($msg, qr//i, ' filtered'); + } } # faildir - emergency destination is maildir