X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Ft%2Fmail%2Fgnupg-incoming.t;h=48d2d9b73a83f544d8b734c9812312891ca12c5d;hb=919e930aa9279b3c5cd12b593889cd6de79d67bf;hp=ec313330a44b3d390b2cb74d56255e63c1d90578;hpb=63a268637b2d51a8766412617724b9436439deb6;p=freeside.git diff --git a/rt/t/mail/gnupg-incoming.t b/rt/t/mail/gnupg-incoming.t index ec313330a..48d2d9b73 100644 --- a/rt/t/mail/gnupg-incoming.t +++ b/rt/t/mail/gnupg-incoming.t @@ -1,48 +1,37 @@ -#!/usr/bin/perl use strict; use warnings; -use RT::Test tests => 39; - -plan skip_all => 'GnuPG required.' - unless eval 'use GnuPG::Interface; 1'; -plan skip_all => 'gpg executable is required.' - unless RT::Test->find_executable('gpg'); +my $homedir; +BEGIN { + require RT::Test; + $homedir = + RT::Test::get_abs_relocatable_dir( File::Spec->updir(), + qw/data gnupg keyrings/ ); +} +use RT::Test::GnuPG + tests => 53, + actual_server => 1, + gnupg_options => { + passphrase => 'rt-test', + homedir => $homedir, + }; -use File::Temp; -use Cwd 'getcwd'; use String::ShellQuote 'shell_quote'; use IPC::Run3 'run3'; - -my $homedir = RT::Test::get_abs_relocatable_dir(File::Spec->updir(), - qw(data gnupg keyrings)); - -# catch any outgoing emails -RT::Test->set_mail_catcher; - -RT->Config->Set( 'GnuPG', - Enable => 1, - OutgoingMessagesFormat => 'RFC' ); - -RT->Config->Set( 'GnuPGOptions', - homedir => $homedir, - 'no-permission-warning' => undef); - -RT->Config->Set( 'MailPlugins' => 'Auth::MailFrom', 'Auth::GnuPG' ); +use MIME::Base64; my ($baseurl, $m) = RT::Test->started_ok; # configure key for General queue -$m->get( $baseurl."?user=root;pass=password" ); -$m->content_like(qr/Logout/, 'we did log in'); +ok( $m->login, 'we did log in' ); $m->get( $baseurl.'/Admin/Queues/'); $m->follow_link_ok( {text => 'General'} ); $m->submit_form( form_number => 3, fields => { CorrespondAddress => 'general@example.com' } ); $m->content_like(qr/general\@example.com.* - never/, 'has key info.'); -ok(my $user = RT::User->new($RT::SystemUser)); +ok(my $user = RT::User->new(RT->SystemUser)); ok($user->Load('root'), "Loaded user 'root'"); $user->SetEmailAddress('recipient@example.com'); @@ -72,7 +61,7 @@ RT::Test->close_mailgate_ok($mail); qr/^X-RT-Incoming-Encryption: Not encrypted/m, 'recorded incoming mail that is not encrypted' ); - like( $txn->Attachments->First->Content, qr'Blah'); + like( $txn->Attachments->First->Content, qr/Blah/); } # test for signed mail @@ -80,7 +69,7 @@ my $buf = ''; run3( shell_quote( - qw(gpg --armor --sign), + qw(gpg --batch --no-tty --armor --sign), '--default-key' => 'recipient@example.com', '--homedir' => $homedir, '--passphrase' => 'recipient', @@ -114,7 +103,7 @@ RT::Test->close_mailgate_ok($mail); 'recorded incoming mail that is encrypted' ); # test for some kind of PGP-Signed-By: Header - like( $attach->Content, qr'fnord'); + like( $attach->Content, qr/fnord/); } # test for clear-signed mail @@ -122,7 +111,7 @@ $buf = ''; run3( shell_quote( - qw(gpg --armor --sign --clearsign), + qw(gpg --batch --no-tty --armor --sign --clearsign), '--default-key' => 'recipient@example.com', '--homedir' => $homedir, '--passphrase' => 'recipient', @@ -155,7 +144,7 @@ RT::Test->close_mailgate_ok($mail); 'recorded incoming mail that is encrypted' ); # test for some kind of PGP-Signed-By: Header - like( $attach->Content, qr'clearfnord'); + like( $attach->Content, qr/clearfnord/); } # test for signed and encrypted mail @@ -163,7 +152,7 @@ $buf = ''; run3( shell_quote( - qw(gpg --encrypt --armor --sign), + qw(gpg --batch --no-tty --encrypt --armor --sign), '--recipient' => 'general@example.com', '--default-key' => 'recipient@example.com', '--homedir' => $homedir, @@ -201,7 +190,44 @@ RT::Test->close_mailgate_ok($mail); 'PGP', 'recorded incoming mail that is encrypted' ); - like( $attach->Content, qr'orz'); + like( $attach->Content, qr/orz/); + + is( $orig->GetHeader('Content-Type'), 'application/x-rt-original-message'); + ok(index($orig->Content, $buf) != -1, 'found original msg'); +} + + +# test that if it gets base64 transfer-encoded, we still get the content out +$buf = encode_base64($buf); +$mail = RT::Test->open_mailgate_ok($baseurl); +print $mail <<"EOF"; +From: recipient\@example.com +To: general\@$RT::rtname +Content-transfer-encoding: base64 +Subject: Encrypted message for queue + +$buf +EOF +RT::Test->close_mailgate_ok($mail); + +{ + my $tick = RT::Test->last_ticket; + is( $tick->Subject, 'Encrypted message for queue', + "Created the ticket" + ); + + my $txn = $tick->Transactions->First; + my ($msg, $attach, $orig) = @{$txn->Attachments->ItemsArrayRef}; + + is( $msg->GetHeader('X-RT-Incoming-Encryption'), + 'Success', + 'recorded incoming mail that is encrypted' + ); + is( $msg->GetHeader('X-RT-Privacy'), + 'PGP', + 'recorded incoming mail that is encrypted' + ); + like( $attach->Content, qr/orz/); is( $orig->GetHeader('Content-Type'), 'application/x-rt-original-message'); ok(index($orig->Content, $buf) != -1, 'found original msg'); @@ -212,7 +238,7 @@ $buf = ''; run3( shell_quote( - qw(gpg --armor --sign), + qw(gpg --batch --no-tty --armor --sign), '--default-key' => 'rt@example.com', '--homedir' => $homedir, '--passphrase' => 'test', @@ -248,7 +274,7 @@ $buf = ''; run3( shell_quote( - qw(gpg --armor --encrypt), + qw(gpg --batch --no-tty --armor --encrypt), '--recipient' => 'random@localhost', '--homedir' => $homedir, ), @@ -275,7 +301,7 @@ RT::Test->close_mailgate_ok($mail); TODO: { local $TODO = "this test requires keys associated with queues"; - unlike( $attach->Content, qr'should not be there either'); + unlike( $attach->Content, qr/should not be there either/); } } @@ -285,7 +311,7 @@ $buf = ''; run3( shell_quote( - qw(gpg --armor --encrypt), + qw(gpg --batch --no-tty --armor --encrypt), '--recipient' => 'rt@example.com', '--homedir' => $homedir, ), @@ -315,6 +341,34 @@ is(@mail, 1, 'caught outgoing mail.'); my $tick = RT::Test->last_ticket; my $txn = $tick->Transactions->First; my ($msg, $attach) = @{$txn->Attachments->ItemsArrayRef}; - unlike( ($attach ? $attach->Content : ''), qr'really should not be there either'); + unlike( ($attach ? $attach->Content : ''), qr/really should not be there either/); } + +# test that if it gets base64 transfer-encoded long mail then it doesn't hang +{ + local $SIG{ALRM} = sub { + ok 0, "timed out, web server is probably in deadlock"; + exit; + }; + alarm 30; + $buf = encode_base64('a'x(250*1024)); + $mail = RT::Test->open_mailgate_ok($baseurl); + print $mail <<"EOF"; +From: recipient\@example.com +To: general\@$RT::rtname +Content-transfer-encoding: base64 +Subject: Long not encrypted message for queue + +$buf +EOF + RT::Test->close_mailgate_ok($mail); + alarm 0; + + my $tick = RT::Test->last_ticket; + is( $tick->Subject, 'Long not encrypted message for queue', + "Created the ticket" + ); + my $content = $tick->Transactions->First->Content; + like $content, qr/a{1024,}/, 'content is not lost'; +}