> > Nice. I have a question about it, though. Why do you only process > > messages that are multipart? What if there's a message (not > > attachment) with content-type audio/x-wav that's really an exe? > > Hmmm - no very good reason at all, now you mention it. Got a patch? :-)
Here you go. I don't have the resources at present to test this properly, but I've attached a couple of test messages. Brian
--- exe_filter 2004-07-06 23:46:42.000000000 -0600
+++ exe_filter.brian-001 2004-07-12 11:08:04.000000000 -0600
@@ -119,24 +119,48 @@
}
return DECLINED unless keys %sig;
- # Ignore non-multipart emails
+ # Ignore non-MIME emails
my @boundary = ();
+ my $boundary;
my $content_type = $transaction->header->get('Content-Type');
- $content_type =~ s/\s/ /g if defined $content_type;
- unless ($content_type && $content_type =~ m!\bmultipart/.*\bboundary="?([^"]+)!i) {
- $self->log(4, "non-multipart mail - skipping");
+ my $mail_header = undef;
+ my $mime_header = undef;
+ my $mime_lines = -1;
+ if (!defined $content_type) {
+ $self->log(4, "non-MIME mail - skipping");
return DECLINED;
}
- my $boundary = $1 || '';
- $self->log(7, "header boundary: $boundary");
- push @boundary, $boundary;
+ else {
+ $content_type =~ s/\s/ /g;
+ if ($content_type =~ m!\bmultipart/.*\bboundary="?([^"]+)!i) {
+ $boundary = $1 || '';
+ $self->log(7, "header boundary: $boundary");
+ push @boundary, $boundary;
+ }
+ elsif ($content_type =~ m!\bmessage/rfc822!i) {
+ # Turn mail_header on
+ $mail_header = '';
+ $mime_lines = undef;
+ $mime_header = undef;
+ $boundary = undef;
+ }
+ elsif ($content_type !~ m!\bmultipart/!i) {
+ $mail_header = undef;
+ $mime_header = undef;
+ $mime_lines = 0;
+ $boundary = undef;
+ }
+ else {
+ $self->log(4, "unintelligible multipart mail - skipping");
+ return DECLINED;
+ # $self->log(4, "unintelligible multipart mail - refusing");
+ # return (DENY, "badly formed multipart MIME.");
+ }
+ }
# Make sure we read from the beginning;
$transaction->body_resetpos;
-
- my $mail_header = undef;
- my $mime_header = undef;
- my $mime_lines = -1;
+
while ($_ = $transaction->body_getline) {
# Embedded mail headers
if (defined $mail_header) {
sample.message.0
Description: Binary data
sample.message.1
Description: Binary data
