-#!/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' } );
+ 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');
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
run3(
shell_quote(
- qw(gpg --armor --sign),
+ qw(gpg --batch --no-tty --armor --sign),
'--default-key' => 'recipient@example.com',
'--homedir' => $homedir,
'--passphrase' => 'recipient',
+ '--no-permission-warning',
),
\"fnord\r\n",
\$buf,
'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
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',
+ '--no-permission-warning',
),
\"clearfnord\r\n",
\$buf,
'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
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,
'--passphrase' => 'recipient',
+ '--no-permission-warning',
),
\"orzzzzzz\r\n",
\$buf,
'recorded incoming mail that is encrypted'
);
is( $msg->GetHeader('X-RT-Privacy'),
- 'PGP',
+ 'GnuPG',
'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'),
+ 'GnuPG',
+ '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');
run3(
shell_quote(
- qw(gpg --armor --sign),
+ qw(gpg --batch --no-tty --armor --sign),
'--default-key' => 'rt@example.com',
'--homedir' => $homedir,
'--passphrase' => 'test',
+ '--no-permission-warning',
),
\"alright\r\n",
\$buf,
run3(
shell_quote(
- qw(gpg --armor --encrypt),
+ qw(gpg --batch --no-tty --armor --encrypt),
'--recipient' => 'random@localhost',
'--homedir' => $homedir,
+ '--no-permission-warning',
),
\"should not be there either\r\n",
\$buf,
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/);
}
}
run3(
shell_quote(
- qw(gpg --armor --encrypt),
+ qw(gpg --batch --no-tty --armor --encrypt),
'--recipient' => 'rt@example.com',
'--homedir' => $homedir,
+ '--no-permission-warning',
),
\"really should not be there either\r\n",
\$buf,
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';
+}