From 022ed24c2a4067d5860c884a3b257c3064d6b566 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 27 Oct 2016 22:51:38 +0300 Subject: [PATCH] Fix time_offset setting (#1241) --- .../libraries/MailSo/Base/DateTimeHelper.php | 277 +++--- .../0.0.0/app/libraries/MailSo/Log/Driver.php | 811 ++++++++-------- .../0.0.0/app/libraries/MailSo/Log/Logger.php | 864 +++++++++--------- .../0.0.0/app/libraries/RainLoop/Actions.php | 16 +- .../RainLoop/Config/AbstractConfig.php | 685 +++++++------- .../libraries/RainLoop/Config/Application.php | 2 +- 6 files changed, 1345 insertions(+), 1310 deletions(-) diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/DateTimeHelper.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/DateTimeHelper.php index 5ab334e6e..66028b318 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/DateTimeHelper.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/DateTimeHelper.php @@ -1,123 +1,154 @@ -getTimestamp() : 0; - } - - /** - * Parse date string formated as "10-Jan-2012 01:58:17 -0800" - * IMAP INTERNALDATE Format - * - * @param string $sDateTime - * - * @return int - */ - public static function ParseInternalDateString($sDateTime) - { - $sDateTime = \trim($sDateTime); - if (empty($sDateTime)) - { - return 0; - } - - if (\preg_match('/^[a-z]{2,4}, /i', $sDateTime)) // RFC2822 ~ "Thu, 10 Jun 2010 08:58:33 -0700 (PDT)" - { - return \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($sDateTime); - } - - $oDateTime = \DateTime::createFromFormat('d-M-Y H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); - return $oDateTime ? $oDateTime->getTimestamp() : 0; - } - - /** - * Parse date string formated as "2011-06-14 23:59:59 +0400" - * - * @param string $sDateTime - * - * @return int - */ - public static function ParseDateStringType1($sDateTime) - { - $sDateTime = \trim($sDateTime); - if (empty($sDateTime)) - { - return 0; - } - - $oDateTime = \DateTime::createFromFormat('Y-m-d H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); - return $oDateTime ? $oDateTime->getTimestamp() : 0; - } - - /** - * Parse date string formated as "2015-05-08T14:32:18.483-07:00" - * - * @param string $sDateTime - * - * @return int - */ - public static function TryToParseSpecEtagFormat($sDateTime) - { - $sDateTime = \trim(\preg_replace('/ \([a-zA-Z0-9]+\)$/', '', \trim($sDateTime))); - $sDateTime = \trim(\preg_replace('/(:[\d]{2})\.[\d]{3}/', '$1', \trim($sDateTime))); - $sDateTime = \trim(\preg_replace('/(-[\d]{2})T([\d]{2}:)/', '$1 $2', \trim($sDateTime))); - $sDateTime = \trim(\preg_replace('/([\-+][\d]{2}):([\d]{2})$/', ' $1$2', \trim($sDateTime))); - - return \MailSo\Base\DateTimeHelper::ParseDateStringType1($sDateTime); - } -} +getTimestamp() : 0; + } + + /** + * Parse date string formated as "10-Jan-2012 01:58:17 -0800" + * IMAP INTERNALDATE Format + * + * @param string $sDateTime + * + * @return int + */ + public static function ParseInternalDateString($sDateTime) + { + $sDateTime = \trim($sDateTime); + if (empty($sDateTime)) + { + return 0; + } + + if (\preg_match('/^[a-z]{2,4}, /i', $sDateTime)) // RFC2822 ~ "Thu, 10 Jun 2010 08:58:33 -0700 (PDT)" + { + return \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($sDateTime); + } + + $oDateTime = \DateTime::createFromFormat('d-M-Y H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); + return $oDateTime ? $oDateTime->getTimestamp() : 0; + } + + /** + * Parse date string formated as "2011-06-14 23:59:59 +0400" + * + * @param string $sDateTime + * + * @return int + */ + public static function ParseDateStringType1($sDateTime) + { + $sDateTime = \trim($sDateTime); + if (empty($sDateTime)) + { + return 0; + } + + $oDateTime = \DateTime::createFromFormat('Y-m-d H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); + return $oDateTime ? $oDateTime->getTimestamp() : 0; + } + + /** + * Parse date string formated as "2015-05-08T14:32:18.483-07:00" + * + * @param string $sDateTime + * + * @return int + */ + public static function TryToParseSpecEtagFormat($sDateTime) + { + $sDateTime = \trim(\preg_replace('/ \([a-zA-Z0-9]+\)$/', '', \trim($sDateTime))); + $sDateTime = \trim(\preg_replace('/(:[\d]{2})\.[\d]{3}/', '$1', \trim($sDateTime))); + $sDateTime = \trim(\preg_replace('/(-[\d]{2})T([\d]{2}:)/', '$1 $2', \trim($sDateTime))); + $sDateTime = \trim(\preg_replace('/([\-+][\d]{2}):([\d]{2})$/', ' $1$2', \trim($sDateTime))); + + return \MailSo\Base\DateTimeHelper::ParseDateStringType1($sDateTime); + } + + /** + * @param string $sTime + * + * @return int + */ + public static function TimeToSec($sTime) + { + $iMod = 1; + $sTime = \trim($sTime); + if ('-' === \substr($sTime, 0, 1)) + { + $iMod = -1; + $sTime = \substr($sTime, 1); + } + + $aParts = \preg_split('/[:.,]/', (string) $sTime); + + $iResult = 0; + if (isset($aParts[0]) && \is_numeric($aParts[0])) + { + $iResult += 3600 * ((int) $aParts[0]); + } + + if (isset($aParts[1]) && \is_numeric($aParts[1])) + { + $iResult += 60 * ((int) $aParts[1]); + } + + return $iResult * $iMod; + } +} 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 755df58cb..457b78c47 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 @@ -1,403 +1,408 @@ -sDatePattern = 'H:i:s'; - $this->sName = 'INFO'; - $this->sNewLine = "\r\n"; - $this->bTimePrefix = true; - $this->bTypedPrefix = true; - $this->bGuidPrefix = true; - - $this->iTimeOffset = 0; - - $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]', - \MailSo\Log\Enumerations\Type::NOTE => '[NOTE]', - \MailSo\Log\Enumerations\Type::TIME => '[TIME]', - \MailSo\Log\Enumerations\Type::TIME_DELTA => '[TIME]', - \MailSo\Log\Enumerations\Type::MEMORY => '[MEMORY]', - \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]', - ); - } - - /** - * @param int $iTimeOffset - * - * @return \MailSo\Log\Driver - */ - public function SetTimeOffset($iTimeOffset) - { - $this->iTimeOffset = $iTimeOffset; - return $this; - } - - /** - * @return \MailSo\Log\Driver - */ - public function DisableGuidPrefix() - { - $this->bGuidPrefix = false; - return $this; - } - - /** - * @return \MailSo\Log\Driver - */ - public function DisableTimePrefix() - { - $this->bTimePrefix = false; - return $this; - } - - /** - * @param bool $bValue - * - * @return \MailSo\Log\Driver - */ - public function WriteOnErrorOnly($bValue) - { - $this->bWriteOnErrorOnly = !!$bValue; - return $this; - } - - /** - * @param bool $bValue - * - * @return \MailSo\Log\Driver - */ - public function WriteOnPhpErrorOnly($bValue) - { - $this->bWriteOnPhpErrorOnly = !!$bValue; - return $this; - } - - /** - * @param int $iTimeout - * - * @return \MailSo\Log\Driver - */ - public function WriteOnTimeoutOnly($iTimeout) - { - $this->iWriteOnTimeoutOnly = (int) $iTimeout; - if (0 > $this->iWriteOnTimeoutOnly) - { - $this->iWriteOnTimeoutOnly = 0; - } - - return $this; - } - - /** - * @return \MailSo\Log\Driver - */ - public function DisableTypedPrefix() - { - $this->bTypedPrefix = false; - return $this; - } - - /** - * @param string|array $mDesc - * @return bool - */ - abstract protected function writeImplementation($mDesc); - - /** - * @return bool - */ - protected function writeEmptyLineImplementation() - { - return $this->writeImplementation(''); - } - - /** - * @param string $sTimePrefix - * @param string $sDesc - * @param int $iType = \MailSo\Log\Enumerations\Type::INFO - * @param array $sName = '' - * - * @return string - */ - protected function loggerLineImplementation($sTimePrefix, $sDesc, - $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '') - { - return \ltrim( - ($this->bTimePrefix ? '['.$sTimePrefix.']' : ''). - ($this->bGuidPrefix ? '['.\MailSo\Log\Logger::Guid().']' : ''). - ($this->bTypedPrefix ? ' '.$this->getTypedPrefix($iType, $sName) : '') - ).$sDesc; - } - - /** - * @return bool - */ - protected function clearImplementation() - { - return true; - } - - /** - * @return string - */ - protected function getTimeWithMicroSec() - { - $aMicroTimeItems = \explode(' ', \microtime()); - return \MailSo\Log\Logger::DateHelper($this->sDatePattern, $this->iTimeOffset, $aMicroTimeItems[1]).'.'. - \str_pad((int) ($aMicroTimeItems[0] * 1000), 3, '0', STR_PAD_LEFT); - } - - /** - * @param int $iType - * @param string $sName = '' - * - * @return string - */ - protected function getTypedPrefix($iType, $sName = '') - { - $sName = 0 < \strlen($sName) ? $sName : $this->sName; - return isset($this->aPrefixes[$iType]) ? $sName.$this->aPrefixes[$iType].': ' : ''; - } - - /** - * @param string|array $mDesc - * @param bool $bDiplayCrLf = false - * - * @return string - */ - protected function localWriteImplementation($mDesc, $bDiplayCrLf = false) - { - if ($bDiplayCrLf) - { - if (\is_array($mDesc)) - { - foreach ($mDesc as &$sLine) - { - $sLine = \strtr($sLine, array("\r" => '\r', "\n" => '\n'.$this->sNewLine)); - $sLine = \rtrim($sLine); - } - } - else - { - $mDesc = \strtr($mDesc, array("\r" => '\r', "\n" => '\n'.$this->sNewLine)); - $mDesc = \rtrim($mDesc); - } - } - - return $this->writeImplementation($mDesc); - } - - /** - * @final - * @param string $sDesc - * @param int $iType = \MailSo\Log\Enumerations\Type::INFO - * @param string $sName = '' - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - final public function Write($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '', $bDiplayCrLf = false) - { - $bResult = true; - if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) - { - $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::WARNING_PHP, - \MailSo\Log\Enumerations\Type::ERROR, - \MailSo\Log\Enumerations\Type::ERROR_PHP - )); - - if (!$bError) - { - $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; - \array_unshift($this->aCache, ''); - } - else - { - \array_unshift($this->aCache, $sFlush); - } - - $this->aCache[] = '--- FlushLogCache: Trigger'; - $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); - - $this->bFlushCache = true; - $bResult = $this->localWriteImplementation($this->aCache, $bDiplayCrLf); - $this->aCache = array(); - } - else if (0 < $this->iWriteOnTimeoutOnly && \time() - APP_START_TIME > $this->iWriteOnTimeoutOnly) - { - $sFlush = '--- FlushLogCache: WriteOnTimeoutOnly ['.(\time() - APP_START_TIME).'sec]'; - if (isset($this->aCache[0]) && empty($this->aCache[0])) - { - $this->aCache[0] = $sFlush; - \array_unshift($this->aCache, ''); - } - else - { - \array_unshift($this->aCache, $sFlush); - } - - $this->aCache[] = '--- FlushLogCache: Trigger'; - $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); - - $this->bFlushCache = true; - $bResult = $this->localWriteImplementation($this->aCache, $bDiplayCrLf); - $this->aCache = array(); - } - else - { - $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); - } - } - else - { - $bResult = $this->localWriteImplementation( - $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName), $bDiplayCrLf); - } - - return $bResult; - } - - /** - * @return string - */ - public function GetNewLine() - { - return $this->sNewLine; - } - - /** - * @final - * @return bool - */ - final public function Clear() - { - return $this->clearImplementation(); - } - - /** - * @final - * @return void - */ - final public function WriteEmptyLine() - { - if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) - { - $this->aCache[] = ''; - } - else - { - $this->writeEmptyLineImplementation(); - } - } -} +sDatePattern = 'H:i:s'; + $this->sName = 'INFO'; + $this->sNewLine = "\r\n"; + $this->bTimePrefix = true; + $this->bTypedPrefix = true; + $this->bGuidPrefix = true; + + $this->sTimeOffset = '0'; + + $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]', + \MailSo\Log\Enumerations\Type::NOTE => '[NOTE]', + \MailSo\Log\Enumerations\Type::TIME => '[TIME]', + \MailSo\Log\Enumerations\Type::TIME_DELTA => '[TIME]', + \MailSo\Log\Enumerations\Type::MEMORY => '[MEMORY]', + \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]', + ); + } + + /** + * @param string $sTimeOffset + * + * @return \MailSo\Log\Driver + */ + public function SetTimeOffset($sTimeOffset) + { + $this->sTimeOffset = (string) $sTimeOffset; + return $this; + } + + /** + * @return \MailSo\Log\Driver + */ + public function DisableGuidPrefix() + { + $this->bGuidPrefix = false; + return $this; + } + + /** + * @return \MailSo\Log\Driver + */ + public function DisableTimePrefix() + { + $this->bTimePrefix = false; + return $this; + } + + /** + * @param bool $bValue + * + * @return \MailSo\Log\Driver + */ + public function WriteOnErrorOnly($bValue) + { + $this->bWriteOnErrorOnly = !!$bValue; + return $this; + } + + /** + * @param bool $bValue + * + * @return \MailSo\Log\Driver + */ + public function WriteOnPhpErrorOnly($bValue) + { + $this->bWriteOnPhpErrorOnly = !!$bValue; + return $this; + } + + /** + * @param int $iTimeout + * + * @return \MailSo\Log\Driver + */ + public function WriteOnTimeoutOnly($iTimeout) + { + $this->iWriteOnTimeoutOnly = (int) $iTimeout; + if (0 > $this->iWriteOnTimeoutOnly) + { + $this->iWriteOnTimeoutOnly = 0; + } + + return $this; + } + + /** + * @return \MailSo\Log\Driver + */ + public function DisableTypedPrefix() + { + $this->bTypedPrefix = false; + return $this; + } + + /** + * @param string|array $mDesc + * @return bool + */ + abstract protected function writeImplementation($mDesc); + + /** + * @return bool + */ + protected function writeEmptyLineImplementation() + { + return $this->writeImplementation(''); + } + + /** + * @param string $sTimePrefix + * @param string $sDesc + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + * @param array $sName = '' + * + * @return string + */ + protected function loggerLineImplementation($sTimePrefix, $sDesc, + $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '') + { + return \ltrim( + ($this->bTimePrefix ? '['.$sTimePrefix.']' : ''). + ($this->bGuidPrefix ? '['.\MailSo\Log\Logger::Guid().']' : ''). + ($this->bTypedPrefix ? ' '.$this->getTypedPrefix($iType, $sName) : '') + ).$sDesc; + } + + /** + * @return bool + */ + protected function clearImplementation() + { + return true; + } + + /** + * @return string + */ + protected function getTimeWithMicroSec() + { + $aMicroTimeItems = \explode(' ', \microtime()); + return \MailSo\Log\Logger::DateHelper($this->sDatePattern, $this->sTimeOffset, $aMicroTimeItems[1]).'.'. + \str_pad((int) ($aMicroTimeItems[0] * 1000), 3, '0', STR_PAD_LEFT); + } + + /** + * @param int $iType + * @param string $sName = '' + * + * @return string + */ + protected function getTypedPrefix($iType, $sName = '') + { + $sName = 0 < \strlen($sName) ? $sName : $this->sName; + return isset($this->aPrefixes[$iType]) ? $sName.$this->aPrefixes[$iType].': ' : ''; + } + + /** + * @param string|array $mDesc + * @param bool $bDiplayCrLf = false + * + * @return string + */ + protected function localWriteImplementation($mDesc, $bDiplayCrLf = false) + { + if ($bDiplayCrLf) + { + if (\is_array($mDesc)) + { + foreach ($mDesc as &$sLine) + { + $sLine = \strtr($sLine, array("\r" => '\r', "\n" => '\n'.$this->sNewLine)); + $sLine = \rtrim($sLine); + } + } + else + { + $mDesc = \strtr($mDesc, array("\r" => '\r', "\n" => '\n'.$this->sNewLine)); + $mDesc = \rtrim($mDesc); + } + } + + return $this->writeImplementation($mDesc); + } + + /** + * @final + * @param string $sDesc + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + * @param string $sName = '' + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + final public function Write($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '', $bDiplayCrLf = false) + { + $bResult = true; + if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) + { + $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::WARNING_PHP, + \MailSo\Log\Enumerations\Type::ERROR, + \MailSo\Log\Enumerations\Type::ERROR_PHP + )); + + if (!$bError) + { + $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; + \array_unshift($this->aCache, ''); + } + else + { + \array_unshift($this->aCache, $sFlush); + } + + $this->aCache[] = '--- FlushLogCache: Trigger'; + $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); + + $this->bFlushCache = true; + $bResult = $this->localWriteImplementation($this->aCache, $bDiplayCrLf); + $this->aCache = array(); + } + else if (0 < $this->iWriteOnTimeoutOnly && \time() - APP_START_TIME > $this->iWriteOnTimeoutOnly) + { + $sFlush = '--- FlushLogCache: WriteOnTimeoutOnly ['.(\time() - APP_START_TIME).'sec]'; + if (isset($this->aCache[0]) && empty($this->aCache[0])) + { + $this->aCache[0] = $sFlush; + \array_unshift($this->aCache, ''); + } + else + { + \array_unshift($this->aCache, $sFlush); + } + + $this->aCache[] = '--- FlushLogCache: Trigger'; + $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); + + $this->bFlushCache = true; + $bResult = $this->localWriteImplementation($this->aCache, $bDiplayCrLf); + $this->aCache = array(); + } + else + { + $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); + } + } + else + { + $bResult = $this->localWriteImplementation( + $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName), $bDiplayCrLf); + } + + return $bResult; + } + + /** + * @return string + */ + public function GetNewLine() + { + return $this->sNewLine; + } + + /** + * @final + * @return bool + */ + final public function Clear() + { + return $this->clearImplementation(); + } + + /** + * @final + * @return void + */ + final public function WriteEmptyLine() + { + if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) + { + $this->aCache[] = ''; + } + else + { + $this->writeEmptyLineImplementation(); + } + } +} 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 49022c446..cb5dea68c 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 @@ -1,433 +1,431 @@ -bUsed = false; - $this->aForbiddenTypes = array(); - $this->aSecretWords = array(); - $this->bShowSecter = false; - $this->bHideErrorNotices = false; - - if ($bRegPhpErrorHandler) - { - \set_error_handler(array(&$this, '__phpErrorHandler')); - } - - \register_shutdown_function(array(&$this, '__loggerShutDown')); - } - - /** - * @param bool $bRegPhpErrorHandler = false - * - * @return \MailSo\Log\Logger - */ - public static function NewInstance($bRegPhpErrorHandler = false) - { - return new self($bRegPhpErrorHandler); - } - - /** - * @staticvar \MailSo\Log\Logger $oInstance; - * - * @return \MailSo\Log\Logger - */ - public static function SingletonInstance() - { - static $oInstance = null; - if (null === $oInstance) - { - $oInstance = self::NewInstance(); - } - - return $oInstance; - } - - /** - * @param string $sFormat - * @param int $iTimeOffset = 0 - * @param int $iTimestamp = 0 - * - * @return string - */ - public static function DateHelper($sFormat, $iTimeOffset = 0, $iTimestamp = null) - { - $iTimestamp = null === $iTimestamp ? \time() : (int) $iTimestamp; - $iTimeOffset = (int) $iTimeOffset; - - return \gmdate($sFormat, $iTimestamp + $iTimeOffset * 3600); - } - - /** - * @return bool - */ - public static function IsSystemEnabled() - { - return !!(\MailSo\Config::$SystemLogger instanceof \MailSo\Log\Logger); - } - - /** - * @param mixed $mData - * @param int $iType = \MailSo\Log\Enumerations\Type::INFO - */ - public static function SystemLog($mData, $iType = \MailSo\Log\Enumerations\Type::INFO) - { - if (\MailSo\Config::$SystemLogger instanceof \MailSo\Log\Logger) - { - \MailSo\Config::$SystemLogger->WriteMixed($mData, $iType); - } - } - - /** - * @staticvar string $sCache; - * - * @return string - */ - public static function Guid() - { - static $sCache = null; - if (null === $sCache) - { - $sCache = \substr(\MailSo\Base\Utils::Md5Rand(), -8); - } - - return $sCache; - } - - /** - * @return bool - */ - public function Ping() - { - return true; - } - - /** - * @return bool - */ - public function IsEnabled() - { - return 0 < $this->Count(); - } - - /** - * @param string $sWord - * - * @return bool - */ - public function AddSecret($sWord) - { - if (\is_string($sWord) && 0 < \strlen(\trim($sWord))) - { - $this->aSecretWords[] = $sWord; - $this->aSecretWords = \array_unique($this->aSecretWords); - } - } - - /** - * @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; - } - - /** - * @return bool - */ - public function IsShowSecter() - { - return $this->bShowSecter; - } - - /** - * @param int $iType - * - * @return \MailSo\Log\Logger - */ - public function AddForbiddenType($iType) - { - $this->aForbiddenTypes[$iType] = true; - - return $this; - } - - /** - * @param int $iType - * - * @return \MailSo\Log\Logger - */ - 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 - */ - public function __loggerShutDown() - { - if ($this->bUsed) - { - $aStatistic = \MailSo\Base\Loader::Statistic(); - if (\is_array($aStatistic)) - { - if (isset($aStatistic['php']['memory_get_peak_usage'])) - { - $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); - } - } - } - } - - /** - * @return bool - */ - public function WriteEmptyLine() - { - $iResult = 1; - - $aLoggers =& $this->GetAsArray(); - foreach ($aLoggers as /* @var $oLogger \MailSo\Log\Driver */ &$oLogger) - { - $iResult &= $oLogger->WriteEmptyLine(); - } - - return (bool) $iResult; - } - - /** - * @param string $sDesc - * @param int $iType = \MailSo\Log\Enumerations\Type::INFO - * @param string $sName = '' - * @param bool $bSearchSecretWords = true - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - public function Write($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, - $sName = '', $bSearchSecretWords = true, $bDiplayCrLf = false) - { - if (isset($this->aForbiddenTypes[$iType]) && true === $this->aForbiddenTypes[$iType]) - { - return true; - } - - $this->bUsed = true; - - $oLogger = null; - $aLoggers = array(); - $iResult = 1; - - if ($bSearchSecretWords && !$this->bShowSecter && 0 < \count($this->aSecretWords)) - { - $sDesc = \str_replace($this->aSecretWords, '*******', $sDesc); - } - - $aLoggers =& $this->GetAsArray(); - foreach ($aLoggers as /* @var $oLogger \MailSo\Log\Driver */ $oLogger) - { - $iResult &= $oLogger->Write($sDesc, $iType, $sName, $bDiplayCrLf); - } - - return (bool) $iResult; - } - - /** - * @param mixed $oValue - * @param int $iType = \MailSo\Log\Enumerations\Type::INFO - * @param string $sName = '' - * @param bool $bSearchSecretWords = false - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - public function WriteDump($oValue, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '', - $bSearchSecretWords = false, $bDiplayCrLf = false) - { - return $this->Write(\print_r($oValue, true), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - - /** - * @param \Exception $oException - * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE - * @param string $sName = '' - * @param bool $bSearchSecretWords = true - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - public function WriteException($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '', - $bSearchSecretWords = true, $bDiplayCrLf = false) - { - if ($oException instanceof \Exception) - { - if (isset($oException->__LOGINNED__)) - { - return true; - } - - $oException->__LOGINNED__ = true; - - return $this->Write((string) $oException, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - - return false; - } - - /** - * @param \Exception $oException - * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE - * @param string $sName = '' - * @param bool $bSearchSecretWords = true - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - public function WriteExceptionShort($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '', - $bSearchSecretWords = true, $bDiplayCrLf = false) - { - if ($oException instanceof \Exception) - { - if (isset($oException->__LOGINNED__)) - { - return true; - } - - $oException->__LOGINNED__ = true; - - return $this->Write($oException->getMessage(), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - - return false; - } - - /** - * @param mixed $mData - * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE - * @param string $sName = '' - * @param bool $bSearchSecretWords = true - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - public function WriteMixed($mData, $iType = null, $sName = '', - $bSearchSecretWords = true, $bDiplayCrLf = false) - { - $iType = null === $iType ? \MailSo\Log\Enumerations\Type::INFO : $iType; - if (\is_array($mData) || \is_object($mData)) - { - if ($mData instanceof \Exception) - { - $iType = null === $iType ? \MailSo\Log\Enumerations\Type::NOTICE : $iType; - return $this->WriteException($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - else - { - return $this->WriteDump($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - } - else - { - return $this->Write($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - - return false; - } -} +bUsed = false; + $this->aForbiddenTypes = array(); + $this->aSecretWords = array(); + $this->bShowSecter = false; + $this->bHideErrorNotices = false; + + if ($bRegPhpErrorHandler) + { + \set_error_handler(array(&$this, '__phpErrorHandler')); + } + + \register_shutdown_function(array(&$this, '__loggerShutDown')); + } + + /** + * @param bool $bRegPhpErrorHandler = false + * + * @return \MailSo\Log\Logger + */ + public static function NewInstance($bRegPhpErrorHandler = false) + { + return new self($bRegPhpErrorHandler); + } + + /** + * @staticvar \MailSo\Log\Logger $oInstance; + * + * @return \MailSo\Log\Logger + */ + public static function SingletonInstance() + { + static $oInstance = null; + if (null === $oInstance) + { + $oInstance = self::NewInstance(); + } + + return $oInstance; + } + + /** + * @param string $sFormat + * @param string $sTimeOffset = '0' + * @param int $iTimestamp = 0 + * + * @return string + */ + public static function DateHelper($sFormat, $sTimeOffset = '0', $iTimestamp = null) + { + $iTimestamp = null === $iTimestamp ? \time() : (int) $iTimestamp; + return \gmdate($sFormat, $iTimestamp + \MailSo\Base\DateTimeHelper::TimeToSec((string) $sTimeOffset)); + } + + /** + * @return bool + */ + public static function IsSystemEnabled() + { + return !!(\MailSo\Config::$SystemLogger instanceof \MailSo\Log\Logger); + } + + /** + * @param mixed $mData + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + */ + public static function SystemLog($mData, $iType = \MailSo\Log\Enumerations\Type::INFO) + { + if (\MailSo\Config::$SystemLogger instanceof \MailSo\Log\Logger) + { + \MailSo\Config::$SystemLogger->WriteMixed($mData, $iType); + } + } + + /** + * @staticvar string $sCache; + * + * @return string + */ + public static function Guid() + { + static $sCache = null; + if (null === $sCache) + { + $sCache = \substr(\MailSo\Base\Utils::Md5Rand(), -8); + } + + return $sCache; + } + + /** + * @return bool + */ + public function Ping() + { + return true; + } + + /** + * @return bool + */ + public function IsEnabled() + { + return 0 < $this->Count(); + } + + /** + * @param string $sWord + * + * @return bool + */ + public function AddSecret($sWord) + { + if (\is_string($sWord) && 0 < \strlen(\trim($sWord))) + { + $this->aSecretWords[] = $sWord; + $this->aSecretWords = \array_unique($this->aSecretWords); + } + } + + /** + * @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; + } + + /** + * @return bool + */ + public function IsShowSecter() + { + return $this->bShowSecter; + } + + /** + * @param int $iType + * + * @return \MailSo\Log\Logger + */ + public function AddForbiddenType($iType) + { + $this->aForbiddenTypes[$iType] = true; + + return $this; + } + + /** + * @param int $iType + * + * @return \MailSo\Log\Logger + */ + 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 + */ + public function __loggerShutDown() + { + if ($this->bUsed) + { + $aStatistic = \MailSo\Base\Loader::Statistic(); + if (\is_array($aStatistic)) + { + if (isset($aStatistic['php']['memory_get_peak_usage'])) + { + $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); + } + } + } + } + + /** + * @return bool + */ + public function WriteEmptyLine() + { + $iResult = 1; + + $aLoggers =& $this->GetAsArray(); + foreach ($aLoggers as /* @var $oLogger \MailSo\Log\Driver */ &$oLogger) + { + $iResult &= $oLogger->WriteEmptyLine(); + } + + return (bool) $iResult; + } + + /** + * @param string $sDesc + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + * @param string $sName = '' + * @param bool $bSearchSecretWords = true + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + public function Write($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, + $sName = '', $bSearchSecretWords = true, $bDiplayCrLf = false) + { + if (isset($this->aForbiddenTypes[$iType]) && true === $this->aForbiddenTypes[$iType]) + { + return true; + } + + $this->bUsed = true; + + $oLogger = null; + $aLoggers = array(); + $iResult = 1; + + if ($bSearchSecretWords && !$this->bShowSecter && 0 < \count($this->aSecretWords)) + { + $sDesc = \str_replace($this->aSecretWords, '*******', $sDesc); + } + + $aLoggers =& $this->GetAsArray(); + foreach ($aLoggers as /* @var $oLogger \MailSo\Log\Driver */ $oLogger) + { + $iResult &= $oLogger->Write($sDesc, $iType, $sName, $bDiplayCrLf); + } + + return (bool) $iResult; + } + + /** + * @param mixed $oValue + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + * @param string $sName = '' + * @param bool $bSearchSecretWords = false + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + public function WriteDump($oValue, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '', + $bSearchSecretWords = false, $bDiplayCrLf = false) + { + return $this->Write(\print_r($oValue, true), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + + /** + * @param \Exception $oException + * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE + * @param string $sName = '' + * @param bool $bSearchSecretWords = true + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + public function WriteException($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '', + $bSearchSecretWords = true, $bDiplayCrLf = false) + { + if ($oException instanceof \Exception) + { + if (isset($oException->__LOGINNED__)) + { + return true; + } + + $oException->__LOGINNED__ = true; + + return $this->Write((string) $oException, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + + return false; + } + + /** + * @param \Exception $oException + * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE + * @param string $sName = '' + * @param bool $bSearchSecretWords = true + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + public function WriteExceptionShort($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '', + $bSearchSecretWords = true, $bDiplayCrLf = false) + { + if ($oException instanceof \Exception) + { + if (isset($oException->__LOGINNED__)) + { + return true; + } + + $oException->__LOGINNED__ = true; + + return $this->Write($oException->getMessage(), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + + return false; + } + + /** + * @param mixed $mData + * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE + * @param string $sName = '' + * @param bool $bSearchSecretWords = true + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + public function WriteMixed($mData, $iType = null, $sName = '', + $bSearchSecretWords = true, $bDiplayCrLf = false) + { + $iType = null === $iType ? \MailSo\Log\Enumerations\Type::INFO : $iType; + if (\is_array($mData) || \is_object($mData)) + { + if ($mData instanceof \Exception) + { + $iType = null === $iType ? \MailSo\Log\Enumerations\Type::NOTICE : $iType; + return $this->WriteException($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + else + { + return $this->WriteDump($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + } + else + { + return $this->Write($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + + return false; + } +} 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 08e9ba71b..6a40a0a28 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -430,9 +430,9 @@ class Actions if (false !== \strpos($sLine, '{date:')) { - $iTimeOffset = (int) $this->Config()->Get('logs', 'time_offset', 0); - $sLine = \preg_replace_callback('/\{date:([^}]+)\}/', function ($aMatch) use ($iTimeOffset, $bUrlEncode) { - return \RainLoop\Utils::UrlEncode(\MailSo\Log\Logger::DateHelper($aMatch[1], $iTimeOffset), $bUrlEncode); + $sTimeOffset = (string) $this->Config()->Get('logs', 'time_offset', '0'); + $sLine = \preg_replace_callback('/\{date:([^}]+)\}/', function ($aMatch) use ($sTimeOffset, $bUrlEncode) { + return \RainLoop\Utils::UrlEncode(\MailSo\Log\Logger::DateHelper($aMatch[1], $sTimeOffset), $bUrlEncode); }, $sLine); $aClear['/\{date:([^}]*)\}/'] = 'date'; @@ -1073,7 +1073,7 @@ class Actions } } - $iTimeOffset = (int) $this->Config()->Get('logs', 'time_offset', 0); + $sTimeOffset = (string) $this->Config()->Get('logs', 'time_offset', '0'); $this->oLogger->SetShowSecter(!$this->Config()->Get('logs', 'hide_passwords', true)); @@ -1101,7 +1101,7 @@ class Actions ->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)) - ->SetTimeOffset($iTimeOffset) + ->SetTimeOffset($sTimeOffset) ); if (!$this->Config()->Get('debug', 'enable', false)) @@ -1113,9 +1113,9 @@ class Actions $oHttp = $this->Http(); - $this->oLogger->Write('[DATE:'.\MailSo\Log\Logger::DateHelper('d.m.y', $iTimeOffset). - (0 !== $iTimeOffset ? '][OFFSET:'.(0 < $iTimeOffset ? '+' : '-'). - \str_pad((string) \abs($iTimeOffset), 2, '0', STR_PAD_LEFT) : ''). + $this->oLogger->Write('[DATE:'.\MailSo\Log\Logger::DateHelper('d.m.y', $sTimeOffset). + (0 !== $sTimeOffset ? '][OFFSET:'.(0 < $sTimeOffset ? '+' : '-'). + \str_pad((string) \abs($sTimeOffset), 2, '0', STR_PAD_LEFT) : ''). '][RL:'.APP_VERSION.'][PHP:'.PHP_VERSION.'][IP:'. $oHttp->GetClientIp($this->Config()->Get('labs', 'http_client_ip_check_proxy', false)).'][PID:'. (\MailSo\Base\Utils::FunctionExistsAndEnabled('getmypid') ? \getmypid() : 'unknown').']['. diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/AbstractConfig.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/AbstractConfig.php index ee493d734..5fe2ca2fc 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/AbstractConfig.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/AbstractConfig.php @@ -1,342 +1,343 @@ -sFile = \APP_PRIVATE_DATA.'configs/'.\trim($sFileName); - - $sAdditionalFileName = \trim($sAdditionalFileName); - $this->sAdditionalFile = \APP_PRIVATE_DATA.'configs/'.$sAdditionalFileName; - $this->sAdditionalFile = 0 < \strlen($sAdditionalFileName) && - \file_exists($this->sAdditionalFile) ? $this->sAdditionalFile : ''; - - $this->sFileHeader = $sFileHeader; - $this->aData = $this->defaultValues(); - - $this->bUseApcCache = APP_USE_APC_CACHE && - \MailSo\Base\Utils::FunctionExistsAndEnabled(array('apc_fetch', 'apc_store')); - } - - /** - * @return array - */ - protected abstract function defaultValues(); - - /** - * @return bool - */ - public function IsInited() - { - return \is_array($this->aData) && 0 < \count($this->aData); - } - - /** - * @param string $sSection - * @param string $sName - * @param mixed $mDefault = null - * - * @return mixed - */ - public function Get($sSection, $sName, $mDefault = null) - { - $mResult = $mDefault; - if (isset($this->aData[$sSection][$sName][0])) - { - $mResult = $this->aData[$sSection][$sName][0]; - } - return $mResult; - } - - /** - * @param string $sSectionKey - * @param string $sParamKey - * @param mixed $mParamValue - * - * @return void - */ - public function Set($sSectionKey, $sParamKey, $mParamValue) - { - if (isset($this->aData[$sSectionKey][$sParamKey][0])) - { - $sType = \gettype($this->aData[$sSectionKey][$sParamKey][0]); - switch ($sType) - { - default: - case 'string': - $this->aData[$sSectionKey][$sParamKey][0] = (string) $mParamValue; - break; - case 'int': - case 'integer': - $this->aData[$sSectionKey][$sParamKey][0] = (int) $mParamValue; - break; - case 'bool': - case 'boolean': - $this->aData[$sSectionKey][$sParamKey][0] = (bool) $mParamValue; - break; - } - } - else if ('custom' === $sSectionKey) - { - $this->aData[$sSectionKey][$sParamKey] = array((string) $mParamValue); - } - } - - /** - * @return string - */ - private function cacheKey() - { - return 'config:'.\sha1($this->sFile).':'.\sha1($this->sAdditionalFile).':'; - } - - /** - * @return bool - */ - private function loadDataFromCache() - { - if ($this->bUseApcCache) - { - $iMTime = @\filemtime($this->sFile); - $iMTime = \is_int($iMTime) && 0 < $iMTime ? $iMTime : 0; - - $iATime = $this->sAdditionalFile ? @\filemtime($this->sAdditionalFile) : 0; - $iATime = \is_int($iATime) && 0 < $iATime ? $iATime : 0; - - if (0 < $iMTime) - { - $sKey = $this->cacheKey(); - - $sTimeHash = \apc_fetch($sKey.'time'); - if ($sTimeHash && $sTimeHash === \md5($iMTime.'/'.$iATime)) - { - $aFetchData = \apc_fetch($sKey.'data'); - if (\is_array($aFetchData)) - { - $this->aData = $aFetchData; - return true; - } - } - } - } - - return false; - } - - /** - * @return bool - */ - private function storeDataToCache() - { - if ($this->bUseApcCache) - { - $iMTime = @\filemtime($this->sFile); - $iMTime = \is_int($iMTime) && 0 < $iMTime ? $iMTime : 0; - - $iATime = $this->sAdditionalFile ? @\filemtime($this->sAdditionalFile) : 0; - $iATime = \is_int($iATime) && 0 < $iATime ? $iATime : 0; - - if (0 < $iMTime) - { - $sKey = $this->cacheKey(); - - \apc_store($sKey.'time', \md5($iMTime.'/'.$iATime)); - \apc_store($sKey.'data', $this->aData); - - return true; - } - } - - return false; - } - - /** - * @return bool - */ - private function clearCache() - { - if ($this->bUseApcCache) - { - $sKey = $this->cacheKey(); - - \apc_delete($sKey.'time'); - \apc_delete($sKey.'data'); - - return true; - } - - return false; - } - - /** - * @return bool - */ - public function IsFileExists() - { - return \file_exists($this->sFile); - } - - /** - * @return bool - */ - public function Load() - { - if (\file_exists($this->sFile) && \is_readable($this->sFile)) - { - if ($this->loadDataFromCache()) - { - return true; - } - - $aData = \RainLoop\Utils::CustomParseIniFile($this->sFile, true); - if (\is_array($aData) && 0 < \count($aData)) - { - foreach ($aData as $sSectionKey => $aSectionValue) - { - if (\is_array($aSectionValue)) - { - foreach ($aSectionValue as $sParamKey => $mParamValue) - { - $this->Set($sSectionKey, $sParamKey, $mParamValue); - } - } - } - - unset($aData); - - if (\file_exists($this->sAdditionalFile) && \is_readable($this->sAdditionalFile)) - { - $aSubData = \RainLoop\Utils::CustomParseIniFile($this->sAdditionalFile, true); - if (\is_array($aSubData) && 0 < \count($aSubData)) - { - foreach ($aSubData as $sSectionKey => $aSectionValue) - { - if (\is_array($aSectionValue)) - { - foreach ($aSectionValue as $sParamKey => $mParamValue) - { - $this->Set($sSectionKey, $sParamKey, $mParamValue); - } - } - } - } - - unset($aSubData); - } - - $this->storeDataToCache(); - - return true; - } - } - - return false; - } - - /** - * @return bool - */ - public function Save() - { - if (\file_exists($this->sFile) && !\is_writable($this->sFile)) - { - return false; - } - - $sNewLine = "\n"; - - $aResultLines = array(); - - foreach ($this->aData as $sSectionKey => $aSectionValue) - { - if (\is_array($aSectionValue)) - { - $aResultLines[] = ''; - $aResultLines[] = '['.$sSectionKey.']'; - $bFirst = true; - - foreach ($aSectionValue as $sParamKey => $mParamValue) - { - if (\is_array($mParamValue)) - { - if (!empty($mParamValue[1])) - { - $sDesk = \str_replace("\r", '', $mParamValue[1]); - $aDesk = \explode("\n", $sDesk); - $aDesk = \array_map(function (&$sLine) { - return '; '.$sLine; - }, $aDesk); - - if (!$bFirst) - { - $aResultLines[] = ''; - } - - $aResultLines[] = \implode($sNewLine, $aDesk); - } - - $bFirst = false; - - $sValue = '""'; - switch (\gettype($mParamValue[0])) - { - default: - case 'string': - $sValue = '"'.\str_replace('"', '\"', $mParamValue[0]).'"'; - break; - case 'int': - case 'integer': - $sValue = $mParamValue[0]; - break; - case 'bool': - case 'boolean': - $sValue = $mParamValue[0] ? 'On' : 'Off'; - break; - } - - $aResultLines[] = $sParamKey.' = '.$sValue; - } - } - } - } - - $this->clearCache(); - return false !== \file_put_contents($this->sFile, - (0 < \strlen($this->sFileHeader) ? $this->sFileHeader : ''). - $sNewLine.\implode($sNewLine, $aResultLines)); - } -} +sFile = \APP_PRIVATE_DATA.'configs/'.\trim($sFileName); + + $sAdditionalFileName = \trim($sAdditionalFileName); + $this->sAdditionalFile = \APP_PRIVATE_DATA.'configs/'.$sAdditionalFileName; + $this->sAdditionalFile = 0 < \strlen($sAdditionalFileName) && + \file_exists($this->sAdditionalFile) ? $this->sAdditionalFile : ''; + + $this->sFileHeader = $sFileHeader; + $this->aData = $this->defaultValues(); + + $this->bUseApcCache = APP_USE_APC_CACHE && + \MailSo\Base\Utils::FunctionExistsAndEnabled(array('apc_fetch', 'apc_store')); + } + + /** + * @return array + */ + protected abstract function defaultValues(); + + /** + * @return bool + */ + public function IsInited() + { + return \is_array($this->aData) && 0 < \count($this->aData); + } + + /** + * @param string $sSection + * @param string $sName + * @param mixed $mDefault = null + * + * @return mixed + */ + public function Get($sSection, $sName, $mDefault = null) + { + $mResult = $mDefault; + if (isset($this->aData[$sSection][$sName][0])) + { + $mResult = $this->aData[$sSection][$sName][0]; + } + return $mResult; + } + + /** + * @param string $sSectionKey + * @param string $sParamKey + * @param mixed $mParamValue + * + * @return void + */ + public function Set($sSectionKey, $sParamKey, $mParamValue) + { + if (isset($this->aData[$sSectionKey][$sParamKey][0])) + { + $sType = \gettype($this->aData[$sSectionKey][$sParamKey][0]); + switch ($sType) + { + default: + case 'float': + case 'string': + $this->aData[$sSectionKey][$sParamKey][0] = (string) $mParamValue; + break; + case 'int': + case 'integer': + $this->aData[$sSectionKey][$sParamKey][0] = (int) $mParamValue; + break; + case 'bool': + case 'boolean': + $this->aData[$sSectionKey][$sParamKey][0] = (bool) $mParamValue; + break; + } + } + else if ('custom' === $sSectionKey) + { + $this->aData[$sSectionKey][$sParamKey] = array((string) $mParamValue); + } + } + + /** + * @return string + */ + private function cacheKey() + { + return 'config:'.\sha1($this->sFile).':'.\sha1($this->sAdditionalFile).':'; + } + + /** + * @return bool + */ + private function loadDataFromCache() + { + if ($this->bUseApcCache) + { + $iMTime = @\filemtime($this->sFile); + $iMTime = \is_int($iMTime) && 0 < $iMTime ? $iMTime : 0; + + $iATime = $this->sAdditionalFile ? @\filemtime($this->sAdditionalFile) : 0; + $iATime = \is_int($iATime) && 0 < $iATime ? $iATime : 0; + + if (0 < $iMTime) + { + $sKey = $this->cacheKey(); + + $sTimeHash = \apc_fetch($sKey.'time'); + if ($sTimeHash && $sTimeHash === \md5($iMTime.'/'.$iATime)) + { + $aFetchData = \apc_fetch($sKey.'data'); + if (\is_array($aFetchData)) + { + $this->aData = $aFetchData; + return true; + } + } + } + } + + return false; + } + + /** + * @return bool + */ + private function storeDataToCache() + { + if ($this->bUseApcCache) + { + $iMTime = @\filemtime($this->sFile); + $iMTime = \is_int($iMTime) && 0 < $iMTime ? $iMTime : 0; + + $iATime = $this->sAdditionalFile ? @\filemtime($this->sAdditionalFile) : 0; + $iATime = \is_int($iATime) && 0 < $iATime ? $iATime : 0; + + if (0 < $iMTime) + { + $sKey = $this->cacheKey(); + + \apc_store($sKey.'time', \md5($iMTime.'/'.$iATime)); + \apc_store($sKey.'data', $this->aData); + + return true; + } + } + + return false; + } + + /** + * @return bool + */ + private function clearCache() + { + if ($this->bUseApcCache) + { + $sKey = $this->cacheKey(); + + \apc_delete($sKey.'time'); + \apc_delete($sKey.'data'); + + return true; + } + + return false; + } + + /** + * @return bool + */ + public function IsFileExists() + { + return \file_exists($this->sFile); + } + + /** + * @return bool + */ + public function Load() + { + if (\file_exists($this->sFile) && \is_readable($this->sFile)) + { + if ($this->loadDataFromCache()) + { + return true; + } + + $aData = \RainLoop\Utils::CustomParseIniFile($this->sFile, true); + if (\is_array($aData) && 0 < \count($aData)) + { + foreach ($aData as $sSectionKey => $aSectionValue) + { + if (\is_array($aSectionValue)) + { + foreach ($aSectionValue as $sParamKey => $mParamValue) + { + $this->Set($sSectionKey, $sParamKey, $mParamValue); + } + } + } + + unset($aData); + + if (\file_exists($this->sAdditionalFile) && \is_readable($this->sAdditionalFile)) + { + $aSubData = \RainLoop\Utils::CustomParseIniFile($this->sAdditionalFile, true); + if (\is_array($aSubData) && 0 < \count($aSubData)) + { + foreach ($aSubData as $sSectionKey => $aSectionValue) + { + if (\is_array($aSectionValue)) + { + foreach ($aSectionValue as $sParamKey => $mParamValue) + { + $this->Set($sSectionKey, $sParamKey, $mParamValue); + } + } + } + } + + unset($aSubData); + } + + $this->storeDataToCache(); + + return true; + } + } + + return false; + } + + /** + * @return bool + */ + public function Save() + { + if (\file_exists($this->sFile) && !\is_writable($this->sFile)) + { + return false; + } + + $sNewLine = "\n"; + + $aResultLines = array(); + + foreach ($this->aData as $sSectionKey => $aSectionValue) + { + if (\is_array($aSectionValue)) + { + $aResultLines[] = ''; + $aResultLines[] = '['.$sSectionKey.']'; + $bFirst = true; + + foreach ($aSectionValue as $sParamKey => $mParamValue) + { + if (\is_array($mParamValue)) + { + if (!empty($mParamValue[1])) + { + $sDesk = \str_replace("\r", '', $mParamValue[1]); + $aDesk = \explode("\n", $sDesk); + $aDesk = \array_map(function (&$sLine) { + return '; '.$sLine; + }, $aDesk); + + if (!$bFirst) + { + $aResultLines[] = ''; + } + + $aResultLines[] = \implode($sNewLine, $aDesk); + } + + $bFirst = false; + + $sValue = '""'; + switch (\gettype($mParamValue[0])) + { + default: + case 'string': + $sValue = '"'.\str_replace('"', '\"', $mParamValue[0]).'"'; + break; + case 'int': + case 'integer': + $sValue = $mParamValue[0]; + break; + case 'bool': + case 'boolean': + $sValue = $mParamValue[0] ? 'On' : 'Off'; + break; + } + + $aResultLines[] = $sParamKey.' = '.$sValue; + } + } + } + } + + $this->clearCache(); + return false !== \file_put_contents($this->sFile, + (0 < \strlen($this->sFileHeader) ? $this->sFileHeader : ''). + $sNewLine.\implode($sNewLine, $aResultLines)); + } +} 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 d6d9073da..873e9a0d6 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 @@ -293,7 +293,7 @@ Values: 'hide_passwords' => array(true, 'Required for development purposes only. Disabling this option is not recommended.'), - 'time_offset' => array(0), + 'time_offset' => array('0'), 'session_filter' => array(''), 'filename' => array('log-{date:Y-m-d}.txt',