From 34c74400a471b31fea22ea85636f47c76d783710 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov <noreply@fakecake.org>
Date: Thu, 25 Feb 2021 17:10:03 +0300
Subject: [PATCH] enforce some stricter type checking for loggers

---
 classes/handler/public.php |  2 +-
 classes/logger.php         |  3 +++
 classes/logger/adapter.php |  4 ++++
 classes/logger/sql.php     |  8 +++-----
 classes/logger/stdout.php  |  4 ++--
 classes/logger/syslog.php  |  4 ++--
 include/errorhandler.php   | 12 ++++--------
 7 files changed, 19 insertions(+), 18 deletions(-)
 create mode 100644 classes/logger/adapter.php

diff --git a/classes/handler/public.php b/classes/handler/public.php
index abfe07b8f..e4572382e 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 c227c014c..ef77c7a05 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 000000000..79f641441
--- /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 ad7fdecb2..f88621fbe 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 645fe8ecf..e906853ce 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 2dd3c4dfd..3ad9858f3 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 a59d7a616..1908bd39c 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;
-- 
GitLab