Imported Upstream version 1.12
This commit is contained in:
89
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/ChecksumVerifier.pm
Normal file
89
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/ChecksumVerifier.pm
Normal file
@@ -0,0 +1,89 @@
|
||||
#!/usr/bin/perl
|
||||
package JMX::Jmx4Perl::Agent::Jolokia::Verifier::ChecksumVerifier;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
JMX::Jmx4Perl::Agent::Jolokia::Verifier::ChecksumVerifier - Verifies a
|
||||
checksum for a downloaded artifact.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This verifier provides the base for simple checksum checking. It needs to be
|
||||
subclassed to provide the proper extension (e.g. ".sha1") and creating of a
|
||||
digester.
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
use strict;
|
||||
|
||||
sub new {
|
||||
my $class = shift;
|
||||
my $self = {};
|
||||
bless $self,(ref($class) || $class);
|
||||
}
|
||||
|
||||
sub extension {
|
||||
die "abstract";
|
||||
}
|
||||
|
||||
sub name {
|
||||
die "abstract";
|
||||
}
|
||||
|
||||
sub create_digester {
|
||||
die "abstract";
|
||||
}
|
||||
|
||||
sub verify {
|
||||
my $self = shift;
|
||||
my %args = @_;
|
||||
my $logger = $args{logger};
|
||||
my $sig = $args{signature};
|
||||
chomp $sig;
|
||||
$sig =~ s/^([^\s]+).*$/$1/;
|
||||
my $digester = $self->create_digester;
|
||||
my $file = $args{path};
|
||||
if ($file) {
|
||||
open (my $fh, "<", $file) || ($logger->error("Cannot open $file for ",$self->name," check: $!") && die "\n");
|
||||
$digester->addfile($fh);
|
||||
close $fh;
|
||||
} else {
|
||||
my $data = $args{data};
|
||||
$digester->add($data);
|
||||
}
|
||||
my $sig_calc = $digester->hexdigest;
|
||||
if (lc($sig) eq lc($sig_calc)) {
|
||||
$logger->info("Passed ",$self->name," check (" . $sig_calc . ")",($file ? " for file $file" : ""));
|
||||
} else {
|
||||
$logger->error("Failed ",$self->name," check. Got: " . $sig_calc . ", Expected: " . $sig);
|
||||
die "\n";
|
||||
}
|
||||
}
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
This file is part of jmx4perl.
|
||||
Jmx4perl is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
The Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
jmx4perl is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with jmx4perl. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
A commercial license is available as well. Please contact roland@cpan.org for
|
||||
further details.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
roland@cpan.org
|
||||
|
||||
=cut
|
||||
|
||||
1;
|
||||
170
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/GnuPGVerifier.pm
Normal file
170
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/GnuPGVerifier.pm
Normal file
@@ -0,0 +1,170 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
package JMX::Jmx4Perl::Agent::Jolokia::Verifier::GnuPGVerifier;
|
||||
|
||||
use JMX::Jmx4Perl::Agent::Jolokia::Verifier::PGPKey;
|
||||
use Module::Find;
|
||||
use Data::Dumper;
|
||||
use File::Temp qw/tempfile/;
|
||||
|
||||
use strict;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
JMX::Jmx4Perl::Agent::Jolokia::Verifier::GnuPGVerifier - Verifies PGP
|
||||
signature with a natively installed GnuPG (with gpg found in the path)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This verifier uses a natively installed GPG for validating a PGP signature
|
||||
obtained from the download site. It's similar to
|
||||
L<JMX::Jmx4Perl::Agent::Jolokia::Verifier::OpenPGPVerifier> except that it will
|
||||
use a locally installed GnuPG installation. Please note, that it will import
|
||||
the public key used for signature verification into the local keystore.
|
||||
|
||||
=cut
|
||||
|
||||
sub new {
|
||||
my $class = shift;
|
||||
my $self = {};
|
||||
($self->{gpg},$self->{version}) = &_gpg_version();
|
||||
bless $self,(ref($class) || $class);
|
||||
}
|
||||
|
||||
sub extension {
|
||||
return ".asc";
|
||||
}
|
||||
|
||||
sub name {
|
||||
return "GnuPG";
|
||||
}
|
||||
|
||||
sub verify {
|
||||
my $self = shift;
|
||||
my %args = @_;
|
||||
|
||||
my $log = $args{logger};
|
||||
my $gpg = $self->{gpg};
|
||||
|
||||
die "Neither 'path' nor 'data' given for specifying the file/data to verify"
|
||||
unless $args{path} || $args{data};
|
||||
|
||||
my $signature_path = $self->_store_tempfile($args{signature});
|
||||
my $path = $args{path} ? $args{path} : $self->_store_tempfile($args{data});
|
||||
my @cmd = (
|
||||
$gpg,
|
||||
qw(--verify --batch --no-tty -q --logger-fd=1),
|
||||
);
|
||||
eval {
|
||||
push @cmd, $signature_path,$path;
|
||||
# Unset language for proper parsing of the output independent
|
||||
# of the locale
|
||||
local $ENV{LANG} = undef;
|
||||
my $cmd = join ' ', @cmd;
|
||||
my $output = `$cmd`;
|
||||
if ($output =~ /public\s*key/i) {
|
||||
# Import key and retry
|
||||
$self->_import_key(\%args);
|
||||
$output = `$cmd`;
|
||||
}
|
||||
|
||||
$self->_verify_gpg_output($?,$output,\%args);
|
||||
};
|
||||
|
||||
# Always cleanup
|
||||
my $error = $@;
|
||||
unlink $signature_path;
|
||||
unlink $path unless $args{path};
|
||||
die $error if $error;
|
||||
|
||||
}
|
||||
|
||||
sub _verify_gpg_output {
|
||||
my $self = shift;
|
||||
my $code = shift;
|
||||
my $output = shift;
|
||||
my $args = shift;
|
||||
my $log = $args->{logger};
|
||||
my $key = $1 if $output =~ /\s+([\dA-F]{8})/;
|
||||
# print $output,"\n";
|
||||
if ($code) {
|
||||
$log->error("Invalid signature",$args->{path} ? " for " . $args->{path} : "",$key ? " (key: $key)" : "");
|
||||
die "\n";
|
||||
} else {
|
||||
$log->info("Good PGP signature" . ($key ? " ($key)" : ""));
|
||||
}
|
||||
}
|
||||
|
||||
sub _import_key {
|
||||
my $self = shift;
|
||||
my $args = shift;
|
||||
|
||||
my $gpg = $self->{gpg};
|
||||
my $log = $args->{logger};
|
||||
my $key_path = $self->_store_tempfile($JMX::Jmx4Perl::Agent::Jolokia::Verifier::PGPKey::KEY);
|
||||
|
||||
my @cmd = ($gpg,qw(--import --verbose --batch --no-tty --logger-fd=1),$key_path);
|
||||
my $cmd = join ' ', @cmd;
|
||||
my $output = `$cmd 2>&1`;
|
||||
if ($?) {
|
||||
$log->error("Cannot add public PGP used for verification to local keystore: $output");
|
||||
die "\n";
|
||||
} else {
|
||||
#$log->info($output);
|
||||
my $info = $1 if $output =~ /([\dA-F]{8}.*import.*)$/mi;
|
||||
$log->info($info ? $info : "Added jmx4perl key");
|
||||
}
|
||||
unlink $key_path;
|
||||
}
|
||||
|
||||
|
||||
sub _gpg_version {
|
||||
my $gpg = "gpg2";
|
||||
my $out = `gpg2 --version`;
|
||||
if ($?) {
|
||||
$out = `gpg --version`;
|
||||
$gpg = "gpg";
|
||||
if ($?) {
|
||||
die "Cannot find gpg or gpg2: $out\n";
|
||||
}
|
||||
}
|
||||
$out =~ /GnuPG.*?(\S+)\s*$/m;
|
||||
return ($gpg,$1);
|
||||
}
|
||||
|
||||
sub _store_tempfile {
|
||||
my $self = shift;
|
||||
my $sig = shift || die "No data given to store in temp file";
|
||||
my ($fh,$path) = tempfile();
|
||||
print $fh $sig;
|
||||
close $fh;
|
||||
return $path;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
This file is part of jmx4perl.
|
||||
Jmx4perl is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
The Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
jmx4perl is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with jmx4perl. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
A commercial license is available as well. Please contact roland@cpan.org for
|
||||
further details.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
roland@cpan.org
|
||||
|
||||
=cut
|
||||
60
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/MD5Verifier.pm
Normal file
60
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/MD5Verifier.pm
Normal file
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/perl
|
||||
package JMX::Jmx4Perl::Agent::Jolokia::Verifier::MD5Verifier;
|
||||
|
||||
use Digest::MD5;
|
||||
use JMX::Jmx4Perl::Agent::Jolokia::Verifier::ChecksumVerifier;
|
||||
use base qw(JMX::Jmx4Perl::Agent::Jolokia::Verifier::ChecksumVerifier);
|
||||
use strict;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
JMX::Jmx4Perl::Agent::Jolokia::Verifier::MD5Verifier - Verifies a
|
||||
MD5 checksum
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Verifies against a MD5 checksum for an artifact. The MD5 sum needs to be
|
||||
available parallel to the download artifact with a ".md5" extension.
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
sub extension {
|
||||
return ".md5";
|
||||
}
|
||||
|
||||
sub name {
|
||||
return "MD5";
|
||||
}
|
||||
|
||||
sub create_digester {
|
||||
return new Digest::MD5();
|
||||
}
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
This file is part of jmx4perl.
|
||||
Jmx4perl is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
The Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
jmx4perl is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with jmx4perl. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
A commercial license is available as well. Please contact roland@cpan.org for
|
||||
further details.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
roland@cpan.org
|
||||
|
||||
=cut
|
||||
|
||||
1;
|
||||
|
||||
114
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/OpenPGPVerifier.pm
Normal file
114
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/OpenPGPVerifier.pm
Normal file
@@ -0,0 +1,114 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
package JMX::Jmx4Perl::Agent::Jolokia::Verifier::OpenPGPVerifier;
|
||||
|
||||
use JMX::Jmx4Perl::Agent::Jolokia::Verifier::PGPKey;
|
||||
use Crypt::OpenPGP::KeyRing;
|
||||
use Crypt::OpenPGP;
|
||||
use Module::Find;
|
||||
use Data::Dumper;
|
||||
use Cwd 'abs_path';
|
||||
|
||||
use strict;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
JMX::Jmx4Perl::Agent::Jolokia::Verifier::OpenPGPVerifier - Verifies PGP
|
||||
signature with L<Crypt::OpenPGP>
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This verifier uses L<Crypt::OpenPGP> for validating a PGP signature obtained
|
||||
from the download site. Ie. each URL used for download should have (and does
|
||||
have) and associated signature ending with F<.asc>. This verifier typically
|
||||
quite robust, however installing L<Crypt::OpenPGP> is a bit clumsy, so you
|
||||
might omit this one.
|
||||
|
||||
=head1 IMPORTANT
|
||||
|
||||
It is not used currently since the new agents has been signed with 'digest
|
||||
algortihm 10' which is not supported by OpenPGP. Use a native GnuPG instead
|
||||
(i.e. a 'gpg' which is in the path)
|
||||
|
||||
=cut
|
||||
|
||||
sub new {
|
||||
my $class = shift;
|
||||
my $self = {};
|
||||
$self->{keyring} = $JMX::Jmx4Perl::Agent::Jolokia::Verifier::PGPKey::KEY;
|
||||
bless $self,(ref($class) || $class);
|
||||
}
|
||||
|
||||
sub extension {
|
||||
return ".asc";
|
||||
}
|
||||
|
||||
sub name {
|
||||
return "OpenPGP";
|
||||
}
|
||||
|
||||
sub verify {
|
||||
my $self = shift;
|
||||
my %args = @_;
|
||||
|
||||
my $kr = new Crypt::OpenPGP::KeyRing(Data => $self->{keyring});
|
||||
my $pgp = new Crypt::OpenPGP(PubRing => $kr);
|
||||
my $path = $args{path};
|
||||
my $log = $args{logger};
|
||||
my $validate;
|
||||
if ($path) {
|
||||
$validate = $pgp->verify(Files => [abs_path($args{path})],Signature => $args{signature});
|
||||
} else {
|
||||
$validate = $pgp->verify(Data => $args{data},Signature => $args{signature});
|
||||
}
|
||||
if ($validate) {
|
||||
my $key;
|
||||
if ($validate != 1) {
|
||||
my $kb = $kr->find_keyblock_by_uid($validate);
|
||||
if ($kb) {
|
||||
eval {
|
||||
# Non-document method
|
||||
$key = $kb->key->key_id_hex;
|
||||
$key = substr $key,8,8 if length($key) > 8;
|
||||
};
|
||||
}
|
||||
}
|
||||
$log->info("Good PGP signature",
|
||||
($validate != 1 ? (", signed by ",$validate) : ""),
|
||||
($key ? " ($key)" :""));
|
||||
return 1;
|
||||
} elsif ($validate == 0) {
|
||||
$log->error("Invalid signature",$path ? " for $path" : "",": " . $pgp->errstr);
|
||||
die "\n";
|
||||
} else {
|
||||
$log->error("Error occured while verifying signature: ",$pgp->errstr);
|
||||
die "\n";
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
This file is part of jmx4perl.
|
||||
Jmx4perl is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
The Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
jmx4perl is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with jmx4perl. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
A commercial license is available as well. Please contact roland@cpan.org for
|
||||
further details.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
roland@cpan.org
|
||||
|
||||
=cut
|
||||
35
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/PGPKey.pm
Normal file
35
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/PGPKey.pm
Normal file
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
package JMX::Jmx4Perl::Agent::Jolokia::Verifier::PGPKey;
|
||||
|
||||
use strict;
|
||||
use vars qw($KEY);
|
||||
|
||||
# Public key for verifying downloaded artifacts
|
||||
|
||||
$KEY = <<EOT;
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: GnuPG v1.4.10 (GNU/Linux)
|
||||
|
||||
mQCNAzpoBEMAAAEEAMdDw9V+zMCjJI6Icjv+Z+s5mepNJ+tH848PVOfZohfDoEZx
|
||||
pthbKW+U0EgFVtV8EE9iWDQOh68U3BvEaOvk+99YoahRRACuII1Y+Q445UaNV/Tn
|
||||
hCGmofWITYY8Tbz6dcYnWsWMQ5XByM4aMwucM8pUARomkrrM9kKyJpPvEBFlAAUR
|
||||
tCFSb2xhbmQgSHVzcyA8cm9sYW5kQGpteDRwZXJsLm9yZz6JAJUDBRNNcVaiQrIm
|
||||
k+8QEWUBARSrA/9gp7YhV7kh47WWtzC25aaW/WS2FwiBqKsOIJ5z8kkrEDOqz3iU
|
||||
TEzyHMgngwR7dNqZAM2xZlt6uTW1VuhraOFp27V0UVpQg/l1XaHF9JNVPvsbGmFG
|
||||
MIu/2gQrkhI9/Amyy5Zi3w2mbwISQ897QVY0O98/BlcymFpl5hrx4qbSdbQdUm9s
|
||||
YW5kIEh1c3MgPHJvbGFuZEBjcGFuLm9yZz6JAJUDBRA6aATCQrImk+8QEWUBAbKN
|
||||
A/9IEGDcSG7bB7ZW2oDzny++6nhpsHzRlSIwcXJA20W73bu/So8+v6fl4CiBEtZW
|
||||
KN6qCwqpreK6i8DHx+bGMkm8+uucO3G5vqi9FIF1yJt8ioLPyhPNktRGCCdSxbqG
|
||||
uYlOaDFwa9J9ebcqPe3mS0/374ixaArqpQPB+S/OU3nuXbQeUm9sYW5kIEh1c3Mg
|
||||
PHJvbGFuZEBjb25zb2wuZGU+iQCVAwUQOmgEQ0KyJpPvEBFlAQHI+AP9FbP3x5vs
|
||||
moXO95yV3PHhw0FOo9Szpd4kgIoXGMRVGC5gFKyX7dSU8jwi5PnSQRmTg8jQUUBj
|
||||
kVYi29nKHsOwp9J7oTbHlC02heaghjW5zTxxRv6lgmh3+cIsAimbi/fr3pRovRCT
|
||||
MS75CQJTAQAXz4+ALBxU3sG71kEx1mVwEIS0IFJvbGFuZCBIdXNzIDxyb2xhbmRA
|
||||
am9sb2tpYS5vcmc+iQCVAwUTTXFWgUKyJpPvEBFlAQHGcwP/UNWFVPiV+o3qWVfY
|
||||
+g9EiJoN43YN6QI3VasZ6Gjda3ZCJ6aLQXL9UorcTQBSIpCOKvEElG5Sw+dH0IPW
|
||||
jmrzWK1s9lnU2Qkx88QY5O489p+Z98SqbDGqW7DEIkYutYVou0nV7/SVyulMUNGe
|
||||
vqmY3GlfyqrXMXL+lu6IRpCfHcw=
|
||||
=HxAM
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
EOT
|
||||
58
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/SHA1Verifier.pm
Normal file
58
lib/JMX/Jmx4Perl/Agent/Jolokia/Verifier/SHA1Verifier.pm
Normal file
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/perl
|
||||
package JMX::Jmx4Perl::Agent::Jolokia::Verifier::SHA1Verifier;
|
||||
|
||||
use Digest::SHA1;
|
||||
use JMX::Jmx4Perl::Agent::Jolokia::Verifier::ChecksumVerifier;
|
||||
use base qw(JMX::Jmx4Perl::Agent::Jolokia::Verifier::ChecksumVerifier);
|
||||
use strict;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
JMX::Jmx4Perl::Agent::Jolokia::Verifier::SHA1Verifier - Verifies a
|
||||
SHA1 checksum
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Verifies against a SHA1 checksum for an artifact. The SHA1 sum needs to be
|
||||
available parallel to the download artifact with a ".sha1" extension.
|
||||
|
||||
=cut
|
||||
|
||||
sub extension {
|
||||
return ".sha1";
|
||||
}
|
||||
|
||||
sub name {
|
||||
return "SHA1";
|
||||
}
|
||||
|
||||
sub create_digester {
|
||||
return new Digest::SHA1();
|
||||
}
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
This file is part of jmx4perl.
|
||||
Jmx4perl is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
The Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
jmx4perl is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with jmx4perl. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
A commercial license is available as well. Please contact roland@cpan.org for
|
||||
further details.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
roland@cpan.org
|
||||
|
||||
=cut
|
||||
|
||||
1;
|
||||
Reference in New Issue
Block a user