]> err.no Git - dpkg/commitdiff
Check the gpg signatures of .dsc files before unpacking. See
authorFrank Lichtenheld <djpig@debian.org>
Wed, 18 Jan 2006 12:49:34 +0000 (12:49 +0000)
committerFrank Lichtenheld <djpig@debian.org>
Wed, 18 Jan 2006 12:49:34 +0000 (12:49 +0000)
the upstream changelog for a full description of the semantics.
Based on a patch by Matt Zimmerman. Closes: #48711

ChangeLog
debian/changelog
scripts/dpkg-source.pl

index 3b200de1619407ebe8c77985b5a3ea52c0617c5b..a137b7464c588287d944ae8cdc75f191dd9d9911 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,16 @@
        the .dsc when building. This also normalizes the
        fields.
  
+2005-10-03  Matt Zimmerman  <mdz@debian.org>,
+           Frank Lichtenheld  <djpig@debian.org>
+
+       * scripts/dpkg-source.pl: If gpg is installed, check
+       the signature of the .dsc file before unpacking.
+       Allow the unpacking to suceed if the .dsc is unsigned
+       but error out if the signature is bad. If gpg exits
+       with a code >2 (e.g. missing key), show the user the gpg
+       output but continue.
+
 2005-10-03  Frank Lichtenheld  <djpig@debian.org>
 
        * scripts/dpkg-source.pl: Try to chown files extracted from
index c0ef7725b3e861d91507218fe6c6a5db2cd36a8e..2e5db56f51adccbd98431f1feebe821369984746 100644 (file)
@@ -11,6 +11,9 @@ dpkg (1.13.12~) unstable; urgency=low
   * Let dpkg-source -b check the build relation fields before
     putting them into the .dsc. As a side effect they also
     get normalized. Closes: #254449
+  * Check the gpg signatures of .dsc files before unpacking. See
+    the upstream changelog for a full description of the semantics.
+    Based on a patch by Matt Zimmerman. Closes: #48711
 
  --
 
index 6256b3b2039f5ecb2be9f5e5c630f524e95e4f54..4c01cb453f8deadc35ecedbcbc766f454f500f1e 100755 (executable)
@@ -516,7 +516,7 @@ if ($opmode eq 'build') {
     }
     exit(0);
 
-} else {
+} else { # -> opmode ne 'build'
 
     $sourcestyle =~ y/X/p/;
     $sourcestyle =~ m/[pun]/ ||
@@ -535,6 +535,32 @@ if ($opmode eq 'build') {
        ! -e $newdirectory || &error("unpack target exists: $newdirectory");
     }
 
+    my $is_signed = 0;
+    open(DSC,"< $dsc") || &error("cannot open .dsc file $dsc: $!");
+    while (<DSC>) {
+       next if /^\s*$/o;
+       $is_signed = 1 if /^-----BEGIN PGP SIGNED MESSAGE-----$/o;
+       last;
+    }
+    close(DSC);
+
+    if ($is_signed) {
+       if (-x '/usr/bin/gpg') {
+           my $gpg_command = 'gpg -q --verify '.quotemeta($dsc).' 2>&1';
+           my @gpg_output = `$gpg_command`;
+           my $gpg_status = $? >> 8;
+           if ($gpg_status) {
+               print STDERR join("",@gpg_output);
+               &error("failed to verify signature on $dsc")
+                   if ($gpg_status == 1);
+           }
+       } else {
+           &warn("could not verify signature on $dsc since gpg isn't installed");
+       }
+    } else {
+       &warn("extracting unsigned source package ($dsc)");
+    }
+
     open(CDATA,"< $dsc") || &error("cannot open .dsc file $dsc: $!");
     &parsecdata('S',-1,"source control file $dsc");
     close(CDATA);