[PATCH 1/2] Dpkg::Checksums: New module for checksum handling in .dsc and .changes files
---
debian/dpkg-dev.install | 1 +
scripts/Dpkg/Checksums.pm | 90 +++++++++++++++++++++++++++++++++++++++++++++
scripts/Makefile.am | 1 +
scripts/po/POTFILES.in | 1 +
4 files changed, 93 insertions(+), 0 deletions(-)
create mode 100644 scripts/Dpkg/Checksums.pm
diff --git a/debian/dpkg-dev.install b/debian/dpkg-dev.install
index 2f49727..a41aebb 100644
--- a/debian/dpkg-dev.install
+++ b/debian/dpkg-dev.install
@@ -64,6 +64,7 @@ usr/share/man/*/dpkg-source.1
usr/share/perl5/Dpkg/Arch.pm
usr/share/perl5/Dpkg/BuildOptions.pm
usr/share/perl5/Dpkg/Cdata.pm
+usr/share/perl5/Dpkg/Checksums.pm
usr/share/perl5/Dpkg/Compression.pm
usr/share/perl5/Dpkg/Control.pm
usr/share/perl5/Dpkg/Changelog.pm
diff --git a/scripts/Dpkg/Checksums.pm b/scripts/Dpkg/Checksums.pm
new file mode 100644
index 0000000..9d5d587
--- /dev/null
+++ b/scripts/Dpkg/Checksums.pm
@@ -0,0 +1,90 @@
+package Dpkg::Checksums;
+
+use strict;
+use warnings;
+
+use Dpkg;
+use Dpkg::Gettext;
+use Dpkg::ErrorHandling qw(internerr syserr subprocerr failure error);
+
+use base qw(Exporter);
+our @EXPORT = qw(@check_supported %check_supported %check_prog %check_regex
+ readchecksums getchecksums);
+
+our @check_supported = qw(md5 sha1 sha256);
+our %check_supported = map { $_ => 1 } @check_supported;
+our %check_prog = ( md5 => 'md5sum', sha1 => 'sha1sum',
+ sha256 => 'sha256sum' );
+our %check_regex = ( md5 => qr/[0-9a-f]{32}/,
+ sha1 => qr/[0-9a-f]{40}/,
+ sha256 => qr/[0-9a-f]{64}/ );
+
+sub extractchecksum {
+ my ($alg, $checksum) = @_;
+ ($checksum =~ /^($check_regex{$alg})(\s|$)/m)
+ || failure(_g("checksum program gave bogus output `%s'"), $checksum);
+ return $1;
+}
+
+
+sub readchecksums {
+ my ($checksums) = @_;
+ my %checksums;
+
+ my $rx_fname = qr/[0-9a-zA-Z][-+:.,=0-9a-zA-Z_~]+/;
+ for my $checksum (split /\n /, $checksums) {
+ next if $checksum eq '';
+ $checksum =~ m/^(\w+)\s+(\S+)\s+($rx_fname)$/
+ || do {
+ warning(_g("Checksums field contains bad line \`%s'"), $checksum);
+ next;
+ };
+ my ($algorithm, $sum, $file) = ($1, $2, $3);
+ unless ($check_supported{$algorithm}) {
+ warning(_g("Unknown checksum algorithm \`%s' in line \`%s', ignoring"),
+ $algorithm, $checksum);
+ next;
+ }
+ unless ($sum =~ /^$check_regex{$algorithm}$/) {
+ warning(_g("Malformed checksum in line \`%s', ignoring"), $checksum);
+ next;
+ }
+ if (exists($checksums{$file}{$algorithm})
+ and $checksums{$file}{$algorithm} ne $sum) {
+ error(_g("Conflicting checksums \`%s\' and \`%s' for file \`%s'"),
+ $checksums{$file}{$algorithm}, $sum, $file);
+ }
+ $checksums{$file}{$algorithm} = $sum;
+ }
+
+ return \%checksums;
+}
+
+sub getchecksums {
+ my ($file, $checksums, $size) = @_;
+
+ (my @s = stat($file)) || syserr(_g("cannot fstat file %s"), $file);
+ my $newsize = $s[7];
+ if (defined($$size)
+ and $newsize != $$size) {
+ error(_g("File %s has size %u instead of expected %u"),
+ $file, $newsize, $$size);
+ }
+ $$size = $newsize;
+
+ foreach my $alg (@check_supported) {
+ my $prog = $check_prog{$alg};
+ my $newsum = `$prog $file`;
+ $? && subprocerr("%s %s", $prog, $file);
+ $newsum = extractchecksum($alg, $newsum);
+
+ if (defined($checksums->{$alg})
+ and $newsum ne $checksums->{$alg}) {
+ error(_g("File %s has checksum %s instead of expected %s (algorithm %s)"),
+ $file, $newsum, $checksums->{$alg}, $alg);
+ }
+ $checksums->{$alg} = $newsum;
+ }
+}
+
+1;
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index e27f294..a0b1a96 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -89,6 +89,7 @@ nobase_dist_perllib_DATA = \
Dpkg/Cdata.pm \
Dpkg/Changelog.pm \
Dpkg/Changelog/Debian.pm \
+ Dpkg/Checksums.pm \
Dpkg/Compression.pm \
Dpkg/Control.pm \
Dpkg/Deps.pm \
diff --git a/scripts/po/POTFILES.in b/scripts/po/POTFILES.in
index 4a14b35..69092b7 100644
--- a/scripts/po/POTFILES.in
+++ b/scripts/po/POTFILES.in
@@ -18,6 +18,7 @@ scripts/Dpkg/Arch.pm
scripts/Dpkg/Cdata.pm
scripts/Dpkg/Changelog.pm
scripts/Dpkg/Changelog/Debian.pm
+scripts/Dpkg/Checksums.pm
scripts/Dpkg/Control.pm
scripts/Dpkg/Deps.pm
scripts/Dpkg/ErrorHandling.pm
--
1.5.3.8
Reply to: