mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2025-02-07 04:26:20 +00:00
Fix an infinite recursion caused by missing plugin
When a MissingPluginException has caught when rendering an exception, we should disable the plugin as needed to prevent an infinite recursion.
This commit is contained in:
parent
b3dfad614a
commit
0c1fc36b14
3 changed files with 84 additions and 0 deletions
|
@ -285,6 +285,12 @@ class ExceptionRenderer {
|
||||||
} else {
|
} else {
|
||||||
$this->_outputMessage('error500');
|
$this->_outputMessage('error500');
|
||||||
}
|
}
|
||||||
|
} catch (MissingPluginException $e) {
|
||||||
|
$attributes = $e->getAttributes();
|
||||||
|
if (isset($attributes['plugin']) && $attributes['plugin'] === $this->controller->plugin) {
|
||||||
|
$this->controller->plugin = null;
|
||||||
|
}
|
||||||
|
$this->_outputMessageSafe('error500');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$this->_outputMessageSafe('error500');
|
$this->_outputMessageSafe('error500');
|
||||||
}
|
}
|
||||||
|
|
|
@ -764,6 +764,73 @@ class ExceptionRendererTest extends CakeTestCase {
|
||||||
$this->assertEquals('Errors', $ExceptionRenderer->controller->viewPath);
|
$this->assertEquals('Errors', $ExceptionRenderer->controller->viewPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that missing plugin disables Controller::$plugin if the two are the same plugin.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMissingPluginRenderSafe() {
|
||||||
|
$exception = new NotFoundException();
|
||||||
|
$ExceptionRenderer = new ExceptionRenderer($exception);
|
||||||
|
|
||||||
|
$ExceptionRenderer->controller = $this->getMock('Controller', array('render'));
|
||||||
|
$ExceptionRenderer->controller->plugin = 'TestPlugin';
|
||||||
|
$ExceptionRenderer->controller->request = $this->getMock('CakeRequest');
|
||||||
|
|
||||||
|
$exception = new MissingPluginException(array('plugin' => 'TestPlugin'));
|
||||||
|
$ExceptionRenderer->controller->expects($this->once())
|
||||||
|
->method('render')
|
||||||
|
->with('error400')
|
||||||
|
->will($this->throwException($exception));
|
||||||
|
|
||||||
|
$response = $this->getMock('CakeResponse');
|
||||||
|
$response->expects($this->once())
|
||||||
|
->method('body')
|
||||||
|
->with($this->logicalAnd(
|
||||||
|
$this->logicalNot($this->stringContains('test plugin error500')),
|
||||||
|
$this->stringContains('Not Found')
|
||||||
|
));
|
||||||
|
|
||||||
|
$ExceptionRenderer->controller->response = $response;
|
||||||
|
$ExceptionRenderer->render();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that missing plugin doesn't disable Controller::$plugin if the two aren't the same plugin.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMissingPluginRenderSafeWithPlugin() {
|
||||||
|
App::build(array(
|
||||||
|
'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)
|
||||||
|
), App::RESET);
|
||||||
|
CakePlugin::load('TestPlugin');
|
||||||
|
$exception = new NotFoundException();
|
||||||
|
$ExceptionRenderer = new ExceptionRenderer($exception);
|
||||||
|
|
||||||
|
$ExceptionRenderer->controller = $this->getMock('Controller', array('render'));
|
||||||
|
$ExceptionRenderer->controller->plugin = 'TestPlugin';
|
||||||
|
$ExceptionRenderer->controller->request = $this->getMock('CakeRequest');
|
||||||
|
|
||||||
|
$exception = new MissingPluginException(array('plugin' => 'TestPluginTwo'));
|
||||||
|
$ExceptionRenderer->controller->expects($this->once())
|
||||||
|
->method('render')
|
||||||
|
->with('error400')
|
||||||
|
->will($this->throwException($exception));
|
||||||
|
|
||||||
|
$response = $this->getMock('CakeResponse');
|
||||||
|
$response->expects($this->once())
|
||||||
|
->method('body')
|
||||||
|
->with($this->logicalAnd(
|
||||||
|
$this->stringContains('test plugin error500'),
|
||||||
|
$this->stringContains('Not Found')
|
||||||
|
));
|
||||||
|
|
||||||
|
$ExceptionRenderer->controller->response = $response;
|
||||||
|
$ExceptionRenderer->render();
|
||||||
|
CakePlugin::unload();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test that exceptions can be rendered when an request hasn't been registered
|
* Test that exceptions can be rendered when an request hasn't been registered
|
||||||
* with Router
|
* with Router
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
test plugin error500
|
||||||
|
<h2><?php echo $message; ?></h2>
|
||||||
|
<p class="error">
|
||||||
|
<strong><?php echo __d('cake', 'Error'); ?>: </strong>
|
||||||
|
<?php echo __d('cake', 'An Internal Error Has Occurred.'); ?>
|
||||||
|
</p>
|
||||||
|
<?php
|
||||||
|
if (Configure::read('debug') > 0):
|
||||||
|
echo $this->element('exception_stack_trace');
|
||||||
|
endif;
|
||||||
|
?>
|
Loading…
Add table
Reference in a new issue