|
2 | 2 |
|
3 | 3 | namespace Pterodactyl\Http\Controllers\Api\Client\Servers; |
4 | 4 |
|
5 | | -use Carbon\Carbon; |
6 | | -use Ramsey\Uuid\Uuid; |
7 | 5 | use Illuminate\Http\Response; |
8 | 6 | use Pterodactyl\Models\Server; |
9 | | -use Illuminate\Http\JsonResponse; |
10 | 7 | use GuzzleHttp\Exception\TransferException; |
| 8 | +use Illuminate\Contracts\Routing\ResponseFactory; |
11 | 9 | use Pterodactyl\Repositories\Wings\DaemonFileRepository; |
12 | 10 | use Pterodactyl\Transformers\Daemon\FileObjectTransformer; |
13 | | -use Illuminate\Contracts\Cache\Repository as CacheRepository; |
14 | 11 | use Pterodactyl\Http\Controllers\Api\Client\ClientApiController; |
15 | 12 | use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException; |
16 | 13 | use Pterodactyl\Http\Requests\Api\Client\Servers\Files\CopyFileRequest; |
17 | 14 | use Pterodactyl\Http\Requests\Api\Client\Servers\Files\ListFilesRequest; |
18 | 15 | use Pterodactyl\Http\Requests\Api\Client\Servers\Files\DeleteFileRequest; |
19 | 16 | use Pterodactyl\Http\Requests\Api\Client\Servers\Files\RenameFileRequest; |
20 | 17 | use Pterodactyl\Http\Requests\Api\Client\Servers\Files\CreateFolderRequest; |
21 | | -use Pterodactyl\Http\Requests\Api\Client\Servers\Files\DownloadFileRequest; |
22 | 18 | use Pterodactyl\Http\Requests\Api\Client\Servers\Files\GetFileContentsRequest; |
23 | 19 | use Pterodactyl\Http\Requests\Api\Client\Servers\Files\WriteFileContentRequest; |
24 | 20 |
|
25 | 21 | class FileController extends ClientApiController |
26 | 22 | { |
27 | 23 | /** |
28 | | - * @var \Illuminate\Contracts\Cache\Factory |
| 24 | + * @var \Pterodactyl\Repositories\Wings\DaemonFileRepository |
29 | 25 | */ |
30 | | - private $cache; |
| 26 | + private $fileRepository; |
31 | 27 |
|
32 | 28 | /** |
33 | | - * @var \Pterodactyl\Repositories\Wings\DaemonFileRepository |
| 29 | + * @var \Illuminate\Contracts\Routing\ResponseFactory |
34 | 30 | */ |
35 | | - private $fileRepository; |
| 31 | + private $responseFactory; |
36 | 32 |
|
37 | 33 | /** |
38 | 34 | * FileController constructor. |
39 | 35 | * |
| 36 | + * @param \Illuminate\Contracts\Routing\ResponseFactory $responseFactory |
40 | 37 | * @param \Pterodactyl\Repositories\Wings\DaemonFileRepository $fileRepository |
41 | | - * @param \Illuminate\Contracts\Cache\Repository $cache |
42 | 38 | */ |
43 | | - public function __construct(DaemonFileRepository $fileRepository, CacheRepository $cache) |
44 | | - { |
| 39 | + public function __construct( |
| 40 | + ResponseFactory $responseFactory, |
| 41 | + DaemonFileRepository $fileRepository |
| 42 | + ) { |
45 | 43 | parent::__construct(); |
46 | 44 |
|
47 | | - $this->cache = $cache; |
48 | 45 | $this->fileRepository = $fileRepository; |
| 46 | + $this->responseFactory = $responseFactory; |
49 | 47 | } |
50 | 48 |
|
51 | 49 | /** |
@@ -91,6 +89,39 @@ public function getFileContents(GetFileContentsRequest $request, Server $server) |
91 | 89 | ); |
92 | 90 | } |
93 | 91 |
|
| 92 | + /** |
| 93 | + * @param \Pterodactyl\Http\Requests\Api\Client\Servers\Files\GetFileContentsRequest $request |
| 94 | + * @param \Pterodactyl\Models\Server $server |
| 95 | + * @return \Symfony\Component\HttpFoundation\StreamedResponse |
| 96 | + * |
| 97 | + * @throws \Exception |
| 98 | + */ |
| 99 | + public function download(GetFileContentsRequest $request, Server $server) |
| 100 | + { |
| 101 | + set_time_limit(0); |
| 102 | + |
| 103 | + $request = $this->fileRepository->setServer($server)->streamContent( |
| 104 | + $request->get('file') |
| 105 | + ); |
| 106 | + |
| 107 | + $body = $request->getBody(); |
| 108 | + |
| 109 | + preg_match('/filename=(?<name>.*)$/', $request->getHeaderLine('Content-Disposition'), $matches); |
| 110 | + |
| 111 | + return $this->responseFactory->streamDownload( |
| 112 | + function () use ($body) { |
| 113 | + while (! $body->eof()) { |
| 114 | + echo $body->read(128); |
| 115 | + } |
| 116 | + }, |
| 117 | + $matches['name'] ?? 'download', |
| 118 | + [ |
| 119 | + 'Content-Type' => $request->getHeaderLine('Content-Type'), |
| 120 | + 'Content-Length' => $request->getHeaderLine('Content-Length'), |
| 121 | + ] |
| 122 | + ); |
| 123 | + } |
| 124 | + |
94 | 125 | /** |
95 | 126 | * Writes the contents of the specified file to the server. |
96 | 127 | * |
@@ -171,27 +202,4 @@ public function delete(DeleteFileRequest $request, Server $server): Response |
171 | 202 |
|
172 | 203 | return Response::create('', Response::HTTP_NO_CONTENT); |
173 | 204 | } |
174 | | - |
175 | | - /** |
176 | | - * Configure a reference to a file to download in the cache so that when the |
177 | | - * user hits the Daemon and it verifies with the Panel they'll actually be able |
178 | | - * to download that file. |
179 | | - * |
180 | | - * Returns the token that needs to be used when downloading the file. |
181 | | - * |
182 | | - * @param \Pterodactyl\Http\Requests\Api\Client\Servers\Files\DownloadFileRequest $request |
183 | | - * @param \Pterodactyl\Models\Server $server |
184 | | - * @return \Illuminate\Http\JsonResponse |
185 | | - * @throws \Exception |
186 | | - */ |
187 | | - public function download(DownloadFileRequest $request, Server $server): JsonResponse |
188 | | - { |
189 | | - $token = Uuid::uuid4()->toString(); |
190 | | - |
191 | | - $this->cache->put( |
192 | | - 'Server:Downloads:' . $token, ['server' => $server->uuid, 'path' => $request->route()->parameter('file')], Carbon::now()->addMinutes(5) |
193 | | - ); |
194 | | - |
195 | | - return JsonResponse::create(['token' => $token]); |
196 | | - } |
197 | 205 | } |
0 commit comments