Move RainLoop core files to new folder

This commit is contained in:
RainLoop Team 2014-10-18 16:52:51 +04:00
parent 3a9bc849c9
commit 345e7c58af
69 changed files with 1695 additions and 1694 deletions

View file

@ -1,290 +0,0 @@
<?php
namespace RainLoop\Config;
abstract class AbstractConfig
{
/**
* @var string
*/
private $sFile;
/**
* @var array
*/
private $aData;
/**
* @var bool
*/
private $bUseApcCache;
/**
* @var string
*/
private $sFileHeader;
/**
* @param string $sFileName
* @param string $sFileHeader = ''
*
* @return void
*/
public function __construct($sFileName, $sFileHeader = '')
{
$this->sFile = \APP_PRIVATE_DATA.'configs/'.$sFileName;
$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).':';
}
/**
* @return bool
*/
private function loadDataFromCache()
{
if ($this->bUseApcCache)
{
$iMTime = @\filemtime($this->sFile);
if (\is_int($iMTime) && 0 < $iMTime)
{
$sKey = $this->cacheKey();
$iTime = \apc_fetch($sKey.'time');
if ($iTime && $iMTime === (int) $iTime)
{
$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);
if (\is_int($iMTime) && 0 < $iMTime)
{
$sKey = $this->cacheKey();
\apc_store($sKey.'time', $iMTime);
\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 Load()
{
if (\file_exists($this->sFile) && \is_readable($this->sFile))
{
if ($this->loadDataFromCache())
{
return true;
}
$aData = @\parse_ini_file($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);
}
}
}
$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 = '"'.$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));
}
}

View file

@ -1,275 +0,0 @@
<?php
namespace RainLoop\Config;
class Application extends \RainLoop\Config\AbstractConfig
{
/**
* @return void
*/
public function __construct()
{
parent::__construct('application.ini',
'; RainLoop Webmail configuration file
; Please don\'t add custom parameters here, those will be overwritten');
}
/**
* @param string $sPassword
*
* @return void
*/
public function SetPassword($sPassword)
{
return $this->Set('security', 'admin_password', \md5(APP_SALT.$sPassword.APP_SALT));
}
/**
* @param string $sPassword
*
* @return bool
*/
public function ValidatePassword($sPassword)
{
$sPassword = (string) $sPassword;
$sConfigPassword = (string) $this->Get('security', 'admin_password', '');
return 0 < \strlen($sPassword) &&
($sPassword === $sConfigPassword || \md5(APP_SALT.$sPassword.APP_SALT) === $sConfigPassword);
}
/**
* @return bool
*/
public function Save()
{
$this->Set('version', 'current', APP_VERSION);
$this->Set('version', 'saved', \gmdate('r'));
return parent::Save();
}
/**
* @return array
*/
protected function defaultValues()
{
return array(
'webmail' => array(
'title' => array('RainLoop Webmail', 'Text displayed as page title'),
'loading_description' => array('RainLoop', 'Text displayed on startup'),
'theme' => array('Default', 'Theme used by default'),
'allow_themes' => array(true, 'Allow theme selection on settings screen'),
'language' => array('en', 'Language used by default'),
'allow_languages_on_settings' => array(true, 'Allow language selection on settings screen'),
'allow_additional_accounts' => array(true, ''),
'allow_identities' => array(true, ''),
'messages_per_page' => array(20, ' Number of messages displayed on page by default'),
'editor_default_type' => array('Html', 'Editor mode used by default (Html or Plain)'),
'attachment_size_limit' => array(25,
'File size limit (MB) for file upload on compose screen
0 for unlimited.')
),
'branding' => array(
'login_logo' => array(''),
'login_desc' => array(''),
'login_css' => array('')
),
'contacts' => array(
'enable' => array(false, 'Enable contacts'),
'allow_sharing' => array(true),
'allow_sync' => array(false),
'sync_interval' => array(20),
'type' => array('sqlite', ''),
'pdo_dsn' => array('mysql:host=127.0.0.1;port=3306;dbname=rainloop', ''),
'pdo_user' => array('root', ''),
'pdo_password' => array('', ''),
'suggestions_limit' => array(30)
),
'security' => array(
'csrf_protection' => array(true,
'Enable CSRF protection (http://en.wikipedia.org/wiki/Cross-site_request_forgery)'),
'custom_server_signature' => array('RainLoop'),
'x_frame_options_header' => array(''),
'openpgp' => array(false),
'use_rsa_encryption' => array(false),
'admin_login' => array('admin', 'Login and password for web admin panel'),
'admin_password' => array('12345'),
'allow_admin_panel' => array(true, 'Access settings'),
'allow_two_factor_auth' => array(false),
'allow_universal_login' => array(true),
'admin_panel_host' => array(''),
'core_install_access_domain' => array('')
),
'ssl' => array(
'verify_certificate' => array(false, 'Require verification of SSL certificate used.'),
'cafile' => array('', 'Location of Certificate Authority file on local filesystem (/etc/ssl/certs/ca-certificates.crt)'),
),
'login' => array(
'default_domain' => array('', ''),
'allow_languages_on_login' => array(true,
'Allow language selection on webmail login screen'),
'determine_user_language' => array(true, ''),
'determine_user_domain' => array(false, ''),
'sign_me_auto' => array(\RainLoop\Enumerations\SignMeType::DEFAILT_OFF,
'This option allows webmail to remember the logged in user
once they closed the browser window.
Values:
"DefaultOff" - can be used, disabled by default;
"DefaultOn" - can be used, enabled by default;
"Unused" - cannot be used')
),
'plugins' => array(
'enable' => array(false, 'Enable plugin support'),
'enabled_list' => array('', 'List of enabled plugins'),
),
'logs' => array(
'enable' => array(false, 'Enable logging'),
'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.
Disabling this option is not recommended.'),
'filename' => array('log-{date:Y-m-d}.txt',
'Log filename.
For security reasons, some characters are removed from filename.
Allows for pattern-based folder creation (see examples below).
Patterns:
{date:Y-m-d} - Replaced by pattern-based date
Detailed info: http://www.php.net/manual/en/function.date.php
{user:email} - Replaced by user\'s email address
If user is not logged in, value is set to "unknown"
{user:login} - Replaced by user\'s login (the user part of an email)
If user is not logged in, value is set to "unknown"
{user:domain} - Replaced by user\'s domain name (the domain part of an email)
If user is not logged in, value is set to "unknown"
{user:uid} - Replaced by user\'s UID regardless of account currently used
{user:ip} - Replaced by user\'s IP address
Examples:
filename = "log-{date:Y-m-d}.txt"
filename = "{date:Y-m-d}/{user:domain}/{user:email}_{user:uid}.log"
filename = "{user:email}-{date:Y-m-d}.txt"')
),
'debug' => array(
'enable' => array(false, 'Special option required for development purposes')
),
'version' => array(
'current' => array(''),
'saved' => array('')
),
'social' => array(
'google_enable' => array(false, 'Google'),
'google_client_id' => array(''),
'google_client_secret' => array(''),
'google_api_key' => array(''),
'fb_enable' => array(false, 'Facebook'),
'fb_app_id' => array(''),
'fb_app_secret' => array(''),
'twitter_enable' => array(false, 'Twitter'),
'twitter_consumer_key' => array(''),
'twitter_consumer_secret' => array(''),
'dropbox_enable' => array(false, 'Dropbox'),
'dropbox_api_key' => array('')
),
'cache' => array(
'enable' => array(true,
'The section controls caching of the entire application.
Enables caching in the system'),
'index' => array('v1', 'Additional caching key. If changed, cache is purged'),
'fast_cache_driver' => array('files', 'Can be: files, APC, memcache'),
'fast_cache_index' => array('v1', 'Additional caching key. If changed, fast cache is purged'),
'http' => array(true, 'Browser-level cache. If enabled, caching is maintainted without using files'),
'server_uids' => array(true, 'Caching message UIDs when searching and sorting (threading)')
),
'labs' => array(
'ignore_folders_subscription' => array(false,
'Experimental settings. Handle with care.
'),
'check_new_password_strength' => array(true),
'allow_gravatar' => array(true),
'allow_prefetch' => array(true),
'allow_smart_html_links' => array(true),
'cache_system_data' => array(true),
'date_from_headers' => array(false),
'autocreate_system_folders' => array(true),
'allow_message_append' => array(false),
'disable_iconv_if_mbstring_supported' => array(false),
'login_fault_delay' => array(1),
'log_ajax_response_write_limit' => array(300),
'allow_html_editor_source_button' => array(false),
'hide_dangerous_actions' => array(false),
'use_app_debug_js' => array(false),
'use_app_debug_css' => array(false),
'use_imap_sort' => array(true),
'use_imap_esearch_esort' => array(true),
'use_imap_force_selection' => array(false),
'use_imap_list_subscribe' => array(true),
'use_imap_thread' => array(true),
'use_imap_move' => array(true),
'use_imap_auth_plain' => array(false),
'use_imap_expunge_all_on_delete' => array(false),
'imap_forwarded_flag' => array('$Forwarded'),
'imap_read_receipt_flag' => array('$ReadReceipt'),
'imap_body_text_limit' => array(555000),
'imap_message_list_fast_simple_search' => array(true),
'imap_message_list_count_limit_trigger' => array(0),
'imap_message_list_date_filter' => array(0),
'imap_large_thread_limit' => array(100),
'smtp_show_server_errors' => array(false),
'curl_proxy' => array(''),
'curl_proxy_auth' => array(''),
'in_iframe' => array(false),
'force_https' => array(false),
'custom_login_link' => array(''),
'custom_logout_link' => array(''),
'allow_external_login' => array(false),
'allow_external_sso' => array(false),
'external_sso_key' => array(''),
'fast_cache_memcache_host' => array('127.0.0.1'),
'fast_cache_memcache_port' => array(11211),
'fast_cache_memcache_expire' => array(43200),
'use_local_proxy_for_external_images' => array(false),
'dev_email' => array(''),
'dev_password' => array('')
)
);
}
}

View file

@ -1,59 +0,0 @@
<?php
namespace RainLoop\Config;
class Plugin extends \RainLoop\Config\AbstractConfig
{
/**
* @var array
*/
private $aMap;
/**
* @return void
*/
public function __construct($sPluginName, $aMap = array())
{
$this->aMap = is_array($aMap) ? $this->convertConfigMap($aMap) : array();
parent::__construct('plugin-'.$sPluginName.'.ini', '; RainLoop Webmail plugin ('.$sPluginName.')');
}
/**
* @param array $aMap
* @return array
*/
private function convertConfigMap($aMap)
{
if (0 < count($aMap))
{
$aResultMap = array();
foreach ($aMap as /* @var $oProperty \RainLoop\Plugins\Property */ $oProperty)
{
if ($oProperty)
{
$mValue = $oProperty->DefaultValue();
$sValue = is_array($mValue) && isset($mValue[0]) ? $mValue[0] : $mValue;
$aResultMap[$oProperty->Name()] = array($sValue, '');
}
}
if (0 < count($aResultMap))
{
return array(
'plugin' => $aResultMap
);
}
}
return array();
}
/**
* @return array
*/
protected function defaultValues()
{
return $this->aMap;
}
}