Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions app/Enums/UnparsedSubmissionType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace App\Enums;

/**
* The types of data file which can be submitted via the two-phase "unparsed" submission process.
* Each value corresponds to a handler class named App\Http\Submission\Handlers\<value>Handler.
*/
enum UnparsedSubmissionType: string
{
case BAZEL_JSON = 'BazelJSON';
case BUILD_PROPERTIES_JSON = 'BuildPropertiesJSON';
case GCOV_TAR = 'GcovTar';
case JAVA_JSON_TAR = 'JavaJSONTar';
case JSCOVER_TAR = 'JSCoverTar';
case OPENCOVER_TAR = 'OpenCoverTar';
case SUBPROJECT_DIRECTORIES = 'SubProjectDirectories';
}
15 changes: 4 additions & 11 deletions app/Jobs/ProcessSubmission.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace App\Jobs;

use App\Enums\UnparsedSubmissionType;
use App\Exceptions\BadSubmissionException;
use App\Http\Submission\Handlers\AbstractSubmissionHandler;
use App\Http\Submission\Handlers\ActionableBuildInterface;
Expand Down Expand Up @@ -297,23 +298,15 @@ private static function parse_put_submission(string $filename, \App\Models\Proje
// Save a backup file for this submission.

// Include the handler file for this type of submission.
$valid_types = [
'BazelJSON',
'BuildPropertiesJSON',
'GcovTar',
'JavaJSONTar',
'JSCoverTar',
'OpenCoverTar',
'SubProjectDirectories',
];
if (!in_array($buildfile->type, $valid_types, true)) {
$type = UnparsedSubmissionType::tryFrom($buildfile->type);
if ($type === null) {
Log::error("No handler include file for {$buildfile->type}");
$buildfile->delete();
return false;
}

// Instantiate the handler.
$className = 'App\\Http\\Submission\\Handlers\\' . $buildfile->type . 'Handler';
$className = 'App\\Http\\Submission\\Handlers\\' . $type->value . 'Handler';
if (!class_exists($className)) {
Log::error("No handler class for {$buildfile->type}");
$buildfile->delete();
Expand Down
16 changes: 11 additions & 5 deletions app/Utils/UnparsedSubmissionProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

namespace App\Utils;

use App\Enums\UnparsedSubmissionType;
use App\Jobs\ProcessSubmission;
use App\Models\BuildFile;
use App\Models\PendingSubmissions;
Expand All @@ -33,6 +34,7 @@
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
use Symfony\Component\HttpFoundation\Response;

/**
Expand Down Expand Up @@ -118,8 +120,8 @@ public function parseBuildMetadata(): void
'build' => 'required',
'stamp' => 'required',
'site' => 'required',
'starttime' => 'required',
'endtime' => 'required',
'starttime' => 'required|integer',
'endtime' => 'required|integer',
'datafilesmd5' => 'required',
]);

Expand Down Expand Up @@ -216,9 +218,11 @@ public function putSubmitFile(): JsonResponse

$db_up = SystemUtils::isDatabaseOnline();
if ($db_up) {
if (!is_numeric($this->buildid) || $this->buildid < 1) {
$buildid = filter_var($this->buildid, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
if ($buildid === false) {
abort(Response::HTTP_NOT_FOUND, 'Build not found');
}
$this->buildid = $buildid;
// Get the relevant build and project.
$this->build = new Build();
$this->build->Id = $this->buildid;
Expand Down Expand Up @@ -352,10 +356,12 @@ public function populateBuildFileRow(): void

public function parseDataFileParameters(): void
{
// The build id is validated later: it is a UUID instead of an integer if the build metadata
// was submitted while the database was unavailable.
$validator = Validator::make(request()->query(), [
'buildid' => 'required',
'type' => 'required',
'md5' => 'required',
'type' => ['required', Rule::enum(UnparsedSubmissionType::class)],
'md5' => ['required', 'regex:/^[a-f0-9]{32}$/i'],
'filename' => 'required',
]);

Expand Down
2 changes: 2 additions & 0 deletions app/cdash/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,8 @@ add_feature_test_in_transaction(/Feature/AutoRemoveBuildsCommand)

add_feature_test_in_transaction(/Feature/Submission/XmlSubmissionTest)

add_feature_test_in_transaction(/Feature/Submission/UnparsedSubmissionTest)

add_feature_test_in_transaction(/Feature/Submission/XmlValidationTest)

add_feature_test_in_transaction(/Feature/Submission/Test/TestXMLTest)
Expand Down
Loading
Loading