diff --git a/README.md b/README.md index a09d65535e7..b54194a7221 100644 --- a/README.md +++ b/README.md @@ -183,9 +183,9 @@ Add the bridge name to `whitelist.txt`: ### How to enable debug mode -Create a file named `DEBUG`: +Set in `config.ini.php`: - touch DEBUG + enable_debug_mode = true Learn more in [debug mode](https://rss-bridge.github.io/rss-bridge/For_Developers/Debug_mode.html). diff --git a/actions/DisplayAction.php b/actions/DisplayAction.php index 3a262674380..c71be5dd11f 100644 --- a/actions/DisplayAction.php +++ b/actions/DisplayAction.php @@ -107,7 +107,7 @@ public function execute(array $request) && (time() - $cache_timeout < $mtime) && !Debug::isEnabled() ) { - // At this point we found the feed in the cache + // At this point we found the feed in the cache and debug mode is disabled if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { // The client wants to know if the feed has changed since its last check @@ -118,7 +118,7 @@ public function execute(array $request) } } - // Fetch the cached feed from the cache and prepare it + // Load the feed from cache and prepare it $cached = $cache->loadData(); if (isset($cached['items']) && isset($cached['extraInfos'])) { foreach ($cached['items'] as $item) { @@ -127,7 +127,7 @@ public function execute(array $request) $infos = $cached['extraInfos']; } } else { - // At this point we did NOT find the feed in the cache. So invoke the bridge! + // At this point we did NOT find the feed in the cache or debug mode is enabled. try { $bridge->setDatas($bridge_params); $bridge->collectData(); @@ -200,7 +200,7 @@ private function createFeedItemFromException($e, BridgeInterface $bridge): FeedI $item->setURI(get_current_url()); $item->setTimestamp(time()); - // Create a item identifier for feed readers e.g. "staysafetv twitch videos_19389" + // Create an item identifier for feed readers e.g. "staysafetv twitch videos_19389" $item->setUid($bridge->getName() . '_' . $uniqueIdentifier); $content = render_template(__DIR__ . '/../templates/bridge-error.html.php', [ diff --git a/actions/FrontpageAction.php b/actions/FrontpageAction.php index f015062f55b..f7ba56e65b0 100644 --- a/actions/FrontpageAction.php +++ b/actions/FrontpageAction.php @@ -24,6 +24,7 @@ public function execute(array $request) } return render(__DIR__ . '/../templates/frontpage.html.php', [ + 'messages' => [], 'admin_email' => Configuration::getConfig('admin', 'email'), 'admin_telegram' => Configuration::getConfig('admin', 'telegram'), 'bridges' => $body, diff --git a/bridges/SchweinfurtBuergerinformationenBridge.php b/bridges/SchweinfurtBuergerinformationenBridge.php index c7c935fd336..349a9d8a84e 100644 --- a/bridges/SchweinfurtBuergerinformationenBridge.php +++ b/bridges/SchweinfurtBuergerinformationenBridge.php @@ -43,10 +43,6 @@ public function collectData() foreach ($articleIDs as $articleID) { $this->items[] = $this->generateItemFromArticle($articleID); - - if (Debug::isEnabled()) { - break; - } } } diff --git a/config.default.ini.php b/config.default.ini.php index f67f315ff61..3a347036d60 100644 --- a/config.default.ini.php +++ b/config.default.ini.php @@ -15,6 +15,13 @@ ; Display a system message to users. message = "" +; Whether to enable debug mode. +enable_debug_mode = false + +; Enable debug mode only for these permitted ip addresses +; debug_mode_whitelist[] = 127.0.0.1 +; debug_mode_whitelist[] = 192.168.1.10 + [http] timeout = 60 useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0" diff --git a/docs/04_For_Developers/05_Debug_mode.md b/docs/04_For_Developers/05_Debug_mode.md index 482ff0f5c46..6bdb1d484a0 100644 --- a/docs/04_For_Developers/05_Debug_mode.md +++ b/docs/04_For_Developers/05_Debug_mode.md @@ -5,23 +5,29 @@ Enabling debug mode on a public server may result in malicious clients retrievin *** Debug mode enables error reporting and prevents loading data from the cache (data is still written to the cache). -To enable debug mode, create a file named 'DEBUG' in the root directory of RSS-Bridge (next to `index.php`). For further security, insert your IP address in the file. You can add multiple addresses, one per line. +To enable debug mode, set in `config.ini.php`: + + enable_debug_mode = true + +Allow only explicit ip addresses: + + debug_mode_whitelist[] = 127.0.0.1 + debug_mode_whitelist[] = 192.168.1.10 _Notice_: * An empty file enables debug mode for anyone! * The bridge whitelist still applies! (debug mode does **not** enable all bridges) -RSS-Bridge will give you a visual feedback when debug mode is enabled: - -![twitter bridge](../images/debug_mode.png) +RSS-Bridge will give you a visual feedback when debug mode is enabled. While debug mode is active, RSS-Bridge will write additional data to your servers `error.log`. Debug mode is controlled by the static class `Debug`. It provides three core functions: -`Debug::isEnabled()`: Returns `true` if debug mode is enabled. -`Debug::isSecure()`: Returns `true` if your client is on the debug whitelist. -`Debug::log($message)`: Adds a message to `error.log`. It takes one parameter, which can be anything. For example: `Debug::log('Hello World!');` +* `Debug::isEnabled()`: Returns `true` if debug mode is enabled. +* `Debug::log($message)`: Adds a message to `error.log`. It takes one parameter, which can be anything. + +Example: `Debug::log('Hello World!');` **Notice**: `Debug::log($message)` calls `Debug::isEnabled()` internally. You don't have to do that manually. \ No newline at end of file diff --git a/docs/images/debug_mode.png b/docs/images/debug_mode.png deleted file mode 100644 index 6ab8917bb62..00000000000 Binary files a/docs/images/debug_mode.png and /dev/null differ diff --git a/lib/Configuration.php b/lib/Configuration.php index bdbd830bcc9..6eec33f6f0e 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -114,6 +114,15 @@ public static function loadConfiguration(array $customConfig = [], array $env = } } + if (file_exists(__DIR__ . '/../DEBUG')) { + // The debug mode has been moved to config. Preserve existing installs which has this DEBUG file. + self::setConfig('system', 'enable_debug_mode', true); + $debug = trim(file_get_contents(__DIR__ . '/../DEBUG')); + if ($debug) { + self::setConfig('system', 'debug_mode_whitelist', explode("\n", str_replace("\r", '', $debug))); + } + } + if ( !is_string(self::getConfig('system', 'timezone')) || !in_array(self::getConfig('system', 'timezone'), timezone_identifiers_list(DateTimeZone::ALL_WITH_BC)) @@ -121,6 +130,13 @@ public static function loadConfiguration(array $customConfig = [], array $env = self::throwConfigError('system', 'timezone'); } + if (!is_bool(self::getConfig('system', 'enable_debug_mode'))) { + self::throwConfigError('system', 'enable_debug_mode', 'Is not a valid Boolean'); + } + if (!is_array(self::getConfig('system', 'debug_mode_whitelist') ?: [])) { + self::throwConfigError('system', 'debug_mode_whitelist', 'Is not a valid array'); + } + if (!is_string(self::getConfig('proxy', 'url'))) { self::throwConfigError('proxy', 'url', 'Is not a valid string'); } diff --git a/lib/Debug.php b/lib/Debug.php index 9210ebc801c..f6a8d1052b4 100644 --- a/lib/Debug.php +++ b/lib/Debug.php @@ -1,106 +1,23 @@ message)); - } + Logger::debug(trim($xmlError->message)); } if ($xmlErrors) { // Render only the first error into exception message diff --git a/lib/Logger.php b/lib/Logger.php index 9bbdd512e94..e15035fe503 100644 --- a/lib/Logger.php +++ b/lib/Logger.php @@ -6,9 +6,7 @@ final class Logger { public static function debug(string $message, array $context = []) { - if (Debug::isEnabled()) { - self::log('DEBUG', $message, $context); - } + self::log('DEBUG', $message, $context); } public static function info(string $message, array $context = []): void @@ -28,6 +26,11 @@ public static function error(string $message, array $context = []): void private static function log(string $level, string $message, array $context = []): void { + if (!Debug::isEnabled() && $level === 'DEBUG') { + // Don't log this debug log record because debug mode is disabled + return; + } + if (isset($context['e'])) { /** @var \Throwable $e */ $e = $context['e']; @@ -66,7 +69,13 @@ private static function log(string $level, string $message, array $context = []) $message, $context ? Json::encode($context) : '' ); + // Log to stderr/stdout whatever that is + // todo: extract to log handler error_log($text); + + // Log to file + // todo: extract to log handler + //file_put_contents('/tmp/rss-bridge.log', $text, FILE_APPEND); } } diff --git a/lib/RssBridge.php b/lib/RssBridge.php index 62e8acc58cb..e6f1c9e4409 100644 --- a/lib/RssBridge.php +++ b/lib/RssBridge.php @@ -42,6 +42,7 @@ private function run($request): void ); Logger::warning($text); if (Debug::isEnabled()) { + // todo: extract to log handler print sprintf("
%s\n", e($text)); } }); @@ -59,6 +60,7 @@ private function run($request): void ); Logger::error($message); if (Debug::isEnabled()) { + // todo: extract to log handler print sprintf("
%s\n", e($message)); } } diff --git a/lib/bootstrap.php b/lib/bootstrap.php index 8e5cf69cc9a..98c7b54d955 100644 --- a/lib/bootstrap.php +++ b/lib/bootstrap.php @@ -40,6 +40,7 @@ const REPOSITORY = 'https://github.com/RSS-Bridge/rss-bridge/'; // Allow larger files for simple_html_dom +// todo: extract to config (if possible) const MAX_FILE_SIZE = 10000000; // Files diff --git a/lib/contents.php b/lib/contents.php index ebd4ee2cc63..a1630e3ca19 100644 --- a/lib/contents.php +++ b/lib/contents.php @@ -438,14 +438,17 @@ function getSimpleHTMLDOMCached( $time !== false && (time() - $duration < $time) && !Debug::isEnabled() - ) { // Contents within duration + ) { + // Contents within duration and debug mode is disabled $content = $cache->loadData(); - } else { // Content not within duration + } else { + // Contents not within duration, or debug mode is enabled $content = getContents( $url, $header ?? [], $opts ?? [] ); + // todo: fix bad if statement if ($content !== false) { $cache->saveData($content); } diff --git a/lib/html.php b/lib/html.php index 7f4f12017c5..ca0a411c872 100644 --- a/lib/html.php +++ b/lib/html.php @@ -1,23 +1,34 @@ Configuration::getConfig('system', 'message'), + 'level' => 'info', + ]; + } + if (Debug::isEnabled()) { + $debugModeWhitelist = Configuration::getConfig('system', 'debug_mode_whitelist') ?: []; + if ($debugModeWhitelist === []) { + $context['messages'][] = [ + 'body' => 'Warning : Debug mode is active from any location, make sure only you can access RSS-Bridge.', + 'level' => 'error' + ]; + } else { + $context['messages'][] = [ + 'body' => 'Warning : Debug mode is active from your IP address, your requests will bypass the cache.', + 'level' => 'warning' + ]; + } + } $context['page'] = render_template($template, $context); return render_template('base.html.php', $context); } diff --git a/static/style.css b/static/style.css index 570ee014812..a83e25e4214 100644 --- a/static/style.css +++ b/static/style.css @@ -71,15 +71,34 @@ header { text-align: center; } -section.warning { +.alert-info { + margin-bottom: 15px; + color: white; + font-weight: bold; + background-color: rgb(33, 150, 243); + padding: 15px; + border-radius: 4px; + text-align: center; +} + +.alert-warning { background-color: #ffc600; color: #5f5f5f; + margin-bottom: 15px; + font-weight: bold; + padding: 15px; + border-radius: 4px; + text-align: center; } -section.critical-warning { +.alert-error { background-color: #cf3e3e; font-weight: bold; color: white; + margin-bottom: 15px; + padding: 15px; + border-radius: 4px; + text-align: center; } select, @@ -342,15 +361,6 @@ button { width: 200px; } -.alert { - margin-bottom: 15px; - color: white; - font-weight: bold; - background-color: rgb(33, 150, 243); - padding: 15px; - border-radius: 4px; -} - @media screen and (max-width: 767px) { .container { width: 100%; diff --git a/templates/base.html.php b/templates/base.html.php index 00728785c83..ca31823dc35 100644 --- a/templates/base.html.php +++ b/templates/base.html.php @@ -17,11 +17,11 @@ - -