summaryrefslogtreecommitdiff
path: root/systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
diff options
context:
space:
mode:
Diffstat (limited to 'systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm')
-rw-r--r--systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm65
1 files changed, 62 insertions, 3 deletions
diff --git a/systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm b/systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
index 3e4dfb1331..87cff357ed 100644
--- a/systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
+++ b/systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
@@ -1,6 +1,6 @@
-# $Id: TLCrypto.pm 52158 2019-09-23 18:04:33Z karl $
+# $Id: TLCrypto.pm 53820 2020-02-17 03:23:13Z preining $
# TeXLive::TLCrypto.pm - handle checksums and signatures.
-# Copyright 2016-2019 Norbert Preining
+# Copyright 2016-2020 Norbert Preining
# This file is licensed under the GNU General Public License version 2
# or any later version.
@@ -12,7 +12,7 @@ use TeXLive::TLConfig;
use TeXLive::TLUtils qw(debug ddebug win32 which platform
conv_to_w32_path tlwarn tldie);
-my $svnrev = '$Revision: 52158 $';
+my $svnrev = '$Revision: 53820 $';
my $_modulerevision = ($svnrev =~ m/: ([0-9]+) /) ? $1 : "unknown";
sub module_revision { return $_modulerevision; }
@@ -34,6 +34,7 @@ C<TeXLive::TLCrypto> -- checksums and cryptographic signatures
TeXLive::TLCrypto::tlchecksum($path);
TeXLive::TLCrypto::verify_checksum($file, $url);
+ TeXLive::TLCrypto::verify_checksum_and_check_return($file, $url);
=head2 Signatures
@@ -52,6 +53,7 @@ BEGIN {
&tlchecksum
&tl_short_digest
&verify_checksum
+ &verify_checksum_and_check_return
&setup_gpg
&verify_signature
%VerificationStatusDescription
@@ -226,6 +228,63 @@ sub tl_short_digest { return (Digest::MD5::md5_hex(shift)); }
# emacs-page
=pod
+=item C<< verify_checksum_and_check_return($file, $tlpdburl [, $is_main, $localcopymode ]) >>
+
+Calls C<<verify_checksum>> and checks the various return values
+for critical errors, and dies if necessary.
+
+If C<$is_main> is given and true, an unsigned tlpdb is considered
+fatal. If C<$localcopymode> is given and true, do not die for
+checksum and connection errors, thus allowing for re-downloading
+of a copy.
+
+=cut
+
+sub verify_checksum_and_check_return {
+ my ($file, $path, $is_main, $localcopymode) = @_;
+ my ($r, $m) = verify_checksum($file, "$path.$ChecksumExtension");
+ if ($r == $VS_CHECKSUM_ERROR) {
+ if (!$localcopymode) {
+ tldie("$0: checksum error when downloading $file from $path: $m\n");
+ }
+ } elsif ($r == $VS_SIGNATURE_ERROR) {
+ tldie("$0: signature verification error of $file from $path: $m\n");
+ } elsif ($r == $VS_CONNECTION_ERROR) {
+ if ($localcopymode) {
+ return(0, $r);
+ } else {
+ tldie("$0: cannot download: $m\n");
+ }
+ } elsif ($r == $VS_UNSIGNED) {
+ if ($is_main) {
+ tldie("$0: main database at $path is not signed: $m\n");
+ }
+ debug("$0: remote database checksum is not signed, continuing anyway: $m\n");
+ return(0, $r);
+ } elsif ($r == $VS_EXPKEYSIG) {
+ debug("$0: good signature bug gpg key expired, continuing anyway!\n");
+ return(0, $r);
+ } elsif ($r == $VS_REVKEYSIG) {
+ debug("$0: good signature but from revoked gpg key, continuing anyway!\n");
+ return(0, $r);
+ } elsif ($r == $VS_GPG_UNAVAILABLE) {
+ debug("$0: TLPDB: no gpg available, continuing anyway!\n");
+ return(0, $r);
+ } elsif ($r == $VS_PUBKEY_MISSING) {
+ debug("$0: TLPDB: pubkey missing, continuing anyway!\n");
+ return(0, $r);
+ } elsif ($r == $VS_VERIFIED) {
+ return(1, $r);
+ } else {
+ tldie("$0: unexpected return value from verify_checksum: $r\n");
+ }
+}
+
+
+
+# emacs-page
+=pod
+
=item C<< verify_checksum($file, $checksum_url) >>
Verifies that C<$file> has checksum C<$checksum_url>, and if gpg is