Revise checks for "filename" directive element in read_directive_file
authorJacob Bachmeyer <jcb@gnu.org>
Thu, 20 Oct 2022 03:49:36 +0000 (22:49 -0500)
committerJacob Bachmeyer <jcb@gnu.org>
Thu, 20 Oct 2022 03:49:36 +0000 (22:49 -0500)
The revised code uses the "filename" directive element as a command to
install an uploaded file.  This change ensures that a legitimate loose
directive will be processed even if accompanied with a bogus file.

This is a definitive break from protocol version 1.0, which was disabled
in 2012 and recently removed.

gatekeeper.pl

index fe816dbebe01b57aae589149dddbd2b32ded4a40..6e6348ab89b0f7e0c487dbe70200e5cd60afc80b 100755 (executable)
@@ -1528,6 +1528,18 @@ sub read_directive_file {
   my @keyrings = keyring_file ($op_header->{package},$op_header->{directory});
   fatal("no keyring for package $op_header->{package}",0) if ($#keyrings < 0);
 
+  # Check that we actually have at least one command in the directive
+  unless ($#$ops > 0) {
+    if ($directive_only) {
+      fatal("nothing to do - no commands in directive file",1);
+    } else {
+      # Provide a different message if this looks like an upload packet.
+      fatal("no filename directive specified in $directive_file. "
+           ."Upgrade to the latest version! "
+           ."See http://www.gnu.org/prep/maintain/maintain.html",1)
+    }
+  }
+
   # If there is a command in the directive that doesn't require an actual
   # file to work on, we won't require the filename line in the directive
   # file. This will allow people to upload a directive file only to
@@ -1542,28 +1554,6 @@ sub read_directive_file {
   #      don't require a filename - currently symlink, rmsymlink, and
   #      archive - and only the directive file was uploaded
   if (!exists($info{filename})) {
-    my $directory_command_only = 1;
-    foreach (keys %info) {
-      $directory_command_only = 0
-       if (($_ ne 'directory') && ($_ ne 'package') && ($_ ne 'email')
-           && ($_ ne 'version'));
-    }
-    # This is where we would check for commands that require a file.
-    # In this version (1.1), there are none, so all we do is check
-    # that only the directive file was uploaded
-
-    if (!$directive_only) {
-      # We have three files
-      # This is not allowed - we require a filename directive.
-      fatal("no filename directive specified in $directive_file. "
-           ."Upgrade to the latest version! "
-           ."See http://www.gnu.org/prep/maintain/maintain.html",1)
-    } else {
-      # We only have a directive file
-      # Do we have something to do?
-      fatal("nothing to do - no commands in directive file",1)
-       if ($directory_command_only == 1);
-    }
     $filename_required = 0;
   }