function parseMobRequest() { global $context, $scripturl, $sourcedir, $mobsettings, $user_info, $modSettings; $ver = phpversion(); if ($ver[0] >= 5) { $data = file_get_contents('php://input'); } else { $data = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : ''; } $data = str_replace('<param><value><boolean>false</boolean></value></param>', '<param><value><boolean>0</boolean></value></param>', $data); require_once $sourcedir . '/Subs-Package.php'; $context['mob_request'] = array(); $context['mob_response'] = array('encoding' => 'none'); // We got compression buddy? if (isset($_SERVER['HTTP_CONTENT_ENCODING']) && function_exists('gzinflate')) { if ($_SERVER['HTTP_CONTENT_ENCODING'] == 'x-gzip' && !($data = @gzinflate(substr($data, 10)))) { createErrorResponse('server_decompress_failed', '', 'xmlrpc'); } elseif ($_SERVER['HTTP_CONTENT_ENCODING'] == 'x-deflate' && !($data = @gzuncompress($data))) { createErrorResponse('server_decompress_failed', '', 'xmlrpc'); } else { createErrorResponse('server_cannot_decompress', '', 'xmlrpc'); } } elseif (isset($_SERVER['HTTP_CONTENT_ENCODING'])) { createErrorResponse('server_cannot_decompress', '', 'xmlrpc'); } // Innitialize the SMF XML handler $xmlHandler = new xmlArray($data, true); // Get the method name if (!($context['mob_request']['method'] = $xmlHandler->fetch('methodCall/methodName'))) { createErrorResponse('unknown_method', '', 'xmlrpc'); } // Are we closed? if ($context['mob_request']['method'] != 'login' && $context['mob_request']['method'] != 'get_config') { if (!empty($context['in_maintenance']) && !$user_info['is_admin']) { createErrorResponse(5, ' due to maintenance'); } elseif (empty($modSettings['allow_guestAccess']) && $user_info['is_guest'] && $context['mob_request']['method'] != 'sign_in') { createErrorResponse(21); } } // Get the parameters $context['mob_request']['params'] = array(); if ($xmlHandler->exists('methodCall/params')) { foreach ($xmlHandler->set('methodCall/params/param') as $parameter) { // Lame workdarround for create_message if (($context['mob_request']['method'] == 'create_message' || $context['mob_request']['method'] == 'new_topic' || $context['mob_request']['method'] == 'reply_post') && $parameter->exists('value/value')) { if (!$parameter->exists('value/value[1]')) { $value = $parameter->to_array(); $values = array(0 => array($value['value']['base64'], 'base64')); } else { $values = array(); foreach ($parameter->set('value/value') as $value) { $value = $value->to_array(); $values[] = array($value['base64'], 'base64'); } } $context['mob_request']['params'][] = $values; } else { $parameter = $parameter->to_array(); $keys = array_keys($parameter['value']); $values = array_values($parameter['value']); $context['mob_request']['params'][] = array($values[0], $keys[0]); } } } }