Exemplo n.º 1
0
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]);
            }
        }
    }
}