Helper/Nix: constructRunCommandLogPath: verify uuid is valid
This shouldn't be possible normally, but it is possible to: $db->resultset('RunCommandLogs')->new({ uuid => "../etc/passwd" }); if you have access to the `$db`.
This commit is contained in:
parent
e381751564
commit
61189ecca9
|
@ -537,8 +537,10 @@ sub runcommandlog :Local :Args(1) {
|
||||||
|
|
||||||
die if defined $tail && $tail !~ /^[0-9]+$/;
|
die if defined $tail && $tail !~ /^[0-9]+$/;
|
||||||
|
|
||||||
my $runlog = $c->model('DB')->resultset('RunCommandLogs')->find({ uuid => $uuid });
|
my $runlog = $c->model('DB')->resultset('RunCommandLogs')->find({ uuid => $uuid })
|
||||||
my $logFile = constructRunCommandLogPath($runlog) or notFound($c, "RunCommandLog not found.");
|
or notFound($c, "The RunCommand log is not available.");
|
||||||
|
|
||||||
|
my $logFile = constructRunCommandLogPath($runlog);
|
||||||
if (-f $logFile) {
|
if (-f $logFile) {
|
||||||
serveLogFile($c, $logFile, $tail);
|
serveLogFile($c, $logFile, $tail);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -13,6 +13,7 @@ use Nix::Store;
|
||||||
use Encode;
|
use Encode;
|
||||||
use Sys::Hostname::Long;
|
use Sys::Hostname::Long;
|
||||||
use IPC::Run;
|
use IPC::Run;
|
||||||
|
use UUID4::Tiny qw(is_uuid4_string);
|
||||||
|
|
||||||
our @ISA = qw(Exporter);
|
our @ISA = qw(Exporter);
|
||||||
our @EXPORT = qw(
|
our @EXPORT = qw(
|
||||||
|
@ -592,17 +593,16 @@ sub isLocalStore {
|
||||||
|
|
||||||
sub constructRunCommandLogPath {
|
sub constructRunCommandLogPath {
|
||||||
my ($runlog) = @_;
|
my ($runlog) = @_;
|
||||||
my $path = undef;
|
|
||||||
|
|
||||||
eval {
|
|
||||||
my $uuid = $runlog->uuid;
|
my $uuid = $runlog->uuid;
|
||||||
|
|
||||||
|
if (!is_uuid4_string($uuid)) {
|
||||||
|
die "UUID was invalid."
|
||||||
|
}
|
||||||
|
|
||||||
my $hydra_path = Hydra::Model::DB::getHydraPath;
|
my $hydra_path = Hydra::Model::DB::getHydraPath;
|
||||||
my $bucket = substr($uuid, 0, 2);
|
my $bucket = substr($uuid, 0, 2);
|
||||||
|
|
||||||
$path = "$hydra_path/runcommand-logs/$bucket/$uuid";
|
return "$hydra_path/runcommand-logs/$bucket/$uuid";
|
||||||
};
|
|
||||||
|
|
||||||
return $path;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
|
@ -82,6 +82,12 @@ subtest "constructRunCommandLogPath" => sub {
|
||||||
qr@/runcommand-logs/[0-9a-f]{2}/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}@,
|
qr@/runcommand-logs/[0-9a-f]{2}/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}@,
|
||||||
"The constructed RunCommandLog path is sufficiently bucketed and UUID-like."
|
"The constructed RunCommandLog path is sufficiently bucketed and UUID-like."
|
||||||
);
|
);
|
||||||
|
|
||||||
|
my $badlog = $db->resultset('RunCommandLogs')->new({ uuid => "../../../etc/passwd" });
|
||||||
|
ok(
|
||||||
|
dies { Hydra::Helper::Nix::constructRunCommandLogPath($badlog) },
|
||||||
|
"Expected invalid UUID to be rejected and not have a path constructed for it.",
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
done_testing;
|
done_testing;
|
||||||
|
|
Loading…
Reference in a new issue