diff --git a/CHANGELOG.md b/CHANGELOG.md index 027d9c0a3..38a184b71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. ### Added * Support for creating server without having to assign a node and allocation manually. Simply select the checkbox or pass `auto_deploy=true` to the API to auto-select a node and allocation given a location. * Support for setting IP Aliases through the panel on the node overview page. Also cleaned up allocation removal. +* Support for renaming files through the panel's file mananger. ### Changed * Prevent clicking server start button until server is completely off, not just stopping. @@ -15,6 +16,10 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. * Trying to add a new node if no location exists redirects user to location management page and alerts them to add a location first. * `Server\AjaxController@postSetConnection` is now `Server\AjaxController@postSetPrimary` and accepts one post parameter of `allocation` rather than a combined `ip:port` value. * Port allocations on server view are now cleaner and should make more sense. +* Improved File Manager + * Rewritten Javascript to load, rename, and handle other file actions. + * Uses Ace Editor for editing files rather than a non-formatted textarea + * File actions that were previously icons to the right are now contained in a menu that appears when right-clicking a file or folder. ### Fixed * Team Fortress named 'Insurgency' in panel in database seeder. ([#96](https://github.com/Pterodactyl/Panel/issues/96), PR by [@MeltedLux](https://github.com/MeltedLux)) diff --git a/README.md b/README.md index 71970213c..7e6c6fce6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ ## Pterodactyl Panel -Pterodactyl is the free game server management panel designed by users, for users. Featuring support for Vanilla Minecraft, Spigot, Source Dedicated Servers, BungeeCord, and many more. Pterodactyl is built on the `Laravel PHP Framework (v5.2)`. +Pterodactyl is the free game server management panel designed by users, for users. Featuring support for Vanilla Minecraft, Spigot, Source Dedicated Servers, BungeeCord, and many more. Pterodactyl is built on the `Laravel PHP Framework (v5.3)`. ## Support & Documentation Support for using Pterodactyl can be found on our [wiki](https://github.com/Pterodactyl/Panel/wiki) or on our [Discord chat](https://discord.gg/0gYt8oU8QOkDhKLS). @@ -28,6 +28,8 @@ SOFTWARE. ``` ### Credits +Ace Editor - [license](https://github.com/ajaxorg/ace/blob/master/LICENSE) - [homepage](https://ace.c9.io) + Animate.css - [license](https://github.com/daneden/animate.css/blob/master/LICENSE) - [homepage](http://daneden.github.io/animate.css/) Async.js - [license](https://github.com/caolan/async/blob/master/LICENSE) - [homepage](https://github.com/caolan/async/) @@ -48,6 +50,8 @@ jQuery - [license](https://github.com/jquery/jquery/blob/master/LICENSE.txt) - [ jQuery Terminal - [license](https://github.com/jcubic/jquery.terminal/blob/master/LICENSE) - [homepage](http://terminal.jcubic.pl) +Lodash - [license](https://github.com/lodash/lodash/blob/master/LICENSE) - [homepage](https://lodash.com/) + MetricsGraphics.js - [license](https://github.com/mozilla/metrics-graphics/blob/master/LICENSE) - [homepage](http://metricsgraphicsjs.org/) Socket.io - [license](https://github.com/socketio/socket.io/blob/master/LICENSE) - [homepage](http://socket.io) diff --git a/app/Http/Controllers/Server/AjaxController.php b/app/Http/Controllers/Server/AjaxController.php index dd81c2184..b109063bd 100644 --- a/app/Http/Controllers/Server/AjaxController.php +++ b/app/Http/Controllers/Server/AjaxController.php @@ -137,7 +137,7 @@ class AjaxController extends Controller 'server' => $server, 'files' => $directoryContents->files, 'folders' => $directoryContents->folders, - 'extensions' => Repositories\HelperRepository::editableFiles(), + 'editableMime' => Repositories\HelperRepository::editableFiles(), 'directory' => $prevDir ]); diff --git a/app/Http/Controllers/Server/ServerController.php b/app/Http/Controllers/Server/ServerController.php index 9b3aecb55..d77c0d636 100644 --- a/app/Http/Controllers/Server/ServerController.php +++ b/app/Http/Controllers/Server/ServerController.php @@ -145,9 +145,9 @@ class ServerController extends Controller 'server' => $server, 'node' => Models\Node::find($server->node), 'file' => $file, - 'contents' => $fileContent->content, - 'directory' => (in_array($fileInfo->dirname, ['.', './', '/'])) ? '/' : trim($fileInfo->dirname, '/') . '/', - 'extension' => $fileInfo->extension + 'stat' => $fileContent['stat'], + 'contents' => $fileContent['file']->content, + 'directory' => (in_array($fileInfo->dirname, ['.', './', '/'])) ? '/' : trim($fileInfo->dirname, '/') . '/' ]); } diff --git a/app/Repositories/Daemon/FileRepository.php b/app/Repositories/Daemon/FileRepository.php index e57a543c8..83d6916a5 100644 --- a/app/Repositories/Daemon/FileRepository.php +++ b/app/Repositories/Daemon/FileRepository.php @@ -85,7 +85,7 @@ class FileRepository * Get the contents of a requested file for the server. * * @param string $file - * @return string + * @return array */ public function returnFileContents($file) { @@ -95,22 +95,39 @@ class FileRepository } $file = (object) pathinfo($file); - if (!in_array($file->extension, HelperRepository::editableFiles())) { - throw new DisplayException('You do not have permission to edit this type of file.'); - } $file->dirname = (in_array($file->dirname, ['.', './', '/'])) ? null : trim($file->dirname, '/') . '/'; - $res = $this->client->request('GET', '/server/file/' . rawurlencode($file->dirname.$file->basename), [ + $res = $this->client->request('GET', '/server/files/stat/' . rawurlencode($file->dirname.$file->basename) , [ + 'headers' => $this->headers + ]); + + $stat = json_decode($res->getBody()); + if($res->getStatusCode() !== 200 || !isset($stat->size)) { + throw new DisplayException('The daemon provided a non-200 error code on stat lookup: HTTP\\' . $res->getStatusCode()); + } + + if (!in_array($stat->mime, HelperRepository::editableFiles())) { + throw new DisplayException('You cannot edit that type of file (' . $stat->mime . ') through the panel.'); + } + + if ($stat->size > 5000000) { + throw new DisplayException('That file is too large to open in the browser, consider using a SFTP client.'); + } + + $res = $this->client->request('GET', '/server/file/' . rawurlencode($file->dirname.$file->basename) , [ 'headers' => $this->headers ]); $json = json_decode($res->getBody()); if($res->getStatusCode() !== 200 || !isset($json->content)) { - throw new DisplayException('Scales provided a non-200 error code: HTTP\\' . $res->getStatusCode()); + throw new DisplayException('The daemon provided a non-200 error code: HTTP\\' . $res->getStatusCode()); } - return $json; + return [ + 'file' => $json, + 'stat' => $stat + ]; } @@ -130,11 +147,24 @@ class FileRepository $file = (object) pathinfo($file); - if(!in_array($file->extension, HelperRepository::editableFiles())) { - throw new DisplayException('You do not have permission to edit this type of file.'); + $file->dirname = (in_array($file->dirname, ['.', './', '/'])) ? null : trim($file->dirname, '/') . '/'; + + $res = $this->client->request('GET', '/server/files/stat/' . rawurlencode($file->dirname.$file->basename) , [ + 'headers' => $this->headers + ]); + + $stat = json_decode($res->getBody()); + if($res->getStatusCode() !== 200 || !isset($stat->size)) { + throw new DisplayException('The daemon provided a non-200 error code on stat lookup: HTTP\\' . $res->getStatusCode()); } - $file->dirname = (in_array($file->dirname, ['.', './', '/'])) ? null : trim($file->dirname, '/') . '/'; + if (!in_array($stat->mime, HelperRepository::editableFiles())) { + throw new DisplayException('You cannot edit that type of file (' . $stat->mime . ') through the panel.'); + } + + if ($stat->size > 5000000) { + throw new DisplayException('That file is too large to save in the browser, consider using a SFTP client.'); + } $res = $this->client->request('POST', '/server/file/' . rawurlencode($file->dirname.$file->basename), [ 'headers' => $this->headers, diff --git a/app/Repositories/HelperRepository.php b/app/Repositories/HelperRepository.php index 1ed67f134..6eaa68329 100644 --- a/app/Repositories/HelperRepository.php +++ b/app/Repositories/HelperRepository.php @@ -30,25 +30,20 @@ class HelperRepository { * @var array */ protected static $editable = [ - 'txt', - 'yml', - 'yaml', - 'log', - 'conf', - 'config', - 'html', - 'json', - 'properties', - 'props', - 'cfg', - 'lang', - 'ini', - 'cmd', - 'sh', - 'lua', - '0' // Supports BungeeCord Files + 'application/json', + 'application/javascript', + 'application/xml', + 'application/xhtml+xml', + 'text/xml', + 'text/css', + 'text/html', + 'text/plain', + 'text/x-perl', + 'text/x-shellscript', + 'inode/x-empty' ]; + public function __construct() { // diff --git a/public/themes/default/css/pterodactyl.css b/public/themes/default/css/pterodactyl.css index c7be4c6e2..b7819a85e 100755 --- a/public/themes/default/css/pterodactyl.css +++ b/public/themes/default/css/pterodactyl.css @@ -197,3 +197,41 @@ li.btn.btn-default.pill:active,li.btn.btn-default.pill:focus,li.btn.btn-default. .use-pointer { cursor: pointer !important; } + +.dropdown-menu > li.bg-danger { + background-color:#fdf7f7; + color:#474a54; + border-left: 4px solid #d9534f !important; +} + +.dropdown-menu > li.bg-info { + background-color:#fcf8f2; + color:#474a54; + border-left: 4px solid #f0ad4e !important; +} + +.dropdown-menu > li.bg-success { + background-color:#f4f8fa; + color:#474a54; + border-left: 4px solid #5bc0de !important; +} + +.dropdown-menu > li.bg-warning { + background-color:#fdf7f7; + color:#474a54; + border-left: 4px solid #d9534f !important; +} + +.dropdown-menu > li.bg-default { + border-left: 4px solid #bbbbbb !important; +} + +.dropdown-menu > li.bg-danger > a, +.dropdown-menu > li.bg-info > a, +.dropdown-menu > li.bg-success > a, +.dropdown-menu > li.bg-warning > a, +.dropdown-menu > li.bg-default > a { + padding-left: 11px !important; +} +/*.bg-danger:active,.bg-danger:focus,.bg-danger:hover{color:#fff;background-color:#d32a0e;border-color:#b1240c} +.bg-danger.disabled,.bg-danger.disabled:active,.bg-danger.disabled:focus,.bg-danger.disabled:hover,.bg-danger[disabled]{background-color:#f04124;border-color:#ea2f10}*/ diff --git a/resources/views/server/files/edit.blade.php b/resources/views/server/files/edit.blade.php index d76f19160..6ac8c4edc 100644 --- a/resources/views/server/files/edit.blade.php +++ b/resources/views/server/files/edit.blade.php @@ -26,65 +26,52 @@ @section('content')