Enable static calling of Context::init() and convert unnecessary instance properties into static properties

This commit is contained in:
Kijin Sung 2018-03-03 01:44:05 +09:00
parent 76aafac4a7
commit 9d06f6a9e2
3 changed files with 97 additions and 76 deletions

View file

@ -45,19 +45,7 @@ class Context
public $ftp_info = NULL; public $ftp_info = NULL;
/** /**
* ssl action cache file * object oFrontEndFileHandler()
* @var array
*/
public $sslActionCacheFile = './files/cache/sslCacheFile.php';
/**
* List of actions to be sent via ssl (it is used by javascript xml handler for ajax)
* @var array
*/
public $ssl_actions = array();
/**
* obejct oFrontEndFileHandler()
* @var object * @var object
*/ */
public $oFrontEndFileHandler; public $oFrontEndFileHandler;
@ -134,22 +122,34 @@ class Context
*/ */
public $is_site_locked = FALSE; public $is_site_locked = FALSE;
/**
* Pattern for request vars check
* @var array
*/
public $patterns = array(
'/<\?/iUsm',
'/<\%/iUsm',
'/<script\s*?language\s*?=\s*?("|\')?\s*?php\s*("|\')?/iUsm'
);
/** /**
* Check init * Check init
* @var bool FALSE if init fail * @var bool FALSE if init fail
*/ */
public $isSuccessInit = TRUE; public $isSuccessInit = TRUE;
/**
* Singleton instance
* @var object
*/
private static $_instance = null;
/**
* Flag to prevent calling init() twice
*/
private static $_init_called = false;
/**
* SSL action cache file
* @var array
*/
private static $_ssl_actions_cache_file = './files/cache/sslCacheFile.php';
/**
* SSL action cache
*/
private static $_ssl_actions = array();
/** /**
* Plugin blacklist cache * Plugin blacklist cache
*/ */
@ -169,10 +169,14 @@ class Context
); );
/** /**
* Singleton instance * Pattern for request vars check
* @var object * @var array
*/ */
private static $_instance = null; private static $_check_patterns = array(
'/<\?/iUsm',
'/<\%/iUsm',
'/<script\s*?language\s*?=\s*?("|\')?\s*?php\s*("|\')?/iUsm'
);
/** /**
* variables from current request * variables from current request
@ -201,7 +205,7 @@ class Context
} }
/** /**
* Cunstructor * Constructor
* *
* @return void * @return void
*/ */
@ -212,13 +216,13 @@ class Context
self::$_tpl_vars = self::$_tpl_vars ?: new stdClass; self::$_tpl_vars = self::$_tpl_vars ?: new stdClass;
// include ssl action cache file // include ssl action cache file
$this->sslActionCacheFile = FileHandler::getRealPath($this->sslActionCacheFile); self::$_ssl_actions_cache_file = FileHandler::getRealPath(self::$_ssl_actions_cache_file);
if(is_readable($this->sslActionCacheFile)) if(is_readable(self::$_ssl_actions_cache_file))
{ {
require($this->sslActionCacheFile); include self::$_ssl_actions_cache_file;
if(isset($sslActions)) if(isset($sslActions))
{ {
$this->ssl_actions = $sslActions; self::$_ssl_actions = $sslActions;
} }
} }
} }
@ -226,11 +230,23 @@ class Context
/** /**
* Initialization, it sets DB information, request arguments and so on. * Initialization, it sets DB information, request arguments and so on.
* *
* @see This function should be called only once
* @return void * @return void
*/ */
public function init() public static function init()
{ {
// Prevent calling init() twice.
if(self::$_init_called)
{
return;
}
self::$_init_called = true;
// Obtain a singleton instance if not already given.
if(self::$_instance === null)
{
self::$_instance = self::getInstance();
}
// Fix missing HTTP_RAW_POST_DATA in PHP 5.6 and above. // Fix missing HTTP_RAW_POST_DATA in PHP 5.6 and above.
if(!isset($GLOBALS['HTTP_RAW_POST_DATA']) && !count($_FILES) && version_compare(PHP_VERSION, '5.6.0', '>=') === TRUE) if(!isset($GLOBALS['HTTP_RAW_POST_DATA']) && !count($_FILES) && version_compare(PHP_VERSION, '5.6.0', '>=') === TRUE)
{ {
@ -243,16 +259,13 @@ class Context
} }
} }
// Set global variables for backward compatibility.
$GLOBALS['__Context__'] = &self::$_tpl_vars;
// Set information about the current request. // Set information about the current request.
$this->setRequestMethod(); self::$_instance->setRequestMethod();
$this->_checkGlobalVars(); self::$_instance->_checkGlobalVars();
$this->_setXmlRpcArgument(); self::$_instance->_setXmlRpcArgument();
$this->_setJSONRequestArgument(); self::$_instance->_setJSONRequestArgument();
$this->_setRequestArgument(); self::$_instance->_setRequestArgument();
$this->_setUploadedArgument(); self::$_instance->_setUploadedArgument();
// Fabricate methods for compatibility of XE third-party. // Fabricate methods for compatibility of XE third-party.
if(isset($_POST['_rx_ajax_compat']) && $_POST['_rx_ajax_compat'] === 'XMLRPC') if(isset($_POST['_rx_ajax_compat']) && $_POST['_rx_ajax_compat'] === 'XMLRPC')
@ -262,7 +275,7 @@ class Context
} }
// Load system configuration. // Load system configuration.
$this->loadDBInfo(); self::$_instance->loadDBInfo();
// If Rhymix is installed, get virtual site information. // If Rhymix is installed, get virtual site information.
if(self::isInstalled()) if(self::isInstalled())
@ -307,16 +320,16 @@ class Context
$enabled_langs = self::loadLangSelected(); $enabled_langs = self::loadLangSelected();
self::set('lang_supported', $enabled_langs); self::set('lang_supported', $enabled_langs);
if($this->lang_type = self::get('l')) if($lang_type = self::get('l'))
{ {
if($_COOKIE['lang_type'] !== $this->lang_type) if($_COOKIE['lang_type'] !== $lang_type)
{ {
setcookie('lang_type', $this->lang_type, $_SERVER['REQUEST_TIME'] + 3600 * 24 * 1000, '/'); setcookie('lang_type', $lang_type, $_SERVER['REQUEST_TIME'] + 3600 * 24 * 1000, '/');
} }
} }
elseif($_COOKIE['lang_type']) elseif($_COOKIE['lang_type'])
{ {
$this->lang_type = $_COOKIE['lang_type']; $lang_type = $_COOKIE['lang_type'];
} }
elseif(config('locale.auto_select_lang') && count($enabled_langs) > 1) elseif(config('locale.auto_select_lang') && count($enabled_langs) > 1)
{ {
@ -326,30 +339,36 @@ class Context
{ {
if(!strncasecmp($lang_code, $_SERVER['HTTP_ACCEPT_LANGUAGE'], strlen($lang_code))) if(!strncasecmp($lang_code, $_SERVER['HTTP_ACCEPT_LANGUAGE'], strlen($lang_code)))
{ {
$this->lang_type = $lang_code; $lang_type = $lang_code;
setcookie('lang_type', $this->lang_type, $_SERVER['REQUEST_TIME'] + 3600 * 24 * 1000, '/'); setcookie('lang_type', $lang_type, $_SERVER['REQUEST_TIME'] + 3600 * 24 * 1000, '/');
} }
} }
} }
} }
if(!$this->lang_type || !isset($enabled_langs[$this->lang_type])) if(!$lang_type || !isset($enabled_langs[$lang_type]))
{ {
if($site_module_info->settings->language) if($site_module_info->settings->language)
{ {
$this->lang_type = $this->db_info->lang_type = $site_module_info->settings->language; $lang_type = self::$_instance->db_info->lang_type = $site_module_info->settings->language;
} }
else else
{ {
$this->lang_type = $this->db_info->lang_type ?: 'ko'; $lang_type = self::$_instance->db_info->lang_type ?: 'ko';
} }
} }
self::setLangType($this->lang_type); $lang = Rhymix\Framework\Lang::getInstance($lang_type);
$this->lang = Rhymix\Framework\Lang::getInstance($this->lang_type); $lang->loadDirectory(RX_BASEDIR . 'common/lang', 'common');
$this->lang->loadDirectory(RX_BASEDIR . 'common/lang', 'common'); $lang->loadDirectory(RX_BASEDIR . 'modules/module/lang', 'module');
$this->lang->loadDirectory(RX_BASEDIR . 'modules/module/lang', 'module'); self::setLangType(self::$_instance->lang_type = $lang_type);
self::set('lang', $GLOBALS['lang'] = $this->lang); self::set('lang', self::$_instance->lang = $lang);
// Set global variables for backward compatibility.
$GLOBALS['oContext'] = self::$_instance;
$GLOBALS['__Context__'] = &self::$_tpl_vars;
$GLOBALS['_time_zone'] = self::$_instance->db_info->time_zone;
$GLOBALS['lang'] = &$lang;
// set session handler // set session handler
if(self::isInstalled() && config('session.use_db')) if(self::isInstalled() && config('session.use_db'))
@ -504,7 +523,6 @@ class Context
// Copy to old format for backward compatibility. // Copy to old format for backward compatibility.
self::$_instance->db_info = self::convertDBInfo($config); self::$_instance->db_info = self::convertDBInfo($config);
self::$_instance->allow_rewrite = self::$_instance->db_info->use_rewrite === 'Y'; self::$_instance->allow_rewrite = self::$_instance->db_info->use_rewrite === 'Y';
$GLOBALS['_time_zone'] = self::$_instance->db_info->time_zone;
} }
/** /**
@ -1197,7 +1215,7 @@ class Context
{ {
if(is_string($val)) if(is_string($val))
{ {
foreach($this->patterns as $pattern) foreach(self::$_check_patterns as $pattern)
{ {
if(preg_match($pattern, $val)) if(preg_match($pattern, $val))
{ {
@ -1909,17 +1927,17 @@ class Context
*/ */
public static function addSSLAction($action) public static function addSSLAction($action)
{ {
if(!is_readable(self::$_instance->sslActionCacheFile)) if(!is_readable(self::$_ssl_actions_cache_file))
{ {
$buff = '<?php if(!defined("__XE__"))exit;'; $buff = '<?php if(!defined("__XE__"))exit;';
FileHandler::writeFile(self::$_instance->sslActionCacheFile, $buff); FileHandler::writeFile(self::$_ssl_actions_cache_file, $buff);
} }
if(!isset(self::$_instance->ssl_actions[$action])) if(!isset(self::$_ssl_actions[$action]))
{ {
self::$_instance->ssl_actions[$action] = 1; self::$_ssl_actions[$action] = 1;
$sslActionCacheString = sprintf('$sslActions[\'%s\'] = 1;', $action); $sslActionCacheString = sprintf('$sslActions[\'%s\'] = 1;', $action);
FileHandler::writeFile(self::$_instance->sslActionCacheFile, $sslActionCacheString, 'a'); FileHandler::writeFile(self::$_ssl_actions_cache_file, $sslActionCacheString, 'a');
} }
} }
@ -1931,20 +1949,20 @@ class Context
*/ */
public static function addSSLActions($action_array) public static function addSSLActions($action_array)
{ {
if(!is_readable(self::$_instance->sslActionCacheFile)) if(!is_readable(self::$_ssl_actions_cache_file))
{ {
unset(self::$_instance->ssl_actions); self::$_ssl_actions = array();
$buff = '<?php if(!defined("__XE__"))exit;'; $buff = '<?php if(!defined("__XE__"))exit;';
FileHandler::writeFile(self::$_instance->sslActionCacheFile, $buff); FileHandler::writeFile(self::$_ssl_actions_cache_file, $buff);
} }
foreach($action_array as $action) foreach($action_array as $action)
{ {
if(!isset(self::$_instance->ssl_actions[$action])) if(!isset(self::$_ssl_actions[$action]))
{ {
self::$_instance->ssl_actions[$action] = 1; self::$_ssl_actions[$action] = 1;
$sslActionCacheString = sprintf('$sslActions[\'%s\'] = 1;', $action); $sslActionCacheString = sprintf('$sslActions[\'%s\'] = 1;', $action);
FileHandler::writeFile(self::$_instance->sslActionCacheFile, $sslActionCacheString, 'a'); FileHandler::writeFile(self::$_ssl_actions_cache_file, $sslActionCacheString, 'a');
} }
} }
} }
@ -1960,9 +1978,9 @@ class Context
if(self::isExistsSSLAction($action)) if(self::isExistsSSLAction($action))
{ {
$sslActionCacheString = sprintf('$sslActions[\'%s\'] = 1;', $action); $sslActionCacheString = sprintf('$sslActions[\'%s\'] = 1;', $action);
$buff = FileHandler::readFile(self::$_instance->sslActionCacheFile); $buff = FileHandler::readFile(self::$_ssl_actions_cache_file);
$buff = str_replace($sslActionCacheString, '', $buff); $buff = str_replace($sslActionCacheString, '', $buff);
FileHandler::writeFile(self::$_instance->sslActionCacheFile, $buff); FileHandler::writeFile(self::$_ssl_actions_cache_file, $buff);
} }
} }
@ -1975,7 +1993,7 @@ class Context
{ {
if(self::getSslStatus() == 'optional') if(self::getSslStatus() == 'optional')
{ {
return self::$_instance->ssl_actions; return self::$_ssl_actions;
} }
else else
{ {
@ -1991,7 +2009,7 @@ class Context
*/ */
public static function isExistsSSLAction($action) public static function isExistsSSLAction($action)
{ {
return isset(self::$_instance->ssl_actions[$action]); return isset(self::$_ssl_actions[$action]);
} }
/** /**

View file

@ -983,6 +983,10 @@ class TemplateHandler
{ {
return '$' . $matches[1]; return '$' . $matches[1];
} }
elseif ($matches[1] === 'lang')
{
return '$GLOBALS[\'lang\']';
}
else else
{ {
return '$__Context->' . $matches[1]; return '$__Context->' . $matches[1];

View file

@ -43,8 +43,7 @@ require dirname(__FILE__) . '/common/autoload.php';
* @brief Initialize by creating Context object * @brief Initialize by creating Context object
* Set all Request Argument/Environment variables * Set all Request Argument/Environment variables
**/ **/
$oContext = Context::getInstance(); Context::init();
$oContext->init();
/** /**
* @brief Initialize and execute Module Handler * @brief Initialize and execute Module Handler