/** * class constructor sets class options if smd instance is not set in class options * will create smd instance with appropriate options. * * @error 14701 * @param null|array|object $options expects optional options */ public function __construct($options = null) { xapp_set_options($options, $this); if (!xapp_is_option(self::SMD, $this)) { $opt = array(Xapp_Rpc_Smd_Jsonp::TRANSPORT => 'JSONP', Xapp_Rpc_Smd_Jsonp::ENVELOPE => 'URL', Xapp_Rpc_Smd_Jsonp::RELATIVE_TARGETS => false, Xapp_Rpc_Smd_Jsonp::CALLBACK => xapp_get_option(self::CALLBACK, $this)); xapp_set_option(self::SMD, Xapp_Rpc_Smd_Jsonp::instance($opt), $this); } parent::__construct(); }
public function init() { $flags = xapp_get_option(self::FLAGS, $this); self::$_instance = $this; /*** * The very basic paths */ if (!defined('XAPP_BASEDIR')) { define("XAPP_BASEDIR", xapp_get_option(self::BASEDIR, $this)); } if (!defined('XAPP_LIB')) { define("XAPP_LIB", XAPP_BASEDIR . DIRECTORY_SEPARATOR . "lib" . DIRECTORY_SEPARATOR); } /*** * Load utils */ if (!class_exists('XApp_Service_Entry_Utils')) { include_once XAPP_BASEDIR . 'XApp_Service_Entry_Utils.php'; } /*** * Get run-time configuration, there is 'debug' and 'release'. For both cases there are * different resources to load. */ $XAPP_RUN_TIME_CONFIGURATION = XApp_Service_Entry_Utils::getRunTimeConfiguration(); /*** * Load dependencies */ $this->loadDependencies(xapp_get_option(self::FLAGS, $this)); //some debugging tools XApp_Service_Entry_Utils::includeXAppDebugTools(); $plugins = null; $pluginResources = null; $xComPluginManager = null; $logger = null; $loggingFlags = xapp_has_option(self::LOGGING_FLAGS, $this) ? xapp_get_option(self::LOGGING_FLAGS, $this) : array(); /*** * Setup Logger */ if (in_array(XAPP_BOOTSTRAP_SETUP_LOGGER, $flags) && xapp_has_option(self::LOGGING_CONF, $this)) { $logger = $this->setupLogger(xapp_get_option(self::LOGGING_CONF)); xapp_set_option(self::LOGGER, $logger, $this); if (!function_exists('xp_log')) { function xp_log($message) { $bootstrap = XApp_Bootstrap::instance(); $log = xapp_get_option(XApp_Bootstrap::LOGGER, $bootstrap); $log->log($message); } } } else { if (!function_exists('xp_log')) { //fake logger function xp_log($message) { } } } /*** * Setup XApp-PHP */ if (in_array(XAPP_BOOTSTRAP_SETUP_XAPP, $flags)) { $this->setupXApp(xapp_has_option(self::XAPP_CONF, $this) ? xapp_get_option(self::XAPP_CONF, $this) : null); } /*** * Setup RPC Server */ if (in_array(XAPP_BOOTSTRAP_SETUP_RPC, $flags)) { $this->setupRPC(); } $storeService = null; /*** * Setup storage */ if (in_array(XAPP_BOOTSTRAP_SETUP_STORE, $flags) && xapp_has_option(self::STORE_CONF, $this)) { $storeService = $this->setupStore(xapp_get_option(self::STORE_CONF, $this)); //$this->testStore($storeService); xapp_set_option(self::STORE, $storeService, $this); } /*** * Prepare resource renderer */ if (in_array(XAPP_BOOTSTRAP_LOAD_CLIENT_RESOURCES, $flags)) { //clients resource config path $XAPP_RESOURCE_CONFIG_PATH = '' . xapp_get_option(self::APPDIR, $this) . DIRECTORY_SEPARATOR; if ($XAPP_RUN_TIME_CONFIGURATION === 'debug') { $XAPP_RESOURCE_CONFIG_PATH .= 'lib' . DIRECTORY_SEPARATOR . xapp_get_option(self::APP_NAME, $this) . DIRECTORY_SEPARATOR . 'resources-' . $XAPP_RUN_TIME_CONFIGURATION . xapp_get_option(self::RESOURCE_CONFIG_SUFFIX, $this) . '.json'; } else { if ($XAPP_RUN_TIME_CONFIGURATION === 'release') { $XAPP_RESOURCE_CONFIG_PATH .= DIRECTORY_SEPARATOR . xapp_get_option(self::APP_FOLDER, $this) . DIRECTORY_SEPARATOR . xapp_get_option(self::APP_NAME, $this) . DIRECTORY_SEPARATOR . 'resources-' . $XAPP_RUN_TIME_CONFIGURATION . xapp_get_option(self::RESOURCE_CONFIG_SUFFIX, $this) . '.json'; } } } /*** * Load plugin resources */ if (in_array(XAPP_BOOTSTRAP_LOAD_PLUGIN_RESOURCES, $flags) || in_array(XAPP_BOOTSTRAP_REGISTER_SERVER_PLUGINS, $flags)) { if (xapp_get_option(self::ALLOW_PLUGINS, $this) && xapp_get_option(self::PLUGIN_DIRECTORY, $this) && xapp_get_option(self::PLUGIN_DIRECTORY, $this)) { if (!$xComPluginManager) { $xComPluginManager = new XApp_Commander_PluginManager(); } $pluginResources = $xComPluginManager->getPluginResources(xapp_get_option(self::PLUGIN_DIRECTORY, $this), xapp_get_option(self::PLUGIN_DIRECTORY, $this), xapp_get_option(self::PLUGIN_MASK, $this)); } } /*** * Get plugins */ if (in_array(XAPP_BOOTSTRAP_REGISTER_SERVER_PLUGINS, $flags)) { if (xapp_get_option(self::ALLOW_PLUGINS, $this) && xapp_get_option(self::PLUGIN_DIRECTORY, $this) && xapp_get_option(self::PLUGIN_DIRECTORY, $this)) { if (!$xComPluginManager) { $xComPluginManager = new XApp_Commander_PluginManager(); } $plugins = $xComPluginManager->getPlugins(xapp_get_option(self::PLUGIN_DIRECTORY, $this), xapp_get_option(self::PLUGIN_MASK, $this)); } else { } } $pluginInstances = array(); /*** * Register server plugins */ if ($xComPluginManager !== null && count($plugins) && xapp_get_option(self::RPC_SERVER, $this) && in_array(XAPP_BOOTSTRAP_REGISTER_SERVER_PLUGINS, $flags)) { switch (XApp_Service_Entry_Utils::getServiceType()) { /*** * JSON-RPC-2.0 call. In this case we are only loading the plugin which has been specified in the RPC call('service') */ case XApp_Service_Entry_Utils::SMD_CALL: /*** * Load the plugin by its service class name. A RPC POST request looks like this : * { * "id": 0, * "method": "Xapp_FileService.rename", * "params": { * "path": "./tmp/wp-mail.php", * "newFileName": "wp-mail.php2" * }, * "jsonrpc": "2.0" * } * * In case we go over JSONP, the url looks like this : * * http://0.0.0.0/zoo254/components/com_xas/xapp/index.php?service=XLESS.test&id=4&callback=as * */ $method = XApp_Service_Entry_Utils::getSMDMethod(); $serviceClass = null; if ($method != null && strpos($method, '.') != -1) { $methodSplitted = explode('.', $method); if ($methodSplitted && count($methodSplitted) == 2) { $serviceClass = $methodSplitted[0]; } } if ($serviceClass) { if (in_array(XAPP_LOG_PLUGIN_CREATION, $loggingFlags)) { $this->log('Calling service class::' . $serviceClass); } foreach ($plugins as $pluginConfig) { //load only when not prohibited $prohibited = explode(',', xapp_get_option(self::PROHIBITED_PLUGINS, $this)); if (!in_array($serviceClass, $prohibited)) { if ($pluginConfig !== null && is_object($pluginConfig)) { //pull in if not done yet if (!class_exists($pluginConfig->name)) { $pluginPath = xapp_get_option(self::PLUGIN_DIRECTORY, $this) . DIRECTORY_SEPARATOR . $pluginConfig->location . DIRECTORY_SEPARATOR . $pluginConfig->name . '.php'; if (in_array(XAPP_LOG_PLUGIN_CREATION, $loggingFlags)) { $this->log('loading plugin ' . $pluginConfig->name . ' at ' . $pluginPath); } if (file_exists($pluginPath)) { include_once $pluginPath; } else { continue; } } //create instance if (class_exists($serviceClass)) { $plugin = $xComPluginManager->createPluginInstance($pluginConfig->name, true, array(), array(), xapp_get_options(), $pluginConfig); if ($plugin != null) { xapp_get_option(self::RPC_SERVER)->register($plugin, array('_load')); array_push($pluginInstances, $plugin); //share logger if (in_array(XAPP_LOG_SHARED_LOGGER_PLUGINS, $loggingFlags) && $logger) { $plugin->_setLogger($logger); } } } } } } } break; /*** * JSON-RPC-2.0 Service Introspection. That means we expose all plugins as Dojo SMD! You can see the full RPC class by opening http://localhost/joomla251/administrator/index.php?option=com_xappcommander&view=rpc */ /*** * JSON-RPC-2.0 Service Introspection. That means we expose all plugins as Dojo SMD! You can see the full RPC class by opening http://localhost/joomla251/administrator/index.php?option=com_xappcommander&view=rpc */ case XApp_Service_Entry_Utils::SMD_GET: foreach ($plugins as $pluginConfig) { /*** * Skip black listed plugins */ $prohibited = explode(',', xapp_get_option(self::PROHIBITED_PLUGINS, $this)); if (in_array($pluginConfig->name, $prohibited)) { continue; } //show only if the plugins wants to be exposed! if (property_exists($pluginConfig, 'showSMD') && $pluginConfig->showSMD == true) { if (!class_exists($pluginConfig->name)) { $pluginPath = xapp_get_option(self::PLUGIN_DIRECTORY, $this) . DIRECTORY_SEPARATOR . $pluginConfig->location . DIRECTORY_SEPARATOR . $pluginConfig->name . '.php'; if (in_array(XAPP_LOG_PLUGIN_CREATION, $loggingFlags)) { $this->log('loading plugin ' . $pluginConfig->name . ' at ' . $pluginPath); } if (file_exists($pluginPath)) { include_once $pluginPath; } else { continue; } } //now register as RPC class if (class_exists($pluginConfig->name)) { xapp_get_option(self::RPC_SERVER)->register($pluginConfig->name); } } } break; } } $xappFileService = null; /*** * Setup file service */ if (in_array(XAPP_BOOTSTRAP_SETUP_XFILE, $flags) && xapp_get_option(self::RPC_SERVER, $this) && xapp_has_option(self::XFILE_CONF, $this)) { $opt = xapp_get_option(self::XFILE_CONF, $this); $xappFileService = new Xapp_FileService($opt); $xappFileService::$rootDirectory = xapp_get_option(Xapp_FileService::REPOSITORY_ROOT, xapp_get_option(self::XFILE_CONF)); xapp_get_option(self::RPC_SERVER)->register($xappFileService); } if ($xappFileService !== null && count($pluginInstances)) { foreach ($pluginInstances as $plugin) { $plugin->xfile = $xappFileService; } } /*** * Setup store service */ if ($storeService) { xapp_get_option(self::RPC_SERVER)->register($storeService); } /*** * More services */ if (in_array(XAPP_BOOTSTRAP_SETUP_SERVICES, $flags) && xapp_has_option(self::SERIVCE_CONF, $this) && xapp_get_option(self::RPC_SERVER, $this)) { //pull in registry of xapp core framework XApp_Service_Entry_Utils::includeXAppRegistry(); $this->registerServices(xapp_get_option(self::SERIVCE_CONF), xapp_get_option(self::RPC_SERVER)); } /*** * Setup gateway */ if (in_array(XAPP_BOOTSTRAP_SETUP_GATEWAY, $flags) && xapp_get_option(self::RPC_SERVER, $this)) { try { $needsSigning = false; $opt = xapp_has_option(self::GATEWAY_CONF) ? xapp_get_option(self::GATEWAY_CONF) : array(); /*** * Raise security and demand that the client did sign its request */ $signServiceTypes = xapp_get_option(self::SIGNED_SERVICE_TYPES, $this); if (in_array(XApp_Service_Entry_Utils::getServiceType(), $signServiceTypes)) { $needsSigning = true; //set signed $opt[Xapp_Rpc_Gateway::SIGNED_REQUEST] = true; //complete configuration if (!array_key_exists(Xapp_Rpc_Gateway::SIGNED_REQUEST_METHOD, $opt)) { $opt[Xapp_Rpc_Gateway::SIGNED_REQUEST_METHOD] = 'user'; } if (!array_key_exists(Xapp_Rpc_Gateway::SIGNED_REQUEST_USER_PARAM, $opt)) { $opt[Xapp_Rpc_Gateway::SIGNED_REQUEST_USER_PARAM] = 'user'; } //complete configuration } $this->setGatewayOptionArray(Xapp_Rpc_Gateway::ALLOW_IP, $opt); $this->setGatewayOptionArray(Xapp_Rpc_Gateway::DENY_IP, $opt); $this->setGatewayOptionArray(Xapp_Rpc_Gateway::ALLOW_HOST, $opt); $this->setGatewayOptionArray(Xapp_Rpc_Gateway::DENY_HOST, $opt); /*** * Create the gateway */ $gateway = Xapp_Rpc_Gateway::instance(xapp_get_option(self::RPC_SERVER, $this), $opt); /*** * Set the API key for signed requests */ if ($needsSigning) { $gateway->addKey(xapp_get_option(self::SIGNING_KEY, $this), xapp_get_option(self::SIGNING_TOKEN, $this)); } //$gateway->run(); xapp_set_option(self::GATEWAY, $gateway, $this); } catch (Exception $e) { Xapp_Rpc_Server_Json::dump($e); } } return $this; }
/** * creates and returns singleton instance of class * * @error 14602 * @param null|array|object $options expects optional options * @return Xapp_Rpc_Server_Json */ public static function instance($options = null) { if (self::$_instance === null) { self::$_instance = new self($options); } return self::$_instance; }