From d280e3e809a3eed1cedcc4b4221b031ae880a1d1 Mon Sep 17 00:00:00 2001 From: "Kyle J. McKay" Date: Wed, 3 Mar 2021 11:38:57 -0700 Subject: [PATCH] projtool.pl: paranoidify prune pick Make the prune command be even more paranoid about items to remove. Specifically guarantee the gid is at least 65536 and the name starts with an alphanumeric or don't even consider the possibility of pruning that entry at all. Also tidy up the wording a bit to indicate that entries are being removed rather than the entire project. Signed-off-by: Kyle J. McKay --- toolbox/projtool.pl | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/toolbox/projtool.pl b/toolbox/projtool.pl index 2d16bc9..30d912c 100755 --- a/toolbox/projtool.pl +++ b/toolbox/projtool.pl @@ -1142,15 +1142,16 @@ sub cmd_prune { parse_options(force => \$force, "dry-run" => \$dryrun, "quiet" => \$quiet); ($force && !$dryrun) || (!$force && $dryrun) or die_usage; my @projs = @ARGV; - my @allprojs = sort({lc($a) cmp lc($b)} Girocco::Project::get_full_list()); - my %allprojs = map({$_ => 1} @allprojs); + my %allprojs = map({($$_[0] => $_)} Girocco::Project::get_full_list_extended()); + my @allprojs = sort({lc($a) cmp lc($b) || $a cmp $b} keys(%allprojs)); my %seen = (); @projs or @projs = @allprojs; my $bd = $Girocco::Config::reporoot.'/'; my @remove = (); foreach (@projs) { - !$seen{$_} && $allprojs{$_} or next; + !$seen{$_} && $allprojs{$_} && ${$allprojs{$_}}[2] >= 65536 or next; $seen{$_} = 1; + /^[a-zA-Z0-9]/ or next; my $pd = $bd . $_ . '.git'; if (! -e $pd) { warn "$_: no such directory: $pd\n" unless $quiet; @@ -1163,20 +1164,23 @@ sub cmd_prune { warn "\n" if @remove && !$quiet; if ($dryrun) { return 0 unless @remove; - my $msg = "Would remove ".scalar(@remove). " project"; - @remove == 1 or $msg .= "s"; + my $msg = "Would remove ".scalar(@remove). " project entr"; + $msg .= (@remove == 1 ? "y" : "ies"); $msg .= ":\n"; $msg .= join("", map("\t$_\n", @remove)); print $msg unless $quiet; return 1; } - my $msg = "Removed ".scalar(@remove). " project"; - @remove == 1 or $msg .= "s"; + my $msg = "Removed ".scalar(@remove). " project entr"; + $msg .= (@remove == 1 ? "y" : "ies"); $msg .= ":\n"; $msg .= join("", map("\t$_\n", @remove)); my %remove = map({$_ => 1} @remove); filedb_atomic_edit(jailed_file('/etc/group'), sub { - !exists($remove{(split /:/)[0]}) and return $_; + my ($name,undef,$gid) = split /:/; + $gid =~ /^\d+$/ && $gid >= 65536 or return $_; + $name =~ /^[a-zA-Z0-9]/ or return $_; + !exists($remove{$name}) and return $_; }); print $msg unless $quiet; return 0; -- 2.11.4.GIT