/plugins/system/backlink.php
PHP | 529 lines | 396 code | 61 blank | 72 comment | 135 complexity | ad85f415e2222e2fd1530aae5b15f96b MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause, GPL-2.0, LGPL-2.1
- <?php
- /**
- * @version $Id: backlink.php 14401 2010-01-26 14:10:00Z louis $
- * @package Joomla
- * @copyright Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
- * @license GNU/GPL, see LICENSE.php
- * Joomla! is free software. This version may have been modified pursuant
- * to the GNU General Public License, and as distributed it includes or
- * is derivative of works licensed under the GNU General Public License or
- * other free or open source software licenses.
- * See COPYRIGHT.php for copyright notices and details.
- */
- // no direct access
- defined('_JEXEC') or die('Restricted access');
- jimport('joomla.application.menu');
- jimport( 'joomla.plugin.plugin' );
- class plgSystemBacklink extends JPlugin
- {
- var $_db = null;
- /**
- * Constructor
- *
- * For php4 compatability we must not use the __constructor as a constructor for plugins
- * because func_get_args ( void ) returns a copy of all passed arguments NOT references.
- * This causes problems with cross-referencing necessary for the observer design pattern.
- *
- * @access protected
- * @param object $subject The object to observe
- * @param array $config An array that holds the plugin configuration
- * @since 1.0
- */
- function plgSystemBacklink(& $subject, $config)
- {
- $this->_db = JFactory::getDBO();
- parent :: __construct($subject, $config);
- }
- function onAfterInitialise()
- {
- global $mainframe;
- if ($mainframe->isAdmin()) {
- return; // Dont run in admin
- }
- $sef = $this->params->get('sef', 1);
- $url = $this->params->get('url', 1);
- $legacysef = $this->params->get('legacysef', 1);
- if (!$sef && !$url && !$legacysef)
- return; // None of the options enabled, bail!
- // Grab the system as early as possible, we're going to terminate it potentially
- // Case 1: Query string match (shouldn't need this but its here anyway)
- if ($url && isset ($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) && strpos($_SERVER['QUERY_STRING'], '&')) {
- $query_string = $_SERVER['QUERY_STRING'];
- $this->_lookup($query_string);
- }
- // Case 2: SEF or similar match
- if ($sef && isset ($_SERVER['SCRIPT_NAME']) && isset ($_SERVER['REQUEST_URI'])) {
- $part = str_replace('index.php', '', $_SERVER['SCRIPT_NAME']);
- if($part != '/') {
- $search = str_replace($part, '', $_SERVER['REQUEST_URI']);
- } else {
- $search = ltrim($_SERVER['REQUEST_URI'],'/');
- }
- $this->_lookup($search);
- }
- // Case 3: Old school core sef; used to backlink
- // Enable only if:
- // 1: SEF is enabled
- // 2: Legacy SEF Plugin Param is set
- // 3: And there is no backlink
- if ($mainframe->getCfg('sef')
- && $legacysef
- && !strstr($_SERVER['REQUEST_URI'],'nobacklink')
- && !strlen($_SERVER['QUERY_STRING'])) {
- $this->_legacysef();
- }
- }
- function _lookup($searchstring)
- {
- // return blank strings and just index.php on its own...
- if (!strlen($searchstring) || $searchstring == trim('index.php',' ?')) {
- return;
- }
- $sef = $this->params->get('sef', 1);
- $url = $this->params->get('url', 1);
- if (!$sef && !$url) {
- return; // Neither option enabled, bail!
- }
- $query = 'SELECT * FROM #__migration_backlinks WHERE ';
- $where = Array ();
- $search = $this->_db->Quote( $this->_db->getEscaped( $searchstring, true ).'%', false );
- if ($url) {
- $where[] = 'url LIKE ' . $search;
- }
- if ($sef) {
- $where[] = 'sefurl LIKE ' . $search;
- }
- $query .= implode(' OR ', $where);
- $this->_db->setQuery($query);
- $results = $this->_db->loadAssocList();
- if (count($results)) {
- // Get the first one...
- $this->_redirect($results[0]['itemid'], $results[0]['name'], $results[0]['newurl']);
- }
- }
- function _redirect($Itemid, $name, $url = null)
- {
- global $mainframe;
- if (!strlen($url))
- {
- $menu = & JSite :: getMenu();
- $item = $menu->getItem($Itemid);
- //$url = $item->link;
- switch ($item->type)
- {
- case 'url' :
- if ((strpos($item->link, 'index.php?') !== false) && (strpos($item->link, 'Itemid=') === false)) {
- $url = $item->link . '&Itemid=' . $item->id;
- } else {
- $url = $item->link;
- }
- break;
- default :
- $url = 'index.php?Itemid=' . $item->id;
- //$url = $item->link . '&Itemid='.$item->id;
- break;
- }
- $url = JRoute :: _($url);
- //$url = JURI :: base() . $url; // was $surl with third option of below being url and second being surl
- $name = $item->name;
- }
- // Check we're not redirecting to ourselves
- if(!stristr($url,$_SERVER['REQUEST_URI']) && !stristr($url,$_SERVER['SCRIPT_NAME'].'/'.$_SERVER['QUERY_STRING'])) {
- return;
- }
- $name = $name ? $name : "Unknown";
- header('Location: ' . str_replace('&','&',$url), true, '301'); // redirect and kill of and &
- jexit(JText :: sprintf('"%s" has moved to <a href="%s">%s</a>. Click the link if your browser does not redirect you automatically.', $name, $url, $url));
- }
- function _legacysef()
- {
- $mosConfig_absolute_path = JPATH_SITE;
- $mosConfig_live_site = JURI :: base();
- $url_array = explode('/', $_SERVER['REQUEST_URI']);
- if (in_array('content', $url_array))
- {
- /**
- * Content
- * http://www.domain.com/$option/$task/$sectionid/$id/$Itemid/$limit/$limitstart
- */
- $uri = explode('content/', $_SERVER['REQUEST_URI']);
- $option = 'com_content';
- $_GET['option'] = $option;
- $_REQUEST['option'] = $option;
- $pos = array_search('content', $url_array);
- // language hook for content
- $lang = '';
- foreach ($url_array as $key => $value)
- {
- if (!strcasecmp(substr($value, 0, 5), 'lang,'))
- {
- $temp = explode(',', $value);
- if (isset ($temp[0]) && $temp[0] != '' && isset ($temp[1]) && $temp[1] != '')
- {
- $_GET['lang'] = $temp[1];
- $_REQUEST['lang'] = $temp[1];
- $lang = $temp[1];
- }
- unset ($url_array[$key]);
- }
- }
- if (isset ($url_array[$pos +8]) && $url_array[$pos +8] != '' && in_array('category', $url_array) && (strpos($url_array[$pos +5], 'order,') !== false) && (strpos($url_array[$pos +6], 'filter,') !== false))
- {
- // $option/$task/$sectionid/$id/$Itemid/$order/$filter/$limit/$limitstart
- $task = $url_array[$pos +1];
- $sectionid = $url_array[$pos +2];
- $id = $url_array[$pos +3];
- $Itemid = $url_array[$pos +4];
- $order = str_replace('order,', '', $url_array[$pos +5]);
- $filter = str_replace('filter,', '', $url_array[$pos +6]);
- $limit = $url_array[$pos +7];
- $limitstart = $url_array[$pos +8];
- // pass data onto global variables
- $_GET['task'] = $task;
- $_REQUEST['task'] = $task;
- $_GET['sectionid'] = $sectionid;
- $_REQUEST['sectionid'] = $sectionid;
- $_GET['id'] = $id;
- $_REQUEST['id'] = $id;
- $_GET['Itemid'] = $Itemid;
- $_REQUEST['Itemid'] = $Itemid;
- $_GET['order'] = $order;
- $_REQUEST['order'] = $order;
- $_GET['filter'] = $filter;
- $_REQUEST['filter'] = $filter;
- $_GET['limit'] = $limit;
- $_REQUEST['limit'] = $limit;
- $_GET['limitstart'] = $limitstart;
- $_REQUEST['limitstart'] = $limitstart;
- $QUERY_STRING = "option=com_content&task=$task§ionid=$sectionid&id=$id&Itemid=$Itemid&order=$order&filter=$filter&limit=$limit&limitstart=$limitstart";
- }
- else if (isset ($url_array[$pos +7]) && $url_array[$pos +7] != '' && $url_array[$pos +5] > 1000 && (in_array('archivecategory', $url_array) || in_array('archivesection', $url_array)))
- {
- // $option/$task/$id/$limit/$limitstart/year/month/module
- $task = $url_array[$pos +1];
- $id = $url_array[$pos +2];
- $limit = $url_array[$pos +3];
- $limitstart = $url_array[$pos +4];
- $year = $url_array[$pos +5];
- $month = $url_array[$pos +6];
- $module = $url_array[$pos +7];
- // pass data onto global variables
- $_GET['task'] = $task;
- $_REQUEST['task'] = $task;
- $_GET['id'] = $id;
- $_REQUEST['id'] = $id;
- $_GET['limit'] = $limit;
- $_REQUEST['limit'] = $limit;
- $_GET['limitstart'] = $limitstart;
- $_REQUEST['limitstart'] = $limitstart;
- $_GET['year'] = $year;
- $_REQUEST['year'] = $year;
- $_GET['month'] = $month;
- $_REQUEST['month'] = $month;
- $_GET['module'] = $module;
- $_REQUEST['module'] = $module;
- $QUERY_STRING = "option=com_content&task=$task&id=$id&limit=$limit&limitstart=$limitstart&year=$year&month=$month&module=$module";
- }
- else if (isset ($url_array[$pos +7]) && $url_array[$pos +7] != '' && $url_array[$pos +6] > 1000 && (in_array('archivecategory', $url_array) || in_array('archivesection', $url_array)))
- {
- // $option/$task/$id/$Itemid/$limit/$limitstart/year/month
- $task = $url_array[$pos +1];
- $id = $url_array[$pos +2];
- $Itemid = $url_array[$pos +3];
- $limit = $url_array[$pos +4];
- $limitstart = $url_array[$pos +5];
- $year = $url_array[$pos +6];
- $month = $url_array[$pos +7];
- // pass data onto global variables
- $_GET['task'] = $task;
- $_REQUEST['task'] = $task;
- $_GET['id'] = $id;
- $_REQUEST['id'] = $id;
- $_GET['Itemid'] = $Itemid;
- $_REQUEST['Itemid'] = $Itemid;
- $_GET['limit'] = $limit;
- $_REQUEST['limit'] = $limit;
- $_GET['limitstart'] = $limitstart;
- $_REQUEST['limitstart'] = $limitstart;
- $_GET['year'] = $year;
- $_REQUEST['year'] = $year;
- $_GET['month'] = $month;
- $_REQUEST['month'] = $month;
- $QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart&year=$year&month=$month";
- }
- else if (isset ($url_array[$pos +7]) && $url_array[$pos +7] != '' && in_array('category', $url_array) && (strpos($url_array[$pos +5], 'order,') !== false))
- {
- // $option/$task/$sectionid/$id/$Itemid/$order/$limit/$limitstart
- $task = $url_array[$pos +1];
- $sectionid = $url_array[$pos +2];
- $id = $url_array[$pos +3];
- $Itemid = $url_array[$pos +4];
- $order = str_replace('order,', '', $url_array[$pos +5]);
- $limit = $url_array[$pos +6];
- $limitstart = $url_array[$pos +7];
- // pass data onto global variables
- $_GET['task'] = $task;
- $_REQUEST['task'] = $task;
- $_GET['sectionid'] = $sectionid;
- $_REQUEST['sectionid'] = $sectionid;
- $_GET['id'] = $id;
- $_REQUEST['id'] = $id;
- $_GET['Itemid'] = $Itemid;
- $_REQUEST['Itemid'] = $Itemid;
- $_GET['order'] = $order;
- $_REQUEST['order'] = $order;
- $_GET['limit'] = $limit;
- $_REQUEST['limit'] = $limit;
- $_GET['limitstart'] = $limitstart;
- $_REQUEST['limitstart'] = $limitstart;
- $QUERY_STRING = "option=com_content&task=$task§ionid=$sectionid&id=$id&Itemid=$Itemid&order=$order&limit=$limit&limitstart=$limitstart";
- }
- else if (isset ($url_array[$pos +6]) && $url_array[$pos +6] != '')
- {
- // $option/$task/$sectionid/$id/$Itemid/$limit/$limitstart
- $task = $url_array[$pos +1];
- $sectionid = $url_array[$pos +2];
- $id = $url_array[$pos +3];
- $Itemid = $url_array[$pos +4];
- $limit = $url_array[$pos +5];
- $limitstart = $url_array[$pos +6];
- // pass data onto global variables
- $_GET['task'] = $task;
- $_REQUEST['task'] = $task;
- $_GET['sectionid'] = $sectionid;
- $_REQUEST['sectionid'] = $sectionid;
- $_GET['id'] = $id;
- $_REQUEST['id'] = $id;
- $_GET['Itemid'] = $Itemid;
- $_REQUEST['Itemid'] = $Itemid;
- $_GET['limit'] = $limit;
- $_REQUEST['limit'] = $limit;
- $_GET['limitstart'] = $limitstart;
- $_REQUEST['limitstart'] = $limitstart;
- $QUERY_STRING = "option=com_content&task=$task§ionid=$sectionid&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart";
- }
- else if (isset ($url_array[$pos +5]) && $url_array[$pos +5] != '')
- {
- // $option/$task/$id/$Itemid/$limit/$limitstart
- $task = $url_array[$pos +1];
- $id = $url_array[$pos +2];
- $Itemid = $url_array[$pos +3];
- $limit = $url_array[$pos +4];
- $limitstart = $url_array[$pos +5];
- // pass data onto global variables
- $_GET['task'] = $task;
- $_REQUEST['task'] = $task;
- $_GET['id'] = $id;
- $_REQUEST['id'] = $id;
- $_GET['Itemid'] = $Itemid;
- $_REQUEST['Itemid'] = $Itemid;
- $_GET['limit'] = $limit;
- $_REQUEST['limit'] = $limit;
- $_GET['limitstart'] = $limitstart;
- $_REQUEST['limitstart'] = $limitstart;
- $QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart";
- }
- else if (isset ($url_array[$pos +4]) && $url_array[$pos +4] != '' && (in_array('archivecategory', $url_array) || in_array('archivesection', $url_array)))
- {
- // $option/$task/$year/$month/$module
- $task = $url_array[$pos +1];
- $year = $url_array[$pos +2];
- $month = $url_array[$pos +3];
- $module = $url_array[$pos +4];
- // pass data onto global variables
- $_GET['task'] = $task;
- $_REQUEST['task'] = $task;
- $_GET['year'] = $year;
- $_REQUEST['year'] = $year;
- $_GET['month'] = $month;
- $_REQUEST['month'] = $month;
- $_GET['module'] = $module;
- $_REQUEST['module'] = $module;
- $QUERY_STRING = "option=com_content&task=$task&year=$year&month=$month&module=$module";
- }
- else if (!(isset ($url_array[$pos +5]) && $url_array[$pos +5] != '') && isset ($url_array[$pos +4]) && $url_array[$pos +4] != '')
- {
- // $option/$task/$sectionid/$id/$Itemid
- $task = $url_array[$pos +1];
- $sectionid = $url_array[$pos +2];
- $id = $url_array[$pos +3];
- $Itemid = $url_array[$pos +4];
- // pass data onto global variables
- $_GET['task'] = $task;
- $_REQUEST['task'] = $task;
- $_GET['sectionid'] = $sectionid;
- $_REQUEST['sectionid'] = $sectionid;
- $_GET['id'] = $id;
- $_REQUEST['id'] = $id;
- $_GET['Itemid'] = $Itemid;
- $_REQUEST['Itemid'] = $Itemid;
- $QUERY_STRING = "option=com_content&task=$task§ionid=$sectionid&id=$id&Itemid=$Itemid";
- }
- else if (!(isset ($url_array[$pos +4]) && $url_array[$pos +4] != '') && (isset ($url_array[$pos +3]) && $url_array[$pos +3] != ''))
- {
- // $option/$task/$id/$Itemid
- $task = $url_array[$pos +1];
- $id = $url_array[$pos +2];
- $Itemid = $url_array[$pos +3];
- // pass data onto global variables
- $_GET['task'] = $task;
- $_REQUEST['task'] = $task;
- $_GET['id'] = $id;
- $_REQUEST['id'] = $id;
- $_GET['Itemid'] = $Itemid;
- $_REQUEST['Itemid'] = $Itemid;
- $QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid";
- }
- else if (!(isset ($url_array[$pos +3]) && $url_array[$pos +3] != '') && (isset ($url_array[$pos +2]) && $url_array[$pos +2] != ''))
- {
- // $option/$task/$id
- $task = $url_array[$pos +1];
- $id = $url_array[$pos +2];
- // pass data onto global variables
- $_GET['task'] = $task;
- $_REQUEST['task'] = $task;
- $_GET['id'] = $id;
- $_REQUEST['id'] = $id;
- $QUERY_STRING = "option=com_content&task=$task&id=$id";
- }
- else if (!(isset ($url_array[$pos +2]) && $url_array[$pos +2] != '') && (isset ($url_array[$pos +1]) && $url_array[$pos +1] != ''))
- {
- // $option/$task
- $task = $url_array[$pos +1];
- $_GET['task'] = $task;
- $_REQUEST['task'] = $task;
- $QUERY_STRING = 'option=com_content&task=' . $task;
- }
- if ($lang != '') {
- $QUERY_STRING .= '&lang=' . $lang;
- }
- $_SERVER['QUERY_STRING'] = $QUERY_STRING;
- $REQUEST_URI = $uri[0] . 'index.php?' . $QUERY_STRING;
- $_SERVER['REQUEST_URI'] = $REQUEST_URI;
- }
- else if (in_array('component', $url_array))
- {
- $name = 'component';
- /*
- Components
- http://www.domain.com/component/$name,$value
- */
- $uri = explode('component/', $_SERVER['REQUEST_URI']);
- $uri_array = explode('/', $uri[1]);
- $QUERY_STRING = '';
- // needed for check if component exists
- $path = $mosConfig_absolute_path . '/components';
- $dirlist = array ();
- if (is_dir($path))
- {
- $base = opendir($path);
- while (false !== ($dir = readdir($base)))
- {
- if ($dir !== '.' && $dir !== '..' && is_dir($path . '/' . $dir) && strtolower($dir) !== 'cvs' && strtolower($dir) !== '.svn') {
- $dirlist[] = $dir;
- }
- }
- closedir($base);
- }
- foreach ($uri_array as $value)
- {
- $temp = explode(',', $value);
- if (isset ($temp[0]) && $temp[0] != '' && isset ($temp[1]) && $temp[1] != '')
- {
- $_GET[$temp[0]] = $temp[1];
- $_REQUEST[$temp[0]] = $temp[1];
- // check to ensure component actually exists
- if ($temp[0] == 'option')
- {
- $check = '';
- if (count($dirlist)) {
- foreach ($dirlist as $dir) {
- if ($temp[1] == $dir) {
- $check = 1;
- break;
- }
- }
- }
- // redirect to 404 page if no component found to match url
- if (!$check)
- {
- header('HTTP/1.0 404 Not Found');
- require_once ($mosConfig_absolute_path . '/templates/404.php');
- exit (404);
- }
- }
- if ($QUERY_STRING == '') {
- $QUERY_STRING .= "$temp[0]=$temp[1]";
- } else {
- $QUERY_STRING .= "&$temp[0]=$temp[1]";
- }
- }
- }
- $_SERVER['QUERY_STRING'] = $QUERY_STRING;
- $REQUEST_URI = $uri[0] . 'index.php?' . $QUERY_STRING;
- $_SERVER['REQUEST_URI'] = $REQUEST_URI;
- }
- // let this go through and the rest of the system should handle it properly
- }
- }