diff options
Diffstat (limited to 'rt/t/mail')
-rw-r--r-- | rt/t/mail/charsets-outgoing.t | 17 | ||||
-rw-r--r-- | rt/t/mail/dashboard-chart-with-utf8.t | 8 | ||||
-rw-r--r-- | rt/t/mail/extractsubjecttag.t | 1 | ||||
-rw-r--r-- | rt/t/mail/gateway.t | 9 | ||||
-rw-r--r-- | rt/t/mail/header-characters.t | 81 | ||||
-rw-r--r-- | rt/t/mail/not-supported-charset.t | 69 | ||||
-rw-r--r-- | rt/t/mail/one-time-recipients.t | 1 | ||||
-rw-r--r-- | rt/t/mail/rfc2231-attachment.t | 3 | ||||
-rw-r--r-- | rt/t/mail/sendmail.t | 600 | ||||
-rw-r--r-- | rt/t/mail/threading.t | 1 | ||||
-rw-r--r-- | rt/t/mail/wrong_mime_charset.t | 10 |
11 files changed, 271 insertions, 529 deletions
diff --git a/rt/t/mail/charsets-outgoing.t b/rt/t/mail/charsets-outgoing.t index 2fc91f2e0..872721325 100644 --- a/rt/t/mail/charsets-outgoing.t +++ b/rt/t/mail/charsets-outgoing.t @@ -1,6 +1,5 @@ use strict; use warnings; -use Encode; use RT::Test tests => 78; @@ -72,7 +71,7 @@ foreach my $set ( 'ru', 'latin1' ) { my $status = 1; foreach my $mail ( @mails ) { my $entity = parse_mail( $mail ); - my $subject = Encode::decode_utf8( $entity->head->get('Subject') ); + my $subject = Encode::decode( "UTF-8", $entity->head->get('Subject') ); $subject =~ /$string{$set}{test}/ or do { $status = 0; diag "wrong subject: $subject" }; } @@ -101,7 +100,7 @@ diag "ascii subject with non-ascii subject tag"; my $status = 1; foreach my $mail ( @mails ) { my $entity = parse_mail( $mail ); - my $subject = Encode::decode_utf8( $entity->head->get('Subject') ); + my $subject = Encode::decode( "UTF-8", $entity->head->get('Subject') ); $subject =~ /$string{$tag_set}{support}/ or do { $status = 0; diag "wrong subject: $subject" }; } @@ -122,7 +121,7 @@ foreach my $set ( 'ru', 'latin1' ) { my $status = 1; foreach my $mail ( @mails ) { my $entity = parse_mail( $mail ); - my $subject = Encode::decode_utf8( $entity->head->get('Subject') ); + my $subject = Encode::decode( "UTF-8", $entity->head->get('Subject') ); $subject =~ /$string{$tag_set}{support}/ or do { $status = 0; diag "wrong subject: $subject" }; $subject =~ /$string{$set}{test}/ @@ -171,7 +170,7 @@ diag "ascii subject with non-ascii subject prefix in template"; my $status = 1; foreach my $mail ( @mails ) { my $entity = parse_mail( $mail ); - my $subject = Encode::decode_utf8( $entity->head->get('Subject') ); + my $subject = Encode::decode( "UTF-8", $entity->head->get('Subject') ); $subject =~ /$string{$prefix_set}{autoreply}/ or do { $status = 0; diag "wrong subject: $subject" }; } @@ -192,7 +191,7 @@ foreach my $set ( 'ru', 'latin1' ) { my $status = 1; foreach my $mail ( @mails ) { my $entity = parse_mail( $mail ); - my $subject = Encode::decode_utf8( $entity->head->get('Subject') ); + my $subject = Encode::decode( "UTF-8", $entity->head->get('Subject') ); $subject =~ /$string{$prefix_set}{autoreply}/ or do { $status = 0; diag "wrong subject: $subject" }; $subject =~ /$string{$set}{test}/ @@ -222,7 +221,7 @@ foreach my $set ( 'ru', 'latin1' ) { my $status = 1; foreach my $mail ( @mails ) { my $entity = parse_mail( $mail ); - my $subject = Encode::decode_utf8( $entity->head->get('Subject') ); + my $subject = Encode::decode( "UTF-8", $entity->head->get('Subject') ); $subject =~ /$string{$prefix_set}{autoreply}/ or do { $status = 0; diag "wrong subject: $subject" }; $subject =~ /$string{$tag_set}{support}/ @@ -275,7 +274,7 @@ foreach my $set ( 'ru', 'latin1' ) { my $status = 1; foreach my $mail ( @mails ) { my $entity = parse_mail( $mail ); - my $subject = Encode::decode_utf8( $entity->head->get('Subject') ); + my $subject = Encode::decode( "UTF-8", $entity->head->get('Subject') ); $subject =~ /$string{$set}{test}/ or do { $status = 0; diag "wrong subject: $subject" }; } @@ -303,7 +302,7 @@ foreach my $set ( 'ru', 'latin1' ) { my $status = 1; foreach my $mail ( @mails ) { my $entity = parse_mail( $mail ); - my $subject = Encode::decode_utf8( $entity->head->get('Subject') ); + my $subject = Encode::decode( "UTF-8", $entity->head->get('Subject') ); $subject =~ /$string{$set}{test}/ or do { $status = 0; diag "wrong subject: $subject" }; $subject =~ /$string{$tag_set}{support}/ diff --git a/rt/t/mail/dashboard-chart-with-utf8.t b/rt/t/mail/dashboard-chart-with-utf8.t index 79f5f0e11..37f8ce0c6 100644 --- a/rt/t/mail/dashboard-chart-with-utf8.t +++ b/rt/t/mail/dashboard-chart-with-utf8.t @@ -12,8 +12,6 @@ BEGIN { } } -use utf8; - my $root = RT::Test->load_or_create_user( Name => 'root' ); my ( $baseurl, $m ) = RT::Test->started_ok; @@ -21,11 +19,11 @@ ok( $m->login, 'logged in' ); my $ticket = RT::Ticket->new( $RT::SystemUser ); $ticket->Create( Queue => 'General', - Subject => 'test äöü', + Subject => Encode::decode("UTF-8",'test äöü'), ); ok( $ticket->id, 'created ticket' ); -$m->get_ok(q{/Search/Chart.html?Query=Subject LIKE 'test äöü'}); +$m->get_ok(Encode::decode("UTF-8", q{/Search/Chart.html?Query=Subject LIKE 'test äöü'})); $m->submit_form( form_name => 'SaveSearch', fields => { @@ -58,7 +56,7 @@ $m->field( 'Hour' => '06:00' ); $m->click_button( name => 'Save' ); $m->content_contains('Subscribed to dashboard dashboard foo'); -my $c = $m->get(q{/Search/Chart?Query=Subject LIKE 'test äöü'}); +my $c = $m->get(Encode::decode("UTF-8",q{/Search/Chart?Query=Subject LIKE 'test äöü'})); my $image = $c->content; RT::Test->run_and_capture( command => $RT::SbinPath . '/rt-email-dashboards', all => 1 diff --git a/rt/t/mail/extractsubjecttag.t b/rt/t/mail/extractsubjecttag.t index 14fab44b5..1aadaa7b7 100644 --- a/rt/t/mail/extractsubjecttag.t +++ b/rt/t/mail/extractsubjecttag.t @@ -1,6 +1,5 @@ use strict; use warnings; -use utf8; use RT::Test tests => 18; diff --git a/rt/t/mail/gateway.t b/rt/t/mail/gateway.t index 9482ffcb2..4f906c89c 100644 --- a/rt/t/mail/gateway.t +++ b/rt/t/mail/gateway.t @@ -504,8 +504,7 @@ EOF is ($tick->Id, $id, "correct ticket"); is ($tick->Subject , 'This is a test of I18N ticket creation', "Created the ticket - ". $tick->Subject); - my $unistring = "\303\241\303\251\303\255\303\263\303\272"; - Encode::_utf8_on($unistring); + my $unistring = Encode::decode("UTF-8","\303\241\303\251\303\255\303\263\303\272"); is ( $tick->Transactions->First->Content, $tick->Transactions->First->Attachments->First->Content, @@ -542,8 +541,7 @@ EOF is ($tick->Id, $id, "correct ticket"); is ($tick->Subject , 'This is a test of I18N ticket creation', "Created the ticket"); - my $unistring = "\303\241\303\251\303\255\303\263\303\272"; - Encode::_utf8_on($unistring); + my $unistring = Encode::decode("UTF-8","\303\241\303\251\303\255\303\263\303\272"); ok ( $tick->Transactions->First->Content =~ $unistring, @@ -573,8 +571,7 @@ EOF my $tick = RT::Test->last_ticket; is ($tick->Id, $id, "correct ticket"); - my $content = $tick->Transactions->First->Content; - Encode::_utf8_off($content); + my $content = Encode::encode("UTF-8",$tick->Transactions->First->Content); like $content, qr{informaci\303\263n confidencial}; like $content, qr{informaci\357\277\275n confidencial}; diff --git a/rt/t/mail/header-characters.t b/rt/t/mail/header-characters.t new file mode 100644 index 000000000..004ba8522 --- /dev/null +++ b/rt/t/mail/header-characters.t @@ -0,0 +1,81 @@ +use strict; +use warnings; + +use RT::Test tests => 12; +use Test::Warn; + +my ($baseurl, $m) = RT::Test->started_ok; + +diag "Testing non-ASCII in From: header"; +SKIP:{ + skip "Test requires Email::Address 1.893 or later, " + . "you have $Email::Address::VERSION", 3, + if $Email::Address::VERSION < 1.893; + + my $mail = Encode::encode( 'iso-8859-1', Encode::decode( "UTF-8", <<'.') ); +From: René@example.com> +Reply-To: =?iso-8859-1?Q?Ren=E9?= <René@example.com> +Subject: testing non-ASCII From +Content-Type: text/plain; charset=iso-8859-1 + +here's some content +. + + my ($status, $id); + warnings_like { ( $status, $id ) = RT::Test->send_via_mailgate($mail) } + [qr/Failed to parse Reply-To:.*, From:/, + qr/Couldn't parse or find sender's address/ + ], + 'Got parse error for non-ASCII in From'; + is( $status >> 8, 0, "The mail gateway exited normally" ); + TODO: { + local $TODO = "Currently don't handle non-ASCII for sender"; + ok( $id, "Created ticket" ); + } +} + +diag "Testing iso-8859-1 encoded non-ASCII in From: header"; +SKIP:{ + skip "Test requires Email::Address 1.893 or later, " + . "you have $Email::Address::VERSION", 3, + if $Email::Address::VERSION < 1.893; + + my $mail = Encode::encode( 'iso-8859-1', Encode::decode( "UTF-8", <<'.' ) ); +From: =?iso-8859-1?Q?Ren=E9?= <René@example.com> +Reply-To: =?iso-8859-1?Q?Ren=E9?= <René@example.com> +Subject: testing non-ASCII From +Content-Type: text/plain; charset=iso-8859-1 + +here's some content +. + + my ($status, $id); + warnings_like { ( $status, $id ) = RT::Test->send_via_mailgate($mail) } + [qr/Failed to parse Reply-To:.*, From:/, + qr/Couldn't parse or find sender's address/ + ], + 'Got parse error for iso-8859-1 in From'; + is( $status >> 8, 0, "The mail gateway exited normally" ); + TODO: { + local $TODO = "Currently don't handle non-ASCII in sender"; + ok( $id, "Created ticket" ); + } +} + +diag "No sender"; +{ + my $mail = <<'.'; +To: rt@example.com +Subject: testing non-ASCII From +Content-Type: text/plain; charset=iso-8859-1 + +here's some content +. + + my ($status, $id); + warnings_like { ( $status, $id ) = RT::Test->send_via_mailgate($mail) } + [qr/Couldn't parse or find sender's address/], + 'Got parse error with no sender fields'; + is( $status >> 8, 0, "The mail gateway exited normally" ); + ok( !$id, "No ticket created" ); +} diff --git a/rt/t/mail/not-supported-charset.t b/rt/t/mail/not-supported-charset.t new file mode 100644 index 000000000..bf2fe8f05 --- /dev/null +++ b/rt/t/mail/not-supported-charset.t @@ -0,0 +1,69 @@ +use strict; +use warnings; + +use RT::Test tests => undef; +use Test::Warn; + +my $queue = RT::Test->load_or_create_queue( Name => 'General' ); +ok $queue->id, 'loaded queue'; + +{ + my $mail = <<'END'; +From: root@localhost +Subject: test +Content-type: text/plain; charset="not-supported-encoding" + +ho hum just some text + +END + + my ($stat, $id); + warning_like { + ($stat, $id) = RT::Test->send_via_mailgate($mail); + is( $stat >> 8, 0, "The mail gateway exited normally" ); + ok( $id, "created ticket" ); + } qr/Encoding 'not-supported-encoding' is not supported/; + + 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' + ; +} + +{ + my $mail = <<'END'; +From: root@localhost +Subject: =?not-supported?Q?=07test=A9?= +Content-type: text/plain; charset="ascii" + +ho hum just some text + +END + + my ($stat, $id); + warning_like { + ($stat, $id) = RT::Test->send_via_mailgate($mail); + is( $stat >> 8, 0, "The mail gateway exited normally" ); + ok( $id, "created ticket" ); + } qr/Charset 'not-supported' is not supported/; + + my $ticket = RT::Ticket->new( RT->SystemUser ); + $ticket->Load($id); + ok $ticket->id, "loaded ticket"; + is $ticket->Subject, "\x{FFFD}test\x{FFFD}"; +} + +done_testing; diff --git a/rt/t/mail/one-time-recipients.t b/rt/t/mail/one-time-recipients.t index 3484d1470..a9881cded 100644 --- a/rt/t/mail/one-time-recipients.t +++ b/rt/t/mail/one-time-recipients.t @@ -1,6 +1,5 @@ use strict; use warnings; -use utf8; use RT::Test tests => 38; diff --git a/rt/t/mail/rfc2231-attachment.t b/rt/t/mail/rfc2231-attachment.t index fc74c4720..9610961f0 100644 --- a/rt/t/mail/rfc2231-attachment.t +++ b/rt/t/mail/rfc2231-attachment.t @@ -1,7 +1,6 @@ use strict; use warnings; -use utf8; use RT::Test tests => undef; my ($baseurl, $m) = RT::Test->started_ok; ok $m->login, 'logged in as root'; @@ -20,7 +19,7 @@ diag "encoded attachment filename with parameter continuations"; ok( $id, "Created ticket" ); $m->get_ok("/Ticket/Display.html?id=$id"); - $m->content_contains("新しいテキスト ドキュメント.txt", "found full filename"); + $m->content_contains(Encode::decode("UTF-8","新しいテキスト ドキュメント.txt"), "found full filename"); } undef $m; diff --git a/rt/t/mail/sendmail.t b/rt/t/mail/sendmail.t index 44903f375..56202ad5d 100644 --- a/rt/t/mail/sendmail.t +++ b/rt/t/mail/sendmail.t @@ -1,546 +1,150 @@ use strict; use warnings; -use File::Spec (); - -use RT::Test tests => 141; -use RT::EmailParser; -use RT::Tickets; -use RT::Action::SendEmail; +use RT::Test tests => undef; -my @_outgoing_messages; -my @scrips_fired; +use File::Spec (); +use Email::Abstract; -#We're not testing acls here. +# We're not testing acls here. my $everyone = RT::Group->new(RT->SystemUser); $everyone->LoadSystemInternalGroup('Everyone'); $everyone->PrincipalObj->GrantRight( Right =>'SuperUser' ); - -is (__PACKAGE__, 'main', "We're operating in the main package"); - -{ - no warnings qw/redefine/; - *RT::Action::SendEmail::SendMessage = sub { - my $self = shift; - my $MIME = shift; - - main::_fired_scrip($self->ScripObj); - main::is(ref($MIME) , 'MIME::Entity', "hey, look. it's a mime entity"); - }; -} - # some utils sub first_txn { return $_[0]->Transactions->First } sub first_attach { return first_txn($_[0])->Attachments->First } - -sub count_txns { return $_[0]->Transactions->Count } sub count_attachs { return first_txn($_[0])->Attachments->Count } -# instrument SendEmail to pass us what it's about to send. -# create a regular ticket - -my $parser = RT::EmailParser->new(); - -# Let's test to make sure a multipart/report is processed correctly -my $multipart_report_email = RT::Test::get_relocatable_file('multipart-report', - (File::Spec->updir(), 'data', 'emails')); -my $content = RT::Test->file_content($multipart_report_email); -# be as much like the mail gateway as possible. -use RT::Interface::Email; -my %args = (message => $content, queue => 1, action => 'correspond'); -my ($status, $msg) = RT::Interface::Email::Gateway(\%args); -ok($status, "successfuly used Email::Gateway interface") or diag("error: $msg"); -my $tickets = RT::Tickets->new(RT->SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick= $tickets->First(); -isa_ok($tick, "RT::Ticket", "got a ticket object"); -ok ($tick->Id, "found ticket ".$tick->Id); -like (first_txn($tick)->Content , qr/The original message was received/, "It's the bounce"); - - -# make sure it fires scrips. -is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); - -undef @scrips_fired; - - - - -$parser->ParseMIMEEntityFromScalar('From: root@localhost -To: rt@example.com -Subject: This is a test of new ticket creation as an unknown user - -Blah! -Foob!'); - - -use Data::Dumper; - -my $ticket = RT::Ticket->new(RT->SystemUser); -my ($id, undef, $create_msg ) = $ticket->Create(Requestor => ['root@localhost'], Queue => 'general', Subject => 'I18NTest', MIMEObj => $parser->Entity); -ok ($id,$create_msg); -$tickets = RT::Tickets->new(RT->SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); - $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); -is ($tick->Subject , 'I18NTest', "failed to create the new ticket from an unprivileged account"); - -# make sure it fires scrips. -is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); -# make sure it sends an autoreply -# make sure it sends a notification to adminccs - - -# we need to swap out SendMessage to test the new things we care about; -&utf8_redef_sendmessage; - -# create an iso 8859-1 ticket -@scrips_fired = (); - -my $iso_8859_1_ticket_email = RT::Test::get_relocatable_file( - 'new-ticket-from-iso-8859-1', (File::Spec->updir(), 'data', 'emails')); -$content = RT::Test->file_content($iso_8859_1_ticket_email); - - - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -use RT::Interface::Email; - - %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); - $tickets = RT::Tickets->new(RT->SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); - $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -like (first_txn($tick)->Content , qr/H\x{e5}vard/, "It's signed by havard. yay"); - - -# make sure it fires scrips. -is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); -# make sure it sends an autoreply - - -# make sure it sends a notification to adminccs - -# If we correspond, does it do the right thing to the outbound messages? - -$parser->ParseMIMEEntityFromScalar($content); - ($id, $msg) = $tick->Comment(MIMEObj => $parser->Entity); -ok ($id, $msg); - -$parser->ParseMIMEEntityFromScalar($content); -($id, $msg) = $tick->Correspond(MIMEObj => $parser->Entity); -ok ($id, $msg); - - - - - -# we need to swap out SendMessage to test the new things we care about; -&iso8859_redef_sendmessage; -RT->Config->Set( EmailOutputEncoding => 'iso-8859-1' ); -# create an iso 8859-1 ticket -@scrips_fired = (); - - $content = RT::Test->file_content($iso_8859_1_ticket_email); -# be as much like the mail gateway as possible. -use RT::Interface::Email; - - %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -$tickets = RT::Tickets->new(RT->SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); - $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -like (first_txn($tick)->Content , qr/H\x{e5}vard/, "It's signed by havard. yay"); - - -# make sure it fires scrips. -is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); -# make sure it sends an autoreply - - -# make sure it sends a notification to adminccs - - -# If we correspond, does it do the right thing to the outbound messages? - -$parser->ParseMIMEEntityFromScalar($content); - ($id, $msg) = $tick->Comment(MIMEObj => $parser->Entity); -ok ($id, $msg); - -$parser->ParseMIMEEntityFromScalar($content); -($id, $msg) = $tick->Correspond(MIMEObj => $parser->Entity); -ok ($id, $msg); - - -sub _fired_scrip { - my $scrip = shift; - push @scrips_fired, $scrip; -} +sub mail_in_ticket { + my ($filename) = @_; + my $path = RT::Test::get_relocatable_file($filename, + (File::Spec->updir(), 'data', 'emails')); + my $content = RT::Test->file_content($path); -sub utf8_redef_sendmessage { - no warnings qw/redefine/; - *RT::Action::SendEmail::SendMessage = sub { - my $self = shift; - my $MIME = shift; + RT::Test->clean_caught_mails; + my ($status, $id) = RT::Test->send_via_mailgate( $content ); + ok( $status, "Fed $filename into mailgate"); - my $scrip = $self->ScripObj->id; - ok(1, $self->ScripObj->ConditionObj->Name . " ".$self->ScripObj->ActionObj->Name); - main::_fired_scrip($self->ScripObj); - $MIME->make_singlepart; - main::is( ref($MIME) , 'MIME::Entity', - "hey, look. it's a mime entity" ); - main::is( ref( $MIME->head ) , 'MIME::Head', - "its mime header is a mime header. yay" ); - main::like( $MIME->head->get('Content-Type') , qr/utf-8/, - "Its content type is utf-8" ); - my $message_as_string = $MIME->bodyhandle->as_string(); - use Encode; - $message_as_string = Encode::decode_utf8($message_as_string); - main::like( - $message_as_string , qr/H\x{e5}vard/, -"The message's content contains havard's name. this will fail if it's not utf8 out"); + my $ticket = RT::Ticket->new(RT->SystemUser); + $ticket->Load($id); + ok( $ticket->Id, "Successfully created ticket ".$ticket->Id); - }; + my @mail = map {Email::Abstract->new($_)->cast('MIME::Entity')} + RT::Test->fetch_caught_mails; + return ($ticket, @mail); } -sub iso8859_redef_sendmessage { - no warnings qw/redefine/; - *RT::Action::SendEmail::SendMessage = sub { - my $self = shift; - my $MIME = shift; - - my $scrip = $self->ScripObj->id; - ok(1, $self->ScripObj->ConditionObj->Name . " ".$self->ScripObj->ActionObj->Name); - main::_fired_scrip($self->ScripObj); - $MIME->make_singlepart; - main::is( ref($MIME) , 'MIME::Entity', - "hey, look. it's a mime entity" ); - main::is( ref( $MIME->head ) , 'MIME::Head', - "its mime header is a mime header. yay" ); - main::like( $MIME->head->get('Content-Type') , qr/iso-8859-1/, - "Its content type is iso-8859-1 - " . $MIME->head->get("Content-Type") ); - my $message_as_string = $MIME->bodyhandle->as_string(); - use Encode; - $message_as_string = Encode::decode("iso-8859-1",$message_as_string); - main::like( - $message_as_string , qr/H\x{e5}vard/, "The message's content contains havard's name. this will fail if it's not utf8 out"); - }; +{ + my ($ticket) = mail_in_ticket('multipart-report'); + like( first_txn($ticket)->Content , qr/The original message was received/, "It's the bounce"); } +for my $encoding ('ISO-8859-1', 'UTF-8') { + RT->Config->Set( EmailOutputEncoding => $encoding ); - my $alt_umlaut_email = RT::Test::get_relocatable_file( - 'multipart-alternative-with-umlaut', (File::Spec->updir(), 'data', 'emails')); - $content = RT::Test->file_content($alt_umlaut_email); - -$parser->ParseMIMEEntityFromScalar($content); + my ($ticket, @mail) = mail_in_ticket('new-ticket-from-iso-8859-1'); + like (first_txn($ticket)->Content , qr/H\x{e5}vard/, "It's signed by havard. yay"); + is(@mail, 1); + like( $mail[0]->head->get('Content-Type') , qr/$encoding/, + "Its content type is $encoding" ); + my $message_as_string = $mail[0]->bodyhandle->as_string(); + $message_as_string = Encode::decode($encoding, $message_as_string); + like( $message_as_string , qr/H\x{e5}vard/, + "The message's content contains havard's name in $encoding"); +} -# be as much like the mail gateway as possible. { - no warnings qw/redefine/; - local *RT::Action::SendEmail::SendMessage = sub { return 1}; - - %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); - # TODO: following 5 lines should replaced by get_latest_ticket_ok() - $tickets = RT::Tickets->new(RT->SystemUser); - $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); - $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); - $tick = $tickets->First(); - - ok ($tick->Id, "found ticket ".$tick->Id); - - like (first_txn($tick)->Content , qr/causes Error/, "We recorded the content right as text-plain"); - is (count_attachs($tick) , 3 , "Has three attachments, presumably a text-plain, a text-html and a multipart alternative"); - + my ($ticket) = mail_in_ticket('multipart-alternative-with-umlaut'); + like( first_txn($ticket)->Content, qr/causes Error/, + "We recorded the content as containing 'causes error'"); + is( count_attachs($ticket), 3, + "Has three attachments, presumably a text-plain, a text-html and a multipart alternative"); } - - my $text_html_email = RT::Test::get_relocatable_file('text-html-with-umlaut', - (File::Spec->updir(), 'data', 'emails')); - $content = RT::Test->file_content($text_html_email); - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -&text_html_redef_sendmessage; - - %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); - $tickets = RT::Tickets->new(RT->SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); - $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -like (first_attach($tick)->Content , qr/causes Error/, "We recorded the content as containing 'causes error'") or diag( first_attach($tick)->Content ); -like (first_attach($tick)->ContentType , qr/text\/html/, "We recorded the content as text/html"); -is (count_attachs($tick), 1 , "Has one attachment, presumably a text-html and a multipart alternative"); - -sub text_html_redef_sendmessage { - no warnings qw/redefine/; - *RT::Action::SendEmail::SendMessage = sub { - my $self = shift; - my $MIME = shift; - return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" ); - is ($MIME->parts, 0, "generated correspondence mime entity - does not have parts"); - is ($MIME->head->mime_type , "text/plain", "The mime type is a plain"); - }; +{ + my ($ticket, @mail) = mail_in_ticket('text-html-with-umlaut'); + like( first_attach($ticket)->Content, qr/causes Error/, + "We recorded the content as containing 'causes error'"); + like( first_attach($ticket)->ContentType , qr/text\/html/, + "We recorded the content as text/html"); + is (count_attachs($ticket), 1, + "Has one attachment, just a text-html"); + + is(@mail, 1); + is( $mail[0]->parts, 0, "generated correspondence mime entity does not have parts"); + is( $mail[0]->head->mime_type , "text/plain", "The mime type is a plain"); } - - my $russian_email = RT::Test::get_relocatable_file('text-html-in-russian', - (File::Spec->updir(), 'data', 'emails')); - $content = RT::Test->file_content($russian_email); - -$parser->ParseMIMEEntityFromScalar($content); - -# be as much like the mail gateway as possible. -&text_html_redef_sendmessage; - - %args = (message => $content, queue => 1, action => 'correspond'); - { - -my @warnings; -local $SIG{__WARN__} = sub { - push @warnings, "@_"; -}; - -RT::Interface::Email::Gateway(\%args); - -TODO: { - local $TODO = -'need a better approach of encoding converter, should be fixed in 4.2'; -ok( @warnings == 1 || @warnings == 2, "1 or 2 warnings are ok" ); -ok( @warnings == 1 || ( @warnings == 2 && $warnings[1] eq $warnings[0] ), - 'if there are 2 warnings, they should be same' ); - -like( - $warnings[0], - qr/\QEncoding error: "\x{041f}" does not map to iso-8859-1/, -"The badly formed Russian spam we have isn't actually well-formed UTF8, which makes Encode (correctly) warn", -); - -} + my @InputEncodings = RT->Config->Get('EmailInputEncodings'); + RT->Config->Set( EmailInputEncodings => 'koi8-r', @InputEncodings ); + RT->Config->Set( EmailOutputEncoding => 'koi8-r' ); + + my ($ticket, @mail) = mail_in_ticket('russian-subject-no-content-type'); + like( first_attach($ticket)->ContentType, qr/text\/plain/, + "We recorded the content type right"); + is( count_attachs($ticket), 1, + "Has one attachment, presumably a text-plain"); + is( $ticket->Subject, Encode::decode("UTF-8","тест тест"), + "Recorded the subject right"); + + is(@mail, 1); + is( $mail[0]->head->mime_type , "text/plain", "The only part is text/plain "); + like( $mail[0]->head->get("subject"), qr/\Q=?KOI8-R?B?W2V4YW1wbGUuY29tICM2XSBBdXRvUmVwbHk6INTF09Qg1MXT1A==?=\E/, + "The subject is encoded correctly"); + + RT->Config->Set(EmailInputEncodings => @InputEncodings ); + RT->Config->Set(EmailOutputEncoding => 'utf-8'); } - $tickets = RT::Tickets->new(RT->SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); - $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -like (first_attach($tick)->ContentType , qr/text\/html/, "We recorded the content right as text-html"); - -is (count_attachs($tick) ,1 , "Has one attachment, presumably a text-html and a multipart alternative"); - - - -RT->Config->Set( EmailInputEncodings => 'koi8-r', RT->Config->Get('EmailInputEncodings') ); -RT->Config->Set( EmailOutputEncoding => 'koi8-r' ); -my $russian_subject_email = RT::Test::get_relocatable_file( - 'russian-subject-no-content-type', (File::Spec->updir(), 'data', 'emails')); -$content = RT::Test->file_content($russian_subject_email); - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -&text_plain_russian_redef_sendmessage; - %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); - $tickets = RT::Tickets->new(RT->SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -$tick= $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -like (first_attach($tick)->ContentType , qr/text\/plain/, "We recorded the content type right"); -is (count_attachs($tick) ,1 , "Has one attachment, presumably a text-plain"); -is ($tick->Subject, "\x{442}\x{435}\x{441}\x{442} \x{442}\x{435}\x{441}\x{442}", "Recorded the subject right"); -sub text_plain_russian_redef_sendmessage { - no warnings qw/redefine/; - *RT::Action::SendEmail::SendMessage = sub { - my $self = shift; - my $MIME = shift; - return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" ); - is ($MIME->head->mime_type , "text/plain", "The only part is text/plain "); - my $subject = $MIME->head->get("subject"); - chomp($subject); - #is( $subject , /^=\?KOI8-R\?B\?W2V4YW1wbGUuY39tICM3XSDUxdPUINTF09Q=\?=/ , "The $subject is encoded correctly"); - }; +{ + my ($ticket, @mail) = mail_in_ticket('nested-rfc-822'); + is( $ticket->Subject, "[Jonas Liljegren] Re: [Para] Niv\x{e5}er?"); + like( first_attach($ticket)->ContentType, qr/multipart\/mixed/, + "We recorded the content type right"); + is( count_attachs($ticket), 5, + "Has five attachments, presumably a text-plain and a message RFC 822 and another plain"); + + is(@mail, 1); + is( $mail[0]->head->mime_type , "text/plain", "The outgoing mail is plain text"); + + my $encoded_subject = $mail[0]->head->get("Subject"); + chomp $encoded_subject; + my $subject = Encode::decode('MIME-Header',$encoded_subject); + like($subject, qr/Niv\x{e5}er/, "The subject matches the word - $subject"); } -my @input_encodings = RT->Config->Get( 'EmailInputEncodings' ); -shift @input_encodings; -RT->Config->Set(EmailInputEncodings => @input_encodings ); -RT->Config->Set(EmailOutputEncoding => 'utf-8'); - - - -my $nested_rfc822_email = RT::Test::get_relocatable_file('nested-rfc-822', - (File::Spec->updir(), 'data', 'emails')); -$content = RT::Test->file_content($nested_rfc822_email); -ok ($content, "Loaded nested-rfc-822 to test"); - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -&text_plain_nested_redef_sendmessage; - %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); - $tickets = RT::Tickets->new(RT->SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -$tick= $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); -is ($tick->Subject, "[Jonas Liljegren] Re: [Para] Niv\x{e5}er?"); -like (first_attach($tick)->ContentType , qr/multipart\/mixed/, "We recorded the content type right"); -is (count_attachs($tick) , 5 , "Has one attachment, presumably a text-plain and a message RFC 822 and another plain"); -sub text_plain_nested_redef_sendmessage { - no warnings qw/redefine/; - *RT::Action::SendEmail::SendMessage = sub { - my $self = shift; - my $MIME = shift; - - return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" ); - - is ($MIME->head->mime_type , "multipart/mixed", "It is a mixed multipart"); - - use MIME::Words qw(:all); - my $encoded_subject = $MIME->head->get("subject"); - my $subject = decode_mimewords($encoded_subject); - - # MIME::Words isn't actually UTF8-safe. There go 4 hours I'll never get back. - utf8::decode($subject); - like($subject, qr/Niv\x{e5}er/, "The subject matches the word - $subject"); - - 1; - }; +{ + my ($ticket) = mail_in_ticket('notes-uuencoded'); + like( first_txn($ticket)->Content, qr/from Lotus Notes/, + "We recorded the content right"); + is( count_attachs($ticket), 3, "Has three attachments"); } - - - - my $uuencoded_email = RT::Test::get_relocatable_file('notes-uuencoded', - (File::Spec->updir(), 'data', 'emails')); - $content = RT::Test->file_content($uuencoded_email); - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. { - no warnings qw/redefine/; - local *RT::Action::SendEmail::SendMessage = sub { return 1}; - %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); - $tickets = RT::Tickets->new(RT->SystemUser); - $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); - $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); - $tick= $tickets->First(); - ok ($tick->Id, "found ticket ".$tick->Id); - - like (first_txn($tick)->Content , qr/from Lotus Notes/, "We recorded the content right"); - is (count_attachs($tick) , 3 , "Has three attachments"); + my ($ticket) = mail_in_ticket('crashes-file-based-parser'); + like( first_txn($ticket)->Content, qr/FYI/, "We recorded the content right"); + is( count_attachs($ticket), 5, "Has five attachments"); } +{ + my ($ticket) = mail_in_ticket('rt-send-cc'); + my $cc = first_attach($ticket)->GetHeader('RT-Send-Cc'); + like ($cc, qr/test$_/, "Found test $_") for 1..5; +} - - my $crashes_file_based_parser_email = RT::Test::get_relocatable_file( - 'crashes-file-based-parser', (File::Spec->updir(), 'data', 'emails')); - $content = RT::Test->file_content($crashes_file_based_parser_email); - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. - -no warnings qw/redefine/; -local *RT::Action::SendEmail::SendMessage = sub { return 1}; - %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); - $tickets = RT::Tickets->new(RT->SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -$tick= $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -like (first_txn($tick)->Content , qr/FYI/, "We recorded the content right"); -is (count_attachs($tick) , 5 , "Has three attachments"); - - - - - - - my $rt_send_cc_email = RT::Test::get_relocatable_file('rt-send-cc', - (File::Spec->updir(), 'data', 'emails')); - $content = RT::Test->file_content($rt_send_cc_email); - -$parser->ParseMIMEEntityFromScalar($content); - - - - %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); - $tickets = RT::Tickets->new(RT->SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -$tick= $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -my $cc = first_attach($tick)->GetHeader('RT-Send-Cc'); -like ($cc , qr/test1/, "Found test 1"); -like ($cc , qr/test2/, "Found test 2"); -like ($cc , qr/test3/, "Found test 3"); -like ($cc , qr/test4/, "Found test 4"); -like ($cc , qr/test5/, "Found test 5"); - - -diag q{regression test for #5248 from rt3.fsck.com}; { - my $subject_folding_email = RT::Test::get_relocatable_file( - 'subject-with-folding-ws', (File::Spec->updir(), 'data', 'emails')); - my $content = RT::Test->file_content($subject_folding_email); - my ($status, $msg, $ticket) = RT::Interface::Email::Gateway( - { message => $content, queue => 1, action => 'correspond' } - ); - ok ($status, 'created ticket') or diag "error: $msg"; - ok ($ticket->id, "found ticket ". $ticket->id); + diag "Regression test for #5248 from rt3.fsck.com"; + my ($ticket) = mail_in_ticket('subject-with-folding-ws'); is ($ticket->Subject, 'test', 'correct subject'); } -diag q{regression test for #5248 from rt3.fsck.com}; { - my $long_subject_email = RT::Test::get_relocatable_file('very-long-subject', - (File::Spec->updir(), 'data', 'emails')); - my $content = RT::Test->file_content($long_subject_email); - my ($status, $msg, $ticket) = RT::Interface::Email::Gateway( - { message => $content, queue => 1, action => 'correspond' } - ); - ok ($status, 'created ticket') or diag "error: $msg"; - ok ($ticket->id, "found ticket ". $ticket->id); + diag "Regression test for #5248 from rt3.fsck.com"; + my ($ticket) = mail_in_ticket('very-long-subject'); is ($ticket->Subject, '0123456789'x20, 'correct subject'); } - - -# Don't taint the environment -$everyone->PrincipalObj->RevokeRight(Right =>'SuperUser'); +done_testing; diff --git a/rt/t/mail/threading.t b/rt/t/mail/threading.t index 773b7207f..9d3a07751 100644 --- a/rt/t/mail/threading.t +++ b/rt/t/mail/threading.t @@ -1,6 +1,5 @@ use strict; use warnings; -use utf8; use RT::Test tests => 22; RT->Config->Set( NotifyActor => 1 ); diff --git a/rt/t/mail/wrong_mime_charset.t b/rt/t/mail/wrong_mime_charset.t index 530b5f38d..6bbaca1bb 100644 --- a/rt/t/mail/wrong_mime_charset.t +++ b/rt/t/mail/wrong_mime_charset.t @@ -3,10 +3,8 @@ use warnings; use RT::Test nodb => 1, tests => 6; use_ok('RT::I18N'); -use utf8; -use Encode; -my $test_string = 'À'; -my $encoded_string = encode( 'iso-8859-1', $test_string ); +my $test_string = Encode::decode("UTF-8", 'À'); +my $encoded_string = Encode::encode( 'iso-8859-1', $test_string ); my $mime = MIME::Entity->build( "Subject" => $encoded_string, "Data" => [$encoded_string], @@ -40,10 +38,10 @@ like( "We can't encode something into the wrong encoding without Encode complaining" ); -my $subject = decode( 'iso-8859-1', $mime->head->get('Subject') ); +my $subject = Encode::decode( 'iso-8859-1', $mime->head->get('Subject') ); chomp $subject; is( $subject, $test_string, 'subject is set to iso-8859-1' ); -my $body = decode( 'iso-8859-1', $mime->stringify_body ); +my $body = Encode::decode( 'iso-8859-1', $mime->stringify_body ); chomp $body; is( $body, $test_string, 'body is set to iso-8859-1' ); } |