Merge branch 'develop' into pr/multidomain

This commit is contained in:
Kijin Sung 2017-03-01 21:50:51 +09:00
commit 210b6b4147
75 changed files with 2102 additions and 425 deletions

View file

@ -246,7 +246,6 @@ class Context
$this->_setJSONRequestArgument();
$this->_setRequestArgument();
$this->_setUploadedArgument();
if(isset($_POST['_rx_ajax_compat']) && $_POST['_rx_ajax_compat'] === 'XMLRPC')
{
self::$_instance->request_method = 'XMLRPC';
@ -353,6 +352,11 @@ class Context
{
getController('member')->setSessionInfo();
}
else
{
self::set('is_logged', false);
self::set('logged_info', Rhymix\Framework\Session::getMemberInfo());
}
}
// set locations for javascript use

View file

@ -112,6 +112,7 @@ class DB
* @var string
*/
public $db_type;
public $db_version = '';
/**
* flag to decide if class prepared statements or not (when supported); can be changed from db.config.info

View file

@ -87,6 +87,7 @@ class DBCubrid extends DB
return;
}
$this->db_version = __CUBRID_VERSION__;
cubrid_set_autocommit($result, CUBRID_AUTOCOMMIT_TRUE);
return $result;

View file

@ -74,13 +74,13 @@ class DBMssql extends DB
$server_info = sqlsrv_server_info($result);
$server_version = $server_info['SQLServerVersion'];
$this->db_version = $server_version;
if ($server_version && version_compare($server_version, '10', '<'))
{
$this->setError(-1, 'Rhymix requires Microsoft SQL Server 2008 or later. Current version is ' . $server_version);
return;
}
return $result;
}

View file

@ -78,9 +78,10 @@ class DBMysql extends DB
}
// Error appears if the version is lower than 5.0.7
if(version_compare(mysql_get_server_info($result), '5.0.7', '<'))
$this->db_version = mysql_get_server_info($result);
if(version_compare($this->db_version, '5.0.7', '<'))
{
$this->setError(-1, 'Rhymix requires MySQL 5.0.7 or later. Current MySQL version is ' . mysql_get_server_info());
$this->setError(-1, 'Rhymix requires MySQL 5.0.7 or later. Current MySQL version is ' . $this->db_version);
return;
}

View file

@ -39,6 +39,7 @@ class DBMysqli extends DBMysql
return;
}
$this->charset = isset($connection['charset']) ? $connection['charset'] : 'utf8';
$this->db_version = $result->server_info;
mysqli_set_charset($result, $this->charset);
return $result;
}

View file

@ -174,7 +174,7 @@ class HTMLDisplayHandler
$output = preg_replace_callback('!<meta(.*?)(?:\/|)>!is', array($this, '_moveMetaToHeader'), $output);
// change a meta fine(widget often put the tag like <!--Meta:path--> to the content because of caching)
$output = preg_replace_callback('/<!--(#)?Meta:([a-z0-9\_\-\/\.\@\:]+)-->/is', array($this, '_transMeta'), $output);
$output = preg_replace_callback('/<!--(#)?Meta:([a-z0-9\_\-\/\.\@\:]+)(\?\$\_\_Context\-\>[a-z0-9\_\-\/\.\@\:]+)?-->/is', array($this, '_transMeta'), $output);
// handles a relative path generated by using the rewrite module
if(Context::isAllowRewrite())
@ -370,9 +370,17 @@ class HTMLDisplayHandler
{
return '';
}
Context::loadFile($matches[2]);
if($matches[3])
{
$vars = Context::get(str_replace('?$__Context->', '', $matches[3]));
Context::loadFile(array($matches[2], null, null, null, $vars));
}
else
{
Context::loadFile($matches[2]);
}
}
/**
* Add OpenGraph metadata tags.
*

View file

@ -14,8 +14,8 @@ class XMLDisplayHandler
$variables = $oModule->getVariables();
$xmlDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<response>\n";
$xmlDoc .= sprintf("<error>%s</error>\n", $oModule->getError());
$xmlDoc .= sprintf("<message>%s</message>\n", str_replace(array('<', '>', '&'), array('&lt;', '&gt;', '&amp;'), $oModule->getMessage()));
$xmlDoc .= sprintf("<error>%s</error>\n", escape($oModule->getError()));
$xmlDoc .= sprintf("<message>%s</message>\n", escape($oModule->getMessage()));
$xmlDoc .= $this->_makeXmlDoc($variables);
@ -47,11 +47,11 @@ class XMLDisplayHandler
if(is_string($val))
{
$xmlDoc .= sprintf('<%s><![CDATA[%s]]></%s>%s', $key, $val, $key, "\n");
$xmlDoc .= sprintf('<%s>%s</%s>%s', $key, escape($val), $key, "\n");
}
else if(!is_array($val) && !is_object($val))
{
$xmlDoc .= sprintf('<%s>%s</%s>%s', $key, $val, $key, "\n");
$xmlDoc .= sprintf('<%s>%s</%s>%s', $key, escape($val), $key, "\n");
}
else
{

View file

@ -270,11 +270,9 @@ class FrontEndFileHandler extends Handler
{
return;
}
if ($default_font_config = Context::get('default_font_config'))
{
$file->vars = array_merge($file->vars, $default_font_config);
}
$default_font_config = Context::get('default_font_config') ?: getController('editor')->default_font_config;
$file->vars = array_merge($file->vars, $default_font_config);
if ($file->fileExtension === 'less')
{
$file->vars = array_map(function($str) {

View file

@ -554,26 +554,132 @@ class TemplateHandler
}
else
{
$escape_option = $this->config->autoescape !== null ? 'auto' : 'noescape';
if(preg_match('@^(.+)\\|((?:no)?escape)$@', $m[1], $mm))
{
$m[1] = $mm[1];
$escape_option = $mm[2];
}
elseif($m[1] === '$content' && preg_match('@/layouts/.+/layout\.html$@', $this->file))
// Get escape options.
if($m[1] === '$content' && preg_match('@/layouts/.+/layout\.html$@', $this->file))
{
$escape_option = 'noescape';
}
$m[1] = self::_replaceVar($m[1]);
switch($escape_option)
else
{
case 'auto':
return "<?php echo (\$this->config->autoescape === 'on' ? htmlspecialchars({$m[1]}, ENT_COMPAT, 'UTF-8', false) : {$m[1]}) ?>";
case 'escape':
return "<?php echo htmlspecialchars({$m[1]}, ENT_COMPAT, 'UTF-8', true) ?>";
case 'noescape':
return "<?php echo {$m[1]} ?>";
$escape_option = $this->config->autoescape !== null ? 'auto' : 'noescape';
}
// Separate filters from variable.
if (preg_match('@^(.+?)(?<![|\s])((?:\|[a-z]{2}[a-z0-9_]+(?::.+)?)+)$@', $m[1], $mm))
{
$m[1] = $mm[1];
$filters = array_map('trim', explode_with_escape('|', substr($mm[2], 1)));
}
else
{
$filters = array();
}
// Process the variable.
$var = self::_replaceVar($m[1]);
// Apply filters.
foreach ($filters as $filter)
{
// Separate filter option from the filter name.
if (preg_match('/^([a-z0-9_-]+):(.+)$/', $filter, $matches))
{
$filter = $matches[1];
$filter_option = $matches[2];
if (!self::_isVar($filter_option) && !preg_match("/^'.*'$/", $filter_option) && !preg_match('/^".*"$/', $filter_option))
{
$filter_option = "'" . escape_sqstr($filter_option) . "'";
}
else
{
$filter_option = self::_replaceVar($filter_option);
}
}
else
{
$filter_option = null;
}
// Apply each filter.
switch ($filter)
{
case 'auto':
case 'autoescape':
case 'escape':
case 'noescape':
$escape_option = $filter;
break;
case 'escapejs':
$var = "escape_js({$var})";
break;
case 'json':
$var = "json_encode({$var})";
break;
case 'strip':
case 'strip_tags':
$var = $filter_option ? "strip_tags({$var}, {$filter_option})" : "strip_tags({$var})";
break;
case 'trim':
$var = "trim({$var})";
break;
case 'urlencode':
$var = "rawurlencode({$var})";
break;
case 'lower':
$var = "strtolower({$var})";
break;
case 'upper':
$var = "strtoupper({$var})";
break;
case 'nl2br':
$var = $this->_applyEscapeOption($var, $escape_option);
$var = "nl2br({$var})";
$escape_option = 'noescape';
break;
case 'join':
$var = $filter_option ? "implode({$filter_option}, {$var})" : "implode(', ', {$var})";
break;
case 'date':
$var = $filter_option ? "getDisplayDateTime(ztime({$var}), {$filter_option})" : "getDisplayDateTime(ztime({$var}), 'Y-m-d H:i:s')";
break;
case 'format':
case 'number_format':
$var = $filter_option ? "number_format({$var}, {$filter_option})" : "number_format({$var})";
break;
case 'link':
$var = $this->_applyEscapeOption($var, $escape_option);
if ($filter_option)
{
$filter_option = $this->_applyEscapeOption($filter_option, $escape_option);
$var = "'<a href=\"' . {$filter_option} . '\">' . {$var} . '</a>'";
}
else
{
$var = "'<a href=\"' . {$var} . '\">' . {$var} . '</a>'";
}
$escape_option = 'noescape';
break;
default:
$filter = escape_sqstr($filter);
$var = "'INVALID FILTER ({$filter})'";
}
}
// Apply the escape option and return.
return '<?php echo ' . $this->_applyEscapeOption($var, $escape_option) . ' ?>';
}
}
@ -699,6 +805,7 @@ class TemplateHandler
else
{
$metafile = $attr['target'];
$metavars = ($attr['vars'] ? self::_replaceVar($attr['vars']) : '');
$result = "\$__tmp=array('{$attr['target']}','{$attr['media']}','{$attr['targetie']}','{$attr['index']}'," . ($attr['vars'] ? self::_replaceVar($attr['vars']) : 'array()') . ");Context::loadFile(\$__tmp);unset(\$__tmp);";
}
break;
@ -707,7 +814,15 @@ class TemplateHandler
$result = "<?php {$result} ?>";
if($metafile)
{
$result = "<!--#Meta:{$metafile}-->" . $result;
if(!$metavars)
{
$result = "<!--#Meta:{$metafile}-->" . $result;
}
else
{
// LESS or SCSS needs the variables to be substituted.
$result = "<!--#Meta:{$metafile}?{$metavars}-->" . $result;
}
}
return $result;
@ -773,6 +888,25 @@ class TemplateHandler
return $m[0];
}
/**
* Apply escape option to an expression.
*/
private function _applyEscapeOption($str, $escape_option)
{
switch($escape_option)
{
case 'escape':
return "htmlspecialchars({$str}, ENT_COMPAT, 'UTF-8', true)";
case 'noescape':
return "{$str}";
case 'autoescape':
return "htmlspecialchars({$str}, ENT_COMPAT, 'UTF-8', false)";
case 'auto':
default:
return "(\$this->config->autoescape === 'on' ? htmlspecialchars({$str}, ENT_COMPAT, 'UTF-8', false) : {$str})";
}
}
/**
* change relative path
* @param string $path
@ -810,9 +944,21 @@ class TemplateHandler
return $path;
}
/**
* Check if a string seems to contain a variable.
*
* @param string $str
* @return bool
*/
private static function _isVar($str)
{
return preg_match('@(?<!::|\\\\|(?<!eval\()\')\$([a-z_][a-z0-9_]*)@i', $str) ? true : false;
}
/**
* replace PHP variables of $ character
* Replace PHP variables of $ character
*
* @param string $php
* @return string $__Context->varname
*/