[Bps-public-commit] Mail-GnuPG branch, master, updated. rel_0.08-45-g5d1a2d6
Alex Vandiver
alexmv at bestpractical.com
Mon Dec 12 12:13:31 EST 2011
The branch, master has been updated
via 5d1a2d66506831a93cae1bb5d6f30830f5abb112 (commit)
via 0d2b42bce68a36df09b63fbfa4c6c53e1272d1f3 (commit)
via 348af04153341552c34aa759c8f82635fefdf5a9 (commit)
via d0faa9ba2beb0563a928e9a95a8ef13d834e0eb7 (commit)
via 1020613856d72d9f2c9a57444b14d155c703d062 (commit)
via 2fe71446974a2174b207cf2c2c79f7a6cacff501 (commit)
via 21942875b7a0db611d13675e6b6f23ad88bd558d (commit)
via dad354e47885b687409181cecb5cb9f6780ddb77 (commit)
via e7c866c8710f1bf01fbc338982778cdade92f05a (commit)
via ebb203c09030b8eba666d6b345014126430dcbbe (commit)
via b26c58c079d7489295a3f88fe958d6bd3b3e68c4 (commit)
via e7eb5978a83e3ef25eec6fb346074274ff26506b (commit)
via 7a90f35cdb900a8c04fcb27f848a38326a2889b5 (commit)
via 664db9eba2194235803d884e279499ccb5ed8294 (commit)
via 7d05e0c27a4082cef654d3bf85706d652b40b083 (commit)
via 6268e51e9f1eb00677cce25c5b1666251b970265 (commit)
via 925cef953a5e68ec8ce37fc0314cd7efdf59251b (commit)
via b2f805b6c4dd4401939a020c89217d5a4758ddd0 (commit)
via 5ebf14cd1397a6b434f20f5e402b9d5dc72c4ce5 (commit)
via f43d4ced6e7c30740c991420a0463cec62b5d6ee (commit)
via fc3f5df682383339b0ae3203f96819df803b42c9 (commit)
via 4ff51b97747a44ea442bc98b6b1340b8a40a678a (commit)
via e8978b81ae98248a72cfb2994f52ee231eaf5f34 (commit)
via ada701b55a84fcca517154454527ce0467c17223 (commit)
via deaa3dd4813cfa78ffcdea069cfceb804ebb0207 (commit)
via 09d29796e9bb82dfaedd3278e86a19c0e513cbd8 (commit)
via 48840a7675dd9bff239814a900b3fb8fc1819d19 (commit)
via 3028cbbbb46191be13ce63baedb123ead53a866a (commit)
via 54aa5cf90a2c18c810c5e0d6aa9f9edb7105cca0 (commit)
via b9bdabbb94eceee4d19c1a5c4a0c207f5970a4fb (commit)
via e487245316949d3adc0ed93bcc0ac1736a290f65 (commit)
via c181f79845524245cb6952ce1120f55c0eebe67c (commit)
via 9400eaae64e7202f2d987c86b588cfcd20e9ba58 (commit)
via ec59ead1409f0ca19b924b1c5e3025c774a06cab (commit)
via ee0511ed8973eaad7753e5ce0b312d58589ce8f6 (commit)
via 9a5c132ae97b197730b907447d51507be061fd8e (commit)
via c9093ebd3bb9ac385ff856b75edd0dd502b5d002 (commit)
via 8ae33a96eb5b68e72817937188972f5d950f334b (commit)
via 58877893c9931e1edcd7727a5cd258d9eae7deea (commit)
via 582df2cfdaa8a9d8d47550c32062996988507f9d (commit)
from 736000bdabd8a9ff29a65fdbd7d02a26d9975f42 (commit)
Summary of changes:
.releaserc | 3 -
Build.PL | 32 ++
Changes | 12 +-
MANIFEST | 20 +-
Makefile.PL | 19 --
README | 10 +-
GnuPG.pm => lib/Mail/GnuPG.pm | 41 ++-
t/00.signature.t | 35 ++
t/{00.load.t => 05.load.t} | 0
t/20.inline-verify.t | 35 ++
t/25.multipart-verify.t | 35 ++
t/30.inline-decrypt.t | 53 +++
t/{round-trip.t => agent.t} | 41 +++-
t/import_keys.pl | 19 ++
t/msg/inline-encrypted-qp.eml | 31 ++
t/msg/inline-signed-qp.eml | 26 ++
t/msg/multipart-signed-qp.eml | 137 ++++++++
t/pubkeys.asc | 704 +++++++++++++++++++++++++++++++++++++++++
t/round-trip.t | 46 ++--
test.pl | 17 -
20 files changed, 1228 insertions(+), 88 deletions(-)
delete mode 100644 .releaserc
create mode 100644 Build.PL
delete mode 100644 Makefile.PL
rename GnuPG.pm => lib/Mail/GnuPG.pm (95%)
create mode 100644 t/00.signature.t
rename t/{00.load.t => 05.load.t} (100%)
create mode 100644 t/20.inline-verify.t
create mode 100644 t/25.multipart-verify.t
create mode 100644 t/30.inline-decrypt.t
copy t/{round-trip.t => agent.t} (57%)
create mode 100644 t/import_keys.pl
create mode 100644 t/msg/inline-encrypted-qp.eml
create mode 100644 t/msg/inline-signed-qp.eml
create mode 100644 t/msg/multipart-signed-qp.eml
create mode 100644 t/pubkeys.asc
delete mode 100644 test.pl
- Log -----------------------------------------------------------------
commit 582df2cfdaa8a9d8d47550c32062996988507f9d
Author: David Bremner <bremner at unb.ca>
Date: Sun Sep 26 17:59:48 2010 -0700
Add support for gpg agent.
This is is controlled by a flag use_agent to the new() method.
This has been mainly tested with the decrypt operation.
diff --git a/GnuPG.pm b/GnuPG.pm
index 629880c..0192453 100644
--- a/GnuPG.pm
+++ b/GnuPG.pm
@@ -44,7 +44,7 @@ use Errno qw(EPIPE);
key => gpg key id
keydir => gpg configuration/key directory
passphrase => primary key password
-
+ use_agent => use gpg-agent if non-zero
# FIXME: we need more things here, maybe primary key id.
@@ -58,6 +58,7 @@ sub new {
keydir => undef,
passphrase => "",
gpg_path => "gpg",
+ use_agent => 0,
@_
};
$self->{last_message} = [];
@@ -114,6 +115,11 @@ sub _set_options {
=cut
+sub _agent_args{
+ my $self=shift;
+ return $self->{use_agent} ? ('command_args' => ['--use-agent']) : ();
+}
+
sub decrypt {
my ($self, $message) = @_;
my $ciphertext = "";
@@ -161,7 +167,7 @@ sub decrypt {
);
# this sets up the communication
- my $pid = $gnupg->decrypt( handles => $handles );
+ my $pid = $gnupg->decrypt( handles => $handles , $self->_agent_args );
die "NO PASSPHRASE" unless defined $passphrase_fh;
my $read = _communicate([$output, $error, $status_fh],
@@ -542,7 +548,7 @@ sub mime_sign {
passphrase => $passphrase_fh,
status => $status_fh,
);
- my $pid = $gnupg->detach_sign( handles => $handles );
+ my $pid = $gnupg->detach_sign( handles => $handles, $self->_agent_args );
die "NO PASSPHRASE" unless defined $passphrase_fh;
# this passes in the plaintext
@@ -641,7 +647,7 @@ sub clear_sign {
stderr => $error,
);
- my $pid = $gnupg->clearsign ( handles => $handles );
+ my $pid = $gnupg->clearsign ( handles => $handles, $self->_agent_args );
my $plaintext = $body->as_string;
@@ -744,7 +750,7 @@ sub _ascii_encrypt {
my $pid = do {
if ( $sign ) {
- $gnupg->sign_and_encrypt ( handles => $handles );
+ $gnupg->sign_and_encrypt ( handles => $handles, $self->_agent_args );
} else {
$gnupg->encrypt ( handles => $handles );
}
@@ -844,7 +850,7 @@ sub _mime_encrypt {
my $pid = do {
if ($sign) {
- $gnupg->sign_and_encrypt( handles => $handles );
+ $gnupg->sign_and_encrypt( handles => $handles, $self->_agent_args );
} else {
$gnupg->encrypt( handles => $handles );
}
commit 58877893c9931e1edcd7727a5cd258d9eae7deea
Author: David Bremner <bremner at unb.ca>
Date: Sat Aug 14 12:05:18 2010 -0300
Add test for gpg-agent handling.
The only real fragile bit is that gpg-preset-passphrase is installed
in different places on different OSes, and often not in the user path.
For the moment, hard-code a FHS compliant path, and allow the location
to be set by an environment variable.
This is just a copy of the "roundtrip.t" test that already exists,
with agent handling attached to the front. It could probably be made
shorter since some of the tests here do not rely on passphrases.
Also, it might be desirable to re-order the tests.
diff --git a/t/agent.t b/t/agent.t
new file mode 100644
index 0000000..13bec4d
--- /dev/null
+++ b/t/agent.t
@@ -0,0 +1,121 @@
+# -*- perl -*-
+
+use Test::More;
+use File::Temp qw(tempdir);
+use Mail::GnuPG;
+use MIME::Entity;
+use strict;
+no warnings 'redefine'; # fix this later
+
+my $KEY = "EFEA4EAD"; # 49539D60EFEA4EAD
+my $WHO = "Mail::GnuPG Test Key <mail\@gnupg.dom>";
+
+unless ( 0 == system("gpg --version 2>&1 >/dev/null") &&
+ 0 == system("gpg-agent --version 2>&1 >/dev/null")) {
+ plan skip_all => "gpg, gpg-agent in path required for testing agent";
+ goto end;
+}
+
+my $preset=$ENV{GPG_PRESET_PASSPHRASE} || "/usr/lib/gnupg2/gpg-preset-passphrase";
+
+unless (0 == system("$preset --version 2>&1 >/dev/null")) {
+ plan skip_all => "gpg-preset-passphrase not found; set GPG_PRESET_PASSPHRASE in environment to location of binary";
+ goto end;
+}
+
+my $tmpdir = tempdir( "mgtXXXXX", CLEANUP => 1);
+
+unless ( 0 == system("gpg --homedir $tmpdir --trusted-key 0x49539D60EFEA4EAD --import t/test-key.pgp 2>&1 >/dev/null")) {
+ plan skip_all => "unable to import testing keys";
+ goto end;
+}
+
+unless (open AGENT, "gpg-agent --disable-scdaemon --allow-preset --daemon|") {
+ plan skip_all =>"unable to start gpg-agent";
+ goto end;
+}
+
+my ($agent_pid,$agent_info);
+while (<AGENT>){
+ if (m/GPG_AGENT_INFO=([^;]*);/){
+ $agent_info=$1;
+ $ENV{'GPG_AGENT_INFO'}=$agent_info;
+ my @parts=split(':',$agent_info);
+ $agent_pid=$parts[1];
+ }
+}
+
+# gpg-preset-passphrase uses the fingerprint of the subkey, rather than the id.
+unless ( 0 == system ("$preset --preset -P passphrase " .
+ "576AE2D0BC6974C083705EE033A736779FE08E94")
+ && 0 == system ("$preset --preset -P passphrase " .
+ "8E136E6F34C0D4CD941A9DB749539D60EFEA4EAD") ){
+ plan skip_all =>"unable to cache passphrase";
+ goto end;
+}
+
+plan tests => 20;
+
+
+my $mg = new Mail::GnuPG( key => '49539D60EFEA4EAD',
+ keydir => $tmpdir,
+ use_agent => 1);
+
+isa_ok($mg,"Mail::GnuPG");
+
+my $line = "x\n";
+my $string = $line x 100000;
+
+my $copy;
+my $me = MIME::Entity->build(From => 'me at myhost.com',
+ To => 'you at yourhost.com',
+ Subject => "Hello, nurse!",
+ Data => [$string]);
+# Test MIME Signing Round Trip
+
+$copy = $me->dup;
+
+is( 0, $mg->mime_sign( $copy ) );
+
+my ($verify,$key,$who) = $mg->verify($copy);
+is( 0, $verify );
+is( $KEY, $key );
+is( $WHO, $who );
+
+is( 1, $mg->is_signed($copy) );
+is( 0, $mg->is_encrypted($copy) );
+
+# Test Clear Signing Round Trip
+
+$copy = $me->dup;
+
+is( 0, $mg->clear_sign( $copy ) );
+
+{ my ($verify,$key,$who) = $mg->verify($copy);
+is( 0, $verify );
+is( $KEY, $key );
+is( $WHO, $who );
+
+is( 1, $mg->is_signed($copy) );
+is( 0, $mg->is_encrypted($copy) );
+}
+# Test MIME Encryption Round Trip
+
+$copy = $me->dup;
+
+is( 0, $mg->ascii_encrypt( $copy, $KEY ));
+is( 0, $mg->is_signed($copy) );
+is( 1, $mg->is_encrypted($copy) );
+
+($verify,$key,$who) = $mg->decrypt($copy);
+
+is( 0, $verify );
+is( undef, $key );
+is( undef, $who );
+
+is_deeply($mg->{decrypted}->body,$me->body);
+
+end:
+kill 15,$agent_pid if (defined($agent_pid));
+
+
commit 8ae33a96eb5b68e72817937188972f5d950f334b
Author: David Bremner <bremner at unb.ca>
Date: Sat Dec 11 08:37:24 2010 -0400
bump version number for development release
diff --git a/GnuPG.pm b/GnuPG.pm
index 0192453..fcc8911 100644
--- a/GnuPG.pm
+++ b/GnuPG.pm
@@ -21,7 +21,7 @@ use 5.006;
use strict;
use warnings;
-our $VERSION = '0.15';
+our $VERSION = '0.15_1';
my $DEBUG = 0;
use GnuPG::Interface;
commit c9093ebd3bb9ac385ff856b75edd0dd502b5d002
Author: David Bremner <bremner at unb.ca>
Date: Sat Dec 11 08:40:25 2010 -0400
update README
diff --git a/README b/README
index a39e50b..e1a9416 100644
--- a/README
+++ b/README
@@ -1,12 +1,12 @@
-Mail/GnuPG version 0.07
-=======================
+Mail/GnuPG version 0.15_1
+=========================
Use GnuPG::Interface to process and/or create PGP signed or encrypted
email.
(See the inline documentation for more information)
-This is a 0.07 release. It works for me and at least four or five
+This is a development release. It works for me and at least four or five
other people. It may not work for you. If it doesn't, patches are
appreciated.
@@ -90,6 +90,10 @@ AUTHOR
Robert Spier
rspier at cpan.org
+MAINTAINER
+David Bremner
+ddb at cpan.org
+
Large Contributions from:
Jörn Reder
joern at zyn.de
commit 9a5c132ae97b197730b907447d51507be061fd8e
Author: David Bremner <bremner at unb.ca>
Date: Sat Dec 11 09:25:54 2010 -0400
Add Test::Pod to prereqs
diff --git a/Makefile.PL b/Makefile.PL
index b6c12a8..9acb025 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -13,6 +13,7 @@ WriteMakefile(
'MIME::Parser' => 0,
'Mail::Address' => 0,
'Test::More', => 0,
+ 'Test::Pod', => 0
},
ABSTRACT_FROM => 'GnuPG.pm', # retrieve abstract from module
AUTHOR => 'Robert Spier <rspier at cpan.org>',
commit ee0511ed8973eaad7753e5ce0b312d58589ce8f6
Author: David Bremner <bremner at unb.ca>
Date: Sat Dec 11 10:05:41 2010 -0400
update changelog
diff --git a/Changes b/Changes
index a868f37..327e413 100644
--- a/Changes
+++ b/Changes
@@ -1,9 +1,14 @@
Revision history for Perl extension Mail::GnuPG.
+0.15_1 Sat Dec 11 2010
+
+ - Development release
+ - Add support for gnupg-agent
+
0.15 Sat Mar 8 19:51:55 PST 2008
This is the ntyni release, as he provided most of the fixes:
-
+
- Fix roundtrip test by trusting test keyring.
- New test to show blocking issues on large messages.
- Switch to a non-blocking (select) based mechanism for interacting
commit ec59ead1409f0ca19b924b1c5e3025c774a06cab
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 14:06:02 2010 -0400
Convert to Module::Build. Add a link to "homepage", i.e. gitweb.
diff --git a/Build.PL b/Build.PL
new file mode 100644
index 0000000..b6e8893
--- /dev/null
+++ b/Build.PL
@@ -0,0 +1,32 @@
+use strict;
+use warnings;
+
+use Module::Build;
+
+my $build = Module::Build->new
+ (
+ module_name => 'Mail::GnuPG',
+ dist_author => [ 'Robert Spier <rspier at cpan.org>',
+ 'David Bremner <ddb at cpan.org>'],
+ dist_version_from => 'GnuPG.pm', # finds $VERSION
+ requires => {
+ 'File::Spec' => 0,
+ 'File::Temp' => 0,
+ 'GnuPG::Interface' => 0,
+ 'IO::Handle' => 0,
+ 'MIME::Entity' => 0,
+ 'MIME::Parser' => 0,
+ 'Mail::Address' => 0,
+ 'Test::More' => 0,
+ 'Test::Pod' => 0,
+ },
+ license => 'unknown',
+ create_readme => 0,
+ meta_merge => {
+ resources =>
+ { homepage =>
+ 'http://pivot.cs.unb.ca/git/?p=mail-gnupg.git;a=summary' }
+ }
+ );
+
+$build->create_build_script;
diff --git a/Makefile.PL b/Makefile.PL
deleted file mode 100644
index 9acb025..0000000
--- a/Makefile.PL
+++ /dev/null
@@ -1,20 +0,0 @@
-use ExtUtils::MakeMaker;
-# See lib/ExtUtils/MakeMaker.pm for details of how to influence
-# the contents of the Makefile that is written.
-WriteMakefile(
- 'NAME' => 'Mail::GnuPG',
- 'VERSION_FROM' => 'GnuPG.pm', # finds $VERSION
- 'PREREQ_PM' => {
- 'GnuPG::Interface' => 0,
- 'IO::Handle' => 0,
- 'MIME::Entity' => 0,
- 'File::Temp' => 0,
- 'File::Spec' => 0,
- 'MIME::Parser' => 0,
- 'Mail::Address' => 0,
- 'Test::More', => 0,
- 'Test::Pod', => 0
- },
- ABSTRACT_FROM => 'GnuPG.pm', # retrieve abstract from module
- AUTHOR => 'Robert Spier <rspier at cpan.org>',
-);
commit 9400eaae64e7202f2d987c86b588cfcd20e9ba58
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 14:09:18 2010 -0400
bump version
diff --git a/GnuPG.pm b/GnuPG.pm
index fcc8911..12a2be7 100644
--- a/GnuPG.pm
+++ b/GnuPG.pm
@@ -21,7 +21,7 @@ use 5.006;
use strict;
use warnings;
-our $VERSION = '0.15_1';
+our $VERSION = '0.15_2';
my $DEBUG = 0;
use GnuPG::Interface;
commit c181f79845524245cb6952ce1120f55c0eebe67c
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 14:09:31 2010 -0400
add my name and contact info to pod
diff --git a/GnuPG.pm b/GnuPG.pm
index 12a2be7..6b954a8 100644
--- a/GnuPG.pm
+++ b/GnuPG.pm
@@ -1096,6 +1096,8 @@ GNU General Public License or the Artistic License for more details.
Robert Spier
+David Bremner <ddb at cpan.org>
+
=head1 BUGS/ISSUES/PATCHES
Please send all bugs/issues/patches to
commit e487245316949d3adc0ed93bcc0ac1736a290f65
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 15:07:51 2010 -0400
move module source to ./lib
diff --git a/GnuPG.pm b/lib/Mail/GnuPG.pm
similarity index 100%
rename from GnuPG.pm
rename to lib/Mail/GnuPG.pm
commit b9bdabbb94eceee4d19c1a5c4a0c207f5970a4fb
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 15:13:48 2010 -0400
Use undecoded body text in decode and get_decrypt_key.
This is intended as a fix for RT #60246 and Debian Bug #592503
diff --git a/lib/Mail/GnuPG.pm b/lib/Mail/GnuPG.pm
index 6b954a8..d06dbeb 100644
--- a/lib/Mail/GnuPG.pm
+++ b/lib/Mail/GnuPG.pm
@@ -140,9 +140,9 @@ sub decrypt {
m!application/pgp-encrypted!;
$ciphertext = $message->parts(1)->stringify_body;
}
- elsif ($message->body_as_string
+ elsif ($message->bodyhandle->as_string
=~ m!^-----BEGIN PGP MESSAGE-----!m ) {
- $ciphertext = $message->body_as_string;
+ $ciphertext = $message->bodyhandle->as_string;
$armor_message = 1;
}
else {
@@ -254,9 +254,9 @@ sub get_decrypt_key {
m!application/pgp-encrypted!;
$ciphertext = $message->parts(1)->stringify_body;
}
- elsif ($message->body_as_string
+ elsif ($message->bodyhandle->as_string
=~ m!^-----BEGIN PGP MESSAGE-----!m ) {
- $ciphertext = $message->body_as_string;
+ $ciphertext = $message->bodyhandle->as_string;
}
else {
die "Unknown Content-Type or no PGP message in body"
commit 54aa5cf90a2c18c810c5e0d6aa9f9edb7105cca0
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 16:26:01 2010 -0400
Add test for verification of quoted printable inline pgp signatures
diff --git a/t/20.inline-verify.t b/t/20.inline-verify.t
new file mode 100644
index 0000000..aa10119
--- /dev/null
+++ b/t/20.inline-verify.t
@@ -0,0 +1,27 @@
+# -*- perl -*-
+
+use Test::More;
+use Mail::GnuPG;
+use MIME::Entity;
+use strict;
+
+plan tests => 5;
+
+# Main program
+my $parser = new MIME::Parser;
+$parser->output_to_core(1);
+
+my $entity= $parser->parse_open("t/msg/inline-signed-qp.eml") ;
+isa_ok($entity,"MIME::Entity");
+
+my $mg = new Mail::GnuPG( key => '49539D60EFEA4EAD',
+ passphrase => 'passphrase');
+
+isa_ok($mg,"Mail::GnuPG");
+
+my ($return,$keyid,$uid) = $mg->verify($entity);
+is($return,0,"verify success");
+is($keyid,'4526F399',"verify keyid");
+is($uid,'David Bremner <bremner at debian.org>',"verify uid");
+
+end:
diff --git a/t/msg/inline-signed-qp.eml b/t/msg/inline-signed-qp.eml
new file mode 100644
index 0000000..c708d3c
--- /dev/null
+++ b/t/msg/inline-signed-qp.eml
@@ -0,0 +1,26 @@
+From: David Bremner <bremner at debian.org>
+To: ddb at cpan.org
+Subject: testing inline PGP
+User-Agent: Notmuch/0.4 (http://notmuchmail.org) Emacs/23.2.1 (x86_64-pc-linux-gnu)
+Date: Sun, 12 Dec 2010 15:26:43 -0400
+Message-ID: <87bp4qrdvw.fsf at zancas.localnet>
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: quoted-printable
+X-Sender-Verified: bremner at unb.ca
+
+=2D----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+
+This message has tr=C3=A9s ex=C3=B6tic characters.
+=2D----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.10 (GNU/Linux)
+
+iJwEAQECAAYFAk0FIfQACgkQTiiN/0Um85n1pAP9GG4DFyjdvhv6M77tf7dmhn+w
+QeWF3jhw2z5agg3m7N063lO8UrRn1+wap4XsuRGDAWYoIT+nR9UJccl3VV22WpW6
+hMYhQZTKiOkHlKiNRoy+Zb+3P9ohpGguL0+VxqLKa7KibWC06gIkBOFTnxSaIakB
+xoSuXPvRiK0FYwxnqWo=3D
+=3DEDyV
+=2D----END PGP SIGNATURE-----
+
commit 3028cbbbb46191be13ce63baedb123ead53a866a
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 16:50:50 2010 -0400
add test for decryption of quoted printable inline pgp
diff --git a/t/30.inline-decrypt.t b/t/30.inline-decrypt.t
new file mode 100644
index 0000000..bb38ee2
--- /dev/null
+++ b/t/30.inline-decrypt.t
@@ -0,0 +1,53 @@
+# -*- perl -*-
+
+use Test::More;
+use Mail::GnuPG;
+use MIME::Entity;
+use File::Temp qw(tempdir);
+
+use strict;
+
+plan tests => 5;
+
+# Main program
+my $parser = new MIME::Parser;
+$parser->output_to_core(1);
+
+my $entity= $parser->parse_open("t/msg/inline-encrypted-qp.eml") ;
+isa_ok($entity,"MIME::Entity");
+
+my $KEY = "EFEA4EAD"; # 49539D60EFEA4EAD
+my $WHO = "Mail::GnuPG Test Key <mail\@gnupg.dom>";
+
+unless ( 0 == system("gpg --version 2>&1 >/dev/null") ) {
+ plan skip_all => "gpg in path required for testing round-trip";
+ goto end;
+}
+
+my $tmpdir = tempdir( "mgtXXXXX", CLEANUP => 1);
+
+unless ( 0 == system("gpg --homedir $tmpdir --trusted-key 0x49539D60EFEA4EAD --import t/test-key.pgp 2>&1 >/dev/null")) {
+ plan skip_all => "unable to import testing keys";
+ goto end;
+}
+
+
+my $mg = new Mail::GnuPG( key => '49539D60EFEA4EAD',
+ keydir => $tmpdir,
+ passphrase => 'passphrase');
+
+isa_ok($mg,"Mail::GnuPG");
+
+my ($return,$keyid,$uid) = $mg->decrypt($entity);
+is($return,0,"decrypt success");
+ok(!defined($keyid) && !defined($uid), "message unsigned");
+
+is($mg->{decrypted}->as_string,
+"
+this is some 8-bit text:
+áëìóü
+
+
+","plaintext");
+
+end:
diff --git a/t/msg/inline-encrypted-qp.eml b/t/msg/inline-encrypted-qp.eml
new file mode 100644
index 0000000..544ff07
--- /dev/null
+++ b/t/msg/inline-encrypted-qp.eml
@@ -0,0 +1,31 @@
+From: David Bremner <ddb at cpan.org>
+User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101030 Icedove/3.0.10
+MIME-Version: 1.0
+To: mail at gnupg.dom
+Subject: testing encryption
+X-Enigmail-Version: 1.0.1
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: quoted-printable
+X-Sender-Verified: ddb at cpan.org
+
+-----BEGIN PGP MESSAGE-----
+Charset: ISO-8859-1
+Version: GnuPG v1.4.10 (GNU/Linux)
+Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
+
+hQEOAwAAAAAAAAAAEAP/XtqY1rAIP5O3155UISmIXhUIbMZ4D2UYq6crO1m1a763
+miPVrno2xXZ+3A86x47ozTivczg/hkbpFnoXuewSVOfAnJkS2P+Y5pfY3EggDbjt
+d1OCLadcyvfvxnPj5p6/RjgS5NPhgSl/sDqdqKDXByAW7rCK4tzeTnVUEAsorL0D
+/jJ0FTEx1rpDsjz5feZ+pJqoLaTXf/0Sa5SY0/S8Ss8o++c+pFcjfQqJzfBQy1//
+wX9A5rTGuUzthrU78aNbapp4mHN1kCWX2K6HNLFx6nH1scWigWf/fCx09NRkw+nu
+Fld8FaVkO+mSLhITRLW5meZTAIEuI7eALAoYznroVRFThIwDl+XMhKsBGIsBA/4i
+vDaV3e8LZV19BVrCyHP1BcF8kFemQG/KOvGMWl9zue/uszqwCHR32ImIUhEXKV1/
+cOSTJfRG7todz6TijRWQLFjBVn4gBdZKT8z7t+M8VoeU65jKELEceQi6thDGioaV
+1WzJo1mlGVnr3+OlTQr8RVJX/HOq2BNGp4UK8fHwqtJcAai6qLKLs2zFxu0DmZfy
+Our1TNz2e31HpiinhDcVHO3ZVcz+eZlziQGZa/SHt2lOFYbxFzQAxfW01Er7n8VU
+4/Ak/e7pWzoUdEwlHTEpwGRgo4V70Dp0vqPIf3o=3D
+=3D2aPt
+-----END PGP MESSAGE-----
+
+
+
commit 48840a7675dd9bff239814a900b3fb8fc1819d19
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 16:53:06 2010 -0400
remove unused test file
diff --git a/test.pl b/test.pl
deleted file mode 100644
index f23e575..0000000
--- a/test.pl
+++ /dev/null
@@ -1,17 +0,0 @@
-# Before `make install' is performed this script should be runnable with
-# `make test'. After `make install' it should work as `perl test.pl'
-
-#########################
-
-# change 'tests => 1' to 'tests => last_test_to_print';
-
-use Test;
-BEGIN { plan tests => 1 };
-use Mail::GnuPG;
-ok(1); # If we made it this far, we're ok.
-
-#########################
-
-# Insert your test code below, the Test module is use()ed here so read
-# its man page ( perldoc Test ) for help writing this test script.
-
commit 09d29796e9bb82dfaedd3278e86a19c0e513cbd8
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 16:53:39 2010 -0400
Module now found from module_name, override removed
diff --git a/Build.PL b/Build.PL
index b6e8893..e7c568d 100644
--- a/Build.PL
+++ b/Build.PL
@@ -8,7 +8,6 @@ my $build = Module::Build->new
module_name => 'Mail::GnuPG',
dist_author => [ 'Robert Spier <rspier at cpan.org>',
'David Bremner <ddb at cpan.org>'],
- dist_version_from => 'GnuPG.pm', # finds $VERSION
requires => {
'File::Spec' => 0,
'File::Temp' => 0,
commit deaa3dd4813cfa78ffcdea069cfceb804ebb0207
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 16:56:32 2010 -0400
Update MANIFEST
diff --git a/MANIFEST b/MANIFEST
index fe38a6f..734ce48 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,12 +1,16 @@
+Build.PL
Changes
-GnuPG.pm
-Makefile.PL
+lib/Mail/GnuPG.pm
MANIFEST
README
-test.pl
-t/base.t
t/00.load.t
+t/20.inline-verify.t
+t/30.inline-decrypt.t
t/99.pod.t
+t/agent.t
+t/base.t
+t/msg/inline-encrypted-qp.eml
+t/msg/inline-signed-qp.eml
t/round-trip.t
t/test-key.pgp
-META.yml Module meta-data (added by MakeMaker)
+
commit ada701b55a84fcca517154454527ce0467c17223
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 21:06:22 2010 -0400
test message from RT #46168
diff --git a/t/msg/multipart-signed-qp.eml b/t/msg/multipart-signed-qp.eml
new file mode 100644
index 0000000..ef2f1bc
--- /dev/null
+++ b/t/msg/multipart-signed-qp.eml
@@ -0,0 +1,137 @@
+From mauricio.campiglia at gmail.com Mon May 18 00:43:49 2009
+Return-Path: <mauricio.campiglia at gmail.com>
+X-Original-To: crhalpin at localhost
+Delivered-To: crhalpin at localhost.home.crhalpin.org
+Received: from spiff.home.crhalpin.org (localhost [127.0.0.1])
+ by spiff.home.crhalpin.org (Postfix) with ESMTP id A66261CC3C
+ for <crhalpin at localhost>; Mon, 18 May 2009 00:43:46 -0500 (CDT)
+Received: from crimson.cs.wisc.edu [128.105.6.43]
+ by spiff.home.crhalpin.org with IMAP (fetchmail-6.3.9)
+ for <crhalpin at localhost> (single-drop); Mon, 18 May 2009 00:43:46 -0500 (CDT)
+Received: from shale.cs.wisc.edu (shale.cs.wisc.edu [128.105.6.25])
+ by crimson.cs.wisc.edu (8.14.1/8.14.1) with ESMTP id n4I5fnVL000994
+ for <chalpin at crimson.cs.wisc.edu>; Mon, 18 May 2009 00:41:49 -0500
+Received: from sabe.cs.wisc.edu (sabe.cs.wisc.edu [128.105.6.20])
+ by shale.cs.wisc.edu (8.14.1/8.14.1) with ESMTP id n4I5fn3s007221
+ for <chalpin at cs.wisc.edu>; Mon, 18 May 2009 00:41:49 -0500
+Received: from spiff.home.crhalpin.org (eagleheights-105-18.resnet.wisc.edu [146.151.105.18])
+ (authenticated bits=0)
+ by sabe.cs.wisc.edu (8.14.1/8.14.1) with ESMTP id n4I5fnhh030486
+ (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO)
+ for <chalpin at cs.wisc.edu>; Mon, 18 May 2009 00:41:49 -0500
+Received: by spiff.home.crhalpin.org (Postfix, from userid 1001)
+ id 7473A1CC3C; Mon, 18 May 2009 00:41:43 -0500 (CDT)
+X-Original-To: crhalpin at localhost
+Old-Delivered-To: crhalpin at localhost.home.crhalpin.org
+Received: from spiff.home.crhalpin.org (localhost [127.0.0.1])
+ by spiff.home.crhalpin.org (Postfix) with ESMTP id 47C2F1CC3B
+ for <crhalpin at localhost>; Sun, 17 May 2009 22:34:32 -0500 (CDT)
+Received: from crimson.cs.wisc.edu [128.105.6.43]
+ by spiff.home.crhalpin.org with IMAP (fetchmail-6.3.9)
+ for <crhalpin at localhost> (single-drop); Sun, 17 May 2009 22:34:32 -0500 (CDT)
+Received: from shale.cs.wisc.edu (shale.cs.wisc.edu [128.105.6.25])
+ by crimson.cs.wisc.edu (8.14.1/8.14.1) with ESMTP id n4I3YS9m007520
+ for <chalpin at crimson.cs.wisc.edu>; Sun, 17 May 2009 22:34:28 -0500
+Received: from silica.cs.wisc.edu (silica.cs.wisc.edu [128.105.6.34])
+ by shale.cs.wisc.edu (8.14.1/8.14.1) with ESMTP id n4I3YSPn003380
+ for <chalpin at cs.wisc.edu>; Sun, 17 May 2009 22:34:28 -0500
+Received: from yx-out-2324.google.com (yx-out-2324.google.com [74.125.44.29])
+ by silica.cs.wisc.edu (8.14.1/8.14.1) with ESMTP id n4I3YQqn025545
+ for <chalpin at cs.wisc.edu>; Sun, 17 May 2009 22:34:27 -0500
+Received: by yx-out-2324.google.com with SMTP id 8so1539394yxb.51
+ for <chalpin at cs.wisc.edu>; Sun, 17 May 2009 20:34:25 -0700 (PDT)
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+ d=gmail.com; s=gamma;
+ h=domainkey-signature:received:received:sender:from:to:subject:date
+ :user-agent:mime-version:content-type:content-transfer-encoding
+ :message-id;
+ bh=mrCnj+peIRZyFKKUom45vtHHHalEHjngUu8ydLdXIQI=;
+ b=Nos28h4Ki/p8AmLuXUIXnY08sJVz5cZfP7iobo92FgBcAaISCSmb+j/226Ei+CM1cN
+ E/379QNgPRWBM0YC7x6zP5U4BfI7HBYnZEjm5LVOrQZuMYavm62xesV8Yq/wMeRSmNiO
+ wlhgPUBIWpJa25vLEGPFSAY+xeYhS45LTQj94=
+DomainKey-Signature: a=rsa-sha1; c=nofws;
+ d=gmail.com; s=gamma;
+ h=sender:from:to:subject:date:user-agent:mime-version:content-type
+ :content-transfer-encoding:message-id;
+ b=G74tCLyIQKXgrQXPzZF94Mu3MBiPsEAYsLOz8YvF6tSVpv1DmfnBPJHznKvXtXt+vR
+ vPizFC34icWwnEdzfLZ8q9qh3QWjpGRpfJnv7sa5bFOKMCnRH37Ev9zGWrphhgiOKvuv
+ igizNl84V7Lb5mNiQc8hgdqbMPLIyVYRdli20=
+Received: by 10.90.86.10 with SMTP id j10mr5493898agb.59.1242617665125;
+ Sun, 17 May 2009 20:34:25 -0700 (PDT)
+Received: from aldebaran.localnet (r190-64-27-81.dialup.adsl.anteldata.net.uy [190.64.27.81])
+ by mx.google.com with ESMTPS id 6sm12119406ywi.58.2009.05.17.20.34.23
+ (version=TLSv1/SSLv3 cipher=RC4-MD5);
+ Sun, 17 May 2009 20:34:24 -0700 (PDT)
+Sender: Mauricio Campiglia <mauricio.campiglia at gmail.com>
+From: Mauricio Campiglia <mauricio at campiglia.org>
+To: chalpin at cs.wisc.edu
+Subject: Incorrect packet traversal path on your Netfilter page?
+Date: Mon, 18 May 2009 00:34:03 -0300
+User-Agent: KMail/1.11.2 (Linux/2.6.26-2-686; KDE/4.2.2; i686; ; )
+MIME-Version: 1.0
+Content-Type: multipart/signed;
+ boundary="nextPart2389499.aip7uZ08Kp";
+ protocol="application/pgp-signature";
+ micalg=pgp-sha1
+Content-Transfer-Encoding: 7bit
+Message-Id: <200905180034.15041.mauricio at campiglia.org> (sfid-20090517_22343_E096A717)
+X-Seen-By: mailfromd 4.1 silica.cs.wisc.edu
+X-Virus-Status: No
+X-Virus-Checker-Version: clamassassin 1.2.4 with clamdscan / ClamAV 0.95.1/9365/Sat May 16 07:41:29 2009
+X-CRM114-Version: 20090423-BlameSteveJobs ( TRE 0.7.5 (LGPL) ) MR-9B0B3C9E
+X-CRM114-CacheID: sfid-20090517_22343_E096A717
+X-CRM114-Status: UNSURE ( 9.16 )
+X-CRM114-Notice: Please train this message.
+X-TMDA-Confirm-Done: 1242617693.82104.1b4d37
+X-TMDA-Released: Mon, 18 May 2009 00:41:42 -0500
+X-RecFor-Recipient: chalpin at cs.wisc.edu
+
+--nextPart2389499.aip7uZ08Kp
+Content-Type: text/plain;
+ charset="utf-8"
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+Corey,
+
+I have come across your Netfilter page [0]. Thanks for letting people=20
+understand Netfilter in a simple and straightforward way. I have,=20
+nevertheless, a couple of diferences on wich, afaik, are the correct=20
+traversal of packets.
+
+Where you write:
+forwarded
+ nat/PREROUTING -> filter/FORWARD -> nat/OUTPUT -> nat/POSTROUTING=20
+outgoing
+ filter/OUTPUT -> nat/PREROUTING -> nat/OUTPUT -> nat/POSTROUTING
+
+I think the correct flows are [1]:
+forwarded
+ nat/PREROUTING -> filter/FORWARD -> nat/POSTROUTING=20
+outgoing
+ nat/OUTPUT -> filter/OUTPUT -> nat/POSTROUTING
+
+[0]http://pages.cs.wisc.edu/~chalpin/project/netfilter.html
+[1]http://pub1.zcjh.tpc.edu.tw:9100/computer/Lists/Discussion/Attachments/1=
+/PacketFlow.png
+
+Regards,
+ Mauricio Campiglia
+=2D-=20
+=C2=ABHistory is a vast early warning system.=C2=BB
+ --Norman Cousins--
+
+--nextPart2389499.aip7uZ08Kp
+Content-Type: application/pgp-signature; name=signature.asc
+Content-Description: This is a digitally signed message part.
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+iEYEABECAAYFAkoQ1ywACgkQ++X8pZRW0Wq8CgCgoi4ET6UwUuqNkiJX2SUVCNq5
+zs8AniaI78P46h9ZFiUc+pxfapI2s0mF
+=/yJS
+-----END PGP SIGNATURE-----
+
+--nextPart2389499.aip7uZ08Kp--
+
commit e8978b81ae98248a72cfb2994f52ee231eaf5f34
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 12 21:27:50 2010 -0400
test for multipart signature, where text is quoted printable encoded.
This is based on RT ticket #46168
diff --git a/t/25.multipart-verify.t b/t/25.multipart-verify.t
new file mode 100644
index 0000000..8e43bc3
--- /dev/null
+++ b/t/25.multipart-verify.t
@@ -0,0 +1,28 @@
+# -*- perl -*-
+
+use Test::More;
+use Mail::GnuPG;
+use MIME::Entity;
+use strict;
+
+plan tests => 5;
+
+# Main program
+my $parser = new MIME::Parser;
+$parser->output_to_core(1);
+$parser->decode_bodies(0);
+
+my $entity= $parser->parse_open("t/msg/multipart-signed-qp.eml") ;
+isa_ok($entity,"MIME::Entity");
+
+my $mg = new Mail::GnuPG( key => '49539D60EFEA4EAD',
+ passphrase => 'passphrase');
+
+isa_ok($mg,"Mail::GnuPG");
+
+my ($return,$keyid,$uid) = $mg->verify($entity);
+is($return,0,"verify success");
+is($keyid,'9456D16A',"verify keyid");
+is($uid,'Mauricio Campiglia <mauricio at campiglia.org>',"verify uid");
+
+end:
commit 4ff51b97747a44ea442bc98b6b1340b8a40a678a
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 08:38:18 2010 -0400
remove .releaserc
diff --git a/.releaserc b/.releaserc
deleted file mode 100644
index 1bbae3b..0000000
--- a/.releaserc
+++ /dev/null
@@ -1,3 +0,0 @@
-cpan_user RSPIER
-passive_ftp yes
-sf_user <none>
commit fc3f5df682383339b0ae3203f96819df803b42c9
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 08:39:50 2010 -0400
add new test to manifest
diff --git a/MANIFEST b/MANIFEST
index 734ce48..38737ee 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -5,12 +5,13 @@ MANIFEST
README
t/00.load.t
t/20.inline-verify.t
+t/25.multipart-verify.t
t/30.inline-decrypt.t
t/99.pod.t
t/agent.t
t/base.t
t/msg/inline-encrypted-qp.eml
t/msg/inline-signed-qp.eml
+t/msg/multipart-signed-qp.eml
t/round-trip.t
t/test-key.pgp
-
commit f43d4ced6e7c30740c991420a0463cec62b5d6ee
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 08:52:31 2010 -0400
bump version number
diff --git a/lib/Mail/GnuPG.pm b/lib/Mail/GnuPG.pm
index d06dbeb..980f541 100644
--- a/lib/Mail/GnuPG.pm
+++ b/lib/Mail/GnuPG.pm
@@ -21,7 +21,7 @@ use 5.006;
use strict;
use warnings;
-our $VERSION = '0.15_2';
+our $VERSION = '0.15_3';
my $DEBUG = 0;
use GnuPG::Interface;
commit 5ebf14cd1397a6b434f20f5e402b9d5dc72c4ce5
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 09:31:33 2010 -0400
add test file with two real public keys
diff --git a/t/pubkeys.asc b/t/pubkeys.asc
new file mode 100644
index 0000000..5fe3abb
--- /dev/null
+++ b/t/pubkeys.asc
@@ -0,0 +1,704 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.10 (GNU/Linux)
+Comment: Public Keys for testing Mail::GnuPG
+
+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
+AJ4+Xm0YBbMExYKbrP5irHm7W8fQfQ==
+=EGZo
+-----END PGP PUBLIC KEY BLOCK-----
commit b2f805b6c4dd4401939a020c89217d5a4758ddd0
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 10:01:53 2010 -0400
Import keys for verification tests
diff --git a/t/20.inline-verify.t b/t/20.inline-verify.t
index aa10119..116e5a4 100644
--- a/t/20.inline-verify.t
+++ b/t/20.inline-verify.t
@@ -7,6 +7,13 @@ use strict;
plan tests => 5;
+require('t/import_keys.pl');
+my $gpghome=import_keys('t/pubkeys.asc');
+unless (defined($gpghome)){
+ plan skip_all => "failed to import GPG keys for testing";
+ goto end;
+}
+
# Main program
my $parser = new MIME::Parser;
$parser->output_to_core(1);
@@ -14,8 +21,7 @@ $parser->output_to_core(1);
my $entity= $parser->parse_open("t/msg/inline-signed-qp.eml") ;
isa_ok($entity,"MIME::Entity");
-my $mg = new Mail::GnuPG( key => '49539D60EFEA4EAD',
- passphrase => 'passphrase');
+my $mg = new Mail::GnuPG( keydir =>$gpghome );
isa_ok($mg,"Mail::GnuPG");
diff --git a/t/25.multipart-verify.t b/t/25.multipart-verify.t
index 8e43bc3..5d0f6b4 100644
--- a/t/25.multipart-verify.t
+++ b/t/25.multipart-verify.t
@@ -7,6 +7,13 @@ use strict;
plan tests => 5;
+require('t/import_keys.pl');
+my $gpghome=import_keys('t/pubkeys.asc');
+unless (defined($gpghome)){
+ plan skip_all => "failed to import GPG keys for testing";
+ goto end;
+}
+
# Main program
my $parser = new MIME::Parser;
$parser->output_to_core(1);
@@ -15,8 +22,7 @@ $parser->decode_bodies(0);
my $entity= $parser->parse_open("t/msg/multipart-signed-qp.eml") ;
isa_ok($entity,"MIME::Entity");
-my $mg = new Mail::GnuPG( key => '49539D60EFEA4EAD',
- passphrase => 'passphrase');
+my $mg = new Mail::GnuPG( keydir=>$gpghome);
isa_ok($mg,"Mail::GnuPG");
diff --git a/t/import_keys.pl b/t/import_keys.pl
new file mode 100644
index 0000000..5b32d16
--- /dev/null
+++ b/t/import_keys.pl
@@ -0,0 +1,16 @@
+sub import_keys($){
+ my $filename=shift;
+ use File::Temp qw(tempdir);
+
+ unless ( 0 == system("gpg --version 2>&1 >/dev/null") ) {
+ return undef;
+ }
+
+ my $gpghome = tempdir( "mgtXXXXX", CLEANUP => 1);
+ unless ( 0 == system("gpg --homedir $gpghome --import t/pubkeys.asc 2>&1 >/dev/null")) {
+ return undef;
+ }
+ return $gpghome;
+}
+
+1;
commit 925cef953a5e68ec8ce37fc0314cd7efdf59251b
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 10:05:15 2010 -0400
add test helper to MANIFEST
diff --git a/MANIFEST b/MANIFEST
index 38737ee..c351342 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -10,6 +10,7 @@ t/30.inline-decrypt.t
t/99.pod.t
t/agent.t
t/base.t
+t/import_keys.pl
t/msg/inline-encrypted-qp.eml
t/msg/inline-signed-qp.eml
t/msg/multipart-signed-qp.eml
commit 6268e51e9f1eb00677cce25c5b1666251b970265
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 10:12:54 2010 -0400
add a second set of pubkeys to MANIFEST
diff --git a/MANIFEST b/MANIFEST
index c351342..5eb99e0 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -14,5 +14,6 @@ t/import_keys.pl
t/msg/inline-encrypted-qp.eml
t/msg/inline-signed-qp.eml
t/msg/multipart-signed-qp.eml
+t/pubkeys.asc
t/round-trip.t
t/test-key.pgp
commit 7d05e0c27a4082cef654d3bf85706d652b40b083
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 11:07:46 2010 -0400
plan only if keys imported successfuly
diff --git a/t/20.inline-verify.t b/t/20.inline-verify.t
index 116e5a4..19ecc39 100644
--- a/t/20.inline-verify.t
+++ b/t/20.inline-verify.t
@@ -5,7 +5,7 @@ use Mail::GnuPG;
use MIME::Entity;
use strict;
-plan tests => 5;
+
require('t/import_keys.pl');
my $gpghome=import_keys('t/pubkeys.asc');
@@ -14,6 +14,8 @@ unless (defined($gpghome)){
goto end;
}
+plan tests => 5;
+
# Main program
my $parser = new MIME::Parser;
$parser->output_to_core(1);
diff --git a/t/25.multipart-verify.t b/t/25.multipart-verify.t
index 5d0f6b4..13a7e95 100644
--- a/t/25.multipart-verify.t
+++ b/t/25.multipart-verify.t
@@ -5,7 +5,6 @@ use Mail::GnuPG;
use MIME::Entity;
use strict;
-plan tests => 5;
require('t/import_keys.pl');
my $gpghome=import_keys('t/pubkeys.asc');
@@ -14,6 +13,8 @@ unless (defined($gpghome)){
goto end;
}
+plan tests => 5;
+
# Main program
my $parser = new MIME::Parser;
$parser->output_to_core(1);
commit 664db9eba2194235803d884e279499ccb5ed8294
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 11:31:31 2010 -0400
enable Module::Signature
diff --git a/Build.PL b/Build.PL
index e7c568d..b8ac716 100644
--- a/Build.PL
+++ b/Build.PL
@@ -8,6 +8,7 @@ my $build = Module::Build->new
module_name => 'Mail::GnuPG',
dist_author => [ 'Robert Spier <rspier at cpan.org>',
'David Bremner <ddb at cpan.org>'],
+ (sign => 1),
requires => {
'File::Spec' => 0,
'File::Temp' => 0,
commit 7a90f35cdb900a8c04fcb27f848a38326a2889b5
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 11:37:17 2010 -0400
add optional signature test
diff --git a/t/00.signature.t b/t/00.signature.t
new file mode 100644
index 0000000..284f939
--- /dev/null
+++ b/t/00.signature.t
@@ -0,0 +1,35 @@
+#!/usr/bin/perl
+
+use strict;
+use Test::More;
+
+if (!$ENV{TEST_SIGNATURE}) {
+ plan skip_all =>
+ "Set the environment variable TEST_SIGNATURE to enable this test.";
+}
+elsif (!eval { require Module::Signature; 1 }) {
+ plan skip_all =>
+ "Next time around, consider installing Module::Signature, ".
+ "so you can verify the integrity of this distribution.";
+}
+elsif ( !-e 'SIGNATURE' ) {
+ plan skip_all => "SIGNATURE not found";
+}
+elsif ( -s 'SIGNATURE' == 0 ) {
+ plan skip_all => "SIGNATURE file empty";
+}
+elsif (!eval { require Socket; Socket::inet_aton('pool.sks-keyservers.net') }) {
+ plan skip_all => "Cannot connect to the keyserver to check module ".
+ "signature";
+}
+else {
+ plan tests => 1;
+}
+
+my $ret = Module::Signature::verify();
+SKIP: {
+ skip "Module::Signature cannot verify", 1
+ if $ret eq Module::Signature::CANNOT_VERIFY();
+
+ cmp_ok $ret, '==', Module::Signature::SIGNATURE_OK(), "Valid signature";
+}
diff --git a/t/00.load.t b/t/05.load.t
similarity index 100%
rename from t/00.load.t
rename to t/05.load.t
commit e7eb5978a83e3ef25eec6fb346074274ff26506b
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 11:42:34 2010 -0400
Update manifest
diff --git a/MANIFEST b/MANIFEST
index 5eb99e0..6750e81 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -3,7 +3,8 @@ Changes
lib/Mail/GnuPG.pm
MANIFEST
README
-t/00.load.t
+t/00.signature.t
+t/05.load.t
t/20.inline-verify.t
t/25.multipart-verify.t
t/30.inline-decrypt.t
commit b26c58c079d7489295a3f88fe958d6bd3b3e68c4
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 23:23:53 2010 -0400
bump version number, production release.
diff --git a/lib/Mail/GnuPG.pm b/lib/Mail/GnuPG.pm
index 980f541..c8e2f8a 100644
--- a/lib/Mail/GnuPG.pm
+++ b/lib/Mail/GnuPG.pm
@@ -21,7 +21,7 @@ use 5.006;
use strict;
use warnings;
-our $VERSION = '0.15_3';
+our $VERSION = '0.16';
my $DEBUG = 0;
use GnuPG::Interface;
commit ebb203c09030b8eba666d6b345014126430dcbbe
Merge: b26c58c e7eb597
Author: David Bremner <bremner at unb.ca>
Date: Mon Dec 13 23:27:30 2010 -0400
Merge branch 'master' of git+ssh://pivot.cs.unb.ca/pub/mail-gnupg
commit e7c866c8710f1bf01fbc338982778cdade92f05a
Author: David Bremner <bremner at unb.ca>
Date: Tue Dec 14 07:26:24 2010 -0400
Update changelog
diff --git a/Changes b/Changes
index 327e413..b17d454 100644
--- a/Changes
+++ b/Changes
@@ -1,9 +1,10 @@
Revision history for Perl extension Mail::GnuPG.
-0.15_1 Sat Dec 11 2010
+0.16 Tue Dec 14 2010
- - Development release
- - Add support for gnupg-agent
+ - [RT #60280] Add support for gnupg-agent
+ - [RT #60246] Use undecoded text for decode and get_decrypt_key of inline PGP
+ - [RT #4388, #2718, #46168] Add test case for verify of encoded bodies
0.15 Sat Mar 8 19:51:55 PST 2008
commit dad354e47885b687409181cecb5cb9f6780ddb77
Author: David Bremner <bremner at unb.ca>
Date: Tue Dec 14 16:31:23 2010 -0400
[#RT 2718] Apply documentation patch from Niko Tyni
This documents the magic to turn off body decoding inside
Mime::Entity, and the necessity thereof.
diff --git a/lib/Mail/GnuPG.pm b/lib/Mail/GnuPG.pm
index c8e2f8a..bc03d0d 100644
--- a/lib/Mail/GnuPG.pm
+++ b/lib/Mail/GnuPG.pm
@@ -339,6 +339,12 @@ sub get_decrypt_key {
The message can either be in RFC compliant-ish multipart/signed
format, or just a single part ascii armored message.
+ Note that MIME-encoded data should be supplied unmodified inside
+ the MIME::Entity input message, otherwise the signature will be
+ broken. Since MIME-tools version 5.419, this can be achieved with
+ the C<decode_bodies> method of MIME::Parser. See the MIME::Parser
+ documentation for more information.
+
Output:
On error:
Exit code of gpg. (0 on success)
commit 21942875b7a0db611d13675e6b6f23ad88bd558d
Author: David Bremner <bremner at unb.ca>
Date: Thu Dec 16 16:38:02 2010 -0400
fix bug in import_keys subroutine
Actually use the filename parameter. doh!
diff --git a/t/import_keys.pl b/t/import_keys.pl
index 5b32d16..44aa6f3 100644
--- a/t/import_keys.pl
+++ b/t/import_keys.pl
@@ -7,7 +7,7 @@ sub import_keys($){
}
my $gpghome = tempdir( "mgtXXXXX", CLEANUP => 1);
- unless ( 0 == system("gpg --homedir $gpghome --import t/pubkeys.asc 2>&1 >/dev/null")) {
+ unless ( 0 == system("gpg --homedir $gpghome --import $filename 2>&1 >/dev/null")) {
return undef;
}
return $gpghome;
commit 2fe71446974a2174b207cf2c2c79f7a6cacff501
Author: David Bremner <bremner at unb.ca>
Date: Thu Dec 16 16:48:18 2010 -0400
add trusted-key option to import-keys.pl
diff --git a/t/import_keys.pl b/t/import_keys.pl
index 44aa6f3..06ee759 100644
--- a/t/import_keys.pl
+++ b/t/import_keys.pl
@@ -1,5 +1,8 @@
sub import_keys($){
my $filename=shift;
+
+ my $trusted = scalar(@_) ? "--trusted-key 0x".shift : "";
+
use File::Temp qw(tempdir);
unless ( 0 == system("gpg --version 2>&1 >/dev/null") ) {
@@ -7,7 +10,7 @@ sub import_keys($){
}
my $gpghome = tempdir( "mgtXXXXX", CLEANUP => 1);
- unless ( 0 == system("gpg --homedir $gpghome --import $filename 2>&1 >/dev/null")) {
+ unless ( 0 == system("gpg --homedir $gpghome $trusted --import $filename 2>&1 >/dev/null")) {
return undef;
}
return $gpghome;
commit 1020613856d72d9f2c9a57444b14d155c703d062
Author: David Bremner <bremner at unb.ca>
Date: Thu Dec 16 16:48:55 2010 -0400
re-enable warnings about redefinition
diff --git a/t/round-trip.t b/t/round-trip.t
index 69c945c..ebf124f 100644
--- a/t/round-trip.t
+++ b/t/round-trip.t
@@ -5,7 +5,6 @@ use File::Temp qw(tempdir);
use Mail::GnuPG;
use MIME::Entity;
use strict;
-no warnings 'redefine'; # fix this later
my $KEY = "EFEA4EAD"; # 49539D60EFEA4EAD
my $WHO = "Mail::GnuPG Test Key <mail\@gnupg.dom>";
commit d0faa9ba2beb0563a928e9a95a8ef13d834e0eb7
Author: David Bremner <bremner at unb.ca>
Date: Thu Dec 16 16:52:38 2010 -0400
use import-keys.pl to import keys
diff --git a/t/round-trip.t b/t/round-trip.t
index ebf124f..3ce0a99 100644
--- a/t/round-trip.t
+++ b/t/round-trip.t
@@ -6,18 +6,15 @@ use Mail::GnuPG;
use MIME::Entity;
use strict;
-my $KEY = "EFEA4EAD"; # 49539D60EFEA4EAD
-my $WHO = "Mail::GnuPG Test Key <mail\@gnupg.dom>";
+my $FULL_KEY = "49539D60EFEA4EAD";
+my $KEY = substr($FULL_KEY,-8,8);
-unless ( 0 == system("gpg --version 2>&1 >/dev/null") ) {
- plan skip_all => "gpg in path required for testing round-trip";
- goto end;
-}
-
-my $tmpdir = tempdir( "mgtXXXXX", CLEANUP => 1);
+my $WHO = "Mail::GnuPG Test Key <mail\@gnupg.dom>";
-unless ( 0 == system("gpg --homedir $tmpdir --trusted-key 0x49539D60EFEA4EAD --import t/test-key.pgp 2>&1 >/dev/null")) {
- plan skip_all => "unable to import testing keys";
+require('t/import_keys.pl');
+my $gpghome=import_keys('t/test-key.pgp',$FULL_KEY);
+unless (defined($gpghome)){
+ plan skip_all => "failed to import GPG keys for testing";
goto end;
}
@@ -25,7 +22,7 @@ plan tests => 20;
my $mg = new Mail::GnuPG( key => '49539D60EFEA4EAD',
- keydir => $tmpdir,
+ keydir => $gpghome,
passphrase => 'passphrase');
isa_ok($mg,"Mail::GnuPG");
commit 348af04153341552c34aa759c8f82635fefdf5a9
Author: David Bremner <bremner at unb.ca>
Date: Thu Dec 16 16:54:57 2010 -0400
Reorder arguments to 'is' so that test failure reports make sense.
diff --git a/t/round-trip.t b/t/round-trip.t
index 3ce0a99..ecedf9c 100644
--- a/t/round-trip.t
+++ b/t/round-trip.t
@@ -39,21 +39,21 @@ my $me = MIME::Entity->build(From => 'me at myhost.com',
$copy = $me->dup;
-is( 0, $mg->mime_sign( $copy ) );
+is( $mg->mime_sign( $copy ), 0 );
my ($verify,$key,$who) = $mg->verify($copy);
-is( 0, $verify );
-is( $KEY, $key );
-is( $WHO, $who );
+is( $verify, 0 );
+is( $key, $KEY );
+is( $who, $WHO );
-is( 1, $mg->is_signed($copy) );
-is( 0, $mg->is_encrypted($copy) );
+is( $mg->is_signed($copy), 1 );
+is( $mg->is_encrypted($copy), 0 );
# Test Clear Signing Round Trip
$copy = $me->dup;
-is( 0, $mg->clear_sign( $copy ) );
+is( $mg->clear_sign( $copy ), 0 );
{ my ($verify,$key,$who) = $mg->verify($copy);
is( 0, $verify );
@@ -67,15 +67,15 @@ is( 0, $mg->is_encrypted($copy) );
$copy = $me->dup;
-is( 0, $mg->ascii_encrypt( $copy, $KEY ));
-is( 0, $mg->is_signed($copy) );
-is( 1, $mg->is_encrypted($copy) );
+is( $mg->ascii_encrypt( $copy, $KEY ), 0 );
+is( $mg->is_signed($copy), 0 );
+is( $mg->is_encrypted($copy), 1 );
($verify,$key,$who) = $mg->decrypt($copy);
-is( 0, $verify );
-is( undef, $key );
-is( undef, $who );
+is( $verify, 0 );
+is( $key, undef );
+is( $who, undef);
is_deeply($mg->{decrypted}->body,$me->body);
commit 0d2b42bce68a36df09b63fbfa4c6c53e1272d1f3
Author: Andrew Ruthven <PUCK at cpan.org>
Date: Tue Dec 6 04:09:32 2011 -0500
Add always-trust support to Mail::GnuPG.
Tue Dec 06 04:09:31 2011: Request 73036 was acted upon.
Transaction: Ticket created by PUCK
Queue: Mail-GnuPG
Subject: Add always-trust support to Mail::GnuPG.
Broken in: 0.16
Severity: Wishlist
Owner: Nobody
Requestors: PUCK at cpan.org
Status: new
Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=73036 >
Hi,
I need to be able to send out some encrypted emails using peoples GPG
public keys that have been provided in a manual method. And I don't
want to have to setup specific key for automatically creating trust
signatures which might leak out into the wild.
Fortunately gpg has a solution to this called always-trust. And
GnuPG::Interface exposes this.
The attached patch makes Mail::GnuPG expose it as well. It would be
very handy to have this rolled into Mail::GnuPG.
Cheers!
diff --git a/lib/Mail/GnuPG.pm b/lib/Mail/GnuPG.pm
index bc03d0d..43bc389 100644
--- a/lib/Mail/GnuPG.pm
+++ b/lib/Mail/GnuPG.pm
@@ -45,6 +45,7 @@ use Errno qw(EPIPE);
keydir => gpg configuration/key directory
passphrase => primary key password
use_agent => use gpg-agent if non-zero
+ always_trust => always trust a public key
# FIXME: we need more things here, maybe primary key id.
@@ -78,6 +79,10 @@ sub _set_options {
# ( defined $self->{passphrase} ?
# ( passphrase => $self->{passphrase} ) : () ),
);
+
+ if (defined $self->{always_trust}) {
+ $gnupg->options->always_trust($self->{always_trust})
+ }
$gnupg->call( $self->{gpg_path} ) if defined $self->{gpg_path};
}
commit 5d1a2d66506831a93cae1bb5d6f30830f5abb112
Author: David Bremner <bremner at unb.ca>
Date: Sun Dec 11 11:11:53 2011 -0400
Add changelog, bump version
diff --git a/Changes b/Changes
index b17d454..07a7209 100644
--- a/Changes
+++ b/Changes
@@ -1,5 +1,9 @@
Revision history for Perl extension Mail::GnuPG.
+0.17 Sun Dec 10 2011
+
+ - [RT #73036] Support trust-model = always-trust
+
0.16 Tue Dec 14 2010
- [RT #60280] Add support for gnupg-agent
diff --git a/lib/Mail/GnuPG.pm b/lib/Mail/GnuPG.pm
index 43bc389..ef12594 100644
--- a/lib/Mail/GnuPG.pm
+++ b/lib/Mail/GnuPG.pm
@@ -21,7 +21,7 @@ use 5.006;
use strict;
use warnings;
-our $VERSION = '0.16';
+our $VERSION = '0.17';
my $DEBUG = 0;
use GnuPG::Interface;
-----------------------------------------------------------------------
More information about the Bps-public-commit
mailing list