diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php
index 2ec7e5c6b..9518756b7 100644
--- a/classes/context/Context.class.php
+++ b/classes/context/Context.class.php
@@ -219,7 +219,7 @@ class Context
if($this->db_info->use_sitelock == 'Y')
{
if(is_array($this->db_info->sitelock_whitelist)) $whitelist = $this->db_info->sitelock_whitelist;
-
+
if(!IpFilter::filter($whitelist))
{
$title = ($this->db_info->sitelock_title) ? $this->db_info->sitelock_title : 'Maintenance in progress...';
@@ -1244,19 +1244,75 @@ class Context
$xml_obj = $oXml->parse();
$params = $xml_obj->methodcall->params;
- unset($params->node_name, $params->attrs);
+ unset($params->node_name, $params->attrs, $params->body);
- if(!count($params))
+ if(!count(get_object_vars($params)))
{
return;
}
- foreach($params as $key => $obj)
+ foreach($params as $key => $val)
{
- $this->set($key, $this->_filterRequestVar($key, $obj->body, 0), TRUE);
+ $this->set($key, $this->_filterXmlVars($key, $val), TRUE);
}
}
+ /**
+ * Filter xml variables
+ *
+ * @param string $key Variable key
+ * @param object $val Variable value
+ * @return mixed filtered value
+ */
+ function _filterXmlVars($key, $val)
+ {
+ if(is_array($val))
+ {
+ $stack = array();
+ foreach($val as $k => $v)
+ {
+ $stack[$k] = $this->_filterXmlVars($k, $v);
+ }
+
+ return $stack;
+ }
+
+ $body = $this->_filterRequestVar($key, trim($val->body ? $val->body : ''), 0);
+ if($body)
+ {
+ return $body;
+ }
+
+ unset($val->node_name, $val->attrs, $val->body);
+ if(!count(get_object_vars($val)))
+ {
+ return NULL;
+ }
+
+ $stack = new stdClass();
+ foreach($val as $k => $v)
+ {
+ $output = $this->_filterXmlVars($k, $v);
+ if(is_object($v) && $v->attrs->type == 'array')
+ {
+ $output = array($output);
+ }
+ if($k == 'value' && (is_array($v) || $v->attrs->type == 'array'))
+ {
+ return $output;
+ }
+
+ $stack->{$k} = $output;
+ }
+
+ if(!count(get_object_vars($stack)))
+ {
+ return NULL;
+ }
+
+ return $stack;
+ }
+
/**
* Filter request variable
*
diff --git a/common/js/xe.js b/common/js/xe.js
index f208bc6c6..db8f98249 100644
--- a/common/js/xe.js
+++ b/common/js/xe.js
@@ -1474,17 +1474,33 @@ function xml2json(xml, tab, ignoreAttrib) {
// 현 url과 ajax call 대상 url의 schema 또는 port가 다르면 직접 form 전송
if(_u1.protocol != _u2.protocol || _u1.port != _u2.port) return send_by_form(xml_path, params);
- var xml = [], i = 0;
- xml[i++] = '';
- xml[i++] = '';
- xml[i++] = '';
+ var xml = [],
+ xmlHelper = function(params) {
+ var stack = [];
- $.each(params, function(key, val) {
- xml[i++] = '<'+key+'>'+key+'>';
- });
+ if ($.isArray(params)) {
+ $.each(params, function(key, val) {
+ stack.push('' + xmlHelper(val) + '');
+ });
+ }
+ else if ($.isPlainObject(params)) {
+ $.each(params, function(key, val) {
+ stack.push('<' + key + '>' + xmlHelper(val) + '' + key + '>');
+ });
+ }
+ else if (!$.isFunction(params)) {
+ stack.push('');
+ }
- xml[i++] = '';
- xml[i++] = '';
+ return stack.join('\n');
+ };
+
+ xml.push('');
+ xml.push('');
+ xml.push('');
+ xml.push(xmlHelper(params));
+ xml.push('');
+ xml.push('');
var _xhr = null;
if (_xhr && _xhr.readyState !== 0) _xhr.abort();
diff --git a/common/js/xml_handler.js b/common/js/xml_handler.js
index 1b31bffc9..da0f0bce0 100644
--- a/common/js/xml_handler.js
+++ b/common/js/xml_handler.js
@@ -237,17 +237,33 @@ function xml2json(xml, tab, ignoreAttrib) {
// 현 url과 ajax call 대상 url의 schema 또는 port가 다르면 직접 form 전송
if(_u1.protocol != _u2.protocol || _u1.port != _u2.port) return send_by_form(xml_path, params);
- var xml = [], i = 0;
- xml[i++] = '';
- xml[i++] = '';
- xml[i++] = '';
+ var xml = [],
+ xmlHelper = function(params) {
+ var stack = [];
- $.each(params, function(key, val) {
- xml[i++] = '<'+key+'>'+key+'>';
- });
+ if ($.isArray(params)) {
+ $.each(params, function(key, val) {
+ stack.push('' + xmlHelper(val) + '');
+ });
+ }
+ else if ($.isPlainObject(params)) {
+ $.each(params, function(key, val) {
+ stack.push('<' + key + '>' + xmlHelper(val) + '' + key + '>');
+ });
+ }
+ else if (!$.isFunction(params)) {
+ stack.push('');
+ }
- xml[i++] = '';
- xml[i++] = '';
+ return stack.join('\n');
+ };
+
+ xml.push('');
+ xml.push('');
+ xml.push('');
+ xml.push(xmlHelper(params));
+ xml.push('');
+ xml.push('');
var _xhr = null;
if (_xhr && _xhr.readyState !== 0) _xhr.abort();