Skip to content

Commit af360d4

Browse files
committed
Merge branch 'develop' of https://github.com/Pterodactyl/Panel into develop
2 parents a8d9ecc + a06f8e0 commit af360d4

File tree

19 files changed

+287
-58
lines changed

19 files changed

+287
-58
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ This file is a running track of new features and fixes to each version of the pa
33

44
This project follows [Semantic Versioning](http://semver.org) guidelines.
55

6+
## Unreleased
7+
### Fixed
8+
* Fixes the application API unable to return server's variables.
9+
610
## v1.1.3
711
### Fixed
812
* Server bulk power actions command will no longer attempt to run commands against installing or suspended servers.

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\ListFilesRequest;
1717
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\DeleteFileRequest;
1818
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\RenameFileRequest;
19+
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\ChmodFilesRequest;
1920
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\CreateFolderRequest;
2021
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\CompressFilesRequest;
2122
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\DecompressFilesRequest;
@@ -263,6 +264,25 @@ public function delete(DeleteFileRequest $request, Server $server): JsonResponse
263264
return new JsonResponse([], Response::HTTP_NO_CONTENT);
264265
}
265266

267+
/**
268+
* Updates file permissions for file(s) in the given root directory.
269+
*
270+
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Files\ChmodFilesRequest $request
271+
* @param \Pterodactyl\Models\Server $server
272+
* @return \Illuminate\Http\JsonResponse
273+
*
274+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
275+
*/
276+
public function chmod(ChmodFilesRequest $request, Server $server): JsonResponse
277+
{
278+
$this->fileRepository->setServer($server)
279+
->chmodFiles(
280+
$request->input('root'), $request->input('files')
281+
);
282+
283+
return new JsonResponse([], Response::HTTP_NO_CONTENT);
284+
}
285+
266286
/**
267287
* Encodes a given file name & path in a format that should work for a good majority
268288
* of file names without too much confusing logic.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Requests\Api\Client\Servers\Files;
4+
5+
use Pterodactyl\Models\Permission;
6+
use Pterodactyl\Contracts\Http\ClientPermissionsRequest;
7+
use Pterodactyl\Http\Requests\Api\Client\ClientApiRequest;
8+
9+
class ChmodFilesRequest extends ClientApiRequest implements ClientPermissionsRequest
10+
{
11+
/**
12+
* @return string
13+
*/
14+
public function permission(): string
15+
{
16+
return Permission::ACTION_FILE_UPDATE;
17+
}
18+
19+
/**
20+
* @return array
21+
*/
22+
public function rules(): array
23+
{
24+
return [
25+
'root' => 'required|nullable|string',
26+
'files' => 'required|array',
27+
'files.*.file' => 'required|string',
28+
'files.*.mode' => 'required|numeric',
29+
];
30+
}
31+
}

app/Repositories/Wings/DaemonFileRepository.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,4 +269,32 @@ public function decompressFile(?string $root, string $file): ResponseInterface
269269
throw new DaemonConnectionException($exception);
270270
}
271271
}
272+
273+
/**
274+
* Chmods the given files.
275+
*
276+
* @param string|null $root
277+
* @param array $files
278+
* @return \Psr\Http\Message\ResponseInterface
279+
*
280+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
281+
*/
282+
public function chmodFiles(?string $root, array $files): ResponseInterface
283+
{
284+
Assert::isInstanceOf($this->server, Server::class);
285+
286+
try {
287+
return $this->getHttpClient()->post(
288+
sprintf('/api/servers/%s/files/chmod', $this->server->uuid),
289+
[
290+
'json' => [
291+
'root' => $root ?? '/',
292+
'files' => $files,
293+
],
294+
]
295+
);
296+
} catch (TransferException $exception) {
297+
throw new DaemonConnectionException($exception);
298+
}
299+
}
272300
}

app/Transformers/Api/Application/ServerVariableTransformer.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Pterodactyl\Transformers\Api\Application;
44

5-
use Pterodactyl\Models\ServerVariable;
5+
use Pterodactyl\Models\EggVariable;
66
use Pterodactyl\Services\Acl\Api\AdminAcl;
77

88
class ServerVariableTransformer extends BaseTransformer
@@ -27,22 +27,22 @@ public function getResourceName(): string
2727
/**
2828
* Return a generic transformed server variable array.
2929
*
30-
* @param \Pterodactyl\Models\ServerVariable $variable
30+
* @param \Pterodactyl\Models\EggVariable $variable
3131
* @return array
3232
*/
33-
public function transform(ServerVariable $variable)
33+
public function transform(EggVariable $variable)
3434
{
3535
return $variable->toArray();
3636
}
3737

3838
/**
3939
* Return the parent service variable data.
4040
*
41-
* @param \Pterodactyl\Models\ServerVariable $variable
41+
* @param \Pterodactyl\Models\EggVariable $variable
4242
* @return \League\Fractal\Resource\Item|\League\Fractal\Resource\NullResource
4343
* @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException
4444
*/
45-
public function includeParent(ServerVariable $variable)
45+
public function includeParent(EggVariable $variable)
4646
{
4747
if (! $this->authorize(AdminAcl::RESOURCE_EGGS)) {
4848
return $this->null();

app/Transformers/Daemon/FileObjectTransformer.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public function transform(array $item)
2525
return [
2626
'name' => Arr::get($item, 'name'),
2727
'mode' => Arr::get($item, 'mode'),
28+
'mode_bits' => Arr::get($item, 'mode_bits'),
2829
'size' => Arr::get($item, 'size'),
2930
'is_file' => Arr::get($item, 'file', true),
3031
'is_symlink' => Arr::get($item, 'symlink', false),
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import http from '@/api/http';
2+
3+
interface Data {
4+
file: string;
5+
mode: string;
6+
}
7+
8+
export default (uuid: string, directory: string, files: Data[]): Promise<void> => {
9+
return new Promise((resolve, reject) => {
10+
http.post(`/api/client/servers/${uuid}/files/chmod`, { root: directory, files })
11+
.then(() => resolve())
12+
.catch(reject);
13+
});
14+
};

resources/scripts/api/server/files/loadDirectory.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface FileObject {
55
key: string;
66
name: string;
77
mode: string;
8+
modeBits: string,
89
size: number;
910
isFile: boolean;
1011
isSymlink: boolean;

resources/scripts/api/transformers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const rawDataToFileObject = (data: FractalResponseData): FileObject => ({
1616
key: `${data.attributes.is_file ? 'file' : 'dir'}_${data.attributes.name}`,
1717
name: data.attributes.name,
1818
mode: data.attributes.mode,
19+
modeBits: data.attributes.mode_bits,
1920
size: Number(data.attributes.size),
2021
isFile: data.attributes.is_file,
2122
isSymlink: data.attributes.is_symlink,

resources/scripts/components/elements/SubNavigation.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,24 @@ import config from '../../../../tailwind.config';
55

66
const SubNavigation = styled.div`
77
${tw`w-full bg-neutral-700 shadow overflow-x-auto`};
8-
8+
99
& > div {
1010
${tw`flex items-center text-sm mx-auto px-2`};
1111
max-width: 1200px;
12-
12+
1313
& > a, & > div {
1414
${tw`inline-block py-3 px-4 text-neutral-300 no-underline whitespace-no-wrap transition-all duration-150`};
15-
15+
1616
&:not(:first-of-type) {
1717
${tw`ml-2`};
1818
}
19-
20-
&:active, &:hover {
19+
20+
&:hover {
2121
${tw`text-neutral-100`};
2222
}
23-
24-
&:active, &:hover, &.active {
23+
24+
&:active, &.active {
25+
${tw`text-neutral-100`};
2526
box-shadow: inset 0 -2px ${config.theme.colors.cyan['500']};
2627
}
2728
}

0 commit comments

Comments
 (0)