Skip to content

Commit 1588236

Browse files
authored
Merge branch 'develop' into update/paper
2 parents 159b977 + f300577 commit 1588236

File tree

88 files changed

+481
-4591
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+481
-4591
lines changed

.env.example

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ HASHIDS_SALT=
1919
HASHIDS_LENGTH=8
2020

2121
MAIL_DRIVER=smtp
22-
MAIL_HOST=mailtrap.io
23-
MAIL_PORT=2525
22+
MAIL_HOST=smtp.example.com
23+
MAIL_PORT=25
2424
MAIL_USERNAME=
2525
MAIL_PASSWORD=
2626
MAIL_ENCRYPTION=tls

.github/ISSUE_TEMPLATE/---bug-report.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ about: For reporting code or design bugs with the software. DO NOT REPORT APACHE
66

77
DO NOT REPORT ISSUES CONFIGURING: SSL, PHP, APACHE, NGINX, YOUR MACHINE, SSH, SFTP, ETC. ON THIS GITHUB TRACKER.
88

9-
For assistance installating this software, as well as debugging issues with dependencies, please use our discord server: https://discord.gg/pterodactyl
9+
For assistance installing this software, as well as debugging issues with dependencies, please use our discord server: https://discord.gg/pterodactyl
1010

1111
You MUST complete all of the below information when reporting a bug, failure to do so will result in closure of your issue. PLEASE stop spamming our tracker with "bugs" that are not related to this project.
1212

app/Console/Kernel.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@ protected function schedule(Schedule $schedule)
2525
// Execute scheduled commands for servers every minute, as if there was a normal cron running.
2626
$schedule->command('p:schedule:process')->everyMinute()->withoutOverlapping();
2727

28-
// Every 30 minutes, run the backup pruning command so that any abandoned backups can be removed
29-
// from the UI view for the server.
30-
$schedule->command('p:maintenance:prune-backups', [
31-
'--since-minutes' => '30',
32-
])->everyThirtyMinutes();
28+
// Every 30 minutes, run the backup pruning command so that any abandoned backups can be deleted.
29+
$pruneAge = config('backups.prune_age', 360); // Defaults to 6 hours (time is in minuteS)
30+
if ($pruneAge > 0) {
31+
$schedule->command('p:maintenance:prune-backups', [
32+
'--since-minutes' => $pruneAge,
33+
])->everyThirtyMinutes();
34+
}
3335

3436
// Every day cleanup any internal backups of service files.
3537
$schedule->command('p:maintenance:clean-service-backups')->daily();

app/Http/Controllers/Admin/Nests/EggController.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,14 @@ public function create(): View
7878
*/
7979
public function store(EggFormRequest $request): RedirectResponse
8080
{
81-
$egg = $this->creationService->handle($request->normalize());
81+
$data = $request->normalize();
82+
if (!empty($data['docker_images']) && !is_array($data['docker_images'])) {
83+
$data['docker_images'] = array_map(function ($value) {
84+
return trim($value);
85+
}, explode("\n", $data['docker_images']));
86+
}
87+
88+
$egg = $this->creationService->handle($data);
8289
$this->alert->success(trans('admin/nests.eggs.notices.egg_created'))->flash();
8390

8491
return redirect()->route('admin.nests.egg.view', $egg->id);
@@ -108,7 +115,14 @@ public function view(Egg $egg): View
108115
*/
109116
public function update(EggFormRequest $request, Egg $egg): RedirectResponse
110117
{
111-
$this->updateService->handle($egg, $request->normalize());
118+
$data = $request->normalize();
119+
if (!empty($data['docker_images']) && !is_array($data['docker_images'])) {
120+
$data['docker_images'] = array_map(function ($value) {
121+
return trim($value);
122+
}, explode("\n", $data['docker_images']));
123+
}
124+
125+
$this->updateService->handle($egg, $data);
112126
$this->alert->success(trans('admin/nests.eggs.notices.updated'))->flash();
113127

114128
return redirect()->route('admin.nests.egg.view', $egg->id);

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,17 +111,19 @@ public function index()
111111
*
112112
* @throws \Illuminate\Validation\ValidationException
113113
* @throws \Pterodactyl\Exceptions\DisplayException
114-
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
115-
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
116114
* @throws \Pterodactyl\Exceptions\Service\Deployment\NoViableAllocationException
117115
* @throws \Pterodactyl\Exceptions\Service\Deployment\NoViableNodeException
118116
* @throws \Throwable
119117
*/
120118
public function store(ServerFormRequest $request)
121119
{
122-
$server = $this->creationService->handle(
123-
$request->except(['_token'])
124-
);
120+
$data = $request->except(['_token']);
121+
if (!empty($data['custom_image'])) {
122+
$data['image'] = $data['custom_image'];
123+
unset($data['custom_image']);
124+
}
125+
126+
$server = $this->creationService->handle($data);
125127

126128
$this->alert->success(
127129
trans('admin/server.alerts.server_created')

app/Http/Controllers/Admin/ServersController.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,14 +334,19 @@ public function delete(Request $request, Server $server)
334334
* @return \Illuminate\Http\RedirectResponse
335335
*
336336
* @throws \Illuminate\Validation\ValidationException
337-
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
338337
*/
339338
public function saveStartup(Request $request, Server $server)
340339
{
340+
$data = $request->except('_token');
341+
if (!empty($data['custom_docker_image'])) {
342+
$data['docker_image'] = $data['custom_docker_image'];
343+
unset($data['custom_docker_image']);
344+
}
345+
341346
try {
342347
$this->startupModificationService
343348
->setUserLevel(User::USER_LEVEL_ADMIN)
344-
->handle($server, $request->except('_token'));
349+
->handle($server, $data);
345350
} catch (DataValidationException $exception) {
346351
throw new ValidationException($exception->validator);
347352
}

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Pterodactyl\Transformers\Daemon\FileObjectTransformer;
1414
use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;
1515
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\CopyFileRequest;
16+
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\PullFileRequest;
1617
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\ListFilesRequest;
1718
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\DeleteFileRequest;
1819
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\RenameFileRequest;
@@ -72,7 +73,7 @@ public function directory(ListFilesRequest $request, Server $server): array
7273
{
7374
$contents = $this->fileRepository
7475
->setServer($server)
75-
->getDirectory($this->encode($request->get('directory') ?? '/'));
76+
->getDirectory($request->get('directory') ?? '/');
7677

7778
return $this->fractal->collection($contents)
7879
->transformWith($this->getTransformer(FileObjectTransformer::class))
@@ -93,7 +94,7 @@ public function contents(GetFileContentsRequest $request, Server $server): Respo
9394
{
9495
return new Response(
9596
$this->fileRepository->setServer($server)->getContent(
96-
$this->encode($request->get('file')), config('pterodactyl.files.max_edit_size')
97+
$request->get('file'), config('pterodactyl.files.max_edit_size')
9798
),
9899
Response::HTTP_OK,
99100
['Content-Type' => 'text/plain']
@@ -143,10 +144,7 @@ public function download(GetFileContentsRequest $request, Server $server)
143144
*/
144145
public function write(WriteFileContentRequest $request, Server $server): JsonResponse
145146
{
146-
$this->fileRepository->setServer($server)->putContent(
147-
$this->encode($request->get('file')),
148-
$request->getContent()
149-
);
147+
$this->fileRepository->setServer($server)->putContent($request->get('file'), $request->getContent());
150148

151149
return new JsonResponse([], Response::HTTP_NO_CONTENT);
152150
}
@@ -284,16 +282,18 @@ public function chmod(ChmodFilesRequest $request, Server $server): JsonResponse
284282
}
285283

286284
/**
287-
* Encodes a given file name & path in a format that should work for a good majority
288-
* of file names without too much confusing logic.
285+
* Requests that a file be downloaded from a remote location by Wings.
286+
*
287+
* @param $request
288+
* @param \Pterodactyl\Models\Server $server
289+
* @return \Illuminate\Http\JsonResponse
289290
*
290-
* @param string $path
291-
* @return string
291+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
292292
*/
293-
private function encode(string $path): string
293+
public function pull(PullFileRequest $request, Server $server): JsonResponse
294294
{
295-
return Collection::make(explode('/', rawurldecode($path)))->map(function ($value) {
296-
return rawurlencode($value);
297-
})->join('/');
295+
$this->fileRepository->setServer($server)->pull($request->input('url'), $request->input('directory'));
296+
297+
return new JsonResponse([], Response::HTTP_NO_CONTENT);
298298
}
299299
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
namespace Pterodactyl\Http\Controllers\Api\Client\Servers;
44

5+
use Illuminate\Http\Request;
56
use Illuminate\Http\Response;
67
use Pterodactyl\Models\Server;
78
use Illuminate\Http\JsonResponse;
89
use Pterodactyl\Repositories\Eloquent\ServerRepository;
910
use Pterodactyl\Services\Servers\ReinstallServerService;
1011
use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;
12+
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
1113
use Pterodactyl\Http\Requests\Api\Client\Servers\Settings\RenameServerRequest;
14+
use Pterodactyl\Http\Requests\Api\Client\Servers\Settings\SetDockerImageRequest;
1215
use Pterodactyl\Http\Requests\Api\Client\Servers\Settings\ReinstallServerRequest;
1316

1417
class SettingsController extends ClientApiController
@@ -73,4 +76,26 @@ public function reinstall(ReinstallServerRequest $request, Server $server)
7376

7477
return new JsonResponse([], Response::HTTP_ACCEPTED);
7578
}
79+
80+
/**
81+
* Changes the Docker image in use by the server.
82+
*
83+
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Settings\SetDockerImageRequest $request
84+
* @param \Pterodactyl\Models\Server $server
85+
* @return \Illuminate\Http\JsonResponse
86+
*
87+
* @throws \Throwable
88+
*/
89+
public function dockerImage(SetDockerImageRequest $request, Server $server)
90+
{
91+
if (!in_array($server->image, $server->egg->docker_images)) {
92+
throw new BadRequestHttpException(
93+
'This server\'s Docker image has been manually set by an administrator and cannot be updated.'
94+
);
95+
}
96+
97+
$server->forceFill(['image' => $request->input('docker_image')])->saveOrFail();
98+
99+
return new JsonResponse([], Response::HTTP_NO_CONTENT);
100+
}
76101
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public function index(GetStartupRequest $request, Server $server)
6262
->transformWith($this->getTransformer(EggVariableTransformer::class))
6363
->addMeta([
6464
'startup_command' => $startup,
65+
'docker_images' => $server->egg->docker_images,
6566
'raw_startup_command' => $server->startup,
6667
])
6768
->toArray();

app/Http/Controllers/Api/Remote/Backups/BackupRemoteUploadController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function __construct(BackupRepository $repository, BackupManager $backupM
5252
public function __invoke(Request $request, string $backup)
5353
{
5454
// Get the size query parameter.
55-
$size = (int)$request->query('size');
55+
$size = (int) $request->query('size');
5656
if (empty($size)) {
5757
throw new BadRequestHttpException('A non-empty "size" query parameter must be provided.');
5858
}

0 commit comments

Comments
 (0)