Skip to content

Commit 50a3683

Browse files
authored
Merge pull request #948 from cakephp/5.x-merge
merge 4.x => 5.x
2 parents c721c94 + 10c2a73 commit 50a3683

5 files changed

Lines changed: 68 additions & 8 deletions

File tree

docs/en/index.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ Configuration
5050
// Before loading DebugKit
5151
Configure::write('DebugKit.forceEnable', true);
5252

53+
You can also provide a callable::
54+
55+
Configure::write('DebugKit.forceEnable', function() {
56+
return $_SERVER['REMOTE_ADDR'] === '192.168.2.182';
57+
});
58+
5359
* ``DebugKit.ignorePathsPattern`` - Regex pattern (including delimiter) to ignore paths.
5460
DebugKit won't save data for request URLs that match this regex. Defaults to ``null``::
5561

src/Panel/CachePanel.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,17 @@ public function initialize(): void
5555
if (isset($config['className']) && $config['className'] instanceof DebugEngine) {
5656
$instance = $config['className'];
5757
} elseif (isset($config['className'])) {
58-
Cache::drop($name);
59-
$instance = new DebugEngine($config, $name, $this->logger);
58+
/** @var \Cake\Cache\CacheEngine $engine */
59+
$engine = Cache::pool($name);
60+
// Unload from the cache registry so that subsequence calls to
61+
// Cache::pool($name) use the new config with DebugEngine instance set below.
62+
Cache::getRegistry()->unload($name);
63+
64+
$instance = new DebugEngine($engine, $name, $this->logger);
65+
$instance->init();
6066
$config['className'] = $instance;
67+
68+
Cache::drop($name);
6169
Cache::setConfig($name, $config);
6270
}
6371
if (isset($instance)) {

src/ToolbarService.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -365,13 +365,21 @@ public function injectScripts(Request $row, ResponseInterface $response): Respon
365365
if ($pos === false) {
366366
return $response;
367367
}
368+
// Use Router to get the request so that we can see the
369+
// state after other middleware have been applied.
370+
$request = Router::getRequest();
371+
$nonce = '';
372+
if ($request && $request->getAttribute('cspScriptNonce')) {
373+
$nonce = sprintf(' nonce="%s"', $request->getAttribute('cspScriptNonce'));
374+
}
368375

369376
$url = Router::url('/', true);
370377
$script = sprintf(
371-
'<script id="__debug_kit_script" data-id="%s" data-url="%s" type="module" src="%s"></script>',
378+
'<script id="__debug_kit_script" data-id="%s" data-url="%s" type="module" src="%s"%s></script>',
372379
$row->id,
373380
$url,
374-
Router::url($this->getToolbarUrl())
381+
Router::url($this->getToolbarUrl()),
382+
$nonce
375383
);
376384
$contents = substr($contents, 0, $pos) . $script . substr($contents, $pos);
377385
$body->rewind();

tests/TestCase/Middleware/DebugKitMiddlewareTest.php

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Cake\Http\CallbackStream;
2222
use Cake\Http\Response;
2323
use Cake\Http\ServerRequest;
24+
use Cake\Routing\Router;
2425
use Cake\TestSuite\TestCase;
2526
use DebugKit\Middleware\DebugKitMiddleware;
2627
use Psr\Http\Server\RequestHandlerInterface;
@@ -53,7 +54,7 @@ public function setUp(): void
5354
parent::setUp();
5455

5556
$connection = ConnectionManager::get('test');
56-
$this->skipIf($connection->getDriver() instanceof Sqlite, 'Schema insertion/removal breaks SQLite');
57+
$this->skipIf($connection->getDriver() instanceof Sqlite, 'This test fails in CI with sqlite');
5758
$this->oldConfig = Configure::read('DebugKit');
5859
$this->restore = $GLOBALS['FORCE_DEBUGKIT_TOOLBAR'];
5960
$GLOBALS['FORCE_DEBUGKIT_TOOLBAR'] = true;
@@ -135,6 +136,39 @@ public function testInvokeSaveData()
135136
$this->assertTextEquals($expected, $body);
136137
}
137138

139+
/**
140+
* Ensure data is saved for HTML requests
141+
*
142+
* @return void
143+
*/
144+
public function testInvokeInjectCspNonce()
145+
{
146+
$request = new ServerRequest([
147+
'url' => '/articles',
148+
'environment' => ['REQUEST_METHOD' => 'GET'],
149+
]);
150+
$request = $request->withAttribute('cspScriptNonce', 'csp-nonce');
151+
Router::setRequest($request);
152+
153+
$response = new Response([
154+
'statusCode' => 200,
155+
'type' => 'text/html',
156+
'body' => '<html><title>test</title><body><p>some text</p></body>',
157+
]);
158+
159+
$handler = $this->handler();
160+
$handler->expects($this->once())
161+
->method('handle')
162+
->willReturn($response);
163+
164+
$middleware = new DebugKitMiddleware();
165+
$response = $middleware->process($request, $handler);
166+
$this->assertInstanceOf(Response::class, $response, 'Should return the response');
167+
168+
$body = (string)$response->getBody();
169+
$this->assertStringContainsString('nonce="csp-nonce"', $body);
170+
}
171+
138172
/**
139173
* Ensure that streaming results are tracked, but not modified.
140174
*

tests/TestCase/ToolbarServiceTest.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use Cake\Http\Response;
2323
use Cake\Http\ServerRequest as Request;
2424
use Cake\Log\Log;
25+
use Cake\Routing\Router;
2526
use Cake\TestSuite\TestCase;
2627
use DebugKit\Model\Entity\Request as RequestEntity;
2728
use DebugKit\ToolbarService;
@@ -294,6 +295,7 @@ public function testInjectScriptsLastBodyTag()
294295
'url' => '/articles',
295296
'environment' => ['REQUEST_METHOD' => 'GET'],
296297
]);
298+
Router::setRequest($request);
297299
$response = new Response([
298300
'statusCode' => 200,
299301
'type' => 'text/html',
@@ -305,7 +307,7 @@ public function testInjectScriptsLastBodyTag()
305307
$row = $bar->saveData($request, $response);
306308
$response = $bar->injectScripts($row, $response);
307309

308-
$timeStamp = filemtime(Plugin::path('DebugKit') . 'webroot' . DS . 'js' . DS . 'main.js');
310+
$timeStamp = filemtime(Plugin::path('DebugKit') . 'webroot' . DS . 'js' . DS . 'inject-iframe.js');
309311

310312
$expected = '<html><title>test</title><body><p>some text</p>' .
311313
'<script id="__debug_kit_script" data-id="' . $row->id . '" ' .
@@ -365,8 +367,10 @@ public function testInjectScriptsStreamBodies()
365367
*/
366368
public function testInjectScriptsNoModifyResponse()
367369
{
368-
$request = new Request(['url' => '/articles']);
369-
370+
$request = new Request([
371+
'url' => '/articles/view/123',
372+
'params' => [],
373+
]);
370374
$response = new Response([
371375
'statusCode' => 200,
372376
'type' => 'application/json',

0 commit comments

Comments
 (0)