From d4758efef8a50c362bd5ab4c54de1254d08c24d4 Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Thu, 23 Nov 2017 15:08:35 -0600 Subject: [PATCH 1/7] Implement fix for console spam when using invalid environment variable values --- .env.example | 12 ++-- CHANGELOG.md | 4 ++ .../Environment/AppSettingsCommand.php | 60 ++++++++++++------- resources/lang/en/command/messages.php | 1 + 4 files changed, 51 insertions(+), 26 deletions(-) diff --git a/.env.example b/.env.example index e90d4b5f6..5a2dd4dbf 100644 --- a/.env.example +++ b/.env.example @@ -2,10 +2,10 @@ APP_ENV=production APP_DEBUG=false APP_KEY=SomeRandomString3232RandomString APP_THEME=pterodactyl -APP_TIMEZONE=UTC +APP_TIMEZONE=America/New_York APP_CLEAR_TASKLOG=720 APP_DELETE_MINUTES=10 -APP_URL=http://yoursite.com/ +APP_URL= DB_HOST=127.0.0.1 DB_PORT=3306 @@ -13,8 +13,8 @@ DB_DATABASE=panel DB_USERNAME=pterodactyl DB_PASSWORD= -CACHE_DRIVER=redis -SESSION_DRIVER=database +CACHE_DRIVER= +SESSION_DRIVER= HASHIDS_SALT= HASHIDS_LENGTH=8 @@ -25,9 +25,9 @@ MAIL_PORT=2525 MAIL_USERNAME= MAIL_PASSWORD= MAIL_ENCRYPTION=tls -MAIL_FROM=you@example.com +MAIL_FROM=no-reply@example.com -QUEUE_DRIVER=database +QUEUE_DRIVER= QUEUE_HIGH=high QUEUE_STANDARD=standard QUEUE_LOW=low diff --git a/CHANGELOG.md b/CHANGELOG.md index b0d21c7c5..75e72ef5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ 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.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. + ## v0.7.0-beta.2 (Derelict Dermodactylus) ### Fixed * `[beta.1]` — Fixes a CORS header issue due to a wrong API endpoint being provided in the administrative node listing. diff --git a/app/Console/Commands/Environment/AppSettingsCommand.php b/app/Console/Commands/Environment/AppSettingsCommand.php index fbfa117f7..f3df6296a 100644 --- a/app/Console/Commands/Environment/AppSettingsCommand.php +++ b/app/Console/Commands/Environment/AppSettingsCommand.php @@ -9,6 +9,7 @@ namespace Pterodactyl\Console\Commands\Environment; +use DateTimeZone; use Illuminate\Console\Command; use Illuminate\Contracts\Console\Kernel; use Pterodactyl\Traits\Commands\EnvironmentWriterTrait; @@ -18,6 +19,25 @@ class AppSettingsCommand extends Command { use EnvironmentWriterTrait; + const ALLOWED_CACHE_DRIVERS = [ + 'redis' => 'Redis (recommended)', + 'memcached' => 'Memcached' + ]; + + const ALLOWED_SESSION_DRIVERS = [ + 'redis' => 'Redis (recommended)', + 'memcached' => 'Memcached', + 'database' => 'MySQL Database', + 'file' => 'Filesystem', + 'cookie' => 'Cookie', + ]; + + const ALLOWED_QUEUE_DRIVERS = [ + 'redis' => 'Redis (recommended)', + 'database' => 'MySQL Database', + 'sync' => 'Sync', + ]; + /** * @var \Illuminate\Contracts\Console\Kernel */ @@ -37,11 +57,13 @@ class AppSettingsCommand extends Command * @var string */ protected $signature = 'p:environment:setup + {--new-salt : Wether 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.} {--cache= : The cache driver backend to use.} {--session= : The session driver backend to use.} + {--queue= : The queue driver backend to use.} {--redis-host= : Redis host to use for connections.} {--redis-pass= : Password used to connect to redis.} {--redis-port= : Port to connect to redis over.}'; @@ -72,7 +94,7 @@ class AppSettingsCommand extends Command */ public function handle() { - if (empty($this->config->get('hashids.salt')) || $this->option('--new-salt')) { + if (empty($this->config->get('hashids.salt')) || $this->option('new-salt')) { $this->variables['HASHIDS_SALT'] = str_random(20); } @@ -87,33 +109,31 @@ class AppSettingsCommand extends Command ); $this->output->comment(trans('command/messages.environment.app.timezone_help')); - $this->variables['APP_TIMEZONE'] = $this->option('timezone') ?? $this->ask( - trans('command/messages.environment.app.timezone'), $this->config->get('app.timezone') + $this->variables['APP_TIMEZONE'] = $this->option('timezone') ?? $this->anticipate( + trans('command/messages.environment.app.timezone'), + DateTimeZone::listIdentifiers(DateTimeZone::ALL), + $this->config->get('app.timezone') ); + $selected = $this->config->get('cache.default', 'redis'); $this->variables['CACHE_DRIVER'] = $this->option('cache') ?? $this->choice( - trans('command/messages.environment.app.cache_driver'), [ - 'redis' => 'Redis (recommended)', - 'memcached' => 'Memcached', - ], $this->config->get('cache.default', 'redis') + trans('command/messages.environment.app.cache_driver'), + self::ALLOWED_CACHE_DRIVERS, + array_key_exists($selected, self::ALLOWED_CACHE_DRIVERS) ? $selected : null ); + $selected = $this->config->get('session.driver', 'redis'); $this->variables['SESSION_DRIVER'] = $this->option('session') ?? $this->choice( - trans('command/messages.environment.app.session_driver'), [ - 'redis' => 'Redis (recommended)', - 'memcached' => 'Memcached', - 'database' => 'MySQL Database', - 'file' => 'Filesystem', - 'cookie' => 'Cookie', - ], $this->config->get('session.driver', 'redis') + trans('command/messages.environment.app.session_driver'), + self::ALLOWED_SESSION_DRIVERS, + array_key_exists($selected, self::ALLOWED_SESSION_DRIVERS) ? $selected : null ); - $this->variables['QUEUE_DRIVER'] = $this->option('session') ?? $this->choice( - trans('command/messages.environment.app.session_driver'), [ - 'redis' => 'Redis (recommended)', - 'database' => 'MySQL Database', - 'sync' => 'Sync', - ], $this->config->get('queue.driver', 'redis') + $selected = $this->config->get('queue.default', 'redis'); + $this->variables['QUEUE_DRIVER'] = $this->option('queue') ?? $this->choice( + trans('command/messages.environment.app.queue_driver'), + self::ALLOWED_QUEUE_DRIVERS, + array_key_exists($selected, self::ALLOWED_QUEUE_DRIVERS) ? $selected : null ); $this->checkForRedis(); diff --git a/resources/lang/en/command/messages.php b/resources/lang/en/command/messages.php index a6385abc4..ec092eee7 100644 --- a/resources/lang/en/command/messages.php +++ b/resources/lang/en/command/messages.php @@ -82,6 +82,7 @@ return [ 'timezone' => 'Application Timezone', 'cache_driver' => 'Cache Driver', 'session_driver' => 'Session Driver', + 'queue_driver' => 'Queue Driver', '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', From 166c43c2599dadb38865b3318a0586f8e84a436b Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Thu, 23 Nov 2017 21:08:43 +0000 Subject: [PATCH 2/7] Apply fixes from StyleCI [ci skip] [skip ci] --- app/Console/Commands/Environment/AppSettingsCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Console/Commands/Environment/AppSettingsCommand.php b/app/Console/Commands/Environment/AppSettingsCommand.php index f3df6296a..8f27d1adb 100644 --- a/app/Console/Commands/Environment/AppSettingsCommand.php +++ b/app/Console/Commands/Environment/AppSettingsCommand.php @@ -21,7 +21,7 @@ class AppSettingsCommand extends Command const ALLOWED_CACHE_DRIVERS = [ 'redis' => 'Redis (recommended)', - 'memcached' => 'Memcached' + 'memcached' => 'Memcached', ]; const ALLOWED_SESSION_DRIVERS = [ From 34db4102b91a4abe506977cc10cfc644af6e1f5f Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sat, 25 Nov 2017 11:59:11 -0600 Subject: [PATCH 3/7] Enable opcache on travis to speed up build time --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b0590806e..277c25df2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,9 +13,10 @@ services: before_install: - mysql -e 'CREATE DATABASE IF NOT EXISTS travis;' before_script: + - echo 'opcache.enable_cli=1' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini - cp .env.travis .env - - composer install --no-interaction --prefer-dist --no-suggest --verbose - - php artisan migrate --seed -v + - composer install --no-interaction --prefer-dist --no-suggest + - php artisan migrate --seed script: - vendor/bin/phpunit --coverage-clover coverage.xml notifications: From 0bb44a49722d4547d36caa6c672af322ca374b87 Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sat, 25 Nov 2017 12:27:08 -0600 Subject: [PATCH 4/7] Fix server startup dropdown for egg being incorrect, fixes #778 --- CHANGELOG.md | 1 + app/Http/Controllers/Admin/ServersController.php | 7 ++++--- resources/lang/en/admin/server.php | 2 +- .../pterodactyl/admin/servers/view/startup.blade.php | 12 ++++++------ 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75e72ef5b..292578937 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,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 causing the dropdown menu for a server's egg to display the wrong selected value. ## v0.7.0-beta.2 (Derelict Dermodactylus) ### Fixed diff --git a/app/Http/Controllers/Admin/ServersController.php b/app/Http/Controllers/Admin/ServersController.php index 0bf3610f7..1cd63a20d 100644 --- a/app/Http/Controllers/Admin/ServersController.php +++ b/app/Http/Controllers/Admin/ServersController.php @@ -319,14 +319,14 @@ class ServersController extends Controller /** * Display startup configuration page for a server. * - * @param int $server + * @param \Pterodactyl\Models\Server $server * @return \Illuminate\View\View * * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ - public function viewStartup($server) + public function viewStartup(Server $server) { - $parameters = $this->repository->getVariablesWithValues($server, true); + $parameters = $this->repository->getVariablesWithValues($server->id, true); if (! $parameters->server->installed) { abort(404); } @@ -334,6 +334,7 @@ class ServersController extends Controller $nests = $this->nestRepository->getWithEggs(); Javascript::put([ + 'server' => $server, 'nests' => $nests->map(function ($item) { return array_merge($item->toArray(), [ 'eggs' => $item->eggs->keyBy('id')->toArray(), diff --git a/resources/lang/en/admin/server.php b/resources/lang/en/admin/server.php index e93459a99..e0ccdba77 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 service or option 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 occuring 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/themes/pterodactyl/admin/servers/view/startup.blade.php b/resources/themes/pterodactyl/admin/servers/view/startup.blade.php index 15bee661e..ab2ac46f7 100644 --- a/resources/themes/pterodactyl/admin/servers/view/startup.blade.php +++ b/resources/themes/pterodactyl/admin/servers/view/startup.blade.php @@ -148,7 +148,7 @@ text: item.name, }; }), - }).change(); + }).val(Pterodactyl.server.egg_id).change(); }); $('#pEggId').on('change', function (event) { @@ -157,8 +157,8 @@ $('#setDefaultImage').html(_.get(objectChain, 'docker_image', 'undefined')); $('#pDockerImage').val(_.get(objectChain, 'docker_image', 'undefined')); - if (objectChain.id === parseInt('{{ $server->egg_id }}')) { - $('#pDockerImage').val('{{ $server->image }}'); + if (objectChain.id === parseInt(Pterodactyl.server.egg_id)) { + $('#pDockerImage').val(Pterodactyl.server.image); } if (!_.get(objectChain, 'startup', false)) { @@ -178,9 +178,9 @@ ), }); - @if(! is_null($server->pack_id)) - $('#pPackId').val({{ $server->pack_id }}); - @endif + if (Pterodactyl.server.pack_id !== null) { + $('#pPackId').val(Pterodactyl.server.pack_id); + } $('#appendVariablesTo').html(''); $.each(_.get(objectChain, 'variables', []), function (i, item) { From 20c1c7411676bd121b2148b0a250672c5f4ec62c Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sat, 25 Nov 2017 13:15:46 -0600 Subject: [PATCH 5/7] Fix issues with validation in admin CP for server variables, closes #780 --- CHANGELOG.md | 1 + app/Exceptions/DisplayValidationException.php | 2 +- .../Servers/StartupModificationService.php | 3 +- .../Servers/VariableValidatorService.php | 36 +++++----- resources/lang/en/validation.php | 22 ++----- .../Servers/VariableValidatorServiceTest.php | 66 ++++--------------- 6 files changed, 42 insertions(+), 88 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 292578937..8c70ce48e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. ### 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 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. ## v0.7.0-beta.2 (Derelict Dermodactylus) ### Fixed diff --git a/app/Exceptions/DisplayValidationException.php b/app/Exceptions/DisplayValidationException.php index 3ffae9648..38ae082f6 100644 --- a/app/Exceptions/DisplayValidationException.php +++ b/app/Exceptions/DisplayValidationException.php @@ -9,6 +9,6 @@ namespace Pterodactyl\Exceptions; -class DisplayValidationException extends PterodactylException +class DisplayValidationException extends DisplayException { } diff --git a/app/Services/Servers/StartupModificationService.php b/app/Services/Servers/StartupModificationService.php index 969d4310d..784b60a05 100644 --- a/app/Services/Servers/StartupModificationService.php +++ b/app/Services/Servers/StartupModificationService.php @@ -78,9 +78,10 @@ class StartupModificationService * @param \Pterodactyl\Models\Server $server * @param array $data * - * @throws \Pterodactyl\Exceptions\DisplayException + * @throws \Illuminate\Validation\ValidationException * @throws \Pterodactyl\Exceptions\Model\DataValidationException * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException + * @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException */ public function handle(Server $server, array $data) { diff --git a/app/Services/Servers/VariableValidatorService.php b/app/Services/Servers/VariableValidatorService.php index b4f722c79..31ca3728b 100644 --- a/app/Services/Servers/VariableValidatorService.php +++ b/app/Services/Servers/VariableValidatorService.php @@ -11,8 +11,8 @@ namespace Pterodactyl\Services\Servers; use Pterodactyl\Models\User; use Illuminate\Support\Collection; +use Illuminate\Validation\ValidationException; use Pterodactyl\Traits\Services\HasUserLevels; -use Pterodactyl\Exceptions\DisplayValidationException; use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; use Illuminate\Contracts\Validation\Factory as ValidationFactory; use Pterodactyl\Contracts\Repository\EggVariableRepositoryInterface; @@ -25,22 +25,22 @@ class VariableValidatorService /** * @var \Pterodactyl\Contracts\Repository\EggVariableRepositoryInterface */ - protected $optionVariableRepository; + private $optionVariableRepository; /** * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface */ - protected $serverRepository; + private $serverRepository; /** * @var \Pterodactyl\Contracts\Repository\ServerVariableRepositoryInterface */ - protected $serverVariableRepository; + private $serverVariableRepository; /** * @var \Illuminate\Contracts\Validation\Factory */ - protected $validator; + private $validator; /** * VariableValidatorService constructor. @@ -68,32 +68,32 @@ class VariableValidatorService * @param int $egg * @param array $fields * @return \Illuminate\Support\Collection + * @throws \Illuminate\Validation\ValidationException */ public function handle(int $egg, array $fields = []): Collection { $variables = $this->optionVariableRepository->findWhere([['egg_id', '=', $egg]]); + $messages = $this->validator->make([], []); - return $variables->map(function ($item) use ($fields) { + $response = $variables->map(function ($item) use ($fields, $messages) { // Skip doing anything if user is not an admin and // variable is not user viewable or editable. if (! $this->isUserLevel(User::USER_LEVEL_ADMIN) && (! $item->user_editable || ! $item->user_viewable)) { return false; } - $validator = $this->validator->make([ + $v = $this->validator->make([ 'variable_value' => array_get($fields, $item->env_variable), ], [ 'variable_value' => $item->rules, + ], [], [ + 'variable_value' => trans('validation.internal.variable_value', ['env' => $item->name]), ]); - if ($validator->fails()) { - throw new DisplayValidationException(json_encode( - collect([ - 'notice' => [ - trans('admin/server.exceptions.bad_variable', ['name' => $item->name]), - ], - ])->merge($validator->errors()->toArray()) - )); + if ($v->fails()) { + foreach ($v->getMessageBag()->all() as $message) { + $messages->getMessageBag()->add($item->env_variable, $message); + } } return (object) [ @@ -104,5 +104,11 @@ class VariableValidatorService })->filter(function ($item) { return is_object($item); }); + + if (! empty($messages->getMessageBag()->all())) { + throw new ValidationException($messages); + } + + return $response; } } diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index d6b784673..201880ec9 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -85,23 +85,6 @@ return [ 'uploaded' => 'The :attribute failed to upload.', 'url' => 'The :attribute format is invalid.', - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - - 'custom' => [ - 'attribute-name' => [ - 'rule-name' => 'custom-message', - ], - ], - /* |-------------------------------------------------------------------------- | Custom Validation Attributes @@ -114,4 +97,9 @@ return [ */ 'attributes' => [], + + // Internal validation logic for Pterodactyl + 'internal' => [ + 'variable_value' => ':env variable', + ], ]; diff --git a/tests/Unit/Services/Servers/VariableValidatorServiceTest.php b/tests/Unit/Services/Servers/VariableValidatorServiceTest.php index b949b3ae8..5f5294e53 100644 --- a/tests/Unit/Services/Servers/VariableValidatorServiceTest.php +++ b/tests/Unit/Services/Servers/VariableValidatorServiceTest.php @@ -1,11 +1,4 @@ . - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ namespace Tests\Unit\Services\Servers; @@ -15,8 +8,7 @@ use Pterodactyl\Models\User; use Illuminate\Support\Collection; use Pterodactyl\Models\EggVariable; use Illuminate\Contracts\Validation\Factory; -use Pterodactyl\Exceptions\PterodactylException; -use Pterodactyl\Exceptions\DisplayValidationException; +use Illuminate\Validation\ValidationException; use Pterodactyl\Services\Servers\VariableValidatorService; use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; use Pterodactyl\Contracts\Repository\EggVariableRepositoryInterface; @@ -27,22 +19,17 @@ class VariableValidatorServiceTest extends TestCase /** * @var \Pterodactyl\Contracts\Repository\EggVariableRepositoryInterface|\Mockery\Mock */ - protected $optionVariableRepository; + private $optionVariableRepository; /** * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface|\Mockery\Mock */ - protected $serverRepository; + private $serverRepository; /** * @var \Pterodactyl\Contracts\Repository\ServerVariableRepositoryInterface|\Mockery\Mock */ - protected $serverVariableRepository; - - /** - * @var \Illuminate\Contracts\Validation\Factory|\Mockery\Mock - */ - protected $validator; + private $serverVariableRepository; /** * Setup tests. @@ -54,7 +41,6 @@ class VariableValidatorServiceTest extends TestCase $this->optionVariableRepository = m::mock(EggVariableRepositoryInterface::class); $this->serverRepository = m::mock(ServerRepositoryInterface::class); $this->serverVariableRepository = m::mock(ServerVariableRepositoryInterface::class); - $this->validator = m::mock(Factory::class); } /** @@ -77,13 +63,6 @@ class VariableValidatorServiceTest extends TestCase $variables = $this->getVariableCollection(); $this->optionVariableRepository->shouldReceive('findWhere')->with([['egg_id', '=', 1]])->andReturn($variables); - $this->validator->shouldReceive('make')->with([ - 'variable_value' => 'Test_SomeValue_0', - ], [ - 'variable_value' => $variables[0]->rules, - ])->once()->andReturnSelf(); - $this->validator->shouldReceive('fails')->withNoArgs()->once()->andReturn(false); - $response = $this->getService()->handle(1, [ $variables[0]->env_variable => 'Test_SomeValue_0', $variables[1]->env_variable => 'Test_SomeValue_1', @@ -112,15 +91,6 @@ class VariableValidatorServiceTest extends TestCase $variables = $this->getVariableCollection(); $this->optionVariableRepository->shouldReceive('findWhere')->with([['egg_id', '=', 1]])->andReturn($variables); - foreach ($variables as $key => $variable) { - $this->validator->shouldReceive('make')->with([ - 'variable_value' => 'Test_SomeValue_' . $key, - ], [ - 'variable_value' => $variables[$key]->rules, - ])->once()->andReturnSelf(); - $this->validator->shouldReceive('fails')->withNoArgs()->once()->andReturn(false); - } - $service = $this->getService(); $service->setUserLevel(User::USER_LEVEL_ADMIN); $response = $service->handle(1, [ @@ -152,28 +122,16 @@ class VariableValidatorServiceTest extends TestCase $variables = $this->getVariableCollection(); $this->optionVariableRepository->shouldReceive('findWhere')->with([['egg_id', '=', 1]])->andReturn($variables); - $this->validator->shouldReceive('make')->with([ - 'variable_value' => null, - ], [ - 'variable_value' => $variables[0]->rules, - ])->once()->andReturnSelf(); - $this->validator->shouldReceive('fails')->withNoArgs()->once()->andReturn(true); - - $this->validator->shouldReceive('errors')->withNoArgs()->once()->andReturnSelf(); - $this->validator->shouldReceive('toArray')->withNoArgs()->once()->andReturn([]); - try { $this->getService()->handle(1, [$variables[0]->env_variable => null]); - } catch (PterodactylException $exception) { - $this->assertInstanceOf(DisplayValidationException::class, $exception); + } catch (ValidationException $exception) { + $messages = $exception->validator->getMessageBag()->all(); - $decoded = json_decode($exception->getMessage()); - $this->assertEquals(0, json_last_error(), 'Assert that response is decodable JSON.'); - $this->assertObjectHasAttribute('notice', $decoded); - $this->assertEquals( - trans('admin/server.exceptions.bad_variable', ['name' => $variables[0]->name]), - $decoded->notice[0] - ); + $this->assertNotEmpty($messages); + $this->assertSame(1, count($messages)); + $this->assertSame(trans('validation.required', [ + 'attribute' => trans('validation.internal.variable_value', ['env' => $variables[0]->name]), + ]), $messages[0]); } } @@ -205,7 +163,7 @@ class VariableValidatorServiceTest extends TestCase $this->optionVariableRepository, $this->serverRepository, $this->serverVariableRepository, - $this->validator + $this->app->make(Factory::class) ); } } From 9ee503b3c13601e3fcc152f86612241737ce0b88 Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sat, 25 Nov 2017 13:17:31 -0600 Subject: [PATCH 6/7] Fix error message formatting to match new style --- resources/themes/pterodactyl/layouts/admin.blade.php | 4 ++-- resources/themes/pterodactyl/layouts/master.blade.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/themes/pterodactyl/layouts/admin.blade.php b/resources/themes/pterodactyl/layouts/admin.blade.php index 6fe6552a4..0c2108ffa 100644 --- a/resources/themes/pterodactyl/layouts/admin.blade.php +++ b/resources/themes/pterodactyl/layouts/admin.blade.php @@ -133,7 +133,7 @@
@if (count($errors) > 0) -
+
@lang('base.validation_error')

    @foreach ($errors->all() as $error) @@ -144,7 +144,7 @@ @endif @foreach (Alert::getMessages() as $type => $messages) @foreach ($messages as $message) -