Merge remote-tracking branch 'origin/next' into fix/application-image-validation
This commit is contained in:
commit
507ecfdf54
4 changed files with 50 additions and 3 deletions
|
|
@ -5,6 +5,7 @@
|
||||||
use App\Actions\Application\GenerateConfig;
|
use App\Actions\Application\GenerateConfig;
|
||||||
use App\Jobs\ApplicationDeploymentJob;
|
use App\Jobs\ApplicationDeploymentJob;
|
||||||
use App\Models\Application;
|
use App\Models\Application;
|
||||||
|
use App\Rules\ValidGitBranch;
|
||||||
use App\Support\ValidationPatterns;
|
use App\Support\ValidationPatterns;
|
||||||
use Illuminate\Auth\Access\AuthorizationException;
|
use Illuminate\Auth\Access\AuthorizationException;
|
||||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||||
|
|
@ -144,7 +145,7 @@ protected function rules(): array
|
||||||
'description' => ValidationPatterns::descriptionRules(),
|
'description' => ValidationPatterns::descriptionRules(),
|
||||||
'fqdn' => 'nullable',
|
'fqdn' => 'nullable',
|
||||||
'gitRepository' => 'required',
|
'gitRepository' => 'required',
|
||||||
'gitBranch' => 'required',
|
'gitBranch' => ['required', 'string', new ValidGitBranch],
|
||||||
'gitCommitSha' => ['nullable', 'string', 'regex:/^[a-zA-Z0-9][a-zA-Z0-9._\-\/]*$/'],
|
'gitCommitSha' => ['nullable', 'string', 'regex:/^[a-zA-Z0-9][a-zA-Z0-9._\-\/]*$/'],
|
||||||
'installCommand' => ValidationPatterns::shellSafeCommandRules(),
|
'installCommand' => ValidationPatterns::shellSafeCommandRules(),
|
||||||
'buildCommand' => ValidationPatterns::shellSafeCommandRules(),
|
'buildCommand' => ValidationPatterns::shellSafeCommandRules(),
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
use App\Models\GithubApp;
|
use App\Models\GithubApp;
|
||||||
use App\Models\GitlabApp;
|
use App\Models\GitlabApp;
|
||||||
use App\Models\PrivateKey;
|
use App\Models\PrivateKey;
|
||||||
|
use App\Rules\ValidGitBranch;
|
||||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||||
use Livewire\Attributes\Locked;
|
use Livewire\Attributes\Locked;
|
||||||
use Livewire\Attributes\Validate;
|
use Livewire\Attributes\Validate;
|
||||||
|
|
@ -29,7 +30,7 @@ class Source extends Component
|
||||||
#[Validate(['required', 'string'])]
|
#[Validate(['required', 'string'])]
|
||||||
public string $gitRepository;
|
public string $gitRepository;
|
||||||
|
|
||||||
#[Validate(['required', 'string'])]
|
#[Validate(['required', 'string', new ValidGitBranch])]
|
||||||
public string $gitBranch;
|
public string $gitBranch;
|
||||||
|
|
||||||
#[Validate(['nullable', 'string', 'regex:/^[a-zA-Z0-9][a-zA-Z0-9._\-\/]*$/'])]
|
#[Validate(['nullable', 'string', 'regex:/^[a-zA-Z0-9][a-zA-Z0-9._\-\/]*$/'])]
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
use App\Enums\BuildPackTypes;
|
use App\Enums\BuildPackTypes;
|
||||||
use App\Enums\RedirectTypes;
|
use App\Enums\RedirectTypes;
|
||||||
use App\Enums\StaticImageTypes;
|
use App\Enums\StaticImageTypes;
|
||||||
|
use App\Rules\ValidGitBranch;
|
||||||
use App\Support\ValidationPatterns;
|
use App\Support\ValidationPatterns;
|
||||||
use Illuminate\Database\Eloquent\Collection;
|
use Illuminate\Database\Eloquent\Collection;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
|
@ -90,7 +91,7 @@ function sharedDataApplications()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'git_repository' => 'string',
|
'git_repository' => 'string',
|
||||||
'git_branch' => 'string',
|
'git_branch' => ['string', new ValidGitBranch],
|
||||||
'build_pack' => Rule::enum(BuildPackTypes::class),
|
'build_pack' => Rule::enum(BuildPackTypes::class),
|
||||||
'is_static' => 'boolean',
|
'is_static' => 'boolean',
|
||||||
'is_spa' => 'boolean',
|
'is_spa' => 'boolean',
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use App\Jobs\ApplicationDeploymentJob;
|
use App\Jobs\ApplicationDeploymentJob;
|
||||||
|
use App\Rules\ValidGitBranch;
|
||||||
use App\Support\ValidationPatterns;
|
use App\Support\ValidationPatterns;
|
||||||
|
|
||||||
describe('deployment job path field validation', function () {
|
describe('deployment job path field validation', function () {
|
||||||
|
|
@ -978,3 +979,46 @@
|
||||||
expect($merged['start_command'])->toContain('regex:'.ValidationPatterns::SHELL_SAFE_COMMAND_PATTERN);
|
expect($merged['start_command'])->toContain('regex:'.ValidationPatterns::SHELL_SAFE_COMMAND_PATTERN);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('git_branch validation rules survive array_merge in controller', function () {
|
||||||
|
test('git_branch uses ValidGitBranch in shared application rules', function () {
|
||||||
|
$rules = sharedDataApplications();
|
||||||
|
|
||||||
|
expect($rules['git_branch'])->toBeArray();
|
||||||
|
expect(collect($rules['git_branch'])->contains(fn ($rule) => $rule instanceof ValidGitBranch))->toBeTrue();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('git_branch rejects shell metacharacter payloads', function (string $payload) {
|
||||||
|
$rules = sharedDataApplications();
|
||||||
|
|
||||||
|
$validator = validator(
|
||||||
|
['git_branch' => $payload],
|
||||||
|
['git_branch' => $rules['git_branch']]
|
||||||
|
);
|
||||||
|
|
||||||
|
expect($validator->fails())->toBeTrue();
|
||||||
|
})->with([
|
||||||
|
'semicolon command separator' => 'main;touch /tmp/pwned;#',
|
||||||
|
'command substitution' => 'main$(touch /tmp/pwned)',
|
||||||
|
'backtick substitution' => 'main`touch /tmp/pwned`',
|
||||||
|
'pipe operator' => 'main|id',
|
||||||
|
'newline injection' => "main\ntouch /tmp/pwned",
|
||||||
|
'redirect operator' => 'main>/tmp/pwned',
|
||||||
|
'single quote breakout' => "main';id;#",
|
||||||
|
]);
|
||||||
|
|
||||||
|
test('git_branch accepts safe branch names', function (string $branch) {
|
||||||
|
$rules = sharedDataApplications();
|
||||||
|
|
||||||
|
$validator = validator(
|
||||||
|
['git_branch' => $branch],
|
||||||
|
['git_branch' => $rules['git_branch']]
|
||||||
|
);
|
||||||
|
|
||||||
|
expect($validator->fails())->toBeFalse();
|
||||||
|
})->with([
|
||||||
|
'main',
|
||||||
|
'feature/my-branch',
|
||||||
|
'release_1.2.3',
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue