From 9b0fce8a6ae53166c79c994826ea1461323a7025 Mon Sep 17 00:00:00 2001 From: Jacob Bachmeyer Date: Wed, 26 Oct 2022 23:07:08 -0500 Subject: [PATCH] Merge parse_directory_line into interpret_directive The old code is still extant because it is also used elsewhere, but will be cleaned up in future commits. --- gatekeeper.pl | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/gatekeeper.pl b/gatekeeper.pl index 7d840d8..6a1af55 100755 --- a/gatekeeper.pl +++ b/gatekeeper.pl @@ -1682,9 +1682,43 @@ sub interpret_directive { my $tainted_val = $item->[1]; if ($tainted_cmd eq 'directory') { - parse_directory_line($tainted_val, $directive_file_contents,0); - $header{directory} = $info{directory}; - $header{package} = $info{package}; + unless ($tainted_val =~ m/^($RE_filename_relative)$/) { + push @errors, "invalid directory $tainted_val"; + next; + } + my $val = $1; # so far so good + + my @dirs = File::Spec::Unix->splitdir($1); + my $dir_depth = scalar @dirs; + + # A couple of subdir levels are ok, but don't allow hundreds. + if ($dir_depth > MAX_DIRECTORY_DEPTH) { + push @errors, "$dir_depth levels is too deep, in $val"; + next; + } + + # Only let them specify one directory directive. + if (defined $header{directory}) { + push @errors, + "Only one directory directive is allowed per directive file. " + ."Error at directory directive: $val"; + next; + } + + $header{directory} = $val; # ok. + $header{package} = $dirs[0]; # top-level name, no subdir + $info{directory} = $header{directory}; + $info{package} = $header{package}; + + # TODO: move this part elsewhere: + # Set email addresses + my @a = email_addresses($info{package}); + foreach my $address (@a) { + # Do not include duplicates + push (@{$info{email}}, $address) + unless (grep($_ eq $address,@{$info{email}}) > 0); + } + } elsif ($tainted_cmd eq 'filename') { # We use the same filename restrictions as scan_incoming unless ($tainted_val =~ /^($RE_filename_here)$/) { -- 2.25.1