diff --git a/.env.example b/.env.example index 40309f7b1..8c9c916b0 100644 --- a/.env.example +++ b/.env.example @@ -6,6 +6,7 @@ APP_TIMEZONE=America/New_York APP_CLEAR_TASKLOG=720 APP_DELETE_MINUTES=10 APP_ENVIRONMENT_ONLY=true +LOG_CHANNEL=daily APP_LOCALE=en APP_LOCALE_IS_GLOBAL=false diff --git a/CHANGELOG.md b/CHANGELOG.md index 66ba9ac6b..27eca5765 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,35 @@ This file is a running track of new features and fixes to each version of the pa This project follows [Semantic Versioning](http://semver.org) guidelines. +## v0.7.8 (Derelict Dermodactylus) +### Added +* Nodes can now be put into maintenance mode to deny access to servers temporarily. +* Basic statistics about your panel are now available in the Admin CP. + +### Fixed +* Hitting Ctrl+Z when editing a file on the web now works as expected. +* Logo now links to the correct location on all pages. + +### Changed +* Attempting to upload a folder via the web file manager will now display a warning telling the user to use SFTP. + ## v0.7.7 (Derelict Dermodactylus) ### Fixed * Fixes an issue with the sidebar logo not working correctly in some browsers due to the CSS being assigned. +* Fixes a bunch of typos through the code base. +* Fixes a bug when attempting to load the dropdown menu for server owner in some cases. +* Fixes an exception thrown when the database connection address was not filled out correctly while adding a database to a server. +* Fixes some mistakes in the German translation of the panel. ### Added * Added a new client API endpoint for gathering the utilization stats for servers including disk, cpu, and memory. `GET /api/client/servers//utilization` * Added validation to variable validation rules to validate that the validation rules are valid because we heard you like validating your validation. +* Added German translations for many previously untranslated parts of the panel. + +### Changed +* Updated core framework from Laravel 5.5 to Laravel 5.6. +* Improved support for Windows based environments. +* Spigot Egg now builds spigot for you rather than requiring a download location be specified. ## v0.7.6 (Derelict Dermodactylus) ### Fixed @@ -27,7 +49,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. ### Changed * Panel now throws proper 504: Gateway Timeout errors on server listing when daemon is offline. -* Sessions handled through redis now use a seperate database (default `1`) to store session database to avoid logging users out when flushing the cache. +* Sessions handled through redis now use a separate database (default `1`) to store session database to avoid logging users out when flushing the cache. * File manager UI improved to be clearer with buttons and cleaner on mobile. * reCAPTCHA's secret key position swapped with website key in advanced panel settings to be consistent with Google's reCAPTCHA dashboard. * Changed DisplayException to handle its own logging correctly and check if the previous exception is marked as one that should not be logged. @@ -56,7 +78,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. * Fixes a bug when reinstalling a server that would not mark the server as installing, resulting in some UI issues. * Handle 404 errors from missing models in the application API bindings correctly. * Fix validation error returned when no environment variables are passed, even if there are no variables required. -* Fix improper permissions on `PATCH /api/servers//startup` endpoint which was preventing enditing any start variables. +* Fix improper permissions on `PATCH /api/servers//startup` endpoint which was preventing editing any start variables. * Should fix migration issues from 0.6 when there are more than API key in the database. ### Changed @@ -94,7 +116,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. ## v0.7.1 (Derelict Dermodactylus) ### Fixed * Fixes an exception when no token is entered on the 2-Factor enable/disable page and the form is submitted. -* Fixes an exception when trying to perform actions aganist a User model due to a validator that could not be cast to a string correctly. +* Fixes an exception when trying to perform actions against a User model due to a validator that could not be cast to a string correctly. * Allow FQDNs in database host creation UI correctly. * Fixes database naming scheme using `d###_` rather than `s###_` when creating server databases. * Fix exception thrown when attempting to update an existing database host. @@ -110,7 +132,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. * `[rc.2]` — Fixes bad API behavior on `/user` routes. * `[rc.2]` — Fixes Admin CP user editing resetting a password on users unintentionally. * `[rc.2]` — Fixes bug with server creation API endpoint that would fail to validate `allocation.default` correctly. -* `[rc.2]` — Fix data integrity exception occuring due to invalid data being passed to server creation service on the API. +* `[rc.2]` — Fix data integrity exception occurring due to invalid data being passed to server creation service on the API. * `[rc.2]` — Fix data integrity exception that could occur when an email containing non-username characters was passed. * `[rc.2]` — Fix data integrity exception occurring when no default value is provided for an egg variable. * `[rc.2]` — Fixes a bug that would cause non-editable variables on the front-end to throw a validation error. @@ -152,7 +174,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. ### Changed * PHP 7.2 is now the minimum required version for this software. -* Egg variable default values are no longer validated aganist the ruleset when configuring them. Validation of those rules will only occur when editing or creating a server. +* Egg variable default values are no longer validated against the ruleset when configuring them. Validation of those rules will only occur when editing or creating a server. * Changed logger to skip reporting stack-traces on PDO exceptions due to sensitive information being contained within. * Changed behavior of allocation IP Address/Ports box to automatically store the value entered if a user unfocuses the field without hitting space. * Changed order in which allocations are displayed to prioritize those with servers attached (in ascending IP & port order) followed by ascending IP & port order where no server is attached. @@ -183,7 +205,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. ### Fixed * `[rc.1]` — Fixes exception thrown when revoking user sessions. * `[rc.1]` — Fixes exception that would occur when trying to delete allocations from a node. -* `[rc.1]` — Fixes exception thown when attempting to adjust mail settings as well as a validation error thrown afterwards. +* `[rc.1]` — Fixes exception thrown when attempting to adjust mail settings as well as a validation error thrown afterwards. * `[rc.1]` — Fixes bug preventing modification of the default value for an Egg variable. * `[rc.1]` — Fixed a bug that would occur when attempting to reset the daemon secret for a node. * `[rc.1]` — Fix exception thrown when attempting to modify an existing database host. @@ -208,7 +230,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. ## v0.7.0-beta.4 (Derelict Dermodactylus) ### Fixed * `[beta.3]` — Fixes a bug with the default environment file that was causing an inability to perform a fresh install when running package discovery. -* `[beta.3]` — Fixes an edge case caused by the Laravel 5.5 upgrade that would try to perform an in_array check aganist a null value. +* `[beta.3]` — Fixes an edge case caused by the Laravel 5.5 upgrade that would try to perform an in_array check against a null value. * `[beta.3]` — Fixes a bug that would cause an error when attempting to create a new user on the Panel. * `[beta.3]` — Fixes error handling of the settings service provider when no migrations have been run. * `[beta.3]` — Fixes validation error when trying to use 'None' as the 'Copy Script From' option for an egg script. @@ -227,7 +249,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. ## v0.7.0-beta.3 (Derelict Dermodactylus) ### Fixed -* `[beta.2]` — Fixes a bug that would cause an endless exception message stream in the console when attemping to setup environment settings in certain instances. +* `[beta.2]` — Fixes a bug that would cause an endless exception message stream in the console when attempting to setup environment settings in certain instances. * `[beta.2]` — Fixes a bug causing the dropdown menu for a server's egg to display the wrong selected value. * `[beta.2]` — Fixes a bug that would throw a red page of death when submitting an invalid egg variable value for a server in the Admin CP. * `[beta.2]` — Someone found a `@todo` that I never `@todid` and thus database hosts could not be created without being linked to a node. This is fixed... @@ -256,7 +278,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. * `[beta.1]` — Fixes bug causing inability to create new servers on the Panel. * `[beta.1]` — Fixes bug causing inability to delete an allocation due to misconfigured JS. * `[beta.1]` — Fixes bug causing inability to set the IP alias for an allocation to an empty value. -* `[beta.1]` — Fixes bug that caused startup changes to not propigate to the server correctly on the first save. +* `[beta.1]` — Fixes bug that caused startup changes to not propagate to the server correctly on the first save. * `[beta.1]` — Fixes bug that prevented subusers from accessing anything over socketio due to a missing permission. ### Changed @@ -358,7 +380,7 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) * API now returns a useful error displaying what went wrong rather than an obscure 'An Error was Encountered' message when API issues arise. * Fixes bug preventing the creation of new files in the file manager due to a missing JS dependency on page load. * Prevent using a service option tag that contains special characters that are not valid. Now only allows alpha-numeric, no spaces or underscores. -* Fix unhandled excpetion due to missing `Log` class when using the API and causing an error. +* Fix unhandled exception due to missing `Log` class when using the API and causing an error. ### Changed * Renamed session cookies from `laravel_session` to `pterodactyl_session`. @@ -374,7 +396,7 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) * Fixes potential bug with invalid CIDR notation (ex: `192.168.1.1/z`) when adding allocations that could cause over 4 million records to be created at once. * Fixes bug where daemon was unable to register that certain games had fully booted and were ready to play on. * Fixes bug causing MySQL user accounts to be corrupted when resetting a password via the panel. -* Fixes remote timing attack vulnerability due to hmac comparsion in API middleware. +* Fixes remote timing attack vulnerability due to hmac comparison in API middleware. * `[rc.1]` — Server deletion is fixed, caused by removed download table. * `[rc.1]` — Server status indication on front-end no longer shows `Error` when server is marked as installing or suspended. * `[rc.1]` — Fixes issues with SteamCMD not registering and installing games properly. @@ -403,10 +425,10 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) * API has been completely overhauled to use new permissions system. **Any old API keys will immediately become invalid and fail to operate properly anymore. You will need to generate new keys.** * Cleaned up dynamic database connection setting to use a single function call from the host model. * Deleting a server safely now continues even if the daemon reports a `HTTP/404` missing server error (requires `Daemon@0.4.0-beta.2.1`) -* Changed behavior when modifying server allocation information. You can now remove the default allocation assuming you assing a new allocation at the same time. Reduces the number of steps to change the default allocation for a server. +* Changed behavior when modifying server allocation information. You can now remove the default allocation assuming you are passing a new allocation at the same time. Reduces the number of steps to change the default allocation for a server. * Environment setting commands now attempt to auto-quote strings with spaces in them, as well as comment lines that are edited to avoid manual changes being overwritten. * Version in footer of panel now displays correctly if panel is installed using Git rather than a download from source. -* Mobile views are now more... viewable. Fixes `col-xs-6` usage thoughout the Admin CP where it was intended to be `col-md-6`. +* Mobile views are now more... viewable. Fixes `col-xs-6` usage throughout the Admin CP where it was intended to be `col-md-6`. * Node Configuration tokens and Download tokens are stored using the cache helpers rather than a database to speed up functions and make use of auto-expiration/deletion functions. * Old daemon routes using `/remote` have been changed to use `/daemon`, panel changes now reflect this. * Only display servers that a user is owner of or subuser of in the Admin CP rather than all servers if the user is marked as an admin. @@ -424,9 +446,9 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) * Ability to assign multiple allocations at once when creating a new server. * New `humanReadable` macro on `File` facade that accepts a file path and returns a human readable size. (`File::humanReadable(path, precision)`) * Added ability to edit database host details after creation on the system. -* Login attempts and pasword reset requests are now protected by invisible ReCaptcha. This feature can be disabled with a `.env` variable. +* Login attempts and password reset requests are now protected by invisible ReCaptcha. This feature can be disabled with a `.env` variable. * Server listing for individual users is now searchable on the front-end. -* Servers that a user is assocaited with as a subuser are now displayed in addition to owned servers when listing users in the Admin CP. +* Servers that a user is associated with as a subuser are now displayed in addition to owned servers when listing users in the Admin CP. * Ability to launch the console in a new window as an individual unit. https://s3.kelp.in/IrTyE.png * Server listing and view in Admin CP now shows the SFTP username/Docker container name. * Administrative server view includes link in navigation to go to server console/frontend management. @@ -448,7 +470,7 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) * `[beta.2.1]` — Fixed a bug preventing the deletion of a server. * It is now possible to modify a server's disk limits after the server is created. * `[beta.2.1]` — Fixes a bug causing login issues and password reset failures when reCAPTCHA is enabled. -* Fixes remote timing attack vulnerability due to hmac comparsion in API middleware. +* Fixes remote timing attack vulnerability due to hmac comparison in API middleware. * `[beta.2.1]` — Fixes bug requiring docker image field to be filled out when adding a service option. * `[beta.2.1]` — Fixes inability to mark a user as a non-admin once they were assigned the role. @@ -461,7 +483,7 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) ### Changed * Environment setting commands now attempt to auto-quote strings with spaces in them, as well as comment lines that are edited to avoid manual changes being overwritten. * Version in footer of panel now displays correctly if panel is installed using Git rather than a download from source. -* Mobile views are now more... viewable. Fixes `col-xs-6` usage thoughout the Admin CP where it was intended to be `col-md-6`. +* Mobile views are now more... viewable. Fixes `col-xs-6` usage throughout the Admin CP where it was intended to be `col-md-6`. * Node Configuration tokens and Download tokens are stored using the cache helpers rather than a database to speed up functions and make use of auto-expiration/deletion functions. * Old daemon routes using `/remote` have been changed to use `/daemon`, panel changes now reflect this. * Only display servers that a user is owner of or subuser of in the Admin CP rather than all servers if the user is marked as an admin. @@ -482,7 +504,7 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) ### Changed * Deleting a server safely now continues even if the daemon reports a `HTTP/404` missing server error (requires `Daemon@0.4.0-beta.2.1`) -* Changed behavior when modifying server allocation information. You can now remove the default allocation assuming you assing a new allocation at the same time. Reduces the number of steps to change the default allocation for a server. +* Changed behavior when modifying server allocation information. You can now remove the default allocation assuming you are passing a new allocation at the same time. Reduces the number of steps to change the default allocation for a server. ### Added * Server listing and view in Admin CP now shows the SFTP username/Docker container name. @@ -490,7 +512,7 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) ## v0.6.0-beta.2 ### Fixed -* `[beta.1]` — Fixes task management ststem not running correctly. +* `[beta.1]` — Fixes task management system not running correctly. * `[beta.1]` — Fixes API endpoint for command sending missing the required class definition. * `[beta.1]` — Fixes panel looking for an old compiled classfile that is no longer used. This was causing errors relating to `missing class DingoAPI` when trying to upgrade the panel. * `[beta.1]` — Should fix render issues when trying to edit some files via the panel file editor. @@ -507,9 +529,9 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) * `[pre.7]` — Terminal is now fixed to actually output all lines, rather than leaving one hanging in neverland until the browser is resized. ### Added -* Login attempts and pasword reset requests are now protected by invisible ReCaptcha. This feature can be disabled with a `.env` variable. +* Login attempts and password reset requests are now protected by invisible ReCaptcha. This feature can be disabled with a `.env` variable. * Server listing for individual users is now searchable on the front-end. -* Servers that a user is assocaited with as a subuser are now displayed in addition to owned servers when listing users in the Admin CP. +* Servers that a user is associated with as a subuser are now displayed in addition to owned servers when listing users in the Admin CP. ### Changed * Subuser permissions are now stored in `Permission::listPermissions()` to make views way cleaner and make adding to views significantly cleaner. @@ -532,7 +554,7 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) ## v0.6.0-pre.6 ### Fixed * `[pre.5]` — Console based server rebuild tool now actually rebuilds the servers with the correct information. -* `[pre.5]` — Fixes typo and wrong docker contaienr for certain applications. +* `[pre.5]` — Fixes typo and wrong docker container for certain applications. ### Changed * Removed all old theme JS and CSS folders to cleanup and avoid confusion in the future. @@ -545,7 +567,7 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) * New theme applied to Admin CP. Many graphical changes were made, some data was moved around and some display data changed. Too much was changed to feasibly log it all in here. Major breaking changes or notable new features will be logged. * New server creation page now makes significantly less AJAX calls and is much quicker to respond. * Server and Node view pages wee modified to split tabs into individual pages to make re-themeing and modifications significantly easier, and reduce MySQL query loads on page. -* `[pre.4]` — Service and Pack magement overhauled to be faster, cleaner, and more extensible in the future. +* `[pre.4]` — Service and Pack management overhauled to be faster, cleaner, and more extensible in the future. * Most of the backend `UnhandledException` display errors now include a clearer error that directs admins to the program's logs. * Table seeders for services now can be run during upgrades and will attempt to locate and update, or create new if not found in the database. * Many structural changes to the database and `Pterodactyl\Models` classes that would flood this changelog if they were all included. All required migrations included to handle database changes. @@ -562,7 +584,7 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) * Fixes bug where daemon was unable to register that certain games had fully booted and were ready to play on. * Fixes bug causing MySQL user accounts to be corrupted when resetting a password via the panel. * `[pre.4]` — Multiple clients refreshing the console no longer clears the console for all parties involved... sorry about that. -* `[pre.4]` — Fixes bug in environment setting script that would not remeber defaults and try to re-assign values. +* `[pre.4]` — Fixes bug in environment setting script that would not remember defaults and try to re-assign values. ### Added * Ability to assign multiple allocations at once when creating a new server. @@ -648,7 +670,7 @@ spatie/laravel-fractal (4.0.0 => 4.0.1) * Fixes bug that would allow creating multiple subusers with the same email address. * Fixes bug where Sponge servers were improperly tagged as a spigot server in the daemon causing issues when booting or modifying configuration files. * Use transpiled ES6 -> ES5 filemanager code in browsers. -* Fixes service option name displaying the name of a nwly added variable after the variable is added and until the page is refreshed. (see #208) +* Fixes service option name displaying the name of a newly added variable after the variable is added and until the page is refreshed. (see #208) ### Changed * Filemanager and EULA checking javascript is now written in pure ES6 code rather than as a blade-syntax template. This allows the use of babel to transpile into ES5 as a minified version. @@ -732,14 +754,14 @@ After nearly a month in the works, version `v0.5.0` is finally here! 🎉 * Small check for current node status that shows up to the left of the name when viewing a listing of all nodes. * 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. +* Support for renaming files through the panel's file manager. ### Changed * Servers are now queued for deletion to allow for cancellation of deletion, as well as run in the background to speed up page loading. * Switched to new graphing library to make graphs less... broken. * Rebuild triggers are only sent to the node if there is actually something changed that requires a rebuild. * Dependencies are now hard-coded into the `composer.json` file to prevent users installing slightly different versions with different features or bugs. -* Server related tasks now use the lowest priorty queue to prevent clogging the pipes when there are more important tasks to be run by the panel. +* Server related tasks now use the lowest priority queue to prevent clogging the pipes when there are more important tasks to be run by the panel. * Dates displayed in the file manager are now more user friendly. * Creating a user, server, or node now returns `HTTP/1.1 200` and a JSON element with the user/server/node's ID. * Environment setting script is much more user friendly and does not require an excessive amount of clicking and typing. @@ -808,7 +830,7 @@ After nearly a month in the works, version `v0.5.0` is finally here! 🎉 * Switched to new graphing library to make graphs less... broken. * Rebuild triggers are only sent to the node if there is actually something changed that requires a rebuild. * Dependencies are now hard-coded into the `composer.json` file to prevent users installing slightly different versions with different features or bugs. -* Server related tasks now use the lowest priorty queue to prevent clogging the pipes when there are more important tasks to be run by the panel. +* Server related tasks now use the lowest priority queue to prevent clogging the pipes when there are more important tasks to be run by the panel. * Decompressing files now shows a pop-over box that does not dismiss until it is complete. * Dates displayed in the file manager are now more user friendly. @@ -868,7 +890,7 @@ After nearly a month in the works, version `v0.5.0` is finally here! 🎉 ### 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. +* Support for renaming files through the panel's file manager. ### Changed * Prevent clicking server start button until server is completely off, not just stopping. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8f701c8a2..443eceab4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,14 +4,14 @@ We're glad you want to help us out and make this panel the best that it can be! ### Project Branches This section mainly applies to those with read/write access to our repositories, but can be helpful for others. -The `develop` branch should always be in a runnable state, and not contain any major breaking features. For the most part this means you will need to create `feature/` branches in order to add new functionality, or change how things work. When making a feature branch, if it is referencing something in the issue tracker, please title the branch `feature/PTDL-###` where `###` is the issue number. +The `develop` branch should always be in a runnable state, and not contain any major breaking features. For the most part, this means you will need to create `feature/` branches in order to add new functionality or change how things work. When making a feature branch, if it is referencing something in the issue tracker, please title the branch `feature/PTDL-###` where `###` is the issue number. -Moving forward all commits from contributors should be in the form of a PR, unless it is something we have previous discussed as being able to be pushed right into `develop`. +Moving forward all commits from contributors should be in the form of a PR, unless it is something we have previously discussed as being able to be pushed right into `develop`. -All new code should contain unit tests at minimum (where applicable). There is a lot of un-covered code currently, so as you are doing things please be looking for places that you can write tests. +All new code should contain unit tests at a minimum (where applicable). There is a lot of uncovered code currently, so as you are doing things please be looking for places that you can write tests. ### Update the CHANGELOG -When adding something that is new, fixed, changed, or security related for the next release you should be adding a note to the CHANGELOG. If something is changing within the same version (i.e. fixing a bug introduced but not released) it should _not_ go into the CHANGELOG. +When adding something that is new, fixed, changed, or security-related for the next release you should be adding a note to the CHANGELOG. If something is changing within the same version (i.e. fixing a bug introduced but not released) it should _not_ go into the CHANGELOG. ### Code Guidelines We are a `PSR-4` and `PSR-0` compliant project, so please follow those guidelines at a minimum. In addition, StyleCI runs on all of our code to ensure the formatting is standardized across everything. When a PR is made StyleCI will analyze your code and make a pull to that branch if necessary to fix any formatting issues. This project also ships with a PHP-CS configuration file and you are welcome to configure your local environment to make use of that. @@ -32,13 +32,13 @@ class ProcessScheduleService ``` ### Responsible Disclosure -This is a fairly in-depth project, and makes use of a lot of parts. We strive to keep everything as secure as possible, and welcome you to take a look into it yourself. We do ask that you be considerate of others who are using the software and not publicly disclose security issues without contacting us first by email. +This is a fairly in-depth project and makes use of a lot of parts. We strive to keep everything as secure as possible and welcome you to take a look at the code provided in this project yourself. We do ask that you be considerate of others who are using the software and not publicly disclose security issues without contacting us first by email. We'll make a deal with you: if you contact us by email and we fail to respond to you within a week you are welcome to publicly disclose whatever issue you have found. We understand how frustrating it is when you find something big and no one will respond to you. This holds us to a standard of providing prompt attention to any issues that arise and keeping this community safe. If you've found what you believe is a security issue please email us at `support@pterodactyl.io`. ### Where to find Us -You can find us in a couple places online. First and foremost, we're active right here on Github. If you encounter a bug or other problem open an issue on here for us to take a look at it. We also accept feature requests here as well. +You can find us in a couple places online. First and foremost, we're active right here on Github. If you encounter a bug or other problems, open an issue on here for us to take a look at it. We also accept feature requests here as well. You can also find us on [Discord](https://pterodactyl.io/discord). In the event that you need to get in contact with us privately feel free to contact us at `support@pterodactyl.io`. Try not to email us with requests for support regarding the panel, we'll probably just direct you to our Discord. diff --git a/app/Console/Commands/Environment/AppSettingsCommand.php b/app/Console/Commands/Environment/AppSettingsCommand.php index 17c2b5bbc..05aa2028e 100644 --- a/app/Console/Commands/Environment/AppSettingsCommand.php +++ b/app/Console/Commands/Environment/AppSettingsCommand.php @@ -58,7 +58,7 @@ class AppSettingsCommand extends Command * @var string */ protected $signature = 'p:environment:setup - {--new-salt : Wether or not to generate a new salt for Hashids.} + {--new-salt : Whether or not to generate a new salt for Hashids.} {--author= : The email that services created on this instance should be linked to.} {--url= : The URL that this Panel is running on.} {--timezone= : The timezone to use for Panel times.} diff --git a/app/Console/Commands/Environment/EmailSettingsCommand.php b/app/Console/Commands/Environment/EmailSettingsCommand.php index 0403d7f11..0a29f2da2 100644 --- a/app/Console/Commands/Environment/EmailSettingsCommand.php +++ b/app/Console/Commands/Environment/EmailSettingsCommand.php @@ -59,6 +59,7 @@ class EmailSettingsCommand extends Command /** * Handle command execution. + * @throws \Pterodactyl\Exceptions\PterodactylException */ public function handle() { diff --git a/app/Console/Commands/InfoCommand.php b/app/Console/Commands/InfoCommand.php index 699adee1f..d8544477f 100644 --- a/app/Console/Commands/InfoCommand.php +++ b/app/Console/Commands/InfoCommand.php @@ -84,7 +84,7 @@ class InfoCommand extends Command ['Host', $this->config->get("database.connections.{$driver}.host")], ['Port', $this->config->get("database.connections.{$driver}.port")], ['Database', $this->config->get("database.connections.{$driver}.database")], - ['Usernamne', $this->config->get("database.connections.{$driver}.username")], + ['Username', $this->config->get("database.connections.{$driver}.username")], ], 'compact'); $this->output->title('Email Configuration'); diff --git a/app/Console/Commands/Server/BulkPowerActionCommand.php b/app/Console/Commands/Server/BulkPowerActionCommand.php index ced90db81..91e761e68 100644 --- a/app/Console/Commands/Server/BulkPowerActionCommand.php +++ b/app/Console/Commands/Server/BulkPowerActionCommand.php @@ -31,8 +31,8 @@ class BulkPowerActionCommand extends Command */ protected $signature = 'p:server:bulk-power {action : The action to perform (start, stop, restart, kill)} - {--servers= : A comma seperated list of servers.} - {--nodes= : A comma seperated list of nodes.}'; + {--servers= : A comma separated list of servers.} + {--nodes= : A comma separated list of nodes.}'; /** * @var string diff --git a/app/Contracts/Repository/AllocationRepositoryInterface.php b/app/Contracts/Repository/AllocationRepositoryInterface.php index 1331e906f..994ded2cc 100644 --- a/app/Contracts/Repository/AllocationRepositoryInterface.php +++ b/app/Contracts/Repository/AllocationRepositoryInterface.php @@ -59,7 +59,7 @@ interface AllocationRepositoryInterface extends RepositoryInterface public function getAssignedAllocationIds(int $server): array; /** - * Return a concated result set of node ips that already have at least one + * Return a concatenated result set of node ips that already have at least one * server assigned to that IP. This allows for filtering out sets for * dedicated allocation IPs. * diff --git a/app/Contracts/Repository/Daemon/ServerRepositoryInterface.php b/app/Contracts/Repository/Daemon/ServerRepositoryInterface.php index a00686a05..d640c1c0a 100644 --- a/app/Contracts/Repository/Daemon/ServerRepositoryInterface.php +++ b/app/Contracts/Repository/Daemon/ServerRepositoryInterface.php @@ -62,7 +62,7 @@ interface ServerRepositoryInterface extends BaseRepositoryInterface public function delete(): ResponseInterface; /** - * Return detials on a specific server. + * Return details on a specific server. * * @return \Psr\Http\Message\ResponseInterface */ diff --git a/app/Contracts/Repository/DatabaseRepositoryInterface.php b/app/Contracts/Repository/DatabaseRepositoryInterface.php index f5d531513..e04c5a862 100644 --- a/app/Contracts/Repository/DatabaseRepositoryInterface.php +++ b/app/Contracts/Repository/DatabaseRepositoryInterface.php @@ -19,7 +19,7 @@ interface DatabaseRepositoryInterface extends RepositoryInterface public function setConnection(string $connection); /** - * Return the connection to execute statements aganist. + * Return the connection to execute statements against. * * @return string */ diff --git a/app/Contracts/Repository/EggRepositoryInterface.php b/app/Contracts/Repository/EggRepositoryInterface.php index 364fd0c6d..2d018eb65 100644 --- a/app/Contracts/Repository/EggRepositoryInterface.php +++ b/app/Contracts/Repository/EggRepositoryInterface.php @@ -57,5 +57,5 @@ interface EggRepositoryInterface extends RepositoryInterface * @param int $service * @return bool */ - public function isCopiableScript(int $copyFromId, int $service): bool; + public function isCopyableScript(int $copyFromId, int $service): bool; } diff --git a/app/Contracts/Repository/NodeRepositoryInterface.php b/app/Contracts/Repository/NodeRepositoryInterface.php index 0ebcbe3a0..c533032c0 100644 --- a/app/Contracts/Repository/NodeRepositoryInterface.php +++ b/app/Contracts/Repository/NodeRepositoryInterface.php @@ -21,6 +21,14 @@ interface NodeRepositoryInterface extends RepositoryInterface, SearchableInterfa */ public function getUsageStats(Node $node): array; + /** + * Return the usage stats for a single node. + * + * @param \Pterodactyl\Models\Node $node + * @return array + */ + public function getUsageStatsRaw(Node $node): array; + /** * Return all available nodes with a searchable interface. * diff --git a/app/Contracts/Repository/RepositoryInterface.php b/app/Contracts/Repository/RepositoryInterface.php index 4a098c34f..1a26eed7e 100644 --- a/app/Contracts/Repository/RepositoryInterface.php +++ b/app/Contracts/Repository/RepositoryInterface.php @@ -29,7 +29,7 @@ interface RepositoryInterface public function getBuilder(); /** - * Returns the colummns to be selected or returned by the query. + * Returns the columns to be selected or returned by the query. * * @return mixed */ @@ -59,7 +59,7 @@ interface RepositoryInterface public function withFreshModel(); /** - * Set wether or not the repository should return a fresh model + * Set whether or not the repository should return a fresh model * when changes are committed. * * @param bool $fresh @@ -200,4 +200,11 @@ interface RepositoryInterface * @return bool */ public function insertIgnore(array $values): bool; + + /** + * Get the amount of entries in the database + * + * @return int + */ + public function count(): int; } diff --git a/app/Contracts/Repository/ServerRepositoryInterface.php b/app/Contracts/Repository/ServerRepositoryInterface.php index dc677fba0..344fa248c 100644 --- a/app/Contracts/Repository/ServerRepositoryInterface.php +++ b/app/Contracts/Repository/ServerRepositoryInterface.php @@ -119,7 +119,7 @@ interface ServerRepositoryInterface extends RepositoryInterface, SearchableInter public function getByUuid(string $uuid): Server; /** - * Return all of the servers that should have a power action performed aganist them. + * Return all of the servers that should have a power action performed against them. * * @param int[] $servers * @param int[] $nodes @@ -145,4 +145,11 @@ interface ServerRepositoryInterface extends RepositoryInterface, SearchableInter * @return bool */ public function isUniqueUuidCombo(string $uuid, string $short): bool; + + /** + * Get the amount of servers that are suspended + * + * @return int + */ + public function getSuspendedServersCount(): int; } diff --git a/app/Contracts/Repository/UserRepositoryInterface.php b/app/Contracts/Repository/UserRepositoryInterface.php index b5003e0b2..41649f48b 100644 --- a/app/Contracts/Repository/UserRepositoryInterface.php +++ b/app/Contracts/Repository/UserRepositoryInterface.php @@ -18,8 +18,8 @@ interface UserRepositoryInterface extends RepositoryInterface, SearchableInterfa /** * Return all matching models for a user in a format that can be used for dropdowns. * - * @param string $query + * @param string|null $query * @return \Illuminate\Support\Collection */ - public function filterUsersByQuery(string $query): Collection; + public function filterUsersByQuery(?string $query): Collection; } diff --git a/app/Http/Controllers/API/Remote/EggRetrievalController.php b/app/Http/Controllers/API/Remote/EggRetrievalController.php index b98a14f3f..2f006b64e 100644 --- a/app/Http/Controllers/API/Remote/EggRetrievalController.php +++ b/app/Http/Controllers/API/Remote/EggRetrievalController.php @@ -41,7 +41,7 @@ class EggRetrievalController extends Controller } /** - * Return a JSON array of Eggs and the SHA1 hash of thier configuration file. + * Return a JSON array of Eggs and the SHA1 hash of their configuration file. * * @return \Illuminate\Http\JsonResponse */ diff --git a/app/Http/Controllers/Admin/ApiController.php b/app/Http/Controllers/Admin/ApiController.php index bbf4bcbf8..2fa541bc7 100644 --- a/app/Http/Controllers/Admin/ApiController.php +++ b/app/Http/Controllers/Admin/ApiController.php @@ -65,6 +65,7 @@ class ApiController extends Controller * Render view allowing an admin to create a new application API key. * * @return \Illuminate\View\View + * @throws \ReflectionException */ public function create(): View { diff --git a/app/Http/Controllers/Admin/LocationController.php b/app/Http/Controllers/Admin/LocationController.php index fbdf64003..9239889cc 100644 --- a/app/Http/Controllers/Admin/LocationController.php +++ b/app/Http/Controllers/Admin/LocationController.php @@ -103,7 +103,6 @@ class LocationController extends Controller * @return \Illuminate\Http\RedirectResponse * * @throws \Throwable - * @throws \Watson\Validating\ValidationException */ public function create(LocationFormRequest $request) { @@ -121,7 +120,6 @@ class LocationController extends Controller * @return \Illuminate\Http\RedirectResponse * * @throws \Throwable - * @throws \Watson\Validating\ValidationException */ public function update(LocationFormRequest $request, Location $location) { diff --git a/app/Http/Controllers/Admin/Nests/EggVariableController.php b/app/Http/Controllers/Admin/Nests/EggVariableController.php index 8b68743fc..df29de5ae 100644 --- a/app/Http/Controllers/Admin/Nests/EggVariableController.php +++ b/app/Http/Controllers/Admin/Nests/EggVariableController.php @@ -90,10 +90,11 @@ class EggVariableController extends Controller * Handle a request to create a new Egg variable. * * @param \Pterodactyl\Http\Requests\Admin\Egg\EggVariableFormRequest $request - * @param \Pterodactyl\Models\Egg $egg + * @param \Pterodactyl\Models\Egg $egg * * @return \Illuminate\Http\RedirectResponse * @throws \Pterodactyl\Exceptions\Model\DataValidationException + * @throws \Pterodactyl\Exceptions\Service\Egg\Variable\BadValidationRuleException * @throws \Pterodactyl\Exceptions\Service\Egg\Variable\ReservedVariableNameException */ public function store(EggVariableFormRequest $request, Egg $egg): RedirectResponse diff --git a/app/Http/Controllers/Admin/ServersController.php b/app/Http/Controllers/Admin/ServersController.php index 8adff82d4..161e8aba6 100644 --- a/app/Http/Controllers/Admin/ServersController.php +++ b/app/Http/Controllers/Admin/ServersController.php @@ -35,6 +35,7 @@ use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface; use Pterodactyl\Contracts\Repository\LocationRepositoryInterface; use Pterodactyl\Contracts\Repository\AllocationRepositoryInterface; +use Pterodactyl\Http\Requests\Admin\Servers\Databases\StoreServerDatabaseRequest; class ServersController extends Controller { @@ -375,9 +376,15 @@ class ServersController extends Controller * * @param \Pterodactyl\Models\Server $server * @return \Illuminate\View\View + * + * @throws \Pterodactyl\Exceptions\DisplayException */ public function viewManage(Server $server) { + if ($server->installed > 1) { + throw new DisplayException('This server is in a failed installation state and must be deleted and recreated.'); + } + return view('admin.servers.view.manage', ['server' => $server]); } @@ -462,6 +469,7 @@ class ServersController extends Controller * * @param \Pterodactyl\Models\Server $server * @return \Illuminate\Http\RedirectResponse + * @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException */ public function rebuildContainer(Server $server) { @@ -540,7 +548,8 @@ class ServersController extends Controller * @param \Pterodactyl\Models\Server $server * @return \Illuminate\Http\RedirectResponse * - * @throws \Pterodactyl\Exceptions\DisplayException + * @throws \Illuminate\Validation\ValidationException + * @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException * @throws \Pterodactyl\Exceptions\Model\DataValidationException * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ @@ -556,15 +565,13 @@ class ServersController extends Controller /** * Creates a new database assigned to a specific server. * - * @param \Illuminate\Http\Request $request - * @param int $server + * @param \Pterodactyl\Http\Requests\Admin\Servers\Databases\StoreServerDatabaseRequest $request + * @param int $server * @return \Illuminate\Http\RedirectResponse * * @throws \Exception - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Pterodactyl\Exceptions\Model\DataValidationException */ - public function newDatabase(Request $request, $server) + public function newDatabase(StoreServerDatabaseRequest $request, $server) { $this->databaseManagementService->create($server, [ 'database' => $request->input('database'), diff --git a/app/Http/Controllers/Admin/Settings/AdvancedController.php b/app/Http/Controllers/Admin/Settings/AdvancedController.php index f8249acd3..f32517e7a 100644 --- a/app/Http/Controllers/Admin/Settings/AdvancedController.php +++ b/app/Http/Controllers/Admin/Settings/AdvancedController.php @@ -76,6 +76,8 @@ class AdvancedController extends Controller /** * @param \Pterodactyl\Http\Requests\Admin\Settings\AdvancedSettingsFormRequest $request * @return \Illuminate\Http\RedirectResponse + * @throws \Pterodactyl\Exceptions\Model\DataValidationException + * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ public function update(AdvancedSettingsFormRequest $request): RedirectResponse { diff --git a/app/Http/Controllers/Admin/Settings/IndexController.php b/app/Http/Controllers/Admin/Settings/IndexController.php index 604684da4..bb9aef3e4 100644 --- a/app/Http/Controllers/Admin/Settings/IndexController.php +++ b/app/Http/Controllers/Admin/Settings/IndexController.php @@ -74,6 +74,8 @@ class IndexController extends Controller * * @param \Pterodactyl\Http\Requests\Admin\Settings\BaseSettingsFormRequest $request * @return \Illuminate\Http\RedirectResponse + * @throws \Pterodactyl\Exceptions\Model\DataValidationException + * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ public function update(BaseSettingsFormRequest $request): RedirectResponse { diff --git a/app/Http/Controllers/Admin/Settings/MailController.php b/app/Http/Controllers/Admin/Settings/MailController.php index 0e5a1d737..f0b4495a4 100644 --- a/app/Http/Controllers/Admin/Settings/MailController.php +++ b/app/Http/Controllers/Admin/Settings/MailController.php @@ -83,7 +83,9 @@ class MailController extends Controller * @param \Pterodactyl\Http\Requests\Admin\Settings\MailSettingsFormRequest $request * @return \Illuminate\Http\RedirectResponse * - * @throws \Pterodactyl\Exceptions\DisplayException + * @throws DisplayException + * @throws \Pterodactyl\Exceptions\Model\DataValidationException + * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ public function update(MailSettingsFormRequest $request): RedirectResponse { diff --git a/app/Http/Controllers/Admin/StatisticsController.php b/app/Http/Controllers/Admin/StatisticsController.php new file mode 100644 index 000000000..2327fd88d --- /dev/null +++ b/app/Http/Controllers/Admin/StatisticsController.php @@ -0,0 +1,101 @@ +allocationRepository = $allocationRepository; + $this->databaseRepository = $databaseRepository; + $this->eggRepository = $eggRepository; + $this->nodeRepository = $nodeRepository; + $this->serverRepository = $serverRepository; + $this->userRepository = $userRepository; + } + + public function index() + { + $servers = $this->serverRepository->all(); + $nodes = $this->nodeRepository->all(); + $usersCount = $this->userRepository->count(); + $eggsCount = $this->eggRepository->count(); + $databasesCount = $this->databaseRepository->count(); + $totalAllocations = $this->allocationRepository->count(); + $suspendedServersCount = $this->serverRepository->getSuspendedServersCount(); + + $totalServerRam = 0; + $totalNodeRam = 0; + $totalServerDisk = 0; + $totalNodeDisk = 0; + foreach ($nodes as $node) { + $stats = $this->nodeRepository->getUsageStatsRaw($node); + $totalServerRam += $stats['memory']['value']; + $totalNodeRam += $stats['memory']['max']; + $totalServerDisk += $stats['disk']['value']; + $totalNodeDisk += $stats['disk']['max']; + } + + $tokens = []; + foreach ($nodes as $node) { + $tokens[$node->id] = $node->daemonSecret; + } + + $this->injectJavascript([ + 'servers' => $servers, + 'suspendedServers' => $suspendedServersCount, + 'totalServerRam' => $totalServerRam, + 'totalNodeRam' => $totalNodeRam, + 'totalServerDisk' => $totalServerDisk, + 'totalNodeDisk' => $totalNodeDisk, + 'nodes' => $nodes, + 'tokens' => $tokens, + ]); + + return view('admin.statistics', [ + 'servers' => $servers, + 'nodes' => $nodes, + 'usersCount' => $usersCount, + 'eggsCount' => $eggsCount, + 'totalServerRam' => $totalServerRam, + 'databasesCount' => $databasesCount, + 'totalNodeRam' => $totalNodeRam, + 'totalNodeDisk' => $totalNodeDisk, + 'totalServerDisk' => $totalServerDisk, + 'totalAllocations' => $totalAllocations, + ]); + } + +} diff --git a/app/Http/Controllers/Api/Application/Servers/DatabaseController.php b/app/Http/Controllers/Api/Application/Servers/DatabaseController.php index 05512a4ee..ce86cc4d7 100644 --- a/app/Http/Controllers/Api/Application/Servers/DatabaseController.php +++ b/app/Http/Controllers/Api/Application/Servers/DatabaseController.php @@ -104,8 +104,6 @@ class DatabaseController extends ApplicationApiController * @return \Illuminate\Http\JsonResponse * * @throws \Exception - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Pterodactyl\Exceptions\Model\DataValidationException */ public function store(StoreServerDatabaseRequest $request): JsonResponse { diff --git a/app/Http/Controllers/Base/SecurityController.php b/app/Http/Controllers/Base/SecurityController.php index 583d83611..3bb85a0b5 100644 --- a/app/Http/Controllers/Base/SecurityController.php +++ b/app/Http/Controllers/Base/SecurityController.php @@ -96,7 +96,7 @@ class SecurityController extends Controller } /** - * Verifies that 2FA token recieved is valid and will work on the account. + * Verifies that 2FA token received is valid and will work on the account. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response diff --git a/app/Http/Controllers/Server/Files/FileActionsController.php b/app/Http/Controllers/Server/Files/FileActionsController.php index ca3c093aa..bd63009a6 100644 --- a/app/Http/Controllers/Server/Files/FileActionsController.php +++ b/app/Http/Controllers/Server/Files/FileActionsController.php @@ -101,7 +101,7 @@ class FileActionsController extends Controller { $server = $request->attributes->get('server'); - $dirname = pathinfo($file, PATHINFO_DIRNAME); + $dirname = str_replace('\\', '/', pathinfo($file, PATHINFO_DIRNAME)); try { $content = $this->repository->setServer($server)->setToken($request->attributes->get('server_token'))->getContent($file); } catch (RequestException $exception) { diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index b6d44530e..d21c8d3c8 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -2,6 +2,7 @@ namespace Pterodactyl\Http; +use Pterodactyl\Http\Middleware\MaintenanceMiddleware; use Pterodactyl\Models\ApiKey; use Illuminate\Auth\Middleware\Authorize; use Illuminate\Auth\Middleware\Authenticate; @@ -108,10 +109,11 @@ class Kernel extends HttpKernel 'can' => Authorize::class, 'bindings' => SubstituteBindings::class, 'recaptcha' => VerifyReCaptcha::class, + 'node.maintenance' => MaintenanceMiddleware::class, // Server specific middleware (used for authenticating access to resources) // - // These are only used for individual server authentication, and not gloabl + // These are only used for individual server authentication, and not global // actions from other resources. They are defined in the route files. 'server..database' => DatabaseBelongsToServer::class, 'server..subuser' => SubuserBelongsToServer::class, diff --git a/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php b/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php index 48da8a74d..ddcd29484 100644 --- a/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php +++ b/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php @@ -10,7 +10,7 @@ class AuthenticateApplicationUser { /** * Authenticate that the currently authenticated user is an administrator - * and should be allowed to proceede through the application API. + * and should be allowed to proceed through the application API. * * @param \Illuminate\Http\Request $request * @param \Closure $next diff --git a/app/Http/Middleware/MaintenanceMiddleware.php b/app/Http/Middleware/MaintenanceMiddleware.php new file mode 100644 index 000000000..c67a3f051 --- /dev/null +++ b/app/Http/Middleware/MaintenanceMiddleware.php @@ -0,0 +1,44 @@ +response = $response; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + /** @var \Pterodactyl\Models\Server $server */ + $server = $request->attributes->get('server'); + $node = $server->getRelation('node'); + + if ($node->maintenance_mode) { + return $this->response->view('errors.maintenance'); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/RequireTwoFactorAuthentication.php b/app/Http/Middleware/RequireTwoFactorAuthentication.php index 266983471..aee1cf068 100644 --- a/app/Http/Middleware/RequireTwoFactorAuthentication.php +++ b/app/Http/Middleware/RequireTwoFactorAuthentication.php @@ -25,7 +25,7 @@ class RequireTwoFactorAuthentication private $alert; /** - * The names of routes that should be accessable without 2FA enabled. + * The names of routes that should be accessible without 2FA enabled. * * @var array */ diff --git a/app/Http/Middleware/Server/AuthenticateAsSubuser.php b/app/Http/Middleware/Server/AuthenticateAsSubuser.php index 1a185bb6e..ebf9cd622 100644 --- a/app/Http/Middleware/Server/AuthenticateAsSubuser.php +++ b/app/Http/Middleware/Server/AuthenticateAsSubuser.php @@ -33,7 +33,7 @@ class AuthenticateAsSubuser } /** - * Determine if a subuser has permissions to access a server, if so set thier access token. + * Determine if a subuser has permissions to access a server, if so set their access token. * * @param \Illuminate\Http\Request $request * @param \Closure $next diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index f44f1d6eb..3dff63eeb 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -15,15 +15,9 @@ class TrustProxies extends Middleware protected $proxies; /** - * The current proxy header mappings. + * The headers that should be used to detect proxies. * - * @var array + * @var int */ - protected $headers = [ - Request::HEADER_FORWARDED => 'FORWARDED', - Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR', - Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST', - Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT', - Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO', - ]; + protected $headers = Request::HEADER_X_FORWARDED_ALL; } diff --git a/app/Http/Requests/Admin/Api/StoreApplicationApiKeyRequest.php b/app/Http/Requests/Admin/Api/StoreApplicationApiKeyRequest.php index 372dd115d..2549517cf 100644 --- a/app/Http/Requests/Admin/Api/StoreApplicationApiKeyRequest.php +++ b/app/Http/Requests/Admin/Api/StoreApplicationApiKeyRequest.php @@ -10,13 +10,15 @@ class StoreApplicationApiKeyRequest extends AdminFormRequest { /** * @return array + * @throws \ReflectionException + * @throws \ReflectionException */ public function rules() { $modelRules = ApiKey::getCreateRules(); return collect(AdminAcl::getResourceList())->mapWithKeys(function ($resource) use ($modelRules) { - return [AdminAcl::COLUMN_IDENTIFER . $resource => $modelRules['r_' . $resource]]; + return [AdminAcl::COLUMN_IDENTIFIER . $resource => $modelRules['r_' . $resource]]; })->merge(['memo' => $modelRules['memo']])->toArray(); } @@ -33,7 +35,7 @@ class StoreApplicationApiKeyRequest extends AdminFormRequest public function getKeyPermissions(): array { return collect($this->validated())->filter(function ($value, $key) { - return substr($key, 0, strlen(AdminAcl::COLUMN_IDENTIFER)) === AdminAcl::COLUMN_IDENTIFER; + return substr($key, 0, strlen(AdminAcl::COLUMN_IDENTIFIER)) === AdminAcl::COLUMN_IDENTIFIER; })->toArray(); } } diff --git a/app/Http/Requests/Admin/Servers/Databases/StoreServerDatabaseRequest.php b/app/Http/Requests/Admin/Servers/Databases/StoreServerDatabaseRequest.php new file mode 100644 index 000000000..7f08ecd08 --- /dev/null +++ b/app/Http/Requests/Admin/Servers/Databases/StoreServerDatabaseRequest.php @@ -0,0 +1,22 @@ + 'required|string|min:1|max:24', + 'remote' => 'required|string|regex:/^[0-9%.]{1,15}$/', + 'database_host_id' => 'required|integer|exists:database_hosts,id', + ]; + } +} diff --git a/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php b/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php index 5a2e2ee8e..92a23272f 100644 --- a/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php +++ b/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php @@ -8,7 +8,7 @@ use Pterodactyl\Http\Requests\Admin\AdminFormRequest; class MailSettingsFormRequest extends AdminFormRequest { /** - * Return rules to validate mail settings POST data aganist. + * Return rules to validate mail settings POST data against. * * @return array */ diff --git a/app/Http/Requests/Api/Application/ApplicationApiRequest.php b/app/Http/Requests/Api/Application/ApplicationApiRequest.php index 084a89bdd..ca5f40dd0 100644 --- a/app/Http/Requests/Api/Application/ApplicationApiRequest.php +++ b/app/Http/Requests/Api/Application/ApplicationApiRequest.php @@ -38,7 +38,7 @@ abstract class ApplicationApiRequest extends FormRequest /** * Determine if the current user is authorized to perform - * the requested action aganist the API. + * the requested action against the API. * * @return bool * diff --git a/app/Http/Requests/Api/Application/Locations/StoreLocationRequest.php b/app/Http/Requests/Api/Application/Locations/StoreLocationRequest.php index 5a71883a3..317b6c540 100644 --- a/app/Http/Requests/Api/Application/Locations/StoreLocationRequest.php +++ b/app/Http/Requests/Api/Application/Locations/StoreLocationRequest.php @@ -19,7 +19,7 @@ class StoreLocationRequest extends ApplicationApiRequest protected $permission = AdminAcl::WRITE; /** - * Rules to validate the request aganist. + * Rules to validate the request against. * * @return array */ diff --git a/app/Http/Requests/Api/Application/Locations/UpdateLocationRequest.php b/app/Http/Requests/Api/Application/Locations/UpdateLocationRequest.php index c65a6f904..b29c1c334 100644 --- a/app/Http/Requests/Api/Application/Locations/UpdateLocationRequest.php +++ b/app/Http/Requests/Api/Application/Locations/UpdateLocationRequest.php @@ -20,7 +20,7 @@ class UpdateLocationRequest extends StoreLocationRequest } /** - * Rules to validate this request aganist. + * Rules to validate this request against. * * @return array */ diff --git a/app/Http/Requests/Api/Application/Servers/Databases/StoreServerDatabaseRequest.php b/app/Http/Requests/Api/Application/Servers/Databases/StoreServerDatabaseRequest.php index 5a199b80e..ee4264a9d 100644 --- a/app/Http/Requests/Api/Application/Servers/Databases/StoreServerDatabaseRequest.php +++ b/app/Http/Requests/Api/Application/Servers/Databases/StoreServerDatabaseRequest.php @@ -26,7 +26,7 @@ class StoreServerDatabaseRequest extends ApplicationApiRequest { return [ 'database' => 'required|string|min:1|max:24', - 'remote' => 'required|string|min:1', + 'remote' => 'required|string|regex:/^[0-9%.]{1,15}$/', 'host' => 'required|integer|exists:database_hosts,id', ]; } diff --git a/app/Http/Requests/Api/Application/Servers/UpdateServerBuildConfigurationRequest.php b/app/Http/Requests/Api/Application/Servers/UpdateServerBuildConfigurationRequest.php index 076abdf4a..d3d4a8b21 100644 --- a/app/Http/Requests/Api/Application/Servers/UpdateServerBuildConfigurationRequest.php +++ b/app/Http/Requests/Api/Application/Servers/UpdateServerBuildConfigurationRequest.php @@ -7,7 +7,7 @@ use Pterodactyl\Models\Server; class UpdateServerBuildConfigurationRequest extends ServerWriteRequest { /** - * Return the rules to validate this request aganist. + * Return the rules to validate this request against. * * @return array */ diff --git a/app/Http/Requests/Api/Application/Servers/UpdateServerStartupRequest.php b/app/Http/Requests/Api/Application/Servers/UpdateServerStartupRequest.php index d337cb4dd..acb6043c1 100644 --- a/app/Http/Requests/Api/Application/Servers/UpdateServerStartupRequest.php +++ b/app/Http/Requests/Api/Application/Servers/UpdateServerStartupRequest.php @@ -19,7 +19,7 @@ class UpdateServerStartupRequest extends ApplicationApiRequest protected $permission = AdminAcl::WRITE; /** - * Validation rules to run the input aganist. + * Validation rules to run the input against. * * @return array */ diff --git a/app/Http/Requests/Api/Client/ClientApiRequest.php b/app/Http/Requests/Api/Client/ClientApiRequest.php index ed63ccbf0..92402e513 100644 --- a/app/Http/Requests/Api/Client/ClientApiRequest.php +++ b/app/Http/Requests/Api/Client/ClientApiRequest.php @@ -8,7 +8,7 @@ abstract class ClientApiRequest extends ApplicationApiRequest { /** * Determine if the current user is authorized to perform - * the requested action aganist the API. + * the requested action against the API. * * @return bool */ diff --git a/app/Http/Requests/Api/Client/Servers/SendCommandRequest.php b/app/Http/Requests/Api/Client/Servers/SendCommandRequest.php index 788f97739..22feb2afe 100644 --- a/app/Http/Requests/Api/Client/Servers/SendCommandRequest.php +++ b/app/Http/Requests/Api/Client/Servers/SendCommandRequest.php @@ -17,7 +17,7 @@ class SendCommandRequest extends GetServerRequest } /** - * Rules to validate this request aganist. + * Rules to validate this request against. * * @return array */ diff --git a/app/Http/Requests/Api/Client/Servers/SendPowerRequest.php b/app/Http/Requests/Api/Client/Servers/SendPowerRequest.php index 19614d182..7a32c117b 100644 --- a/app/Http/Requests/Api/Client/Servers/SendPowerRequest.php +++ b/app/Http/Requests/Api/Client/Servers/SendPowerRequest.php @@ -18,7 +18,7 @@ class SendPowerRequest extends ClientApiRequest } /** - * Rules to validate this request aganist. + * Rules to validate this request against. * * @return array */ diff --git a/app/Http/Requests/Base/StoreAccountKeyRequest.php b/app/Http/Requests/Base/StoreAccountKeyRequest.php index ab3906636..2cfc22786 100644 --- a/app/Http/Requests/Base/StoreAccountKeyRequest.php +++ b/app/Http/Requests/Base/StoreAccountKeyRequest.php @@ -7,7 +7,7 @@ use Pterodactyl\Http\Requests\FrontendUserFormRequest; class StoreAccountKeyRequest extends FrontendUserFormRequest { /** - * Rules to validate the request input aganist before storing + * Rules to validate the request input against before storing * an account API key. * * @return array diff --git a/app/Http/Requests/Server/Database/DeleteServerDatabaseRequest.php b/app/Http/Requests/Server/Database/DeleteServerDatabaseRequest.php index f2c81d9c8..eed54e2e4 100644 --- a/app/Http/Requests/Server/Database/DeleteServerDatabaseRequest.php +++ b/app/Http/Requests/Server/Database/DeleteServerDatabaseRequest.php @@ -19,7 +19,7 @@ class DeleteServerDatabaseRequest extends ServerFormRequest } /** - * Return the user permission to validate this request aganist. + * Return the user permission to validate this request against. * * @return string */ @@ -29,7 +29,7 @@ class DeleteServerDatabaseRequest extends ServerFormRequest } /** - * Rules to validate this request aganist. + * Rules to validate this request against. * * @return array */ diff --git a/app/Http/Requests/Server/Database/StoreServerDatabaseRequest.php b/app/Http/Requests/Server/Database/StoreServerDatabaseRequest.php index 2af23a914..1c2fe4afd 100644 --- a/app/Http/Requests/Server/Database/StoreServerDatabaseRequest.php +++ b/app/Http/Requests/Server/Database/StoreServerDatabaseRequest.php @@ -19,7 +19,7 @@ class StoreServerDatabaseRequest extends ServerFormRequest } /** - * Return the user permission to validate this request aganist. + * Return the user permission to validate this request against. * * @return string */ @@ -29,7 +29,7 @@ class StoreServerDatabaseRequest extends ServerFormRequest } /** - * Rules to validate this request aganist. + * Rules to validate this request against. * * @return array */ diff --git a/app/Http/Requests/Server/ScheduleCreationFormRequest.php b/app/Http/Requests/Server/ScheduleCreationFormRequest.php index a90dd749a..6291d3cb3 100644 --- a/app/Http/Requests/Server/ScheduleCreationFormRequest.php +++ b/app/Http/Requests/Server/ScheduleCreationFormRequest.php @@ -12,7 +12,7 @@ namespace Pterodactyl\Http\Requests\Server; class ScheduleCreationFormRequest extends ServerFormRequest { /** - * Permission to validate this request aganist. + * Permission to validate this request against. * * @return string */ diff --git a/app/Http/Requests/Server/ServerFormRequest.php b/app/Http/Requests/Server/ServerFormRequest.php index f59ea3ae3..c0ca370b7 100644 --- a/app/Http/Requests/Server/ServerFormRequest.php +++ b/app/Http/Requests/Server/ServerFormRequest.php @@ -8,7 +8,7 @@ use Pterodactyl\Http\Requests\FrontendUserFormRequest; abstract class ServerFormRequest extends FrontendUserFormRequest { /** - * Return the user permission to validate this request aganist. + * Return the user permission to validate this request against. * * @return string */ diff --git a/app/Http/Requests/Server/Subuser/SubuserStoreFormRequest.php b/app/Http/Requests/Server/Subuser/SubuserStoreFormRequest.php index 861732e81..0ada01675 100644 --- a/app/Http/Requests/Server/Subuser/SubuserStoreFormRequest.php +++ b/app/Http/Requests/Server/Subuser/SubuserStoreFormRequest.php @@ -7,7 +7,7 @@ use Pterodactyl\Http\Requests\Server\ServerFormRequest; class SubuserStoreFormRequest extends ServerFormRequest { /** - * Return the user permission to validate this request aganist. + * Return the user permission to validate this request against. * * @return string */ @@ -17,7 +17,7 @@ class SubuserStoreFormRequest extends ServerFormRequest } /** - * The rules to validate this request submission aganist. + * The rules to validate this request submission against. * * @return array */ diff --git a/app/Http/Requests/Server/Subuser/SubuserUpdateFormRequest.php b/app/Http/Requests/Server/Subuser/SubuserUpdateFormRequest.php index 284b87553..7ff82abcb 100644 --- a/app/Http/Requests/Server/Subuser/SubuserUpdateFormRequest.php +++ b/app/Http/Requests/Server/Subuser/SubuserUpdateFormRequest.php @@ -7,7 +7,7 @@ use Pterodactyl\Http\Requests\Server\ServerFormRequest; class SubuserUpdateFormRequest extends ServerFormRequest { /** - * Return the user permission to validate this request aganist. + * Return the user permission to validate this request against. * * @return string */ @@ -17,7 +17,7 @@ class SubuserUpdateFormRequest extends ServerFormRequest } /** - * The rules to validate this request submission aganist. + * The rules to validate this request submission against. * * @return array */ diff --git a/app/Http/Requests/Server/UpdateFileContentsFormRequest.php b/app/Http/Requests/Server/UpdateFileContentsFormRequest.php index 0ebaa25b6..7ded39bc0 100644 --- a/app/Http/Requests/Server/UpdateFileContentsFormRequest.php +++ b/app/Http/Requests/Server/UpdateFileContentsFormRequest.php @@ -20,7 +20,7 @@ use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException; class UpdateFileContentsFormRequest extends ServerFormRequest { /** - * Return the permission string to validate this request aganist. + * Return the permission string to validate this request against. * * @return string */ diff --git a/app/Jobs/Schedule/RunTaskJob.php b/app/Jobs/Schedule/RunTaskJob.php index a00052b1a..a7fd8486b 100644 --- a/app/Jobs/Schedule/RunTaskJob.php +++ b/app/Jobs/Schedule/RunTaskJob.php @@ -92,7 +92,7 @@ class RunTaskJob extends Job implements ShouldQueue return; } - // Perform the provided task aganist the daemon. + // Perform the provided task against the daemon. switch ($task->action) { case 'power': $this->powerRepository->setServer($server) diff --git a/app/Models/ApiKey.php b/app/Models/ApiKey.php index bd05454dd..797522c39 100644 --- a/app/Models/ApiKey.php +++ b/app/Models/ApiKey.php @@ -95,7 +95,7 @@ class ApiKey extends Model implements CleansAttributes, ValidableContract ]; /** - * Rules to protect aganist invalid data entry to DB. + * Rules to protect against invalid data entry to DB. * * @var array */ diff --git a/app/Models/DatabaseHost.php b/app/Models/DatabaseHost.php index f42f2650d..c564f725b 100644 --- a/app/Models/DatabaseHost.php +++ b/app/Models/DatabaseHost.php @@ -90,7 +90,7 @@ class DatabaseHost extends Model implements CleansAttributes, ValidableContract } /** - * Gets the databases assocaited with this host. + * Gets the databases associated with this host. * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ diff --git a/app/Models/EggVariable.php b/app/Models/EggVariable.php index 293b86c4b..bfc9ac64f 100644 --- a/app/Models/EggVariable.php +++ b/app/Models/EggVariable.php @@ -82,6 +82,7 @@ class EggVariable extends Model implements CleansAttributes, ValidableContract ]; /** + * @param $value * @return bool */ public function getRequiredAttribute($value) diff --git a/app/Models/Location.php b/app/Models/Location.php index c680a54da..10fff147c 100644 --- a/app/Models/Location.php +++ b/app/Models/Location.php @@ -53,7 +53,7 @@ class Location extends Model implements CleansAttributes, ValidableContract ]; /** - * Gets the nodes in a specificed location. + * Gets the nodes in a specified location. * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ diff --git a/app/Models/Node.php b/app/Models/Node.php index 26d9eb443..2643d062a 100644 --- a/app/Models/Node.php +++ b/app/Models/Node.php @@ -48,6 +48,7 @@ class Node extends Model implements CleansAttributes, ValidableContract 'daemonSFTP' => 'integer', 'behind_proxy' => 'boolean', 'public' => 'boolean', + 'maintenance_mode' => 'boolean', ]; /** @@ -62,7 +63,7 @@ class Node extends Model implements CleansAttributes, ValidableContract 'disk_overallocate', 'upload_size', 'daemonSecret', 'daemonBase', 'daemonSFTP', 'daemonListen', - 'description', + 'description', 'maintenance_mode', ]; /** @@ -111,6 +112,7 @@ class Node extends Model implements CleansAttributes, ValidableContract 'daemonBase' => 'regex:/^([\/][\d\w.\-\/]+)$/', 'daemonSFTP' => 'numeric|between:1024,65535', 'daemonListen' => 'numeric|between:1024,65535', + 'maintenance_mode' => 'boolean', ]; /** @@ -126,6 +128,7 @@ class Node extends Model implements CleansAttributes, ValidableContract 'daemonBase' => '/srv/daemon-data', 'daemonSFTP' => 2022, 'daemonListen' => 8080, + 'maintenance_mode' => false, ]; /** diff --git a/app/Models/User.php b/app/Models/User.php index aff4f3287..6732b23af 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -188,7 +188,7 @@ class User extends Model implements } /** - * Store the username as a lowecase string. + * Store the username as a lowercase string. * * @param string $value */ @@ -198,7 +198,7 @@ class User extends Model implements } /** - * Return a concated result for the accounts full name. + * Return a concatenated result for the accounts full name. * * @return string */ diff --git a/app/Notifications/AccountCreated.php b/app/Notifications/AccountCreated.php index 8312c3bd1..29b084d5e 100644 --- a/app/Notifications/AccountCreated.php +++ b/app/Notifications/AccountCreated.php @@ -60,7 +60,7 @@ class AccountCreated extends Notification implements ShouldQueue { $message = (new MailMessage) ->greeting('Hello ' . $this->user->name . '!') - ->line('You are recieving this email because an account has been created for you on ' . config('app.name') . '.') + ->line('You are receiving this email because an account has been created for you on ' . config('app.name') . '.') ->line('Username: ' . $this->user->username) ->line('Email: ' . $this->user->email); diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 947750ae8..e147736ed 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -17,8 +17,6 @@ class AuthServiceProvider extends ServiceProvider /** * Register any application authentication / authorization services. - * - * @param \Illuminate\Contracts\Auth\Access\Gate $gate */ public function boot() { diff --git a/app/Providers/HashidsServiceProvider.php b/app/Providers/HashidsServiceProvider.php index ae16d8756..f2b3935d8 100644 --- a/app/Providers/HashidsServiceProvider.php +++ b/app/Providers/HashidsServiceProvider.php @@ -27,7 +27,7 @@ class HashidsServiceProvider extends ServiceProvider return new Hashids( $config->get('hashids.salt', ''), $config->get('hashids.length', 0), - $config->get('hashids.alphabet', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890') + $config->get('hashids.alphabet', 'abcdefghijkmlnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890') ); }); diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 3de307d9a..f0e978116 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -33,7 +33,7 @@ class RouteServiceProvider extends ServiceProvider ->namespace($this->namespace . '\Auth') ->group(base_path('routes/auth.php')); - Route::middleware(['web', 'csrf', 'auth', 'server', 'subuser.auth'])->prefix('/server/{server}') + Route::middleware(['web', 'csrf', 'auth', 'server', 'subuser.auth', 'node.maintenance'])->prefix('/server/{server}') ->namespace($this->namespace . '\Server') ->group(base_path('routes/server.php')); diff --git a/app/Providers/SettingsServiceProvider.php b/app/Providers/SettingsServiceProvider.php index 1b9596d80..48861db4b 100644 --- a/app/Providers/SettingsServiceProvider.php +++ b/app/Providers/SettingsServiceProvider.php @@ -2,7 +2,7 @@ namespace Pterodactyl\Providers; -use Illuminate\Contracts\Logging\Log; +use Psr\Log\LoggerInterface as Log; use Illuminate\Database\QueryException; use Illuminate\Support\ServiceProvider; use Illuminate\Contracts\Encryption\Encrypter; @@ -62,7 +62,7 @@ class SettingsServiceProvider extends ServiceProvider * * @param \Illuminate\Contracts\Config\Repository $config * @param \Illuminate\Contracts\Encryption\Encrypter $encrypter - * @param \Illuminate\Contracts\Logging\Log $log + * @param \Psr\Log\LoggerInterface $log * @param \Pterodactyl\Contracts\Repository\SettingsRepositoryInterface $settings */ public function boot(ConfigRepository $config, Encrypter $encrypter, Log $log, SettingsRepositoryInterface $settings) diff --git a/app/Repositories/Daemon/CommandRepository.php b/app/Repositories/Daemon/CommandRepository.php index 7b7577b32..cd123cd89 100644 --- a/app/Repositories/Daemon/CommandRepository.php +++ b/app/Repositories/Daemon/CommandRepository.php @@ -12,6 +12,7 @@ class CommandRepository extends BaseRepository implements CommandRepositoryInter * * @param string $command * @return \Psr\Http\Message\ResponseInterface + * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(string $command): ResponseInterface { diff --git a/app/Repositories/Daemon/ConfigurationRepository.php b/app/Repositories/Daemon/ConfigurationRepository.php index ff44e3031..3905335a5 100644 --- a/app/Repositories/Daemon/ConfigurationRepository.php +++ b/app/Repositories/Daemon/ConfigurationRepository.php @@ -12,6 +12,7 @@ class ConfigurationRepository extends BaseRepository implements ConfigurationRep * * @param array $overrides * @return \Psr\Http\Message\ResponseInterface + * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(array $overrides = []): ResponseInterface { diff --git a/app/Repositories/Daemon/FileRepository.php b/app/Repositories/Daemon/FileRepository.php index 8350e402f..46117f3c5 100644 --- a/app/Repositories/Daemon/FileRepository.php +++ b/app/Repositories/Daemon/FileRepository.php @@ -14,11 +14,11 @@ class FileRepository extends BaseRepository implements FileRepositoryInterface * @param string $path * @return \stdClass * - * @throws \GuzzleHttp\Exception\RequestException + * @throws \GuzzleHttp\Exception\GuzzleException */ public function getFileStat(string $path): stdClass { - $file = pathinfo($path); + $file = str_replace('\\', '/', pathinfo($path)); $file['dirname'] = in_array($file['dirname'], ['.', './', '/']) ? null : trim($file['dirname'], '/') . '/'; $response = $this->getHttpClient()->request('GET', sprintf( @@ -35,11 +35,11 @@ class FileRepository extends BaseRepository implements FileRepositoryInterface * @param string $path * @return string * - * @throws \GuzzleHttp\Exception\RequestException + * @throws \GuzzleHttp\Exception\GuzzleException */ public function getContent(string $path): string { - $file = pathinfo($path); + $file = str_replace('\\', '/', pathinfo($path)); $file['dirname'] = in_array($file['dirname'], ['.', './', '/']) ? null : trim($file['dirname'], '/') . '/'; $response = $this->getHttpClient()->request('GET', sprintf( @@ -57,11 +57,11 @@ class FileRepository extends BaseRepository implements FileRepositoryInterface * @param string $content * @return \Psr\Http\Message\ResponseInterface * - * @throws \GuzzleHttp\Exception\RequestException + * @throws \GuzzleHttp\Exception\GuzzleException */ public function putContent(string $path, string $content): ResponseInterface { - $file = pathinfo($path); + $file = str_replace('\\', '/', pathinfo($path)); $file['dirname'] = in_array($file['dirname'], ['.', './', '/']) ? null : trim($file['dirname'], '/') . '/'; return $this->getHttpClient()->request('POST', 'server/file/save', [ @@ -78,7 +78,7 @@ class FileRepository extends BaseRepository implements FileRepositoryInterface * @param string $path * @return array * - * @throws \GuzzleHttp\Exception\RequestException + * @throws \GuzzleHttp\Exception\GuzzleException */ public function getDirectory(string $path): array { @@ -100,7 +100,7 @@ class FileRepository extends BaseRepository implements FileRepositoryInterface array_push($files, [ 'entry' => $value->name, 'directory' => trim($path, '/'), - 'extension' => pathinfo($value->name, PATHINFO_EXTENSION), + 'extension' => str_replace('\\', '/', pathinfo($value->name, PATHINFO_EXTENSION)), 'size' => human_readable($value->size), 'date' => strtotime($value->modified), 'mime' => $value->mime, diff --git a/app/Repositories/Daemon/PowerRepository.php b/app/Repositories/Daemon/PowerRepository.php index 20fc79338..d7ce8d5e5 100644 --- a/app/Repositories/Daemon/PowerRepository.php +++ b/app/Repositories/Daemon/PowerRepository.php @@ -14,7 +14,8 @@ class PowerRepository extends BaseRepository implements PowerRepositoryInterface * @param string $signal * @return \Psr\Http\Message\ResponseInterface * - * @throws \Pterodactyl\Exceptions\Repository\Daemon\InvalidPowerSignalException + * @throws InvalidPowerSignalException + * @throws \GuzzleHttp\Exception\GuzzleException */ public function sendSignal(string $signal): ResponseInterface { diff --git a/app/Repositories/Daemon/ServerRepository.php b/app/Repositories/Daemon/ServerRepository.php index cf5a5a69a..f1bd445fc 100644 --- a/app/Repositories/Daemon/ServerRepository.php +++ b/app/Repositories/Daemon/ServerRepository.php @@ -15,7 +15,7 @@ class ServerRepository extends BaseRepository implements ServerRepositoryInterfa * @param array $overrides * @return \Psr\Http\Message\ResponseInterface * - * @throws \GuzzleHttp\Exception\RequestException + * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $structure, array $overrides = []): ResponseInterface { @@ -33,6 +33,7 @@ class ServerRepository extends BaseRepository implements ServerRepositoryInterfa * * @param array $data * @return \Psr\Http\Message\ResponseInterface + * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(array $data): ResponseInterface { @@ -46,6 +47,7 @@ class ServerRepository extends BaseRepository implements ServerRepositoryInterfa * * @param array|null $data * @return \Psr\Http\Message\ResponseInterface + * @throws \GuzzleHttp\Exception\GuzzleException */ public function reinstall(array $data = null): ResponseInterface { @@ -58,6 +60,7 @@ class ServerRepository extends BaseRepository implements ServerRepositoryInterfa * Mark a server as needing a container rebuild the next time the server is booted. * * @return \Psr\Http\Message\ResponseInterface + * @throws \GuzzleHttp\Exception\GuzzleException */ public function rebuild(): ResponseInterface { @@ -68,6 +71,7 @@ class ServerRepository extends BaseRepository implements ServerRepositoryInterfa * Suspend a server on the daemon. * * @return \Psr\Http\Message\ResponseInterface + * @throws \GuzzleHttp\Exception\GuzzleException */ public function suspend(): ResponseInterface { @@ -78,6 +82,7 @@ class ServerRepository extends BaseRepository implements ServerRepositoryInterfa * Un-suspend a server on the daemon. * * @return \Psr\Http\Message\ResponseInterface + * @throws \GuzzleHttp\Exception\GuzzleException */ public function unsuspend(): ResponseInterface { @@ -88,6 +93,7 @@ class ServerRepository extends BaseRepository implements ServerRepositoryInterfa * Delete a server on the daemon. * * @return \Psr\Http\Message\ResponseInterface + * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(): ResponseInterface { @@ -95,9 +101,10 @@ class ServerRepository extends BaseRepository implements ServerRepositoryInterfa } /** - * Return detials on a specific server. + * Return details on a specific server. * * @return \Psr\Http\Message\ResponseInterface + * @throws \GuzzleHttp\Exception\GuzzleException */ public function details(): ResponseInterface { @@ -110,7 +117,7 @@ class ServerRepository extends BaseRepository implements ServerRepositoryInterfa * @param string|array $key * @return \Psr\Http\Message\ResponseInterface * - * @throws \GuzzleHttp\Exception\RequestException + * @throws \GuzzleHttp\Exception\GuzzleException */ public function revokeAccessKey($key): ResponseInterface { diff --git a/app/Repositories/Eloquent/AllocationRepository.php b/app/Repositories/Eloquent/AllocationRepository.php index a47134e4c..a9721ac09 100644 --- a/app/Repositories/Eloquent/AllocationRepository.php +++ b/app/Repositories/Eloquent/AllocationRepository.php @@ -97,7 +97,7 @@ class AllocationRepository extends EloquentRepository implements AllocationRepos } /** - * Return a concated result set of node ips that already have at least one + * Return a concatenated result set of node ips that already have at least one * server assigned to that IP. This allows for filtering out sets for * dedicated allocation IPs. * diff --git a/app/Repositories/Eloquent/DatabaseRepository.php b/app/Repositories/Eloquent/DatabaseRepository.php index 8a8c93fd8..d3b615b92 100644 --- a/app/Repositories/Eloquent/DatabaseRepository.php +++ b/app/Repositories/Eloquent/DatabaseRepository.php @@ -59,7 +59,7 @@ class DatabaseRepository extends EloquentRepository implements DatabaseRepositor } /** - * Return the connection to execute statements aganist. + * Return the connection to execute statements against. * * @return string */ diff --git a/app/Repositories/Eloquent/EggRepository.php b/app/Repositories/Eloquent/EggRepository.php index 10d27f284..a3a96efb0 100644 --- a/app/Repositories/Eloquent/EggRepository.php +++ b/app/Repositories/Eloquent/EggRepository.php @@ -92,7 +92,7 @@ class EggRepository extends EloquentRepository implements EggRepositoryInterface * @param int $service * @return bool */ - public function isCopiableScript(int $copyFromId, int $service): bool + public function isCopyableScript(int $copyFromId, int $service): bool { return $this->getBuilder()->whereNull('copy_script_from') ->where('id', '=', $copyFromId) diff --git a/app/Repositories/Eloquent/EloquentRepository.php b/app/Repositories/Eloquent/EloquentRepository.php index 74ec809fe..64e7cfb60 100644 --- a/app/Repositories/Eloquent/EloquentRepository.php +++ b/app/Repositories/Eloquent/EloquentRepository.php @@ -296,4 +296,14 @@ abstract class EloquentRepository extends Repository implements RepositoryInterf return $this->getBuilder()->getConnection()->statement($statement, $bindings); } + + /** + * Get the amount of entries in the database + * + * @return int + */ + public function count(): int + { + return $this->getBuilder()->count(); + } } diff --git a/app/Repositories/Eloquent/NodeRepository.php b/app/Repositories/Eloquent/NodeRepository.php index b4d6ba6b0..4f59fddce 100644 --- a/app/Repositories/Eloquent/NodeRepository.php +++ b/app/Repositories/Eloquent/NodeRepository.php @@ -56,6 +56,33 @@ class NodeRepository extends EloquentRepository implements NodeRepositoryInterfa })->toArray(); } + /** + * Return the usage stats for a single node. + * + * @param \Pterodactyl\Models\Node $node + * @return array + */ + public function getUsageStatsRaw(Node $node): array + { + $stats = $this->getBuilder()->select( + $this->getBuilder()->raw('IFNULL(SUM(servers.memory), 0) as sum_memory, IFNULL(SUM(servers.disk), 0) as sum_disk') + )->join('servers', 'servers.node_id', '=', 'nodes.id')->where('node_id', $node->id)->first(); + + return collect(['disk' => $stats->sum_disk, 'memory' => $stats->sum_memory])->mapWithKeys(function ($value, $key) use ($node) { + $maxUsage = $node->{$key}; + if ($node->{$key . '_overallocate'} > 0) { + $maxUsage = $node->{$key} * (1 + ($node->{$key . '_overallocate'} / 100)); + } + + return [ + $key => [ + 'value' => $value, + 'max' => $maxUsage, + ], + ]; + })->toArray(); + } + /** * Return all available nodes with a searchable interface. * diff --git a/app/Repositories/Eloquent/ServerRepository.php b/app/Repositories/Eloquent/ServerRepository.php index 2fc5f878b..f448f0b78 100644 --- a/app/Repositories/Eloquent/ServerRepository.php +++ b/app/Repositories/Eloquent/ServerRepository.php @@ -265,7 +265,7 @@ class ServerRepository extends EloquentRepository implements ServerRepositoryInt } /** - * Return all of the servers that should have a power action performed aganist them. + * Return all of the servers that should have a power action performed against them. * * @param int[] $servers * @param int[] $nodes @@ -328,4 +328,14 @@ class ServerRepository extends EloquentRepository implements ServerRepositoryInt $this->app->make(SubuserRepository::class)->getBuilder()->select('server_id')->where('user_id', $user) )->pluck('id')->all(); } + + /** + * Get the amount of servers that are suspended + * + * @return int + */ + public function getSuspendedServersCount(): int + { + return $this->getBuilder()->where('suspended', true)->count(); + } } diff --git a/app/Repositories/Eloquent/UserRepository.php b/app/Repositories/Eloquent/UserRepository.php index 008916de2..b69df198c 100644 --- a/app/Repositories/Eloquent/UserRepository.php +++ b/app/Repositories/Eloquent/UserRepository.php @@ -37,10 +37,10 @@ class UserRepository extends EloquentRepository implements UserRepositoryInterfa /** * Return all matching models for a user in a format that can be used for dropdowns. * - * @param string $query + * @param string|null $query * @return \Illuminate\Support\Collection */ - public function filterUsersByQuery(string $query): Collection + public function filterUsersByQuery(?string $query): Collection { $this->setColumns([ 'id', 'email', 'username', 'name_first', 'name_last', diff --git a/app/Repositories/Repository.php b/app/Repositories/Repository.php index c3014a31a..c209e33ba 100644 --- a/app/Repositories/Repository.php +++ b/app/Repositories/Repository.php @@ -37,7 +37,7 @@ abstract class Repository implements RepositoryInterface { $this->app = $application; - $this->initalizeModel($this->model()); + $this->initializeModel($this->model()); } /** @@ -103,7 +103,7 @@ abstract class Repository implements RepositoryInterface } /** - * Set wether or not the repository should return a fresh model + * Set whether or not the repository should return a fresh model * when changes are committed. * * @param bool $fresh @@ -123,7 +123,7 @@ abstract class Repository implements RepositoryInterface * @param array $model * @return mixed */ - protected function initalizeModel(...$model) + protected function initializeModel(...$model) { switch (count($model)) { case 1: @@ -131,7 +131,7 @@ abstract class Repository implements RepositoryInterface case 2: return $this->model = call_user_func([$this->app->make($model[0]), $model[1]]); default: - throw new InvalidArgumentException('Model must be a FQCN or an array with a count of two.'); + throw new InvalidArgumentException('Model must be a FQDN or an array with a count of two.'); } } } diff --git a/app/Services/Acl/Api/AdminAcl.php b/app/Services/Acl/Api/AdminAcl.php index 54bd594fd..6dfa87971 100644 --- a/app/Services/Acl/Api/AdminAcl.php +++ b/app/Services/Acl/Api/AdminAcl.php @@ -9,9 +9,9 @@ class AdminAcl { /** * Resource permission columns in the api_keys table begin - * with this identifer. + * with this identifier. */ - const COLUMN_IDENTIFER = 'r_'; + const COLUMN_IDENTIFIER = 'r_'; /** * The different types of permissions available for API keys. This @@ -63,13 +63,14 @@ class AdminAcl */ public static function check(ApiKey $key, string $resource, int $action = self::READ) { - return self::can(data_get($key, self::COLUMN_IDENTIFER . $resource, self::NONE), $action); + return self::can(data_get($key, self::COLUMN_IDENTIFIER . $resource, self::NONE), $action); } /** * Return a list of all resource constants defined in this ACL. * * @return array + * @throws \ReflectionException */ public static function getResourceList(): array { diff --git a/app/Services/Api/KeyCreationService.php b/app/Services/Api/KeyCreationService.php index 4a8efe7b4..b51431620 100644 --- a/app/Services/Api/KeyCreationService.php +++ b/app/Services/Api/KeyCreationService.php @@ -51,7 +51,7 @@ class KeyCreationService /** * Create a new API key for the Panel using the permissions passed in the data request. - * This will automatically generate an identifer and an encrypted token that are + * This will automatically generate an identifier and an encrypted token that are * stored in the database. * * @param array $data diff --git a/app/Services/DaemonKeys/DaemonKeyDeletionService.php b/app/Services/DaemonKeys/DaemonKeyDeletionService.php index 553258ce7..054122d82 100644 --- a/app/Services/DaemonKeys/DaemonKeyDeletionService.php +++ b/app/Services/DaemonKeys/DaemonKeyDeletionService.php @@ -24,9 +24,9 @@ namespace Pterodactyl\Services\DaemonKeys; -use Illuminate\Log\Writer; use Webmozart\Assert\Assert; use Pterodactyl\Models\Server; +use Psr\Log\LoggerInterface as Writer; use GuzzleHttp\Exception\RequestException; use Illuminate\Database\ConnectionInterface; use Pterodactyl\Exceptions\DisplayException; @@ -57,7 +57,7 @@ class DaemonKeyDeletionService protected $serverRepository; /** - * @var \Illuminate\Log\Writer + * @var \Psr\Log\LoggerInterface */ protected $writer; @@ -68,7 +68,7 @@ class DaemonKeyDeletionService * @param \Pterodactyl\Contracts\Repository\DaemonKeyRepositoryInterface $repository * @param \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface $daemonRepository * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $serverRepository - * @param \Illuminate\Log\Writer $writer + * @param \Psr\Log\LoggerInterface $writer */ public function __construct( ConnectionInterface $connection, diff --git a/app/Services/Deployment/FindViableNodesService.php b/app/Services/Deployment/FindViableNodesService.php index 973d7fc71..6d6832c27 100644 --- a/app/Services/Deployment/FindViableNodesService.php +++ b/app/Services/Deployment/FindViableNodesService.php @@ -88,7 +88,7 @@ class FindViableNodesService * attempt to find all nodes in the defined locations that meet the disk and * memory availability requirements. Any nodes not meeting those requirements * are tossed out, as are any nodes marked as non-public, meaning automatic - * deployments should not be done aganist them. + * deployments should not be done against them. * * @return int[] * @throws \Pterodactyl\Exceptions\Service\Deployment\NoViableNodeException diff --git a/app/Services/Eggs/EggCreationService.php b/app/Services/Eggs/EggCreationService.php index aaf9823f1..45fa8895f 100644 --- a/app/Services/Eggs/EggCreationService.php +++ b/app/Services/Eggs/EggCreationService.php @@ -15,7 +15,7 @@ use Pterodactyl\Contracts\Repository\EggRepositoryInterface; use Illuminate\Contracts\Config\Repository as ConfigRepository; use Pterodactyl\Exceptions\Service\Egg\NoParentConfigurationFoundException; -// When a mommy and a daddy pterodactyl really like eachother... +// When a mommy and a daddy pterodactyl really like each other... class EggCreationService { /** diff --git a/app/Services/Eggs/Scripts/InstallScriptService.php b/app/Services/Eggs/Scripts/InstallScriptService.php index 0d9e66bcc..b71c10d87 100644 --- a/app/Services/Eggs/Scripts/InstallScriptService.php +++ b/app/Services/Eggs/Scripts/InstallScriptService.php @@ -47,7 +47,7 @@ class InstallScriptService } if (! is_null(array_get($data, 'copy_script_from'))) { - if (! $this->repository->isCopiableScript(array_get($data, 'copy_script_from'), $egg->nest_id)) { + if (! $this->repository->isCopyableScript(array_get($data, 'copy_script_from'), $egg->nest_id)) { throw new InvalidCopyFromException(trans('exceptions.nest.egg.invalid_copy_id')); } } diff --git a/app/Services/Schedules/ProcessScheduleService.php b/app/Services/Schedules/ProcessScheduleService.php index ec6ea5f12..b134caa35 100644 --- a/app/Services/Schedules/ProcessScheduleService.php +++ b/app/Services/Schedules/ProcessScheduleService.php @@ -63,7 +63,7 @@ class ProcessScheduleService { $this->repository->loadTasks($schedule); - $formattedCron = sprintf('%s %s %s * %s *', + $formattedCron = sprintf('%s %s %s * %s', $schedule->cron_minute, $schedule->cron_hour, $schedule->cron_day_of_month, diff --git a/app/Services/Schedules/ScheduleCreationService.php b/app/Services/Schedules/ScheduleCreationService.php index 9f676e246..c8cbd7fb3 100644 --- a/app/Services/Schedules/ScheduleCreationService.php +++ b/app/Services/Schedules/ScheduleCreationService.php @@ -86,7 +86,7 @@ class ScheduleCreationService */ private function getCronTimestamp(array $data) { - $formattedCron = sprintf('%s %s %s * %s *', + $formattedCron = sprintf('%s %s %s * %s', array_get($data, 'cron_minute', '*'), array_get($data, 'cron_hour', '*'), array_get($data, 'cron_day_of_month', '*'), diff --git a/app/Services/Schedules/ScheduleUpdateService.php b/app/Services/Schedules/ScheduleUpdateService.php index 96da1b106..1ddbbd242 100644 --- a/app/Services/Schedules/ScheduleUpdateService.php +++ b/app/Services/Schedules/ScheduleUpdateService.php @@ -98,7 +98,7 @@ class ScheduleUpdateService */ private function getCronTimestamp(array $data) { - $formattedCron = sprintf('%s %s %s * %s *', + $formattedCron = sprintf('%s %s %s * %s', array_get($data, 'cron_minute', '*'), array_get($data, 'cron_hour', '*'), array_get($data, 'cron_day_of_month', '*'), diff --git a/app/Services/Servers/ServerDeletionService.php b/app/Services/Servers/ServerDeletionService.php index 5a3f1cb4b..faed3b9ff 100644 --- a/app/Services/Servers/ServerDeletionService.php +++ b/app/Services/Servers/ServerDeletionService.php @@ -9,7 +9,7 @@ namespace Pterodactyl\Services\Servers; -use Illuminate\Log\Writer; +use Psr\Log\LoggerInterface as Writer; use GuzzleHttp\Exception\RequestException; use Illuminate\Database\ConnectionInterface; use Pterodactyl\Services\Databases\DatabaseManagementService; @@ -51,7 +51,7 @@ class ServerDeletionService protected $repository; /** - * @var \Illuminate\Log\Writer + * @var \Psr\Log\LoggerInterface */ protected $writer; @@ -63,7 +63,7 @@ class ServerDeletionService * @param \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface $databaseRepository * @param \Pterodactyl\Services\Databases\DatabaseManagementService $databaseManagementService * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $repository - * @param \Illuminate\Log\Writer $writer + * @param \Psr\Log\LoggerInterface $writer */ public function __construct( ConnectionInterface $connection, diff --git a/app/Services/Servers/StartupCommandViewService.php b/app/Services/Servers/StartupCommandViewService.php index 7895ec6dd..d3cda3143 100644 --- a/app/Services/Servers/StartupCommandViewService.php +++ b/app/Services/Servers/StartupCommandViewService.php @@ -24,7 +24,7 @@ class StartupCommandViewService /** * Generate a startup command for a server and return all of the user-viewable variables - * as well as thier assigned values. + * as well as their assigned values. * * @param int $server * @return \Illuminate\Support\Collection diff --git a/app/Services/Servers/SuspensionService.php b/app/Services/Servers/SuspensionService.php index 896cfeb17..d8d367803 100644 --- a/app/Services/Servers/SuspensionService.php +++ b/app/Services/Servers/SuspensionService.php @@ -9,8 +9,8 @@ namespace Pterodactyl\Services\Servers; -use Illuminate\Log\Writer; use Pterodactyl\Models\Server; +use Psr\Log\LoggerInterface as Writer; use GuzzleHttp\Exception\RequestException; use Illuminate\Database\ConnectionInterface; use Pterodactyl\Exceptions\DisplayException; @@ -38,7 +38,7 @@ class SuspensionService protected $repository; /** - * @var \Illuminate\Log\Writer + * @var \Psr\Log\LoggerInterface */ protected $writer; @@ -48,7 +48,7 @@ class SuspensionService * @param \Illuminate\Database\ConnectionInterface $database * @param \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface $daemonServerRepository * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $repository - * @param \Illuminate\Log\Writer $writer + * @param \Psr\Log\LoggerInterface $writer */ public function __construct( ConnectionInterface $database, diff --git a/app/Services/Servers/VariableValidatorService.php b/app/Services/Servers/VariableValidatorService.php index 43685cafb..758460559 100644 --- a/app/Services/Servers/VariableValidatorService.php +++ b/app/Services/Servers/VariableValidatorService.php @@ -63,7 +63,7 @@ class VariableValidatorService } /** - * Validate all of the passed data aganist the given service option variables. + * Validate all of the passed data against the given service option variables. * * @param int $egg * @param array $fields diff --git a/app/Services/Sftp/AuthenticateUsingPasswordService.php b/app/Services/Sftp/AuthenticateUsingPasswordService.php index f89a32c5d..690573926 100644 --- a/app/Services/Sftp/AuthenticateUsingPasswordService.php +++ b/app/Services/Sftp/AuthenticateUsingPasswordService.php @@ -52,7 +52,7 @@ class AuthenticateUsingPasswordService } /** - * Attempt to authenticate a provded username and password and determine if they + * Attempt to authenticate a provided username and password and determine if they * have permission to access a given server. This function does not account for * subusers currently. Only administrators and server owners can login to access * their files at this time. diff --git a/app/Services/Users/UserUpdateService.php b/app/Services/Users/UserUpdateService.php index 440ab57ce..440f8b45a 100644 --- a/app/Services/Users/UserUpdateService.php +++ b/app/Services/Users/UserUpdateService.php @@ -47,7 +47,7 @@ class UserUpdateService /** * Update the user model instance. If the user has been removed as an administrator - * revoke all of the authentication tokens that have beenn assigned to their account. + * revoke all of the authentication tokens that have been assigned to their account. * * @param \Pterodactyl\Models\User $user * @param array $data diff --git a/app/Traits/Controllers/PlainJavascriptInjection.php b/app/Traits/Controllers/PlainJavascriptInjection.php new file mode 100644 index 000000000..eae53bfbc --- /dev/null +++ b/app/Traits/Controllers/PlainJavascriptInjection.php @@ -0,0 +1,24 @@ +=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2018-04-06T15:51:55+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "8790f594151ca6a2010c6218e09d96df67173ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/8790f594151ca6a2010c6218e09d96df67173ad3", + "reference": "8790f594151ca6a2010c6218e09d96df67173ad3", "shasum": "" }, "require": { @@ -725,7 +776,7 @@ }, "require-dev": { "dominicsayers/isemail": "dev-master", - "phpunit/phpunit": "^4.8.35", + "phpunit/phpunit": "^4.8.35||^5.7||^6.0", "satooshi/php-coveralls": "^1.0.1" }, "suggest": { @@ -760,23 +811,24 @@ "validation", "validator" ], - "time": "2017-11-15T23:40:40+00:00" + "time": "2018-04-10T10:11:19+00:00" }, { "name": "erusev/parsedown", - "version": "1.6.4", + "version": "1.7.1", "source": { "type": "git", "url": "https://github.com/erusev/parsedown.git", - "reference": "fbe3fe878f4fe69048bb8a52783a09802004f548" + "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/fbe3fe878f4fe69048bb8a52783a09802004f548", - "reference": "fbe3fe878f4fe69048bb8a52783a09802004f548", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", + "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", "shasum": "" }, "require": { + "ext-mbstring": "*", "php": ">=5.3.0" }, "require-dev": { @@ -805,20 +857,20 @@ "markdown", "parser" ], - "time": "2017-11-14T20:44:03+00:00" + "time": "2018-03-08T01:11:30+00:00" }, { "name": "fideloper/proxy", - "version": "3.3.4", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f" + "reference": "cf8a0ca4b85659b9557e206c90110a6a4dba980a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/9cdf6f118af58d89764249bbcc7bb260c132924f", - "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/cf8a0ca4b85659b9557e206c90110a6a4dba980a", + "reference": "cf8a0ca4b85659b9557e206c90110a6a4dba980a", "shasum": "" }, "require": { @@ -826,15 +878,12 @@ "php": ">=5.4.0" }, "require-dev": { - "illuminate/http": "~5.0", - "mockery/mockery": "~0.9.3", - "phpunit/phpunit": "^5.7" + "illuminate/http": "~5.6", + "mockery/mockery": "~1.0", + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - }, "laravel": { "providers": [ "Fideloper\\Proxy\\TrustedProxyServiceProvider" @@ -862,20 +911,20 @@ "proxy", "trusted proxy" ], - "time": "2017-06-15T17:19:42+00:00" + "time": "2018-02-07T20:20:57+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "6.3.0", + "version": "6.3.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", "shasum": "" }, "require": { @@ -885,7 +934,7 @@ }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.0 || ^5.0", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", "psr/log": "^1.0" }, "suggest": { @@ -894,7 +943,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.2-dev" + "dev-master": "6.3-dev" } }, "autoload": { @@ -927,7 +976,7 @@ "rest", "web service" ], - "time": "2017-06-22T18:50:49+00:00" + "time": "2018-04-22T15:46:56+00:00" }, { "name": "guzzlehttp/promises", @@ -1113,16 +1162,16 @@ }, { "name": "igaster/laravel-theme", - "version": "v2.0.6", + "version": "v2.0.8", "source": { "type": "git", "url": "https://github.com/igaster/laravel-theme.git", - "reference": "d3835fd99418848ba130e3f7a73d3f78ab636471" + "reference": "697548f755d81175bef8c0f37c1f189a62e205bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igaster/laravel-theme/zipball/d3835fd99418848ba130e3f7a73d3f78ab636471", - "reference": "d3835fd99418848ba130e3f7a73d3f78ab636471", + "url": "https://api.github.com/repos/igaster/laravel-theme/zipball/697548f755d81175bef8c0f37c1f189a62e205bd", + "reference": "697548f755d81175bef8c0f37c1f189a62e205bd", "shasum": "" }, "require": { @@ -1172,7 +1221,7 @@ "themes", "views" ], - "time": "2018-02-12T11:19:00+00:00" + "time": "2018-05-24T08:05:30+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -1320,43 +1369,46 @@ }, { "name": "laravel/framework", - "version": "v5.5.34", + "version": "v5.6.23", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "1de7c0aec13eadbdddc2d1ba4019b064b2c6b966" + "reference": "f547f0a71a12763d1adb8493237d541c9e3a5d10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/1de7c0aec13eadbdddc2d1ba4019b064b2c6b966", - "reference": "1de7c0aec13eadbdddc2d1ba4019b064b2c6b966", + "url": "https://api.github.com/repos/laravel/framework/zipball/f547f0a71a12763d1adb8493237d541c9e3a5d10", + "reference": "f547f0a71a12763d1adb8493237d541c9e3a5d10", "shasum": "" }, "require": { "doctrine/inflector": "~1.1", - "erusev/parsedown": "~1.6", + "dragonmantank/cron-expression": "~2.0", + "erusev/parsedown": "~1.7", "ext-mbstring": "*", "ext-openssl": "*", - "league/flysystem": "~1.0", + "league/flysystem": "^1.0.8", "monolog/monolog": "~1.12", - "mtdowling/cron-expression": "~1.0", - "nesbot/carbon": "~1.20", - "php": ">=7.0", + "nesbot/carbon": "1.25.*", + "php": "^7.1.3", "psr/container": "~1.0", "psr/simple-cache": "^1.0", - "ramsey/uuid": "~3.0", + "ramsey/uuid": "^3.7", "swiftmailer/swiftmailer": "~6.0", - "symfony/console": "~3.3", - "symfony/debug": "~3.3", - "symfony/finder": "~3.3", - "symfony/http-foundation": "~3.3", - "symfony/http-kernel": "~3.3", - "symfony/process": "~3.3", - "symfony/routing": "~3.3", - "symfony/var-dumper": "~3.3", - "tijsverkoyen/css-to-inline-styles": "~2.2", + "symfony/console": "~4.0", + "symfony/debug": "~4.0", + "symfony/finder": "~4.0", + "symfony/http-foundation": "~4.0", + "symfony/http-kernel": "~4.0", + "symfony/process": "~4.0", + "symfony/routing": "~4.0", + "symfony/var-dumper": "~4.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.1", "vlucas/phpdotenv": "~2.2" }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, "replace": { "illuminate/auth": "self.version", "illuminate/broadcasting": "self.version", @@ -1385,44 +1437,46 @@ "illuminate/support": "self.version", "illuminate/translation": "self.version", "illuminate/validation": "self.version", - "illuminate/view": "self.version", - "tightenco/collect": "self.version" + "illuminate/view": "self.version" }, "require-dev": { "aws/aws-sdk-php": "~3.0", - "doctrine/dbal": "~2.5", + "doctrine/dbal": "~2.6", "filp/whoops": "^2.1.4", + "league/flysystem-cached-adapter": "~1.0", "mockery/mockery": "~1.0", - "orchestra/testbench-core": "3.5.*", + "moontoast/math": "^1.1", + "orchestra/testbench-core": "3.6.*", "pda/pheanstalk": "~3.0", - "phpunit/phpunit": "~6.0", + "phpunit/phpunit": "~7.0", "predis/predis": "^1.1.1", - "symfony/css-selector": "~3.3", - "symfony/dom-crawler": "~3.3" + "symfony/css-selector": "~4.0", + "symfony/dom-crawler": "~4.0" }, "suggest": { "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.6).", "ext-pcntl": "Required to use all features of the queue worker.", "ext-posix": "Required to use all features of the queue worker.", "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", "laravel/tinker": "Required to use the tinker console command (~1.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", - "league/flysystem-cached-adapter": "Required to use Flysystem caching (~1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (~1.0).", "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (~1.0).", "nexmo/client": "Required to use the Nexmo transport (~1.0).", "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~3.0).", - "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).", - "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).", + "symfony/css-selector": "Required to use some of the crawler integration testing tools (~4.0).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~4.0).", "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "autoload": { @@ -1450,20 +1504,20 @@ "framework", "laravel" ], - "time": "2018-02-06T15:36:55+00:00" + "time": "2018-05-22T14:55:57+00:00" }, { "name": "laravel/tinker", - "version": "v1.0.3", + "version": "v1.0.7", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "852c2abe0b0991555a403f1c0583e64de6acb4a6" + "reference": "e3086ee8cb1f54a39ae8dcb72d1c37d10128997d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/852c2abe0b0991555a403f1c0583e64de6acb4a6", - "reference": "852c2abe0b0991555a403f1c0583e64de6acb4a6", + "url": "https://api.github.com/repos/laravel/tinker/zipball/e3086ee8cb1f54a39ae8dcb72d1c37d10128997d", + "reference": "e3086ee8cb1f54a39ae8dcb72d1c37d10128997d", "shasum": "" }, "require": { @@ -1471,7 +1525,7 @@ "illuminate/contracts": "~5.1", "illuminate/support": "~5.1", "php": ">=5.5.9", - "psy/psysh": "0.7.*|0.8.*", + "psy/psysh": "0.7.*|0.8.*|0.9.*", "symfony/var-dumper": "~3.0|~4.0" }, "require-dev": { @@ -1513,20 +1567,20 @@ "laravel", "psysh" ], - "time": "2017-12-18T16:25:11+00:00" + "time": "2018-05-17T13:42:07+00:00" }, { "name": "league/flysystem", - "version": "1.0.42", + "version": "1.0.45", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "09eabc54e199950041aef258a85847676496fe8e" + "reference": "a99f94e63b512d75f851b181afcdf0ee9ebef7e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/09eabc54e199950041aef258a85847676496fe8e", - "reference": "09eabc54e199950041aef258a85847676496fe8e", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a99f94e63b512d75f851b181afcdf0ee9ebef7e6", + "reference": "a99f94e63b512d75f851b181afcdf0ee9ebef7e6", "shasum": "" }, "require": { @@ -1597,7 +1651,7 @@ "sftp", "storage" ], - "time": "2018-01-27T16:03:56+00:00" + "time": "2018-05-07T08:44:23+00:00" }, { "name": "league/fractal", @@ -1836,50 +1890,6 @@ ], "time": "2017-06-19T01:22:40+00:00" }, - { - "name": "mtdowling/cron-expression", - "version": "v1.2.1", - "source": { - "type": "git", - "url": "https://github.com/mtdowling/cron-expression.git", - "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad", - "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "time": "2017-01-23T04:29:33+00:00" - }, { "name": "mtdowling/jmespath.php", "version": "2.4.0", @@ -1937,25 +1947,25 @@ }, { "name": "nesbot/carbon", - "version": "1.22.1", + "version": "1.25.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc" + "reference": "cbcf13da0b531767e39eb86e9687f5deba9857b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", - "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/cbcf13da0b531767e39eb86e9687f5deba9857b4", + "reference": "cbcf13da0b531767e39eb86e9687f5deba9857b4", "shasum": "" }, "require": { - "php": ">=5.3.0", - "symfony/translation": "~2.6 || ~3.0" + "php": ">=5.3.9", + "symfony/translation": "~2.6 || ~3.0 || ~4.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "~2", - "phpunit/phpunit": "~4.0 || ~5.0" + "phpunit/phpunit": "^4.8.35 || ^5.7" }, "type": "library", "extra": { @@ -1986,28 +1996,28 @@ "datetime", "time" ], - "time": "2017-01-16T07:55:07+00:00" + "time": "2018-03-19T15:50:49+00:00" }, { "name": "nikic/php-parser", - "version": "v3.1.4", + "version": "v4.0.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "e57b3a09784f846411aa7ed664eedb73e3399078" + "reference": "e4a54fa90a5cd8e8dd3fb4099942681731c5cdd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/e57b3a09784f846411aa7ed664eedb73e3399078", - "reference": "e57b3a09784f846411aa7ed664eedb73e3399078", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/e4a54fa90a5cd8e8dd3fb4099942681731c5cdd3", + "reference": "e4a54fa90a5cd8e8dd3fb4099942681731c5cdd3", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=5.5" + "php": ">=7.0" }, "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" + "phpunit/phpunit": "^6.5 || ^7.0" }, "bin": [ "bin/php-parse" @@ -2015,7 +2025,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2037,28 +2047,28 @@ "parser", "php" ], - "time": "2018-01-25T21:31:33+00:00" + "time": "2018-03-25T17:35:16+00:00" }, { "name": "paragonie/constant_time_encoding", - "version": "v2.2.1", + "version": "v2.2.2", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "7c74c5d08761ead7b5e89d07c854bc28eb0b2186" + "reference": "eccf915f45f911bfb189d1d1638d940ec6ee6e33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/7c74c5d08761ead7b5e89d07c854bc28eb0b2186", - "reference": "7c74c5d08761ead7b5e89d07c854bc28eb0b2186", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/eccf915f45f911bfb189d1d1638d940ec6ee6e33", + "reference": "eccf915f45f911bfb189d1d1638d940ec6ee6e33", "shasum": "" }, "require": { "php": "^7" }, "require-dev": { - "phpunit/phpunit": "^6", - "vimeo/psalm": "^0.3|^1" + "phpunit/phpunit": "^6|^7", + "vimeo/psalm": "^1" }, "type": "library", "autoload": { @@ -2099,20 +2109,20 @@ "hex2bin", "rfc4648" ], - "time": "2018-01-23T00:54:57+00:00" + "time": "2018-03-10T19:47:49+00:00" }, { "name": "paragonie/random_compat", - "version": "v2.0.11", + "version": "v2.0.12", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8" + "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8", - "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb", + "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb", "shasum": "" }, "require": { @@ -2147,7 +2157,7 @@ "pseudorandom", "random" ], - "time": "2017-09-27T21:40:39+00:00" + "time": "2018-04-04T21:24:14+00:00" }, { "name": "pragmarx/google2fa", @@ -2262,16 +2272,16 @@ }, { "name": "prologue/alerts", - "version": "0.4.1", + "version": "0.4.2", "source": { "type": "git", "url": "https://github.com/prologuephp/alerts.git", - "reference": "2a7184a9f39ab6f6dde85dbe0b9c783241bf52ea" + "reference": "d3bf5d7ea480cbbf372bb7f80e23e193ce4862c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/prologuephp/alerts/zipball/2a7184a9f39ab6f6dde85dbe0b9c783241bf52ea", - "reference": "2a7184a9f39ab6f6dde85dbe0b9c783241bf52ea", + "url": "https://api.github.com/repos/prologuephp/alerts/zipball/d3bf5d7ea480cbbf372bb7f80e23e193ce4862c7", + "reference": "d3bf5d7ea480cbbf372bb7f80e23e193ce4862c7", "shasum": "" }, "require": { @@ -2285,6 +2295,16 @@ "phpunit/phpunit": "~4.1" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Prologue\\Alerts\\AlertsServiceProvider" + ], + "aliases": { + "Alert": "Prologue\\Alerts\\Facades\\Alert" + } + } + }, "autoload": { "psr-4": { "Prologue\\Alerts\\": "src/" @@ -2308,7 +2328,7 @@ "laravel", "messages" ], - "time": "2017-01-24T13:22:25+00:00" + "time": "2018-02-08T11:29:22+00:00" }, { "name": "psr/container", @@ -2458,16 +2478,16 @@ }, { "name": "psr/simple-cache", - "version": "1.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/simple-cache.git", - "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", - "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", "shasum": "" }, "require": { @@ -2502,34 +2522,34 @@ "psr-16", "simple-cache" ], - "time": "2017-01-02T13:31:39+00:00" + "time": "2017-10-23T01:57:42+00:00" }, { "name": "psy/psysh", - "version": "v0.8.17", + "version": "v0.9.4", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "5069b70e8c4ea492c2b5939b6eddc78bfe41cfec" + "reference": "4d969a0e08e1e05e7207c07cb4207017ecc9a331" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/5069b70e8c4ea492c2b5939b6eddc78bfe41cfec", - "reference": "5069b70e8c4ea492c2b5939b6eddc78bfe41cfec", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4d969a0e08e1e05e7207c07cb4207017ecc9a331", + "reference": "4d969a0e08e1e05e7207c07cb4207017ecc9a331", "shasum": "" }, "require": { "dnoegel/php-xdg-base-dir": "0.1", "jakub-onderka/php-console-highlighter": "0.3.*", - "nikic/php-parser": "~1.3|~2.0|~3.0", - "php": ">=5.3.9", + "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", + "php": ">=5.4.0", "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0", "symfony/var-dumper": "~2.7|~3.0|~4.0" }, "require-dev": { - "hoa/console": "~3.16|~1.14", - "phpunit/phpunit": "^4.8.35|^5.4.3", - "symfony/finder": "~2.1|~3.0|~4.0" + "bamarni/composer-bin-plugin": "^1.2", + "hoa/console": "~2.15|~3.16", + "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0" }, "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", @@ -2544,15 +2564,15 @@ "type": "library", "extra": { "branch-alias": { - "dev-develop": "0.8.x-dev" + "dev-develop": "0.9.x-dev" } }, "autoload": { "files": [ - "src/Psy/functions.php" + "src/functions.php" ], "psr-4": { - "Psy\\": "src/Psy/" + "Psy\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2574,7 +2594,7 @@ "interactive", "shell" ], - "time": "2017-12-28T16:14:16+00:00" + "time": "2018-05-22T06:48:07+00:00" }, { "name": "ramsey/uuid", @@ -2708,22 +2728,22 @@ }, { "name": "sofa/eloquence-base", - "version": "v5.5", + "version": "5.6", "source": { "type": "git", "url": "https://github.com/jarektkaczyk/eloquence-base.git", - "reference": "41e9b10073d0592b37437cdd06eea40a2b86f3e0" + "reference": "4fac84d7395f573e31f618268705b0c7b1bdd5ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jarektkaczyk/eloquence-base/zipball/41e9b10073d0592b37437cdd06eea40a2b86f3e0", - "reference": "41e9b10073d0592b37437cdd06eea40a2b86f3e0", + "url": "https://api.github.com/repos/jarektkaczyk/eloquence-base/zipball/4fac84d7395f573e31f618268705b0c7b1bdd5ee", + "reference": "4fac84d7395f573e31f618268705b0c7b1bdd5ee", "shasum": "" }, "require": { - "illuminate/database": "5.5.*", + "illuminate/database": "^5.5", "php": ">=7.0.0", - "sofa/hookable": "5.5.*" + "sofa/hookable": "^5.5" }, "require-dev": { "mockery/mockery": "0.9.4", @@ -2767,25 +2787,25 @@ "mutable", "searchable" ], - "time": "2017-10-13T14:26:50+00:00" + "time": "2018-03-03T03:01:40+00:00" }, { "name": "sofa/eloquence-validable", - "version": "v5.5", + "version": "5.6", "source": { "type": "git", "url": "https://github.com/jarektkaczyk/eloquence-validable.git", - "reference": "ac93ec8180558d3c70328de166c33a765732bb12" + "reference": "9d9ef65bf4a4952efb54b06ac0b04fc8893d5f95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jarektkaczyk/eloquence-validable/zipball/ac93ec8180558d3c70328de166c33a765732bb12", - "reference": "ac93ec8180558d3c70328de166c33a765732bb12", + "url": "https://api.github.com/repos/jarektkaczyk/eloquence-validable/zipball/9d9ef65bf4a4952efb54b06ac0b04fc8893d5f95", + "reference": "9d9ef65bf4a4952efb54b06ac0b04fc8893d5f95", "shasum": "" }, "require": { "php": ">=7.0.0", - "sofa/eloquence-base": "5.5.*" + "sofa/eloquence-base": "^5.5" }, "require-dev": { "mockery/mockery": "0.9.4", @@ -2819,24 +2839,24 @@ "mutable", "searchable" ], - "time": "2017-10-13T14:42:08+00:00" + "time": "2018-03-03T03:09:46+00:00" }, { "name": "sofa/hookable", - "version": "v5.5.1", + "version": "5.6", "source": { "type": "git", "url": "https://github.com/jarektkaczyk/hookable.git", - "reference": "7eb58b5cadeebca4ef74d5bd742dd4ff93348524" + "reference": "c6f03e5e742d539755f8c7993ee96e907593a668" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jarektkaczyk/hookable/zipball/7eb58b5cadeebca4ef74d5bd742dd4ff93348524", - "reference": "7eb58b5cadeebca4ef74d5bd742dd4ff93348524", + "url": "https://api.github.com/repos/jarektkaczyk/hookable/zipball/c6f03e5e742d539755f8c7993ee96e907593a668", + "reference": "c6f03e5e742d539755f8c7993ee96e907593a668", "shasum": "" }, "require": { - "illuminate/database": "5.3.*|5.4.*|5.5.*", + "illuminate/database": "^5.3", "php": ">=5.6.4" }, "require-dev": { @@ -2865,7 +2885,7 @@ "eloquent", "laravel" ], - "time": "2017-11-17T14:11:31+00:00" + "time": "2018-03-03T02:55:49+00:00" }, { "name": "spatie/fractalistic", @@ -3043,21 +3063,20 @@ }, { "name": "symfony/console", - "version": "v3.4.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "26b6f419edda16c19775211987651cb27baea7f1" + "reference": "058f120b8e06ebcd7b211de5ffae07b2db00fbdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/26b6f419edda16c19775211987651cb27baea7f1", - "reference": "26b6f419edda16c19775211987651cb27baea7f1", + "url": "https://api.github.com/repos/symfony/console/zipball/058f120b8e06ebcd7b211de5ffae07b2db00fbdd", + "reference": "058f120b8e06ebcd7b211de5ffae07b2db00fbdd", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", + "php": "^7.1.3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -3066,14 +3085,14 @@ }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", + "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" + "symfony/process": "~3.4|~4.0" }, "suggest": { - "psr/log": "For using the console logger", + "psr/log-implementation": "For using the console logger", "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "" @@ -3081,7 +3100,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3108,20 +3127,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-01-29T09:03:43+00:00" + "time": "2018-05-16T09:05:32+00:00" }, { "name": "symfony/css-selector", - "version": "v4.0.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "f97600434e3141ef3cbb9ea42cf500fba88022b7" + "reference": "0383a1a4eb1ffcac28719975d3e01bfa14be8ab3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/f97600434e3141ef3cbb9ea42cf500fba88022b7", - "reference": "f97600434e3141ef3cbb9ea42cf500fba88022b7", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/0383a1a4eb1ffcac28719975d3e01bfa14be8ab3", + "reference": "0383a1a4eb1ffcac28719975d3e01bfa14be8ab3", "shasum": "" }, "require": { @@ -3161,36 +3180,36 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:38:00+00:00" + "time": "2018-05-11T15:58:37+00:00" }, { "name": "symfony/debug", - "version": "v3.4.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "53f6af2805daf52a43b393b93d2f24925d35c937" + "reference": "4e7c98de67cc4171d4c986554e09a511da40f3d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/53f6af2805daf52a43b393b93d2f24925d35c937", - "reference": "53f6af2805daf52a43b393b93d2f24925d35c937", + "url": "https://api.github.com/repos/symfony/debug/zipball/4e7c98de67cc4171d4c986554e09a511da40f3d8", + "reference": "4e7c98de67cc4171d4c986554e09a511da40f3d8", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "psr/log": "~1.0" }, "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + "symfony/http-kernel": "<3.4" }, "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" + "symfony/http-kernel": "~3.4|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3217,20 +3236,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-01-18T22:16:57+00:00" + "time": "2018-05-16T09:05:32+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.0.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "74d33aac36208c4d6757807d9f598f0133a3a4eb" + "reference": "63353a71073faf08f62caab4e6889b06a787f07b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/74d33aac36208c4d6757807d9f598f0133a3a4eb", - "reference": "74d33aac36208c4d6757807d9f598f0133a3a4eb", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/63353a71073faf08f62caab4e6889b06a787f07b", + "reference": "63353a71073faf08f62caab4e6889b06a787f07b", "shasum": "" }, "require": { @@ -3280,29 +3299,29 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:38:00+00:00" + "time": "2018-04-06T07:35:43+00:00" }, { "name": "symfony/finder", - "version": "v3.4.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "613e26310776f49a1773b6737c6bd554b8bc8c6f" + "reference": "8c633f5a815903a1fe6e3fc135f207267a8a79af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/613e26310776f49a1773b6737c6bd554b8bc8c6f", - "reference": "613e26310776f49a1773b6737c6bd554b8bc8c6f", + "url": "https://api.github.com/repos/symfony/finder/zipball/8c633f5a815903a1fe6e3fc135f207267a8a79af", + "reference": "8c633f5a815903a1fe6e3fc135f207267a8a79af", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3329,34 +3348,33 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-05-16T09:05:32+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "8c39071ac9cc7e6d8dab1d556c990dc0d2cc3d30" + "reference": "277b757a2d3960170d99d372e171a8a18916467a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8c39071ac9cc7e6d8dab1d556c990dc0d2cc3d30", - "reference": "8c39071ac9cc7e6d8dab1d556c990dc0d2cc3d30", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/277b757a2d3960170d99d372e171a8a18916467a", + "reference": "277b757a2d3960170d99d372e171a8a18916467a", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php70": "~1.6" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { - "symfony/expression-language": "~2.8|~3.0|~4.0" + "symfony/expression-language": "~3.4|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3383,33 +3401,34 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-01-29T09:03:43+00:00" + "time": "2018-05-25T11:08:56+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "911d2e5dd4beb63caad9a72e43857de984301907" + "reference": "450a1bda817f2dce25a9e13f0f011336743f2a48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/911d2e5dd4beb63caad9a72e43857de984301907", - "reference": "911d2e5dd4beb63caad9a72e43857de984301907", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/450a1bda817f2dce25a9e13f0f011336743f2a48", + "reference": "450a1bda817f2dce25a9e13f0f011336743f2a48", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "psr/log": "~1.0", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "^3.4.4|^4.0.4" + "symfony/debug": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/http-foundation": "~3.4.4|~4.0.4", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/config": "<2.8", - "symfony/dependency-injection": "<3.4", - "symfony/var-dumper": "<3.3", + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4.5|<4.0.5,>=4", + "symfony/var-dumper": "<3.4", "twig/twig": "<1.34|<2.4,>=2" }, "provide": { @@ -3417,34 +3436,32 @@ }, "require-dev": { "psr/cache": "~1.0", - "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/class-loader": "~2.8|~3.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/console": "~2.8|~3.0|~4.0", - "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/dom-crawler": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/process": "~2.8|~3.0|~4.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dependency-injection": "^3.4.5|^4.0.5", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", "symfony/routing": "~3.4|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~3.3|~4.0" + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0" }, "suggest": { "symfony/browser-kit": "", "symfony/config": "", "symfony/console": "", "symfony/dependency-injection": "", - "symfony/finder": "", "symfony/var-dumper": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3471,20 +3488,75 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-01-29T12:29:46+00:00" + "time": "2018-05-25T13:32:52+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.7.0", + "name": "symfony/polyfill-ctype", + "version": "v1.8.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "78be803ce01e55d3491c1397cf1c64beb9c1b63b" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/78be803ce01e55d3491c1397cf1c64beb9c1b63b", - "reference": "78be803ce01e55d3491c1397cf1c64beb9c1b63b", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-04-30T19:57:29+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "3296adf6a6454a050679cde90f95350ad604b171" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171", + "reference": "3296adf6a6454a050679cde90f95350ad604b171", "shasum": "" }, "require": { @@ -3496,7 +3568,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -3530,20 +3602,20 @@ "portable", "shim" ], - "time": "2018-01-30T19:27:44+00:00" + "time": "2018-04-26T10:06:28+00:00" }, { "name": "symfony/polyfill-php56", - "version": "v1.7.0", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "ebc999ce5f14204c5150b9bd15f8f04e621409d8" + "reference": "af98553c84912459db3f636329567809d639a8f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/ebc999ce5f14204c5150b9bd15f8f04e621409d8", - "reference": "ebc999ce5f14204c5150b9bd15f8f04e621409d8", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/af98553c84912459db3f636329567809d639a8f6", + "reference": "af98553c84912459db3f636329567809d639a8f6", "shasum": "" }, "require": { @@ -3553,7 +3625,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -3586,41 +3658,37 @@ "portable", "shim" ], - "time": "2018-01-30T19:27:44+00:00" + "time": "2018-04-26T10:06:28+00:00" }, { - "name": "symfony/polyfill-php70", - "version": "v1.7.0", + "name": "symfony/polyfill-php72", + "version": "v1.8.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "3532bfcd8f933a7816f3a0a59682fc404776600f" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/3532bfcd8f933a7816f3a0a59682fc404776600f", - "reference": "3532bfcd8f933a7816f3a0a59682fc404776600f", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/a4576e282d782ad82397f3e4ec1df8e0f0cafb46", + "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46", "shasum": "" }, "require": { - "paragonie/random_compat": "~1.0|~2.0", "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "1.8-dev" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" + "Symfony\\Polyfill\\Php72\\": "" }, "files": [ "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3637,7 +3705,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -3645,20 +3713,20 @@ "portable", "shim" ], - "time": "2018-01-30T19:27:44+00:00" + "time": "2018-04-26T10:06:28+00:00" }, { "name": "symfony/polyfill-util", - "version": "v1.7.0", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-util.git", - "reference": "e17c808ec4228026d4f5a8832afa19be85979563" + "reference": "1a5ad95d9436cbff3296034fe9f8d586dce3fb3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/e17c808ec4228026d4f5a8832afa19be85979563", - "reference": "e17c808ec4228026d4f5a8832afa19be85979563", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/1a5ad95d9436cbff3296034fe9f8d586dce3fb3a", + "reference": "1a5ad95d9436cbff3296034fe9f8d586dce3fb3a", "shasum": "" }, "require": { @@ -3667,7 +3735,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -3697,29 +3765,29 @@ "polyfill", "shim" ], - "time": "2018-01-31T18:08:44+00:00" + "time": "2018-04-26T10:06:28+00:00" }, { "name": "symfony/process", - "version": "v3.4.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "09a5172057be8fc677840e591b17f385e58c7c0d" + "reference": "3621fa74d0576a6f89d63bc44fabd376711bd0b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/09a5172057be8fc677840e591b17f385e58c7c0d", - "reference": "09a5172057be8fc677840e591b17f385e58c7c0d", + "url": "https://api.github.com/repos/symfony/process/zipball/3621fa74d0576a6f89d63bc44fabd376711bd0b0", + "reference": "3621fa74d0576a6f89d63bc44fabd376711bd0b0", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3746,38 +3814,38 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-01-29T09:03:43+00:00" + "time": "2018-05-16T09:05:32+00:00" }, { "name": "symfony/routing", - "version": "v3.4.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "235d01730d553a97732990588407eaf6779bb4b2" + "reference": "e8833b64b139926cbe1610d53722185e55c18e44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/235d01730d553a97732990588407eaf6779bb4b2", - "reference": "235d01730d553a97732990588407eaf6779bb4b2", + "url": "https://api.github.com/repos/symfony/routing/zipball/e8833b64b139926cbe1610d53722185e55c18e44", + "reference": "e8833b64b139926cbe1610d53722185e55c18e44", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "conflict": { - "symfony/config": "<2.8", - "symfony/dependency-injection": "<3.3", + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { "doctrine/annotations": "~1.0", "doctrine/common": "~2.2", "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, "suggest": { @@ -3791,7 +3859,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3824,48 +3892,48 @@ "uri", "url" ], - "time": "2018-01-16T18:03:57+00:00" + "time": "2018-05-16T14:21:07+00:00" }, { "name": "symfony/translation", - "version": "v3.4.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "10b32cf0eae28b9b39fe26c456c42b19854c4b84" + "reference": "e1f5863d0a9e79cfec7f031421ced3fe1d403e66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/10b32cf0eae28b9b39fe26c456c42b19854c4b84", - "reference": "10b32cf0eae28b9b39fe26c456c42b19854c4b84", + "url": "https://api.github.com/repos/symfony/translation/zipball/e1f5863d0a9e79cfec7f031421ced3fe1d403e66", + "reference": "e1f5863d0a9e79cfec7f031421ced3fe1d403e66", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/config": "<2.8", + "symfony/config": "<3.4", "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", + "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/intl": "^2.8.18|^3.2.5|~4.0", + "symfony/intl": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, "suggest": { - "psr/log": "To use logging capability in translator", + "psr/log-implementation": "To use logging capability in translator", "symfony/config": "", "symfony/yaml": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3892,25 +3960,26 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2018-01-18T22:16:57+00:00" + "time": "2018-05-21T10:09:47+00:00" }, { "name": "symfony/var-dumper", - "version": "v3.4.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "472a9849930cf21f73abdb02240f17cf5b5bd1a7" + "reference": "3c34cf3f4bbac9e003d9325225e9ef1a49180a18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/472a9849930cf21f73abdb02240f17cf5b5bd1a7", - "reference": "472a9849930cf21f73abdb02240f17cf5b5bd1a7", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3c34cf3f4bbac9e003d9325225e9ef1a49180a18", + "reference": "3c34cf3f4bbac9e003d9325225e9ef1a49180a18", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.0" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" }, "conflict": { "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" @@ -3921,13 +3990,12 @@ }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "ext-symfony_debug": "" + "ext-intl": "To show region name in time zone dump" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3961,7 +4029,7 @@ "debug", "dump" ], - "time": "2018-01-29T09:03:43+00:00" + "time": "2018-04-26T16:12:06+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -4166,16 +4234,16 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.1.1", + "version": "v3.1.5", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "f0018d359a2ad6968ad11b283283a925e017f3c9" + "reference": "d3cdca2ad6cc6e67735b4a63e7551c690a497f5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/f0018d359a2ad6968ad11b283283a925e017f3c9", - "reference": "f0018d359a2ad6968ad11b283283a925e017f3c9", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/d3cdca2ad6cc6e67735b4a63e7551c690a497f5f", + "reference": "d3cdca2ad6cc6e67735b4a63e7551c690a497f5f", "shasum": "" }, "require": { @@ -4230,7 +4298,7 @@ "profiler", "webprofiler" ], - "time": "2018-02-07T08:29:09+00:00" + "time": "2018-05-03T18:27:04+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -4355,27 +4423,72 @@ "time": "2016-06-13T19:28:20+00:00" }, { - "name": "codedungeon/phpunit-result-printer", - "version": "0.6.0", + "name": "codedungeon/php-cli-colors", + "version": "1.10.7", "source": { "type": "git", - "url": "https://github.com/mikeerickson/phpunit-pretty-result-printer.git", - "reference": "34659fcb48ef35fc27c09ded46ac79b25ee95d2f" + "url": "https://github.com/mikeerickson/php-cli-colors.git", + "reference": "5649ef76ec0c9ed626e95bf40fdfaf4b8efcf79b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mikeerickson/phpunit-pretty-result-printer/zipball/34659fcb48ef35fc27c09ded46ac79b25ee95d2f", - "reference": "34659fcb48ef35fc27c09ded46ac79b25ee95d2f", + "url": "https://api.github.com/repos/mikeerickson/php-cli-colors/zipball/5649ef76ec0c9ed626e95bf40fdfaf4b8efcf79b", + "reference": "5649ef76ec0c9ed626e95bf40fdfaf4b8efcf79b", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": ">=5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codedungeon\\PHPCliColors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike Erickson", + "email": "codedungeon@gmail.com" + } + ], + "description": "PHP Package for using color output in CLI commands", + "homepage": "https://github.com/mikeerickson/php-cli-colors", + "keywords": [ + "color", + "colors", + "composer", + "package", + "php" + ], + "time": "2018-05-17T01:34:14+00:00" + }, + { + "name": "codedungeon/phpunit-result-printer", + "version": "0.17.1", + "source": { + "type": "git", + "url": "https://github.com/mikeerickson/phpunit-pretty-result-printer.git", + "reference": "aac73dbc502e70d42059d74a5aced6911982797b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mikeerickson/phpunit-pretty-result-printer/zipball/aac73dbc502e70d42059d74a5aced6911982797b", + "reference": "aac73dbc502e70d42059d74a5aced6911982797b", "shasum": "" }, "require": { + "codedungeon/php-cli-colors": "^1.10", "hassankhan/config": "^0.10.0", "php": "^7.1", "symfony/yaml": "^2.7|^3.0|^4.0" }, "require-dev": { - "phpunit/phpunit": ">=5.2", - "spatie/phpunit-watcher": "^1.3" + "phpunit/phpunit": "7.1.1", + "spatie/phpunit-watcher": "^1.5" }, "type": "library", "autoload": { @@ -4395,13 +4508,15 @@ ], "description": "PHPUnit Pretty Result Printer", "keywords": [ + "TDD", "composer", "package", "phpunit", "printer", - "result-printer" + "result-printer", + "testing" ], - "time": "2018-02-04T21:48:07+00:00" + "time": "2018-05-09T02:10:52+00:00" }, { "name": "composer/semver", @@ -4582,16 +4697,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v2.10.2", + "version": "v2.11.1", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "74e4682a4073bc8bc2d4ff2b30a4873ac76cc1f1" + "reference": "ad94441c17b8ef096e517acccdbf3238af8a2da8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/74e4682a4073bc8bc2d4ff2b30a4873ac76cc1f1", - "reference": "74e4682a4073bc8bc2d4ff2b30a4873ac76cc1f1", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/ad94441c17b8ef096e517acccdbf3238af8a2da8", + "reference": "ad94441c17b8ef096e517acccdbf3238af8a2da8", "shasum": "" }, "require": { @@ -4599,9 +4714,8 @@ "doctrine/annotations": "^1.2", "ext-json": "*", "ext-tokenizer": "*", - "gecko-packages/gecko-php-unit": "^2.0 || ^3.0", "php": "^5.6 || >=7.0 <7.3", - "php-cs-fixer/diff": "^1.2", + "php-cs-fixer/diff": "^1.3", "symfony/console": "^3.2 || ^4.0", "symfony/event-dispatcher": "^3.0 || ^4.0", "symfony/filesystem": "^3.0 || ^4.0", @@ -4616,14 +4730,14 @@ "hhvm": "*" }, "require-dev": { - "johnkary/phpunit-speedtrap": "^1.1 || ^2.0@dev", + "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0", "justinrainbow/json-schema": "^5.0", "keradus/cli-executor": "^1.0", "mikey179/vfsstream": "^1.6", "php-coveralls/php-coveralls": "^2.0", "php-cs-fixer/accessible-object": "^1.0", - "phpunit/phpunit": "^5.7.23 || ^6.4.3", - "phpunitgoodpractices/traits": "^1.0", + "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", + "phpunitgoodpractices/traits": "^1.3.1", "symfony/phpunit-bridge": "^3.2.2 || ^4.0" }, "suggest": { @@ -4634,6 +4748,11 @@ "php-cs-fixer" ], "type": "application", + "extra": { + "branch-alias": { + "dev-master": "2.11-dev" + } + }, "autoload": { "psr-4": { "PhpCsFixer\\": "src/" @@ -4643,6 +4762,9 @@ "tests/Test/AbstractIntegrationCaseFactory.php", "tests/Test/AbstractIntegrationTestCase.php", "tests/Test/Assert/AssertTokensTrait.php", + "tests/Test/Constraint/SameStringsConstraint.php", + "tests/Test/Constraint/SameStringsConstraintForV5.php", + "tests/Test/Constraint/SameStringsConstraintForV7.php", "tests/Test/IntegrationCase.php", "tests/Test/IntegrationCaseFactory.php", "tests/Test/IntegrationCaseFactoryInterface.php", @@ -4665,7 +4787,7 @@ } ], "description": "A tool to automatically fix PHP code style", - "time": "2018-02-03T08:30:06+00:00" + "time": "2018-03-21T17:41:26+00:00" }, { "name": "fzaninotto/faker", @@ -4717,58 +4839,6 @@ ], "time": "2017-08-15T16:48:10+00:00" }, - { - "name": "gecko-packages/gecko-php-unit", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/GeckoPackages/GeckoPHPUnit.git", - "reference": "8b0320158e34c3d85e5133c341d55c4d6ec5e927" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/GeckoPackages/GeckoPHPUnit/zipball/8b0320158e34c3d85e5133c341d55c4d6ec5e927", - "reference": "8b0320158e34c3d85e5133c341d55c4d6ec5e927", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "conflict": { - "phpunit/phpunit": "<6.0 || >6.5" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-dom": "When testing with xml.", - "ext-libxml": "When testing with xml.", - "phpunit/phpunit": "This is an extension for PHPUnit so make sure you have that in some way." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "GeckoPackages\\PHPUnit\\": "src/PHPUnit" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Additional PHPUnit asserts and constraints.", - "homepage": "https://github.com/GeckoPackages", - "keywords": [ - "extension", - "filesystem", - "phpunit" - ], - "time": "2018-02-05T09:18:39+00:00" - }, { "name": "hamcrest/hamcrest-php", "version": "v2.0.0", @@ -4937,16 +5007,16 @@ }, { "name": "mockery/mockery", - "version": "1.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "1bac8c362b12f522fdd1f1fa3556284c91affa38" + "reference": "99e29d3596b16dabe4982548527d5ddf90232e99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/1bac8c362b12f522fdd1f1fa3556284c91affa38", - "reference": "1bac8c362b12f522fdd1f1fa3556284c91affa38", + "url": "https://api.github.com/repos/mockery/mockery/zipball/99e29d3596b16dabe4982548527d5ddf90232e99", + "reference": "99e29d3596b16dabe4982548527d5ddf90232e99", "shasum": "" }, "require": { @@ -4955,7 +5025,8 @@ "php": ">=5.6.0" }, "require-dev": { - "phpunit/phpunit": "~5.7|~6.1" + "phpdocumentor/phpdocumentor": "^2.9", + "phpunit/phpunit": "~5.7.10|~6.5" }, "type": "library", "extra": { @@ -4984,8 +5055,8 @@ "homepage": "http://davedevelopment.co.uk" } ], - "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.", - "homepage": "http://github.com/mockery/mockery", + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", "keywords": [ "BDD", "TDD", @@ -4998,7 +5069,7 @@ "test double", "testing" ], - "time": "2017-10-06T16:20:43+00:00" + "time": "2018-05-08T08:54:48+00:00" }, { "name": "myclabs/deep-copy", @@ -5045,6 +5116,68 @@ ], "time": "2017-10-19T19:58:43+00:00" }, + { + "name": "nunomaduro/collision", + "version": "v2.0.2", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "245958b02c6a9edf24627380f368333ac5413a51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/245958b02c6a9edf24627380f368333ac5413a51", + "reference": "245958b02c6a9edf24627380f368333ac5413a51", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.1.4", + "jakub-onderka/php-console-highlighter": "0.3.*", + "php": "^7.1", + "symfony/console": "~2.8|~3.3|~4.0" + }, + "require-dev": { + "laravel/framework": "5.6.*", + "phpunit/phpunit": "~7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "time": "2018-03-21T20:11:24+00:00" + }, { "name": "phar-io/manifest", "version": "1.0.1", @@ -5149,23 +5282,23 @@ }, { "name": "php-cs-fixer/diff", - "version": "v1.2.1", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/diff.git", - "reference": "b95b8c02c58670b15612cfc60873f3f7f5290484" + "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/b95b8c02c58670b15612cfc60873f3f7f5290484", - "reference": "b95b8c02c58670b15612cfc60873f3f7f5290484", + "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/78bb099e9c16361126c86ce82ec4405ebab8e756", + "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756", "shasum": "" }, "require": { "php": "^5.6 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.4.3", + "phpunit/phpunit": "^5.7.23 || ^6.4.3", "symfony/process": "^3.3" }, "type": "library", @@ -5196,7 +5329,7 @@ "keywords": [ "diff" ], - "time": "2017-10-21T10:28:17+00:00" + "time": "2018-02-15T16:58:55+00:00" }, { "name": "php-mock/php-mock", @@ -5314,25 +5447,28 @@ }, { "name": "php-mock/php-mock-phpunit", - "version": "2.0.1", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/php-mock/php-mock-phpunit.git", - "reference": "b42fc41ecb7538564067527f6c30b8854f149d32" + "reference": "ff1cc1d4e7478ce74221e05742588619bee84f69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-mock/php-mock-phpunit/zipball/b42fc41ecb7538564067527f6c30b8854f149d32", - "reference": "b42fc41ecb7538564067527f6c30b8854f149d32", + "url": "https://api.github.com/repos/php-mock/php-mock-phpunit/zipball/ff1cc1d4e7478ce74221e05742588619bee84f69", + "reference": "ff1cc1d4e7478ce74221e05742588619bee84f69", "shasum": "" }, "require": { "php": ">=7", "php-mock/php-mock-integration": "^2", - "phpunit/phpunit": "^6 <6.5" + "phpunit/phpunit": "^6 || ^7" }, "type": "library", "autoload": { + "files": [ + "autoload.php" + ], "psr-4": { "phpmock\\phpunit\\": "classes/" } @@ -5361,7 +5497,7 @@ "test", "test double" ], - "time": "2017-12-02T09:49:02+00:00" + "time": "2018-04-06T13:54:43+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -5517,28 +5653,28 @@ }, { "name": "phpspec/prophecy", - "version": "1.7.3", + "version": "1.7.6", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf" + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", - "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", - "sebastian/comparator": "^1.1|^2.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, "require-dev": { "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" }, "type": "library", "extra": { @@ -5576,44 +5712,44 @@ "spy", "stub" ], - "time": "2017-11-24T13:59:53+00:00" + "time": "2018-04-18T13:57:24+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "5.3.0", + "version": "6.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1" + "reference": "52187754b0eed0b8159f62a6fa30073327e8c2ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/661f34d0bd3f1a7225ef491a70a020ad23a057a1", - "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/52187754b0eed0b8159f62a6fa30073327e8c2ca", + "reference": "52187754b0eed0b8159f62a6fa30073327e8c2ca", "shasum": "" }, "require": { "ext-dom": "*", "ext-xmlwriter": "*", - "php": "^7.0", + "php": "^7.1", "phpunit/php-file-iterator": "^1.4.2", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^2.0.1", + "phpunit/php-token-stream": "^3.0", "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.0", + "sebastian/environment": "^3.1", "sebastian/version": "^2.0.1", "theseer/tokenizer": "^1.1" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^7.0" }, "suggest": { - "ext-xdebug": "^2.5.5" + "ext-xdebug": "^2.6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.3.x-dev" + "dev-master": "6.0-dev" } }, "autoload": { @@ -5639,7 +5775,7 @@ "testing", "xunit" ], - "time": "2017-12-06T09:29:45+00:00" + "time": "2018-04-29T14:59:09+00:00" }, { "name": "phpunit/php-file-iterator", @@ -5731,28 +5867,28 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.9", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", + "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -5767,7 +5903,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -5776,33 +5912,33 @@ "keywords": [ "timer" ], - "time": "2017-02-26T11:10:40+00:00" + "time": "2018-02-01T13:07:23+00:00" }, { "name": "phpunit/php-token-stream", - "version": "2.0.2", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "791198a2c6254db10131eecfe8c06670700904db" + "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", - "reference": "791198a2c6254db10131eecfe8c06670700904db", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace", + "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.2.4" + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -5825,20 +5961,20 @@ "keywords": [ "tokenizer" ], - "time": "2017-11-27T05:48:46+00:00" + "time": "2018-02-01T13:16:43+00:00" }, { "name": "phpunit/phpunit", - "version": "6.4.4", + "version": "7.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "562f7dc75d46510a4ed5d16189ae57fbe45a9932" + "reference": "ca64dba53b88aba6af32aebc6b388068db95c435" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/562f7dc75d46510a4ed5d16189ae57fbe45a9932", - "reference": "562f7dc75d46510a4ed5d16189ae57fbe45a9932", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ca64dba53b88aba6af32aebc6b388068db95c435", + "reference": "ca64dba53b88aba6af32aebc6b388068db95c435", "shasum": "" }, "require": { @@ -5850,15 +5986,15 @@ "myclabs/deep-copy": "^1.6.1", "phar-io/manifest": "^1.0.1", "phar-io/version": "^1.0", - "php": "^7.0", + "php": "^7.1", "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^5.2.2", - "phpunit/php-file-iterator": "^1.4.2", + "phpunit/php-code-coverage": "^6.0.1", + "phpunit/php-file-iterator": "^1.4.3", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^1.0.9", - "phpunit/phpunit-mock-objects": "^4.0.3", - "sebastian/comparator": "^2.0.2", - "sebastian/diff": "^2.0", + "phpunit/php-timer": "^2.0", + "phpunit/phpunit-mock-objects": "^6.1.1", + "sebastian/comparator": "^3.0", + "sebastian/diff": "^3.0", "sebastian/environment": "^3.1", "sebastian/exporter": "^3.1", "sebastian/global-state": "^2.0", @@ -5866,16 +6002,12 @@ "sebastian/resource-operations": "^1.0", "sebastian/version": "^2.0.1" }, - "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2", - "phpunit/dbunit": "<3.0" - }, "require-dev": { "ext-pdo": "*" }, "suggest": { "ext-xdebug": "*", - "phpunit/php-invoker": "^1.1" + "phpunit/php-invoker": "^2.0" }, "bin": [ "phpunit" @@ -5883,7 +6015,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.4.x-dev" + "dev-master": "7.1-dev" } }, "autoload": { @@ -5909,33 +6041,30 @@ "testing", "xunit" ], - "time": "2017-11-08T11:26:09+00:00" + "time": "2018-04-29T15:09:19+00:00" }, { "name": "phpunit/phpunit-mock-objects", - "version": "4.0.4", + "version": "6.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "2f789b59ab89669015ad984afa350c4ec577ade0" + "reference": "70c740bde8fd9ea9ea295be1cd875dd7b267e157" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/2f789b59ab89669015ad984afa350c4ec577ade0", - "reference": "2f789b59ab89669015ad984afa350c4ec577ade0", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/70c740bde8fd9ea9ea295be1cd875dd7b267e157", + "reference": "70c740bde8fd9ea9ea295be1cd875dd7b267e157", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.5", - "php": "^7.0", + "php": "^7.1", "phpunit/php-text-template": "^1.2.1", - "sebastian/exporter": "^3.0" - }, - "conflict": { - "phpunit/phpunit": "<6.0" + "sebastian/exporter": "^3.1" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^7.0" }, "suggest": { "ext-soap": "*" @@ -5943,7 +6072,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0.x-dev" + "dev-master": "6.1-dev" } }, "autoload": { @@ -5958,7 +6087,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -5968,7 +6097,7 @@ "mock", "xunit" ], - "time": "2017-08-03T14:08:16+00:00" + "time": "2018-04-11T04:50:36+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -6017,30 +6146,30 @@ }, { "name": "sebastian/comparator", - "version": "2.1.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" + "reference": "ed5fd2281113729f1ebcc64d101ad66028aeb3d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ed5fd2281113729f1ebcc64d101ad66028aeb3d5", + "reference": "ed5fd2281113729f1ebcc64d101ad66028aeb3d5", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/diff": "^2.0 || ^3.0", + "php": "^7.1", + "sebastian/diff": "^3.0", "sebastian/exporter": "^3.1" }, "require-dev": { - "phpunit/phpunit": "^6.4" + "phpunit/phpunit": "^7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -6077,32 +6206,33 @@ "compare", "equality" ], - "time": "2018-02-01T13:46:46+00:00" + "time": "2018-04-18T13:33:00+00:00" }, { "name": "sebastian/diff", - "version": "2.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" + "reference": "e09160918c66281713f1c324c1f4c4c3037ba1e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/e09160918c66281713f1c324c1f4c4c3037ba1e8", + "reference": "e09160918c66281713f1c324c1f4c4c3037ba1e8", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.2" + "phpunit/phpunit": "^7.0", + "symfony/process": "^2 || ^3.3 || ^4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -6127,9 +6257,12 @@ "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "diff" + "diff", + "udiff", + "unidiff", + "unified diff" ], - "time": "2017-08-03T08:09:46+00:00" + "time": "2018-02-01T13:45:15+00:00" }, { "name": "sebastian/environment", @@ -6531,7 +6664,7 @@ }, { "name": "symfony/class-loader", - "version": "v3.4.4", + "version": "v3.4.11", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", @@ -6587,20 +6720,21 @@ }, { "name": "symfony/filesystem", - "version": "v4.0.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "760e47a4ee64b4c48f4b30017011e09d4c0f05ed" + "reference": "7a69e728e9f0044958c2fd7d72bfe5e7bd1a4d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/760e47a4ee64b4c48f4b30017011e09d4c0f05ed", - "reference": "760e47a4ee64b4c48f4b30017011e09d4c0f05ed", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7a69e728e9f0044958c2fd7d72bfe5e7bd1a4d04", + "reference": "7a69e728e9f0044958c2fd7d72bfe5e7bd1a4d04", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { @@ -6632,20 +6766,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:38:00+00:00" + "time": "2018-05-16T09:05:32+00:00" }, { "name": "symfony/options-resolver", - "version": "v4.0.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "371532a2cfe932f7a3766dd4c45364566def1dd0" + "reference": "ac1c3a814ddcad9d0cc2d0382e215d3bff8ae2d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/371532a2cfe932f7a3766dd4c45364566def1dd0", - "reference": "371532a2cfe932f7a3766dd4c45364566def1dd0", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/ac1c3a814ddcad9d0cc2d0382e215d3bff8ae2d2", + "reference": "ac1c3a814ddcad9d0cc2d0382e215d3bff8ae2d2", "shasum": "" }, "require": { @@ -6686,37 +6820,41 @@ "configuration", "options" ], - "time": "2018-01-18T22:19:33+00:00" + "time": "2018-05-11T15:58:37+00:00" }, { - "name": "symfony/polyfill-php72", - "version": "v1.7.0", + "name": "symfony/polyfill-php70", + "version": "v1.8.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "8eca20c8a369e069d4f4c2ac9895144112867422" + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "77454693d8f10dd23bb24955cffd2d82db1007a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/8eca20c8a369e069d4f4c2ac9895144112867422", - "reference": "8eca20c8a369e069d4f4c2ac9895144112867422", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/77454693d8f10dd23bb24955cffd2d82db1007a6", + "reference": "77454693d8f10dd23bb24955cffd2d82db1007a6", "shasum": "" }, "require": { + "paragonie/random_compat": "~1.0|~2.0", "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "1.8-dev" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" + "Symfony\\Polyfill\\Php70\\": "" }, "files": [ "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -6733,7 +6871,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -6741,20 +6879,20 @@ "portable", "shim" ], - "time": "2018-01-31T17:43:24+00:00" + "time": "2018-04-26T10:06:28+00:00" }, { "name": "symfony/stopwatch", - "version": "v4.0.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "d52321f0e2b596bd03b5d1dd6eebe71caa925704" + "reference": "6795ffa2f8eebedac77f045aa62c0c10b2763042" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/d52321f0e2b596bd03b5d1dd6eebe71caa925704", - "reference": "d52321f0e2b596bd03b5d1dd6eebe71caa925704", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/6795ffa2f8eebedac77f045aa62c0c10b2763042", + "reference": "6795ffa2f8eebedac77f045aa62c0c10b2763042", "shasum": "" }, "require": { @@ -6790,24 +6928,25 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:38:00+00:00" + "time": "2018-02-19T16:50:22+00:00" }, { "name": "symfony/yaml", - "version": "v4.0.4", + "version": "v4.0.11", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "ffc60bda1d4a00ec0b32eeabf39dc017bf480028" + "reference": "048b1be5fb96e73ff1d065f5e7e23f84415ac907" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/ffc60bda1d4a00ec0b32eeabf39dc017bf480028", - "reference": "ffc60bda1d4a00ec0b32eeabf39dc017bf480028", + "url": "https://api.github.com/repos/symfony/yaml/zipball/048b1be5fb96e73ff1d065f5e7e23f84415ac907", + "reference": "048b1be5fb96e73ff1d065f5e7e23f84415ac907", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/console": "<3.4" @@ -6848,7 +6987,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-01-21T19:06:11+00:00" + "time": "2018-05-07T07:12:24+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/app.php b/config/app.php index 12034dd00..a7c196b3c 100644 --- a/config/app.php +++ b/config/app.php @@ -9,7 +9,7 @@ return [ | change this value if you are not maintaining your own internal versions. */ - 'version' => '0.7.6', + 'version' => 'canary', /* |-------------------------------------------------------------------------- @@ -116,23 +116,6 @@ return [ 'cipher' => 'AES-256-CBC', - /* - |-------------------------------------------------------------------------- - | Logging Configuration - |-------------------------------------------------------------------------- - | - | Here you may configure the log settings for your application. Out of - | the box, Laravel uses the Monolog PHP logging library. This gives - | you a variety of powerful log handlers / formatters to utilize. - | - | Available Settings: "single", "daily", "syslog", "errorlog" - | - */ - - 'log' => env('APP_LOG', 'daily'), - - 'log_level' => env('APP_LOG_LEVEL', 'info'), - /* |-------------------------------------------------------------------------- | Exception Reporter Configuration diff --git a/config/database.php b/config/database.php index 51d1e118c..7d09275df 100644 --- a/config/database.php +++ b/config/database.php @@ -98,14 +98,14 @@ return [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), - 'database' => env('REDIS_DATBASE', 0), + 'database' => env('REDIS_DATABASE', 0), ], 'sessions' => [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), - 'database' => env('REDIS_DATBASE_SESSIONS', 1), + 'database' => env('REDIS_DATABASE_SESSIONS', 1), ], ], ]; diff --git a/config/hashing.php b/config/hashing.php new file mode 100644 index 000000000..f45a6090b --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,50 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 1024, + 'threads' => 2, + 'time' => 2, + ], +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 000000000..33b6a5d0e --- /dev/null +++ b/config/logging.php @@ -0,0 +1,81 @@ + env('LOG_CHANNEL', 'daily'), + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => 'debug', + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => 'debug', + 'days' => 7, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => 'critical', + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'handler' => StreamHandler::class, + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => 'debug', + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => 'debug', + ], + ], + +]; diff --git a/config/trustedproxy.php b/config/trustedproxy.php index c60aa6a06..d14bf4a1d 100644 --- a/config/trustedproxy.php +++ b/config/trustedproxy.php @@ -34,7 +34,7 @@ return [ /* * Or, to trust ALL proxies, including those that - * are in a chain of fowarding, uncomment this: + * are in a chain of forwarding, uncomment this: */ // 'proxies' => '**', @@ -50,10 +50,5 @@ return [ * The following are Symfony defaults, found in * \Symfony\Component\HttpFoundation\Request::$trustedHeaders */ - 'headers' => [ - \Illuminate\Http\Request::HEADER_CLIENT_IP => 'X_FORWARDED_FOR', - \Illuminate\Http\Request::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST', - \Illuminate\Http\Request::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO', - \Illuminate\Http\Request::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT', - ], + 'headers' => \Illuminate\Http\Request::HEADER_X_FORWARDED_ALL, ]; diff --git a/database/migrations/2018_05_04_123826_add_maintenance_to_nodes.php b/database/migrations/2018_05_04_123826_add_maintenance_to_nodes.php new file mode 100644 index 000000000..799f1df23 --- /dev/null +++ b/database/migrations/2018_05_04_123826_add_maintenance_to_nodes.php @@ -0,0 +1,32 @@ +boolean('maintenance_mode')->after('behind_proxy')->default(false); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('nodes', function (Blueprint $table) { + $table->dropColumn('maintenance_mode'); + }); + } +} diff --git a/database/seeds/eggs/minecraft/egg-spigot.json b/database/seeds/eggs/minecraft/egg-spigot.json index 4de4c6e6d..b65bcfdf0 100644 --- a/database/seeds/eggs/minecraft/egg-spigot.json +++ b/database/seeds/eggs/minecraft/egg-spigot.json @@ -3,7 +3,7 @@ "meta": { "version": "PTDL_v1" }, - "exported_at": "2018-01-21T16:47:24-06:00", + "exported_at": "2018-02-25T12:20:22-05:00", "name": "Spigot", "author": "support@pterodactyl.io", "description": "Spigot is the most widely-used modded Minecraft server software in the world. It powers many of the top Minecraft server networks around to ensure they can cope with their huge player base and ensure the satisfaction of their players. Spigot works by reducing and eliminating many causes of lag, as well as adding in handy features and settings that help make your job of server administration easier.", @@ -17,8 +17,8 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/ash\n# Spigot Installation Script\n#\n# Server Files: \/mnt\/server\n\n## Only download if a path is provided, otherwise continue.\nif [ ! -z \"${DL_PATH}\" ]; then\n apk update\n apk add curl\n\n cd \/mnt\/server\n\n MODIFIED_DOWNLOAD=`eval echo $(echo ${DL_PATH} | sed -e 's\/{{\/${\/g' -e 's\/}}\/}\/g')`\n curl -sSL -o ${SERVER_JARFILE} ${MODIFIED_DOWNLOAD}\nfi", - "container": "alpine:3.4", + "script": "#!\/bin\/ash\r\n# Spigot Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\n## Only download if a path is provided, otherwise continue.\r\nif [ ! -z \"${DL_PATH}\" ]; then\r\n apk update\r\n apk add curl\r\n\r\n cd \/mnt\/server\r\n\r\n MODIFIED_DOWNLOAD=`eval echo $(echo ${DL_PATH} | sed -e 's\/{{\/${\/g' -e 's\/}}\/}\/g')`\r\n curl -sSL -o ${SERVER_JARFILE} ${MODIFIED_DOWNLOAD}\r\nelse\r\n apk add --no-cache curl git openjdk8 openssl\r\n \r\n cd \/srv\/\r\n \r\n wget https:\/\/hub.spigotmc.org\/jenkins\/job\/BuildTools\/lastSuccessfulBuild\/artifact\/target\/BuildTools.jar\r\n \r\n mv BuildTools.jar \/srv\/\r\n\r\n java -jar BuildTools.jar --rev ${DL_VERSION}\r\n\r\n mv spigot-*.jar \/mnt\/server\/${SERVER_JARFILE}\r\nfi", + "container": "alpine:3.7", "entrypoint": "ash" } }, @@ -51,4 +51,4 @@ "rules": "nullable|string" } ] -} \ No newline at end of file +} diff --git a/phpunit.xml b/phpunit.xml index 0ceb3db26..0b67ad6ea 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -24,6 +24,7 @@ + diff --git a/public/themes/pterodactyl/css/pterodactyl.css b/public/themes/pterodactyl/css/pterodactyl.css index 9e7e6a822..41f163f3b 100644 --- a/public/themes/pterodactyl/css/pterodactyl.css +++ b/public/themes/pterodactyl/css/pterodactyl.css @@ -473,3 +473,7 @@ label.control-label > span.field-optional:before { height: 42px; width: auto; } + +.number-info-box-content { + padding: 15px 10px 0; +} diff --git a/public/themes/pterodactyl/js/admin/statistics.js b/public/themes/pterodactyl/js/admin/statistics.js new file mode 100644 index 000000000..7433f3221 --- /dev/null +++ b/public/themes/pterodactyl/js/admin/statistics.js @@ -0,0 +1,118 @@ +var freeDisk = Pterodactyl.totalNodeDisk - Pterodactyl.totalServerDisk; +let diskChart = new Chart($('#disk_chart'), { + type: 'pie', + data: { + labels: ['Free Disk', 'Used Disk'], + datasets: [ + { + label: 'Disk (in MB)', + backgroundColor: ['#51B060', '#ff0000'], + data: [freeDisk, Pterodactyl.totalServerDisk] + } + ] + } +}); + +var freeRam = Pterodactyl.totalNodeRam - Pterodactyl.totalServerRam; +let ramChart = new Chart($('#ram_chart'), { + type: 'pie', + data: { + labels: ['Free RAM', 'Used RAM'], + datasets: [ + { + label: 'Memory (in MB)', + backgroundColor: ['#51B060', '#ff0000'], + data: [freeRam, Pterodactyl.totalServerRam] + } + ] + } +}); + +var activeServers = Pterodactyl.servers.length - Pterodactyl.suspendedServers; +let serversChart = new Chart($('#servers_chart'), { + type: 'pie', + data: { + labels: ['Active', 'Suspended'], + datasets: [ + { + label: 'Servers', + backgroundColor: ['#51B060', '#E08E0B'], + data: [activeServers, Pterodactyl.suspendedServers] + } + ] + } +}); + +let statusChart = new Chart($('#status_chart'), { + type: 'pie', + data: { + labels: ['Online', 'Offline', 'Installing', 'Error'], + datasets: [ + { + label: '', + backgroundColor: ['#51B060', '#b7b7b7', '#E08E0B', '#ff0000'], + data: [0,0,0,0] + } + ] + } +}); + +var servers = Pterodactyl.servers; +var nodes = Pterodactyl.nodes; + +for (let i = 0; i < servers.length; i++) { + setTimeout(getStatus, 200 * i, servers[i]); +} + +function getStatus(server) { + var uuid = server.uuid; + var node = getNodeByID(server.node_id); + + $.ajax({ + type: 'GET', + url: node.scheme + '://' + node.fqdn + ':'+node.daemonListen+'/v1/server', + timeout: 5000, + headers: { + 'X-Access-Server': uuid, + 'X-Access-Token': Pterodactyl.tokens[node.id], + } + }).done(function (data) { + + if (typeof data.status === 'undefined') { + // Error + statusChart.data.datasets[0].data[3]++; + return; + } + + switch (data.status) { + case 0: + case 3: + case 30: + // Offline + statusChart.data.datasets[0].data[1]++; + break; + case 1: + case 2: + // Online + statusChart.data.datasets[0].data[0]++; + break; + case 20: + // Installing + statusChart.data.datasets[0].data[2]++; + break; + } + statusChart.update(); + }).fail(function (jqXHR) { + // Error + statusChart.data.datasets[0].data[3]++; + statusChart.update(); + }); +} + +function getNodeByID(id) { + for (var i = 0; i < nodes.length; i++) { + if (nodes[i].id === id) { + return nodes[i]; + } + } +} \ No newline at end of file diff --git a/public/themes/pterodactyl/js/frontend/2fa-modal.js b/public/themes/pterodactyl/js/frontend/2fa-modal.js index d542b377c..8de4ee539 100644 --- a/public/themes/pterodactyl/js/frontend/2fa-modal.js +++ b/public/themes/pterodactyl/js/frontend/2fa-modal.js @@ -44,7 +44,7 @@ var TwoFactorModal = (function () { }); $('#open2fa').modal('show'); }).fail(function (jqXHR) { - alert('An error occured while attempting to load the 2FA setup modal. Please try again.'); + alert('An error occurred while attempting to load the 2FA setup modal. Please try again.'); console.error(jqXHR); }); diff --git a/public/themes/pterodactyl/js/frontend/files/filemanager.min.js b/public/themes/pterodactyl/js/frontend/files/filemanager.min.js index 2ac6b8bbc..2dc67f833 100644 --- a/public/themes/pterodactyl/js/frontend/files/filemanager.min.js +++ b/public/themes/pterodactyl/js/frontend/files/filemanager.min.js @@ -1,5 +1,5 @@ -'use strict';var _createClass=function(){function defineProperties(target,props){for(var i=0;i\n \n ';nameBlock.html(attachEditor);var inputField=nameBlock.find('input');var inputLoader=nameBlock.find('.input-loader');inputField.focus();inputField.on('blur keydown',function(e){if(e.type==='keydown'&&e.which===27||e.type==='blur'||e.type==='keydown'&&e.which===13&¤tName===inputField.val()){if(!_.isEmpty(currentLink)){nameBlock.html(currentLink)}else{nameBlock.html(currentName)}inputField.remove();ContextMenu.unbind().run();return}if(e.type==='keydown'&&e.which!==13)return;inputLoader.show();var currentPath=decodeURIComponent(nameBlock.data('path'));$.ajax({type:'POST',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/rename',timeout:10000,data:JSON.stringify({from:''+currentPath+currentName,to:''+currentPath+inputField.val()})}).done(function(data){nameBlock.attr('data-name',inputField.val());if(!_.isEmpty(currentLink)){var newLink=currentLink.attr('href');if(nameBlock.parent().data('type')!=='folder'){newLink=newLink.substr(0,newLink.lastIndexOf('/'))+'/'+inputField.val()}currentLink.attr('href',newLink);nameBlock.html(currentLink.html(inputField.val()))}else{nameBlock.html(inputField.val())}inputField.remove()}).fail(function(jqXHR){console.error(jqXHR);var error='An error occured while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}nameBlock.addClass('has-error').delay(2000).queue(function(){nameBlock.removeClass('has-error').dequeue()});inputField.popover({animation:true,placement:'top',content:error,title:'Save Error'}).popover('show')}).always(function(){inputLoader.remove();ContextMenu.unbind().run()})})}},{key:'copy',value:function copy(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var currentName=decodeURIComponent(nameBlock.attr('data-name'));var currentPath=decodeURIComponent(nameBlock.data('path'));swal({type:'input',title:'Copy File',text:'Please enter the new path for the copied file below.',showCancelButton:true,showConfirmButton:true,closeOnConfirm:false,showLoaderOnConfirm:true,inputValue:''+currentPath+currentName},function(val){$.ajax({type:'POST',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/copy',timeout:10000,data:JSON.stringify({from:''+currentPath+currentName,to:''+val})}).done(function(data){swal({type:'success',title:'',text:'File successfully copied.'});Files.list()}).fail(function(jqXHR){console.error(jqXHR);var error='An error occured while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}swal({type:'error',title:'',text:error})})})}},{key:'download',value:function download(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var fileName=decodeURIComponent(nameBlock.attr('data-name'));var filePath=decodeURIComponent(nameBlock.data('path'));window.location='/server/'+Pterodactyl.server.uuidShort+'/files/download/'+filePath+fileName}},{key:'delete',value:function _delete(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var delPath=decodeURIComponent(nameBlock.data('path'));var delName=decodeURIComponent(nameBlock.data('name'));swal({type:'warning',title:'',text:'Are you sure you want to delete '+delName+'?',html:true,showCancelButton:true,showConfirmButton:true,closeOnConfirm:false,showLoaderOnConfirm:true},function(){$.ajax({type:'POST',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/delete',timeout:10000,data:JSON.stringify({items:[''+delPath+delName]})}).done(function(data){nameBlock.parent().addClass('warning').delay(200).fadeOut();swal({type:'success',title:'File Deleted'})}).fail(function(jqXHR){console.error(jqXHR);swal({type:'error',title:'Whoops!',html:true,text:'An error occured while attempting to delete this file. Please try again.'})})})}},{key:'toggleMassActions',value:function toggleMassActions(){if($('#file_listing input[type="checkbox"]:checked').length){$('#mass_actions').removeClass('disabled')}else{$('#mass_actions').addClass('disabled')}}},{key:'toggleHighlight',value:function toggleHighlight(event){var parent=$(event.currentTarget);var item=$(event.currentTarget).find('input');if($(item).is(':checked')){$(item).prop('checked',false);parent.removeClass('warning').delay(200)}else{$(item).prop('checked',true);parent.addClass('warning').delay(200)}}},{key:'highlightAll',value:function highlightAll(event){var parent=void 0;var item=$(event.currentTarget).find('input');if($(item).is(':checked')){$('#file_listing input[type=checkbox]').prop('checked',false);$('#file_listing input[data-action="addSelection"]').each(function(){parent=$(this).closest('tr');parent.removeClass('warning').delay(200)})}else{$('#file_listing input[type=checkbox]').prop('checked',true);$('#file_listing input[data-action="addSelection"]').each(function(){parent=$(this).closest('tr');parent.addClass('warning').delay(200)})}}},{key:'deleteSelected',value:function deleteSelected(){var selectedItems=[];var selectedItemsElements=[];var parent=void 0;var nameBlock=void 0;var delLocation=void 0;$('#file_listing input[data-action="addSelection"]:checked').each(function(){parent=$(this).closest('tr');nameBlock=$(parent).find('td[data-identifier="name"]');delLocation=decodeURIComponent(nameBlock.data('path'))+decodeURIComponent(nameBlock.data('name'));selectedItems.push(delLocation);selectedItemsElements.push(parent)});if(selectedItems.length!=0){var formattedItems='';var i=0;$.each(selectedItems,function(key,value){formattedItems+=''+value+', ';i++;return i<5});formattedItems=formattedItems.slice(0,-2);if(selectedItems.length>5){formattedItems+=', and '+(selectedItems.length-5)+' other(s)'}swal({type:'warning',title:'',text:'Are you sure you want to delete the following files: '+formattedItems+'?',html:true,showCancelButton:true,showConfirmButton:true,closeOnConfirm:false,showLoaderOnConfirm:true},function(){$.ajax({type:'POST',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/delete',timeout:10000,data:JSON.stringify({items:selectedItems})}).done(function(data){$('#file_listing input:checked').each(function(){$(this).prop('checked',false)});$.each(selectedItemsElements,function(){$(this).addClass('warning').delay(200).fadeOut()});swal({type:'success',title:'Files Deleted'})}).fail(function(jqXHR){console.error(jqXHR);swal({type:'error',title:'Whoops!',html:true,text:'An error occured while attempting to delete these files. Please try again.'})})})}else{swal({type:'warning',title:'',text:'Please select files/folders to delete.'})}}},{key:'decompress',value:function decompress(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var compPath=decodeURIComponent(nameBlock.data('path'));var compName=decodeURIComponent(nameBlock.data('name'));swal({title:' Decompressing...',text:'This might take a few seconds to complete.',html:true,allowOutsideClick:false,allowEscapeKey:false,showConfirmButton:false});$.ajax({type:'POST',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/decompress',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',data:JSON.stringify({files:''+compPath+compName})}).done(function(data){swal.close();Files.list(compPath)}).fail(function(jqXHR){console.error(jqXHR);var error='An error occured while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}swal({type:'error',title:'Whoops!',html:true,text:error})})}},{key:'compress',value:function compress(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var compPath=decodeURIComponent(nameBlock.data('path'));var compName=decodeURIComponent(nameBlock.data('name'));$.ajax({type:'POST',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/compress',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',data:JSON.stringify({files:''+compPath+compName,to:compPath.toString()})}).done(function(data){Files.list(compPath,function(err){if(err)return;var fileListing=$('#file_listing').find('[data-name="'+data.saved_as+'"]').parent();fileListing.addClass('success pulsate').delay(3000).queue(function(){fileListing.removeClass('success pulsate').dequeue()})})}).fail(function(jqXHR){console.error(jqXHR);var error='An error occured while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}swal({type:'error',title:'Whoops!',html:true,text:error})})}}]);return ActionsClass}(); +'use strict';var _createClass=function(){function defineProperties(target,props){for(var i=0;i\n \n ';nameBlock.html(attachEditor);var inputField=nameBlock.find('input');var inputLoader=nameBlock.find('.input-loader');inputField.focus();inputField.on('blur keydown',function(e){if(e.type==='keydown'&&e.which===27||e.type==='blur'||e.type==='keydown'&&e.which===13&¤tName===inputField.val()){if(!_.isEmpty(currentLink)){nameBlock.html(currentLink)}else{nameBlock.html(currentName)}inputField.remove();ContextMenu.unbind().run();return}if(e.type==='keydown'&&e.which!==13)return;inputLoader.show();var currentPath=decodeURIComponent(nameBlock.data('path'));$.ajax({type:'POST',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/rename',timeout:10000,data:JSON.stringify({from:''+currentPath+currentName,to:''+currentPath+inputField.val()})}).done(function(data){nameBlock.attr('data-name',inputField.val());if(!_.isEmpty(currentLink)){var newLink=currentLink.attr('href');if(nameBlock.parent().data('type')!=='folder'){newLink=newLink.substr(0,newLink.lastIndexOf('/'))+'/'+inputField.val()}currentLink.attr('href',newLink);nameBlock.html(currentLink.html(inputField.val()))}else{nameBlock.html(inputField.val())}inputField.remove()}).fail(function(jqXHR){console.error(jqXHR);var error='An error occurred while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}nameBlock.addClass('has-error').delay(2000).queue(function(){nameBlock.removeClass('has-error').dequeue()});inputField.popover({animation:true,placement:'top',content:error,title:'Save Error'}).popover('show')}).always(function(){inputLoader.remove();ContextMenu.unbind().run()})})}},{key:'copy',value:function copy(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var currentName=decodeURIComponent(nameBlock.attr('data-name'));var currentPath=decodeURIComponent(nameBlock.data('path'));swal({type:'input',title:'Copy File',text:'Please enter the new path for the copied file below.',showCancelButton:true,showConfirmButton:true,closeOnConfirm:false,showLoaderOnConfirm:true,inputValue:''+currentPath+currentName},function(val){$.ajax({type:'POST',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/copy',timeout:10000,data:JSON.stringify({from:''+currentPath+currentName,to:''+val})}).done(function(data){swal({type:'success',title:'',text:'File successfully copied.'});Files.list()}).fail(function(jqXHR){console.error(jqXHR);var error='An error occurred while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}swal({type:'error',title:'',text:error})})})}},{key:'download',value:function download(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var fileName=decodeURIComponent(nameBlock.attr('data-name'));var filePath=decodeURIComponent(nameBlock.data('path'));window.location='/server/'+Pterodactyl.server.uuidShort+'/files/download/'+filePath+fileName}},{key:'delete',value:function _delete(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var delPath=decodeURIComponent(nameBlock.data('path'));var delName=decodeURIComponent(nameBlock.data('name'));swal({type:'warning',title:'',text:'Are you sure you want to delete '+delName+'?',html:true,showCancelButton:true,showConfirmButton:true,closeOnConfirm:false,showLoaderOnConfirm:true},function(){$.ajax({type:'POST',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/delete',timeout:10000,data:JSON.stringify({items:[''+delPath+delName]})}).done(function(data){nameBlock.parent().addClass('warning').delay(200).fadeOut();swal({type:'success',title:'File Deleted'})}).fail(function(jqXHR){console.error(jqXHR);swal({type:'error',title:'Whoops!',html:true,text:'An error occurred while attempting to delete this file. Please try again.'})})})}},{key:'toggleMassActions',value:function toggleMassActions(){if($('#file_listing input[type="checkbox"]:checked').length){$('#mass_actions').removeClass('disabled')}else{$('#mass_actions').addClass('disabled')}}},{key:'toggleHighlight',value:function toggleHighlight(event){var parent=$(event.currentTarget);var item=$(event.currentTarget).find('input');if($(item).is(':checked')){$(item).prop('checked',false);parent.removeClass('warning').delay(200)}else{$(item).prop('checked',true);parent.addClass('warning').delay(200)}}},{key:'highlightAll',value:function highlightAll(event){var parent=void 0;var item=$(event.currentTarget).find('input');if($(item).is(':checked')){$('#file_listing input[type=checkbox]').prop('checked',false);$('#file_listing input[data-action="addSelection"]').each(function(){parent=$(this).closest('tr');parent.removeClass('warning').delay(200)})}else{$('#file_listing input[type=checkbox]').prop('checked',true);$('#file_listing input[data-action="addSelection"]').each(function(){parent=$(this).closest('tr');parent.addClass('warning').delay(200)})}}},{key:'deleteSelected',value:function deleteSelected(){var selectedItems=[];var selectedItemsElements=[];var parent=void 0;var nameBlock=void 0;var delLocation=void 0;$('#file_listing input[data-action="addSelection"]:checked').each(function(){parent=$(this).closest('tr');nameBlock=$(parent).find('td[data-identifier="name"]');delLocation=decodeURIComponent(nameBlock.data('path'))+decodeURIComponent(nameBlock.data('name'));selectedItems.push(delLocation);selectedItemsElements.push(parent)});if(selectedItems.length!=0){var formattedItems='';var i=0;$.each(selectedItems,function(key,value){formattedItems+=''+value+', ';i++;return i<5});formattedItems=formattedItems.slice(0,-2);if(selectedItems.length>5){formattedItems+=', and '+(selectedItems.length-5)+' other(s)'}swal({type:'warning',title:'',text:'Are you sure you want to delete the following files: '+formattedItems+'?',html:true,showCancelButton:true,showConfirmButton:true,closeOnConfirm:false,showLoaderOnConfirm:true},function(){$.ajax({type:'POST',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/delete',timeout:10000,data:JSON.stringify({items:selectedItems})}).done(function(data){$('#file_listing input:checked').each(function(){$(this).prop('checked',false)});$.each(selectedItemsElements,function(){$(this).addClass('warning').delay(200).fadeOut()});swal({type:'success',title:'Files Deleted'})}).fail(function(jqXHR){console.error(jqXHR);swal({type:'error',title:'Whoops!',html:true,text:'An error occurred while attempting to delete these files. Please try again.'})})})}else{swal({type:'warning',title:'',text:'Please select files/folders to delete.'})}}},{key:'decompress',value:function decompress(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var compPath=decodeURIComponent(nameBlock.data('path'));var compName=decodeURIComponent(nameBlock.data('name'));swal({title:' Decompressing...',text:'This might take a few seconds to complete.',html:true,allowOutsideClick:false,allowEscapeKey:false,showConfirmButton:false});$.ajax({type:'POST',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/decompress',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',data:JSON.stringify({files:''+compPath+compName})}).done(function(data){swal.close();Files.list(compPath)}).fail(function(jqXHR){console.error(jqXHR);var error='An error occurred while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}swal({type:'error',title:'Whoops!',html:true,text:error})})}},{key:'compress',value:function compress(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var compPath=decodeURIComponent(nameBlock.data('path'));var compName=decodeURIComponent(nameBlock.data('name'));$.ajax({type:'POST',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/v1/server/file/compress',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',data:JSON.stringify({files:''+compPath+compName,to:compPath.toString()})}).done(function(data){Files.list(compPath,function(err){if(err)return;var fileListing=$('#file_listing').find('[data-name="'+data.saved_as+'"]').parent();fileListing.addClass('success pulsate').delay(3000).queue(function(){fileListing.removeClass('success pulsate').dequeue()})})}).fail(function(jqXHR){console.error(jqXHR);var error='An error occurred while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}swal({type:'error',title:'Whoops!',html:true,text:error})})}}]);return ActionsClass}(); 'use strict';var _createClass=function(){function defineProperties(target,props){for(var i=0;i New File
  • New Folder
  • '}if(Pterodactyl.permissions.downloadFiles||Pterodactyl.permissions.deleteFiles){buildMenu+='
  • '}if(Pterodactyl.permissions.downloadFiles){buildMenu+=''}if(Pterodactyl.permissions.deleteFiles){buildMenu+='
  • Delete
  • '}buildMenu+='';return buildMenu}},{key:'rightClick',value:function rightClick(){var _this=this;$('[data-action="toggleMenu"]').on('mousedown',function(event){event.preventDefault();if($(document).find('#fileOptionMenu').is(':visible')){$('body').trigger('click');return}_this.showMenu(event)});$('#file_listing > tbody td').on('contextmenu',function(event){_this.showMenu(event)})}},{key:'showMenu',value:function showMenu(event){var _this2=this;var parent=$(event.target).closest('tr');var menu=$(this.makeMenu(parent));if(parent.data('type')==='disabled')return;event.preventDefault();$(menu).appendTo('body');$(menu).data('invokedOn',$(event.target)).show().css({position:'absolute',left:event.pageX-150,top:event.pageY});this.activeLine=parent;this.activeLine.addClass('active');var Actions=new ActionsClass(parent,menu);if(Pterodactyl.permissions.moveFiles){$(menu).find('li[data-action="move"]').unbind().on('click',function(e){e.preventDefault();Actions.move()});$(menu).find('li[data-action="rename"]').unbind().on('click',function(e){e.preventDefault();Actions.rename()})}if(Pterodactyl.permissions.copyFiles){$(menu).find('li[data-action="copy"]').unbind().on('click',function(e){e.preventDefault();Actions.copy()})}if(Pterodactyl.permissions.compressFiles){if(parent.data('type')==='folder'){$(menu).find('li[data-action="compress"]').removeClass('hidden')}$(menu).find('li[data-action="compress"]').unbind().on('click',function(e){e.preventDefault();Actions.compress()})}if(Pterodactyl.permissions.decompressFiles){if(_.without(['application/zip','application/gzip','application/x-gzip'],parent.data('mime')).length<3){$(menu).find('li[data-action="decompress"]').removeClass('hidden')}$(menu).find('li[data-action="decompress"]').unbind().on('click',function(e){e.preventDefault();Actions.decompress()})}if(Pterodactyl.permissions.createFiles){$(menu).find('li[data-action="folder"]').unbind().on('click',function(e){e.preventDefault();Actions.folder()})}if(Pterodactyl.permissions.downloadFiles){if(parent.data('type')==='file'){$(menu).find('li[data-action="download"]').removeClass('hidden')}$(menu).find('li[data-action="download"]').unbind().on('click',function(e){e.preventDefault();Actions.download()})}if(Pterodactyl.permissions.deleteFiles){$(menu).find('li[data-action="delete"]').unbind().on('click',function(e){e.preventDefault();Actions.delete()})}$(window).unbind().on('click',function(event){if($(event.target).is('.disable-menu-hide')){event.preventDefault();return}$(menu).unbind().remove();if(!_.isNull(_this2.activeLine))_this2.activeLine.removeClass('active')})}},{key:'directoryClick',value:function directoryClick(){$('a[data-action="directory-view"]').on('click',function(event){event.preventDefault();var path=$(this).parent().data('path')||'';var name=$(this).parent().data('name')||'';window.location.hash=encodeURIComponent(path+name);Files.list()})}}]);return ContextMenuClass}();window.ContextMenu=new ContextMenuClass; -'use strict';var _typeof=typeof Symbol==='function'&&typeof Symbol.iterator==='symbol'?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==='function'&&obj.constructor===Symbol&&obj!==Symbol.prototype?'symbol':typeof obj};var _createClass=function(){function defineProperties(target,props){for(var i=0;i\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\nclass ActionsClass {\n constructor(element, menu) {\n this.element = element;\n this.menu = menu;\n }\n\n destroy() {\n this.element = undefined;\n }\n\n folder(path) {\n let inputValue\n if (path) {\n inputValue = path\n } else {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.data('name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n if ($(this.element).data('type') === 'file') {\n inputValue = currentPath;\n } else {\n inputValue = `${currentPath}${currentName}/`;\n }\n }\n\n swal({\n type: 'input',\n title: 'Create Folder',\n text: 'Please enter the path and folder name below.',\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true,\n inputValue: inputValue\n }, (val) => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/folder`,\n timeout: 10000,\n data: JSON.stringify({\n path: val,\n }),\n }).done(data => {\n swal.close();\n Files.list();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: '',\n text: error,\n });\n });\n });\n }\n\n move() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n swal({\n type: 'input',\n title: 'Move File',\n text: 'Please enter the new path for the file below.',\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true,\n inputValue: `${currentPath}${currentName}`,\n }, (val) => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/move`,\n timeout: 10000,\n data: JSON.stringify({\n from: `${currentPath}${currentName}`,\n to: `${val}`,\n }),\n }).done(data => {\n nameBlock.parent().addClass('warning').delay(200).fadeOut();\n swal.close();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: '',\n text: error,\n });\n });\n });\n\n }\n\n rename() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentLink = nameBlock.find('a');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const attachEditor = `\n \n \n `;\n\n nameBlock.html(attachEditor);\n const inputField = nameBlock.find('input');\n const inputLoader = nameBlock.find('.input-loader');\n\n inputField.focus();\n inputField.on('blur keydown', e => {\n // Save Field\n if (\n (e.type === 'keydown' && e.which === 27)\n || e.type === 'blur'\n || (e.type === 'keydown' && e.which === 13 && currentName === inputField.val())\n ) {\n if (!_.isEmpty(currentLink)) {\n nameBlock.html(currentLink);\n } else {\n nameBlock.html(currentName);\n }\n inputField.remove();\n ContextMenu.unbind().run();\n return;\n }\n\n if (e.type === 'keydown' && e.which !== 13) return;\n\n inputLoader.show();\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/rename`,\n timeout: 10000,\n data: JSON.stringify({\n from: `${currentPath}${currentName}`,\n to: `${currentPath}${inputField.val()}`,\n }),\n }).done(data => {\n nameBlock.attr('data-name', inputField.val());\n if (!_.isEmpty(currentLink)) {\n let newLink = currentLink.attr('href');\n if (nameBlock.parent().data('type') !== 'folder') {\n newLink = newLink.substr(0, newLink.lastIndexOf('/')) + '/' + inputField.val();\n }\n currentLink.attr('href', newLink);\n nameBlock.html(\n currentLink.html(inputField.val())\n );\n } else {\n nameBlock.html(inputField.val());\n }\n inputField.remove();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n nameBlock.addClass('has-error').delay(2000).queue(() => {\n nameBlock.removeClass('has-error').dequeue();\n });\n inputField.popover({\n animation: true,\n placement: 'top',\n content: error,\n title: 'Save Error'\n }).popover('show');\n }).always(() => {\n inputLoader.remove();\n ContextMenu.unbind().run();\n });\n });\n }\n\n copy() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n swal({\n type: 'input',\n title: 'Copy File',\n text: 'Please enter the new path for the copied file below.',\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true,\n inputValue: `${currentPath}${currentName}`,\n }, (val) => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/copy`,\n timeout: 10000,\n data: JSON.stringify({\n from: `${currentPath}${currentName}`,\n to: `${val}`,\n }),\n }).done(data => {\n swal({\n type: 'success',\n title: '',\n text: 'File successfully copied.'\n });\n Files.list();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: '',\n text: error,\n });\n });\n });\n }\n\n download() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const fileName = decodeURIComponent(nameBlock.attr('data-name'));\n const filePath = decodeURIComponent(nameBlock.data('path'));\n\n window.location = `/server/${Pterodactyl.server.uuidShort}/files/download/${filePath}${fileName}`;\n }\n\n delete() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const delPath = decodeURIComponent(nameBlock.data('path'));\n const delName = decodeURIComponent(nameBlock.data('name'));\n\n swal({\n type: 'warning',\n title: '',\n text: 'Are you sure you want to delete ' + delName + '? There is no reversing this action.',\n html: true,\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true\n }, () => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/delete`,\n timeout: 10000,\n data: JSON.stringify({\n items: [`${delPath}${delName}`]\n }),\n }).done(data => {\n nameBlock.parent().addClass('warning').delay(200).fadeOut();\n swal({\n type: 'success',\n title: 'File Deleted'\n });\n }).fail(jqXHR => {\n console.error(jqXHR);\n swal({\n type: 'error',\n title: 'Whoops!',\n html: true,\n text: 'An error occured while attempting to delete this file. Please try again.',\n });\n });\n });\n }\n\n toggleMassActions() {\n if ($('#file_listing input[type=\"checkbox\"]:checked').length) {\n $('#mass_actions').removeClass('disabled');\n } else {\n $('#mass_actions').addClass('disabled');\n }\n }\n\n toggleHighlight(event) {\n const parent = $(event.currentTarget);\n const item = $(event.currentTarget).find('input');\n\n if($(item).is(':checked')) {\n $(item).prop('checked', false);\n parent.removeClass('warning').delay(200);\n } else {\n $(item).prop('checked', true);\n parent.addClass('warning').delay(200);\n }\n }\n\n highlightAll(event) {\n let parent;\n const item = $(event.currentTarget).find('input');\n\n if($(item).is(':checked')) {\n $('#file_listing input[type=checkbox]').prop('checked', false);\n $('#file_listing input[data-action=\"addSelection\"]').each(function() {\n parent = $(this).closest('tr');\n parent.removeClass('warning').delay(200);\n });\n } else {\n $('#file_listing input[type=checkbox]').prop('checked', true);\n $('#file_listing input[data-action=\"addSelection\"]').each(function() {\n parent = $(this).closest('tr');\n parent.addClass('warning').delay(200);\n });\n }\n }\n\n deleteSelected() {\n let selectedItems = [];\n let selectedItemsElements = [];\n let parent;\n let nameBlock;\n let delLocation;\n\n $('#file_listing input[data-action=\"addSelection\"]:checked').each(function() {\n parent = $(this).closest('tr');\n nameBlock = $(parent).find('td[data-identifier=\"name\"]');\n delLocation = decodeURIComponent(nameBlock.data('path')) + decodeURIComponent(nameBlock.data('name'));\n\n selectedItems.push(delLocation);\n selectedItemsElements.push(parent);\n });\n\n if (selectedItems.length != 0)\n {\n let formattedItems = \"\";\n $.each(selectedItems, function(key, value) {\n formattedItems += (\"\" + value + \", \");\n })\n\n formattedItems = formattedItems.slice(0, -2);\n\n swal({\n type: 'warning',\n title: '',\n text: 'Are you sure you want to delete:' + formattedItems + '? There is no reversing this action.',\n html: true,\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true\n }, () => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/delete`,\n timeout: 10000,\n data: JSON.stringify({\n items: selectedItems\n }),\n }).done(data => {\n $('#file_listing input:checked').each(function() {\n $(this).prop('checked', false);\n });\n\n $.each(selectedItemsElements, function() {\n $(this).addClass('warning').delay(200).fadeOut();\n })\n\n swal({\n type: 'success',\n title: 'Files Deleted'\n });\n }).fail(jqXHR => {\n console.error(jqXHR);\n swal({\n type: 'error',\n title: 'Whoops!',\n html: true,\n text: 'An error occured while attempting to delete these files. Please try again.',\n });\n });\n });\n } else {\n swal({\n type: 'warning',\n title: '',\n text: 'Please select files/folders to delete.',\n });\n }\n }\n\n decompress() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const compPath = decodeURIComponent(nameBlock.data('path'));\n const compName = decodeURIComponent(nameBlock.data('name'));\n\n swal({\n title: ' Decompressing...',\n text: 'This might take a few seconds to complete.',\n html: true,\n allowOutsideClick: false,\n allowEscapeKey: false,\n showConfirmButton: false,\n });\n\n $.ajax({\n type: 'POST',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/decompress`,\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n data: JSON.stringify({\n files: `${compPath}${compName}`\n })\n }).done(data => {\n swal.close();\n Files.list(compPath);\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: 'Whoops!',\n html: true,\n text: error\n });\n });\n }\n\n compress() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const compPath = decodeURIComponent(nameBlock.data('path'));\n const compName = decodeURIComponent(nameBlock.data('name'));\n\n $.ajax({\n type: 'POST',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/compress`,\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n data: JSON.stringify({\n files: `${compPath}${compName}`,\n to: compPath.toString()\n })\n }).done(data => {\n Files.list(compPath, err => {\n if (err) return;\n const fileListing = $('#file_listing').find(`[data-name=\"${data.saved_as}\"]`).parent();\n fileListing.addClass('success pulsate').delay(3000).queue(() => {\n fileListing.removeClass('success pulsate').dequeue();\n });\n });\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: 'Whoops!',\n html: true,\n text: error\n });\n });\n }\n}\n","\"use strict\";\n\n// Copyright (c) 2015 - 2017 Dane Everitt \n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\nclass ContextMenuClass {\n constructor() {\n this.activeLine = null;\n }\n\n run() {\n this.directoryClick();\n this.rightClick();\n }\n\n makeMenu(parent) {\n $(document).find('#fileOptionMenu').remove();\n if (!_.isNull(this.activeLine)) this.activeLine.removeClass('active');\n\n let newFilePath = $('#file_listing').data('current-dir');\n if (parent.data('type') === 'folder') {\n const nameBlock = parent.find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n newFilePath = `${currentPath}${currentName}`;\n }\n\n let buildMenu = '
      ';\n\n if (Pterodactyl.permissions.moveFiles) {\n buildMenu += '
    • Rename
    • \\\n
    • Move
    • ';\n }\n\n if (Pterodactyl.permissions.copyFiles) {\n buildMenu += '
    • Copy
    • ';\n }\n\n if (Pterodactyl.permissions.compressFiles) {\n buildMenu += '
    • Compress
    • ';\n }\n\n if (Pterodactyl.permissions.decompressFiles) {\n buildMenu += '
    • Decompress
    • ';\n }\n\n if (Pterodactyl.permissions.createFiles) {\n buildMenu += '
    • \\\n
    • New File
    • \\\n
    • New Folder
    • ';\n }\n\n if (Pterodactyl.permissions.downloadFiles || Pterodactyl.permissions.deleteFiles) {\n buildMenu += '
    • ';\n }\n\n if (Pterodactyl.permissions.downloadFiles) {\n buildMenu += '
    • Download
    • ';\n }\n\n if (Pterodactyl.permissions.deleteFiles) {\n buildMenu += '
    • Delete
    • ';\n }\n\n buildMenu += '
    ';\n return buildMenu;\n }\n\n rightClick() {\n $('[data-action=\"toggleMenu\"]').on('mousedown', event => {\n event.preventDefault();\n if ($(document).find('#fileOptionMenu').is(':visible')) {\n $('body').trigger('click');\n return;\n }\n this.showMenu(event);\n });\n $('#file_listing > tbody td').on('contextmenu', event => {\n this.showMenu(event);\n });\n }\n\n showMenu(event) {\n const parent = $(event.target).closest('tr');\n const menu = $(this.makeMenu(parent));\n\n if (parent.data('type') === 'disabled') return;\n event.preventDefault();\n\n $(menu).appendTo('body');\n $(menu).data('invokedOn', $(event.target)).show().css({\n position: 'absolute',\n left: event.pageX - 150,\n top: event.pageY,\n });\n\n this.activeLine = parent;\n this.activeLine.addClass('active');\n\n // Handle Events\n const Actions = new ActionsClass(parent, menu);\n if (Pterodactyl.permissions.moveFiles) {\n $(menu).find('li[data-action=\"move\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.move();\n });\n $(menu).find('li[data-action=\"rename\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.rename();\n });\n }\n\n if (Pterodactyl.permissions.copyFiles) {\n $(menu).find('li[data-action=\"copy\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.copy();\n });\n }\n\n if (Pterodactyl.permissions.compressFiles) {\n if (parent.data('type') === 'folder') {\n $(menu).find('li[data-action=\"compress\"]').removeClass('hidden');\n }\n $(menu).find('li[data-action=\"compress\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.compress();\n });\n }\n\n if (Pterodactyl.permissions.decompressFiles) {\n if (_.without(['application/zip', 'application/gzip', 'application/x-gzip'], parent.data('mime')).length < 3) {\n $(menu).find('li[data-action=\"decompress\"]').removeClass('hidden');\n }\n $(menu).find('li[data-action=\"decompress\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.decompress();\n });\n }\n\n if (Pterodactyl.permissions.createFiles) {\n $(menu).find('li[data-action=\"folder\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.folder();\n });\n }\n\n if (Pterodactyl.permissions.downloadFiles) {\n if (parent.data('type') === 'file') {\n $(menu).find('li[data-action=\"download\"]').removeClass('hidden');\n }\n $(menu).find('li[data-action=\"download\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.download();\n });\n }\n\n if (Pterodactyl.permissions.deleteFiles) {\n $(menu).find('li[data-action=\"delete\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.delete();\n });\n }\n\n $(window).unbind().on('click', event => {\n if($(event.target).is('.disable-menu-hide')) {\n event.preventDefault();\n return;\n }\n $(menu).unbind().remove();\n if(!_.isNull(this.activeLine)) this.activeLine.removeClass('active');\n });\n }\n\n directoryClick() {\n $('a[data-action=\"directory-view\"]').on('click', function (event) {\n event.preventDefault();\n\n const path = $(this).parent().data('path') || '';\n const name = $(this).parent().data('name') || '';\n\n window.location.hash = encodeURIComponent(path + name);\n Files.list();\n });\n }\n}\n\nwindow.ContextMenu = new ContextMenuClass;\n","\"use strict\";\n\n// Copyright (c) 2015 - 2017 Dane Everitt \n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\nclass FileManager {\n constructor() {\n this.list(this.decodeHash());\n }\n\n list(path, next) {\n if (_.isUndefined(path)) {\n path = this.decodeHash();\n }\n\n this.loader(true);\n $.ajax({\n type: 'POST',\n url: Pterodactyl.meta.directoryList,\n headers: {\n 'X-CSRF-Token': Pterodactyl.meta.csrftoken,\n },\n data: {\n directory: path,\n },\n }).done(data => {\n this.loader(false);\n $('#load_files').slideUp(10).html(data).slideDown(10, () => {\n ContextMenu.run();\n this.reloadFilesButton();\n this.addFolderButton();\n this.selectItem();\n this.selectAll();\n this.selectiveDeletion();\n this.selectRow();\n if (_.isFunction(next)) {\n return next();\n }\n });\n $('#internal_alert').slideUp();\n\n if (typeof Siofu === 'object') {\n Siofu.listenOnInput(document.getElementById(\"files_touch_target\"));\n }\n }).fail(jqXHR => {\n this.loader(false);\n if (_.isFunction(next)) {\n return next(new Error('Failed to load file listing.'));\n }\n\n if ((path !== '' && path !== '/') && jqXHR.status === 404) {\n return this.list('', next);\n }\n\n swal({\n type: 'error',\n title: 'File Error',\n text: jqXHR.responseJSON.errors[0].detail || 'An error occured while attempting to process this request. Please try again.',\n });\n console.error(jqXHR);\n });\n }\n\n loader(show) {\n if (show){\n $('.file-overlay').fadeIn(100);\n } else {\n $('.file-overlay').fadeOut(100);\n }\n }\n\n reloadFilesButton() {\n $('i[data-action=\"reload-files\"]').unbind().on('click', () => {\n $('i[data-action=\"reload-files\"]').addClass('fa-spin');\n this.list();\n });\n }\n\n selectItem() {\n $('[data-action=\"addSelection\"]').on('click', event => {\n event.preventDefault();\n });\n }\n\n selectAll() {\n $('[data-action=\"selectAll\"]').on('click', event => {\n event.preventDefault();\n });\n }\n\n selectiveDeletion() {\n $('[data-action=\"selective-deletion\"]').on('mousedown', event => {\n new ActionsClass().deleteSelected();\n });\n }\n\n addFolderButton() {\n $('[data-action=\"add-folder\"]').unbind().on('click', () => {\n new ActionsClass().folder($('#file_listing').data('current-dir') || '/');\n })\n }\n\n selectRow() {\n $('#file_listing tr').on('mousedown', event => {\n if (event.which === 1) {\n if ($(event.target).is('th') || $(event.target).is('input[data-action=\"selectAll\"]')) {\n new ActionsClass().highlightAll(event);\n } else if ($(event.target).is('td') || $(event.target).is('input[data-action=\"addSelection\"]')) {\n new ActionsClass().toggleHighlight(event);\n }\n\n new ActionsClass().toggleMassActions();\n }\n });\n }\n\n decodeHash() {\n return decodeURIComponent(window.location.hash.substring(1));\n }\n\n}\n\nwindow.Files = new FileManager;\n"]} \ No newline at end of file +{"version":3,"sources":["src/actions.js","src/contextmenu.js","src/index.js"],"names":[],"mappings":"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","file":"filemanager.min.js","sourcesContent":["\"use strict\";\n\n// Copyright (c) 2015 - 2017 Dane Everitt \n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\nclass ActionsClass {\n constructor(element, menu) {\n this.element = element;\n this.menu = menu;\n }\n\n destroy() {\n this.element = undefined;\n }\n\n folder(path) {\n let inputValue\n if (path) {\n inputValue = path\n } else {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.data('name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n if ($(this.element).data('type') === 'file') {\n inputValue = currentPath;\n } else {\n inputValue = `${currentPath}${currentName}/`;\n }\n }\n\n swal({\n type: 'input',\n title: 'Create Folder',\n text: 'Please enter the path and folder name below.',\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true,\n inputValue: inputValue\n }, (val) => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/folder`,\n timeout: 10000,\n data: JSON.stringify({\n path: val,\n }),\n }).done(data => {\n swal.close();\n Files.list();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occurred while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: '',\n text: error,\n });\n });\n });\n }\n\n move() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n swal({\n type: 'input',\n title: 'Move File',\n text: 'Please enter the new path for the file below.',\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true,\n inputValue: `${currentPath}${currentName}`,\n }, (val) => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/move`,\n timeout: 10000,\n data: JSON.stringify({\n from: `${currentPath}${currentName}`,\n to: `${val}`,\n }),\n }).done(data => {\n nameBlock.parent().addClass('warning').delay(200).fadeOut();\n swal.close();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occurred while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: '',\n text: error,\n });\n });\n });\n\n }\n\n rename() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentLink = nameBlock.find('a');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const attachEditor = `\n \n \n `;\n\n nameBlock.html(attachEditor);\n const inputField = nameBlock.find('input');\n const inputLoader = nameBlock.find('.input-loader');\n\n inputField.focus();\n inputField.on('blur keydown', e => {\n // Save Field\n if (\n (e.type === 'keydown' && e.which === 27)\n || e.type === 'blur'\n || (e.type === 'keydown' && e.which === 13 && currentName === inputField.val())\n ) {\n if (!_.isEmpty(currentLink)) {\n nameBlock.html(currentLink);\n } else {\n nameBlock.html(currentName);\n }\n inputField.remove();\n ContextMenu.unbind().run();\n return;\n }\n\n if (e.type === 'keydown' && e.which !== 13) return;\n\n inputLoader.show();\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/rename`,\n timeout: 10000,\n data: JSON.stringify({\n from: `${currentPath}${currentName}`,\n to: `${currentPath}${inputField.val()}`,\n }),\n }).done(data => {\n nameBlock.attr('data-name', inputField.val());\n if (!_.isEmpty(currentLink)) {\n let newLink = currentLink.attr('href');\n if (nameBlock.parent().data('type') !== 'folder') {\n newLink = newLink.substr(0, newLink.lastIndexOf('/')) + '/' + inputField.val();\n }\n currentLink.attr('href', newLink);\n nameBlock.html(\n currentLink.html(inputField.val())\n );\n } else {\n nameBlock.html(inputField.val());\n }\n inputField.remove();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occurred while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n nameBlock.addClass('has-error').delay(2000).queue(() => {\n nameBlock.removeClass('has-error').dequeue();\n });\n inputField.popover({\n animation: true,\n placement: 'top',\n content: error,\n title: 'Save Error'\n }).popover('show');\n }).always(() => {\n inputLoader.remove();\n ContextMenu.unbind().run();\n });\n });\n }\n\n copy() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n swal({\n type: 'input',\n title: 'Copy File',\n text: 'Please enter the new path for the copied file below.',\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true,\n inputValue: `${currentPath}${currentName}`,\n }, (val) => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/copy`,\n timeout: 10000,\n data: JSON.stringify({\n from: `${currentPath}${currentName}`,\n to: `${val}`,\n }),\n }).done(data => {\n swal({\n type: 'success',\n title: '',\n text: 'File successfully copied.'\n });\n Files.list();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occurred while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: '',\n text: error,\n });\n });\n });\n }\n\n download() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const fileName = decodeURIComponent(nameBlock.attr('data-name'));\n const filePath = decodeURIComponent(nameBlock.data('path'));\n\n window.location = `/server/${Pterodactyl.server.uuidShort}/files/download/${filePath}${fileName}`;\n }\n\n delete() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const delPath = decodeURIComponent(nameBlock.data('path'));\n const delName = decodeURIComponent(nameBlock.data('name'));\n\n swal({\n type: 'warning',\n title: '',\n text: 'Are you sure you want to delete ' + delName + '?',\n html: true,\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true\n }, () => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/delete`,\n timeout: 10000,\n data: JSON.stringify({\n items: [`${delPath}${delName}`]\n }),\n }).done(data => {\n nameBlock.parent().addClass('warning').delay(200).fadeOut();\n swal({\n type: 'success',\n title: 'File Deleted'\n });\n }).fail(jqXHR => {\n console.error(jqXHR);\n swal({\n type: 'error',\n title: 'Whoops!',\n html: true,\n text: 'An error occurred while attempting to delete this file. Please try again.',\n });\n });\n });\n }\n\n toggleMassActions() {\n if ($('#file_listing input[type=\"checkbox\"]:checked').length) {\n $('#mass_actions').removeClass('disabled');\n } else {\n $('#mass_actions').addClass('disabled');\n }\n }\n\n toggleHighlight(event) {\n const parent = $(event.currentTarget);\n const item = $(event.currentTarget).find('input');\n\n if($(item).is(':checked')) {\n $(item).prop('checked', false);\n parent.removeClass('warning').delay(200);\n } else {\n $(item).prop('checked', true);\n parent.addClass('warning').delay(200);\n }\n }\n\n highlightAll(event) {\n let parent;\n const item = $(event.currentTarget).find('input');\n\n if($(item).is(':checked')) {\n $('#file_listing input[type=checkbox]').prop('checked', false);\n $('#file_listing input[data-action=\"addSelection\"]').each(function() {\n parent = $(this).closest('tr');\n parent.removeClass('warning').delay(200);\n });\n } else {\n $('#file_listing input[type=checkbox]').prop('checked', true);\n $('#file_listing input[data-action=\"addSelection\"]').each(function() {\n parent = $(this).closest('tr');\n parent.addClass('warning').delay(200);\n });\n }\n }\n\n deleteSelected() {\n let selectedItems = [];\n let selectedItemsElements = [];\n let parent;\n let nameBlock;\n let delLocation;\n\n $('#file_listing input[data-action=\"addSelection\"]:checked').each(function() {\n parent = $(this).closest('tr');\n nameBlock = $(parent).find('td[data-identifier=\"name\"]');\n delLocation = decodeURIComponent(nameBlock.data('path')) + decodeURIComponent(nameBlock.data('name'));\n\n selectedItems.push(delLocation);\n selectedItemsElements.push(parent);\n });\n\n if (selectedItems.length != 0)\n {\n let formattedItems = \"\";\n let i = 0;\n $.each(selectedItems, function(key, value) {\n formattedItems += (\"\" + value + \", \");\n i++;\n return i < 5;\n });\n\n formattedItems = formattedItems.slice(0, -2);\n if (selectedItems.length > 5) {\n formattedItems += ', and ' + (selectedItems.length - 5) + ' other(s)';\n }\n\n swal({\n type: 'warning',\n title: '',\n text: 'Are you sure you want to delete the following files: ' + formattedItems + '?',\n html: true,\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true\n }, () => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/delete`,\n timeout: 10000,\n data: JSON.stringify({\n items: selectedItems\n }),\n }).done(data => {\n $('#file_listing input:checked').each(function() {\n $(this).prop('checked', false);\n });\n\n $.each(selectedItemsElements, function() {\n $(this).addClass('warning').delay(200).fadeOut();\n })\n\n swal({\n type: 'success',\n title: 'Files Deleted'\n });\n }).fail(jqXHR => {\n console.error(jqXHR);\n swal({\n type: 'error',\n title: 'Whoops!',\n html: true,\n text: 'An error occurred while attempting to delete these files. Please try again.',\n });\n });\n });\n } else {\n swal({\n type: 'warning',\n title: '',\n text: 'Please select files/folders to delete.',\n });\n }\n }\n\n decompress() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const compPath = decodeURIComponent(nameBlock.data('path'));\n const compName = decodeURIComponent(nameBlock.data('name'));\n\n swal({\n title: ' Decompressing...',\n text: 'This might take a few seconds to complete.',\n html: true,\n allowOutsideClick: false,\n allowEscapeKey: false,\n showConfirmButton: false,\n });\n\n $.ajax({\n type: 'POST',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/decompress`,\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n data: JSON.stringify({\n files: `${compPath}${compName}`\n })\n }).done(data => {\n swal.close();\n Files.list(compPath);\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occurred while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: 'Whoops!',\n html: true,\n text: error\n });\n });\n }\n\n compress() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const compPath = decodeURIComponent(nameBlock.data('path'));\n const compName = decodeURIComponent(nameBlock.data('name'));\n\n $.ajax({\n type: 'POST',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/v1/server/file/compress`,\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n data: JSON.stringify({\n files: `${compPath}${compName}`,\n to: compPath.toString()\n })\n }).done(data => {\n Files.list(compPath, err => {\n if (err) return;\n const fileListing = $('#file_listing').find(`[data-name=\"${data.saved_as}\"]`).parent();\n fileListing.addClass('success pulsate').delay(3000).queue(() => {\n fileListing.removeClass('success pulsate').dequeue();\n });\n });\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occurred while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: 'Whoops!',\n html: true,\n text: error\n });\n });\n }\n}\n","\"use strict\";\n\n// Copyright (c) 2015 - 2017 Dane Everitt \n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\nclass ContextMenuClass {\n constructor() {\n this.activeLine = null;\n }\n\n run() {\n this.directoryClick();\n this.rightClick();\n }\n\n makeMenu(parent) {\n $(document).find('#fileOptionMenu').remove();\n if (!_.isNull(this.activeLine)) this.activeLine.removeClass('active');\n\n let newFilePath = $('#file_listing').data('current-dir');\n if (parent.data('type') === 'folder') {\n const nameBlock = parent.find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n newFilePath = `${currentPath}${currentName}`;\n }\n\n let buildMenu = '
      ';\n\n if (Pterodactyl.permissions.moveFiles) {\n buildMenu += '
    • Rename
    • \\\n
    • Move
    • ';\n }\n\n if (Pterodactyl.permissions.copyFiles) {\n buildMenu += '
    • Copy
    • ';\n }\n\n if (Pterodactyl.permissions.compressFiles) {\n buildMenu += '
    • Compress
    • ';\n }\n\n if (Pterodactyl.permissions.decompressFiles) {\n buildMenu += '
    • Decompress
    • ';\n }\n\n if (Pterodactyl.permissions.createFiles) {\n buildMenu += '
    • \\\n
    • New File
    • \\\n
    • New Folder
    • ';\n }\n\n if (Pterodactyl.permissions.downloadFiles || Pterodactyl.permissions.deleteFiles) {\n buildMenu += '
    • ';\n }\n\n if (Pterodactyl.permissions.downloadFiles) {\n buildMenu += '
    • Download
    • ';\n }\n\n if (Pterodactyl.permissions.deleteFiles) {\n buildMenu += '
    • Delete
    • ';\n }\n\n buildMenu += '
    ';\n return buildMenu;\n }\n\n rightClick() {\n $('[data-action=\"toggleMenu\"]').on('mousedown', event => {\n event.preventDefault();\n if ($(document).find('#fileOptionMenu').is(':visible')) {\n $('body').trigger('click');\n return;\n }\n this.showMenu(event);\n });\n $('#file_listing > tbody td').on('contextmenu', event => {\n this.showMenu(event);\n });\n }\n\n showMenu(event) {\n const parent = $(event.target).closest('tr');\n const menu = $(this.makeMenu(parent));\n\n if (parent.data('type') === 'disabled') return;\n event.preventDefault();\n\n $(menu).appendTo('body');\n $(menu).data('invokedOn', $(event.target)).show().css({\n position: 'absolute',\n left: event.pageX - 150,\n top: event.pageY,\n });\n\n this.activeLine = parent;\n this.activeLine.addClass('active');\n\n // Handle Events\n const Actions = new ActionsClass(parent, menu);\n if (Pterodactyl.permissions.moveFiles) {\n $(menu).find('li[data-action=\"move\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.move();\n });\n $(menu).find('li[data-action=\"rename\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.rename();\n });\n }\n\n if (Pterodactyl.permissions.copyFiles) {\n $(menu).find('li[data-action=\"copy\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.copy();\n });\n }\n\n if (Pterodactyl.permissions.compressFiles) {\n if (parent.data('type') === 'folder') {\n $(menu).find('li[data-action=\"compress\"]').removeClass('hidden');\n }\n $(menu).find('li[data-action=\"compress\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.compress();\n });\n }\n\n if (Pterodactyl.permissions.decompressFiles) {\n if (_.without(['application/zip', 'application/gzip', 'application/x-gzip'], parent.data('mime')).length < 3) {\n $(menu).find('li[data-action=\"decompress\"]').removeClass('hidden');\n }\n $(menu).find('li[data-action=\"decompress\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.decompress();\n });\n }\n\n if (Pterodactyl.permissions.createFiles) {\n $(menu).find('li[data-action=\"folder\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.folder();\n });\n }\n\n if (Pterodactyl.permissions.downloadFiles) {\n if (parent.data('type') === 'file') {\n $(menu).find('li[data-action=\"download\"]').removeClass('hidden');\n }\n $(menu).find('li[data-action=\"download\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.download();\n });\n }\n\n if (Pterodactyl.permissions.deleteFiles) {\n $(menu).find('li[data-action=\"delete\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.delete();\n });\n }\n\n $(window).unbind().on('click', event => {\n if($(event.target).is('.disable-menu-hide')) {\n event.preventDefault();\n return;\n }\n $(menu).unbind().remove();\n if(!_.isNull(this.activeLine)) this.activeLine.removeClass('active');\n });\n }\n\n directoryClick() {\n $('a[data-action=\"directory-view\"]').on('click', function (event) {\n event.preventDefault();\n\n const path = $(this).parent().data('path') || '';\n const name = $(this).parent().data('name') || '';\n\n window.location.hash = encodeURIComponent(path + name);\n Files.list();\n });\n }\n}\n\nwindow.ContextMenu = new ContextMenuClass;\n","\"use strict\";\n\n// Copyright (c) 2015 - 2017 Dane Everitt \n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\nclass FileManager {\n constructor() {\n this.list(this.decodeHash());\n }\n\n list(path, next) {\n if (_.isUndefined(path)) {\n path = this.decodeHash();\n }\n\n this.loader(true);\n $.ajax({\n type: 'POST',\n url: Pterodactyl.meta.directoryList,\n headers: {\n 'X-CSRF-Token': Pterodactyl.meta.csrftoken,\n },\n data: {\n directory: path,\n },\n }).done(data => {\n this.loader(false);\n $('#load_files').slideUp(10).html(data).slideDown(10, () => {\n ContextMenu.run();\n this.reloadFilesButton();\n this.addFolderButton();\n this.selectItem();\n this.selectAll();\n this.selectiveDeletion();\n this.selectRow();\n if (_.isFunction(next)) {\n return next();\n }\n });\n $('#internal_alert').slideUp();\n\n if (typeof Siofu === 'object') {\n Siofu.listenOnInput(document.getElementById(\"files_touch_target\"));\n }\n }).fail(jqXHR => {\n this.loader(false);\n if (_.isFunction(next)) {\n return next(new Error('Failed to load file listing.'));\n }\n\n if ((path !== '' && path !== '/') && jqXHR.status === 404) {\n return this.list('', next);\n }\n\n swal({\n type: 'error',\n title: 'File Error',\n text: jqXHR.responseJSON.errors[0].detail || 'An error occurred while attempting to process this request. Please try again.',\n });\n console.error(jqXHR);\n });\n }\n\n loader(show) {\n if (show){\n $('.file-overlay').fadeIn(100);\n } else {\n $('.file-overlay').fadeOut(100);\n }\n }\n\n reloadFilesButton() {\n $('i[data-action=\"reload-files\"]').unbind().on('click', () => {\n $('i[data-action=\"reload-files\"]').addClass('fa-spin');\n this.list();\n });\n }\n\n selectItem() {\n $('[data-action=\"addSelection\"]').on('click', event => {\n event.preventDefault();\n });\n }\n\n selectAll() {\n $('[data-action=\"selectAll\"]').on('click', event => {\n event.preventDefault();\n });\n }\n\n selectiveDeletion() {\n $('[data-action=\"selective-deletion\"]').on('mousedown', event => {\n new ActionsClass().deleteSelected();\n });\n }\n\n addFolderButton() {\n $('[data-action=\"add-folder\"]').unbind().on('click', () => {\n new ActionsClass().folder($('#file_listing').data('current-dir') || '/');\n })\n }\n\n selectRow() {\n $('#file_listing tr').on('mousedown', event => {\n if (event.which === 1) {\n if ($(event.target).is('th') || $(event.target).is('input[data-action=\"selectAll\"]')) {\n new ActionsClass().highlightAll(event);\n } else if ($(event.target).is('td') || $(event.target).is('input[data-action=\"addSelection\"]')) {\n new ActionsClass().toggleHighlight(event);\n }\n\n new ActionsClass().toggleMassActions();\n }\n });\n }\n\n decodeHash() {\n return decodeURIComponent(window.location.hash.substring(1));\n }\n\n}\n\nwindow.Files = new FileManager;\n"]} \ No newline at end of file diff --git a/public/themes/pterodactyl/js/frontend/files/src/actions.js b/public/themes/pterodactyl/js/frontend/files/src/actions.js index 83db5cfad..d2d6f42e2 100644 --- a/public/themes/pterodactyl/js/frontend/files/src/actions.js +++ b/public/themes/pterodactyl/js/frontend/files/src/actions.js @@ -72,7 +72,7 @@ class ActionsClass { Files.list(); }).fail(jqXHR => { console.error(jqXHR); - var error = 'An error occured while trying to process this request.'; + var error = 'An error occurred while trying to process this request.'; if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { error = jqXHR.responseJSON.error; } @@ -118,7 +118,7 @@ class ActionsClass { swal.close(); }).fail(jqXHR => { console.error(jqXHR); - var error = 'An error occured while trying to process this request.'; + var error = 'An error occurred while trying to process this request.'; if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { error = jqXHR.responseJSON.error; } @@ -198,7 +198,7 @@ class ActionsClass { inputField.remove(); }).fail(jqXHR => { console.error(jqXHR); - var error = 'An error occured while trying to process this request.'; + var error = 'An error occurred while trying to process this request.'; if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { error = jqXHR.responseJSON.error; } @@ -255,7 +255,7 @@ class ActionsClass { Files.list(); }).fail(jqXHR => { console.error(jqXHR); - var error = 'An error occured while trying to process this request.'; + var error = 'An error occurred while trying to process this request.'; if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { error = jqXHR.responseJSON.error; } @@ -315,7 +315,7 @@ class ActionsClass { type: 'error', title: 'Whoops!', html: true, - text: 'An error occured while attempting to delete this file. Please try again.', + text: 'An error occurred while attempting to delete this file. Please try again.', }); }); }); @@ -433,7 +433,7 @@ class ActionsClass { type: 'error', title: 'Whoops!', html: true, - text: 'An error occured while attempting to delete these files. Please try again.', + text: 'An error occurred while attempting to delete these files. Please try again.', }); }); }); @@ -476,7 +476,7 @@ class ActionsClass { Files.list(compPath); }).fail(jqXHR => { console.error(jqXHR); - var error = 'An error occured while trying to process this request.'; + var error = 'An error occurred while trying to process this request.'; if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { error = jqXHR.responseJSON.error; } @@ -516,7 +516,7 @@ class ActionsClass { }); }).fail(jqXHR => { console.error(jqXHR); - var error = 'An error occured while trying to process this request.'; + var error = 'An error occurred while trying to process this request.'; if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { error = jqXHR.responseJSON.error; } diff --git a/public/themes/pterodactyl/js/frontend/files/src/index.js b/public/themes/pterodactyl/js/frontend/files/src/index.js index b407c0f0b..a27d40306 100644 --- a/public/themes/pterodactyl/js/frontend/files/src/index.js +++ b/public/themes/pterodactyl/js/frontend/files/src/index.js @@ -71,7 +71,7 @@ class FileManager { swal({ type: 'error', title: 'File Error', - text: jqXHR.responseJSON.errors[0].detail || 'An error occured while attempting to process this request. Please try again.', + text: jqXHR.responseJSON.errors[0].detail || 'An error occurred while attempting to process this request. Please try again.', }); console.error(jqXHR); }); diff --git a/public/themes/pterodactyl/js/frontend/files/upload.js b/public/themes/pterodactyl/js/frontend/files/upload.js index 2bb1dd8c7..873fbf636 100644 --- a/public/themes/pterodactyl/js/frontend/files/upload.js +++ b/public/themes/pterodactyl/js/frontend/files/upload.js @@ -61,6 +61,18 @@ event.preventDefault(); }, false); + window.foldersDetectedInDrag = function (event) { + var folderDetected = false; + var files = event.dataTransfer.files; + for (var i = 0, f; f = files[i]; i++) { + if (!f.type && f.size === 0) { + return true; + } + } + + return folderDetected; + }; + var dropCounter = 0; $('#load_files').bind({ dragenter: function (event) { @@ -75,6 +87,15 @@ } }, drop: function (event) { + if (window.foldersDetectedInDrag(event.originalEvent)) { + $.notify({ + message: 'Folder uploads are not supported. Please use SFTP to upload whole directories.', + }, { + type: 'warning', + delay: 0 + }); + } + dropCounter = 0; $(this).removeClass('hasFileHover'); } diff --git a/public/themes/pterodactyl/js/frontend/tasks/management-actions.js b/public/themes/pterodactyl/js/frontend/tasks/management-actions.js index 3c344a971..857c32cfa 100644 --- a/public/themes/pterodactyl/js/frontend/tasks/management-actions.js +++ b/public/themes/pterodactyl/js/frontend/tasks/management-actions.js @@ -54,7 +54,7 @@ $(document).ready(function () { swal({ type: 'error', title: 'Whoops!', - text: 'An error occured while attempting to delete this schedule.' + text: 'An error occurred while attempting to delete this schedule.' }); }); }); @@ -93,7 +93,7 @@ $(document).ready(function () { swal({ type: 'error', title: 'Whoops!', - text: 'An error occured while attempting to trigger this schedule.' + text: 'An error occurred while attempting to trigger this schedule.' }); }); }); @@ -136,7 +136,7 @@ $(document).ready(function () { swal({ type: 'error', title: 'Whoops!', - text: 'An error occured while attempting to toggle this schedule.' + text: 'An error occurred while attempting to toggle this schedule.' }); }); }); diff --git a/resources/lang/de/admin/nests.php b/resources/lang/de/admin/nests.php index 7fb11866b..e4761eb00 100644 --- a/resources/lang/de/admin/nests.php +++ b/resources/lang/de/admin/nests.php @@ -2,18 +2,18 @@ return [ 'notices' => [ - 'created' => 'Das neue Nest :name wurde erstellt', + 'created' => 'Das Nest :name wurde erstellt', 'deleted' => 'Nest erfolgreich gelöscht.', 'updated' => 'Nest erfolgreich bearbeitet.', ], 'eggs' => [ 'notices' => [ - 'imported' => 'Eg erfolgreich importiert.', - 'updated_via_import' => 'Dieses Egg wurde aktualisiert', - 'deleted' => 'Dieses Egg wurde gelöscht', - 'updated' => 'Egg wurde erfolgreich bearbeitet.', - 'script_updated' => 'Egg install script wurde aktualisiert.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', + 'imported' => 'Ei erfolgreich importiert.', + 'updated_via_import' => 'Dieses Ei wurde aktualisiert', + 'deleted' => 'Dieses Ei wurde gelöscht', + 'updated' => 'Ei wurde erfolgreich bearbeitet.', + 'script_updated' => 'Ei Installations-Skript wurde aktualisiert.', + 'egg_created' => 'Ein neues Ei wurde gelegt. Du musst alle laufenden Daemons neustarten, um dieses Ei anzuwenden.', ], ], 'variables' => [ diff --git a/resources/lang/de/admin/node.php b/resources/lang/de/admin/node.php index 218e5901e..1304a8e6a 100644 --- a/resources/lang/de/admin/node.php +++ b/resources/lang/de/admin/node.php @@ -2,15 +2,15 @@ return [ 'validation' => [ - 'fqdn_not_resolvable' => 'Diese FQDN scheint nicht auf eine IP weiterzuleiten.', + 'fqdn_not_resolvable' => 'Diese Domain scheint nicht auf eine IP weiterzuleiten.', 'fqdn_required_for_ssl' => 'Eine Domain wird für die SSL Funktion benötigt.', ], 'notices' => [ - 'allocations_added' => 'Allocations wurden zu diesem Node erfolgreich hinzugefügt.', + 'allocations_added' => 'Zuweisungen wurden zu dieser Node erfolgreich hinzugefügt.', 'node_deleted' => 'Node wurde erfolgreich gelöscht.', - 'location_required' => 'Du brauchst mindestens eine Location um einen Node zu konfigurieren.', - 'node_created' => 'Node erfolgreich erstellt bitte paste die Config aus dem Configuration tab in die Datei /srv/daemon/config/core.json', - 'node_updated' => 'Node erfolgreich bearbeitet', + 'location_required' => 'Du brauchst mindestens eine Location um eine Node zu konfigurieren.', + 'node_created' => 'Node erfolgreich erstellt, bitte füge die Konfigurations-Daten aus dem Konfigurations-Tab in die Datei /srv/daemon/config/core.json', + 'node_updated' => 'Node erfolgreich bearbeitet.', 'unallocated_deleted' => 'Alle unbenutzen Ports für:ip gelöscht.', ], ]; diff --git a/resources/lang/de/auth.php b/resources/lang/de/auth.php index 14d9d210c..276d441ef 100644 --- a/resources/lang/de/auth.php +++ b/resources/lang/de/auth.php @@ -1,21 +1,21 @@ 'Du bist nicht autorisiert diese Aktion auszuführen0.', - 'auth_error' => 'Es gab ein Problem während du dich anmelden wolltest.', + 'not_authorized' => 'Du bist nicht autorisiert diese Aktion auszuführen.', + 'auth_error' => 'Es gab ein Problem während der Anmeldung.', 'authentication_required' => 'Du musst angemeldet sein um diese Aktion auszuführen.', 'remember_me' => 'Login merken', 'sign_in' => 'Anmelden', 'forgot_password' => 'Ich habe mein Passwort vergessen!', - 'request_reset_text' => 'Du hast dein Passwort vergessen? Das ist keinWeltuntergang! Gib einfach deine Email hier an.', + 'request_reset_text' => 'Du hast dein Passwort vergessen? Das ist kein Weltuntergang! Gib einfach deine Email hier ein.', 'reset_password_text' => 'Passwort zurücksetzen.', 'reset_password' => 'Passwort zurücksetzen', 'email_sent' => 'Dir wurde eine Email mit weiteren Informationen geschickt', 'failed' => 'Die eingegebenen Informationen waren falsch.', - 'throttle' => 'Du hast zu oft versucht dich anzumalen bitte warte noch :seconds Sekunden.', - 'password_requirements' => 'Passwörter müssen Zahlen, Klein-, Großbuchstaben enthalten und mindestens 8 Zeichen lang sein.', + 'throttle' => 'Du hast zu oft versucht dich anzumelden bitte warte noch :seconds Sekunden.', + 'password_requirements' => 'Passwörter müssen Zahlen, Klein- und Großbuchstaben enthalten und mindestens 8 Zeichen lang sein.', 'request_reset' => 'Account finden', - '2fa_required' => '2-Factor Authentifizierung', + '2fa_required' => '2-Faktor-Authentifizierung', '2fa_failed' => 'Der 2FA Code war ungültig.', 'totp_failed' => 'Der TOTP Code war ungültig.', '2fa_must_be_enabled' => 'Der Administrator hat festgelegt dass jeder Account 2FA benutzen muss.', diff --git a/resources/lang/de/base.php b/resources/lang/de/base.php index b482e9af5..72cea9271 100644 --- a/resources/lang/de/base.php +++ b/resources/lang/de/base.php @@ -1,206 +1,206 @@ 'Es gab ein Problem mit einer oder mehreren deriner Eingaben.', + 'validation_error' => 'Es gab ein Problem mit einer oder mehreren deiner Eingaben.', 'errors' => [ - 'return' => 'Gehe zurück zu deiner voherigen Seite', + 'return' => 'Gehe zurück zur voherigen Seite', 'home' => 'Gehe zur Startseite', '403' => [ - 'header' => 'Forbidden', + 'header' => 'Zugriff verweigert', 'desc' => 'Du darfst diese Seite nicht öffnen.', ], '404' => [ - 'header' => 'File Not Found', + 'header' => 'Datei nicht gefunden', 'desc' => 'Es scheint als würde diese Seite nicht exsistieren.', ], 'installing' => [ - 'header' => 'Server Installing', + 'header' => 'Server installiert...', 'desc' => 'Der Server wird derzeit noch installiert bitte versuche es später erneut.', ], 'suspended' => [ - 'header' => 'Server Suspended', + 'header' => 'Server gesperrt', 'desc' => 'Dieser Server wurde von einem Administrator gesperrt.', ], ], 'index' => [ 'header' => 'Deine Server', 'header_sub' => 'Server auf die du Zugriff hast.', - 'list' => 'Server List', + 'list' => 'Server Liste', ], 'api' => [ 'index' => [ - 'header' => 'API Access (This Site is not translated because we think that the english of developers is good enough)', - 'header_sub' => 'Manage your API access keys.', - 'list' => 'API Keys', - 'create_new' => 'Create New API key', - 'keypair_created' => 'An API Key-Pair has been generated. Your API secret token is :token. Please take note of this key as it will not be displayed again.', + 'header' => 'API Zugriff', + 'header_sub' => 'API-Zugriffsschlüssel bearbeiten.', + 'list' => 'API-Schlüssel', + 'create_new' => 'Neuen API-Schlüssel erstellen', + 'keypair_created' => 'Ein API-Schlüsselpaar wurde generiert. Dein API-Geheimtoken ist :token. Speichere ihn an einem sicheren Ort, denn er wird nur einmal angezeigt.', ], 'new' => [ - 'header' => 'New API Key', - 'header_sub' => 'Create a new API access key', + 'header' => 'Neuer API-Schlüssel', + 'header_sub' => 'Erstelle einen neuen API-Schlüssel', 'form_title' => 'Details', 'descriptive_memo' => [ - 'title' => 'Descriptive Memo', - 'description' => 'Enter a brief description of what this API key will be used for.', + 'title' => 'Kurzbeschreibung', + 'description' => 'Gib eine Kurzbeschreibung an, wofür der Schlüssel verwendet wird.', ], 'allowed_ips' => [ - 'title' => 'Allowed IPs', - 'description' => 'Enter a line delimitated list of IPs that are allowed to access the API using this key. CIDR notation is allowed. Leave blank to allow any IP.', + 'title' => 'Erlaubte IPs', + 'description' => 'Gib eine durch Zeilen getrennte der IPs an, denen es erlaubt sein soll, mit diesem Schlüssel API-Zugriff zu haben. CIDR Notation ist erlaubt. Frei lassen, um jede IP zuzulassen.', ], ], 'permissions' => [ 'user' => [ - 'server_header' => 'User Rechte', + 'server_header' => 'Benutzerrechte', 'server' => [ 'list' => [ - 'title' => 'List Servers', - 'desc' => 'Der user darf seine Serverliste ansehen.', + 'title' => 'Server auflisten', + 'desc' => 'Der Benutzer darf seine Serverliste ansehen.', ], 'view' => [ - 'title' => 'View Server', - 'desc' => 'Der User darf detaillierte Informationen über seine Server sehen.', + 'title' => 'Server ansehen', + 'desc' => 'Der Benutzer darf detaillierte Informationen über seine Server sehen.', ], 'power' => [ - 'title' => 'Toggle Power', - 'desc' => 'Der User darf den Server starten/stoppen/restartet.', + 'title' => 'Statusoptionen', + 'desc' => 'Der Benutzer darf den Server starten/stoppen/restartet.', ], 'command' => [ - 'title' => 'Send Command', - 'desc' => 'Der User hat Zugriff auf die Server Console.', + 'title' => 'Befehle senden', + 'desc' => 'Der Benutzer hat Zugriff auf die Server Console.', ], ], ], 'admin' => [ - 'server_header' => 'Server Control', + 'server_header' => 'Server-Verwaltung', 'server' => [ 'list' => [ - 'title' => 'List Servers', - 'desc' => 'Der User darf alle Server dieser Instanz sehen.', + 'title' => 'Server auflisten', + 'desc' => 'Der Benutzer darf alle Server dieser Instanz sehen.', ], 'view' => [ - 'title' => 'View Server', - 'desc' => 'Der user darf detaillierte Informationen zu allen Servern dieser Instanz sehen.', + 'title' => 'Server ansehen', + 'desc' => 'Der Benutzer darf detaillierte Informationen zu allen Servern dieser Instanz sehen.', ], 'delete' => [ - 'title' => 'Delete Server', - 'desc' => 'Der User darf Server löschen.', + 'title' => 'Server löschen', + 'desc' => 'Der Benutzer darf Server löschen.', ], 'create' => [ - 'title' => 'Create Server', - 'desc' => 'Der User darf Server erstellen.', + 'title' => 'Server erstellen', + 'desc' => 'Der Benutzer darf Server erstellen.', ], 'edit-details' => [ - 'title' => 'Edit Server Details', - 'desc' => 'Der User darf die Server EInstellungen bearbeiten.', + 'title' => 'Server Details bearbeiten', + 'desc' => 'Der Benutzer darf die Server Einstellungen bearbeiten.', ], 'edit-container' => [ - 'title' => 'Edit Server Container', - 'desc' => 'Der User darf die Container Einstellungen des Servers verändern.', + 'title' => 'Server Container bearbeiten', + 'desc' => 'Der Benutzer darf die Container Einstellungen des Servers verändern.', ], 'suspend' => [ - 'title' => 'Suspend Server', - 'desc' => 'Der User darf Server sperren.', + 'title' => 'Server sperren', + 'desc' => 'Der Benutzer darf Server sperren.', ], 'install' => [ - 'title' => 'Toggle Install Status', - 'desc' => 'Der User darf den Installationstatus bearbeiten', + 'title' => 'Installationsstatus bearbeiten', + 'desc' => 'Der Benutzer darf den Installationsstatus bearbeiten', ], 'rebuild' => [ - 'title' => 'Rebuild Server', - 'desc' => 'Der User darf den Server ner erstellen', + 'title' => 'Server neuerstellen', + 'desc' => 'Der Benutzer darf den Server neuerstellen', ], 'edit-build' => [ - 'title' => 'Edit Server Build', - 'desc' => 'Der User darf Server einstellungen bearbeiten.', + 'title' => 'Servereinstellungen bearbeiten', + 'desc' => 'Der Benutzer darf Server-Einstellungen bearbeiten.', ], 'edit-startup' => [ - 'title' => 'Edit Server Startup', - 'desc' => 'Der User darf die Startparameter ändern.', + 'title' => 'Serverstart bearbeiten', + 'desc' => 'Der Benutzer darf die Startparameter ändern.', ], ], - 'location_header' => 'Location Control', + 'location_header' => 'Location-Verwaltung', 'location' => [ 'list' => [ - 'title' => 'List Locations', - 'desc' => 'Der User darf alle Locations sehen.', + 'title' => 'Locations auflisten', + 'desc' => 'Der Benutzer darf alle Locations sehen.', ], ], - 'node_header' => 'Node Control', + 'node_header' => 'Node-Verwaltung', 'node' => [ 'list' => [ - 'title' => 'List Nodes', - 'desc' => 'Der User darf alle nodes sehen', + 'title' => 'Nodes auflisten', + 'desc' => 'Der Benutzer darf alle nodes sehen', ], 'view' => [ - 'title' => 'View Node', - 'desc' => 'Der User darf detaillierte Details eines Nodes sehen', + 'title' => 'Node ansehen', + 'desc' => 'Der Benutzer darf detaillierte Details einer Node sehen', ], 'view-config' => [ - 'title' => 'View Node Configuration', - 'desc' => 'Danger. Der User kann die Konfiguration eines Node sehen.', + 'title' => 'Node-Einstellungen ansehen', + 'desc' => 'Achtung! Der Benutzer kann die Konfiguration einer Node sehen.', ], 'create' => [ - 'title' => 'Create Node', - 'desc' => 'Der User aknn ein Node erstellen.', + 'title' => 'Node erstellen', + 'desc' => 'Der Benutzer kann Nodes erstellen.', ], 'delete' => [ - 'title' => 'Delete Node', - 'desc' => 'Allows User kann ein Node löschen.', + 'title' => 'Node löschen', + 'desc' => 'Der Benutzer kann Nodes löschen.', ], ], - 'user_header' => 'User Control', + 'user_header' => 'Benutzer-Verwaltung', 'user' => [ 'list' => [ - 'title' => 'List Users', - 'desc' => 'Der User kann alle User sehen.', + 'title' => 'Benutzer auflisten', + 'desc' => 'Der Benutzer kann alle Benutzer sehen.', ], 'view' => [ - 'title' => 'View User', - 'desc' => 'Der User kann detaillierte Informationen der User sehen.', + 'title' => 'Benutzer ansehen', + 'desc' => 'Der Benutzer kann detaillierte Informationen der Benutzer sehen.', ], 'create' => [ - 'title' => 'Create User', - 'desc' => 'Der User kann einen User erstellen.', + 'title' => 'Benutzer erstellen', + 'desc' => 'Der Benutzer kann Benutzer erstellen.', ], 'edit' => [ - 'title' => 'Update User', - 'desc' => 'Der User kann einen User bearbeiten.', + 'title' => 'Benutzer bearbeiten', + 'desc' => 'Der Benutzer kann Benutzer bearbeiten.', ], 'delete' => [ - 'title' => 'Delete User', - 'desc' => 'Der User kann einen Server löschen.', + 'title' => 'Benutzer löschen', + 'desc' => 'Der Benutzer kann Benutzer löschen.', ], ], - 'service_header' => 'Service Control', + 'service_header' => 'Service-Verwaltung', 'service' => [ 'list' => [ - 'title' => 'List Service', - 'desc' => 'Der User kann alle Services sehen.', + 'title' => 'Services auflisten', + 'desc' => 'Der Benutzer kann alle Services sehen.', ], 'view' => [ - 'title' => 'View Service', - 'desc' => 'Der user kann detaillierte Informationen über einen Service sehen.', + 'title' => 'Services ansehen', + 'desc' => 'Der Benutzer kann detaillierte Informationen über Services sehen.', ], ], - 'option_header' => 'Option Control', + 'option_header' => 'Optionsverwaltung', 'option' => [ 'list' => [ - 'title' => 'List Options', + 'title' => 'Optionen auflisten', 'desc' => '', ], 'view' => [ - 'title' => 'View Option', + 'title' => 'Option ansehen', 'desc' => '', ], ], - 'pack_header' => 'Pack Control', + 'pack_header' => 'Pack-Verwaltung', 'pack' => [ 'list' => [ - 'title' => 'List Packs', + 'title' => 'Packs auflisten', 'desc' => '', ], 'view' => [ - 'title' => 'View Pack', + 'title' => 'Pack ansehen', 'desc' => '', ], ], @@ -218,25 +218,25 @@ return [ 'new_password' => 'Neues Passwort', 'new_password_again' => 'Neues Passwort wiederholen', 'new_email' => 'Neue Email Adresse', - 'first_name' => 'Vornahme', + 'first_name' => 'Vorname', 'last_name' => 'Nachname', - 'update_identitity' => 'Account bearbeiten', - 'username_help' => 'Dein Username darf nicht bereits vergeben sein oder folgende Zeichen enthakten: :requirements.', + 'update_identity' => 'Account bearbeiten', + 'username_help' => 'Dein Benutzername muss noch frei sein und aus folgenden Zeichen bestehen: :requirements.', ], 'security' => [ 'session_mgmt_disabled' => 'Der Administrator hat diese Funktion deaktiviert.', 'header' => 'Account Sicherheit', - 'header_sub' => '2-Factor-Authentification aktivieren.', - 'sessions' => 'Aktieve Sessions', - '2fa_header' => '2-Factor Authentication', + 'header_sub' => '2-Faktor-Authentifizierung aktivieren.', + 'sessions' => 'Aktieve Sitzungen', + '2fa_header' => '2-Faktor-Authentifizierung', '2fa_token_help' => 'Bitte gebe den 2FA Code von deiner 2FA APP ein (Google Authenticatior, Authy, etc.).', - 'disable_2fa' => '2-Factor-Authentification deaktivieren', - '2fa_enabled' => 'Die 2-Factor-Authentification ist aktiviert und du wirst nach einem Sicherheits code beim anmelden gefragt + 'disable_2fa' => '2-Faktor-Authentifizierung deaktivieren', + '2fa_enabled' => 'Die 2-Faktor-Authentifizierung ist aktiviert und du wirst nach einem Sicherheits code beim anmelden gefragt ', - '2fa_disabled' => 'Die 2-Factor Authentication wurde deaktiviert', - 'enable_2fa' => '2-Factor-Authentification aktivieren.', + '2fa_disabled' => 'Die 2-Faktor-Authentifizierung wurde deaktiviert', + 'enable_2fa' => '2-Faktor-Authentifizierung aktivieren.', '2fa_qr' => '2FA konfigurieren', '2fa_checkpoint_help' => 'Öffne deine 2FA APP und scanne diesen QR Code.', - '2fa_disable_error' => 'Die 2-Factor-Authentification wurde nicht aktiviert da dein Code ungültig war.', + '2fa_disable_error' => 'Die 2-Faktor-Authentifizierung wurde nicht aktiviert da der Code ungültig war.', ], ]; diff --git a/resources/lang/de/command/messages.php b/resources/lang/de/command/messages.php index ec87e41b1..142ba4742 100644 --- a/resources/lang/de/command/messages.php +++ b/resources/lang/de/command/messages.php @@ -5,44 +5,44 @@ return [ 'no_location_found' => 'Shortcode wurde nicht gefunden.', 'ask_short' => 'Location Short Code', 'ask_long' => 'Location Beschreibung', - 'created' => 'Neue location (:name) mit der id :id erstellt.', + 'created' => 'Neue Location (:name) mit der ID :id erstellt.', 'deleted' => 'Location gelöscht.', ], 'user' => [ - 'search_users' => 'Gebe einen Nutzernamen, eine UUID oder eine Email an', - 'select_search_user' => 'ID des Users (Enter \'0\' to re-search)', + 'search_users' => 'Gib einen Benutzernamen, eine UUID oder eine Email an', + 'select_search_user' => 'ID des Benutzers (Gib \'0\' ein, um erneut zu suchen)', 'deleted' => 'Benutzer erfolgreich gelöscht.', 'confirm_delete' => 'Bist du dir wirklich sicher?', - 'no_users_found' => 'Es wurden keine User gefunden.', + 'no_users_found' => 'Es wurden keine Benutzer gefunden.', 'multiple_found' => 'Es wurden mehrere Accounts gefunden.', - 'ask_admin' => 'Is this user an administrator?', + 'ask_admin' => 'Ist dieser Benutzer ein Administrator?', 'ask_email' => 'Email Adresse', - 'ask_username' => 'Username', - 'ask_name_first' => 'Vornamee', + 'ask_username' => 'Benutzername', + 'ask_name_first' => 'Vorname', 'ask_name_last' => 'Nachname', - 'ask_password' => 'Password', - 'ask_password_tip' => 'Wenn du dass wirklich tun willst drücke Strg+c und benutze das `--no-password` flag.', + 'ask_password' => 'Passwort', + 'ask_password_tip' => 'Wenn du das wirklich tun willst drücke Strg+c und benutze das `--no-password` flag.', 'ask_password_help' => 'Das Passwort muss Zahlen, Groß- und Kleinbuchstaben enthalten und mindestens 8 Zeichen lang sein.', '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', + 'Dieser Befehl deaktiviert 2-Faktor-Authentifizierung für ein Benutzerkonto, falls es aktiviert ist. Dieser Befehl sollte nur zur Accountrettung verwendet werden, wenn sich ein Nutzer aus seinem Account ausgeschlossen hat.', + 'Falls das nicht ist, was du erreichen wolltest, drücke Strg+C, um diesen Prozess zu beenden.', ], - '2fa_disabled' => '2-Factor authentication wurde für :email deaktivier.', + '2fa_disabled' => '2-Faktor-Authentifizierung wurde für :email deaktiviert.', ], 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', + 'output_line' => 'Erledigt den Job für die erste Aufgabe in `:schedule` (:hash).', ], 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', + 'deleting_service_backup' => 'Lösche Service Backup-Datei :file.', ], 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', + 'rebuild_failed' => 'Rebuild-Nachfrage für ":name" (#:id) auf der Node ":node" scheiterte mit dem Fehler: :message', ], 'environment' => [ 'mail' => [ 'ask_smtp_host' => 'SMTP Host (e.g. smtp.google.com)', 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', + 'ask_smtp_username' => 'SMTP Benutzername', 'ask_smtp_password' => 'SMTP Password', 'ask_mailgun_domain' => 'Mailgun Domain', 'ask_mailgun_secret' => 'Mailgun Secret', @@ -59,7 +59,7 @@ return [ 'port' => 'Database Port', 'database' => 'Database Name', 'username_warning' => 'Using the "root" account for MySQL connections is not only highly frowned upon, it is also not allowed by this application. You\'ll need to have created a MySQL user for this software.', - 'username' => 'Database Username', + 'username' => 'Database Benutzername', 'password_defined' => 'It appears you already have a MySQL connection password defined, would you like to change it?', 'password' => 'Database Password', 'connection_error' => 'Unable to connect to the MySQL server using the provided credentials. The error returned was ":error".', diff --git a/resources/lang/de/exceptions.php b/resources/lang/de/exceptions.php index 19ae86554..57fa375d8 100644 --- a/resources/lang/de/exceptions.php +++ b/resources/lang/de/exceptions.php @@ -1,55 +1,55 @@ 'Es gab einen Fehler bei der Verbindung mit dem Daemon. Ausgabe: HTTP/:code response code. Dieser Fehler wurde geloggt.', + 'daemon_connection_failed' => 'Es gab einen Fehler bei der Verbindung mit dem Daemon. Ausgabe: HTTP/:code response code.', 'node' => [ - 'servers_attached' => 'Ein node musst Server konfiguriert haben um gelöscht zu werden.', - 'daemon_off_config_updated' => 'Die COnfiguration wurde aktualisiert! Du musst allerdings die config neu auf dem Server bearbeiten.', + 'servers_attached' => 'Eine Node darf keine Server enthalten um gelöscht zu werden', + 'daemon_off_config_updated' => 'Die Config wurde aktualisiert! Du musst allerdings die Config neu auf dem Server bearbeiten.', ], 'allocations' => [ 'too_many_ports' => 'Du kannst leider nicht mehr als 1000 Ports gleichzeitig hinzufügen', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', + 'invalid_mapping' => 'Die Zuweisung für den Port :port war ungültig und konnte nicht verarbeitet werden.', + 'cidr_out_of_range' => 'CIDR Notation erlaubt Masken nur zwischen /25 und /32.', ], 'nest' => [ - 'delete_has_servers' => 'A Nest with active servers attached to it cannot be deleted from the Panel.', + 'delete_has_servers' => 'Ein Nest mit zugewiesenen aktiven Servern kann nicht gelöscht werden.', 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'must_be_child' => 'The "Copy Settings From" directive for this Egg must be a child option for the selected Nest.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', + 'delete_has_servers' => 'Ein Ei mit zugewiesenen aktiven Servern kann nicht gelöscht werden.', + 'invalid_copy_id' => 'Das Ei, von dem ein Skript kopiert werden sollte existiert entweder nicht, oder kopiert selbst ein Skript.', + 'must_be_child' => 'Die "Kopiere Einstellungen von" Direktive für diese Ei muss eine Kind-Option für das ausgewählte Ei sein.', + 'has_children' => 'Dieses Ei hat ein oder mehrere Kinder. Bitte lösche die Eier bevor du dieses löschen kannst.', ], 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', + 'env_not_unique' => 'Die Umgebungsvariable :name muss einzigartig sein.', + 'reserved_name' => 'Die Umgebungsvariable :name ist geschützt und kann nicht zugewiesen werden.', ], 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', + 'json_error' => 'Beim Parsen der JSON-Datei kam es zu einem Fehler: :error.', + 'file_error' => 'Die angegebene JSON-Datei war ungültig.', + 'invalid_json_provided' => 'Die angegebene JSON-Datei ist in einem unbekannten Format.', ], ], 'packs' => [ - 'delete_has_servers' => 'Ein Pack kann nicht gelöscht werden wenn es von einem aktieven Server benutzt wird.', - 'update_has_servers' => 'Ein Pack kann nicht bearbeitet werden wenn es von einem aktieven Server benutzt wird..', + 'delete_has_servers' => 'Ein Pack kann nicht gelöscht werden, wenn es von einem aktiven Server verwendet wird.', + 'update_has_servers' => 'Ein Pack kann nicht bearbeitet werden, wenn es von einem aktiven Server verwendet wird..', 'invalid_upload' => 'Die Datei scheint ungültig zu sein.', - 'invalid_mime' => 'Die Datei hat nicht den angeforderten Typ: :type', + 'invalid_mime' => 'Die Datei hat nicht den angeforderten Dateityp: :type', 'unreadable' => 'Das Archiv konnte nicht geöffnet werden.', 'zip_extraction' => 'Es gab ein Problem beim Entpacken des Archivs.', 'invalid_archive_exception' => 'Die Pack Datei scheint keine import.json zu enthalten.', ], 'subusers' => [ - 'editing_self' => 'Du darfst deinen eigenen SUbuser nicht bearbeiten.', + 'editing_self' => 'Du darfst deinen eigenen Subuser nicht bearbeiten.', 'user_is_owner' => 'Du kannst den Owner nicht als Subuser hinzufügen.', 'subuser_exists' => 'Diese Email ist bereits registriert.', ], 'databases' => [ - 'delete_has_databases' => 'Es kann keine Datenbank gelöscht werden die von einem aktivien Server gelöscht wird.', + 'delete_has_databases' => 'Es kann keine Datenbank gelöscht werden, die von einem aktiven Server verwendet wird.', ], 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', + 'chain_interval_too_long' => 'Die maximale Intervalldauer für eine verkettete Aufgabe ist 15 Minuten.', ], 'locations' => [ - 'has_nodes' => 'Es kann keine Location gelöscht werden die von einem Node benutzt wird', + 'has_nodes' => 'Es kann keine Location gelöscht werden, die von einer Node verwendet wird', ], ]; diff --git a/resources/lang/de/navigation.php b/resources/lang/de/navigation.php index 104b968a8..8241a63b8 100644 --- a/resources/lang/de/navigation.php +++ b/resources/lang/de/navigation.php @@ -6,26 +6,26 @@ return [ 'header' => 'ACCOUNT VERWALTUNG', 'my_account' => 'Mein Account', 'security_controls' => 'Sicherheit', - 'api_access' => 'API Access', + 'api_access' => 'API Zugriff', 'my_servers' => 'Meine Server', ], 'server' => [ 'header' => 'SERVER VERWALTUNG', - 'console' => 'Console', - 'console-pop' => 'Fullscreen Console', - 'file_management' => 'File Management', + 'console' => 'Konsole', + 'console-pop' => 'Vollbild Konsole', + 'file_management' => 'Dateiverwaltung', 'file_browser' => 'File Browser', 'create_file' => 'Datei erstellen', 'upload_files' => 'Datei hochladen', - 'subusers' => 'Subusers', - 'schedules' => 'Geplante Tasks', + 'subusers' => 'Subuser', + 'schedules' => 'Geplante Aufgaben', 'configuration' => 'Konfiguration', - 'port_allocations' => 'Allocation Settings', + 'port_allocations' => 'Port-Einstellungen', 'sftp_settings' => 'SFTP Einstellungen', 'startup_parameters' => 'Startup Parameter', 'databases' => 'Datenbaken', 'edit_file' => 'Datei bearbeiten', - 'admin_header' => 'ADMINISTRATIVE', + 'admin_header' => 'ADMINISTRATIV', 'admin' => 'Server Konfiguration', ], ]; diff --git a/resources/lang/de/passwords.php b/resources/lang/de/passwords.php index 64c26b867..d182f670f 100644 --- a/resources/lang/de/passwords.php +++ b/resources/lang/de/passwords.php @@ -15,5 +15,5 @@ return [ 'reset' => 'Dein Passwort wurde zurückgesetzt!', 'sent' => 'Dir wurde eine Email mit weiteren Informationen geschickt!', 'token' => 'Der Token war ungültig', - 'user' => 'Es gibt keinen User mit dieser Email.', + 'user' => 'Es gibt keinen Benutzer mit dieser Email.', ]; diff --git a/resources/lang/de/server.php b/resources/lang/de/server.php index 355802b5e..03bc63311 100644 --- a/resources/lang/de/server.php +++ b/resources/lang/de/server.php @@ -7,12 +7,12 @@ return [ 'header_sub' => 'Verwalte deinen Server in Echtzeit.', ], 'schedule' => [ - 'header' => 'Schedule Manager', + 'header' => 'Zeitplan-Manager', 'header_sub' => 'Erstelle geplante Aktionen.', - 'current' => 'Derzeitige Aktionen', + 'current' => 'Derzeitig geplante Aktionen', 'new' => [ 'header' => 'Neue Aktion erstellen', - 'header_sub' => 'Erstelle eine neue Gruppe an Aktionen.', + 'header_sub' => 'Erstelle eine neue Gruppe von Aktionen.', 'submit' => 'Aktion erstellen', ], 'manage' => [ @@ -23,226 +23,226 @@ return [ 'task' => [ 'time' => 'Nach', 'action' => 'Aktion ausführen', - 'payload' => 'With Payload', + 'payload' => 'Mit Payload', 'add_more' => 'Weitere Aktion', ], 'actions' => [ - 'command' => 'Command ausführen', - 'power' => 'Power Aktion', + 'command' => 'Befehl ausführen', + 'power' => 'Status-Aktion', ], - 'unnamed' => 'Unnamed Schedule', - 'setup' => 'Schedule Setup', - 'day_of_week' => 'Day of Week', - 'day_of_month' => 'Day of Month', - 'hour' => 'Hour of Day', - 'minute' => 'Minute of Hour', + 'unnamed' => 'Unbenannter Zeitplan', + 'setup' => 'Plaungseinrichtung', + 'day_of_week' => 'Wochentag', + 'day_of_month' => 'Tag der Monats', + 'hour' => 'Stunde des Tages', + 'minute' => 'Minute der Stunde', 'time_help' => 'Dieses System unterstützt dern Cronjob Syntax.', - 'task_help' => 'Times for tasks are relative to the previously defined task. Each schedule may have no more than 5 tasks assigned to it and tasks may not be scheduled more than 15 minutes apart.', + 'task_help' => 'Zeiten von Aufgaben hängen von den vorher bestimmten Aufgaben ab. Jeder Zeitplan darf maximal 5 Aufgaben enthalten und die Aufgaben dürfen höchstens 15 Minuten auseinanderliegen', ], 'tasks' => [ 'task_created' => 'Aktion erfolgreich erstellt.', 'task_updated' => 'Aktion bearbeitet.', - 'header' => 'Scheduled Tasks', + 'header' => 'Geplante Aufgaben', 'header_sub' => 'Automatisiere deinen Server.', 'current' => 'Aktuelle Aktionen', 'actions' => [ - 'command' => 'Command ausführen', - 'power' => 'Power Aktion senden', + 'command' => 'Befhel ausführen', + 'power' => 'Status-Aktion ausführen', ], 'new_task' => 'Neue Aktion erstellen', 'toggle' => 'Status ändern', 'new' => [ 'header' => 'Neue Aktion', - 'header_sub' => 'Neuen Aktion erstellen.', + 'header_sub' => 'Neue Aktion erstellen.', 'task_name' => 'Name', - 'day_of_week' => 'Tag einer Woche', + 'day_of_week' => 'Wochentag', 'custom' => 'Custom Value', - 'day_of_month' => 'Tag eines Monats', + 'day_of_month' => 'Tag des Monats', 'hour' => 'Stunde', 'minute' => 'Minute', - 'sun' => 'Sontag', - 'mon' => 'Montad', + 'sun' => 'Sonntag', + 'mon' => 'Montag', 'tues' => 'Dienstag', 'wed' => 'Mittwoch', 'thurs' => 'Donnerstag', 'fri' => 'Freitag', 'sat' => 'Samstag', 'submit' => 'Absenden', - 'type' => 'TTyp', - 'chain_then' => 'Then, After', - 'chain_do' => 'Do', - 'chain_arguments' => 'With Arguments', - 'payload' => 'Task Payload', - 'payload_help' => 'Wenn du die send command Methode ausgewählt hast wird ein Command zur angegebenen Zeit ausgeführt.', + 'type' => 'Typ', + 'chain_then' => 'Dann, Danach', + 'chain_do' => 'Tu', + 'chain_arguments' => 'Mit Argumenten', + 'payload' => 'Aufgaben Payload', + 'payload_help' => 'Wenn du die "Befehl Senden" Methode ausgewählt hast wird dieser Befehl zur angegebenen Zeit ausgeführt.', ], 'edit' => [ - 'header' => 'Aktion beareiten', + 'header' => 'Aktion bearbeiten', 'submit' => 'Abschicken', ], ], 'users' => [ - 'header' => 'User verwalten', + 'header' => 'Benutzer verwalten', 'header_sub' => 'Bestimme wer den Server verwalten kann.', 'configure' => 'Rechte einstellen', - 'list' => 'Account Liste', - 'add' => 'Neuen User erstellen', - 'update' => 'User bearbeiten', - 'user_assigned' => 'User an einen Server gebunden.', - 'user_updated' => 'User Rechte erfolgreich aktualisiert.', + 'list' => 'Account-Liste', + 'add' => 'Neuen Benutzer erstellen', + 'update' => 'Benutzer bearbeiten', + 'user_assigned' => 'Benutzer dem Server zugewiesen.', + 'user_updated' => 'Benutzer-Rechte erfolgreich aktualisiert.', 'edit' => [ - 'header' => 'User bearbeiten', - 'header_sub' => 'Bearbeite den Zugriff eines Users auf deine Server.', + 'header' => 'Benutzer bearbeiten', + 'header_sub' => 'Bearbeite den Zugriff eines Benutzers auf deine Server.', ], 'new' => [ - 'header' => 'Neuen User erstellen', - 'header_sub' => 'Erstelle einen neuen User un gebe ihm Zugirff auf einen Server.', - 'email' => 'Email Address', - 'email_help' => 'Email Adresse für Einladungs mail.', - 'power_header' => 'Power Verwaltung', - 'file_header' => 'Datein Verwaltung', - 'subuser_header' => 'Subuser Verwaltung', - 'server_header' => 'Server Verwaltung', - 'task_header' => 'Schedule Verwaltung', - 'database_header' => 'Database Verwaltung', + 'header' => 'Neuen Benutzer erstellen', + 'header_sub' => 'Erstelle einen neuen Benutzer und gebe ihm Zugirff auf einen Server.', + 'email' => 'Email Addresse', + 'email_help' => 'Email Adresse für Einladungs-Mail.', + 'power_header' => 'Status-Verwaltung', + 'file_header' => 'Dateiverwaltung', + 'subuser_header' => 'Subuser-Verwaltung', + 'server_header' => 'Server-Verwaltung', + 'task_header' => 'Zeitplan-Verwaltung', + 'database_header' => 'Datenbank-Verwaltung', 'power_start' => [ - 'title' => 'Start Server', - 'description' => 'Der User darf den Server starten.', + 'title' => 'Server starten', + 'description' => 'Der Benutzer darf den Server starten.', ], 'power_stop' => [ - 'title' => 'Stop Server', - 'description' => 'Der User darf den Server stoppen.', + 'title' => 'Server stoppen', + 'description' => 'Der Benutzer darf den Server stoppen.', ], 'power_restart' => [ - 'title' => 'Restart Server', - 'description' => 'Der User darf den Server restarten.', + 'title' => 'Server neustarten', + 'description' => 'Der Benutzer darf den Server neustarten.', ], 'power_kill' => [ - 'title' => 'Kill Server', - 'description' => 'Der User darf den Prozess des Servers töten.', + 'title' => 'Server abbrechen', + 'description' => 'Der Benutzer darf den Prozess des Servers beenden.', ], 'send_command' => [ - 'title' => 'Send Console Command', - 'description' => 'Der User darf die Konsole benutzen.', + 'title' => 'Konsolenbefehl senden', + 'description' => 'Der Benutzer darf die Konsole benutzen.', ], 'access_sftp' => [ 'title' => 'SFTP erlaubt', 'description' => 'Ermöglicht dem Benutzer, eine Verbindung mit dem vom Daemon bereitgestellten SFTP-Server herzustellen.', ], 'list_files' => [ - 'title' => 'List Files', - 'description' => 'Der User darf die Server-Dateien sehen.', + 'title' => 'Dateien auflisten', + 'description' => 'Der Benutzer darf die Server-Dateien einsehen.', ], 'edit_files' => [ - 'title' => 'Edit Files', - 'description' => 'Der User darf die Server-Dateien sehen. SFTP ist von dieser Erlaubnis nicht betroffen.', + 'title' => 'Dateien bearbeiten', + 'description' => 'Der Benutzer darf die Server-Dateien bearbeiten. SFTP ist von dieser Erlaubnis nicht betroffen.', ], 'save_files' => [ - 'title' => 'Save Files', - 'description' => 'Der User darf die Server-Dateien bearbeiten. SFTP ist von dieser Erlaubnis nicht betroffen.', + 'title' => 'Dateien speichern', + 'description' => 'Der Benutzer darf die Server-Dateien speichern. SFTP ist von dieser Erlaubnis nicht betroffen.', ], 'move_files' => [ - 'title' => 'Rename & Move Files', - 'description' => 'Der User darf die Server-Dateien ubenennen und verschieben.', + 'title' => 'Dateien umbenennen & verschieben', + 'description' => 'Der Benutzer darf die Server-Dateien ubenennen und verschieben.', ], 'copy_files' => [ - 'title' => 'Copy Files', - 'description' => 'Der User darf die Server-Dateien kopieren.', + 'title' => 'Dateien kopieren', + 'description' => 'Der Benutzer darf die Server-Dateien kopieren.', ], 'compress_files' => [ - 'title' => 'Compress Files', - 'description' => 'Der User darf die Server-Dateien komprimieren(zip).', + 'title' => 'Dateien komprimieren', + 'description' => 'Der Benutzer darf die Server-Dateien komprimieren(zip).', ], 'decompress_files' => [ - 'title' => 'Decompress Files', - 'description' => 'Der User darf zip Archive entpacken.', + 'title' => 'Archive entpacken', + 'description' => 'Der Benutzer darf Zip-Archive entpacken.', ], 'create_files' => [ - 'title' => 'Create Files', - 'description' => 'Der User darf Server-Dateien erstellen.', + 'title' => 'Dateien erstellen', + 'description' => 'Der Benutzer darf Dateien auf dem Server erstellen.', ], 'upload_files' => [ - 'title' => 'Upload Files', - 'description' => 'Der User darf Server-Dateien hochladen.', + 'title' => 'Dateien hochladen', + 'description' => 'Der Benutzer darf Dateien auf den Server hochladen.', ], 'delete_files' => [ - 'title' => 'Delete Files', - 'description' => 'Der User darf Server-Dateien löschen.', + 'title' => 'Dateien löschen', + 'description' => 'Der Benutzer darf Dateien vom Server löschen.', ], 'download_files' => [ - 'title' => 'Download Files', - 'description' => 'Der User darf Server-Dateien herunterladen.', + 'title' => 'Dateien herunterladen', + 'description' => 'Der Benutzer darf Dateien vom Server herunterladen.', ], 'list_subusers' => [ - 'title' => 'List Subusers', - 'description' => 'Der User darf Subuser sehen.', + 'title' => 'Subuser auflisten', + 'description' => 'Der Benutzer darf sich Subuser auflisten lassen.', ], 'view_subuser' => [ - 'title' => 'View Subuser', - 'description' => 'Der User darf Subuser genauer sehen.', + 'title' => 'Subuser einsehen', + 'description' => 'Der Benutzer darf Subuser genau einsehen.', ], 'edit_subuser' => [ - 'title' => 'Edit Subuser', - 'description' => 'Der User darf Subuser bearbeiten.', + 'title' => 'Subuser bearbeiten', + 'description' => 'Der Benutzer darf Subuser bearbeiten.', ], 'create_subuser' => [ - 'title' => 'Create Subuser', - 'description' => 'Der User darf Subuser erstellen.', + 'title' => 'Subuser erstellen', + 'description' => 'Der Benutzer darf Subuser erstellen.', ], 'delete_subuser' => [ - 'title' => 'Delete Subuser', - 'description' => 'Der User darf Subuser löschen.', + 'title' => 'Subuser löschen', + 'description' => 'Der Benutzer darf Subuser löschen.', ], 'view_allocations' => [ - 'title' => 'View Allocations', - 'description' => 'Allows user to view all of the IPs and ports assigned to a server.', + 'title' => 'Zuweisungen einsehen', + 'description' => 'Der Benutzer darf alle zugewiesenen Ports und IPs einsehen.', ], 'edit_allocation' => [ - 'title' => 'Edit Default Connection', - 'description' => 'Allows user to change the default connection allocation to use for a server.', + 'title' => 'Standardverbindung bearbeiten', + 'description' => 'Der Benutzer darf die Standardverbindung des Servers bearbeiten.', ], 'view_startup' => [ - 'title' => 'View Startup Command', - 'description' => 'Allows user to view the startup command and associated variables for a server.', + 'title' => 'Startbefehl einsehen', + 'description' => 'Der Benutzer darf den Startbefehl und alle einhergehende Variablen einsehen.', ], 'edit_startup' => [ - 'title' => 'Edit Startup Command', - 'description' => 'Allows a user to modify startup variables for a server.', + 'title' => 'Startbefehl bearbeiten', + 'description' => 'Der Benutzer darf die Startvariablen des Servers bearbeiten.', ], 'list_schedules' => [ - 'title' => 'List Schedules', - 'description' => 'Der User darf geplante Aktionen für den Server sehen.', + 'title' => 'Zeitpläne auflisten', + 'description' => 'Der Benutzer darf geplante Aktionen für den Server einsehen.', ], 'view_schedule' => [ - 'title' => 'View Schedule', - 'description' => 'Der User darf eine Aktion ansehen.', + 'title' => 'Geplante Aktionen einsehen', + 'description' => 'Der Benutzer darf geplante Aktion im Detail einsehen.', ], 'toggle_schedule' => [ - 'title' => 'Toggle Schedule', - 'description' => 'Der User darf geplante Aktionen für den Server de-/aktivieren.', + 'title' => 'Geplante Aktionen de-/aktivieren', + 'description' => 'Der Benutzer darf geplante Aktionen für den Server ein- bzw. ausschalten.', ], 'queue_schedule' => [ - 'title' => 'Queue Schedule', - 'description' => 'Allows a user to queue a schedule to run it\'s tasks on the next process cycle.', + 'title' => 'Zeitpläne anstellen', + 'description' => 'Der Benutzer darf einen Zeitplan seine Aktionen im nächsten Prozess-Zyklus ausführen lassen.', ], 'edit_schedule' => [ - 'title' => 'Edit Schedule', - 'description' => 'Der User darf geplante Aktionen für den Server bearbeiten.', + 'title' => 'Zeitpläne bearbeiten', + 'description' => 'Der Benutzer darf geplante Aktionen für den Server bearbeiten.', ], 'create_schedule' => [ - 'title' => 'Create Schedule', - 'description' => 'Der User darf geplante Aktionen für den Server erstellen.', + 'title' => 'Zeitpläne erstellen', + 'description' => 'Der Benutzer darf geplante Aktionen für den Server erstellen.', ], 'delete_schedule' => [ - 'title' => 'Delete Schedule', - 'description' => 'Der User darf geplante Aktionen für den Server löschen.', + 'title' => 'Zeitpläne löschen', + 'description' => 'Der Benutzer darf geplante Aktionen für den Server löschen.', ], 'view_databases' => [ - 'title' => 'View Database Details', - 'description' => 'Der User darf die Datenbankinformationen sehen.', + 'title' => 'Datenbankinformationen einsehen', + 'description' => 'Der Benutzer darf genaue Datenbankinformationen einsehen.', ], 'reset_db_password' => [ - 'title' => 'Reset Database Password', - 'description' => 'Der User darf das Datenbankpasswort zurücksetzen.', + 'title' => 'Datenbankpasswort zurücksetzen', + 'description' => 'Der Benutzer darf das Datenbankpasswort zurücksetzen.', ], ], ], @@ -251,9 +251,9 @@ return [ 'invalid_mime' => 'Diese Datei kann leider nicht bearbeitet werden', 'max_size' => 'Diese Datei ist zu groß um bearbeitet zu werden.', ], - 'header' => 'Datei Manager', + 'header' => 'Dateiverwaltung', 'header_sub' => 'Verwalte deine Dateien.', - 'loading' => 'Datein werden geladen. Bitte warten...', + 'loading' => 'Dateien werden geladen. Bitte warten...', 'path' => 'Wenn du Ordner erstellst solltest du :path als Basis Ordner verwenden! Der maximale Upload beträgt: :size.', 'seconds_ago' => 'Sekunden her', 'file_name' => 'Dateiname', @@ -262,10 +262,10 @@ return [ 'add_new' => 'Neue Datei erstellen', 'add_folder' => 'Neuen Ordner ertsllen', 'mass_actions' => 'Massenaktionen', - 'delete' => 'löschen', + 'delete' => 'Löschen', 'edit' => [ 'header' => 'Datei bearbeiten', - 'header_sub' => 'Bearbeite Dateien direkt vom Browser aus.', + 'header_sub' => 'Bearbeite Dateien direkt im Browser.', 'save' => 'Datei speichern', 'return' => 'Zurück zum Datei Manager', ], @@ -280,18 +280,18 @@ return [ 'startup' => [ 'header' => 'Start Konfiguration', 'header_sub' => 'Bearbeite die Startparameter des Serves.', - 'command' => 'Startup Command', + 'command' => 'Startbefehl', 'edit_params' => 'Parameter bearbeiten', 'update' => 'Absenden', 'startup_regex' => 'Input Rules', 'edited' => 'Die Einstellungen wurden gespeichert und werden beim nächsten Serverstart verwendet.', ], 'sftp' => [ - 'header' => 'SFTP Information', - 'header_sub' => 'Details für eine SFTP verbindung.', + 'header' => 'SFTP Informationen', + 'header_sub' => 'Details für eine SFTP-Verbindung.', 'details' => 'SFTP Details', 'conn_addr' => 'Adresse', - 'warning' => 'Bitte benutze SFTP und nicht FTP!.', + 'warning' => 'Achtung! Benutze unbedingt SFTP und nicht FTP!.', ], 'database' => [ 'header' => 'Datenbanken', @@ -303,11 +303,11 @@ return [ 'add_db' => 'Datenbank hinzufügen.', ], 'allocation' => [ - 'header' => 'Server Allocations', - 'header_sub' => 'Control the IPs and ports available on this server.', - 'available' => 'Available Allocations', - 'help' => 'Allocation Help', - 'help_text' => 'The list to the left includes all available IPs and ports that are open for your server to use for incoming connections.', + 'header' => 'Server Zuweisungen', + 'header_sub' => 'Verwalte alle zugewiesenen IPs und Ports.', + 'available' => 'Verfügbare Zuweisungen', + 'help' => 'Hilfe mit Zuweisungen', + 'help_text' => 'Die Liste links beinhaltet alle verfügbaren IPs und Ports, die dein Server für eingehende Verbindungen verwenden kann.', ], ], ]; diff --git a/resources/lang/de/strings.php b/resources/lang/de/strings.php index 7ea006169..2e2f2a751 100644 --- a/resources/lang/de/strings.php +++ b/resources/lang/de/strings.php @@ -2,7 +2,7 @@ return [ 'email' => 'Email', - 'user_identifier' => 'Username oder Email', + 'user_identifier' => 'Benutzername oder Email', 'password' => 'Passwort', 'confirm_password' => 'Passwort bestätigen', 'login' => 'Login', @@ -12,17 +12,17 @@ return [ 'name' => 'Name', 'node' => 'Node', 'connection' => 'Verbindung', - 'memory' => 'Memory', + 'memory' => 'Arbeitsspeicher', 'cpu' => 'CPU', 'status' => 'Status', 'search' => 'Suche', - 'suspended' => 'Gespert', + 'suspended' => 'Gesperrt', 'account' => 'Account', 'security' => 'Sicherheit', 'ip' => 'IP Adresse', 'last_activity' => 'Letzte Aktivität', 'revoke' => 'Zurückziehen', - '2fa_token' => 'Authentifizierungs Code', + '2fa_token' => 'Authentifizierungs-Code', 'submit' => 'Absenden', 'close' => 'Schließen', 'settings' => 'Einstellungen', @@ -33,13 +33,13 @@ return [ 'created' => 'Erstellt', 'expires' => 'Läuft ab', 'public_key' => 'Public key', - 'api_access' => 'Api Access', + 'api_access' => 'Api Zugriff', 'never' => 'nie', 'sign_out' => 'Abmelden', 'admin_control' => 'Admin Control', 'required' => 'Benötigt', 'port' => 'Port', - 'username' => 'Username', + 'username' => 'Benutzername', 'database' => 'Datenbank', 'new' => 'Neu', 'danger' => 'Achtung', @@ -48,13 +48,13 @@ return [ 'select_none' => 'Alles abwählen', 'alias' => 'Alias', 'primary' => 'Primär', - 'make_primary' => 'Primär machen', + 'make_primary' => 'Primät machen', 'none' => 'Nichts', 'cancel' => 'Abbrechen', 'created_at' => 'Erstellt am', 'action' => 'Aktion', - 'data' => 'Data', - 'queued' => 'Queued', + 'data' => 'Daten', + 'queued' => 'Steht an', 'last_run' => 'Letzte Ausführung', 'next_run' => 'Nächste Ausführung', 'not_run_yet' => 'Wurde noch nicht ausgeführt', diff --git a/resources/lang/en/admin/server.php b/resources/lang/en/admin/server.php index e0ccdba77..fa254c8d9 100644 --- a/resources/lang/en/admin/server.php +++ b/resources/lang/en/admin/server.php @@ -16,7 +16,7 @@ return [ 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', ], 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s nest or egg was changed a reinstall will be occuring now.', + 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s nest or egg was changed a reinstall will be occurring now.', 'server_deleted' => 'Server has successfully been deleted from the system.', 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', diff --git a/resources/lang/en/base.php b/resources/lang/en/base.php index 981545f84..e2c661067 100644 --- a/resources/lang/en/base.php +++ b/resources/lang/en/base.php @@ -21,6 +21,11 @@ return [ 'header' => 'Server Suspended', 'desc' => 'This server has been suspended and cannot be accessed.', ], + 'maintenance' => [ + 'header' => 'Node Under Maintenance', + 'title' => 'Temporarily Unavailable', + 'desc' => 'This node is under maintenance, therefore your server can temporarily not be accessed.', + ], ], 'index' => [ 'header' => 'Your Servers', @@ -31,7 +36,7 @@ return [ 'index' => [ 'list' => 'Your Keys', 'header' => 'Account API', - 'header_sub' => 'Manage access keys that allow you to perform actions aganist the panel.', + 'header_sub' => 'Manage access keys that allow you to perform actions against the panel.', 'create_new' => 'Create New API key', 'keypair_created' => 'An API key has been successfully generated and is listed below.', ], @@ -45,7 +50,7 @@ return [ ], 'allowed_ips' => [ 'title' => 'Allowed IPs', - 'description' => 'Enter a line delimitated list of IPs that are allowed to access the API using this key. CIDR notation is allowed. Leave blank to allow any IP.', + 'description' => 'Enter a line delimited list of IPs that are allowed to access the API using this key. CIDR notation is allowed. Leave blank to allow any IP.', ], ], ], @@ -62,7 +67,7 @@ return [ 'new_email' => 'New Email Address', 'first_name' => 'First Name', 'last_name' => 'Last Name', - 'update_identitity' => 'Update Identity', + 'update_identity' => 'Update Identity', 'username_help' => 'Your username must be unique to your account, and may only contain the following characters: :requirements.', 'language' => 'Language', ], @@ -72,12 +77,12 @@ return [ 'header_sub' => 'Control active sessions and 2-Factor Authentication.', 'sessions' => 'Active Sessions', '2fa_header' => '2-Factor Authentication', - '2fa_token_help' => 'Enter the 2FA Token generated by your app (Google Authenticatior, Authy, etc.).', + '2fa_token_help' => 'Enter the 2FA Token generated by your app (Google Authenticator, Authy, etc.).', 'disable_2fa' => 'Disable 2-Factor Authentication', '2fa_enabled' => '2-Factor Authentication is enabled on this account and will be required in order to login to the panel. If you would like to disable 2FA, simply enter a valid token below and submit the form.', '2fa_disabled' => '2-Factor Authentication is disabled on your account! You should enable 2FA in order to add an extra level of protection on your account.', 'enable_2fa' => 'Enable 2-Factor Authentication', - '2fa_qr' => 'Confgure 2FA on Your Device', + '2fa_qr' => 'Configure 2FA on Your Device', '2fa_checkpoint_help' => 'Use the 2FA application on your phone to take a picture of the QR code to the left, or manually enter the code under it. Once you have done so, generate a token and enter it below.', '2fa_disable_error' => 'The 2FA token provided was not valid. Protection has not been disabled for this account.', ], diff --git a/resources/lang/en/command/messages.php b/resources/lang/en/command/messages.php index 1fd706a8b..68d172896 100644 --- a/resources/lang/en/command/messages.php +++ b/resources/lang/en/command/messages.php @@ -43,7 +43,7 @@ return [ 'server' => [ 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', 'power' => [ - 'confirm' => 'You are about to perform a :action aganist :count servers. Do you wish to continue?', + 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', ], ], @@ -89,7 +89,7 @@ return [ 'using_redis' => 'You\'ve selected the Redis driver for one or more options, please provide valid connection information below. In most cases you can use the defaults provided unless you have modified your setup.', 'redis_host' => 'Redis Host', 'redis_password' => 'Redis Password', - 'redis_pass_help' => 'By default a Redis server instance has no password as it is running locally and inaccessable to the outside world. If this is the case, simply hit enter without entering a value.', + 'redis_pass_help' => 'By default a Redis server instance has no password as it is running locally and inaccessible to the outside world. If this is the case, simply hit enter without entering a value.', 'redis_port' => 'Redis Port', 'redis_pass_defined' => 'It seems a password is already defined for Redis, would you like to change it?', ], diff --git a/resources/lang/en/strings.php b/resources/lang/en/strings.php index 5b9173866..c0bf3f417 100644 --- a/resources/lang/en/strings.php +++ b/resources/lang/en/strings.php @@ -74,6 +74,7 @@ return [ 'tasks' => 'Tasks', 'seconds' => 'Seconds', 'minutes' => 'Minutes', + 'under_maintenance' => 'Under Maintenance', 'days' => [ 'sun' => 'Sunday', 'mon' => 'Monday', diff --git a/resources/lang/es/base.php b/resources/lang/es/base.php index 0593be075..93dca11bd 100644 --- a/resources/lang/es/base.php +++ b/resources/lang/es/base.php @@ -220,7 +220,7 @@ return [ 'new_email' => 'Nueva Dirección De Correo Electrónico', 'first_name' => 'Primer Nombre', 'last_name' => 'Apellido', - 'update_identitity' => 'Actualización De La Identidad', + 'update_identity' => 'Actualización De La Identidad', 'username_help' => 'Su nombre de usuario debe ser único a su cuenta, y sólo pueden contener los siguientes caracteres: :requirements.', ], 'security' => [ diff --git a/resources/themes/pterodactyl/admin/api/index.blade.php b/resources/themes/pterodactyl/admin/api/index.blade.php index ece51699f..9abcc2003 100644 --- a/resources/themes/pterodactyl/admin/api/index.blade.php +++ b/resources/themes/pterodactyl/admin/api/index.blade.php @@ -93,7 +93,7 @@ swal({ type: 'error', title: 'Whoops!', - text: 'An error occured while attempting to revoke this key.' + text: 'An error occurred while attempting to revoke this key.' }); }); }); diff --git a/resources/themes/pterodactyl/admin/eggs/new.blade.php b/resources/themes/pterodactyl/admin/eggs/new.blade.php index 8059363f4..474d989a7 100644 --- a/resources/themes/pterodactyl/admin/eggs/new.blade.php +++ b/resources/themes/pterodactyl/admin/eggs/new.blade.php @@ -37,13 +37,13 @@ @endforeach -

    Think of a Nest as a category. You can put multiple Eggs in a nest, but consider putting only Eggs that are related to eachother in each Nest.

    +

    Think of a Nest as a category. You can put multiple Eggs in a nest, but consider putting only Eggs that are related to each other in each Nest.

    -

    A simple, human-readable name to use as an identifier for this Egg. This is what users will see as thier gameserver type.

    +

    A simple, human-readable name to use as an identifier for this Egg. This is what users will see as their game server type.

    @@ -60,7 +60,7 @@
    -

    The default statup command that should be used for new servers created with this Egg. You can change this per-server as needed.

    +

    The default startup command that should be used for new servers created with this Egg. You can change this per-server as needed.

    @@ -76,7 +76,7 @@
    -

    All fields are required unless you select a seperate option from the 'Copy Settings From' dropdown, in which case fields may be left blank to use the values from that option.

    +

    All fields are required unless you select a separate option from the 'Copy Settings From' dropdown, in which case fields may be left blank to use the values from that option.

    diff --git a/resources/themes/pterodactyl/admin/eggs/scripts.blade.php b/resources/themes/pterodactyl/admin/eggs/scripts.blade.php index 44252b264..55c6f1b9b 100644 --- a/resources/themes/pterodactyl/admin/eggs/scripts.blade.php +++ b/resources/themes/pterodactyl/admin/eggs/scripts.blade.php @@ -41,7 +41,7 @@ @if(! is_null($egg->copyFrom))
    - This service option is copying installation scripts and containe options from {{ $egg->copyFrom->name }}. Any changes you make to this script will not apply unless you select "None" from the dropdown box below. + This service option is copying installation scripts and container options from {{ $egg->copyFrom->name }}. Any changes you make to this script will not apply unless you select "None" from the dropdown box below.
    @endif diff --git a/resources/themes/pterodactyl/admin/eggs/variables.blade.php b/resources/themes/pterodactyl/admin/eggs/variables.blade.php index baf72f530..f49886ee5 100644 --- a/resources/themes/pterodactyl/admin/eggs/variables.blade.php +++ b/resources/themes/pterodactyl/admin/eggs/variables.blade.php @@ -68,7 +68,7 @@
    -

    This variable can be accessed in the statup command by using {{ $variable->env_variable }}.

    +

    This variable can be accessed in the startup command by using {{ $variable->env_variable }}.

    @@ -121,7 +121,7 @@
    -

    This variable can be accessed in the statup command by entering @{{environment variable value}}.

    +

    This variable can be accessed in the startup command by entering @{{environment variable value}}.

    diff --git a/resources/themes/pterodactyl/admin/eggs/view.blade.php b/resources/themes/pterodactyl/admin/eggs/view.blade.php index 9c91627e5..715f749e0 100644 --- a/resources/themes/pterodactyl/admin/eggs/view.blade.php +++ b/resources/themes/pterodactyl/admin/eggs/view.blade.php @@ -101,7 +101,7 @@
    -

    The default statup command that should be used for new servers using this Egg.

    +

    The default startup command that should be used for new servers using this Egg.

    @@ -118,7 +118,7 @@

    The following configuration options should not be edited unless you understand how this system works. If wrongly modified it is possible for the daemon to break.

    -

    All fields are required unless you select a seperate option from the 'Copy Settings From' dropdown, in which case fields may be left blank to use the values from that Egg.

    +

    All fields are required unless you select a separate option from the 'Copy Settings From' dropdown, in which case fields may be left blank to use the values from that Egg.

    diff --git a/resources/themes/pterodactyl/admin/nests/index.blade.php b/resources/themes/pterodactyl/admin/nests/index.blade.php index 9f9c1531c..3c726964b 100644 --- a/resources/themes/pterodactyl/admin/nests/index.blade.php +++ b/resources/themes/pterodactyl/admin/nests/index.blade.php @@ -21,7 +21,7 @@
    - Eggs are a powerful feature of Pterodactyl Panel that allow for extreme flexibility and configuration. Please note that while powerful, modifing an egg wrongly can very easily brick your servers and cause more problems. Please avoid editing our default eggs — those provided by support@pterodactyl.io — unless you are absolutely sure of what you are doing. + Eggs are a powerful feature of Pterodactyl Panel that allow for extreme flexibility and configuration. Please note that while powerful, modifying an egg wrongly can very easily brick your servers and cause more problems. Please avoid editing our default eggs — those provided by support@pterodactyl.io — unless you are absolutely sure of what you are doing.
    diff --git a/resources/themes/pterodactyl/admin/nests/new.blade.php b/resources/themes/pterodactyl/admin/nests/new.blade.php index ed7fa3cdd..a93911be7 100644 --- a/resources/themes/pterodactyl/admin/nests/new.blade.php +++ b/resources/themes/pterodactyl/admin/nests/new.blade.php @@ -31,7 +31,7 @@
    -

    This should be a descriptive category name that emcompasses all of the eggs within the nest.

    +

    This should be a descriptive category name that encompasses all of the eggs within the nest.

    diff --git a/resources/themes/pterodactyl/admin/nests/view.blade.php b/resources/themes/pterodactyl/admin/nests/view.blade.php index fe1e49462..d54155e58 100644 --- a/resources/themes/pterodactyl/admin/nests/view.blade.php +++ b/resources/themes/pterodactyl/admin/nests/view.blade.php @@ -28,7 +28,7 @@
    -

    This should be a descriptive category name that emcompasses all of the options within the service.

    +

    This should be a descriptive category name that encompasses all of the options within the service.

    diff --git a/resources/themes/pterodactyl/admin/nodes/index.blade.php b/resources/themes/pterodactyl/admin/nodes/index.blade.php index abaf25e54..b4ea579a1 100644 --- a/resources/themes/pterodactyl/admin/nodes/index.blade.php +++ b/resources/themes/pterodactyl/admin/nodes/index.blade.php @@ -56,7 +56,7 @@ @foreach ($nodes as $node) - {{ $node->name }} + {!! $node->maintenance_mode ? ' ' : '' !!}{{ $node->name }} {{ $node->location->short }} {{ $node->memory }} MB {{ $node->disk }} MB diff --git a/resources/themes/pterodactyl/admin/nodes/new.blade.php b/resources/themes/pterodactyl/admin/nodes/new.blade.php index 0064ed899..94ecb609f 100644 --- a/resources/themes/pterodactyl/admin/nodes/new.blade.php +++ b/resources/themes/pterodactyl/admin/nodes/new.blade.php @@ -126,7 +126,7 @@
    -

    Enter the total amount of memory avaliable for new servers. If you would like to allow overallocation of memory enter the percentage that you want to allow. To disable checking for overallocation enter -1 into the field. Entering 0 will prevent creating new servers if it would put the node over the limit.

    +

    Enter the total amount of memory available for new servers. If you would like to allow overallocation of memory enter the percentage that you want to allow. To disable checking for overallocation enter -1 into the field. Entering 0 will prevent creating new servers if it would put the node over the limit.

    @@ -145,7 +145,7 @@
    -

    Enter the total amount of disk space avaliable for new servers. If you would like to allow overallocation of disk space enter the percentage that you want to allow. To disable checking for overallocation enter -1 into the field. Entering 0 will prevent creating new servers if it would put the node over the limit.

    +

    Enter the total amount of disk space available for new servers. If you would like to allow overallocation of disk space enter the percentage that you want to allow. To disable checking for overallocation enter -1 into the field. Entering 0 will prevent creating new servers if it would put the node over the limit.

    @@ -158,7 +158,7 @@
    -

    The daemon runs its own SFTP management container and does not use the SSHd process on the main physical server. Do not use the same port that you have assigned for your physcial server's SSH process. If you will be running the daemon behind CloudFlare® you should set the daemon port to 8443 to allow websocket proxying over SSL.

    +

    The daemon runs its own SFTP management container and does not use the SSHd process on the main physical server. Do not use the same port that you have assigned for your physical server's SSH process. If you will be running the daemon behind CloudFlare® you should set the daemon port to 8443 to allow websocket proxying over SSL.

    diff --git a/resources/themes/pterodactyl/admin/nodes/view/index.blade.php b/resources/themes/pterodactyl/admin/nodes/view/index.blade.php index 76a2ca627..71eb346d2 100644 --- a/resources/themes/pterodactyl/admin/nodes/view/index.blade.php +++ b/resources/themes/pterodactyl/admin/nodes/view/index.blade.php @@ -76,7 +76,7 @@

    Delete Node

    -

    Deleting a node is a irreversable action and will immediately remove this node from the panel. There must be no servers associated with this node in order to continue.

    +

    Deleting a node is a irreversible action and will immediately remove this node from the panel. There must be no servers associated with this node in order to continue.

    + @if($node->maintenance_mode) +
    +
    + +
    + This node is under + Maintenance +
    +
    +
    + @endif
    diff --git a/resources/themes/pterodactyl/admin/nodes/view/settings.blade.php b/resources/themes/pterodactyl/admin/nodes/view/settings.blade.php index 919ad958b..5afd65ed4 100644 --- a/resources/themes/pterodactyl/admin/nodes/view/settings.blade.php +++ b/resources/themes/pterodactyl/admin/nodes/view/settings.blade.php @@ -108,6 +108,20 @@

    If you are running the daemon behind a proxy such as Cloudflare, select this to have the daemon skip looking for certificates on boot.

    +
    + +
    +
    + maintenance_mode) == false) ? 'checked' : '' }}> + +
    +
    + maintenance_mode) == true) ? 'checked' : '' }}> + +
    +
    +

    If the node is marked as 'Under Maintenance' users won't be able to access servers that are on this node.

    +
    @@ -189,7 +203,7 @@
    -

    The daemon runs its own SFTP management container and does not use the SSHd process on the main physical server. Do not use the same port that you have assigned for your physcial server's SSH process.

    +

    The daemon runs its own SFTP management container and does not use the SSHd process on the main physical server. Do not use the same port that you have assigned for your physical server's SSH process.

    diff --git a/resources/themes/pterodactyl/admin/packs/modal.blade.php b/resources/themes/pterodactyl/admin/packs/modal.blade.php index dbf2044e0..551e6fde2 100644 --- a/resources/themes/pterodactyl/admin/packs/modal.blade.php +++ b/resources/themes/pterodactyl/admin/packs/modal.blade.php @@ -20,7 +20,7 @@ @endforeach -

    The Egg that this pack is assocaited with. Only servers that are assigned this Egg will be able to access this pack.

    +

    The Egg that this pack is associated with. Only servers that are assigned this Egg will be able to access this pack.

    diff --git a/resources/themes/pterodactyl/admin/packs/new.blade.php b/resources/themes/pterodactyl/admin/packs/new.blade.php index 35acdb540..1595083e9 100644 --- a/resources/themes/pterodactyl/admin/packs/new.blade.php +++ b/resources/themes/pterodactyl/admin/packs/new.blade.php @@ -62,7 +62,7 @@ @endforeach -

    The option that this pack is assocaited with. Only servers that are assigned this option will be able to access this pack.

    +

    The option that this pack is associated with. Only servers that are assigned this option will be able to access this pack.

    diff --git a/resources/themes/pterodactyl/admin/packs/view.blade.php b/resources/themes/pterodactyl/admin/packs/view.blade.php index e530bc9c4..cba76304d 100644 --- a/resources/themes/pterodactyl/admin/packs/view.blade.php +++ b/resources/themes/pterodactyl/admin/packs/view.blade.php @@ -66,7 +66,7 @@ @endforeach -

    The option that this pack is assocaited with. Only servers that are assigned this option will be able to access this pack. This assigned option cannot be changed if servers are attached to this pack.

    +

    The option that this pack is associated with. Only servers that are assigned this option will be able to access this pack. This assigned option cannot be changed if servers are attached to this pack.

    diff --git a/resources/themes/pterodactyl/admin/servers/new.blade.php b/resources/themes/pterodactyl/admin/servers/new.blade.php index c4a39f9c7..39d7ee326 100644 --- a/resources/themes/pterodactyl/admin/servers/new.blade.php +++ b/resources/themes/pterodactyl/admin/servers/new.blade.php @@ -239,7 +239,7 @@
    -

    The following data replacers are avaliable for the startup command: @{{SERVER_MEMORY}}, @{{SERVER_IP}}, and @{{SERVER_PORT}}. They will be replaced with the allocated memory, server IP, and server port respectively.

    +

    The following data substitutes are available for the startup command: @{{SERVER_MEMORY}}, @{{SERVER_IP}}, and @{{SERVER_PORT}}. They will be replaced with the allocated memory, server IP, and server port respectively.

    diff --git a/resources/themes/pterodactyl/admin/servers/view/build.blade.php b/resources/themes/pterodactyl/admin/servers/view/build.blade.php index 8900bf90a..7f39c24ca 100644 --- a/resources/themes/pterodactyl/admin/servers/view/build.blade.php +++ b/resources/themes/pterodactyl/admin/servers/view/build.blade.php @@ -30,8 +30,8 @@
  • Build Configuration
  • Startup
  • Database
  • +
  • Manage
  • @endif -
  • Manage
  • Delete
  • @@ -102,7 +102,7 @@
    -

    The total number of databases a user is allowed to create for this server. Leave blank to allow unlimmited.

    +

    The total number of databases a user is allowed to create for this server. Leave blank to allow unlimited.

    diff --git a/resources/themes/pterodactyl/admin/servers/view/database.blade.php b/resources/themes/pterodactyl/admin/servers/view/database.blade.php index 6c556137d..25d6d1573 100644 --- a/resources/themes/pterodactyl/admin/servers/view/database.blade.php +++ b/resources/themes/pterodactyl/admin/servers/view/database.blade.php @@ -30,8 +30,8 @@
  • Build Configuration
  • Startup
  • Database
  • +
  • Manage
  • @endif -
  • Manage
  • Delete
  • @@ -141,7 +141,7 @@ swal({ type: 'error', title: 'Whoops!', - text: (typeof jqXHR.responseJSON.error !== 'undefined') ? jqXHR.responseJSON.error : 'An error occured while processing this request.' + text: (typeof jqXHR.responseJSON.error !== 'undefined') ? jqXHR.responseJSON.error : 'An error occurred while processing this request.' }); }); }); @@ -163,7 +163,7 @@ }); }).fail(function(jqXHR, textStatus, errorThrown) { console.error(jqXHR); - var error = 'An error occured while trying to process this request.'; + var error = 'An error occurred while trying to process this request.'; if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { error = jqXHR.responseJSON.error; } diff --git a/resources/themes/pterodactyl/admin/servers/view/delete.blade.php b/resources/themes/pterodactyl/admin/servers/view/delete.blade.php index 4690e7173..ec1ccaebe 100644 --- a/resources/themes/pterodactyl/admin/servers/view/delete.blade.php +++ b/resources/themes/pterodactyl/admin/servers/view/delete.blade.php @@ -30,8 +30,8 @@
  • Build Configuration
  • Startup
  • Database
  • +
  • Manage
  • @endif -
  • Manage
  • Delete
  • diff --git a/resources/themes/pterodactyl/admin/servers/view/details.blade.php b/resources/themes/pterodactyl/admin/servers/view/details.blade.php index bd4a5aef2..a84a9144c 100644 --- a/resources/themes/pterodactyl/admin/servers/view/details.blade.php +++ b/resources/themes/pterodactyl/admin/servers/view/details.blade.php @@ -30,8 +30,8 @@
  • Build Configuration
  • Startup
  • Database
  • +
  • Manage
  • @endif -
  • Manage
  • Delete
  • diff --git a/resources/themes/pterodactyl/admin/servers/view/index.blade.php b/resources/themes/pterodactyl/admin/servers/view/index.blade.php index d3db27082..417a9e0b7 100644 --- a/resources/themes/pterodactyl/admin/servers/view/index.blade.php +++ b/resources/themes/pterodactyl/admin/servers/view/index.blade.php @@ -29,8 +29,8 @@
  • Build Configuration
  • Startup
  • Database
  • +
  • Manage
  • @endif -
  • Manage
  • Delete
  • diff --git a/resources/themes/pterodactyl/admin/servers/view/manage.blade.php b/resources/themes/pterodactyl/admin/servers/view/manage.blade.php index 7b56a8034..57319b4e2 100644 --- a/resources/themes/pterodactyl/admin/servers/view/manage.blade.php +++ b/resources/themes/pterodactyl/admin/servers/view/manage.blade.php @@ -30,8 +30,8 @@
  • Build Configuration
  • Startup
  • Database
  • +
  • Manage
  • @endif -
  • Manage
  • Delete
  • diff --git a/resources/themes/pterodactyl/admin/servers/view/startup.blade.php b/resources/themes/pterodactyl/admin/servers/view/startup.blade.php index 60bc6d530..590672c23 100644 --- a/resources/themes/pterodactyl/admin/servers/view/startup.blade.php +++ b/resources/themes/pterodactyl/admin/servers/view/startup.blade.php @@ -30,8 +30,8 @@
  • Build Configuration
  • Startup
  • Database
  • +
  • Manage
  • @endif -
  • Manage
  • Delete
  • @@ -70,11 +70,11 @@

    - Changing any of the below values will result in the server processing a re-install command. The server will be stopped and will then proceede. - If you are changing the pack, exisiting data may be overwritten. If you would like the service scripts to not run, ensure the box is checked at the bottom. + Changing any of the below values will result in the server processing a re-install command. The server will be stopped and will then proceed. + If you are changing the pack, existing data may be overwritten. If you would like the service scripts to not run, ensure the box is checked at the bottom.

    - This is a destructive operation in many cases. This server will be stopped immediately in order for this action to proceede. + This is a destructive operation in many cases. This server will be stopped immediately in order for this action to proceed.

    diff --git a/resources/themes/pterodactyl/admin/settings/index.blade.php b/resources/themes/pterodactyl/admin/settings/index.blade.php index 62ef09631..489646dc9 100644 --- a/resources/themes/pterodactyl/admin/settings/index.blade.php +++ b/resources/themes/pterodactyl/admin/settings/index.blade.php @@ -52,7 +52,7 @@
    - +
    @foreach($languages as $key => $value) diff --git a/resources/themes/pterodactyl/admin/users/view.blade.php b/resources/themes/pterodactyl/admin/users/view.blade.php index fa3b333d7..125719d9c 100644 --- a/resources/themes/pterodactyl/admin/users/view.blade.php +++ b/resources/themes/pterodactyl/admin/users/view.blade.php @@ -52,7 +52,7 @@
    - +
    - +
    diff --git a/resources/themes/pterodactyl/base/api/index.blade.php b/resources/themes/pterodactyl/base/api/index.blade.php index 24a717347..99e5a1ca2 100644 --- a/resources/themes/pterodactyl/base/api/index.blade.php +++ b/resources/themes/pterodactyl/base/api/index.blade.php @@ -113,7 +113,7 @@ swal({ type: 'error', title: 'Whoops!', - text: 'An error occured while attempting to revoke this key.' + text: 'An error occurred while attempting to revoke this key.' }); }); }); diff --git a/resources/themes/pterodactyl/base/index.blade.php b/resources/themes/pterodactyl/base/index.blade.php index 95cce6128..28f4c4d57 100644 --- a/resources/themes/pterodactyl/base/index.blade.php +++ b/resources/themes/pterodactyl/base/index.blade.php @@ -64,9 +64,15 @@ @lang('strings.subuser') @endif - - - + @if($server->node->maintenance_mode) + + @lang('strings.under_maintenance') + + @else + + + + @endif @if (! empty($server->description)) diff --git a/resources/themes/pterodactyl/errors/maintenance.blade.php b/resources/themes/pterodactyl/errors/maintenance.blade.php new file mode 100644 index 000000000..8cc8eea27 --- /dev/null +++ b/resources/themes/pterodactyl/errors/maintenance.blade.php @@ -0,0 +1,30 @@ +{{-- Pterodactyl - Panel --}} +{{-- Copyright (c) 2015 - 2017 Dane Everitt --}} + +{{-- This software is licensed under the terms of the MIT license. --}} +{{-- https://opensource.org/licenses/MIT --}} +@extends('layouts.error') + +@section('title') + @lang('base.errors.maintenance.header') +@endsection + +@section('content-header') +@endsection + +@section('content') +
    +
    +
    +
    +

    @lang('base.errors.maintenance.title')

    +

    @lang('base.errors.maintenance.desc')

    +
    + +
    +
    +
    +@endsection diff --git a/resources/themes/pterodactyl/layouts/admin.blade.php b/resources/themes/pterodactyl/layouts/admin.blade.php index d67eb6b41..aaf8f4cac 100644 --- a/resources/themes/pterodactyl/layouts/admin.blade.php +++ b/resources/themes/pterodactyl/layouts/admin.blade.php @@ -80,6 +80,11 @@ Overview +
  • + + Statistics + +
  • Settings diff --git a/resources/themes/pterodactyl/layouts/master.blade.php b/resources/themes/pterodactyl/layouts/master.blade.php index c46db68b8..644cb5bca 100644 --- a/resources/themes/pterodactyl/layouts/master.blade.php +++ b/resources/themes/pterodactyl/layouts/master.blade.php @@ -44,7 +44,7 @@