66use Illuminate \Http \Response ;
77use Pterodactyl \Models \Server ;
88use Illuminate \Http \JsonResponse ;
9+ use Illuminate \Support \Collection ;
910use Pterodactyl \Services \Nodes \NodeJWTService ;
1011use Illuminate \Contracts \Routing \ResponseFactory ;
1112use Pterodactyl \Repositories \Wings \DaemonFileRepository ;
@@ -70,7 +71,7 @@ public function directory(ListFilesRequest $request, Server $server): array
7071 {
7172 $ contents = $ this ->fileRepository
7273 ->setServer ($ server )
73- ->getDirectory (urlencode ( urldecode ( $ request ->get ('directory ' ) ?? '/ ' ) ));
74+ ->getDirectory ($ this -> encode ( $ request ->get ('directory ' ) ?? '/ ' ));
7475
7576 return $ this ->fractal ->collection ($ contents )
7677 ->transformWith ($ this ->getTransformer (FileObjectTransformer::class))
@@ -91,7 +92,7 @@ public function contents(GetFileContentsRequest $request, Server $server): Respo
9192 {
9293 return new Response (
9394 $ this ->fileRepository ->setServer ($ server )->getContent (
94- urlencode ( urldecode ( $ request ->get ('file ' ) )), config ('pterodactyl.files.max_edit_size ' )
95+ $ this -> encode ( $ request ->get ('file ' )), config ('pterodactyl.files.max_edit_size ' )
9596 ),
9697 Response::HTTP_OK ,
9798 ['Content-Type ' => 'text/plain ' ]
@@ -113,7 +114,7 @@ public function download(GetFileContentsRequest $request, Server $server)
113114 $ token = $ this ->jwtService
114115 ->setExpiresAt (CarbonImmutable::now ()->addMinutes (15 ))
115116 ->setClaims ([
116- 'file_path ' => $ request ->get ('file ' ),
117+ 'file_path ' => rawurldecode ( $ request ->get ('file ' ) ),
117118 'server_uuid ' => $ server ->uuid ,
118119 ])
119120 ->handle ($ server ->node , $ request ->user ()->id . $ server ->uuid );
@@ -142,7 +143,7 @@ public function download(GetFileContentsRequest $request, Server $server)
142143 public function write (WriteFileContentRequest $ request , Server $ server ): JsonResponse
143144 {
144145 $ this ->fileRepository ->setServer ($ server )->putContent (
145- $ request ->get ('file ' ),
146+ $ this -> encode ( $ request ->get ('file ' ) ),
146147 $ request ->getContent ()
147148 );
148149
@@ -261,4 +262,18 @@ public function delete(DeleteFileRequest $request, Server $server): JsonResponse
261262
262263 return new JsonResponse ([], Response::HTTP_NO_CONTENT );
263264 }
265+
266+ /**
267+ * Encodes a given file name & path in a format that should work for a good majority
268+ * of file names without too much confusing logic.
269+ *
270+ * @param string $path
271+ * @return string
272+ */
273+ private function encode (string $ path ): string
274+ {
275+ return Collection::make (explode ('/ ' , rawurldecode ($ path )))->map (function ($ value ) {
276+ return rawurlencode ($ value );
277+ })->join ('/ ' );
278+ }
264279}
0 commit comments