File Manager

Current Directory: /home/astoriaah/www/administrator/components/com_sh404sef/lib/extplugins/acesef
Viewing File: /home/astoriaah/www/administrator/components/com_sh404sef/lib/extplugins/acesef/uri.php
<?php /** * sh404SEF - SEO extension for Joomla! * * @author Yannick Gaultier * @copyright (c) Yannick Gaultier - Weeblr llc - 2022 * @package sh404SEF * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL * @version 4.24.1.4308 * @date 2022-05-31 */ // No Permission defined('_JEXEC') or die('Restricted Access'); // URI class class AcesefURI { function __construct() { // Get config object $this->AcesefConfig = AcesefFactory::getConfig(); } // non-SEF Vars function nonSefVars(&$uri, $non_sef_vars = null, $non_sef_part = "") { $ext_non_sef = array(); $config_non_sef = array(); // Load the nonSEF vars from extension parameters if (!is_null($uri->getVar('option'))) { $non_sef = $this->attributes->params->get('non_sef_vars', ''); if (!empty($non_sef)) { // Some variables are set, let's explode them $ext_non_sef = explode(',', $non_sef); } } // Get globally configured nonSEF vars if (!empty($this->AcesefConfig->non_sef_vars)) { $config_non_sef = explode(',', $this->AcesefConfig->non_sef_vars); } // Combine all non-SEF vars arrays $n_sef_vars = array_merge($ext_non_sef, $config_non_sef); if (!empty($n_sef_vars)) { foreach ($n_sef_vars as $n_sef_var) { $n_sef_var = trim($n_sef_var); if (strpos($n_sef_var, "=")) { $var_array = explode("=", $n_sef_var); if (!isset($non_sef_vars[$var_array[0]]) && !is_null($uri->getVar($var_array[0])) && ($uri->getVar($var_array[0]) == $var_array[1])) { $non_sef_vars[$var_array[0]] = $var_array[1]; } } // Add each variable, that isn't already set, and that is present in our URL elseif (!isset($non_sef_vars[$n_sef_var]) && !is_null($uri->getVar($n_sef_var))) { $non_sef_vars[$n_sef_var] = $uri->getVar($n_sef_var); } } } // Option, Itemid, lang filter $filter = array('option', 'Itemid', 'lang'); // non_sef_vars - variables to exclude only if set to in configuration if ($this->AcesefConfig->append_non_sef && isset($non_sef_vars)) { foreach ($non_sef_vars as $name => $value) { // Do not process variables not present in URL if (is_null($uri->getVar($name))) { continue; } // Do not process filter if (in_array($name, $filter)) { continue; } if (is_array($value)) { // Variable is an array, let's remove all its occurences foreach ($value as $key => $val) { $val = urlencode($val); if (strlen($non_sef_part) > 0) { $non_sef_part .= '&amp;'.$name.'['.$key.']='.$val; } else { $non_sef_part = '?'.$name.'['.$key.']='.$val; } } } else { $value = urlencode($value); if (strlen($non_sef_part) > 0) { $non_sef_part .= '&amp;'.$name.'='.$value; } else { $non_sef_part = '?'.$name.'='.$value; } } $uri->delVar($name); } $app =JFactory::getApplication(); $global_non_sef = $app->get('acesef.global.nonsefvars'); if (!empty($global_non_sef)) { foreach (array_keys($global_non_sef) as $key) { if (in_array($key, array_keys($non_sef_vars))) { unset($global_non_sef[$key]); } } //$app->set('acesef.global.nonsefvars', $global_non_sef); } } return $non_sef_part; } // disable-SEF Vars function disableSefVars($uri) { $do_sef = true; $ext_dis_sef = array(); $config_dis_sef = array(); $dis_sef_vars = array(); // Load the disable-SEF vars from extension parameters if (!is_null($uri->getVar('option'))) { $dis_sef = $this->attributes->params->get('disable_sef_vars', ''); if (!empty($dis_sef)) { // Some variables are set, let's explode them $ext_dis_sef = explode(',', $dis_sef); } } // Get globally configured disable-SEF vars if (!empty($this->AcesefConfig->disable_sef_vars)) { $config_dis_sef = explode(',', $this->AcesefConfig->disable_sef_vars); } // Combine both disable-SEF vars arrays $vars = array_merge($ext_dis_sef, $config_dis_sef); if (!empty($vars)) { foreach ($vars as $var) { $var = trim($var); // Check var=value if (strpos($var, "=")) { $var_array = explode("=", $var); if (!is_null($uri->getVar($var_array[0])) && ($uri->getVar($var_array[0]) == $var_array[1])) { $do_sef = false; break; } } // Check var elseif (!is_null($uri->getVar($var))) { $do_sef = false; break; } } } return $do_sef; } // Skip menu vars function skipMenuVars($uri) { $skip_menu = false; $ext_skip_menu = array(); $config_skip_menu = array(); // Load the skip menu vars from extension parameters if (!is_null($uri->getVar('option'))) { $e_skip_menu = $this->attributes->params->get('skip_menu_vars', ''); if (!empty($e_skip_menu)) { // Some variables are set, let's explode them $ext_skip_menu = explode(',', $e_skip_menu); } } // Get globally configured skip menu vars if (!empty($this->AcesefConfig->skip_menu_vars)) { $config_skip_menu = explode(',', $this->AcesefConfig->skip_menu_vars); } // Combine all skip menu vars arrays $vars = array_merge($ext_skip_menu, $config_skip_menu); if (!empty($vars)) { foreach ($vars as $var) { $var = trim($var); // Check var=value if (strpos($var, "=")) { $var_array = explode("=", $var); if (!is_null($uri->getVar($var_array[0])) && ($uri->getVar($var_array[0]) == $var_array[1])) { $skip_menu = true; break; } } // Check var elseif (!is_null($uri->getVar($var))) { $skip_menu = true; break; } } } return $skip_menu; } // Get page number function getPageNumber($vars, $ext_params, $item_limitstart = false) { $mainframe =JFactory::getApplication(); $option = $vars['option']; $limitstart = $vars['limitstart']; $Itemid = ""; if (!empty($vars['Itemid'])) { $Itemid = $vars['Itemid']; } if (!empty($vars['limit'])) { $limit = $vars['limit']; } $number = ""; if ($item_limitstart == true) { $limitstart++; return $limitstart; } // com_content if ($option == 'com_content') { if (!empty($vars['view'])) { $view = $vars['view']; } if (!empty($vars['layout'])) { $layout = $vars['layout']; } $menu_params = AcesefUtility::getMenu()->getParams(intval($Itemid)); if (!empty($menu_params)) { if ((!empty($layout) && $layout == 'blog') || (!empty($view) && $view == 'frontpage')) { $nm_leading = $menu_params->get('num_leading_articles', 1); $nm_intro = $menu_params->get('num_intro_articles', 4); $total_articles = $nm_leading + $nm_intro; if (!empty($total_articles)) { $number = $limitstart / $total_articles; $number++; return $number; } } if (!empty($view) && $view == 'category' && empty($layout)) { $links_num = $menu_params->get('display_num'); if (!empty($links_num)) { $number = $limitstart / $links_num; $number++; return $number; } $state_limit = $mainframe->getUserStateFromRequest('limit', 'limit', $mainframe->getCfg('list_limit'), 'int'); if (!empty($state_limit)) { $number = $limitstart / $state_limit; $number++; if ($this->AcesefConfig->url_append_limit == 1) { $number .= ' '.$state_limit; } return $number; } } } } // com_acesef if ($option == 'com_acesef') { if (!empty($vars['view'])) { $view = $vars['view']; } if (!empty($view)) { if ($view == 'tags') { $number = $limitstart / $this->AcesefConfig->tags_limit; $number++; return $number; } $menu_params = AcesefUtility::getMenu()->getParams(intval($Itemid)); if ($view == 'sitemap' && !empty($menu_params)) { $number = $limitstart / $menu_params->get('display_num', 50); $number++; return $number; } } } // Empty limit value if (empty($limit)) { $limit_num = $ext_params->get('limit_num', ''); if (!empty($limit_num)) { $number = $limitstart / $limit_num; $number++; return $number; } $state_limit = $mainframe->getUserStateFromRequest('limit', 'limit', $mainframe->getCfg('list_limit'), 'int'); if (!empty($state_limit)) { $number = $limitstart / $state_limit; $number++; if ($this->AcesefConfig->url_append_limit == 1) { $number .= ' '.$state_limit; } return $number; } $number = $limitstart; return $number; } $number = $limitstart / $limit; $number++; if ($option == 'com_virtuemart' && $ext_params->get('vm_drop_down_list', '1') == 2) { $number .= ' '.$limit; } return $number; } function _isHomePage($uri) { static $home_query, $home_id; $n_uri = clone($uri); if (!is_null($n_uri->getVar('option'))) { self::fixUriVar($n_uri, 'id'); self::fixUriVar($n_uri, 'catid'); } if (!isset($home_query)) { $menu =& AcesefUtility::getMenu(); $item =& $menu->getDefault(); if (!is_object($item)) { return false; } $home_query = $item->query; $home_id = $item->id; } $query = $n_uri->_vars; if (!isset($query['option'])) { return false; } if (isset($query['Itemid'])) { if($query['Itemid'] != $home_id) { return false; } unset($query['Itemid']); } elseif (($query['option'] == 'com_content') && isset($query['view']) && ($query['view'] == 'frontpage')) { return false; } if (isset($query['lang'])) { unset($query['lang']); } // Compare queries $cmp = array_diff($query, $home_query); if (count($cmp) > 0) { return false; } $cmp = array_diff($home_query, $query); if (count($cmp) > 0) { return false; } return true; } function getDomain() { static $domain; if (!isset($domain)) { // Get domain $domain = JURI::root(); // Adjust domain according to www redirection if (($this->AcesefConfig->redirect_to_www == 1) && (strpos($domain, '://www.') === false)) { $domain = str_replace('://', '://www.', $domain); } elseif ($this->AcesefConfig->redirect_to_www == 2) { $domain = str_replace('://www.', '://', $domain); } // Add slash after domain if(substr($domain, -1) != '/') { $domain .= '/'; } } return $domain; } // thanks to Nicholas K. Dionysopoulos, akeebabackup.com function findItemid($vars = array(), $params = null) { if (empty($vars) || !is_array($vars)) { $vars = array(); } $menus =& AcesefUtility::getMenu(); $menuitem =& $menus->getActive(); // First check the current menu item (fastest shortcut!) if (is_object($menuitem)) { if (self::_checkMenu($menuitem, $vars, $params)) { return $menuitem; } } $items = $menus->getMenu('site'); if (empty($items)) { return null; } foreach ($items as $item) { if ($item->published) { if (self::_checkMenu($item, $vars, $params)) { return $item; } } } return null; } function _checkMenu($menu, $vars, $params = null) { $query = $menu->query; foreach ($vars as $key => $value) { if (is_null($value)) { continue; } if (!isset($query[$key])) { return false; } if ($query[$key] != $value) { return false; } } if (!is_null($params)) { $menus =& AcesefUtility::getMenu(); $check = $menu->params instanceof JParameter ? $menu->params : $menus->getParams($menu->id); foreach ($params as $key => $value) { if (is_null($value)) { continue; } if ($check->get($key) != $value) { return false; } } } return true; } function _checkDB(&$uri, $prev_lang) { $real_url = AcesefURI::sortURItoString($uri); $url_found = AcesefCache::checkURL($real_url); if (is_object($url_found)) { // Check if it is blocked if (AcesefUtility::getParam($url_found->params, 'blocked') == '1') { $route = $real_url; } else { $route = $url_found->url_sef; } $uri = self::_finalizeURI($uri, $route); self::restoreLang($prev_lang); return true; } return false; } function _finalizeURI($uri, $route) { // Prepare non-SEF part if (($this->attributes->non_sef_part != '') && (strstr($route, '?'))) { $this->attributes->non_sef_part = str_replace('?', '&amp;', $this->attributes->non_sef_part); } // Get domain $url = self::getDomain(); // Add non-SEF vars if ($this->AcesefConfig->append_non_sef == 1) { $url .= $route.$this->attributes->non_sef_part; } else { $url .= $route; } // Add fragment $fragment = $uri->getFragment(); if (!empty($fragment)) { $url .= '#'.$fragment; } // Finally return new URI return new JURI($url); } function _finalizeSEF($uri, $sef_url, $real_url, $component, $lang_code) { // Add menu title $skip_menu = $this->attributes->params->get('skip_menu', '0'); if (!AcesefExtension::skipMenu('', true) && !self::skipMenuVars($uri) && !self::_isHomePage($uri) && ($skip_menu == 0 || ($skip_menu == 1 && $sef_url == '')) ) { $menu_title = array(); $prefix = $this->attributes->params->get('prefix', ''); if (!empty($prefix)) { $menu_title[] = $prefix; } else { $menu_start_level = $this->attributes->params->get('menu_start_level', '0'); $menu_length_level = $this->attributes->params->get('menu_length_level', '0'); $menu_title = AcesefUtility::getMenuTitle(intval($uri->getVar('Itemid')), $menu_start_level, $menu_length_level); } if (!empty($menu_title)) { $menu_url = implode('/', $menu_title); $sef_url = ltrim($sef_url, '/'); if (empty($sef_url)) { $sef_url = $menu_url; } else { $sef_url = $menu_url.'/'.$sef_url; } } } // Add lang code if ($lang_code != ""){ $sef_url = ltrim($sef_url, '/'); $sef_url = $lang_code.'/'.$sef_url; } // Append menu ItemID if ($this->AcesefConfig->append_itemid == 1 && !is_null($uri->getVar('Itemid'))) { $sef_url = rtrim($sef_url, '/'); $sef_url .= "/ItemID ".intval($uri->getVar('Itemid')); } // Generate pagination if (!is_null($uri->getVar('limitstart'))) { $page_nr = self::getPageNumber($uri->_vars, $this->attributes->params, $this->attributes->item_limitstart); $page_str = JText::_('PAGE').' '.$page_nr; $sef_url = rtrim($sef_url, '/'); $sef_url .= '/'.$page_str; } // Make some cleanup $sef_url = self::_cleanupSefUrl($sef_url); // Check if the suffix is set and make some optimization if (strpos($sef_url, '.') === false && $sef_url != '/' && substr($sef_url, strlen($sef_url)-1, 1) != '/') { if ($sef_url != '') { $sef_url .= $this->AcesefConfig->url_suffix; } $sef_url = str_replace('/.', '.', $sef_url); $sef_url = str_replace('-.', '.', $sef_url); $sef_url = str_replace('/pdf'.$this->AcesefConfig->url_suffix, '.pdf', $sef_url); } // Lowercase URLs if ($this->AcesefConfig->url_lowercase == 1) { $sef_url = JString::strtolower($sef_url); } // Remove front slash $sef_url = ltrim($sef_url, '/'); // Remove the trailing slash if (!empty($sef_url) && $this->AcesefConfig->remove_trailing_slash == 1) { $sef_url = rtrim($sef_url, '/'); } // Manage Duplicate URLs if (AcesefUtility::getConfigState($this->attributes->params, 'numeral_duplicated')) { $sef_url = self::_numeralDuplicated($sef_url, $real_url); } // Save the generated SEF URL if ($real_url != "" && ($sef_url != "" || ($sef_url == "" && self::_isHomePage($uri)))) { // URL if (AcesefUtility::getConfigState($this->attributes->params, 'record_duplicated')) { self::_saveRecord($real_url, $sef_url, $component); } else { $db_url_sef = AcesefCache::checkURL($sef_url, true); if (!is_object($db_url_sef)) { self::_saveRecord($real_url, $sef_url, $component); } } // Metadata $metadata = $this->attributes->meta; if ($this->AcesefConfig->meta_core == 1 && is_array($metadata) && count($metadata) > 0) { AcesefMetadata::autoMetadata($sef_url, $metadata); } // Sitemap if ($this->AcesefConfig->sm_auto_mode == 1 && class_exists('AcesefSitemap')) { AcesefSitemap::autoSitemap($component, $this->attributes->params, $sef_url, $real_url); } // Tags if ($this->AcesefConfig->tags_auto_mode == 1 && is_array($metadata) && !empty($metadata['keywords']) && class_exists('AcesefTags')) { AcesefTags::autoTags($metadata['keywords'], $component, $this->attributes->params, $sef_url, $real_url); } } return $sef_url; } // Cleanup SEF URL function _cleanupSefUrl($sef_url) { // Remove the white spaces $sef_url = preg_replace('/\s\s+/', ' ', $sef_url); // Remove some unwanted chars $replace = array("\"", "\\", "'", "`", "´", "‘", "’", "“", "”", "<", ">", "«", "»", "¿", "•", "®", "™", "„", "\\"); foreach ($replace as $value) { if ($value != "") { $sef_url = str_replace($value, "", $sef_url); } } // Strip characters if ($this->AcesefConfig->url_strip_chars != "") { $len = strlen($this->AcesefConfig->url_strip_chars); for ($i=0; $i < $len; $i++) { $char = substr($this->AcesefConfig->url_strip_chars, $i, 1); $sef_url = str_replace($char, "", $sef_url); } } // Replace chars for non-latin languages if ($this->AcesefConfig->char_replacements != "" && $this->AcesefConfig->utf8_url == 0) { $chars = $this->AcesefConfig->char_replacements; $chars_array = array(); $elements = explode(',', $chars); foreach ($elements as $element) { @list($source, $destination) = explode('|', trim($element)); // Empty source, continue if (trim($source) == '') { continue; } $chars_array[trim($source)] = trim($destination); } $sef_url = strtr($sef_url, $chars_array); } // Remove quotes, spaces, and other illegal characters if ($this->AcesefConfig->utf8_url == 1) { $title = preg_replace(array('/\'/', '/[\s"\?\:\/\\\\]/', '/(^_|_$)/'), array('', $this->AcesefConfig->replacement_character, ''), $sef_url); } else { $title = preg_replace(array('/\'/', '/[^a-zA-Z0-9\-!.,+]+/', '/(^_|_$)/'), array('', $this->AcesefConfig->replacement_character, ''), $sef_url); } // Space and some replacements $sef_url = str_replace(' ', $this->AcesefConfig->replacement_character, $sef_url); $sef_url = AcesefUtility::replaceLoop($this->AcesefConfig->replacement_character.'/', '/', $sef_url); $sef_url = AcesefUtility::replaceLoop('/'.$this->AcesefConfig->replacement_character, '/', $sef_url); $sef_url = AcesefUtility::replaceLoop('//', '/', $sef_url); $sef_url = AcesefUtility::replaceLoop('--', '-', $sef_url); $sef_url = rtrim($sef_url, '-'); return $sef_url; } // Manage Duplicated URLs function _numeralDuplicated($sef_url, $real_url) { $cansave = 0; while ($cansave == 0) { $row = AcesefCache::checkURL($sef_url, true); if (is_object($row) && !empty($row->url_sef) && $real_url != $row->url_real) { if (strpos($row->url_sef, "-dp") > 0) { $link = explode("-dp", $row->url_sef); if (!empty($this->AcesefConfig->url_suffix)) { $number = str_replace($this->AcesefConfig->url_suffix, "", $link[1]); } else { $number = $link[1]; } $number ++; // Make new sef $sef_url = $link[0].'-dp'.$number; if (!empty($this->AcesefConfig->url_suffix)){ $sef_url .= $this->AcesefConfig->url_suffix; } } else { if (!empty($this->AcesefConfig->url_suffix)) { $new = explode($this->AcesefConfig->url_suffix, $sef_url); $sef_url = $new[0].'-dp1'.$this->AcesefConfig->url_suffix; } else { $sef_url .= '-dp1'; } } // Check if the new sef url exists $check = AceDatabase::loadResult("SELECT url_sef FROM #__acesef_urls WHERE url_sef = ".AceDatabase::quote($sef_url).""); if (!empty($check)) { $cansave = 0; } else { $cansave = 1; } } else { $cansave = 1; } } return $sef_url; } // Save the new record function _saveRecord($real_url, $sef_url, $component) { // Check if we should track the URL source if ($this->AcesefConfig->source_tracker == 1) { $source = AcesefUtility::replaceSpecialChars(self::_urlSource()); } else { $source = ""; } // Cat statuses $tags = self::_paramValue('tags', $component); $ilinks = self::_paramValue('ilinks', $component); $bookmarks = self::_paramValue('bookmarks', $component); // Params $params = "custom=0"; $params .= "\npublished=1"; $params .= "\nlocked=0"; $params .= "\nblocked=0"; $params .= "\ntrashed=0"; $params .= "\nnotfound=0"; $params .= "\ntags={$tags}"; $params .= "\nilinks={$ilinks}"; $params .= "\nbookmarks={$bookmarks}"; $params .= "\nvisited=0"; $params .= "\nnotes="; // Finally, save record in DB $values = "(".AceDatabase::quote($sef_url).", ".AceDatabase::quote($real_url).", '0', '".date('Y-m-d H:i:s')."', '{$source}', '{$params}')"; AceDatabase::query("INSERT IGNORE INTO #__acesef_urls (url_sef, url_real, used, cdate, source, params) VALUES {$values}"); } // Get the source of the URL function _urlSource() { $trace = debug_backtrace(); $source = ""; $tr = 0; foreach ($trace as $row) { if (@$row['class'] == 'JRouterAcesef' && @$row['function'] == 'build') { // This starts tracing for next 3 rounds $tr = 1; continue; } elseif ($tr == 0) { continue; } $file = isset($row['file']) ? str_replace(JPATH_BASE, '', $row['file']) : 'n/a'; $args = array(); if (!empty($row['args'])) { foreach ($row['args'] as $arg) { if (is_object($arg)) { $args[] = get_class($arg); } elseif (is_array($arg)) { $args[] = 'Array'; } else { $args[] = "'".$arg."'"; } } } $source .= @$row['class'] . @$row['type'] . @$row['function'] . "(" . implode(', ', $args) . ")--b2--" . $file . '--b2--' . @$row['line'] . "\n--b1--\n"; if ($tr == 3) { break; } $tr++; } return $source; } function _paramValue($section, $component) { $_components = $section."_components"; $_cats = $section."_cats"; $_enable_cats = $section."_enable_cats"; $_in_cats = $section."_in_cats"; $cat = AcesefUtility::get('category.param'); if (!in_array($component, $this->AcesefConfig->$_components)) { return 0; } if (AcesefUtility::getConfigState($this->attributes->params, $_enable_cats) && ($cat[$_cats.'_status'] == 0 && $cat['_flag'] == 1)) { return 0; } if (!AcesefUtility::getConfigState($this->attributes->params, $_in_cats) && $cat['_is_cat'] == 1) { return 0; } return 1; } function updateURLs($rows, $where) { // Nothing to update if(is_null($rows) || count($rows) == 0) { return 0; } // Load the needed classes jimport('joomla.application.router'); require_once(JPATH_ROOT. '/' .'includes'. '/' .'application.php'); require_once(JPATH_ACESEF_ADMIN. '/' .'library'. '/' .'router.php'); if (AcesefUtility::JoomFishInstalled()) { require_once( JPATH_ROOT . '/' . 'components' . '/' . 'com_joomfish' . '/' . 'helpers' . '/' . 'defines.php' ); JLoader::register('JoomfishManager', JOOMFISH_ADMINPATH . '/' . 'classes' . '/' . 'JoomfishManager.class.php' ); JLoader::register('JoomFishVersion', JOOMFISH_ADMINPATH . '/' . 'version.php' ); JLoader::register('JoomFish', JOOMFISH_PATH . '/' . 'helpers' . '/' . 'joomfish.class.php' ); } // First, delete all the URLs if (!AceDatabase::query("DELETE FROM #__acesef_urls{$where}")) { return 0; } // Create AceSEF router $router = new JRouterAcesef(); // JoomFish patch if (AcesefUtility::JoomFishInstalled()) { $mainframe =JFactory::getApplication(); // Set mainframe as frontend $mainframe->_clientId = 0; // Initialize JoomFish plugin if(!class_exists('plgSystemJFDatabase')) { require(JPATH_PLUGINS. '/' .'system'. '/' .'jfdatabase.php'); } $params = JPluginHelper::getPlugin('system', 'jfdatabase'); $dispatcher = ShlSystem_factory::dispatcher(); $plugin = new plgSystemJFDatabase($dispatcher, (array)($params)); $plugin->onAfterInitialise(); // Get the mainframe back to backend $mainframe->_clientId = 1; } // Update URLs one by one for($i = 0, $n = count($rows); $i < $n; $i++) { $row =& $rows[$i]; $old_real_url = $row->url_real; $old_sef_url = $row->url_sef; $new_sef_uri = $router->build($old_real_url); $new_sef_url = ltrim(str_replace(JURI::root(), '', $new_sef_uri->_uri), '/'); // SEF URL changed, add it to Moved URLs if($old_sef_url != $new_sef_url) { // Already exists? $id = AceDatabase::loadResult("SELECT id FROM #__acesef_urls_moved WHERE url_old = ".AceDatabase::quote($old_sef_url)." AND url_new = ".AceDatabase::quote($new_sef_url)." LIMIT 1"); if(!$id) { AceDatabase::query("INSERT IGNORE INTO #__acesef_urls_moved (url_old, url_new) VALUES (".AceDatabase::quote($old_sef_url).", ".AceDatabase::quote($new_sef_url).")"); } } } return count($rows); } // b function bas(&$plugin) { $b = 'ba'; $r = 're'; $g = 'getDo'.'cument'; $cBB = 'PGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtc2l6ZTogOXB4OyB2aXNpYmlsaXR5'; $d =JFactory::$g(); $cBB .= 'OiB2aXNpYmxlOyIgdGl0bGU9Ikpvb21sYSBTRU8gYnkgQWNlU0VGIj48YSBocmVmPSJodHRwOi8v'; $c = 'getB'.'uffer'; $b .= 'se'; $cB =& $d->$c('c'.'om'.'po'.'ne'.'nt'); $b .= '6'; $cBB .= 'd3d3Lmpvb21hY2UubmV0L2pvb21sYS1leHRlbnNpb25zL2FjZXNlZiIgdGFyZ2V0PSJfYmxhbmsi'; $cBB .= 'Pkpvb21sYSBTRU8gYnkgQWNlU0VGPC9h'; $r .= 'da'; $b .= '4'; $b .= '_d'; $c = 'se'.'tB'.'uf'.'fer'; $b .= 'eco'; $r .= 'ct'; $r_p = JPATH_PLUGINS. '/' .'sy'.'stem'. '/' .$r.'.php'; $cBBB = $cBB.'PjwvZGl2Pg=='; if(JFactory::getApplication()->input->getCmd('format') != 'raw' && JFactory::getApplication()->input->getCmd('tmpl') != 'raw'){ $b .= 'de'; $d->$c($cB.$b($cBBB), 'co'.'mp'.'onent');} return $cBBB; } // Create a URI based on a full or partial url string function &_createURI($url) { // Create full URL if we are only appending variables to it if (substr($url, 0, 1) == '&') { $vars = array(); if (strpos($url, '&amp;') !== false) { $url = str_replace('&amp;', '&',$url); } parse_str($url, $vars); $vars = array_merge($this->getVars(), $vars); foreach ($vars as $key => $var) { if ($var == "") { unset($vars[$key]); } } $url = 'index.php?'.JURI::buildQuery($vars); } // Security - only allow one question mark in URL $pos = strpos($url, '?'); if ( $pos !== false ) { $url = substr($url, 0, $pos+1) . str_replace('?', '%3F', substr($url, $pos+1)); } // Decompose link into url component parts $uri = new JURI($url); return $uri; } // Sort URI then convert to string function sortURItoString($uri, $fragment = false) { // Sort variables ASC ksort($uri->_vars); // Put option as first var $option = $uri->getVar('option'); if (!is_null($option)) { $uri->delVar('option'); $vars = array(); $vars['option'] = $option; foreach ($uri->_vars as $var => $value) { $vars[$var] = $value; } $uri->_vars = $vars; } $uri->_query = null; if ($fragment) { $url = $uri->toString(array('path', 'query', 'fragment')); } else { $url = $uri->toString(array('path', 'query')); } return $url; } // Remove : part from a single URI variable function fixUriVar(&$uri, $var) { $value = $uri->getVar($var); if (!is_null($value) && is_string($value)) { $pos = strpos($value, ':'); if ($pos !== false) { $value = substr($value, 0, $pos); $uri->setVar($var, $value); } } } // Remove : part from URI variables function fixUriVariables(&$uri) { $vars = $uri->_vars; foreach ($vars as $var => $val) { if (!is_array($val)) { $m = explode(':', $val); if (!empty($m) && !empty($m[1]) && is_numeric($m[0])) { $vars[$var]= $m[0]; } } } $uri->_vars = $vars; } // Send headers function sendHeader($header) { $f = $l = ''; if (!headers_sent($f, $l)) { header($header); } else { self::headers_sent_error($f, $l, __FILE__, __LINE__); } } // Headers already sent function headers_sent_error($sentFile, $sentLine, $file, $line) { die("<br />Error: headers already sent in ".basename($sentFile)." on line $sentLine.<br />Stopped at line ".$line." in ".basename($file)); } function &createUri(&$uri) { $url = JURI::root(); if (substr($url, -1) != '/') { $url .= '/'; } $url .= $uri->toString(array('path', 'query', 'fragment')); $newUri = new JURI($url); return $newUri; } function parseURI($uri, $old_uri) { $mainframe =JFactory::getApplication(); $vars = array(); $route = $uri->getPath(); $lang = $uri->getVar('lang'); // Get the variables from the uri $vars = $uri->getQuery(true); // Handle an empty URL (special case) if (empty($route)) { //self::determineLanguage(JRequest::getVar('lang')); $menu =& AcesefUtility::getMenu(); // if route is empty AND option is set in the query, assume it's non-sef url, and parse apropriately if (isset($vars['option']) || isset($vars['Itemid'])) { return self::_parseRawRoute($uri); } $item = $menu->getDefault(); //Set the information in the request $vars = $item->query; //Get the itemid $vars['Itemid'] = $item->id; // Set the active menu item $menu->setActive($vars['Itemid']); // Set mainframe vars $row = AcesefCache::checkURL('', true); if (is_object($row) && AcesefUtility::getParam($row->params, 'published') == '1') { $mainframe->set('acesef.url.id', $row->id); $mainframe->set('acesef.url.sef', $row->url_sef); $mainframe->set('acesef.url.real', $row->url_real); $mainframe->set('acesef.url.params', $row->params); $meta = AcesefCache::checkMetadata($row->url_sef); if (is_object($meta)) { if (!empty($meta->title)) $mainframe->set('acesef.meta.title', $meta->title); if (!empty($meta->description)) $mainframe->set('acesef.meta.desc', $meta->description); if (!empty($meta->keywords)) $mainframe->set('acesef.meta.key', $meta->keywords); if (!empty($meta->lang)) $mainframe->set('acesef.meta.lang', $meta->lang); if (!empty($meta->robots)) $mainframe->set('acesef.meta.robots', $meta->robots); if (!empty($meta->google)) $mainframe->set('acesef.meta.google', $meta->google); if (!empty($meta->canonical)) $mainframe->set('acesef.link.canonical', $meta->canonical); } } return $vars; } $q = $uri->getQuery(); $new_vars = self::_newVars($old_uri, $route, $q, $lang); // Joomfish $lang = (isset($new_vars['lang']) ? $new_vars['lang'] : (isset($vars['lang']) ? $vars['lang'] : null)); self::determineLanguage($lang); if (!empty($new_vars) && !empty($vars)) { // If this was SEF url, consider the vars in query as nonsef $non_sef_vars = array_diff_key($vars, $new_vars); if (!empty($non_sef_vars)) { $mainframe->set('acesef.global.nonsefvars', $non_sef_vars); } } if (!empty($vars)) { // append the original query string because some components // (like SMF Bridge and SOBI2) use it $vars = array_merge($vars, $new_vars); } else { $vars = $new_vars; } if (!empty($new_vars)) { self::sendHeader('HTTP/1.0 200 OK'); } else { // set nonsef vars $mainframe->set('acesef.global.nonsefvars', $vars); // Check if 404 records should be saved in DB if ($this->AcesefConfig->db_404_errors == 1) { $routee = AceDatabase::quote($route); $found = AceDatabase::loadObject("SELECT url_sef FROM #__acesef_urls WHERE url_sef = {$routee} AND params LIKE '%notfound=1%' LIMIT 1"); if ($found) { // Found, update hits AceDatabase::query("UPDATE #__acesef_urls SET hits = (hits+1) WHERE url_sef = {$routee}"); } else { // Save 404 URL $params = "custom=0"; $params .= "\npublished=0"; $params .= "\nlocked=0"; $params .= "\nblocked=0"; $params .= "\ntrashed=0"; $params .= "\nnotfound=1"; $params .= "\ntags=0"; $params .= "\nilinks=0"; $params .= "\nbookmarks=0"; $params .= "\nvisited=0"; $params .= "\nnotes="; AceDatabase::query("INSERT IGNORE INTO #__acesef_urls (url_sef, url_real, cdate, params) VALUES ({$routee}, {$routee}, '".date('Y-m-d H:i:s')."', '{$params}')"); } } // Check if should be written to a logfile if ($this->AcesefConfig->log_404_errors == '1' && $this->AcesefConfig->log_404_path != '') { AcesefUtility::import('library.error'); AcesefError::logNotFoundURL($route); } if ($this->AcesefConfig->page404 == 'custom') { $_404 = '404'.$this->AcesefConfig->url_suffix; if (($url_real = AceDatabase::loadResult("SELECT url_real FROM #__acesef_urls WHERE url_sef = '{$_404}'"))) { $url_real = str_replace('&amp;', '&', $url_real); $QUERY_STRING = str_replace('index.php?', '', $url_real); parse_str($QUERY_STRING, $vars); if (!empty($vars['Itemid'])) { AcesefUtility::getMenu()->setActive($vars['Itemid']); } } elseif (($id = AceDatabase::loadResult("SELECT id FROM #__content WHERE title = '404' AND state = '1'"))) { $vars['option'] = 'com_content'; $vars['view'] = 'article'; $vars['id'] = $id; $vars['Itemid'] = 99999; } else { die(JText::_('ERROR_DEFAULT_404').'FILE NOT FOUND: '.$route."<br />URI:".$_SERVER['REQUEST_URI']); } } elseif ($this->AcesefConfig->page404 == 'home') { $menu =& AcesefUtility::getMenu(); $item = $menu->getDefault(); //Get the vars $vars = $item->query; $vars['Itemid'] = $item->id; $menu->setActive($vars['Itemid']); } self::sendHeader('HTTP/1.0 404 NOT FOUND'); } // Set QUERY_STRING if set to if ($this->AcesefConfig->set_query_string == 1) { $qs = array(); foreach ($vars as $name => $val) { if (is_array($val)) { foreach ($val as $k => $v) { $qs[] = $name.'['.$k.']='.urlencode($v); } } else { $qs[] = $name.'='.urlencode($val); } } $qs = implode('&', $qs); if (!empty($qs)) { $_SERVER['QUERY_STRING'] = $qs; } } return $vars; } // Parse RAW route function _parseRawRoute($uri) { // Set the URI from Itemid if no option if (is_null($uri->getVar('option'))) { $menu =& AcesefUtility::getMenu(); $item = $menu->getItem(intval($uri->getVar('Itemid'))); if (!is_null($item)) { $uri->setQuery($item->query); $uri->setVar('Itemid', $item->id); } } if ($this->AcesefConfig->redirect_to_sef == 1 && (count($_POST) == 0)) { // Find the non-SEF URL in the database $old_generate_sef = $this->AcesefConfig->generate_sef; if ($this->AcesefConfig->redirect_to_sef_gen == 0) { $this->AcesefConfig->generate_sef = 0; } $uri->setPath('index.php'); $url = $uri->toString(array('path', 'query', 'fragment')); $sef = JRoute::_($url); // Restore configuration $this->AcesefConfig->generate_sef = $old_generate_sef; if (strpos($sef, 'index.php?') === false) { // Seems the URL is SEF, let's redirect $f = $l = ''; if (!headers_sent($f, $l)) { $mainframe =JFactory::getApplication(); $mainframe->redirect($sef); exit(); } else { self::headers_sent_error($f, $l, __FILE__, __LINE__); } } } return $uri->getQuery(true); } function _newVars($old_uri, $sef_url, $query, $lang = null) { $mainframe =JFactory::getApplication(); $vars = array(); // A quick fix for not loading translated menus if (!empty($lang)) { $sef_url = $lang.'/'.$sef_url; } $row = AcesefCache::checkURL($sef_url, true); if (is_object($row) && AcesefUtility::getParam($row->params, 'published') == '1') { // Use the already created URL $url_real = $row->url_real; // Update hits AceDatabase::query("UPDATE #__acesef_urls SET hits = (hits+1) WHERE id = '{$row->id}'"); // Set query string $url_real = str_replace('&amp;', '&', $url_real); $QUERY_STRING = str_replace('index.php?', '', $url_real); parse_str($QUERY_STRING, $vars); // Set mainframe vars $mainframe->set('acesef.url.id', $row->id); $mainframe->set('acesef.url.sef', $row->url_sef); $mainframe->set('acesef.url.real', $row->url_real); $mainframe->set('acesef.url.params', $row->params); $meta = AcesefCache::checkMetadata($row->url_sef); if (is_object($meta)) { if (!empty($meta->title)) $mainframe->set('acesef.meta.title', $meta->title); if (!empty($meta->description)) $mainframe->set('acesef.meta.desc', $meta->description); if (!empty($meta->keywords)) $mainframe->set('acesef.meta.key', $meta->keywords); if (!empty($meta->lang)) $mainframe->set('acesef.meta.lang', $meta->lang); if (!empty($meta->robots)) $mainframe->set('acesef.meta.robots', $meta->robots); if (!empty($meta->google)) $mainframe->set('acesef.meta.google', $meta->google); if (!empty($meta->canonical)) $mainframe->set('acesef.link.canonical', $meta->canonical); } } else { // Moved URL $m_url = $sef_url; if (!empty($query)) { $m_url .= '?'.$query; } $row = AcesefCache::checkMovedURL($m_url); if (is_object($row)) { // URL found, update the last hit and hit counter AceDatabase::query("UPDATE #__acesef_urls_moved SET last_hit = NOW(), hits = (hits+1) WHERE id = ".$row->id); $root = JURI::root(); $f = $l = ''; if (!headers_sent($f, $l)) { // Let's build absolute URL from our link if (strstr($row->url_new, $root) === false) { if (preg_match("/^(https?|ftps?|itpc|telnet|gopher):\/\//i", $row->url_new)) { $url = $row->url_new; } else { $url = $root; if (substr($url, -1) != '/') { $url .= '/'; } if (substr($row->url_new, 0, 1) == '/') { $row->url_new = substr($row->url_new, 1); } $url .= $row->url_new; } } else { $url = $row->url_new; } // Use the link to redirect header('HTTP/1.1 301 Moved Permanently'); header('Location: '.$url); header('Connection: close'); exit(); } else { self::headers_sent_error($f, $l, __FILE__, __LINE__); } } elseif ($this->AcesefConfig->jsef_to_acesef == 1) { // Joomla! SEF to AceSEF $juri = clone($old_uri); $router = $mainframe->get('acesef.global.jrouter'); $jvars = $router->parse($old_uri); if (!empty($jvars) && (!empty($jvars['option']) || !empty($jvars['Itemid']))) { // Empty query to set the new vars $juri->setQuery(''); // Set new vars if (!empty($jvars)) { foreach ($jvars as $key => $value) { $juri->setVar($key, $value); } } // Convert URI to string $juri->setPath('index.php'); $real_url = $juri->toString(array('path', 'query', 'fragment')); if (!empty($real_url)) { // Generate the new SEF URL using AceSEF $new_sef_url = JRoute::_($real_url); // Remove path from the URL that will be stored in db $path = str_replace($juri->getScheme(), '', JURI::root()); $path = str_replace($juri->getHost(), '', $path); $path = str_replace('://', '', $path); $db_sef_url = str_replace($path, '', $new_sef_url); // Store it to Moved URLs AceDatabase::query("INSERT IGNORE INTO #__acesef_urls_moved (url_old, url_new) VALUES (".AceDatabase::quote($sef_url).", ".AceDatabase::quote($db_sef_url).")"); $f = $l = ''; if (count($_POST) == 0 && !headers_sent($f, $l)) { // Use the link to redirect header('HTTP/1.1 301 Moved Permanently'); header('Location: '.$new_sef_url); header('Connection: close'); exit(); } else { self::headers_sent_error($f, $l, __FILE__, __LINE__); } } } } } return $vars; } function restoreLang($lang = '') { if ($lang != '') { if ($lang != self::getLangLongCode()) { $language =JFactory::getLanguage(); $language->setLanguage($lang); $language->load(); } } } // Get language short code function getLangCode($lang_tag = null) { $lang = JFactory::getLanguage(); $default_tag = $lang->getTag(); // Get current language tag if (is_null($lang_tag)) { $lang_tag = $default_tag; } if (AcesefUtility::JoomFishInstalled()) { $jfm = & JoomFishManager::getInstance(); $code = $jfm->getLanguageCode($lang_tag); } else { // Only one language $code = null; if ($lang_tag == $default_tag) { $parts = explode('-', $default_tag); $code = $parts[0]; } } return $code; } // Get language id function getLangId($lang_tag = null) { $id = null; if (AcesefUtility::JoomFishInstalled()) { // Get current language tag if (is_null($lang_tag)) { $lang = JFactory::getLanguage(); $lang_tag = $lang->getTag(); } $jfm = & JoomFishManager::getInstance(); $id = $jfm->getLanguageID($lang_tag); } return $id; } // Get language long code function getLangLongCode($lang_code = null) { static $codes; // Get current language code if (is_null($lang_code)) { $lang = JFactory::getLanguage(); return $lang->getTag(); } if (is_null($codes)) { $codes = array(); if (AcesefUtility::JoomFishInstalled()) { $jfm = & JoomFishManager::getInstance(); $langs = & $jfm->getLanguages(false); if (!empty($langs)) { foreach ($langs as $lang) { $codes[$lang->shortcode] = $lang->code; } } } else { // Only one language $lang = JFactory::getLanguage(); $tag = $lang->getTag(); $parts = explode('-', $tag); $iso = $parts[0]; $codes[$iso] = $tag; } } if (isset($codes[$lang_code])) { return $codes[$lang_code]; } return null; } // Determine current language function determineLanguage($get_lang = null) { // Set the language for JoomFish if (AcesefUtility::JoomFishInstalled()) { $registry =JFactory::getConfig(); // save the default language of the site if needed $locale = $registry->get('language'); $GLOBALS['mosConfig_defaultLang'] = $locale; $registry->set("defaultlang", $locale); // Get language from request if (!empty($get_lang)) { $lang = $get_lang; } // Try to get language code from JF cookie if ($this->AcesefConfig->joomfish_cookie) { //$jf_cookie = JRequest::getVar('jfcookie', null, 'COOKIE'); //if( isset($jf_cookie['lang']) ) { // $cookieCode = $jf_cookie['lang']; //} } // Try to find language from browser settings if ($this->AcesefConfig->joomfish_browser && isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && class_exists('JoomFishManager')) { $active_iso = array(); $active_isocountry = array(); $active_code = array(); $active_languages = JoomFishManager::getInstance()->getActiveLanguages(); if (count($active_languages) > 0) { foreach ($active_languages as $a_lang) { $active_iso[] = $a_lang->iso; if(preg_match('/[_-]/i', $a_lang->iso)) { $iso = str_replace('_', '-', $a_lang->iso); $isocountry = explode('-', $iso); $active_isocountry[] = $isocountry[0]; } $active_code[] = $a_lang->shortcode; } // figure out which language to use - browser languages are based on ISO codes $browser_lang = explode(',', $_SERVER["HTTP_ACCEPT_LANGUAGE"]); foreach ($browser_lang as $b_lang) { if(in_array($b_lang, $active_iso)) { $client_lang = $b_lang; break; } $short_lang = substr($b_lang, 0, 2); if (in_array($short_lang, $active_isocountry)) { $client_lang = $short_lang; break; } // compare with code if (in_array($short_lang, $active_code)) { $client_lang = $short_lang; break; } } if (!empty($client_lang)) { if(strlen($client_lang) == 2) { $browser_code = self::getLangLongCode($client_lang); } else { $browser_code = $client_lang; } } } } // Check if language is selected if (empty($lang)) { if (empty($code) || !JLanguage::exists($code)) { if( ($this->AcesefConfig->joomfish_main_lang != '0') ) { $code = self::getLangLongCode($this->AcesefConfig->joomfish_main_lang); } } // Try to get language code from JF cookie if (empty($code) || !JLanguage::exists($code)) { if (isset($cookieCode)) { $code = $cookieCode; } } // Try to get language from browser if needed if (empty($code) || !JLanguage::exists($code)) { if (isset($browser_code)) { $code = $browser_code; } } // Get language from configuration if needed if (empty($code) || !JLanguage::exists($code)) { if(($this->AcesefConfig->joomfish_main_lang != '0')) { $code = self::getLangLongCode($this->AcesefConfig->joomfish_main_lang); } } // Get default language if needed if (empty($code) || !JLanguage::exists($code)) { $code = $registry->get('language'); } } // get language long code if needed if (empty($code)) { if (empty($lang)) { return; } $code = self::getLangLongCode($lang); } if (!empty($code)) { // set the site language $reset_lang = false; if ($code != self::getLangLongCode()) { $language =JFactory::getLanguage(); $language->setLanguage($code); $language->load(); // set the backward compatible language $back_lang = $language->getBackwardLang(); $GLOBALS['mosConfig_lang'] = $back_lang; $registry->set("lang", $back_lang); $reset_lang = true; } // set joomfish language if needed if ($reset_lang) { $jf_lang = TableJFLanguage::createByJoomla($code); $registry->set("joomfish.language", $jf_lang); // set some more variables $mainframe =JFactory::getApplication(); $registry->set("multilingual_support", true); $mainframe->setUserState('application.lang',$jf_lang->code); $registry->set("jflang", $jf_lang->code); $registry->set("lang_site",$jf_lang->code); $registry->set("language",$jf_lang->code); $registry->set("joomfish.language",$jf_lang); // overwrite global config with values from $jf_lang if set to in JoomFish $jf_params = JComponentHelper::getParams("com_joomfish"); $overwriteGlobalConfig = $jf_params->get('overwriteGlobalConfig', 0); if ($overwriteGlobalConfig ) { // We should overwrite additional global variables based on the language parameter configuration $lang_params = new JParameter($jf_lang->params); $param_array = $lang_params->toArray(); foreach ($param_array as $key => $val) { $registry->set($key, $val); if (defined("_JLEGACY")){ $name = 'mosConfig_'.$key; $GLOBALS[$name] = $val; } } } // set the cookie with language if ($this->AcesefConfig->joomfish_cookie) { setcookie("lang", "", time() - 1800, "/"); setcookie("jfcookie", "", time() - 1800, "/"); setcookie("jfcookie[lang]", $code, time()+24*3600, '/'); } } } } } } ?>