Skip to content

Commit 24458ea

Browse files
fix external id not respecting unique during update closes #5549
1 parent ce07836 commit 24458ea

3 files changed

Lines changed: 60 additions & 2 deletions

File tree

app/Http/Controllers/Admin/ServersController.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
use Pterodactyl\Services\Servers\DetailsModificationService;
2626
use Pterodactyl\Services\Servers\StartupModificationService;
2727
use Pterodactyl\Contracts\Repository\NestRepositoryInterface;
28+
use Pterodactyl\Http\Requests\Admin\ServerDetailsFormRequest;
2829
use Pterodactyl\Repositories\Eloquent\DatabaseHostRepository;
2930
use Pterodactyl\Services\Databases\DatabaseManagementService;
3031
use Illuminate\Contracts\Config\Repository as ConfigRepository;
@@ -67,9 +68,9 @@ public function __construct(
6768
* @throws DataValidationException
6869
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
6970
*/
70-
public function setDetails(Request $request, Server $server): RedirectResponse
71+
public function setDetails(ServerDetailsFormRequest $request, Server $server): RedirectResponse
7172
{
72-
$this->detailsModificationService->handle($server, $request->only([
73+
$this->detailsModificationService->handle($server, $request->normalize([
7374
'owner_id', 'external_id', 'name', 'description',
7475
]));
7576

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Requests\Admin;
4+
5+
use Pterodactyl\Models\Server;
6+
use Illuminate\Support\Collection;
7+
8+
class ServerDetailsFormRequest extends AdminFormRequest
9+
{
10+
/**
11+
* Rules to apply to requests for updating a server's details
12+
* in the Admin CP.
13+
*/
14+
public function rules(): array
15+
{
16+
$rules = Collection::make(
17+
Server::getRulesForUpdate($this->route()->parameter('server'))
18+
)->only([
19+
'external_id',
20+
'owner_id',
21+
'name',
22+
'description',
23+
])->toArray();
24+
25+
$rules['description'][] = 'nullable';
26+
27+
return $rules;
28+
}
29+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Pterodactyl\Tests\Integration\Http\Controllers\Admin\ServersController;
4+
5+
use Pterodactyl\Models\User;
6+
use Pterodactyl\Tests\Integration\Http\HttpTestCase;
7+
8+
class UpdateServerDetailsTest extends HttpTestCase
9+
{
10+
public function testExternalIdMustBeUniqueWhenUpdatingServerDetails(): void
11+
{
12+
$server = $this->createServerModel(['external_id' => 'first-external-id']);
13+
$otherServer = $this->createServerModel(['external_id' => 'duplicate-external-id']);
14+
15+
$this->actingAs(User::factory()->admin()->create())
16+
->withHeaders(['Accept' => 'text/html'])
17+
->patch(route('admin.servers.view.details', ['server' => $server]), [
18+
'external_id' => $otherServer->external_id,
19+
'owner_id' => $server->owner_id,
20+
'name' => $server->name,
21+
'description' => $server->description,
22+
])
23+
->assertRedirect()
24+
->assertSessionHasErrors('external_id');
25+
26+
$this->assertSame('first-external-id', $server->refresh()->external_id);
27+
}
28+
}

0 commit comments

Comments
 (0)