Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pterodactyl
GitHub Repository: pterodactyl/panel
Path: blob/1.0-develop/app/Services/Servers/DetailsModificationService.php
10276 views
1
<?php
2
3
namespace Pterodactyl\Services\Servers;
4
5
use Illuminate\Support\Arr;
6
use Pterodactyl\Models\Server;
7
use Illuminate\Database\ConnectionInterface;
8
use Pterodactyl\Traits\Services\ReturnsUpdatedModels;
9
use Pterodactyl\Repositories\Wings\DaemonServerRepository;
10
use Pterodactyl\Repositories\Wings\DaemonRevocationRepository;
11
use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException;
12
13
class DetailsModificationService
14
{
15
use ReturnsUpdatedModels;
16
17
/**
18
* DetailsModificationService constructor.
19
*/
20
public function __construct(
21
private ConnectionInterface $connection,
22
private DaemonServerRepository $serverRepository,
23
private DaemonRevocationRepository $revocationRepository,
24
) {
25
}
26
27
/**
28
* Update the details for a single server instance.
29
*
30
* @throws \Throwable
31
*/
32
public function handle(Server $server, array $data): Server
33
{
34
return $this->connection->transaction(function () use ($data, $server) {
35
$original = $server->user;
36
37
$server->forceFill([
38
'external_id' => Arr::get($data, 'external_id'),
39
'owner_id' => Arr::get($data, 'owner_id'),
40
'name' => Arr::get($data, 'name'),
41
'description' => Arr::get($data, 'description') ?? '',
42
])->saveOrFail();
43
44
// If the owner_id value is changed we need to revoke any tokens that exist for the server
45
// on the Wings instance so that the old owner no longer has any permission to access the
46
// websockets.
47
if (! $server->refresh()->user->is($original)) {
48
try {
49
$this->revocationRepository->setNode($server->node)->deauthorize(
50
$original->uuid,
51
[$server->uuid],
52
);
53
} catch (DaemonConnectionException $exception) {
54
// Do nothing. A failure here is not ideal, but it is likely to be caused by Wings
55
// being offline, or in an entirely broken state. Remember, these tokens reset every
56
// few minutes by default, we're just trying to help it along a little quicker.
57
}
58
}
59
60
return $server;
61
});
62
}
63
}
64
65