diff --git a/classes/handler/public.php b/classes/handler/public.php index abfe07b8f7ed61442ab816d15f7571a5273e7d6c..e4572382e1afd2696ebff457a7d0c73642037e2d 100755 --- a/classes/handler/public.php +++ b/classes/handler/public.php @@ -614,7 +614,7 @@ class Handler_Public extends Handler { function dbupdate() { startup_gettext(); - if (!Config::get(Config::SINGLE_USER_MODE) && $_SESSION["access_level"] < 10) { + if (!Config::get(Config::SINGLE_USER_MODE) && ($_SESSION["access_level"] ?? 0) < 10) { $_SESSION["login_error_msg"] = __("Your access level is insufficient to run this script."); $this->_render_login_form(); exit; diff --git a/classes/logger.php b/classes/logger.php index c227c014c9f1f6cf76e65aca21be8c1cce0f4d33..ef77c7a05366b2eef20a1c736518d16e328a11ea 100755 --- a/classes/logger.php +++ b/classes/logger.php @@ -63,6 +63,9 @@ class Logger { default: $this->adapter = false; } + + if ($this->adapter && !implements_interface($this->adapter, "Logger_Adapter")) + user_error("Adapter for LOG_DESTINATION: " . Config::LOG_DESTINATION . " does not implement required interface.", E_USER_ERROR); } private static function get_instance() : Logger { diff --git a/classes/logger/adapter.php b/classes/logger/adapter.php new file mode 100644 index 0000000000000000000000000000000000000000..79f641441d643be2989f0d0b588dc1d1ed4de1e8 --- /dev/null +++ b/classes/logger/adapter.php @@ -0,0 +1,4 @@ +<?php +interface Logger_Adapter { + function log_error(int $errno, string $errstr, string $file, int $line, $context); +} \ No newline at end of file diff --git a/classes/logger/sql.php b/classes/logger/sql.php index ad7fdecb2ffa12b040b9d4306a3f0a7ce546d804..f88621fbe4b19d3ad6266a4fb9d3e143913a85aa 100755 --- a/classes/logger/sql.php +++ b/classes/logger/sql.php @@ -1,17 +1,15 @@ <?php -class Logger_SQL { +class Logger_SQL implements Logger_Adapter { private $pdo; - function log_error($errno, $errstr, $file, $line, $context) { + function log_error(int $errno, string $errstr, string $file, int $line, $context) { // separate PDO connection object is used for logging if (!$this->pdo) $this->pdo = Db::instance()->pdo_connect(); if ($this->pdo && get_schema_version() > 117) { - $owner_uid = $_SESSION["uid"] ?? null; - // limit context length, DOMDocument dumps entire XML in here sometimes, which may be huge $context = mb_substr($context, 0, 8192); @@ -37,7 +35,7 @@ class Logger_SQL { $sth = $this->pdo->prepare("INSERT INTO ttrss_error_log (errno, errstr, filename, lineno, context, owner_uid, created_at) VALUES (?, ?, ?, ?, ?, ?, NOW())"); - $sth->execute([$errno, $errstr, $file, $line, $context, $owner_uid]); + $sth->execute([$errno, $errstr, $file, $line, $context, $_SESSION["uid"] ?? null]); return $sth->rowCount(); } diff --git a/classes/logger/stdout.php b/classes/logger/stdout.php index 645fe8ecf36808749127c1cb0c787fffa4b43efe..e906853ce2a6662de2c28d9553768d474f460878 100644 --- a/classes/logger/stdout.php +++ b/classes/logger/stdout.php @@ -1,7 +1,7 @@ <?php -class Logger_Stdout { +class Logger_Stdout implements Logger_Adapter { - function log_error($errno, $errstr, $file, $line, $context) { + function log_error(int $errno, string $errstr, string $file, int $line, $context) { switch ($errno) { case E_ERROR: diff --git a/classes/logger/syslog.php b/classes/logger/syslog.php index 2dd3c4dfd1d0b44f9bb6563eade892a5e811ba23..3ad9858f3ace8db3064b025a0895942ab0c28506 100644 --- a/classes/logger/syslog.php +++ b/classes/logger/syslog.php @@ -1,7 +1,7 @@ <?php -class Logger_Syslog { +class Logger_Syslog implements Logger_Adapter { - function log_error($errno, $errstr, $file, $line, $context) { + function log_error(int $errno, string $errstr, string $file, int $line, $context) { switch ($errno) { case E_ERROR: diff --git a/include/errorhandler.php b/include/errorhandler.php index a59d7a6164964a008a45728374107c0d0ace5bb6..1908bd39c80131552a0de0f6a5686eeadd8c6f40 100644 --- a/include/errorhandler.php +++ b/include/errorhandler.php @@ -40,13 +40,13 @@ function format_backtrace($trace) { } function ttrss_error_handler($errno, $errstr, $file, $line) { - if (version_compare(PHP_VERSION, '8.0.0', '<')) { + /*if (version_compare(PHP_VERSION, '8.0.0', '<')) { if (error_reporting() == 0 || !$errno) return false; } else { if (!(error_reporting() & $errno)) return false; } - if (error_reporting() == 0 || !$errno) return false; + if (error_reporting() == 0 || !$errno) return false;*/ $file = substr(str_replace(dirname(__DIR__), "", $file), 1); @@ -54,12 +54,10 @@ function ttrss_error_handler($errno, $errstr, $file, $line) { $errstr = truncate_middle($errstr, 16384, " (...) "); if (class_exists("Logger")) - return Logger::log_error($errno, $errstr, $file, $line, $context); + return Logger::log_error((int)$errno, $errstr, $file, (int)$line, $context); } function ttrss_fatal_handler() { - global $last_query; - $error = error_get_last(); if ($error !== NULL) { @@ -74,10 +72,8 @@ function ttrss_fatal_handler() { $file = substr(str_replace(dirname(__DIR__), "", $file), 1); - if ($last_query) $errstr .= " [Last query: $last_query]"; - if (class_exists("Logger")) - return Logger::log_error($errno, $errstr, $file, $line, $context); + return Logger::log_error((int)$errno, $errstr, $file, (int)$line, $context); } return false;