/** * Function to convert a route to an internal URI * * @param JUri &$uri The uri. * * @return array * * @since 1.5 */ public function parse(&$uri) { $vars = array(); if ($this->app->get('force_ssl') == 2 && strtolower($uri->getScheme()) != 'https') { // Forward to https $uri->setScheme('https'); $this->app->redirect((string) $uri, 301); } // Get the path // Decode URL to convert percent-encoding to unicode so that strings match when routing. $path = urldecode($uri->getPath()); // Remove the base URI path. $path = substr_replace($path, '', 0, strlen(JUri::base(true))); // Check to see if a request to a specific entry point has been made. if (preg_match("#.*?\\.php#u", $path, $matches)) { // Get the current entry point path relative to the site path. $scriptPath = realpath($_SERVER['SCRIPT_FILENAME'] ? $_SERVER['SCRIPT_FILENAME'] : str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED'])); $relativeScriptPath = str_replace('\\', '/', str_replace(JPATH_SITE, '', $scriptPath)); // If a php file has been found in the request path, check to see if it is a valid file. // Also verify that it represents the same file from the server variable for entry script. if (file_exists(JPATH_SITE . $matches[0]) && $matches[0] == $relativeScriptPath) { // Remove the entry point segments from the request path for proper routing. $path = str_replace($matches[0], '', $path); } } // Identify format if ($this->_mode == JROUTER_MODE_SEF) { if ($this->app->get('sef_suffix') && !(substr($path, -9) == 'index.php' || substr($path, -1) == '/')) { if ($suffix = pathinfo($path, PATHINFO_EXTENSION)) { $vars['format'] = $suffix; } } } // Set the route $uri->setPath(trim($path, '/')); // Set the parsepreprocess components methods $components = JComponentHelper::getComponents(); foreach ($components as $component) { $componentRouter = $this->getComponentRouter($component->option); if (method_exists($componentRouter, 'parsepreprocess')) { $this->attachParseRule(array($componentRouter, 'parsepreprocess'), static::PROCESS_BEFORE); } } $vars += parent::parse($uri); return $vars; }
/** * Method to preload the JAccessRules objects for all components. * * Note: This will only get the base permissions for the component. * e.g. it will get 'com_content', but not 'com_content.article.1' or * any more specific asset type rules. * * @return array Array of component names that were preloaded. * * @since 1.6 */ protected static function preloadComponents() { // Add root to asset names list. $components = array(); // Add enabled components to asset names list. foreach (JComponentHelper::getComponents() as $component) { if ($component->enabled) { $components[] = $component->option; } } // Get the database connection object. $db = JFactory::getDbo(); // Get the asset info for all assets in asset names list. $query = $db->getQuery(true)->select($db->qn(array('id', 'name', 'rules', 'parent_id')))->from($db->qn('#__assets'))->where($db->qn('name') . ' IN (' . implode(',', $db->quote($components)) . ', ' . $db->quote('root.1') . ')'); // Get the Name Permission Map List $assets = $db->setQuery($query)->loadObjectList('name'); // Add the root asset as parent of all components. $assetsTree = array(); $rootName = 'root.1'; foreach ($assets as $extensionName => $asset) { $assetsTree[$extensionName][] = $assets[$rootName]; if ($extensionName !== $rootName) { $assetsTree[$extensionName][] = $assets[$extensionName]; } } // Save the permissions for the components asset. foreach ($assetsTree as $extensionName => $assets) { if (!isset(self::$preloadedAssetTypes[$extensionName])) { self::$assetPermissionsById[$extensionName] = array(); self::$assetPermissionsByName[$extensionName] = array(); foreach ($assets as $asset) { self::$assetPermissionsById[$extensionName][$asset->id] = $asset; self::$assetPermissionsByName[$extensionName][$asset->name] = $asset; } self::$preloadedAssetTypes[$extensionName] = true; } } }