Add structured exception for directive replay
authorJacob Bachmeyer <jcb@gnu.org>
Thu, 3 Nov 2022 20:13:46 +0000 (15:13 -0500)
committerJacob Bachmeyer <jcb@gnu.org>
Thu, 3 Nov 2022 20:13:46 +0000 (15:13 -0500)
gatekeeper.pl
testsuite/lib/gatekeeper.exp

index f8647311e3ab8ed350d5c31da8570a1aa9c72242..f25e9b4b4248fb1e06e15a16dd77e7618d3233fa 100755 (executable)
@@ -565,6 +565,22 @@ BEGIN {
     { return join("\n", map join(': ', @$_), @{(shift)->{trace}})."\n" }
 }
 
+{
+  package Local::Exception::signature_replay;
+  {our @ISA = qw(Local::Exception)}
+
+  sub summary { return 'directive signature timestamp older than expected' }
+
+  sub message { my $M = <<'END'; return join(' ', split /\n/, $M); }
+GPG signed upload older than/same timestamp as existing version - not
+allowed. In other words, the filenames for the triplet you have uploaded
+are an exact match for a triplet that has been uploaded in the past, and
+the directive file that you just uploaded has been signed before or at the
+same time as the directive file for the triplet that was uploaded earlier.
+Most likely, you are re-uploading an old triplet.
+END
+}
+
 {
   package Local::Exception::unknown_package;
   {our @ISA = qw(Local::Exception)}
@@ -1941,13 +1957,8 @@ sub advance_timestamp_ratchet {
   if (exists($serials{$full_filename})
       && ($serials{$full_filename} >= $new_epoch)) {
     flock(SERIALS,4);          # Release lock
-    fatal("GPG signed upload older than/same timestamp as existing version "
-         ."- not allowed. In other words, the filenames for the triplet "
-         ."you have uploaded are an exact match for a triplet that has "
-         ."been uploaded in the past, and the directive file that you "
-         ."just uploaded has been signed before or at the same time as "
-         ."the directive file for the triplet that was uploaded earlier. "
-         ."Most likely, you are re-uploading an old triplet.",1);
+    throw signature_replay =>
+      previous_timestamp => $old_epoch, new_timestamp => $new_epoch
   }
 
   $serials{$full_filename} = $new_epoch;
@@ -2609,7 +2620,8 @@ foreach my $packet (@packets) {   # each list element is an array reference
        mail(join("\n",$E->summary,'',$E->trace_msg),1);
       } elsif ($E->type_p('package_configuration')) {
        mail($E->summary,0);
-      } elsif ($E->type_p('unknown_package')) {
+      } elsif ($E->type_p('signature_replay')
+              || $E->type_p('unknown_package')) {
        mail($E->message,1);
       }
     } else {
index 77000282ea558344729b702f98801606b4224fae..41dbc2af36822caaf8b6911ff5f95e752f2fedd0 100644 (file)
@@ -761,7 +761,7 @@ proc analyze_log { base_dir name assess } {
                     exp_continue
                 }
        -re {^gatekeeper\[[0-9]+\]: \(Test\) \[AA\]\
-                GPG signed upload older than/same timestamp[^\r\n]+} {
+                directive signature timestamp older than expected} {
                     # from read_directive_file, if signature timestamp bad
                     set A(validate,older-signature-timestamp) 1
                     exp_continue