%PDF- %PDF-
| Direktori : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/ |
| Current File : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/settings.php |
<?php
/*
* Copyright 2004-2014, AfterLogic Corp.
* Licensed under AGPLv3 license or AfterLogic license
* if commercial version of the product was purchased.
* See the LICENSE file for a full license statement.
*/
/**
* @package Api
*/
class api_Settings
{
const XML_FILE_NAME = '/settings/settings.xml';
#<editor-fold defaultstate="collapsed" desc="protected">
/**
* @var array
*/
protected $aMap;
/**
* @var array
*/
protected $aLowerMap;
/**
* @var array
*/
protected $aContainer;
/**
* @var string
*/
protected $sPath;
#</editor-fold>
/**
* @param string $sSettingsPath
*
* @return api_Settings
*/
public function __construct($sSettingsPath)
{
$this->aMap = array();
$this->aLowerMap = array();
$this->aContainer = array();
$this->sPath = $sSettingsPath;
$this->initDefaultValues();
if (!$this->LoadFromXml($this->sPath.api_Settings::XML_FILE_NAME))
{
throw new CApiBaseException(Errs::Main_SettingLoadError);
}
if (!api_Utils::HasSslSupport())
{
$this->SetConf('WebMail/IncomingMailUseSSL', false);
$this->SetConf('WebMail/OutgoingMailUseSSL', false);
}
if (file_exists(CApi::RootPath().'common/lite.php'))
{
include_once CApi::RootPath().'common/lite.php';
}
$this->SetConf('WebMail/IncomingMailProtocol', EMailProtocol::IMAP4);
}
/**
* @param string $sKey
*
* @return mixed
*/
public function GetConf($sKey)
{
$mResult = null;
$sKey = strtolower($sKey);
if (array_key_exists($sKey, $this->aContainer))
{
$mResult = is_string($this->aContainer[$sKey])
? trim(api_Utils::DecodeSpecialXmlChars($this->aContainer[$sKey]))
: $this->aContainer[$sKey];
}
return $mResult;
}
/**
* @param string $sKey
* @param mixed $mDefault = null
*
* @return bool
*/
public function SetConf($sKey, $mValue)
{
$bResult = false;
$sKey = strtolower($sKey);
if (isset($this->aLowerMap[$sKey]))
{
$aType = $this->aLowerMap[$sKey];
switch ($aType[1])
{
default:
$mValue = null;
break;
case 'string':
$mValue = (string) $mValue;
break;
case 'int':
$mValue = (int) $mValue;
break;
case 'bool':
$mValue = (bool) $mValue;
break;
case 'spec':
$mValue = $this->specValidate($sKey, $mValue);
break;
}
if (null !== $mValue)
{
$bResult = true;
$this->aContainer[$sKey] = $mValue;
}
}
return $bResult;
}
/**
* @param string $sXmlFile
*
* @return bool
*/
public function LoadFromXml($sXmlFile)
{
$oXmlDocument = new CXmlDocument();
if ($oXmlDocument->LoadFromFile($sXmlFile))
{
$this->parseXml($oXmlDocument->XmlRoot);
return true;
}
return false;
}
/**
* @return bool
*/
public function SaveToXml()
{
$oXmlDocument = new CXmlDocument();
$oXmlDocument->CreateElement('Settings');
$oXmlDocument->XmlRoot->AppendAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema');
$oXmlDocument->XmlRoot->AppendAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
$aCache = array();
$aAddCache = array();
$aMapKeys = array_keys($this->aMap);
foreach ($aMapKeys as $sKey)
{
$sLine = $sLineParent = '';
$aExplodeName = explode('/', $sKey);
foreach ($aExplodeName as $sName)
{
$sLineParent = $sLine;
$sLine .= $sName;
if (!isset($aCache[$sLine]))
{
$aCache[$sLine] = new CXmlDomNode($sName);
}
if (!empty($sLineParent) && !isset($aAddCache[$sLine]) && isset($aCache[$sLineParent]))
{
$aAddCache[$sLine] = true;
if (isset($this->aLowerMap[strtolower($sKey)]))
{
$aCache[$sLine]->Value = $this->parseGetConf($sKey);
$aCache[$sLine]->Comment = $this->parseGetComment($sKey);
}
$aCache[$sLineParent]->Value = '';
$aCache[$sLineParent]->AppendChild($aCache[$sLine]);
}
else if (empty($sLineParent) && !isset($aAddCache[$sLine]))
{
$aAddCache[$sLine] = true;
$oXmlDocument->XmlRoot->AppendChild($aCache[$sLine]);
}
}
}
return (bool) $oXmlDocument->SaveToFile($this->sPath.api_Settings::XML_FILE_NAME);;
}
/**
* @param CXmlDomNode $oXmlTree
* @param string $sParentNode = ''
*
* @return void
*/
protected function parseXml(CXmlDomNode &$oXmlTree, $sParentNode = '')
{
$sParentNode = empty($sParentNode) ? '' : $sParentNode.'/';
foreach ($oXmlTree->Children as $oNode)
{
$sTag = strtolower($oNode->TagName);
if (0 < count($oNode->Children))
{
$this->parseXml($oNode, $sParentNode.$sTag);
}
else
{
$this->parseSetConf($sParentNode.$sTag, $oNode->Value);
}
}
}
/**
* @staticvar array $aValues
* @param string $sXmlPath
*
* @return string | null
*/
protected function xmlPathToEnumName($sXmlPath)
{
static $aValues = array(
'common/dbtype' => 'EDbType',
'common/defaulttimeformat' => 'ETimeFormat',
'common/defaultdateformat' => 'EDateFormat',
'common/logginglevel' => 'ELogLevel',
'webmail/incomingmailprotocol' => 'EMailProtocol',
'webmail/outgoingmailauth' => 'ESMTPAuthType',
'webmail/outgoingsendingmethod' => 'ESendingMethod',
'webmail/layout' => 'ELayout',
'webmail/savemail' => 'ESaveMail',
'webmail/loginformtype' => 'ELoginFormType',
'webmail/loginsignmetype' => 'ELoginSignMeType',
'contacts/globaladdressbookvisibility' => 'EContactsGABVisibility',
'calendar/weekstartson' => 'ECalendarWeekStartOn',
'calendar/defaulttab' => 'ECalendarDefaultTab',
'helpdesk/fetchertype' => 'EHelpdeskFetcherType',
);
$sXmlPath = strtolower($sXmlPath);
return isset($aValues[$sXmlPath]) ? $aValues[$sXmlPath] : null;
}
/**
* @param string $sKey
* @param string $sValue
*
* @return string
*/
protected function specValidate($sKey, $sValue)
{
$mResult = null;
$sEnumName = $this->xmlPathToEnumName($sKey);
if (null !== $sEnumName)
{
$mResult = EnumConvert::Validate($sValue, $sEnumName);
}
return $mResult;
}
/**
* @param string $sKey
* @param string $sValue
*
* @return string
*/
protected function specConver($sKey, $sValue)
{
$mResult = $sValue;
$sEnumName = $this->xmlPathToEnumName($sKey);
if (null !== $sEnumName)
{
$mResult = EnumConvert::FromXml($sValue, $sEnumName);
}
return $this->specValidate($sKey, $mResult);
}
/**
* @param string $sKey
* @param string $sValue
*
* @return string
*/
protected function specBackConver($sKey, $sValue)
{
$mResult = $sValue;
$sEnumName = $this->xmlPathToEnumName($sKey);
if (null !== $sEnumName)
{
$mResult = EnumConvert::ToXml($sValue, $sEnumName);
}
return $mResult;
}
/**
* @param string $sKey
* @param mixed $mValue
*
* @return void
*/
protected function parseSetConf($sKey, $mValue)
{
$sKey = strtolower($sKey);
if (isset($this->aLowerMap[$sKey]))
{
$aTypeArray = $this->aLowerMap[$sKey];
switch ($aTypeArray[1])
{
default:
$mValue = null;
break;
case 'string':
$mValue = trim(api_Utils::DecodeSpecialXmlChars((string) $mValue));
break;
case 'int':
$mValue = (int) $mValue;
break;
case 'bool':
$mValue = ('on' === strtolower($mValue) || '1' === (string) $mValue);
break;
case 'spec':
$mValue = $this->specConver($sKey, $mValue);
break;
}
if (null !== $mValue)
{
$this->aContainer[$sKey] = $mValue;
}
}
}
/**
* @param string $sKey
*
* @return mixed
*/
protected function parseGetConf($sKey)
{
$mValue = null;
$sKey = strtolower($sKey);
if (isset($this->aLowerMap[$sKey]))
{
if (array_key_exists($sKey, $this->aContainer))
{
$mValue = $this->aContainer[$sKey];
}
else
{
$mValue = $this->aLowerMap[$sKey][0];
}
$aType = $this->aLowerMap[$sKey];
switch ($aType[1])
{
case 'string':
$mValue = api_Utils::EncodeSpecialXmlChars((string) $mValue);
break;
case 'int':
$mValue = (int) $mValue;
break;
case 'bool':
$mValue = ((bool) $mValue) ? 'On' : 'Off';
break;
case 'spec':
$mValue = $this->specBackConver($sKey, $mValue);
break;
}
}
return $mValue;
}
/**
* @param string $sKey
*
* @return mixed
*/
protected function parseGetComment($sKey)
{
$mValue = null;
$sKey = strtolower($sKey);
if (isset($this->aLowerMap[$sKey]) && is_array($this->aLowerMap[$sKey])
&& !empty($this->aLowerMap[$sKey][2]))
{
$mValue = trim($this->aLowerMap[$sKey][2]);
}
return $mValue;
}
/**
* @return void
*/
protected function initDefaultValues()
{
$this->aMap = array(
// Common
'Common/SiteName' => array('AfterLogic', 'string',
'Default title that will be shown in browser\'s header (Default domain settings).'),
'Common/LicenseKey' => array('', 'string',
'License key is supplied here.'),
'Common/AdminLogin' => array('mailadm', 'string'),
'Common/AdminPassword' => array('827ccb0eea8a706c4c34a16891f84e7b', 'string'),
'Common/DBType' => array(EDbType::MySQL, 'spec'),
'Common/DBPrefix' => array('', 'string'),
'Common/DBHost' => array('127.0.0.1', 'string'),
'Common/DBName' => array('', 'string'),
'Common/DBLogin' => array('root', 'string'),
'Common/DBPassword' => array('', 'string'),
'Common/UseSlaveConnection' => array(false, 'bool'),
'Common/DBSlaveHost' => array('127.0.0.1', 'string'),
'Common/DBSlaveName' => array('', 'string'),
'Common/DBSlaveLogin' => array('root', 'string'),
'Common/DBSlavePassword' => array('', 'string'),
'Common/DefaultLanguage' => array('English', 'string'),
'Common/DefaultTimeZone' => array(0, 'int'), //TODO Magic
'Common/DefaultTimeFormat' => array(ETimeFormat::F12, 'spec'),
'Common/DefaultDateFormat' => array(EDateFormat::MMDDYYYY, 'spec'),
'Common/AllowRegistration' => array(false, 'bool'),
'Common/RegistrationDomains' => array('', 'string'),
'Common/RegistrationQuestions' => array('', 'string'),
'Common/AllowPasswordReset' => array(false, 'bool'),
'Common/EnableLogging' => array(false, 'bool'),
'Common/EnableEventLogging' => array(false, 'bool'),
'Common/LoggingLevel' => array(ELogLevel::Full, 'spec'),
'Common/EnableMobileSync' => array(false, 'bool'),
'Common/TenantGlobalCapa' => array('', 'string'),
'Common/LoginStyleImage' => array('', 'string'),
'Common/AppStyleImage' => array('', 'string'),
'Common/DefaultTab' => array('', 'string'),
'Common/RedirectToHttps' => array(false, 'bool'),
'Common/PasswordMinLength' => array(0, 'int'),
'Common/PasswordMustBeComplex' => array(false, 'bool'),
// WebMail
'WebMail/AllowWebMail' => array(true, 'bool'),
'WebMail/IncomingMailProtocol' => array(EMailProtocol::IMAP4, 'spec'),
'WebMail/IncomingMailServer' => array('127.0.0.1', 'string'),
'WebMail/IncomingMailPort' => array(API_INC_PROTOCOL_IMAP4_DEF_PORT, 'int'),
'WebMail/IncomingMailUseSSL' => array(false, 'bool'),
'WebMail/OutgoingMailServer' => array('127.0.0.1', 'string'),
'WebMail/OutgoingMailPort' => array(API_INC_PROTOCOL_SMTP_DEF_PORT, 'int'),
'WebMail/OutgoingMailAuth' => array(ESMTPAuthType::AuthCurrentUser, 'spec'),
'WebMail/OutgoingMailLogin' => array('', 'string'),
'WebMail/OutgoingMailPassword' => array('', 'string'),
'WebMail/OutgoingMailUseSSL' => array(false, 'bool'),
'WebMail/OutgoingSendingMethod' => array(ESendingMethod::Specified, 'spec'),
'WebMail/UserQuota' => array(0, 'int'),
'WebMail/ShowQuotaBar' => array(false, 'bool'),
'WebMail/AutoCheckMailInterval' => array(0, 'int'),
'WebMail/DefaultSkin' => array(API_DEFAULT_SKIN, 'string'),
'WebMail/MailsPerPage' => array(20, 'int'),
'WebMail/AllowUsersChangeInterfaceSettings' => array(true, 'bool'),
'WebMail/AllowUsersChangeEmailSettings' => array(true, 'bool'),
'WebMail/EnableAttachmentSizeLimit' => array(false, 'bool'),
'WebMail/AttachmentSizeLimit' => array(0, 'int'),
'WebMail/ImageUploadSizeLimit' => array(0, 'int'),
'WebMail/AllowLanguageOnLogin' => array(true, 'bool'),
'WebMail/FlagsLangSelect' => array(false, 'bool'),
'WebMail/LoginFormType' => array(ELoginFormType::Email, 'spec'),
'WebMail/LoginSignMeType' => array(ELoginSignMeType::DefaultOn, 'spec'),
'WebMail/LoginAtDomainValue' => array('', 'string'),
'WebMail/UseLoginWithoutDomain' => array(false, 'bool'),
'WebMail/AllowNewUsersRegister' => array(false, 'bool'),
'WebMail/AllowUsersAddNewAccounts' => array(true, 'bool'),
'WebMail/AllowOpenPGP' => array(false, 'bool'),
'WebMail/AllowIdentities' => array(true, 'bool'),
'WebMail/AllowInsertImage' => array(true, 'bool'),
'WebMail/AllowBodySize' => array(false, 'bool'),
'WebMail/MaxBodySize' => array(600, 'int'), //TODO Magic
'WebMail/MaxSubjectSize' => array(255, 'int'), //TODO Magic
'WebMail/Layout' => array(ELayout::Side, 'spec'),
'WebMail/AlwaysShowImagesInMessage' => array(false, 'bool'),
'WebMail/SaveMail' => array(ESaveMail::Always, 'spec'),
'WebMail/IdleSessionTimeout' => array(0, 'int'),
'WebMail/UseSortImapForDateMode' => array(true, 'bool'),
'WebMail/UseThreadsIfSupported' => array(true, 'bool'),
'WebMail/DetectSpecialFoldersWithXList' => array(true, 'bool'),
'WebMail/EnableLastLoginNotification' => array(false, 'bool'),
'WebMail/ExternalHostNameOfLocalImap' => array('', 'string'),
'WebMail/ExternalHostNameOfLocalSmtp' => array('', 'string'),
'WebMail/ExternalHostNameOfDAVServer' => array('', 'string'),
// Calendar
'Calendar/AllowCalendar' => array(true, 'bool'),
'Calendar/ShowWeekEnds' => array(false, 'bool'),
'Calendar/WorkdayStarts' => array(ECalendarDefaultWorkDay::Starts, 'int'),
'Calendar/WorkdayEnds' => array(ECalendarDefaultWorkDay::Ends, 'int'),
'Calendar/ShowWorkDay' => array(true, 'bool'),
'Calendar/WeekStartsOn' => array(ECalendarWeekStartOn::Sunday, 'spec'),
'Calendar/DefaultTab' => array(ECalendarDefaultTab::Month, 'spec'),
'Calendar/AllowReminders' => array(true, 'bool'),
// Contacts
'Contacts/AllowContacts' => array(true, 'bool'),
'Contacts/ContactsPerPage' => array(20, 'int'),
'Contacts/ShowGlobalContactsInAddressBook' => array(false, 'bool'),
'Contacts/GlobalAddressBookVisibility' => array(EContactsGABVisibility::DomainWide, 'spec'),
// Files
'Files/AllowFiles' => array(true, 'bool'),
'Files/EnableSizeLimit' => array(false, 'bool'),
'Files/SizeLimit' => array(0, 'int'),
// Sip
'Sip/AllowSip' => array(false, 'bool'),
'Sip/Realm' => array('', 'string'),
'Sip/WebsocketProxyUrl' => array('', 'string'),
'Sip/OutboundProxyUrl' => array('', 'string'),
'Sip/CallerID' => array('', 'string'),
// Twilio
'Twilio/AllowTwilio' => array(false, 'bool'),
'Twilio/PhoneNumber' => array('', 'string'),
'Twilio/AccountSID' => array('', 'string'),
'Twilio/AuthToken' => array('', 'string'),
'Twilio/AppSID' => array('', 'string'),
// Social
'Social/FacebookAllow' => array(false, 'bool'),
'Social/FacebookId' => array('', 'string'),
'Social/FacebookSecret' => array('', 'string'),
'Social/GoogleAllow' => array(false, 'bool'),
'Social/GoogleId' => array('', 'string'),
'Social/GoogleSecret' => array('', 'string'),
'Social/GoogleApiKey' => array('', 'string'),
'Social/TwitterAllow' => array(false, 'bool'),
'Social/TwitterId' => array('', 'string'),
'Social/TwitterSecret' => array('', 'string'),
'Social/DropboxAllow' => array(false, 'bool'),
'Social/DropboxSecret' => array('', 'string'),
'Social/DropboxKey' => array('', 'string'),
// Helpdesk
'Helpdesk/AllowHelpdesk' => array(true, 'bool'),
'Helpdesk/AdminEmailAccount' => array('', 'string'),
'Helpdesk/ClientIframeUrl' => array('', 'string'),
'Helpdesk/AgentIframeUrl' => array('', 'string'),
'Helpdesk/SiteName' => array('', 'string'),
'Helpdesk/StyleAllow' => array(false, 'bool'),
'Helpdesk/StyleImage' => array('', 'string'),
'Helpdesk/StyleText' => array('', 'string'),
'Helpdesk/FetcherType' => array(EHelpdeskFetcherType::NONE, 'spec'),
'Helpdesk/FacebookAllow' => array(false, 'bool'),
'Helpdesk/FacebookId' => array('', 'string'),
'Helpdesk/FacebookSecret' => array('', 'string'),
'Helpdesk/GoogleAllow' => array(false, 'bool'),
'Helpdesk/GoogleId' => array('', 'string'),
'Helpdesk/GoogleSecret' => array('', 'string'),
'Helpdesk/TwitterAllow' => array(false, 'bool'),
'Helpdesk/TwitterId' => array('', 'string'),
'Helpdesk/TwitterSecret' => array('', 'string'),
);
foreach ($this->aMap as $sKey => $aField)
{
$this->aLowerMap[strtolower($sKey)] = $aField;
$this->SetConf($sKey, $aField[0]);
}
}
}
/**
* @package Api
*/
class api_SettingsException extends Exception {}