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+'>'; - }); + 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) + ''); + }); + } + 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+'>'; - }); + 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) + ''); + }); + } + 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();