Exemple #1
0
 /**
  * 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;
 }