friendica-6379 Monolog - logfile permission denied
authorPhilipp Holzer <admin+github@philipp.info>
Sun, 26 May 2019 12:33:09 +0000 (14:33 +0200)
committerPhilipp Holzer <admin+github@philipp.info>
Sun, 26 May 2019 12:33:09 +0000 (14:33 +0200)
src/Factory/LoggerFactory.php
src/Module/Admin/Logs/Settings.php
src/Module/Admin/Summary.php

index 444a98c..bdd85cf 100644 (file)
@@ -26,6 +26,7 @@ class LoggerFactory
 {
        /**
         * A list of classes, which shouldn't get logged
+        *
         * @var array
         */
        private static $ignoreClassList = [
@@ -37,8 +38,8 @@ class LoggerFactory
        /**
         * Creates a new PSR-3 compliant logger instances
         *
-        * @param string        $channel The channel of the logger instance
-        * @param Configuration $config  The config
+        * @param string        $channel  The channel of the logger instance
+        * @param Configuration $config   The config
         * @param Profiler      $profiler The profiler of the app
         *
         * @return LoggerInterface The PSR-3 compliant logger instance
@@ -55,8 +56,8 @@ class LoggerFactory
                }
 
                $introspection = new Introspection(self::$ignoreClassList);
-               $level = $config->get('system', 'loglevel');
-               $loglevel = self::mapLegacyConfigDebugLevel((string)$level);
+               $level         = $config->get('system', 'loglevel');
+               $loglevel      = self::mapLegacyConfigDebugLevel((string)$level);
 
                switch ($config->get('system', 'logger_config', 'stream')) {
                        case 'monolog':
@@ -71,7 +72,10 @@ class LoggerFactory
 
                                $stream = $config->get('system', 'logfile');
 
-                               static::addStreamHandler($logger, $stream, $loglevel);
+                               // just add a stream in case it's either writable or not file
+                               if (!is_file($stream) || is_writable($stream)) {
+                                       static::addStreamHandler($logger, $stream, $loglevel);
+                               }
                                break;
 
                        case 'syslog':
@@ -81,7 +85,12 @@ class LoggerFactory
                        case 'stream':
                        default:
                                $stream = $config->get('system', 'logfile');
-                               $logger = new StreamLogger($channel, $stream, $introspection, $loglevel);
+                               // just add a stream in case it's either writable or not file
+                               if (!is_file($stream) || is_writable($stream)) {
+                                       $logger = new StreamLogger($channel, $stream, $introspection, $loglevel);
+                               } else {
+                                       $logger = new VoidLogger();
+                               }
                                break;
                }
 
@@ -105,8 +114,8 @@ class LoggerFactory
         *
         * It should never get filled during normal usage of Friendica
         *
-        * @param string        $channel The channel of the logger instance
-        * @param Configuration $config  The config
+        * @param string        $channel  The channel of the logger instance
+        * @param Configuration $config   The config
         * @param Profiler      $profiler The profiler of the app
         *
         * @return LoggerInterface The PSR-3 compliant logger instance
@@ -120,7 +129,8 @@ class LoggerFactory
                $stream      = $config->get('system', 'dlogfile');
                $developerIp = $config->get('system', 'dlogip');
 
-               if (!isset($developerIp) || !$debugging) {
+               if ((!isset($developerIp) || !$debugging) &&
+                   (!is_file($stream) || is_writable($stream))) {
                        $logger = new VoidLogger();
                        Logger::setDevLogger($logger);
                        return $logger;
@@ -149,7 +159,7 @@ class LoggerFactory
                                break;
 
                        case 'syslog':
-                               $logger = new SyslogLogger($channel, $introspection,  LogLevel::DEBUG);
+                               $logger = new SyslogLogger($channel, $introspection, LogLevel::DEBUG);
                                break;
 
                        case 'stream':
@@ -172,6 +182,7 @@ class LoggerFactory
 
        /**
         * Mapping a legacy level to the PSR-3 compliant levels
+        *
         * @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md#5-psrlogloglevel
         *
         * @param string $level the level to be mapped
@@ -208,9 +219,9 @@ class LoggerFactory
        /**
         * Adding a handler to a given logger instance
         *
-        * @param LoggerInterface $logger  The logger instance
-        * @param mixed           $stream  The stream which handles the logger output
-        * @param string          $level   The level, for which this handler at least should handle logging
+        * @param LoggerInterface $logger The logger instance
+        * @param mixed           $stream The stream which handles the logger output
+        * @param string          $level  The level, for which this handler at least should handle logging
         *
         * @return void
         *
index d556184..b9a5e38 100644 (file)
@@ -22,6 +22,12 @@ class Settings extends BaseAdminModule
                        $debugging = !empty($_POST['debugging']);
                        $loglevel  = defaults($_POST, 'loglevel', LogLevel::ERROR);
 
+                       if (is_file($logfile) &&
+                       !is_writeable($logfile)) {
+                               notice(L10n::t('The logfile \'%s\' is not writable. No logging possible', $logfile));
+                               return;
+                       }
+
                        Config::set('system', 'logfile', $logfile);
                        Config::set('system', 'debugging', $debugging);
                        Config::set('system', 'loglevel', $loglevel);
index 98fd74f..6261ac7 100644 (file)
@@ -74,6 +74,23 @@ class Summary extends BaseAdminModule
                                $well_known, $well_known, $a->getBaseURL() . '/help/Install');
                }
 
+               // Check logfile permission
+               if (Config::get('system', 'debugging')) {
+                       $stream = Config::get('system', 'logfile');
+
+                       if (is_file($stream) &&
+                           !is_writeable($stream)) {
+                               $warningtext[] = L10n::t('The logfile \'%s\' is not writable. No logging possible', $stream);
+                       }
+
+                       $stream = Config::get('system', 'dlogfile');
+
+                       if (is_file($stream) &&
+                           !is_writeable($stream)) {
+                               $warningtext[] = L10n::t('The logfile \'%s\' is not writable. No logging possible', $stream);
+                       }
+               }
+
                // check legacy basepath settings
                $configLoader = new ConfigFileLoader($a->getBasePath(), $a->getMode());
                $configCache = new Config\Cache\ConfigCache();