Skip to content

Commit 70afc51

Browse files
authored
Merge pull request pterodactyl#2883 from pterodactyl/matthewpi/transfer-improvements
Add Transfer Logs
2 parents 4f23d1a + 2d081e5 commit 70afc51

31 files changed

+577
-244
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Pterodactyl\Exceptions\Http\Server;
4+
5+
use Illuminate\Http\Response;
6+
use Symfony\Component\HttpKernel\Exception\HttpException;
7+
8+
class ServerTransferringException extends HttpException
9+
{
10+
/**
11+
* ServerTransferringException constructor.
12+
*/
13+
public function __construct()
14+
{
15+
parent::__construct(Response::HTTP_CONFLICT, 'This server is currently being transferred to a new machine, please try again laster.');
16+
}
17+
}

app/Http/Controllers/Admin/Servers/ServerTransferController.php

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Pterodactyl\Models\ServerTransfer;
99
use Pterodactyl\Http\Controllers\Controller;
1010
use Pterodactyl\Services\Servers\TransferService;
11-
use Pterodactyl\Services\Servers\SuspensionService;
1211
use Pterodactyl\Repositories\Eloquent\NodeRepository;
1312
use Pterodactyl\Repositories\Eloquent\ServerRepository;
1413
use Pterodactyl\Repositories\Eloquent\LocationRepository;
@@ -42,11 +41,6 @@ class ServerTransferController extends Controller
4241
*/
4342
private $nodeRepository;
4443

45-
/**
46-
* @var \Pterodactyl\Services\Servers\SuspensionService
47-
*/
48-
private $suspensionService;
49-
5044
/**
5145
* @var \Pterodactyl\Services\Servers\TransferService
5246
*/
@@ -65,7 +59,6 @@ class ServerTransferController extends Controller
6559
* @param \Pterodactyl\Repositories\Eloquent\ServerRepository $repository
6660
* @param \Pterodactyl\Repositories\Eloquent\LocationRepository $locationRepository
6761
* @param \Pterodactyl\Repositories\Eloquent\NodeRepository $nodeRepository
68-
* @param \Pterodactyl\Services\Servers\SuspensionService $suspensionService
6962
* @param \Pterodactyl\Services\Servers\TransferService $transferService
7063
* @param \Pterodactyl\Repositories\Wings\DaemonConfigurationRepository $daemonConfigurationRepository
7164
*/
@@ -75,7 +68,6 @@ public function __construct(
7568
ServerRepository $repository,
7669
LocationRepository $locationRepository,
7770
NodeRepository $nodeRepository,
78-
SuspensionService $suspensionService,
7971
TransferService $transferService,
8072
DaemonConfigurationRepository $daemonConfigurationRepository
8173
) {
@@ -84,7 +76,6 @@ public function __construct(
8476
$this->repository = $repository;
8577
$this->locationRepository = $locationRepository;
8678
$this->nodeRepository = $nodeRepository;
87-
$this->suspensionService = $suspensionService;
8879
$this->transferService = $transferService;
8980
$this->daemonConfigurationRepository = $daemonConfigurationRepository;
9081
}
@@ -98,8 +89,7 @@ public function __construct(
9889
*
9990
* @throws \Throwable
10091
*/
101-
public function transfer(Request $request, Server $server)
102-
{
92+
public function transfer(Request $request, Server $server) {
10393
$validatedData = $request->validate([
10494
'node_id' => 'required|exists:nodes,id',
10595
'allocation_id' => 'required|bail|unique:servers|exists:allocations,id',
@@ -116,9 +106,6 @@ public function transfer(Request $request, Server $server)
116106
// Check if the selected daemon is online.
117107
$this->daemonConfigurationRepository->setNode($node)->getSystemInformation();
118108

119-
// Suspend the server and request an archive to be created.
120-
$this->suspensionService->toggle($server, 'suspend');
121-
122109
// Create a new ServerTransfer entry.
123110
$transfer = new ServerTransfer;
124111

@@ -127,8 +114,8 @@ public function transfer(Request $request, Server $server)
127114
$transfer->new_node = $node_id;
128115
$transfer->old_allocation = $server->allocation_id;
129116
$transfer->new_allocation = $allocation_id;
130-
$transfer->old_additional_allocations = json_encode($server->allocations->where('id', '!=', $server->allocation_id)->pluck('id'));
131-
$transfer->new_additional_allocations = json_encode($additional_allocations);
117+
$transfer->old_additional_allocations = $server->allocations->where('id', '!=', $server->allocation_id)->pluck('id');
118+
$transfer->new_additional_allocations = $additional_allocations;
132119

133120
$transfer->save();
134121

app/Http/Controllers/Api/Client/Servers/WebsocketController.php

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
namespace Pterodactyl\Http\Controllers\Api\Client\Servers;
44

55
use Carbon\CarbonImmutable;
6-
use Illuminate\Http\Response;
76
use Pterodactyl\Models\Server;
87
use Illuminate\Http\JsonResponse;
98
use Pterodactyl\Models\Permission;
109
use Pterodactyl\Services\Nodes\NodeJWTService;
11-
use Symfony\Component\HttpKernel\Exception\HttpException;
10+
use Pterodactyl\Exceptions\Http\HttpForbiddenException;
1211
use Pterodactyl\Http\Requests\Api\Client\ClientApiRequest;
1312
use Pterodactyl\Services\Servers\GetUserPermissionsService;
1413
use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;
@@ -55,19 +54,34 @@ public function __invoke(ClientApiRequest $request, Server $server)
5554
{
5655
$user = $request->user();
5756
if ($user->cannot(Permission::ACTION_WEBSOCKET_CONNECT, $server)) {
58-
throw new HttpException(Response::HTTP_FORBIDDEN, 'You do not have permission to connect to this server\'s websocket.');
57+
throw new HttpForbiddenException('You do not have permission to connect to this server\'s websocket.');
58+
}
59+
60+
$permissions = $this->permissionsService->handle($server, $user);
61+
62+
$node = $server->node;
63+
if (! is_null($server->transfer)) {
64+
// Check if the user has permissions to receive transfer logs.
65+
if (! in_array('admin.websocket.transfer', $permissions)) {
66+
throw new HttpForbiddenException('You do not have permission to view server transfer logs.');
67+
}
68+
69+
// Redirect the websocket request to the new node if the server has been archived.
70+
if ($server->transfer->archived) {
71+
$node = $server->transfer->newNode;
72+
}
5973
}
6074

6175
$token = $this->jwtService
6276
->setExpiresAt(CarbonImmutable::now()->addMinutes(10))
6377
->setClaims([
6478
'user_id' => $request->user()->id,
6579
'server_uuid' => $server->uuid,
66-
'permissions' => $this->permissionsService->handle($server, $user),
80+
'permissions' => $permissions,
6781
])
68-
->handle($server->node, $user->id . $server->uuid);
82+
->handle($node, $user->id . $server->uuid);
6983

70-
$socket = str_replace(['https://', 'http://'], ['wss://', 'ws://'], $server->node->getConnectionAddress());
84+
$socket = str_replace(['https://', 'http://'], ['wss://', 'ws://'], $node->getConnectionAddress());
7185

7286
return new JsonResponse([
7387
'data' => [

0 commit comments

Comments
 (0)