/** * Checks if the request is a client callback to the * server and initializes callback parameters. * * @access public * * @return bool true if the request is a valid client callback, * false otherwise. * * @static * */ public static function initializeCallback() { if (!XOAD_Server::notifyObservers('initializeCallbackEnter')) { return false; } if (isset($_GET['xoadCall'])) { if (strcasecmp($_GET['xoadCall'], 'true') == 0) { if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])) { return false; } $requestBody = @unserialize($GLOBALS['HTTP_RAW_POST_DATA']); if ($requestBody == null) { return false; } if (isset($requestBody['eventPost']) && isset($requestBody['className']) && isset($requestBody['sender']) && isset($requestBody['event']) && array_key_exists('data', $requestBody) && array_key_exists('filter', $requestBody)) { if (XOAD_Utilities::getType($requestBody['eventPost']) != 'bool' || XOAD_Utilities::getType($requestBody['className']) != 'string' || XOAD_Utilities::getType($requestBody['sender']) != 'string' || XOAD_Utilities::getType($requestBody['event']) != 'string') { return false; } if (!empty($requestBody['className'])) { XOAD_Server::loadClass($requestBody['className']); } else { return false; } if (!XOAD_Server::isClassAllowed($requestBody['className'])) { return false; } $requestBody['sender'] = @unserialize($requestBody['sender']); if ($requestBody['sender'] === null) { return false; } if (strcasecmp(get_class($requestBody['sender']), $requestBody['className']) != 0) { return false; } if (!XOAD_Server::notifyObservers('initializeCallbackSuccess', array('request' => &$requestBody))) { return false; } $GLOBALS['_XOAD_SERVER_REQUEST_BODY'] =& $requestBody; if (XOAD_Server::notifyObservers('initializeCallbackLeave', array('request' => &$requestBody))) { return true; } } else { if (isset($requestBody['eventsCallback']) && isset($requestBody['time']) && isset($requestBody['data'])) { if (XOAD_Utilities::getType($requestBody['eventsCallback']) != 'bool' || XOAD_Utilities::getType($requestBody['time']) != 'float' || XOAD_Utilities::getType($requestBody['data']) != 's_array') { return false; } foreach ($requestBody['data'] as $eventData) { if (!empty($eventData['className'])) { XOAD_Server::loadClass($eventData['className']); } else { return false; } if (!XOAD_Server::isClassAllowed($eventData['className'])) { return false; } } if (!XOAD_Server::notifyObservers('initializeCallbackSuccess', array('request' => &$requestBody))) { return false; } $GLOBALS['_XOAD_SERVER_REQUEST_BODY'] =& $requestBody; if (XOAD_Server::notifyObservers('initializeCallbackLeave', array('request' => &$requestBody))) { return true; } } else { if (!isset($requestBody['source']) || !isset($requestBody['className']) || !isset($requestBody['method']) || !isset($requestBody['arguments'])) { return false; } if (!empty($requestBody['className'])) { XOAD_Server::loadClass($requestBody['className']); } $requestBody['source'] = @unserialize($requestBody['source']); $requestBody['arguments'] = @unserialize($requestBody['arguments']); if ($requestBody['source'] === null || $requestBody['className'] === null || $requestBody['arguments'] === null) { return false; } if (XOAD_Utilities::getType($requestBody['source']) != 'object' || XOAD_Utilities::getType($requestBody['className']) != 'string' || XOAD_Utilities::getType($requestBody['method']) != 'string' || XOAD_Utilities::getType($requestBody['arguments']) != 's_array') { return false; } if (strcasecmp($requestBody['className'], get_class($requestBody['source'])) != 0) { return false; } if (!XOAD_Server::isClassAllowed($requestBody['className'])) { return false; } if (method_exists($requestBody['source'], XOAD_CLIENT_METADATA_METHOD_NAME)) { call_user_func_array(array(&$requestBody['source'], XOAD_CLIENT_METADATA_METHOD_NAME), array()); if (isset($requestBody['source']->xoadMeta)) { if (XOAD_Utilities::getType($requestBody['source']->xoadMeta) == 'object') { if (strcasecmp(get_class($requestBody['source']->xoadMeta), 'XOAD_Meta') == 0) { if (!$requestBody['source']->xoadMeta->isPublicMethod($requestBody['method'])) { return false; } } } } } if (!XOAD_Server::notifyObservers('initializeCallbackSuccess', array('request' => &$requestBody))) { return false; } $GLOBALS['_XOAD_SERVER_REQUEST_BODY'] =& $requestBody; if (XOAD_Server::notifyObservers('initializeCallbackLeave', array('request' => &$requestBody))) { return true; } } } } } XOAD_Server::notifyObservers('initializeCallbackLeave'); return false; }