Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Request Tracker: Commit

rt branch, 4.0/unknown-email-charset, created. rt-4.0.5-135-g8a8aad6

 

 

Request Tracker commit RSS feed   Index | Next | Previous | View Threaded


ruz at bestpractical

May 9, 2012, 5:23 AM

Post #1 of 1 (112 views)
Permalink
rt branch, 4.0/unknown-email-charset, created. rt-4.0.5-135-g8a8aad6

The branch, 4.0/unknown-email-charset has been created
at 8a8aad65e142c89453221e37f989f627d6410b34 (commit)

- Log -----------------------------------------------------------------
commit 8a8aad65e142c89453221e37f989f627d6410b34
Author: Ruslan Zakirov <ruz [at] bestpractical>
Date: Wed May 9 16:15:24 2012 +0400

convert text part to binary when we can not decode

If we couldn't find or guess charset or if charset
is not supported or failed to parse properly then
RT was dropping email.

Now instead of dropping we set content type to
'application/octet-stream' and save original value
to X-RT-Original-Content-Type header. In this
case users can download part and deal with it.

In most cases it would be related to spam, but
there are valid charsets that are not supported
by Encode module.

diff --git a/lib/RT/I18N.pm b/lib/RT/I18N.pm
index cadf7cc..e2751c4 100644
--- a/lib/RT/I18N.pm
+++ b/lib/RT/I18N.pm
@@ -209,16 +209,27 @@ sub SetMIMEEntityToEncoding {
# do the same for parts first of all
SetMIMEEntityToEncoding( $_, $enc, $preserve_words ) foreach $entity->parts;

- my $charset = _FindOrGuessCharset($entity) or return;
+ my $head = $entity->head;
+
+ my $charset = _FindOrGuessCharset($entity);
+ if ( $charset ) {
+ unless( Encode::find_encoding($charset) ) {
+ $RT::Logger->warning("Encoding '$charset' is not supported");
+ $charset = undef;
+ }
+ }
+ unless ( $charset ) {
+ $head->replace( "X-RT-Original-Content-Type" => $head->mime_attr('Content-Type') );
+ $head->mime_attr('Content-Type' => 'application/octet-stream');
+ return;
+ }

SetMIMEHeadToEncoding(
- $entity->head,
+ $head,
_FindOrGuessCharset($entity, 1) => $enc,
$preserve_words
);

- my $head = $entity->head;
-
# If this is a textual entity, we'd need to preserve its original encoding
$head->replace( "X-RT-Original-Encoding" => $charset )
if $head->mime_attr('content-type.charset') or IsTextualContentType($head->mime_type);
diff --git a/t/mail/not-supported-charset.t b/t/mail/not-supported-charset.t
new file mode 100644
index 0000000..aefe80c
--- /dev/null
+++ b/t/mail/not-supported-charset.t
@@ -0,0 +1,42 @@
+use strict;
+use warnings;
+
+use RT::Test tests => undef;
+
+my $queue = RT::Test->load_or_create_queue( Name => 'General' );
+ok $queue->id, 'loaded queue';
+
+{
+ my $mail = <<'END';
+From: root [at] localhos
+Subject: test
+Content-type: text/plain; charset="not-supported-encoding"
+
+ho hum just some text
+
+END
+
+ my ($stat, $id) = RT::Test->send_via_mailgate($mail);
+ is( $stat >> 8, 0, "The mail gateway exited normally" );
+ ok( $id, "created ticket" );
+
+ my $ticket = RT::Ticket->new( RT->SystemUser );
+ $ticket->Load($id);
+ ok $ticket->id, "loaded ticket";
+
+ my $txn = $ticket->Transactions->First;
+ ok !$txn->ContentObj, 'no content';
+
+ my $attach = $txn->Attachments->First;
+ like $attach->Content, qr{ho hum just some text}, 'attachment is there';
+ is $attach->GetHeader('Content-Type'),
+ 'application/octet-stream; charset="not-supported-encoding"',
+ 'content type is changed'
+ ;
+ is $attach->GetHeader('X-RT-Original-Content-Type'),
+ 'text/plain',
+ 'original content type is saved'
+ ;
+}
+
+done_testing;
\ No newline at end of file

-----------------------------------------------------------------------
_______________________________________________
Rt-commit mailing list
Rt-commit [at] lists
http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-commit

Request Tracker commit RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.