Show where an Exception was thrown or error object was returned

- 관리자에게만 표시함
  - 오류 화면을 표시하는 방식에 따라서는 표시되지 않을 수 있음
  - 코어 내부에서 발생하는 오류는 표시되지 않을 수 있음
  - message 모듈 스킨에 의존함
This commit is contained in:
Kijin Sung 2020-03-19 00:58:30 +09:00
parent 9042e4110c
commit 339fd234a5
10 changed files with 81 additions and 10 deletions

View file

@ -1524,7 +1524,7 @@ class Context
* @param string $message
* @return void
*/
public static function displayErrorPage($title = 'Error', $message = '', $status = 500)
public static function displayErrorPage($title = 'Error', $message = '', $status = 500, $location = '')
{
// Change current directory to the Rhymix installation path.
chdir(\RX_BASEDIR);
@ -1541,6 +1541,18 @@ class Context
$oMessageObject->setHttpStatusCode($status);
}
// Find out the caller's location.
if (!$location)
{
$backtrace = debug_backtrace(false);
$caller = array_shift($backtrace);
$location = $caller['file'] . ':' . $caller['line'];
if (starts_with(\RX_BASEDIR, $location))
{
$location = substr($location, strlen(\RX_BASEDIR));
}
}
if (in_array(Context::getRequestMethod(), array('XMLRPC', 'JSON', 'JS_CALLBACK')))
{
$oMessageObject->setMessage(trim($title . "\n\n" . $message));
@ -1548,7 +1560,7 @@ class Context
else
{
$oMessageObject->setMessage($title);
$oMessageObject->dispMessage($message);
$oMessageObject->dispMessage($message, $location);
}
// Display the message.

View file

@ -993,7 +993,7 @@ class ModuleHandler extends Handler
$oMessageObject = self::getModuleInstance('message', $type);
$oMessageObject->setError(-1);
$oMessageObject->setMessage($this->error);
$oMessageObject->dispMessage();
$oMessageObject->dispMessage(null, $oModule->get('rx_error_location'));
// display Error Page
if(!in_array($oMessageObject->getHttpStatusCode(), array(200, 403)))

View file

@ -363,12 +363,17 @@ class ModuleObject extends BaseObject
$this->setError(-1);
$this->setMessage($msg_code);
// Get backtrace
$backtrace = debug_backtrace(false);
$caller = array_shift($backtrace);
$location = $caller['file'] . ':' . $caller['line'];
// Error message display by message module
$type = Mobile::isFromMobilePhone() ? 'mobile' : 'view';
$oMessageObject = ModuleHandler::getModuleInstance('message', $type);
$oMessageObject->setError(-1);
$oMessageObject->setMessage($msg_code);
$oMessageObject->dispMessage();
$oMessageObject->dispMessage(null, $location);
$this->setTemplatePath($oMessageObject->getTemplatePath());
$this->setTemplateFile($oMessageObject->getTemplateFile());
@ -597,6 +602,8 @@ class ModuleObject extends BaseObject
catch (Rhymix\Framework\Exception $e)
{
$output = new BaseObject(-2, $e->getMessage());
$location = $e->getFile() . ':' . $e->getLine();
$output->add('rx_error_location', $location);
}
}
else
@ -609,6 +616,10 @@ class ModuleObject extends BaseObject
{
$this->setError($output->getError());
$this->setMessage($output->getMessage());
if($output->getError() && $output->get('rx_error_location'))
{
$this->add('rx_error_location', $output->get('rx_error_location'));
}
$original_output = clone $output;
}
else
@ -622,6 +633,10 @@ class ModuleObject extends BaseObject
{
$this->setError($triggerOutput->getError());
$this->setMessage($triggerOutput->getMessage());
if($output->get('rx_error_location'))
{
$this->add('rx_error_location', $output->get('rx_error_location'));
}
return FALSE;
}
@ -639,6 +654,10 @@ class ModuleObject extends BaseObject
{
$this->setError($output->getError());
$this->setMessage($output->getMessage());
if($output->get('rx_error_location'))
{
$this->add('rx_error_location', $output->get('rx_error_location'));
}
return FALSE;
}

View file

@ -44,6 +44,19 @@ class BaseObject
{
$this->setError($error);
$this->setMessage($message);
if ($error)
{
$backtrace = debug_backtrace(false);
$caller = array_shift($backtrace);
$nextcaller = array_shift($backtrace);
if ($nextcaller && $nextcaller['function'] === 'createObject')
{
$caller = $nextcaller;
}
$location = $caller['file'] . ':' . $caller['line'];
$this->add('rx_error_location', $location);
}
}
/**
@ -298,4 +311,4 @@ if (version_compare(PHP_VERSION, '7.2', '<'))
}
/* End of file Object.class.php */
/* Location: ./classes/object/Object.class.php */
/* Location: ./classes/object/Object.class.php */

View file

@ -6,6 +6,9 @@
<div class="message" cond="$system_message_detail">
{$system_message_detail}
</div>
<div class="message location" cond="$system_message_location && $logged_info->is_admin === 'Y'">
{$system_message_location}
</div>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/message/m.skin/default/system_message/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>

View file

@ -17,7 +17,7 @@ class messageView extends message
/**
* @brief Display messages
*/
function dispMessage($detail = null)
function dispMessage($detail = null, $location = null)
{
// Get configurations (using module model object)
$oModuleModel = getModel('module');
@ -47,10 +47,17 @@ class messageView extends message
{
if(strncasecmp('https://', Context::getRequestUri(), 8) === 0) $ssl_mode = true;
}
// Remove basedir from location (if any)
if ($location && starts_with(\RX_BASEDIR, $location))
{
$location = substr($location, strlen(\RX_BASEDIR));
}
Context::set('ssl_mode', $ssl_mode);
Context::set('system_message', nl2br($this->getMessage()));
Context::set('system_message_detail', nl2br($detail));
Context::set('system_message_location', escape($location));
$this->setTemplateFile('system_message');

View file

@ -16,6 +16,8 @@ body, #access table, #access input, #access textarea, #access select, #access bu
#access>.login-footer:after{display:table;line-height:0;content:"";clear:both}
#access .control-group{position:relative;padding:0 14px 0 0;margin:0;clear:both}
#access .control-group:before{content:"";display:block;clear:both}
#access .message{padding:0.8em 1em}
#access .message.location{word-break:break-all}
#access form{margin:0}
#access fieldset{margin:0}
#access label{cursor:pointer;display:inline-block}

View file

@ -8,7 +8,12 @@
<div id="access">
<div class="login-header">
<h1><i class="icon-user"></i> {$system_message}</h1>
<div class="message" cond="$system_message_detail">{$system_message_detail}</div>
<div class="message" cond="$system_message_detail">
{$system_message_detail}
</div>
<div class="message location" cond="$system_message_location && $logged_info->is_admin === 'Y'">
{$system_message_location}
</div>
</div>
<div class="login-body">
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/message/skins/default/system_message/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">

View file

@ -2,7 +2,12 @@
<div class="signin">
<section class="sw-body">
<h1>{$system_message}</h1>
<div class="rx_message-notice error" cond="$system_message_detail">{$system_message_detail}</div>
<div class="rx_message-notice error" cond="$system_message_detail">
{$system_message_detail}
</div>
<div class="rx_message-notice location" cond="$system_message_location && $logged_info->is_admin === 'Y'">
{$system_message_location}
</div>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/message/skins/simple_world/system_message/1'" class="rx_message-notice {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
@ -51,4 +56,4 @@ $(function($){
});
});
</script>
<include target="./common_footer.html" />
<include target="./common_footer.html" />

View file

@ -5,7 +5,12 @@
<div id="access">
<div class="login-header">
<h1>{$system_message}</h1>
<div class="message" cond="$system_message_detail">{$system_message_detail}</div>
<div class="message" cond="$system_message_detail">
{$system_message_detail}
</div>
<div class="message location" cond="$system_message_location && $logged_info->is_admin === 'Y'">
{$system_message_location}
</div>
</div>
<div cond="!$is_logged">
<div class="login-body">