diff --git a/composer.json b/composer.json index 9a8132bda..2449b8dd1 100644 --- a/composer.json +++ b/composer.json @@ -32,6 +32,7 @@ }, "require-dev": { "cakephp/cakephp-codesniffer": "^4.0", + "cakephp/authorization": "^2.0", "phpunit/phpunit": "^8.0" }, "autoload": { diff --git a/docs/en/index.rst b/docs/en/index.rst index 5a8533eae..c771a8756 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -44,12 +44,14 @@ Configuration // Allow e.g. http://foo.bar.dev or http://my-shop.local domains locally Configure::write('DebugKit.safeTld', ['dev', 'local', 'example']); -* ``DebugKit.forceEnable`` - Force DebugKit to display. Careful with this, it is usually +* ``DebugKit.forceEnable`` - Force DebugKit to display. Careful with this, it is usually safer to simply whitelist your local TLDs. Example usage:: // Before loading DebugKit Configure::write('DebugKit.forceEnable', true); +* ``DebugKit.ignoreAuthorization`` - Set to true to ignore Cake Authorization plugin for DebugKit requests. Disabled by default. + Database Configuration ---------------------- @@ -77,7 +79,7 @@ connection in the ``Datasources`` variable in your **config/app.php** file. For //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], ], -You can safely remove the **tmp/debug_kit.sqlite** file at any point. +You can safely remove the **tmp/debug_kit.sqlite** file at any point. DebugKit will regenerate it when necessary. Toolbar Usage diff --git a/docs/fr/index.rst b/docs/fr/index.rst index 7062feb33..bbfd7981a 100644 --- a/docs/fr/index.rst +++ b/docs/fr/index.rst @@ -30,6 +30,11 @@ Ensuite, vous devez activer le plugin en exécutant la ligne suivante:: bin/cake plugin load DebugKit +Configuration +============= + +* ``DebugKit.ignoreAuthorization`` - Définie à true pour ignorer le plugin Cake Authorization uniquement pour les requêtes DebugKit. Par défaut à false. + Stockage de DebugKit ==================== diff --git a/src/Controller/ComposerController.php b/src/Controller/ComposerController.php index 3998ab5f7..29c18a1ca 100644 --- a/src/Controller/ComposerController.php +++ b/src/Controller/ComposerController.php @@ -15,10 +15,6 @@ */ namespace DebugKit\Controller; -use Cake\Controller\Controller; -use Cake\Core\Configure; -use Cake\Event\EventInterface; -use Cake\Http\Exception\NotFoundException; use Cake\View\JsonView; use Composer\Console\Application; use Symfony\Component\Console\Input\ArrayInput; @@ -27,7 +23,7 @@ /** * Provides utility features need by the toolbar. */ -class ComposerController extends Controller +class ComposerController extends DebugKitController { /** * {@inheritDoc} @@ -39,20 +35,6 @@ public function initialize(): void $this->viewBuilder()->setClassName(JsonView::class); } - /** - * Before filter handler. - * - * @param \Cake\Event\EventInterface $event The event. - * @return void - * @throws \Cake\Http\Exception\NotFoundException - */ - public function beforeFilter(EventInterface $event) - { - if (!Configure::read('debug')) { - throw new NotFoundException(); - } - } - /** * Check outdated composer dependencies * diff --git a/src/Controller/DashboardController.php b/src/Controller/DashboardController.php index 37daf23fa..e69b905f5 100644 --- a/src/Controller/DashboardController.php +++ b/src/Controller/DashboardController.php @@ -14,31 +14,24 @@ */ namespace DebugKit\Controller; -use Cake\Controller\Controller; -use Cake\Core\Configure; use Cake\Event\EventInterface; -use Cake\Http\Exception\NotFoundException; /** * Dashboard and common DebugKit backend. * * @property \DebugKit\Model\Table\RequestsTable $Requests */ -class DashboardController extends Controller +class DashboardController extends DebugKitController { /** * Before filter handler. * * @param \Cake\Event\EventInterface $event The event. * @return void - * @throws \Cake\Http\Exception\NotFoundException */ public function beforeFilter(EventInterface $event) { - // TODO add config override. - if (!Configure::read('debug')) { - throw new NotFoundException('Not available without debug mode on.'); - } + parent::beforeFilter($event); $this->viewBuilder()->setLayout('dashboard'); } diff --git a/src/Controller/DebugKitController.php b/src/Controller/DebugKitController.php new file mode 100644 index 000000000..399fad55f --- /dev/null +++ b/src/Controller/DebugKitController.php @@ -0,0 +1,56 @@ +getRequest()->getAttribute('authorization'); + if ($authorizationService instanceof \Authorization\AuthorizationService) { + if (Configure::read('DebugKit.ignoreAuthorization')) { + $authorizationService->skipAuthorization(); + } else { + Log::info( + "Cake Authorization plugin is enabled. If you would like " . + "to force DebugKit to ignore it, set `DebugKit.ignoreAuthorization` " . + " Configure option to true." + ); + } + } + } +} diff --git a/src/Controller/MailPreviewController.php b/src/Controller/MailPreviewController.php index 27f26b679..007b4a726 100644 --- a/src/Controller/MailPreviewController.php +++ b/src/Controller/MailPreviewController.php @@ -15,9 +15,7 @@ */ namespace DebugKit\Controller; -use Cake\Controller\Controller; use Cake\Core\App; -use Cake\Core\Configure; use Cake\Core\Plugin as CorePlugin; use Cake\Event\EventInterface; use Cake\Http\Exception\NotFoundException; @@ -32,22 +30,8 @@ * * @property \DebugKit\Model\Table\PanelsTable $Panels */ -class MailPreviewController extends Controller +class MailPreviewController extends DebugKitController { - /** - * Before filter callback. - * - * @param \Cake\Event\EventInterface $event The beforeFilter event. - * @return void - * @throws \Cake\Http\Exception\NotFoundException - */ - public function beforeFilter(EventInterface $event) - { - if (!Configure::read('debug')) { - throw new NotFoundException(); - } - } - /** * Before render handler. * diff --git a/src/Controller/PanelsController.php b/src/Controller/PanelsController.php index 97ed02322..536bb1091 100644 --- a/src/Controller/PanelsController.php +++ b/src/Controller/PanelsController.php @@ -14,8 +14,6 @@ */ namespace DebugKit\Controller; -use Cake\Controller\Controller; -use Cake\Core\Configure; use Cake\Event\EventInterface; use Cake\Http\Exception\NotFoundException; @@ -24,7 +22,7 @@ * * @property \DebugKit\Model\Table\PanelsTable $Panels */ -class PanelsController extends Controller +class PanelsController extends DebugKitController { /** * Initialize controller @@ -36,21 +34,6 @@ public function initialize(): void $this->loadComponent('RequestHandler'); } - /** - * Before filter handler. - * - * @param \Cake\Event\EventInterface $event The event. - * @return void - * @throws \Cake\Http\Exception\NotFoundException - */ - public function beforeFilter(EventInterface $event) - { - // TODO add config override. - if (!Configure::read('debug')) { - throw new NotFoundException(); - } - } - /** * Before render handler. * diff --git a/src/Controller/RequestsController.php b/src/Controller/RequestsController.php index dc55f1be6..b166752bb 100644 --- a/src/Controller/RequestsController.php +++ b/src/Controller/RequestsController.php @@ -14,31 +14,24 @@ */ namespace DebugKit\Controller; -use Cake\Controller\Controller; -use Cake\Core\Configure; use Cake\Event\EventInterface; -use Cake\Http\Exception\NotFoundException; /** * Provides access to panel data. * * @property \DebugKit\Model\Table\RequestsTable $Requests */ -class RequestsController extends Controller +class RequestsController extends DebugKitController { /** * Before filter handler. * * @param \Cake\Event\EventInterface $event The event. * @return void - * @throws \Cake\Http\Exception\NotFoundException */ public function beforeFilter(EventInterface $event) { - // TODO add config override - if (!Configure::read('debug')) { - throw new NotFoundException(); - } + parent::beforeFilter($event); $this->response = $this->response->withHeader('Content-Security-Policy', ''); } diff --git a/src/Controller/ToolbarController.php b/src/Controller/ToolbarController.php index cc814c434..b047dcf2d 100644 --- a/src/Controller/ToolbarController.php +++ b/src/Controller/ToolbarController.php @@ -15,15 +15,12 @@ namespace DebugKit\Controller; use Cake\Cache\Cache; -use Cake\Controller\Controller; -use Cake\Core\Configure; -use Cake\Event\EventInterface; use Cake\Http\Exception\NotFoundException; /** * Provides utility features need by the toolbar. */ -class ToolbarController extends Controller +class ToolbarController extends DebugKitController { /** * View class @@ -42,21 +39,6 @@ public function initialize(): void $this->loadComponent('RequestHandler'); } - /** - * Before filter handler. - * - * @param \Cake\Event\EventInterface $event The event. - * @return void - * @throws \Cake\Http\Exception\NotFoundException - */ - public function beforeFilter(EventInterface $event) - { - // TODO add config override. - if (!Configure::read('debug')) { - throw new NotFoundException(); - } - } - /** * Clear a named cache. * diff --git a/tests/TestCase/Controller/DebugKitControllerTest.php b/tests/TestCase/Controller/DebugKitControllerTest.php new file mode 100644 index 000000000..f4263e4e0 --- /dev/null +++ b/tests/TestCase/Controller/DebugKitControllerTest.php @@ -0,0 +1,98 @@ +configApplication(Application::class, []); + $this->useHttpServer(true); + + $this->get('/debug-kit/toolbar/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'); + $this->assertResponseError(); + $this->assertResponseContains('Error page'); + } + + /** + * Build controller with AuthorizationService + * in request attribute + * + * @return DebugKit\Controller\DebugKitController + */ + private function _buildController() + { + $request = new ServerRequest(['url' => '/debug-kit/']); + + $resolver = new OrmResolver(); + $authorization = new AuthorizationService($resolver); + + $request = $request->withAttribute('authorization', $authorization); + + return new DebugKitController($request, new Response()); + } + + /** + * tests authorization is enabled but not ignored + * + * @return void + */ + public function testDontIgnoreAuthorization() + { + $controller = $this->_buildController(); + $event = new Event('testing'); + $controller->beforeFilter($event); + + $this->assertFalse($controller->getRequest()->getAttribute('authorization')->authorizationChecked()); + } + + /** + * tests authorization is checked to avoid + * AuthorizationRequiredException throwned + * + * @return void + */ + public function testIgnoreAuthorization() + { + Configure::write('DebugKit.ignoreAuthorization', true); + + $controller = $this->_buildController(); + $event = new Event('testing'); + $controller->beforeFilter($event); + + $this->assertTrue($controller->getRequest()->getAttribute('authorization')->authorizationChecked()); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index b4de58970..5d4973e8e 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -108,11 +108,13 @@ Log::setConfig([ 'debug' => [ 'engine' => 'Cake\Log\Engine\FileLog', + 'path' => LOGS, 'levels' => ['notice', 'info', 'debug'], 'file' => 'debug', ], 'error' => [ 'engine' => 'Cake\Log\Engine\FileLog', + 'path' => LOGS, 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'], 'file' => 'error', ],