From 9bde3fe5dda2bb090af902583ae4c36541841deb Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Wed, 3 Sep 2014 23:53:24 +0400 Subject: [PATCH] Added "write_on_php_error_only" setting --- .../0.0.0/app/libraries/MailSo/Log/Driver.php | 57 ++++++++++++++---- .../libraries/MailSo/Log/Drivers/Inline.php | 4 +- .../MailSo/Log/Enumerations/Type.php | 4 ++ .../0.0.0/app/libraries/MailSo/Log/Logger.php | 59 +++++++++++++++++-- .../0.0.0/app/libraries/RainLoop/Actions.php | 25 ++++---- .../libraries/RainLoop/Config/Application.php | 3 +- .../0.0.0/app/libraries/RainLoop/Service.php | 34 ----------- 7 files changed, 125 insertions(+), 61 deletions(-) diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Driver.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Driver.php index 1328e7359..7b626da39 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Driver.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Driver.php @@ -48,6 +48,11 @@ abstract class Driver */ private $bWriteOnErrorOnly; + /** + * @var bool + */ + private $bWriteOnPhpErrorOnly; + /** * @var bool */ @@ -71,9 +76,10 @@ abstract class Driver $this->iWriteOnTimeoutOnly = 0; $this->bWriteOnErrorOnly = false; + $this->bWriteOnPhpErrorOnly = false; $this->bFlushCache = false; $this->aCache = array(); - + $this->aPrefixes = array( \MailSo\Log\Enumerations\Type::INFO => '[DATA]', \MailSo\Log\Enumerations\Type::SECURE => '[SECURE]', @@ -84,6 +90,10 @@ abstract class Driver \MailSo\Log\Enumerations\Type::NOTICE => '[NOTICE]', \MailSo\Log\Enumerations\Type::WARNING => '[WARNING]', \MailSo\Log\Enumerations\Type::ERROR => '[ERROR]', + + \MailSo\Log\Enumerations\Type::NOTICE_PHP => '[NOTICE]', + \MailSo\Log\Enumerations\Type::WARNING_PHP => '[WARNING]', + \MailSo\Log\Enumerations\Type::ERROR_PHP => '[ERROR]', ); } @@ -107,7 +117,7 @@ abstract class Driver /** * @param bool $bValue - * + * * @return \MailSo\Log\Driver */ public function WriteOnErrorOnly($bValue) @@ -116,6 +126,17 @@ abstract class Driver return $this; } + /** + * @param bool $bValue + * + * @return \MailSo\Log\Driver + */ + public function WriteOnPhpErrorOnly($bValue) + { + $this->bWriteOnPhpErrorOnly = !!$bValue; + return $this; + } + /** * @param int $iTimeout * @@ -128,7 +149,7 @@ abstract class Driver { $this->iWriteOnTimeoutOnly = 0; } - + return $this; } @@ -214,15 +235,31 @@ abstract class Driver final public function Write($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '') { $bResult = true; - if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) + if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) { - if ($this->bWriteOnErrorOnly && \in_array($iType, array( + $bErrorPhp = false; + + $bError = $this->bWriteOnErrorOnly && \in_array($iType, array( \MailSo\Log\Enumerations\Type::NOTICE, + \MailSo\Log\Enumerations\Type::NOTICE_PHP, \MailSo\Log\Enumerations\Type::WARNING, - \MailSo\Log\Enumerations\Type::ERROR - ))) + \MailSo\Log\Enumerations\Type::WARNING_PHP, + \MailSo\Log\Enumerations\Type::ERROR, + \MailSo\Log\Enumerations\Type::ERROR_PHP + )); + + if (!$bError) { - $sFlush = '--- FlushLogCache: WriteOnErrorOnly'; + $bErrorPhp = $this->bWriteOnPhpErrorOnly && \in_array($iType, array( + \MailSo\Log\Enumerations\Type::NOTICE_PHP, + \MailSo\Log\Enumerations\Type::WARNING_PHP, + \MailSo\Log\Enumerations\Type::ERROR_PHP + )); + } + + if ($bError || $bErrorPhp) + { + $sFlush = '--- FlushLogCache: '.($bError ? 'WriteOnErrorOnly' : 'WriteOnPhpErrorOnly'); if (isset($this->aCache[0]) && empty($this->aCache[0])) { $this->aCache[0] = $sFlush; @@ -255,7 +292,7 @@ abstract class Driver $this->aCache[] = '--- FlushLogCache: Trigger'; $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); - + $this->bFlushCache = true; $bResult = $this->writeImplementation($this->aCache); $this->aCache = array(); @@ -289,7 +326,7 @@ abstract class Driver */ final public function WriteEmptyLine() { - if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) + if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) { $this->aCache[] = ''; } diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/Inline.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/Inline.php index ce0dcc50f..6b64f88af 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/Inline.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/Inline.php @@ -69,13 +69,13 @@ class Inline extends \MailSo\Log\Driver return true; } - + /** * @return bool */ protected function clearImplementation() { - if (\defined('PHP_SAPI') && 'cli' === PHP_SAPI) + if (\defined('PHP_SAPI') && 'cli' === PHP_SAPI && \MailSo\Base\Utils::FunctionExistsAndEnabled('system')) { \system('clear'); } diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Enumerations/Type.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Enumerations/Type.php index 09bb0b119..36afd9e98 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Enumerations/Type.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Enumerations/Type.php @@ -18,4 +18,8 @@ class Type const TIME = 6; const MEMORY = 7; const TIME_DELTA = 8; + + const NOTICE_PHP = 11; + const WARNING_PHP = 12; + const ERROR_PHP = 13; } diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php index e2bdade8a..f72f47031 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php @@ -28,6 +28,11 @@ class Logger extends \MailSo\Base\Collection */ private $bShowSecter; + /** + * @var bool + */ + private $bHideErrorNotices; + /** * @access protected */ @@ -39,7 +44,9 @@ class Logger extends \MailSo\Base\Collection $this->aForbiddenTypes = array(); $this->aSecretWords = array(); $this->bShowSecter = false; + $this->bHideErrorNotices = false; + \set_error_handler(array(&$this, '__phpErrorHandler')); \register_shutdown_function(array(&$this, '__loggerShutDown')); } @@ -83,6 +90,14 @@ class Logger extends \MailSo\Base\Collection return $sCache; } + /** + * @return bool + */ + public function Ping() + { + return true; + } + /** * @return bool */ @@ -107,13 +122,23 @@ class Logger extends \MailSo\Base\Collection /** * @param bool $bShow - * + * * @return \MailSo\Log\Logger */ public function SetShowSecter($bShow) { $this->bShowSecter = !!$bShow; + return $this; + } + /** + * @param bool $bValue + * + * @return \MailSo\Log\Logger + */ + public function HideErrorNotices($bValue) + { + $this->bHideErrorNotices = !!$bValue; return $this; } @@ -145,10 +170,36 @@ class Logger extends \MailSo\Base\Collection public function RemoveForbiddenType($iType) { $this->aForbiddenTypes[$iType] = false; - return $this; } + /** + * @param int $iErrNo + * @param string $sErrStr + * @param string $sErrFile + * @param int $iErrLine + * + * @return bool + */ + public function __phpErrorHandler($iErrNo, $sErrStr, $sErrFile, $iErrLine) + { + $iType = \MailSo\Log\Enumerations\Type::NOTICE_PHP; + switch ($iErrNo) + { + case E_USER_ERROR: + $iType = \MailSo\Log\Enumerations\Type::ERROR_PHP; + break; + case E_USER_WARNING: + $iType = \MailSo\Log\Enumerations\Type::WARNING_PHP; + break; + } + + $this->Write($sErrFile.' [line:'.$iErrLine.', code:'.$iErrNo.']', $iType, 'PHP'); + $this->Write('Error: '.$sErrStr, $iType, 'PHP'); + + return !!(\MailSo\Log\Enumerations\Type::NOTICE === $iType && $this->bHideErrorNotices); + } + /** * @return void */ @@ -164,7 +215,7 @@ class Logger extends \MailSo\Base\Collection $this->Write('Memory peak usage: '.$aStatistic['php']['memory_get_peak_usage'], \MailSo\Log\Enumerations\Type::MEMORY); } - + if (isset($aStatistic['time'])) { $this->Write('Time delta: '.$aStatistic['time'], \MailSo\Log\Enumerations\Type::TIME_DELTA); @@ -179,7 +230,7 @@ class Logger extends \MailSo\Base\Collection public function WriteEmptyLine() { $iResult = 1; - + $aLoggers =& $this->GetAsArray(); foreach ($aLoggers as /* @var $oLogger \MailSo\Log\Driver */ &$oLogger) { diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 08fd4a08f..48c86d05d 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -128,6 +128,8 @@ class Actions $oConfig = $this->Config(); $this->Plugins()->RunHook('filter.application-config', array(&$oConfig)); + + $this->Logger()->Ping(); } /** @@ -726,8 +728,9 @@ class Actions $this->oLogger->Add( \MailSo\Log\Drivers\File::NewInstance($sLogFileFullPath) - ->WriteOnErrorOnly($this->Config()->Get('logs', 'write_on_error_only', true)) - ->WriteOnTimeoutOnly($this->Config()->Get('logs', 'write_on_timeout_only', 30)) + ->WriteOnErrorOnly($this->Config()->Get('logs', 'write_on_error_only', false)) + ->WriteOnPhpErrorOnly($this->Config()->Get('logs', 'write_on_php_error_only', false)) + ->WriteOnTimeoutOnly($this->Config()->Get('logs', 'write_on_timeout_only', 0)) ); if (!$this->Config()->Get('debug', 'enable', false)) @@ -1555,7 +1558,7 @@ class Actions include_once 'Crypt/RSA.php'; } - \RainLoop\Service::$__HIDE_ERROR_NOTICES = true; + $oLogger->HideErrorNotices(true); $oRsa = new \Crypt_RSA(); $oRsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); @@ -1575,7 +1578,7 @@ class Actions $oLogger->Write('Invalid decrypted data', \MailSo\Log\Enumerations\Type::WARNING, 'RSA'); } - \RainLoop\Service::$__HIDE_ERROR_NOTICES = false; + $oLogger->HideErrorNotices(false); } else { @@ -1591,9 +1594,11 @@ class Actions */ public function DoGetPublicKey() { + $oLogger = $this->Logger(); + if ($this->Config()->Get('security', 'use_rsa_encryption', false)) { - \RainLoop\Service::$__HIDE_ERROR_NOTICES = true; + $oLogger->HideErrorNotices(true); if (!\class_exists('Crypt_RSA')) { @@ -1613,14 +1618,14 @@ class Actions $sHash = \md5($e->toHex().$n->toHex()); - \RainLoop\Service::$__HIDE_ERROR_NOTICES = false; + $oLogger->HideErrorNotices(false); return $this->DefaultResponse(__FUNCTION__, $this->Cacher()->Set(\RainLoop\KeyPathHelper::RsaCacherKey($sHash), $aKeys['privatekey']) ? array($sHash, $e->toHex(), $n->toHex()) : false); } } - \RainLoop\Service::$__HIDE_ERROR_NOTICES = false; + $oLogger->HideErrorNotices(false); return $this->FalseResponse(__FUNCTION__); } @@ -6476,7 +6481,7 @@ class Actions { return $this->rawSmart(false); } - + /** * @return bool */ @@ -6495,7 +6500,7 @@ class Actions $iCode = 0; $sContentType = ''; - + $sData = $this->Http()->GetUrlAsString('http://gravatar.com/avatar/'.\md5($sEmail).'.jpg?s=80&d=404', null, $sContentType, $iCode, $this->Logger(), 5, $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')); @@ -6524,7 +6529,7 @@ class Actions $sContentType = 'image/png'; $sData = \file_get_contents(APP_VERSION_ROOT_PATH.'app/resources/images/empty-contact.png'); } - + $this->cacheByKey($sRawKey); \header('Content-Type: '.$sContentType); echo $sData; diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php index d0958cc6a..6de579b78 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php @@ -140,7 +140,8 @@ Values: 'enable' => array(false, 'Enable logging'), - 'write_on_error_only' => array(false, 'Logs entire request only if error occured'), + 'write_on_error_only' => array(false, 'Logs entire request only if error occured (php requred)'), + 'write_on_php_error_only' => array(false, 'Logs entire request only if php error occured'), 'write_on_timeout_only' => array(0, 'Logs entire request only if request timeout (in seconds) occured.'), 'hide_passwords' => array(true, 'Required for development purposes only. diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Service.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Service.php index 745826de4..092436335 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Service.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Service.php @@ -4,11 +4,6 @@ namespace RainLoop; class Service { - /** - * @var bool - */ - static $__HIDE_ERROR_NOTICES = false; - /** * @var \MailSo\Base\Http */ @@ -32,8 +27,6 @@ class Service $this->oHttp = \MailSo\Base\Http::SingletonInstance(); $this->oActions = \RainLoop\Api::Actions(); - \set_error_handler(array(&$this, 'LogPhpErrorHandler')); - $this->oServiceActions = new \RainLoop\ServiceActions($this->oHttp, $this->oActions); if ($this->oActions->Config()->Get('debug', 'enable', false)) @@ -65,33 +58,6 @@ class Service return new self(); } - /** - * @param int $iErrNo - * @param string $sErrStr - * @param string $sErrFile - * @param int $iErrLine - * - * @return bool - */ - public function LogPhpErrorHandler($iErrNo, $sErrStr, $sErrFile, $iErrLine) - { - $iType = \MailSo\Log\Enumerations\Type::NOTICE; - switch ($iErrNo) - { - case E_USER_ERROR: - $iType = \MailSo\Log\Enumerations\Type::ERROR; - break; - case E_USER_WARNING: - $iType = \MailSo\Log\Enumerations\Type::WARNING; - break; - } - - $this->oActions->Logger()->Write($sErrFile.' [line:'.$iErrLine.', code:'.$iErrNo.']', $iType, 'PHP'); - $this->oActions->Logger()->Write('Error: '.$sErrStr, $iType, 'PHP'); - - return !!(\MailSo\Log\Enumerations\Type::NOTICE === $iType && \RainLoop\Service::$__HIDE_ERROR_NOTICES); - } - /** * @return \RainLoop\Service */