19declare(strict_types=1);
22use Whoops\RunInterface;
23use Whoops\Handler\PrettyPageHandler;
24use Whoops\Handler\CallbackHandler;
25use Whoops\Exception\Inspector;
26use Whoops\Handler\HandlerInterface;
46 'usr_password_retype',
48 'new_password_retype',
74 restore_error_handler();
75 set_error_handler([$this,
'handlePreWhoops']);
85 if (self::$whoops_handlers_registered) {
93 if ($runtime->shouldLogErrors()) {
94 $this->whoops->pushHandler($this->loggingHandler());
96 $this->whoops->register();
98 self::$whoops_handlers_registered =
true;
108 strcasecmp(
$_SERVER[
'REQUEST_METHOD'] ??
'',
'post') === 0) {
125 $backtrace = debug_backtrace();
126 if (isset($backtrace[0][
'object'])) {
127 unset($backtrace[0][
'object']);
132 $this->
errorHandler($message, $code ?? $this->WARNING, $backtrace);
138 private function errorHandler(
string $message,
int $code, array $backtrace): void
143 if ($session_failure) {
144 $m =
'Fatal Error: Called raise error two times.<br>' .
145 'First error: ' . $session_failure .
'<br>' .
146 'Last Error:' . $message;
153 $log->write($message);
155 if ($code === $this->FATAL) {
156 throw new RuntimeException(stripslashes($message));
159 if ($code === $this->WARNING) {
161 if (defined(
'ILIAS_MODULE')) {
168 if ($code === $this->MESSAGE) {
171 $_SESSION[
'error_post_vars'] =
$_POST;
173 if (empty($_SESSION[
'referer'])) {
174 $dirname = dirname(
$_SERVER[
'PHP_SELF']);
178 if (is_array($ilurl) && array_key_exists(
'path', $ilurl) && $ilurl[
'path'] !==
'') {
179 $subdir = substr(strstr($dirname, (
string) $ilurl[
'path']), strlen((
string) $ilurl[
'path']));
183 $num_subdirs = substr_count($subdir,
'/');
185 for ($i = 1; $i <= $num_subdirs; $i++) {
197 return $this->message;
202 $this->message = $a_message;
207 if ($this->getMessage()) {
208 $this->message .=
'<br /> ';
210 $this->message .= $a_message;
225 return defined(
'DEVMODE') && (
int) DEVMODE === 1;
230 return new CallbackHandler(
function ($exception, Inspector $inspector, Run $run) {
235 $message =
'Sorry, an error occured.';
236 if (
$DIC->isDependencyAvailable(
'language')) {
237 $DIC->language()->loadLanguageModule(
'logging');
238 $message =
$DIC->language()->txt(
'error_sry_error');
241 if (!empty($logger->folder())) {
242 $session_id = substr(session_id(), 0, 5);
243 $r = new \Random\Randomizer();
244 $err_num = $r->getInt(1, 9999);
245 $file_name = $session_id .
'_' . $err_num;
248 $lwriter = $lwriter->withExclusionList(self::SENSTIVE_PARAMETER_NAMES);
251 if (
$DIC->isDependencyAvailable(
'language')) {
252 $message = sprintf(
$DIC->language()->txt(
'log_error_message'), $file_name);
253 if ($logger->mail()) {
254 $message .=
' ' . sprintf(
255 $DIC->language()->txt(
'log_error_message_send_mail'),
262 $message =
'Sorry, an error occured. A logfile has been created which can be identified via the code "' . $file_name .
'"';
263 if ($logger->mail()) {
264 $message .=
' ' .
'Please send a mail to <a href="mailto:' . $logger->mail() .
'?subject=code: ' . $file_name .
'">' . $logger->mail() .
'</a>';
269 if (
$DIC->isDependencyAvailable(
'ui') && isset(
$DIC[
'tpl']) &&
$DIC->isDependencyAvailable(
'ctrl')) {
270 $DIC->ui()->mainTemplate()->setOnScreenMessage(
'failure', $message,
true);
271 $DIC->ctrl()->redirectToURL(
'error.php');
274 header(
'Location: error.php');
284 switch (ERROR_HANDLER) {
286 return (
new ilTestingHandler())->withExclusionList(self::SENSTIVE_PARAMETER_NAMES);
294 if ((!defined(
'ERROR_HANDLER') || ERROR_HANDLER !==
'PRETTY_PAGE') && $ilLog) {
296 "Unknown or undefined error handler '" . ERROR_HANDLER .
"'. " .
297 'Falling back to PrettyPageHandler.'
301 $prettyPageHandler =
new PrettyPageHandler();
303 $this->addEditorSupport($prettyPageHandler);
305 foreach (self::SENSTIVE_PARAMETER_NAMES as
$param) {
306 $prettyPageHandler->blacklist(
'_POST',
$param);
309 return $prettyPageHandler;
315 $editorUrl = defined(
'ERROR_EDITOR_URL') ? ERROR_EDITOR_URL :
'';
316 if (!is_string($editorUrl) || $editorUrl ===
'') {
320 $pathTranslationConfig = defined(
'ERROR_EDITOR_PATH_TRANSLATIONS') ? ERROR_EDITOR_PATH_TRANSLATIONS :
'';
322 $pathTranslations = $this->parseEditorPathTranslation($pathTranslationConfig);
324 $handler->setEditor(
function ($file, $line) use ($editorUrl, $pathTranslations) {
325 $this->applyEditorPathTranslations($file, $pathTranslations);
328 [
'[FILE]',
'[LINE]'],
337 foreach ($pathTranslations as $from => $to) {
338 $file = preg_replace(
'@' . $from .
'@', $to, $file);
344 $pathTranslations = [];
346 $mappings = explode(
'|', $pathTranslationConfig);
347 foreach ($mappings as $mapping) {
348 $parts = explode(
',', $mapping);
349 if (count(
$parts) === 2) {
354 return $pathTranslations;
357 protected function loggingHandler(): HandlerInterface
359 return new CallbackHandler(
function ($exception, Inspector $inspector, Run $run) {
366 if (is_object($ilLog)) {
367 $message = $exception->getMessage() .
' in ' . $exception->getFile() .
':' . $exception->getLine();
368 $message .= $exception->getTraceAsString();
370 $previous = $exception->getPrevious();
372 $message .=
"\n\nCaused by\n" . sprintf(
373 '%s: %s in file %s on line %d',
374 get_class($previous),
375 $previous->getMessage(),
376 $previous->getFile(),
379 $previous = $previous->getPrevious();
382 $ilLog->error($exception->getCode() .
' ' . $message);
386 error_log($exception->getMessage());
394 public function handlePreWhoops(
int $level,
string $message,
string $file,
int $line): bool
398 if ($level & error_reporting()) {
399 if (!$this->isDevmodeActive()) {
401 if ($level >= E_USER_NOTICE) {
403 $severity = Whoops\Util\Misc::translateErrorCode($level);
404 $ilLog->write(
"\n\n" . $severity .
' - ' . $message .
"\n" . $file .
' - line ' . $line .
"\n");
411 if ($level === E_USER_DEPRECATED) {
413 $severity = Whoops\Util\Misc::translateErrorCode($level);
414 $ilLog->write(
"\n\n" . $severity .
' - ' . $message .
"\n" . $file .
' - line ' . $line .
"\n");
420 if ($this->whoops instanceof RunInterface) {
421 return $this->whoops->handleError($level, $message, $file, $line);
static getType()
Get context type.
A Whoops error handler that delegates calls on it self to another handler that is created only in the...
Error Handling & global info handling.
initWhoopsHandlers()
Initialize Error and Exception Handlers.
handlePreWhoops(int $level, string $message, string $file, int $line)
Parameter types according to PHP doc: set_error_handler.
parseEditorPathTranslation(string $pathTranslationConfig)
int $WARNING
Error level 2: show warning page.
int $MESSAGE
Error level 3: show message in recent page.
const array SENSTIVE_PARAMETER_NAMES
appendMessage(string $a_message)
errorHandler(string $message, int $code, array $backtrace)
addEditorSupport(PrettyPageHandler $handler)
raiseError(string $message, ?int $code=null)
static bool $whoops_handlers_registered
Are the whoops error handlers already registered?
getHandler()
Get a handler for an error or exception.
int $FATAL
Error level 1: exit application immedietly.
setMessage(string $a_message)
applyEditorPathTranslations(string &$file, array $pathTranslations)
Component logger with individual log levels by component id.
A Whoops error handler that prints the same content as the PrettyPageHandler but as plain text.
static get(string $a_var)
static clear(string $a_var)
static set(string $a_var, $a_val)
Set a value.
A Whoops error handler for testing.
static redirect(string $a_script)
if($clientAssertionType !='urn:ietf:params:oauth:client-assertion-type:jwt-bearer'|| $grantType !='client_credentials') $parts