fix A/R report
[freeside.git] / rt / t / mail / gnupg-incoming.t
index 230aa9c..54b30d2 100644 (file)
@@ -1,35 +1,25 @@
-#!/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;
 
@@ -38,10 +28,10 @@ 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');
 
@@ -71,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
@@ -79,10 +69,11 @@ 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',
+        '--no-permission-warning',
     ),
     \"fnord\r\n",
     \$buf,
@@ -113,7 +104,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
@@ -121,10 +112,11 @@ $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',
+        '--no-permission-warning',
     ),
     \"clearfnord\r\n",
     \$buf,
@@ -154,7 +146,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
@@ -162,11 +154,12 @@ $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,
         '--passphrase'  => 'recipient',
+        '--no-permission-warning',
     ),
     \"orzzzzzz\r\n",
     \$buf,
@@ -197,10 +190,47 @@ RT::Test->close_mailgate_ok($mail);
         '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');
@@ -211,10 +241,11 @@ $buf = '';
 
 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,
@@ -247,9 +278,10 @@ $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,
@@ -274,7 +306,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/);
     }
 }
 
@@ -284,9 +316,10 @@ $buf = '';
 
 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,
@@ -314,6 +347,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';
+}