Skip to content

Commit 179770d

Browse files
authored
fix(validation): add input validation for server advanced settings page (#9242)
2 parents 0b9d2c9 + 791aa10 commit 179770d

File tree

3 files changed

+36
-9
lines changed

3 files changed

+36
-9
lines changed

app/Http/Controllers/Api/ServersController.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,11 @@ public function create_server(Request $request)
598598
'is_build_server' => ['type' => 'boolean', 'description' => 'Is build server.'],
599599
'instant_validate' => ['type' => 'boolean', 'description' => 'Instant validate.'],
600600
'proxy_type' => ['type' => 'string', 'enum' => ['traefik', 'caddy', 'none'], 'description' => 'The proxy type.'],
601+
'concurrent_builds' => ['type' => 'integer', 'description' => 'Number of concurrent builds.'],
602+
'dynamic_timeout' => ['type' => 'integer', 'description' => 'Deployment timeout in seconds.'],
603+
'deployment_queue_limit' => ['type' => 'integer', 'description' => 'Maximum number of queued deployments.'],
604+
'server_disk_usage_notification_threshold' => ['type' => 'integer', 'description' => 'Server disk usage notification threshold (%).'],
605+
'server_disk_usage_check_frequency' => ['type' => 'string', 'description' => 'Cron expression for disk usage check frequency.'],
601606
],
602607
),
603608
),
@@ -634,7 +639,7 @@ public function create_server(Request $request)
634639
)]
635640
public function update_server(Request $request)
636641
{
637-
$allowedFields = ['name', 'description', 'ip', 'port', 'user', 'private_key_uuid', 'is_build_server', 'instant_validate', 'proxy_type'];
642+
$allowedFields = ['name', 'description', 'ip', 'port', 'user', 'private_key_uuid', 'is_build_server', 'instant_validate', 'proxy_type', 'concurrent_builds', 'dynamic_timeout', 'deployment_queue_limit', 'server_disk_usage_notification_threshold', 'server_disk_usage_check_frequency'];
638643

639644
$teamId = getTeamIdFromToken();
640645
if (is_null($teamId)) {
@@ -655,6 +660,11 @@ public function update_server(Request $request)
655660
'is_build_server' => 'boolean|nullable',
656661
'instant_validate' => 'boolean|nullable',
657662
'proxy_type' => 'string|nullable',
663+
'concurrent_builds' => 'integer|min:1',
664+
'dynamic_timeout' => 'integer|min:1',
665+
'deployment_queue_limit' => 'integer|min:1',
666+
'server_disk_usage_notification_threshold' => 'integer|min:1|max:100',
667+
'server_disk_usage_check_frequency' => 'string',
658668
]);
659669

660670
$extraFields = array_diff(array_keys($request->all()), $allowedFields);
@@ -691,6 +701,19 @@ public function update_server(Request $request)
691701
'is_build_server' => $request->is_build_server,
692702
]);
693703
}
704+
705+
if ($request->has('server_disk_usage_check_frequency') && ! validate_cron_expression($request->server_disk_usage_check_frequency)) {
706+
return response()->json([
707+
'message' => 'Validation failed.',
708+
'errors' => ['server_disk_usage_check_frequency' => ['Invalid Cron / Human expression for Disk Usage Check Frequency.']],
709+
], 422);
710+
}
711+
712+
$advancedSettings = $request->only(['concurrent_builds', 'dynamic_timeout', 'deployment_queue_limit', 'server_disk_usage_notification_threshold', 'server_disk_usage_check_frequency']);
713+
if (! empty($advancedSettings)) {
714+
$server->settings()->update(array_filter($advancedSettings, fn ($value) => ! is_null($value)));
715+
}
716+
694717
if ($request->instant_validate) {
695718
ValidateServer::dispatch($server);
696719
}

app/Livewire/Server/Advanced.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@ class Advanced extends Component
1515
#[Validate(['string'])]
1616
public string $serverDiskUsageCheckFrequency = '0 23 * * *';
1717

18-
#[Validate(['integer', 'min:1', 'max:99'])]
19-
public int $serverDiskUsageNotificationThreshold = 50;
18+
#[Validate(['required', 'integer', 'min:1', 'max:99'])]
19+
public int|string $serverDiskUsageNotificationThreshold = 50;
2020

21-
#[Validate(['integer', 'min:1'])]
22-
public int $concurrentBuilds = 1;
21+
#[Validate(['required', 'integer', 'min:1'])]
22+
public int|string $concurrentBuilds = 1;
2323

24-
#[Validate(['integer', 'min:1'])]
25-
public int $dynamicTimeout = 1;
24+
#[Validate(['required', 'integer', 'min:1'])]
25+
public int|string $dynamicTimeout = 1;
2626

27-
#[Validate(['integer', 'min:1'])]
28-
public int $deploymentQueueLimit = 25;
27+
#[Validate(['required', 'integer', 'min:1'])]
28+
public int|string $deploymentQueueLimit = 25;
2929

3030
public function mount(string $server_uuid)
3131
{

resources/views/livewire/server/advanced.blade.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
id="serverDiskUsageCheckFrequency" label="Disk usage check frequency" required
2323
helper="Cron expression for disk usage check frequency.<br>You can use every_minute, hourly, daily, weekly, monthly, yearly.<br><br>Default is every night at 11:00 PM." />
2424
<x-forms.input canGate="update" :canResource="$server" id="serverDiskUsageNotificationThreshold"
25+
type="number" min="1" max="99"
2526
label="Server disk usage notification threshold (%)" required
2627
helper="If the server disk usage exceeds this threshold, Coolify will send a notification to the team members." />
2728
</div>
@@ -31,12 +32,15 @@
3132
<h3>Builds</h3>
3233
<div class="flex flex-wrap gap-2 sm:flex-nowrap pt-4">
3334
<x-forms.input canGate="update" :canResource="$server" id="concurrentBuilds"
35+
type="number" min="1"
3436
label="Number of concurrent builds" required
3537
helper="You can specify the number of simultaneous build processes/deployments that should run concurrently." />
3638
<x-forms.input canGate="update" :canResource="$server" id="dynamicTimeout"
39+
type="number" min="1"
3740
label="Deployment timeout (seconds)" required
3841
helper="You can define the maximum duration for a deployment to run before timing it out." />
3942
<x-forms.input canGate="update" :canResource="$server" id="deploymentQueueLimit"
43+
type="number" min="1"
4044
label="Deployment queue limit" required
4145
helper="Maximum number of queued deployments allowed. New deployments will be rejected with a 429 status when the limit is reached." />
4246
</div>

0 commit comments

Comments
 (0)