public function getWriter() { if ($this->_writer) { return $this->_writer; } $writerClass = xapp_get_option(self::WRITER_CLASS, $this); if (class_exists($writerClass)) { $this->_writer = new $writerClass(xapp_get_options()); } return $this->_writer; }
/** * * Check all validation methods provided into options * * * @param $options * @param $error * @param $success */ public static function check($options, &$error, &$success) { if (xapp_get_option(self::VALIDATE, $options)) { foreach (xapp_get_options($options) as $k => $v) { self::validate($k, $v, $options, $error, $success); } } }
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; }
/** * run gateway validating all options and handle request by server first by calling server setup method * then handle and finally tearing down the server instance. nothing will happen unless this function is called! * * @error 14016 * @return void */ public final function run() { xapp_debug('rpc gateway running', 'rpc'); xapp_event('xapp.rpc.gateway.run', array(&$this)); $this->server()->setup(); if ($this->server()->hasCalls()) { if (xapp_get_option(self::VALIDATE, $this)) { foreach (xapp_get_options($this) as $k => $v) { $this->validate($k, $v); } } } $this->server()->handle(); $this->server()->teardown(); xapp_debug('rpc gateway shutting down', 'rpc'); }
/** * static setter/getter for static options that once set are valid for all instances. will set * options if first parameter is set and get options if omited * * @error 16703 * @param null|mixed $options expects optional options * @return array|mixed|null */ public static function options($options = null) { $class = get_class(); if ($options !== null) { return xapp_set_options($options, $class); } else { return xapp_get_options($class); } }
public static function factoryEx($className, $configuration = null) { if (is_string($className)) { $reflection = new ReflectionClass($className); if ($reflection->implementsInterface('Xapp_Singleton_Interface')) { $instance = $className::instance($configuration); } else { $instance = new $className($configuration); } } elseif (is_object($className)) { $instance = $className; } return array(self::XAPP_SERVICE_CLASS => $className, self::XAPP_SERVICE_CONF => xapp_get_options($instance), self::XAPP_SERVICE_INSTANCE => $instance); }
/** * class must be in std package * * patterns: * id=1, * id>1 * id>=1 * id<1 * id<=1 * id!=1 * id->1,2,3,4 * id*regex * * key in query can also have wildcard like id[*] * if path is empty or only "." "/" * * the options are find => first, find => last, limit = 10, * * all query elements are AND connected. when the first object is found check other condition. if next condition * asserts positive try next and so on. if next assertion fails exit loop and try to find next matching object */ public static function query($object, $path, array $query = null, array $options = array()) { $result = array(); if ($query === null) { return self::get($object, $path); } else { if (!empty($options)) { $options = array_merge(xapp_get_options(get_class()), $options); } else { $options = xapp_get_options(get_class()); } if (($object = self::get($object, $path)) !== false) { if (!is_array($object)) { $object = array($object); } if (sizeof($query) > 1) { foreach ($query as $q) { $result = self::_query($object, $q); if (!empty($result)) { $object = $result; } else { return false; } } return (int) $options[self::QUERY_ORDER] === 0 ? $result[0] : $result[sizeof($result) - 1]; } else { $result = self::_query($object, $query[0]); if (!empty($result)) { return (int) $options[self::QUERY_ORDER] === 0 ? $result[0] : $result[sizeof($result) - 1]; } else { return false; } } } } return false; }