Mailing List Archive

svn commit: rev 6734 - in incubator/spamassassin/trunk: . lib/Mail/SpamAssassin t
Author: jm
Date: Wed Feb 18 15:29:28 2004
New Revision: 6734

Added:
incubator/spamassassin/trunk/t/reportheader_8bit.t (contents, props changed)
Modified:
incubator/spamassassin/trunk/MANIFEST
incubator/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm
incubator/spamassassin/trunk/t/reportheader.t
Log:
bug 2542: translated X-Spam-Report header contains unencoded 8-bit chars

Modified: incubator/spamassassin/trunk/MANIFEST
==============================================================================
--- incubator/spamassassin/trunk/MANIFEST (original)
+++ incubator/spamassassin/trunk/MANIFEST Wed Feb 18 15:29:28 2004
@@ -300,3 +300,5 @@
tools/split_corpora
tools/test_extract
tools/triplets.pl
+t/reportheader_8bit.t
+t/uri.t

Modified: incubator/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm
==============================================================================
--- incubator/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm (original)
+++ incubator/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm Wed Feb 18 15:29:28 2004
@@ -656,6 +656,7 @@
foreach my $header (keys %{$self->{conf}->{headers_spam}} ) {
my $data = $self->{conf}->{headers_spam}->{$header};
my $line = $self->_process_header($header,$data) || "";
+ $line = $self->qp_encode_header($line);
$newmsg .= "X-Spam-$header: $line\n" # add even if empty
}

@@ -784,6 +785,7 @@

while ( my($header, $data) = each %{$self->{conf}->{$addition}} ) {
my $line = $self->_process_header($header,$data) || "";
+ $line = $self->qp_encode_header($line);
push(@pristine_headers, "X-Spam-$header: $line\n");
}

@@ -791,8 +793,31 @@
return join('', $mbox, @pristine_headers, "\n", $self->{msg}->get_pristine_body());
}

-sub _process_header {
+sub qp_encode_header {
+ my ($self, $text) = @_;
+
+ # do nothing unless there's an 8-bit char
+ return $text unless ($text =~ /[\x80-\xff]/);
+
+ my $cs = 'ISO-8859-1';
+ if ($self->{report_charset}) {
+ $cs = $self->{report_charset};
+ }
+
+ my @hexchars = split('', '0123456789abcdef');
+ my $ord;
+ $text =~ s{([\x80-\xff])}{
+ $ord = ord $1;
+ '='.$hexchars[($ord & 0xf0) >> 4].$hexchars[$ord & 0x0f]
+ }ges;

+ $text = '=?'.$cs.'?Q?'.$text.'?=';
+
+ dbg ("encoding header in $cs: $text");
+ return $text;
+}
+
+sub _process_header {
my ($self, $hdr_name, $hdr_data) = @_;

$hdr_data = $self->_replace_tags($hdr_data);

Modified: incubator/spamassassin/trunk/t/reportheader.t
==============================================================================
--- incubator/spamassassin/trunk/t/reportheader.t (original)
+++ incubator/spamassassin/trunk/t/reportheader.t Wed Feb 18 15:29:28 2004
@@ -27,7 +27,7 @@

tstprefs ("
$default_cf_lines
- use_terse_report 0
+ report_safe 0
");

sarun ("-L -t < data/spam/001", \&patterns_run_cb);

Added: incubator/spamassassin/trunk/t/reportheader_8bit.t
==============================================================================
--- (empty file)
+++ incubator/spamassassin/trunk/t/reportheader_8bit.t Wed Feb 18 15:29:28 2004
@@ -0,0 +1,26 @@
+#!/usr/bin/perl
+
+use lib '.'; use lib 't';
+use SATest; sa_t_init("reportheader");
+use Test; BEGIN { plan tests => 2 };
+
+$ENV{'LC_ALL'} = 'C'; # a cheat, but we need the patterns to work
+
+# ---------------------------------------------------------------------------
+
+%patterns = (
+
+ q{X-Spam-Report: =?ISO-8859-1?Q? }, 'qp-encoded-hdr',
+ q{ Invalid Date: header =ae =af =b0 foo }, 'qp-encoded-desc',
+
+);
+
+tstprefs ("
+ $default_cf_lines
+ report_safe 0
+ describe INVALID_DATE Invalid Date: header \xae \xaf \xb0 foo
+ ");
+
+sarun ("-L -t < data/spam/001", \&patterns_run_cb);
+ok_all_patterns();
+