2631 lines
104 KiB
PHP
2631 lines
104 KiB
PHP
|
|
<?php
|
|||
|
|
/**
|
|||
|
|
* SEF module for Joomla!
|
|||
|
|
* Originally written for Mambo as 404SEF by W. H. Welch.
|
|||
|
|
*
|
|||
|
|
* @author $Author: shumisha $
|
|||
|
|
* @copyright Yannick Gaultier - 2007
|
|||
|
|
* @package sh404SEF
|
|||
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
|
|||
|
|
* @version $Id: sh404sef.class.php 764 2008-10-03 20:47:22Z silianacom-svn $
|
|||
|
|
* {shSourceVersionTag: Version x - 2007-09-20}
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
// Security check to ensure this file is being included by a parent file.
|
|||
|
|
if (!defined('_VALID_MOS')) die('Direct Access to this location is not allowed.');
|
|||
|
|
|
|||
|
|
DEFINE ('sh404SEF_URLTYPE_404', -2);
|
|||
|
|
DEFINE ('sh404SEF_URLTYPE_NONE', -1);
|
|||
|
|
DEFINE ('sh404SEF_URLTYPE_AUTO', 0);
|
|||
|
|
DEFINE ('sh404SEF_URLTYPE_CUSTOM', 1);
|
|||
|
|
DEFINE ('sh404SEF_MAX_SEF_URL_LENGTH', 255);
|
|||
|
|
|
|||
|
|
DEFINE ('sh404SEF_HOMEPAGE_CODE', 'index.php?'.md5('sh404SEF Homepage url code'));
|
|||
|
|
|
|||
|
|
DEFINE ('SH404SEF_STANDARD_ADMIN', 1); // define possible levels for adminstration complexity
|
|||
|
|
DEFINE ('SH404SEF_ADVANCED_ADMIN', 2);
|
|||
|
|
|
|||
|
|
if (!defined('sh404SEF_ADMIN_ABS_PATH')) {
|
|||
|
|
define('sh404SEF_ADMIN_ABS_PATH', str_replace('\\','/',dirname(__FILE__)).'/');
|
|||
|
|
}
|
|||
|
|
if (!defined('sh404SEF_ABS_PATH')) {
|
|||
|
|
define('sh404SEF_ABS_PATH', str_replace( '/administrator/components/com_sef', '', sh404SEF_ADMIN_ABS_PATH) );
|
|||
|
|
}
|
|||
|
|
if (!defined('sh404SEF_FRONT_ABS_PATH')) {
|
|||
|
|
define('sh404SEF_FRONT_ABS_PATH', sh404SEF_ABS_PATH.'components/com_sef/');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class shMosSEF extends mosDBTable
|
|||
|
|
{
|
|||
|
|
/** @var int */
|
|||
|
|
var $id = null;
|
|||
|
|
/** @var int */
|
|||
|
|
var $cpt = null;
|
|||
|
|
/** @var int */
|
|||
|
|
var $rank = null;
|
|||
|
|
/** @var string */
|
|||
|
|
var $oldurl = null;
|
|||
|
|
/** @var string */
|
|||
|
|
var $newurl = null;
|
|||
|
|
/** @var tinyint */
|
|||
|
|
/** @var date */
|
|||
|
|
var $dateadd = null;
|
|||
|
|
|
|||
|
|
function shMosSEF( &$_db ) {
|
|||
|
|
$this->mosDBTable( '#__redirection', 'id', $_db );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function check() {
|
|||
|
|
//initialize
|
|||
|
|
$this->_error = null;
|
|||
|
|
$this->oldurl = trim($this->oldurl);
|
|||
|
|
$this->newurl = trim($this->newurl);
|
|||
|
|
// check for valid URLs
|
|||
|
|
if (($this->oldurl == '')||($this->newurl == '')){
|
|||
|
|
$this->_error .= _COM_SEF_EMPTYURL;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (eregi("^\/", $this->oldurl)) {
|
|||
|
|
$this->_error .= _COM_SEF_NOLEADSLASH;
|
|||
|
|
}
|
|||
|
|
if ((eregi("^index.php", $this->newurl)) === false ) {
|
|||
|
|
$this->_error .= _COM_SEF_BADURL;
|
|||
|
|
}
|
|||
|
|
// V 1.2.4.t remove this check. We check for pre-existing non-sef instead of SEF
|
|||
|
|
if (is_null($this->_error)) {
|
|||
|
|
// check for existing URLS
|
|||
|
|
$this->_db->setQuery( "SELECT id,oldurl FROM #__redirection WHERE `newurl` LIKE '".$this->newurl."'");
|
|||
|
|
$this->_db->loadObject($xid);
|
|||
|
|
// V 1.3.1 don't raise error if both newurl and old url are same. It means we may have changed alias list
|
|||
|
|
if ($xid && $xid->id != intval( $this->id )) {
|
|||
|
|
$this->_error = _COM_SEF_URLEXIST;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
$identical = $xid->id == intval( $this->id ) && $xid->oldurl == $this->oldurl;
|
|||
|
|
return $identical ? 'identical' : true;
|
|||
|
|
}else{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class sh404SEFMeta extends mosDBTable
|
|||
|
|
{
|
|||
|
|
/** @var int */
|
|||
|
|
var $id = null;
|
|||
|
|
/** @var string */
|
|||
|
|
var $newurl = null;
|
|||
|
|
/** @var string */
|
|||
|
|
var $metadesc = null;
|
|||
|
|
/** @var string */
|
|||
|
|
var $metakey = null;
|
|||
|
|
/** @var string */
|
|||
|
|
var $metatitle = null;
|
|||
|
|
/** @var string */
|
|||
|
|
var $metalang = null;
|
|||
|
|
/** @var string */
|
|||
|
|
var $metarobots = null;
|
|||
|
|
|
|||
|
|
function sh404SEFMeta( &$_db ) {
|
|||
|
|
$this->mosDBTable( '#__sh404SEF_meta', 'id', $_db );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function check() {
|
|||
|
|
//initialize
|
|||
|
|
$this->_error = null;
|
|||
|
|
$this->newurl = trim($this->newurl);
|
|||
|
|
$this->metadesc = trim($this->metadesc);
|
|||
|
|
$this->metakey = trim($this->metakey);
|
|||
|
|
$this->metatitle = trim($this->metatitle);
|
|||
|
|
$this->metalang = trim($this->metalang);
|
|||
|
|
$this->metarobots = trim($this->metarobots);
|
|||
|
|
// check for valid URLs
|
|||
|
|
if ($this->newurl == ''){
|
|||
|
|
$this->_error .= _COM_SEF_EMPTYURL;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ((eregi("^index.php", $this->newurl)) === false ) {
|
|||
|
|
$this->_error .= _COM_SEF_BADURL;
|
|||
|
|
}
|
|||
|
|
if (is_null($this->_error)) {
|
|||
|
|
// check for existing URLS
|
|||
|
|
$this->_db->setQuery( "SELECT id FROM #__sh404SEF_meta WHERE `newurl` LIKE '".$this->newurl."'");
|
|||
|
|
$xid = intval( $this->_db->loadResult() );
|
|||
|
|
if ($xid && $xid != intval( $this->id )) {
|
|||
|
|
$this->_error = _COM_SEF_URLEXIST;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}else{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class SEFConfig {
|
|||
|
|
|
|||
|
|
/* string, version number */
|
|||
|
|
var $version = '1.3.9 - build_357 - Joomla - <a href="http://extensions.siliana.com/">extensions.Siliana.com</a>';
|
|||
|
|
/* boolean, is 404 SEF enabled */
|
|||
|
|
var $Enabled = false;
|
|||
|
|
/* char, Character to use for url replacement */
|
|||
|
|
var $replacement = '-';
|
|||
|
|
/* char, Character to use for page spacer */
|
|||
|
|
var $pagerep = '-';
|
|||
|
|
/* strip these characters */
|
|||
|
|
var $stripthese = ',|~|!|@|%|^|(|)|<|>|:|;|{|}|[|]|&|`|<7C>|<7C>|<7C>|<7C>|<7C>|<7C>|<7C>|<7C>|<7C>|<7C>|<7C>|<7C>'; // V 1.2.4.s removed *, breaks Bookmarks
|
|||
|
|
/* characters replacement table v 1.2.4.f April 4, 2007*/
|
|||
|
|
var $shReplacements = '<27>|S, <20>|O, <20>|Z, <20>|s, <20>|oe, <20>|z, <20>|Y, <20>|Y, <20>|u, <20>|A, <20>|A, <20>|A, <20>|A, <20>|A, <20>|A, <20>|A, <20>|C, <20>|E, <20>|E, <20>|E, <20>|E, <20>|I, <20>|I, <20>|I, <20>|I, <20>|D, <20>|N, <20>|O, <20>|O, <20>|O, <20>|O, <20>|O, <20>|O, <20>|U, <20>|U, <20>|U, <20>|U, <20>|Y, <20>|s, <20>|a, <20>|a, <20>|a, <20>|a, <20>|a, <20>|a, <20>|a, <20>|c, <20>|e, <20>|e, <20>|e, <20>|e, <20>|i, <20>|i, <20>|i, <20>|i, <20>|o, <20>|n, <20>|o, <20>|o, <20>|o, <20>|o, <20>|o, <20>|o, <20>|u, <20>|u, <20>|u, <20>|u, <20>|y, <20>|y, <20>|ss';
|
|||
|
|
/* string, suffix for "files" */
|
|||
|
|
var $suffix = '.html';
|
|||
|
|
/* string, file to display when there is none */
|
|||
|
|
var $addFile = '';
|
|||
|
|
/* trims friendly characters from where they shouldn't be */
|
|||
|
|
var $friendlytrim = '-|.';
|
|||
|
|
/* boolean, convert url to lowercase */
|
|||
|
|
var $LowerCase = false;
|
|||
|
|
/* boolean, include the section name in url */
|
|||
|
|
var $ShowSection = false;
|
|||
|
|
/* boolean, exclude the category name in url */
|
|||
|
|
var $ShowCat = true;
|
|||
|
|
/* boolean, use the title_alias instead of the title */
|
|||
|
|
var $UseAlias = true;
|
|||
|
|
/* int, id of #__content item to use for static page */
|
|||
|
|
var $page404 = 0;
|
|||
|
|
/* Array, contains predefined components. */
|
|||
|
|
var $predefined = array(
|
|||
|
|
//'contact',
|
|||
|
|
'frontpage',
|
|||
|
|
//'login',
|
|||
|
|
//'newsfeeds',
|
|||
|
|
//'search',
|
|||
|
|
'sef'//,
|
|||
|
|
//'weblinks'
|
|||
|
|
);
|
|||
|
|
/* Array, contains components 404 SEF will ignore. */
|
|||
|
|
var $skip = array();
|
|||
|
|
/* Array, contains components 404 SEF will not add to the DB.
|
|||
|
|
* default style URLs will be generated for these components instead
|
|||
|
|
*/
|
|||
|
|
var $nocache = array('events');
|
|||
|
|
// shumisha : additional parameters
|
|||
|
|
/* Array, contains components 404 SEF will override their own sef_ext file if it has its own plugin. */
|
|||
|
|
var $shDoNotOverrideOwnSef = array();
|
|||
|
|
/* boolean, true (default) to log 404 errors to DB, false otherwise */
|
|||
|
|
var $shLog404Errors = true;
|
|||
|
|
/* boolean, true (default) to use in mem cache, false to disable */
|
|||
|
|
var $shUseURLCache = true;
|
|||
|
|
/* integer, max number of URL couple (sef + non-sef url) allowed in cache */
|
|||
|
|
var $shMaxURLInCache = 10000;
|
|||
|
|
/* boolean, true (default) to translate texts in URL */
|
|||
|
|
var $shTranslateURL = true;
|
|||
|
|
/* boolean, true (default) will always insert language iso code in URL (for other than default language) */
|
|||
|
|
var $shInsertLanguageCode = true;
|
|||
|
|
/* Array, contains components sh404SEF will NOT translate URLs */
|
|||
|
|
var $notTranslateURLList = array(); // V 1.2.4.m
|
|||
|
|
/* Array, contains components sh404SEF will NOT insert iso code in URL */
|
|||
|
|
var $notInsertIsoCodeList = array();
|
|||
|
|
// cache management
|
|||
|
|
/* boolean, true if insert Itemid of menu item is none exists */
|
|||
|
|
var $shInsertGlobalItemidIfNone = true;
|
|||
|
|
/* boolean, if true insert title of menu item if no Itemid exists for the URL*/
|
|||
|
|
var $shInsertTitleIfNoItemid = false;
|
|||
|
|
/* boolean, true if always insert title of menu item. URL Itemid is used, if any, or menu item title*/
|
|||
|
|
var $shAlwaysInsertMenuTitle= false;
|
|||
|
|
/* boolean, true if always append Itemid of non-sef URL (or of current menu item if none) to SEF URL */
|
|||
|
|
var $shAlwaysInsertItemid= false; // v 1.2.4.f
|
|||
|
|
/* string, default menu name, to be used if $shAlwaysInsertMenuTitle is true, to override menu title */
|
|||
|
|
var $shDefaultMenuItemName = '';
|
|||
|
|
/* boolean, if true, Getvars not used in URl will be reappend to it */
|
|||
|
|
var $shAppendRemainingGETVars = true;
|
|||
|
|
|
|||
|
|
// virtuemart management
|
|||
|
|
/* boolean, true if always insert title of shop menu item */
|
|||
|
|
var $shVmInsertShopName= false;
|
|||
|
|
/* boolean, if true, product ID will be prepended to product name */
|
|||
|
|
var $shInsertProductId = false;
|
|||
|
|
/* boolean, if true, product sku will be used instead of name */
|
|||
|
|
var $shVmUseProductSKU = false;
|
|||
|
|
/* boolean, if true, product Manufacturer name will be included in URL */
|
|||
|
|
var $shVmInsertManufacturerName = false;
|
|||
|
|
/* boolean, if true, product if will be prepended to manufacturer name */
|
|||
|
|
var $shInsertManufacturerId = false;
|
|||
|
|
/* integer, if 0, no categories will be inserted in URL for a product
|
|||
|
|
if 1, only 'last' category will be inserted in URL
|
|||
|
|
if 2, all nested categories will be inserted in URL */
|
|||
|
|
var $shVMInsertCategories = 1;
|
|||
|
|
|
|||
|
|
/* boolean, if true, an additional text will be appended to sef URl when browsing categories
|
|||
|
|
* ie : .../product_cat/view-all-products.html VS .../product_cat/ */
|
|||
|
|
var $shVmAdditionalText = true;
|
|||
|
|
/* boolean, if true, a flypage name will be inserted in URL */
|
|||
|
|
var $shVmInsertFlypage = true;
|
|||
|
|
|
|||
|
|
/* boolean, if true, category id will be prepended to category name */
|
|||
|
|
var $shInsertCategoryId = false;
|
|||
|
|
/* boolean, if true, numerical id will be prepended to URL, for inclusion in Googlenews */
|
|||
|
|
var $shInsertNumericalId = false;
|
|||
|
|
/* text, list of categories of content to which numerical id should be applied */
|
|||
|
|
var $shInsertNumericalIdCatList = '';
|
|||
|
|
/* boolean, if true, non-sef URL like index.php?option=com_content&task=view&id=12&Itemid=2 will be 301-redirected to their sef equivalent */
|
|||
|
|
var $shRedirectNonSefToSef = true;
|
|||
|
|
/* boolean, if true, Joomla sef URL like /content/view/12/61 will be 301-redirected to their sef equivalent */
|
|||
|
|
var $shRedirectJoomlaSefToSef = true;
|
|||
|
|
/* string, should be set to SSL secure URL of site if any used. No trailing / */
|
|||
|
|
var $shConfig_live_secure_site = '';
|
|||
|
|
/* boolean, if true, ed non-sef parameter will be interpreted as a iJoomla param in com_content plugin */
|
|||
|
|
var $shActivateIJoomlaMagInContent = true;
|
|||
|
|
/* boolean, if true, issue id of iJoomla magazine will be prepended to category name */
|
|||
|
|
var $shInsertIJoomlaMagIssueId = false;
|
|||
|
|
/* boolean, if true, magazine name will be prepended to all URL */
|
|||
|
|
var $shInsertIJoomlaMagName = false;
|
|||
|
|
/* boolean, if true, magazine id will be inserted before magazine title */
|
|||
|
|
var $shInsertIJoomlaMagMagazineId = false;
|
|||
|
|
/* boolean, if true, article id will be inserted before article title */
|
|||
|
|
var $shInsertIJoomlaMagArticleId = false;
|
|||
|
|
|
|||
|
|
|
|||
|
|
/* boolean, if true, name of menu item leading to Community builder will be prepended to all URL */
|
|||
|
|
var $shInsertCBName = false;
|
|||
|
|
/* boolean, if true, user name will be inserte to all URL wher appropriate. Warning : this will
|
|||
|
|
* increase DB space used? Normally user id is still passed as a GET param (ie ...?user=245)
|
|||
|
|
* to save space and increase speed */
|
|||
|
|
var $shCBInsertUserName = false;
|
|||
|
|
/* boolean, if true, id of user will be prepended to its name when previous option is activated
|
|||
|
|
* in case two users have the same name */
|
|||
|
|
var $shCBInsertUserId = true;
|
|||
|
|
/* boolean, if true user pseudo will be used instead of name */
|
|||
|
|
var $shCBUseUserPseudo = true;
|
|||
|
|
|
|||
|
|
/* integer, default value for Itemid when using lettermand newsletter component */
|
|||
|
|
var $shLMDefaultItemid = 0;
|
|||
|
|
|
|||
|
|
/* boolean, if true, default name for board will be prepended to URL */
|
|||
|
|
var $shInsertFireboardName = false;
|
|||
|
|
/* boolean, if true name of forum category will be inserted in URL */
|
|||
|
|
var $shFbInsertCategoryName = true;
|
|||
|
|
/* boolean, if true, Category id will be prepended to category name, in case 2 categories have same name */
|
|||
|
|
var $shFbInsertCategoryId = false;
|
|||
|
|
/* boolean, if true, message subject will be inserted in URL */
|
|||
|
|
var $shFbInsertMessageSubject = true;
|
|||
|
|
/* boolean, if true message id will be prepended to subject, in case 2 messages have same subject */
|
|||
|
|
var $shFbInsertMessageId = true;
|
|||
|
|
|
|||
|
|
/* MyBlog parameters V 1.2.4.r*/
|
|||
|
|
var $shInsertMyBlogName = false;
|
|||
|
|
var $shMyBlogInsertPostId = true;
|
|||
|
|
var $shMyBlogInsertTagId = false;
|
|||
|
|
var $shMyBlogInsertBloggerId = true;
|
|||
|
|
|
|||
|
|
/* Docman parameters V 1.2.4.r*/
|
|||
|
|
var $shInsertDocmanName = false;
|
|||
|
|
var $shDocmanInsertDocId = true;
|
|||
|
|
var $shDocmanInsertDocName = true;
|
|||
|
|
/* integer, if 0, no categories will be inserted in URL for a product
|
|||
|
|
if 1, only 'last' category will be inserted in URL
|
|||
|
|
if 2, all nested categories will be inserted in URL */
|
|||
|
|
var $shDMInsertCategories = 1;
|
|||
|
|
/* boolean, if true, category id will be prepended to category name */
|
|||
|
|
var $shDMInsertCategoryId = false;
|
|||
|
|
|
|||
|
|
/* boolean, if true, url will be urlencoded, needed for some non-latin languages */
|
|||
|
|
var $shEncodeUrl = false;
|
|||
|
|
|
|||
|
|
/* boolean, if true, Itemid from url on homepage with com_content will be removed, so that com_content plugin
|
|||
|
|
* can try guess amore appropriate one */
|
|||
|
|
var $guessItemidOnHomepage = true; // V 1.2.4.q
|
|||
|
|
// V 1.2.4.q : added param to force non-sef if https, as we are not through with some shared ssl servers!
|
|||
|
|
var $shForceNonSefIfHttps = false;
|
|||
|
|
|
|||
|
|
// V 1.2.4.s try SEF without mod_rewrite
|
|||
|
|
var $shRewriteMode = 1; // 0 = mod_rewrite, 1 = AcceptpathInfo index.php 2 = AcceptPathInfo index.php?
|
|||
|
|
var $shRewriteStrings = array('/','/index.php/','/index.php?/');
|
|||
|
|
|
|||
|
|
// V1.2.4.s record duplicate URL param
|
|||
|
|
var $shRecordDuplicates = true;
|
|||
|
|
var $shRemoveGeneratorTag = true;
|
|||
|
|
var $shPutH1Tags = false;
|
|||
|
|
var $shMetaManagementActivated = true;
|
|||
|
|
var $shInsertContentTableName = true;
|
|||
|
|
var $shContentTableName = 'Table';
|
|||
|
|
|
|||
|
|
// V 1.2.4.s auto redirect from www to non-www and vice-versa
|
|||
|
|
var $shAutoRedirectWww = true;
|
|||
|
|
var $shVmInsertProductName = true;
|
|||
|
|
|
|||
|
|
// V 1.2.4.t
|
|||
|
|
/* string, exact URL for homepage, to replace the automatic one. Workaround for splash pagesNo trailing / */
|
|||
|
|
var $shForcedHomePage = '';
|
|||
|
|
var $shInsertContentBlogName = false;
|
|||
|
|
var $shContentBlogName = '';
|
|||
|
|
|
|||
|
|
// Mosets Tree params
|
|||
|
|
var $shInsertMTreeName = false;
|
|||
|
|
var $shMTreeInsertListingName = true;
|
|||
|
|
var $shMTreeInsertListingId = true;
|
|||
|
|
var $shMTreePrependListingId = true;
|
|||
|
|
/* integer, if 0, no categories will be inserted in URL for a product
|
|||
|
|
if 1, only 'last' category will be inserted in URL
|
|||
|
|
if 2, all nested categories will be inserted in URL */
|
|||
|
|
var $shMTreeInsertCategories = 1;
|
|||
|
|
/* boolean, if true, category id will be prepended to category name */
|
|||
|
|
var $shMTreeInsertCategoryId = false;
|
|||
|
|
var $shMTreeInsertUserName = true;
|
|||
|
|
var $shMTreeInsertUserId = true;
|
|||
|
|
|
|||
|
|
// iJoomla NewsPortal params
|
|||
|
|
var $shInsertNewsPName = false;
|
|||
|
|
var $shNewsPInsertCatId = false;
|
|||
|
|
var $shNewsPInsertSecId = false;
|
|||
|
|
|
|||
|
|
/* Remository parameters V 1.2.4.t*/
|
|||
|
|
var $shInsertRemoName = false;
|
|||
|
|
var $shRemoInsertDocId = true;
|
|||
|
|
var $shRemoInsertDocName = true;
|
|||
|
|
/* integer, if 0, no categories will be inserted in URL for a product
|
|||
|
|
if 1, only 'last' category will be inserted in URL
|
|||
|
|
if 2, all nested categories will be inserted in URL */
|
|||
|
|
var $shRemoInsertCategories = 1;
|
|||
|
|
/* boolean, if true, category id will be prepended to category name */
|
|||
|
|
var $shRemoInsertCategoryId = false;
|
|||
|
|
|
|||
|
|
// boolean, if true, task = userProfile is accessed through mysite.com/username in CB
|
|||
|
|
var $shCBShortUserURL = false; //V 1.2.4.t
|
|||
|
|
|
|||
|
|
// a set of boolean vars, to decide what to do with existing data when upgrading sh404SEF
|
|||
|
|
var $shKeepStandardURLOnUpgrade = true; //V 1.2.4.t
|
|||
|
|
var $shKeepCustomURLOnUpgrade = true; //V 1.2.4.t
|
|||
|
|
var $shKeepMetaDataOnUpgrade = true; //V 1.2.4.t
|
|||
|
|
var $shKeepModulesSettingsOnUpgrade = true; //V 1.2.4.t
|
|||
|
|
|
|||
|
|
// boolean, to decide whether to replace page numbering by headings in multipage articles
|
|||
|
|
var $shMultipagesTitle = true; //V 1.2.4.t
|
|||
|
|
|
|||
|
|
// compatiblity variables, for sef_ext files usage from OpenSef/SEf Advance
|
|||
|
|
var $encode_page_suffix = '';
|
|||
|
|
var $encode_space_char = '';
|
|||
|
|
var $encode_lowercase = '';
|
|||
|
|
var $encode_strip_chars = '';
|
|||
|
|
var $spec_chars_d;
|
|||
|
|
var $spec_chars;
|
|||
|
|
var $content_page_format; // V 1.2.4.r
|
|||
|
|
var $content_page_name; // V 1.2.4.r
|
|||
|
|
|
|||
|
|
// V x
|
|||
|
|
var $shKeepConfigOnUpgrade = true;
|
|||
|
|
|
|||
|
|
// security parameters V x
|
|||
|
|
var $shSecEnableSecurity = true;
|
|||
|
|
var $shSecLogAttacks = true;
|
|||
|
|
var $shSecOnlyNumVars = array('catid','itemid','limit', 'limitstart');
|
|||
|
|
var $shSecAlphaNumVars = array('id');
|
|||
|
|
var $shSecNoProtocolVars = array('task','option','no_html','mosmsg', 'lang');
|
|||
|
|
var $ipWhiteList = '';
|
|||
|
|
var $ipBlackList = '';
|
|||
|
|
var $uAgentWhiteList = '';
|
|||
|
|
var $uAgentBlackList = '';
|
|||
|
|
var $shSecCheckHoneyPot = false;
|
|||
|
|
var $shSecHoneyPotKey = '';
|
|||
|
|
var $shSecEntranceText ="<p>Sorry. You are visiting this site from a suspicious IP address, which triggered our protection system.</p>
|
|||
|
|
<p>If you <strong>ARE NOT</strong> a malware robot of any kind, please accept our apologies for the unconvenience. You can access the page by clicking here : ";
|
|||
|
|
var $shSecSmellyPotText = "The following link is here to further trap malicious internet robots, so please don't click on it : ";
|
|||
|
|
var $monthsToKeepLogs = 1; // = 1 will keep current months log + the month before
|
|||
|
|
var $shSecActivateAntiFlood = true;
|
|||
|
|
var $shSecAntiFloodOnlyOnPOST = false; // if true, antiflood is activated only if there is some POST data, as in a form
|
|||
|
|
var $shSecAntiFloodPeriod = 10; // period over which requests from same IP are counted
|
|||
|
|
var $shSecAntiFloodCount = 10; // max number of request from same IP in period above
|
|||
|
|
|
|||
|
|
//var $insertSectionInBlogTableLinks = false; // default should be true, but set to false for compat reason
|
|||
|
|
|
|||
|
|
/* Array, contains whether we should translate URLs per language */
|
|||
|
|
var $shLangTranslateList = array(); // V 1.2.4.m
|
|||
|
|
/* Array, contains whether we should insert iso code URLs per language */
|
|||
|
|
var $shLangInsertCodeList = array();
|
|||
|
|
/* Array, contains list of default initial URL fragement per component */
|
|||
|
|
var $defaultComponentStringList = array(); // V 1.2.4.m
|
|||
|
|
/* Array, contains pagination string, per language */
|
|||
|
|
var $pageTexts = array();
|
|||
|
|
|
|||
|
|
var $shAdminInterfaceType = SH404SEF_STANDARD_ADMIN;
|
|||
|
|
|
|||
|
|
// V 1.3 RC shCustomTags params
|
|||
|
|
var $shInsertNoFollowPDFPrint = true;
|
|||
|
|
var $shInsertReadMorePageTitle = true;
|
|||
|
|
var $shMultipleH1ToH2 = true;
|
|||
|
|
|
|||
|
|
// V 1.3.1 RC
|
|||
|
|
var $shVmUsingItemsPerPage = false; // set to true if using drop-down list to select number of items per page
|
|||
|
|
var $shSecCheckPOSTData = true; // if set to yes, POST data will not be checked for mosconfig, script, base64,
|
|||
|
|
// standard vars and cmd file in img names
|
|||
|
|
var $shSecCurMonth = 0;
|
|||
|
|
var $shSecLastUpdated = 0;
|
|||
|
|
var $shSecTotalAttacks = 0;
|
|||
|
|
var $shSecTotalConfigVars = 0;
|
|||
|
|
var $shSecTotalBase64 =0;
|
|||
|
|
var $shSecTotalScripts = 0;
|
|||
|
|
var $shSecTotalStandardVars = 0;
|
|||
|
|
var $shSecTotalImgTxtCmd = 0;
|
|||
|
|
var $shSecTotalIPDenied = 0;
|
|||
|
|
var $shSecTotalUserAgentDenied = 0;
|
|||
|
|
var $shSecTotalFlooding = 0;
|
|||
|
|
var $shSecTotalPHP = 0;
|
|||
|
|
var $shSecTotalPHPUserClicked = 0;
|
|||
|
|
// com_smf params
|
|||
|
|
var $shInsertSMFName = true;
|
|||
|
|
var $shSMFItemsPerPage = 20;
|
|||
|
|
var $shInsertSMFBoardId = true;
|
|||
|
|
var $shInsertSMFTopicId = true;
|
|||
|
|
var $shinsertSMFUserName = false;
|
|||
|
|
var $shInsertSMFUserId = true;
|
|||
|
|
|
|||
|
|
// other
|
|||
|
|
var $appendToPageTitle = '';
|
|||
|
|
var $prependToPageTitle = '';
|
|||
|
|
var $debugToLogFile = false;
|
|||
|
|
var $debugStartedAt = 0;
|
|||
|
|
var $debugDuration = 3600; // time in seconds to log debug data to file. if 0, unlimited, default = 1 hour
|
|||
|
|
|
|||
|
|
// V 1.3.1
|
|||
|
|
var $shInsertOutboundLinksImage = false;
|
|||
|
|
var $shImageForOutboundLinks = 'external-black.png'; // default = black image
|
|||
|
|
|
|||
|
|
/* Array, contains list of default itemid per component */
|
|||
|
|
var $defaultComponentItemidList = array(); // V 1.2.4.m
|
|||
|
|
var $UseDefaultItemids = true;
|
|||
|
|
|
|||
|
|
// V 1.3.3
|
|||
|
|
var $defaultParamList = ''; // holds content of /administrator/components/default.sef.php for editing
|
|||
|
|
|
|||
|
|
// End of parameters
|
|||
|
|
|
|||
|
|
function SEFConfig() {
|
|||
|
|
|
|||
|
|
GLOBAL $sef_config_file;
|
|||
|
|
$sef_config_file = sh404SEF_ADMIN_ABS_PATH.'config/config.sef.php';
|
|||
|
|
$this->shCheckFilesAccess();
|
|||
|
|
if (file_exists($sef_config_file)) {
|
|||
|
|
include($sef_config_file);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// shumisha : 2007-04-01 version was missing !
|
|||
|
|
//if (isset($version)) $this->version = $version; // V 1.2.4.r : removed as would prevent update system to work : version was not updated
|
|||
|
|
// shumisha : 2007-04-01 new parameters !
|
|||
|
|
if (isset($shUseURLCache)) $this->shUseURLCache = $shUseURLCache;
|
|||
|
|
// shumisha : 2007-04-01 new parameters !
|
|||
|
|
if (isset($shMaxURLInCache)) $this->shMaxURLInCache = $shMaxURLInCache;
|
|||
|
|
// shumisha : 2007-04-01 new parameters !
|
|||
|
|
if (isset($shTranslateURL)) $this->shTranslateURL = $shTranslateURL;
|
|||
|
|
//V 1.2.4.m
|
|||
|
|
if (isset($shInsertLanguageCode)) $this->shInsertLanguageCode = $shInsertLanguageCode;
|
|||
|
|
if (isset($notTranslateURLList)) $this->notTranslateURLList = $notTranslateURLList;
|
|||
|
|
if (isset($notInsertIsoCodeList)) $this->notInsertIsoCodeList = $notInsertIsoCodeList;
|
|||
|
|
|
|||
|
|
// shumisha : 2007-04-03 new parameters !
|
|||
|
|
if (isset($shInsertGlobalItemidIfNone)) $this->shInsertGlobalItemidIfNone = $shInsertGlobalItemidIfNone;
|
|||
|
|
if (isset($shInsertTitleIfNoItemid)) $this->shInsertTitleIfNoItemid = $shInsertTitleIfNoItemid;
|
|||
|
|
if (isset($shAlwaysInsertMenuTitle)) $this->shAlwaysInsertMenuTitle = $shAlwaysInsertMenuTitle;
|
|||
|
|
if (isset($shAlwaysInsertItemid)) $this->shAlwaysInsertItemid = $shAlwaysInsertItemid;
|
|||
|
|
if (isset($shDefaultMenuItemName)) $this->shDefaultMenuItemName = $shDefaultMenuItemName;
|
|||
|
|
if (isset($shAppendRemainingGETVars)) $this->shAppendRemainingGETVars = $shAppendRemainingGETVars;
|
|||
|
|
if (isset($shVmInsertShopName)) $this->shVmInsertShopName = $shVmInsertShopName;
|
|||
|
|
|
|||
|
|
if (isset($shInsertProductId)) $this->shInsertProductId = $shInsertProductId;
|
|||
|
|
if (isset($shVmUseProductSKU)) $this->shVmUseProductSKU = $shVmUseProductSKU;
|
|||
|
|
if (isset($shVmInsertManufacturerName))
|
|||
|
|
$this->shVmInsertManufacturerName = $shVmInsertManufacturerName;
|
|||
|
|
if (isset($shInsertManufacturerId)) $this->shInsertManufacturerId = $shInsertManufacturerId;
|
|||
|
|
if (isset($shVMInsertCategories)) $this->shVMInsertCategories= $shVMInsertCategories;
|
|||
|
|
if (isset($shVmAdditionalText)) $this->shVmAdditionalText= $shVmAdditionalText;
|
|||
|
|
if (isset($shVmInsertFlypage)) $this->shVmInsertFlypage= $shVmInsertFlypage;
|
|||
|
|
|
|||
|
|
if (isset($shInsertCategoryId)) $this->shInsertCategoryId= $shInsertCategoryId;
|
|||
|
|
if (isset($shReplacements)) $this->shReplacements= $shReplacements;
|
|||
|
|
|
|||
|
|
if (isset($shInsertNumericalId)) $this->shInsertNumericalId = $shInsertNumericalId;
|
|||
|
|
if (isset($shInsertNumericalIdCatList)) $this->shInsertNumericalIdCatList = $shInsertNumericalIdCatList;
|
|||
|
|
|
|||
|
|
if (isset($shRedirectNonSefToSef)) $this->shRedirectNonSefToSef = $shRedirectNonSefToSef;
|
|||
|
|
if (isset($shRedirectJoomlaSefToSef)) $this->shRedirectJoomlaSefToSef = $shRedirectJoomlaSefToSef;
|
|||
|
|
if (isset($shConfig_live_secure_site))
|
|||
|
|
$this->shConfig_live_secure_site = rtrim( $shConfig_live_secure_site, '/');
|
|||
|
|
|
|||
|
|
if (isset($shActivateIJoomlaMagInContent))
|
|||
|
|
$this->shActivateIJoomlaMagInContent = $shActivateIJoomlaMagInContent;
|
|||
|
|
if (isset($shInsertIJoomlaMagIssueId))
|
|||
|
|
$this->shInsertIJoomlaMagIssueId = $shInsertIJoomlaMagIssueId;
|
|||
|
|
if (isset($shInsertIJoomlaMagName))
|
|||
|
|
$this->shInsertIJoomlaMagName = $shInsertIJoomlaMagName;
|
|||
|
|
if (isset($shInsertIJoomlaMagMagazineId))
|
|||
|
|
$this->shInsertIJoomlaMagMagazineId = $shInsertIJoomlaMagMagazineId;
|
|||
|
|
if (isset($shInsertIJoomlaMagArticleId))
|
|||
|
|
$this->shInsertIJoomlaMagArticleId = $shInsertIJoomlaMagArticleId;
|
|||
|
|
|
|||
|
|
if (isset($shInsertCBName))
|
|||
|
|
$this->shInsertCBName = $shInsertCBName;
|
|||
|
|
if (isset($shCBInsertUserName))
|
|||
|
|
$this->shCBInsertUserName = $shCBInsertUserName;
|
|||
|
|
if (isset($shCBInsertUserId))
|
|||
|
|
$this->shCBInsertUserId = $shCBInsertUserId;
|
|||
|
|
if (isset($shCBUseUserPseudo))
|
|||
|
|
$this->shCBUseUserPseudo = $shCBUseUserPseudo;
|
|||
|
|
|
|||
|
|
if (isset($shInsertMyBlogName))
|
|||
|
|
$this->shInsertMyBlogName = $shInsertMyBlogName;
|
|||
|
|
if (isset($shMyBlogInsertPostId))
|
|||
|
|
$this->shMyBlogInsertPostId = $shMyBlogInsertPostId;
|
|||
|
|
if (isset($shMyBlogInsertTagId))
|
|||
|
|
$this->shMyBlogInsertTagId = $shMyBlogInsertTagId;
|
|||
|
|
if (isset($shMyBlogInsertBloggerId))
|
|||
|
|
$this->shMyBlogInsertBloggerId = $shMyBlogInsertBloggerId;
|
|||
|
|
|
|||
|
|
if (isset($shInsertDocmanName))
|
|||
|
|
$this->shInsertDocmanName = $shInsertDocmanName;
|
|||
|
|
if (isset($shDocmanInsertDocId))
|
|||
|
|
$this->shDocmanInsertDocId = $shDocmanInsertDocId;
|
|||
|
|
if (isset($shDocmanInsertDocName))
|
|||
|
|
$this->shDocmanInsertDocName = $shDocmanInsertDocName;
|
|||
|
|
|
|||
|
|
if (isset($shLog404Errors))
|
|||
|
|
$this->shLog404Errors = $shLog404Errors;
|
|||
|
|
|
|||
|
|
if (isset($shLMDefaultItemid))
|
|||
|
|
$this->shLMDefaultItemid = $shLMDefaultItemid;
|
|||
|
|
|
|||
|
|
if (isset($shInsertFireboardName))
|
|||
|
|
$this->shInsertFireboardName = $shInsertFireboardName;
|
|||
|
|
if (isset($shFbInsertCategoryName))
|
|||
|
|
$this->shFbInsertCategoryName = $shFbInsertCategoryName;
|
|||
|
|
if (isset($shFbInsertCategoryId))
|
|||
|
|
$this->shFbInsertCategoryId = $shFbInsertCategoryId;
|
|||
|
|
if (isset($shFbInsertMessageSubject))
|
|||
|
|
$this->shFbInsertMessageSubject = $shFbInsertMessageSubject;
|
|||
|
|
if (isset($shFbInsertMessageId))
|
|||
|
|
$this->shFbInsertMessageId = $shFbInsertMessageId;
|
|||
|
|
|
|||
|
|
if (isset($shDoNotOverrideOwnSef)) // V 1.2.4.m
|
|||
|
|
$this->shDoNotOverrideOwnSef = $shDoNotOverrideOwnSef;
|
|||
|
|
|
|||
|
|
if (isset($shEncodeUrl)) // V 1.2.4.m
|
|||
|
|
$this->shEncodeUrl = $shEncodeUrl;
|
|||
|
|
|
|||
|
|
if (isset($guessItemidOnHomepage)) // V 1.2.4.q
|
|||
|
|
$this->guessItemidOnHomepage = $guessItemidOnHomepage;
|
|||
|
|
|
|||
|
|
if (isset($shForceNonSefIfHttps)) // V 1.2.4.q
|
|||
|
|
$this->shForceNonSefIfHttps= $shForceNonSefIfHttps;
|
|||
|
|
|
|||
|
|
if (isset($shRewriteMode)) // V 1.2.4.s
|
|||
|
|
$this->shRewriteMode = $shRewriteMode;
|
|||
|
|
if (isset($shRewriteStrings)) // V 1.2.4.s
|
|||
|
|
$this->shRewriteStrings = $shRewriteStrings;
|
|||
|
|
|
|||
|
|
if (isset($shRecordDuplicates)) // V 1.2.4.s
|
|||
|
|
$this->shRecordDuplicates = $shRecordDuplicates;
|
|||
|
|
if (isset($shMetaManagementActivated)) // V 1.2.4.s
|
|||
|
|
$this->shMetaManagementActivated = $shMetaManagementActivated;
|
|||
|
|
if (isset($shRemoveGeneratorTag)) // V 1.2.4.s
|
|||
|
|
$this->shRemoveGeneratorTag = $shRemoveGeneratorTag;
|
|||
|
|
if (isset($shPutH1Tags)) // V 1.2.4.s
|
|||
|
|
$this->shPutH1Tags = $shPutH1Tags;
|
|||
|
|
if (isset($shInsertContentTableName)) // V 1.2.4.s
|
|||
|
|
$this->shInsertContentTableName = $shInsertContentTableName;
|
|||
|
|
if (isset($shContentTableName)) // V 1.2.4.s
|
|||
|
|
$this->shContentTableName = $shContentTableName;
|
|||
|
|
if (isset($shAutoRedirectWww)) // V 1.2.4.s
|
|||
|
|
$this->shAutoRedirectWww = $shAutoRedirectWww;
|
|||
|
|
if (isset($shVmInsertProductName)) // V 1.2.4.s
|
|||
|
|
$this->shVmInsertProductName = $shVmInsertProductName;
|
|||
|
|
|
|||
|
|
if (isset($shDMInsertCategories)) // V 1.2.4.t
|
|||
|
|
$this->shDMInsertCategories = $shDMInsertCategories;
|
|||
|
|
if (isset($shDMInsertCategoryId)) // V 1.2.4.t
|
|||
|
|
$this->shDMInsertCategoryId = $shDMInsertCategoryId;
|
|||
|
|
|
|||
|
|
if (isset($shForcedHomePage)) // V 1.2.4.t
|
|||
|
|
$this->shForcedHomePage = $shForcedHomePage;
|
|||
|
|
if (isset($shInsertContentBlogName)) // V 1.2.4.t
|
|||
|
|
$this->shInsertContentBlogName = $shInsertContentBlogName;
|
|||
|
|
if (isset($shContentBlogName)) // V 1.2.4.t
|
|||
|
|
$this->shContentBlogName = $shContentBlogName;
|
|||
|
|
|
|||
|
|
if (isset($shInsertMTreeName)) // V 1.2.4.t
|
|||
|
|
$this->shInsertMTreeName = $shInsertMTreeName;
|
|||
|
|
if (isset($shMTreeInsertListingName)) // V 1.2.4.t
|
|||
|
|
$this->shMTreeInsertListingName = $shMTreeInsertListingName;
|
|||
|
|
if (isset($shMTreeInsertListingId)) // V 1.2.4.t
|
|||
|
|
$this->shMTreeInsertListingId = $shMTreeInsertListingId;
|
|||
|
|
if (isset($shMTreePrependListingId)) // V 1.2.4.t
|
|||
|
|
$this->shMTreePrependListingId = $shMTreePrependListingId;
|
|||
|
|
if (isset($shMTreeInsertCategories)) // V 1.2.4.t
|
|||
|
|
$this->shMTreeInsertCategories = $shMTreeInsertCategories;
|
|||
|
|
if (isset($shMTreeInsertCategoryId)) // V 1.2.4.t
|
|||
|
|
$this->shMTreeInsertCategoryId = $shMTreeInsertCategoryId;
|
|||
|
|
if (isset($shMTreeInsertUserName)) // V 1.2.4.t
|
|||
|
|
$this->shMTreeInsertUserName = $shMTreeInsertUserName;
|
|||
|
|
if (isset($shMTreeInsertUserId)) // V 1.2.4.t
|
|||
|
|
$this->shMTreeInsertUserId = $shMTreeInsertUserId;
|
|||
|
|
|
|||
|
|
if (isset($shInsertNewsPName)) // V 1.2.4.t
|
|||
|
|
$this->shInsertNewsPName = $shInsertNewsPName;
|
|||
|
|
if (isset($shNewsPInsertCatId)) // V 1.2.4.t
|
|||
|
|
$this->shNewsPInsertCatId = $shNewsPInsertCatId;
|
|||
|
|
if (isset($shNewsPInsertSecId)) // V 1.2.4.t
|
|||
|
|
$this->shNewsPInsertSecId = $shNewsPInsertSecId;
|
|||
|
|
|
|||
|
|
if (isset($shInsertRemoName)) // V 1.2.4.t
|
|||
|
|
$this->shInsertRemoName = $shInsertRemoName;
|
|||
|
|
if (isset($shRemoInsertDocId)) // V 1.2.4.t
|
|||
|
|
$this->shRemoInsertDocId = $shRemoInsertDocId;
|
|||
|
|
if (isset($shRemoInsertDocName)) // V 1.2.4.t
|
|||
|
|
$this->shRemoInsertDocName = $shRemoInsertDocName;
|
|||
|
|
if (isset($shRemoInsertCategories)) // V 1.2.4.t
|
|||
|
|
$this->shRemoInsertCategories = $shRemoInsertCategories;
|
|||
|
|
if (isset($shRemoInsertCategoryId)) // V 1.2.4.t
|
|||
|
|
$this->shRemoInsertCategoryId = $shRemoInsertCategoryId;
|
|||
|
|
|
|||
|
|
if (isset($shCBShortUserURL)) // V 1.2.4.t
|
|||
|
|
$this->shCBShortUserURL = $shCBShortUserURL;
|
|||
|
|
|
|||
|
|
if (isset($shKeepStandardURLOnUpgrade)) // V 1.2.4.t
|
|||
|
|
$this->shKeepStandardURLOnUpgrade = $shKeepStandardURLOnUpgrade;
|
|||
|
|
if (isset($shKeepCustomURLOnUpgrade)) // V 1.2.4.t
|
|||
|
|
$this->shKeepCustomURLOnUpgrade = $shKeepCustomURLOnUpgrade;
|
|||
|
|
if (isset($shKeepMetaDataOnUpgrade)) // V 1.2.4.t
|
|||
|
|
$this->shKeepMetaDataOnUpgrade = $shKeepMetaDataOnUpgrade;
|
|||
|
|
if (isset($shKeepModulesSettingsOnUpgrade)) // V 1.2.4.t
|
|||
|
|
$this->shKeepModulesSettingsOnUpgrade = $shKeepModulesSettingsOnUpgrade;
|
|||
|
|
|
|||
|
|
if (isset($shMultipagesTitle)) // V 1.2.4.t
|
|||
|
|
$this->shMultipagesTitle = $shMultipagesTitle;
|
|||
|
|
|
|||
|
|
// shumisha end of new parameters
|
|||
|
|
if (isset($Enabled)) $this->Enabled = $Enabled;
|
|||
|
|
if (isset($replacement)) $this->replacement = $replacement;
|
|||
|
|
if (isset($pagerep)) $this->pagerep = $pagerep;
|
|||
|
|
if (isset($stripthese)) $this->stripthese = $stripthese;
|
|||
|
|
if (isset($friendlytrim)) $this->friendlytrim = $friendlytrim;
|
|||
|
|
if (isset($suffix)) $this->suffix = $suffix;
|
|||
|
|
if (isset($addFile)) $this->addFile = $addFile;
|
|||
|
|
if (isset($LowerCase)) $this->LowerCase = $LowerCase;
|
|||
|
|
if (isset($ShowSection)) $this->ShowSection = $ShowSection;
|
|||
|
|
if (isset($HideCat)) $this->HideCat = $HideCat;
|
|||
|
|
if (isset($replacement)) $this->UseAlias = $UseAlias;
|
|||
|
|
if (isset($UseAlias)) $this->page404 = $page404;
|
|||
|
|
if (isset($predefined)) $this->predefined = $predefined;
|
|||
|
|
if (isset($skip)) $this->skip = $skip;
|
|||
|
|
if (isset($nocache)) $this->nocache = $nocache;
|
|||
|
|
if (isset($ShowCat)) $this->ShowCat = $ShowCat;
|
|||
|
|
|
|||
|
|
// V x
|
|||
|
|
if (isset($shKeepConfigOnUpgrade)) // V 1.2.4.x
|
|||
|
|
$this->shKeepConfigOnUpgrade = $shKeepConfigOnUpgrade;
|
|||
|
|
if (isset($shSecEnableSecurity)) // V 1.2.4.x
|
|||
|
|
$this->shSecEnableSecurity = $shSecEnableSecurity;
|
|||
|
|
if (isset($shSecLogAttacks)) // V 1.2.4.x
|
|||
|
|
$this->shSecLogAttacks = $shSecLogAttacks;
|
|||
|
|
if (isset($shSecOnlyNumVars)) // V 1.2.4.x
|
|||
|
|
$this->shSecOnlyNumVars = $shSecOnlyNumVars;
|
|||
|
|
if (isset($shSecAlphaNumVars)) // V 1.2.4.x
|
|||
|
|
$this->shSecAlphaNumVars = $shSecAlphaNumVars;
|
|||
|
|
if (isset($shSecNoProtocolVars)) // V 1.2.4.x
|
|||
|
|
$this->shSecNoProtocolVars = $shSecNoProtocolVars;
|
|||
|
|
$this->ipWhiteList = shReadFile(sh404SEF_ADMIN_ABS_PATH . 'security/sh404SEF_IP_white_list.txt');
|
|||
|
|
$this->ipBlackList = shReadFile(sh404SEF_ADMIN_ABS_PATH . 'security/sh404SEF_IP_black_list.txt');
|
|||
|
|
$this->uAgentWhiteList = shReadFile(sh404SEF_ADMIN_ABS_PATH . 'security/sh404SEF_uAgent_white_list.txt');
|
|||
|
|
$this->uAgentBlackList = shReadFile(sh404SEF_ADMIN_ABS_PATH . 'security/sh404SEF_uAgent_black_list.txt');
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (isset($shSecCheckHoneyPot)) // V 1.2.4.x
|
|||
|
|
$this->shSecCheckHoneyPot = $shSecCheckHoneyPot;
|
|||
|
|
if (isset($shSecDebugHoneyPot)) // V 1.2.4.x
|
|||
|
|
$this->shSecDebugHoneyPot = $shSecDebugHoneyPot;
|
|||
|
|
if (isset($shSecHoneyPotKey)) // V 1.2.4.x
|
|||
|
|
$this->shSecHoneyPotKey = $shSecHoneyPotKey;
|
|||
|
|
if (isset($shSecEntranceText)) // V 1.2.4.x
|
|||
|
|
$this->shSecEntranceText = $shSecEntranceText;
|
|||
|
|
if (isset($shSecSmellyPotText)) // V 1.2.4.x
|
|||
|
|
$this->shSecSmellyPotText = $shSecSmellyPotText;
|
|||
|
|
if (isset($monthsToKeepLogs)) // V 1.2.4.x
|
|||
|
|
$this->monthsToKeepLogs = $monthsToKeepLogs;
|
|||
|
|
if (isset($shSecActivateAntiFlood)) // V 1.2.4.x
|
|||
|
|
$this->shSecActivateAntiFlood = $shSecActivateAntiFlood;
|
|||
|
|
if (isset($shSecAntiFloodOnlyOnPOST)) // V 1.2.4.x
|
|||
|
|
$this->shSecAntiFloodOnlyOnPOST = $shSecAntiFloodOnlyOnPOST;
|
|||
|
|
if (isset($shSecAntiFloodPeriod)) // V 1.2.4.x
|
|||
|
|
$this->shSecAntiFloodPeriod = $shSecAntiFloodPeriod;
|
|||
|
|
if (isset($shSecAntiFloodCount)) // V 1.2.4.x
|
|||
|
|
$this->shSecAntiFloodCount = $shSecAntiFloodCount;
|
|||
|
|
// if (isset($insertSectionInBlogTableLinks)) // V 1.2.4.x
|
|||
|
|
// $this->insertSectionInBlogTableLinks = $insertSectionInBlogTableLinks;
|
|||
|
|
|
|||
|
|
$this->shLangTranslateList = $this->shInitLanguageList( isset($shLangTranslateList)? $shLangTranslateList : null, 0, 0);
|
|||
|
|
$this->shLangInsertCodeList = $this->shInitLanguageList( isset($shLangInsertCodeList) ? $shLangInsertCodeList : null, 0, 0);
|
|||
|
|
|
|||
|
|
if (isset($defaultComponentStringList)) // V 1.2.4.x
|
|||
|
|
$this->defaultComponentStringList = $defaultComponentStringList;
|
|||
|
|
|
|||
|
|
$this->pageTexts = $this->shInitLanguageList( isset($pageTexts) ? $pageTexts : null, // V x
|
|||
|
|
isset($pagetext) ? $pagetext : 'Page-%s', isset($pagetext) ? $pagetext : 'Page-%s'); // use value from prev versions if any
|
|||
|
|
|
|||
|
|
if (isset($shAdminInterfaceType)) // V 1.2.4.x
|
|||
|
|
$this->shAdminInterfaceType = $shAdminInterfaceType;
|
|||
|
|
|
|||
|
|
// compatibility with version earlier than V x
|
|||
|
|
if (isset($shShopName)) // V 1.2.4.x
|
|||
|
|
$this->defaultComponentStringList['virtuemart'] = $shShopName;
|
|||
|
|
if (isset($shIJoomlaMagName))// V 1.2.4.x
|
|||
|
|
$this->defaultComponentStringList['magazine'] = $shIJoomlaMagName;
|
|||
|
|
if (isset($shCBName))// V 1.2.4.x
|
|||
|
|
$this->defaultComponentStringList['comprofiler'] = $shCBName;
|
|||
|
|
if (isset($shFireboardName))// V 1.2.4.x
|
|||
|
|
$this->defaultComponentStringList['fireboard'] = $shFireboardName;
|
|||
|
|
if (isset($shMyBlogName))// V 1.2.4.x
|
|||
|
|
$this->defaultComponentStringList['myblog'] = $shMyBlogName;
|
|||
|
|
if (isset($shDocmanName))// V 1.2.4.x
|
|||
|
|
$this->defaultComponentStringList['docman'] = $shDocmanName;
|
|||
|
|
if (isset($shMTreeName))// V 1.2.4.x
|
|||
|
|
$this->defaultComponentStringList['mtree'] = $shMTreeName;
|
|||
|
|
if (isset($shNewsPName))// V 1.2.4.x
|
|||
|
|
$this->defaultComponentStringList['news_portal'] = $shNewsPName;
|
|||
|
|
if (isset($shRemoName))// V 1.2.4.x
|
|||
|
|
$this->defaultComponentStringList['remository'] = $shRemoName;
|
|||
|
|
// end of compatibility code
|
|||
|
|
|
|||
|
|
// V 1.3 RC
|
|||
|
|
if (isset($shInsertNoFollowPDFPrint))
|
|||
|
|
$this->shInsertNoFollowPDFPrint = $shInsertNoFollowPDFPrint;
|
|||
|
|
if (isset($shInsertReadMorePageTitle))
|
|||
|
|
$this->shInsertReadMorePageTitle = $shInsertReadMorePageTitle;
|
|||
|
|
if (isset($shMultipleH1ToH2))
|
|||
|
|
$this->shMultipleH1ToH2 = $shMultipleH1ToH2;
|
|||
|
|
|
|||
|
|
// V 1.3.1 RC
|
|||
|
|
if (isset($shVmUsingItemsPerPage))
|
|||
|
|
$this->shVmUsingItemsPerPage = $shVmUsingItemsPerPage;
|
|||
|
|
if (isset($shSecCheckPOSTData))
|
|||
|
|
$this->shSecCheckPOSTData = $shSecCheckPOSTData;
|
|||
|
|
if (isset($shSecCurMonth))
|
|||
|
|
$this->shSecCurMonth = $shSecCurMonth;
|
|||
|
|
if (isset($shSecLastUpdated))
|
|||
|
|
$this->shSecLastUpdated = $shSecLastUpdated;
|
|||
|
|
if (isset($shSecTotalAttacks))
|
|||
|
|
$this->shSecTotalAttacks = $shSecTotalAttacks;
|
|||
|
|
if (isset($shSecTotalConfigVars))
|
|||
|
|
$this->shSecTotalConfigVars = $shSecTotalConfigVars;
|
|||
|
|
if (isset($shSecTotalBase64))
|
|||
|
|
$this->shSecTotalBase64 = $shSecTotalBase64;
|
|||
|
|
if (isset($shSecTotalScripts))
|
|||
|
|
$this->shSecTotalScripts = $shSecTotalScripts;
|
|||
|
|
if (isset($shSecTotalStandardVars))
|
|||
|
|
$this->shSecTotalStandardVars = $shSecTotalStandardVars;
|
|||
|
|
if (isset($shSecTotalImgTxtCmd))
|
|||
|
|
$this->shSecTotalImgTxtCmd = $shSecTotalImgTxtCmd;
|
|||
|
|
if (isset($shSecTotalIPDenied))
|
|||
|
|
$this->shSecTotalIPDenied = $shSecTotalIPDenied;
|
|||
|
|
if (isset($shSecTotalUserAgentDenied))
|
|||
|
|
$this->shSecTotalUserAgentDenied = $shSecTotalUserAgentDenied;
|
|||
|
|
if (isset($shSecTotalFlooding))
|
|||
|
|
$this->shSecTotalFlooding = $shSecTotalFlooding;
|
|||
|
|
if (isset($shSecTotalPHP))
|
|||
|
|
$this->shSecTotalPHP = $shSecTotalPHP;
|
|||
|
|
if (isset($shSecTotalPHPUserClicked))
|
|||
|
|
$this->shSecTotalPHPUserClicked = $shSecTotalPHPUserClicked;
|
|||
|
|
|
|||
|
|
if (isset($shInsertSMFName))
|
|||
|
|
$this->shInsertSMFName = $shInsertSMFName;
|
|||
|
|
if (isset($shSMFItemsPerPage))
|
|||
|
|
$this->shSMFItemsPerPage = $shSMFItemsPerPage;
|
|||
|
|
if (isset($shInsertSMFBoardId))
|
|||
|
|
$this->shInsertSMFBoardId = $shInsertSMFBoardId;
|
|||
|
|
if (isset($shInsertSMFTopicId))
|
|||
|
|
$this->shInsertSMFTopicId = $shInsertSMFTopicId;
|
|||
|
|
if (isset($shinsertSMFUserName))
|
|||
|
|
$this->shinsertSMFUserName = $shinsertSMFUserName;
|
|||
|
|
if (isset($shInsertSMFUserId))
|
|||
|
|
$this->shInsertSMFUserId = $shInsertSMFUserId;
|
|||
|
|
|
|||
|
|
if (isset($prependToPageTitle))
|
|||
|
|
$this->prependToPageTitle = $prependToPageTitle;
|
|||
|
|
if (isset($appendToPageTitle))
|
|||
|
|
$this->appendToPageTitle = $appendToPageTitle;
|
|||
|
|
|
|||
|
|
if (isset($debugToLogFile))
|
|||
|
|
$this->debugToLogFile = $debugToLogFile;
|
|||
|
|
if (isset($debugStartedAt))
|
|||
|
|
$this->debugStartedAt = $debugStartedAt;
|
|||
|
|
if (isset($debugDuration))
|
|||
|
|
$this->debugDuration = $debugDuration;
|
|||
|
|
|
|||
|
|
if (isset($defaultComponentItemidList)) // V 1.2.4.x
|
|||
|
|
$this->defaultComponentItemidList = $defaultComponentItemidList;
|
|||
|
|
if (isset($UseDefaultItemids))
|
|||
|
|
$this->UseDefaultItemids = $UseDefaultItemids;
|
|||
|
|
|
|||
|
|
// V 1.3.1
|
|||
|
|
if (isset($shInsertOutboundLinksImage))
|
|||
|
|
$this->shInsertOutboundLinksImage = $shInsertOutboundLinksImage;
|
|||
|
|
if (isset($shImageForOutboundLinks))
|
|||
|
|
$this->shImageForOutboundLinks = $shImageForOutboundLinks;
|
|||
|
|
|
|||
|
|
// define default values for seldom used params
|
|||
|
|
|
|||
|
|
if (!defined('SH404SEF_COMPAT_SHOW_SECTION_IN_CAT_LINKS')) {
|
|||
|
|
// SECTION : GLOBAL PARAMETERS for sh404sef ---------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['SH404SEF_COMPAT_SHOW_SECTION_IN_CAT_LINKS'] =
|
|||
|
|
'// compatibility with past version. Set to 0 so that
|
|||
|
|
// section is not added in (table) category links. This was a bug in past versions
|
|||
|
|
// as sh404SEF would not insert section, even if ShowSection param was set to Yes';
|
|||
|
|
$shDefaultParams['SH404SEF_COMPAT_SHOW_SECTION_IN_CAT_LINKS'] = 1;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_USE_NON_STANDARD_PORT'] =
|
|||
|
|
'// set to 1 if using other than port 80 for http';
|
|||
|
|
$shDefaultParams['sh404SEF_USE_NON_STANDARD_PORT'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_PAGE_NOT_FOUND_FORCED_ITEMID'] =
|
|||
|
|
'// if not 0, will be used instead of Homepage itemid to display 404 error page';
|
|||
|
|
$shDefaultParams['sh404SEF_PAGE_NOT_FOUND_FORCED_ITEMID'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_REDIRECT_IF_INDEX_PHP'] =
|
|||
|
|
'// if not 0, sh404SEF will do a 301 redirect from http://yoursite.com/index.php
|
|||
|
|
// or http://yoursite.com/index.php?lang=xx to http://yoursite.com/
|
|||
|
|
// this may not work on some web servers, which transform yoursite.com into
|
|||
|
|
// yoursite.com/index.php, thus creating and endless loop. If your server does
|
|||
|
|
// that, set this param to 0';
|
|||
|
|
$shDefaultParams['sh404SEF_REDIRECT_IF_INDEX_PHP'] = 1;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_NON_SEF_IF_SUPERADMIN'] =
|
|||
|
|
'// if superadmin logged in, force non-sef, for testing and setting up purpose';
|
|||
|
|
$shDefaultParams['sh404SEF_NON_SEF_IF_SUPERADMIN'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_DE_ACTIVATE_LANG_AUTO_REDIRECT'] =
|
|||
|
|
'// set to 1 to prevent 303 auto redirect based on user language
|
|||
|
|
// use with care, will prevent language switch to work for users without javascript';
|
|||
|
|
$shDefaultParams['sh404SEF_DE_ACTIVATE_LANG_AUTO_REDIRECT'] = 1;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_CHECK_COMP_IS_INSTALLED'] =
|
|||
|
|
'// if 1, SEF URLs will only be built for installed components.';
|
|||
|
|
$shDefaultParams['sh404SEF_CHECK_COMP_IS_INSTALLED'] = 1;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_REDIRECT_OUTBOUND_LINKS'] =
|
|||
|
|
'// if 1, all outbound links on page will be reached through a redirect
|
|||
|
|
// to avoid page rank leakage';
|
|||
|
|
$shDefaultParams['sh404SEF_REDIRECT_OUTBOUND_LINKS'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['SH404SEF_URL_CACHE_TTL'] =
|
|||
|
|
'// time to live for url cache in hours : default = 168h = 1 week
|
|||
|
|
// Set to 0 to keep cache forever';
|
|||
|
|
$shDefaultParams['SH404SEF_URL_CACHE_TTL'] = 168;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['SH404SEF_URL_CACHE_WRITES_TO_CHECK_TTL'] =
|
|||
|
|
'// number of cache write before checking cache TTL.';
|
|||
|
|
$shDefaultParams['SH404SEF_URL_CACHE_WRITES_TO_CHECK_TTL'] = 1000;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_SEC_MAIL_ATTACKS_TO_ADMIN'] =
|
|||
|
|
'// if set to 1, an email will be send to site admin when an attack is logged
|
|||
|
|
// if the site is live, you could be drowning in email rapidly !!!';
|
|||
|
|
$shDefaultParams['sh404SEF_SEC_MAIL_ATTACKS_TO_ADMIN'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParams['sh404SEF_SEC_EMAIL_TO_ADMIN_SUBJECT'] = 'Your site %sh404SEF_404_SITE_NAME% was subject to an attack';
|
|||
|
|
$shDefaultParams['sh404SEF_SEC_EMAIL_TO_ADMIN_BODY'] =
|
|||
|
|
'Hello !'."\n\n".'This is sh404SEF security component, running at your site (%sh404SEF_404_SITE_URL%).'
|
|||
|
|
."\n\n".'I have just blocked an attack on your site. Please check details below : '
|
|||
|
|
."\n". '------------------------------------------------------------------------'
|
|||
|
|
."\n". '%sh404SEF_404_ATTACK_DETAILS%'
|
|||
|
|
."\n". '------------------------------------------------------------------------'
|
|||
|
|
."\n\n".'Thanks for using sh404SEF!'
|
|||
|
|
."\n\n"
|
|||
|
|
;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['SH404SEF_PAGES_TO_CLEAN_LOGS'] =
|
|||
|
|
'// number of pages between checks to remove old log files
|
|||
|
|
// if 1, we check at every page request';
|
|||
|
|
$shDefaultParams['SH404SEF_PAGES_TO_CLEAN_LOGS'] = 10000;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['SH_VM_ALLOW_PRODUCTS_IN_MULTIPLE_CATS'] =
|
|||
|
|
'// SECTION : Virtuemart plugin parameters ----------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// set to 1 for products to have requested category name included in url
|
|||
|
|
// useful if some products are in more than one category. By default (param set to 0),
|
|||
|
|
// only one category will be used. If set to 1, all categories can be used';
|
|||
|
|
|
|||
|
|
$shDefaultParams['SH_VM_ALLOW_PRODUCTS_IN_MULTIPLE_CATS'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['SH404SEF_DP_INSERT_ALL_CATEGORIES'] =
|
|||
|
|
'// SECTION : Deeppockets plugin parameters -----------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// set to 0 to have no cat inserted /234-ContentTitle/
|
|||
|
|
// set to 1 to have only last cat added /123-CatTitle/234-ContentTitle/
|
|||
|
|
// set to 2 to have all nested cats inserted /456-Cat1Title/123-Cat2Title/234-ContentTitle/';
|
|||
|
|
$shDefaultParams['SH404SEF_DP_INSERT_ALL_CATEGORIES'] = 2;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['SH404SEF_DP_INSERT_CAT_ID'] =
|
|||
|
|
'// if non-zero, id of each cat will be inserted in the url /123-CatTitle/';
|
|||
|
|
$shDefaultParams['SH404SEF_DP_INSERT_CAT_ID'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['SH404SEF_DP_INSERT_CONTENT_ID'] =
|
|||
|
|
'// if non-zero, id of each content element will be inserted in url /234-ContentTitle/';
|
|||
|
|
$shDefaultParams['SH404SEF_DP_INSERT_CONTENT_ID'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['SH404SEF_DP_USE_JOOMLA_URL'] =
|
|||
|
|
'// if non-zero, DP links to content element will be identical to those
|
|||
|
|
// generated for Joomla regular content - usefull if this content can also be
|
|||
|
|
// accessed outside of DP, to avoid duplicate content penalties';
|
|||
|
|
$shDefaultParams['SH404SEF_DP_USE_JOOMLA_URL'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_SMF_PARAMS_SIMPLE_URLS'] =
|
|||
|
|
'// SECTION : com_smf plugin parameters --------------------------------------------------------------------------
|
|||
|
|
// set to 1 use simple URLs, without all details';
|
|||
|
|
$shDefaultParams['sh404SEF_SMF_PARAMS_SIMPLE_URLS'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_SMF_PARAMS_TABLE_PREFIX'] =
|
|||
|
|
'// prefix used in the DB for the SMF tables';
|
|||
|
|
$shDefaultParams['sh404SEF_SMF_PARAMS_TABLE_PREFIX'] = 'smf_';
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_SMF_PARAMS_ENABLE_STICKY'] =
|
|||
|
|
'// not used';
|
|||
|
|
$shDefaultParams['sh404SEF_SMF_PARAMS_ENABLE_STICKY'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_SOBI2_PARAMS_ALWAYS_INCLUDE_CATS'] =
|
|||
|
|
'// SECTION : SOBI2 plugin parameters ----------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// set to 1 to always include categories in SOBI2 entries
|
|||
|
|
// details pages url';
|
|||
|
|
$shDefaultParams['sh404SEF_SOBI2_PARAMS_ALWAYS_INCLUDE_CATS'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_SOBI2_PARAMS_INCLUDE_ENTRY_ID'] =
|
|||
|
|
'// set to 1 so that entry id is prepended to url';
|
|||
|
|
$shDefaultParams['sh404SEF_SOBI2_PARAMS_INCLUDE_ENTRY_ID'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_SOBI2_PARAMS_INCLUDE_CAT_ID'] =
|
|||
|
|
'// set to 1 so that category id is prepended to category name';
|
|||
|
|
$shDefaultParams['sh404SEF_SOBI2_PARAMS_INCLUDE_CAT_ID'] = 0;
|
|||
|
|
|
|||
|
|
$shDefaultParamsHelp['sh404SEF_ENABLE_XHTML_OUTPUT'] =
|
|||
|
|
'// SECTION : EXPERIMENTAL FEATURES - play at your own\'s risks ---------------------------------------------------
|
|||
|
|
|
|||
|
|
// set to 1 to have Joomla use xhtml ouput for the main component.
|
|||
|
|
// you need to have Beez template installed (though not activated)';
|
|||
|
|
$shDefaultParams['sh404SEF_ENABLE_XHTML_OUTPUT'] = 0;
|
|||
|
|
|
|||
|
|
// end of parameters
|
|||
|
|
|
|||
|
|
$sef_custom_config_file = sh404SEF_ADMIN_ABS_PATH.'custom.sef.php';
|
|||
|
|
// read user defined values, possibly recovered while upgrading
|
|||
|
|
if (file_exists($sef_custom_config_file)) {
|
|||
|
|
include($sef_custom_config_file);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// generate string for parameter modification
|
|||
|
|
$this->defaultParamList = '<?php
|
|||
|
|
// default.sef.php : custom.configuration file for sh404SEF
|
|||
|
|
// 1.3.9 - build_357 - Joomla - <a href="http://extensions.siliana.com/">extensions.Siliana.com/</a>
|
|||
|
|
|
|||
|
|
// DO NOT REMOVE THIS LINE :
|
|||
|
|
if (!defined(\'_VALID_MOS\')) die(\'Direct Access to this location is not allowed.\');
|
|||
|
|
// DO NOT REMOVE THIS LINE'."\n";
|
|||
|
|
|
|||
|
|
foreach ($shDefaultParams as $key=>$value) {
|
|||
|
|
$this->defaultParamList .= "\n";
|
|||
|
|
if (!empty ($shDefaultParamsHelp[$key]))
|
|||
|
|
$this->defaultParamList .= $shDefaultParamsHelp[$key]."\n"; // echo help text, if any
|
|||
|
|
$this->defaultParamList .= '$shDefaultParams[\''.$key.'\'] = '
|
|||
|
|
. (is_string($value) ? "'$value'" : $value)
|
|||
|
|
.";\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// read user set values for these params and create constants
|
|||
|
|
if (!empty($shDefaultParams)) {
|
|||
|
|
foreach( $shDefaultParams as $key=>$value) {
|
|||
|
|
define($key, $value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
unset($shDefaultParams);
|
|||
|
|
unset($shDefaultParamsHelp);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// compatiblity variables, for sef_ext files usage from OpenSef/SEf Advance V 1.2.4.p
|
|||
|
|
$this->encode_page_suffix = '';// if using an opensef sef_ext, we don't let them manage suffix
|
|||
|
|
$this->encode_space_char = $this->replacement;
|
|||
|
|
$this->encode_lowercase = $this->LowerCase;
|
|||
|
|
$this->encode_strip_chars = $this->stripthese;
|
|||
|
|
$this->content_page_name = str_replace('%s', '', $this->pageTexts[$GLOBALS['mosConfig_lang']]); // V 1.2.4.r
|
|||
|
|
$this->content_page_format = '%s'.$this->replacement.'%d'; // V 1.2.4.r
|
|||
|
|
$shTemp = $this->shGetReplacements();
|
|||
|
|
foreach ($shTemp as $dest=>$source) {
|
|||
|
|
$this->spec_chars_d .= $dest.',';
|
|||
|
|
$this->spec_chars .= $source.',';
|
|||
|
|
}
|
|||
|
|
rtrim($this->spec_chars_d, ',');
|
|||
|
|
rtrim($this->spec_chars, ',');
|
|||
|
|
|
|||
|
|
} // end of SefConfig
|
|||
|
|
|
|||
|
|
// V x
|
|||
|
|
function shCheckFileAccess($fileName) {
|
|||
|
|
|
|||
|
|
$ret = is_readable( sh404SEF_ABS_PATH.$fileName) && is_writable( sh404SEF_ABS_PATH.$fileName) ?
|
|||
|
|
_COM_SEF_WRITEABLE : _COM_SEF_UNWRITEABLE;
|
|||
|
|
return $ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shCheckFilesAccess() {
|
|||
|
|
|
|||
|
|
shIncludeLanguageFile(); // sometimes language file may not be included yet, need it in shCheckFileAccess
|
|||
|
|
$status = array();
|
|||
|
|
$status['administrator/components/com_sef/config'] = $this->shCheckFileAccess('administrator/components/com_sef/config');
|
|||
|
|
$status['administrator/components/com_sef'] = $this->shCheckFileAccess('administrator/components/com_sef');
|
|||
|
|
$status['administrator/components/com_sef/logs'] = $this->shCheckFileAccess('administrator/components/com_sef/logs');
|
|||
|
|
$status['administrator/components/com_sef/security'] = $this->shCheckFileAccess('administrator/components/com_sef/security');
|
|||
|
|
$status['components/com_sef/cache'] = $this->shCheckFileAccess('components/com_sef/cache');
|
|||
|
|
$this->fileAccessStatus = $status;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shInitLanguageList($currentList, $default, $defaultLangDefault) {
|
|||
|
|
$ret = array();
|
|||
|
|
if (file_exists( sh404SEF_ABS_PATH . 'administrator/components/com_joomfish/joomfish.class.php' )) {
|
|||
|
|
require_once( sh404SEF_ABS_PATH . 'administrator/components/com_joomfish/joomfish.class.php' );
|
|||
|
|
} else if (file_exists(sh404SEF_ABS_PATH . 'administrator/components/com_nokkaew/nokkaew.class.php')) {
|
|||
|
|
require_once( sh404SEF_ABS_PATH . 'administrator/components/com_nokkaew/nokkaew.class.php' );
|
|||
|
|
}
|
|||
|
|
$shKind = shIsMultilingual();
|
|||
|
|
if (!$shKind) {
|
|||
|
|
if (empty($currentList) || !isset($currentList[$GLOBALS['mosConfig_lang']])) {
|
|||
|
|
$ret[$GLOBALS['mosConfig_lang']] = $defaultLangDefault;
|
|||
|
|
} else {
|
|||
|
|
$ret[$GLOBALS['mosConfig_lang']] = $currentList[$GLOBALS['mosConfig_lang']];
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
$activeLanguages = shGetActiveLanguages();
|
|||
|
|
foreach ($activeLanguages as $language) {
|
|||
|
|
if (empty($currentList) || !isset($currentList[$language->code])) {
|
|||
|
|
$ret[$language->code] = $language->code == $GLOBALS['mosConfig_lang'] ? $defaultLangDefault : $default;
|
|||
|
|
} else {
|
|||
|
|
$ret[$language->code] = $currentList[$language->code];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return $ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function saveConfig($return_data=0) {
|
|||
|
|
|
|||
|
|
GLOBAL $database, $sef_config_file, $mosConfig_live_site, $my;
|
|||
|
|
$quoteGPC = get_magic_quotes_gpc();
|
|||
|
|
//build the data file
|
|||
|
|
$config_data = '<?php' . "\n"
|
|||
|
|
. '// custom.sef.php : configuration file for sh404SEF' . "\n"
|
|||
|
|
. '// ' . $this->version . "\n"
|
|||
|
|
. '// saved at: ' . date( 'Y-m-d H:i:s') . "\n"
|
|||
|
|
. '// by: ' . $my->username . ' (id: ' . $my->id . ' )' . "\n"
|
|||
|
|
. '// domain: ' . $mosConfig_live_site . "\n\n"
|
|||
|
|
. 'if (!defined(\'_VALID_MOS\')) die(\'Direct Access to this location is not allowed.\');' . "\n\n"
|
|||
|
|
;
|
|||
|
|
|
|||
|
|
|
|||
|
|
foreach ($this as $key=>$value) {
|
|||
|
|
if ($key != "0" && $key != 'ipWhiteList' && $key != 'ipBlackList'
|
|||
|
|
&& $key != 'uAgentWhiteList' && $key != 'uAgentBlackList'
|
|||
|
|
&& $key != 'defaultParamList'
|
|||
|
|
) {
|
|||
|
|
$config_data .= "\$$key = ";
|
|||
|
|
if ($key == 'shLangTranslateList' || $key == 'shLangInsertCodeList' || $key == 'defaultComponentStringList'
|
|||
|
|
|| $key == 'pageTexts' || $key == 'defaultComponentItemidList') {
|
|||
|
|
$datastring ='';
|
|||
|
|
foreach($value as $key2=>$data) {
|
|||
|
|
$datastring .= '"'.$key2.'"=>'.'"'.str_replace('"', '\"', $quoteGPC ? stripslashes($data):$data).'",';
|
|||
|
|
}
|
|||
|
|
$datastring = substr($datastring,0,-1);
|
|||
|
|
$config_data .= "array($datastring)";
|
|||
|
|
} else
|
|||
|
|
switch (gettype($value)) {
|
|||
|
|
case "boolean":
|
|||
|
|
$config_data .= ($value ? "true" : "false");
|
|||
|
|
break;
|
|||
|
|
case "string":
|
|||
|
|
$config_data .= "\"".str_replace('"', '\"', $quoteGPC ? stripslashes($value):$value)."\"";
|
|||
|
|
break;
|
|||
|
|
case "integer":
|
|||
|
|
case "double":
|
|||
|
|
$config_data .= strval($value);
|
|||
|
|
break;
|
|||
|
|
case "array";
|
|||
|
|
$datastring ='';
|
|||
|
|
foreach($value as $key2=>$data) {
|
|||
|
|
$datastring .= '"'.str_replace('"', '\"', $quoteGPC ? stripslashes($data):$data).'",';
|
|||
|
|
}
|
|||
|
|
$datastring = substr($datastring,0,-1);
|
|||
|
|
$config_data .= "array($datastring)";
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
$config_data .= "null";
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
$config_data .= ";\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
$config_data .= '?'.'>';
|
|||
|
|
if ($return_data == 1) {
|
|||
|
|
return $config_data;
|
|||
|
|
}else{
|
|||
|
|
// write to disk
|
|||
|
|
//if (is_writable($sef_config_file)) {
|
|||
|
|
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
|
|||
|
|
$trans_tbl = array_flip($trans_tbl);
|
|||
|
|
$config_data =strtr($config_data, $trans_tbl);
|
|||
|
|
$fd = fopen($sef_config_file, "wb");
|
|||
|
|
if (fwrite($fd, $config_data, strlen($config_data)) === FALSE) {
|
|||
|
|
$ret = 0;
|
|||
|
|
}else{
|
|||
|
|
$ret = 1;
|
|||
|
|
}
|
|||
|
|
fclose($fd);
|
|||
|
|
// save lists
|
|||
|
|
shSaveFile(sh404SEF_ADMIN_ABS_PATH . 'security/sh404SEF_IP_white_list.txt', $this->ipWhiteList);
|
|||
|
|
shSaveFile(sh404SEF_ADMIN_ABS_PATH . 'security/sh404SEF_IP_black_list.txt', $this->ipBlackList);
|
|||
|
|
shSaveFile(sh404SEF_ADMIN_ABS_PATH . 'security/sh404SEF_uAgent_white_list.txt', $this->uAgentWhiteList);
|
|||
|
|
shSaveFile(sh404SEF_ADMIN_ABS_PATH . 'security/sh404SEF_uAgent_black_list.txt', $this->uAgentBlackList);
|
|||
|
|
shSaveFile(sh404SEF_ADMIN_ABS_PATH . 'custom.sef.php',
|
|||
|
|
$quoteGPC ? stripslashes($this->defaultParamList) : $this->defaultParamList);
|
|||
|
|
|
|||
|
|
// V 1.2.4.q : save copy of config file to other location for automatic recovering of config when upgrading
|
|||
|
|
$fd = fopen(sh404SEF_ABS_PATH.'media/sh404_upgrade_conf_'
|
|||
|
|
.str_replace('/','_',str_replace('http://', '', $mosConfig_live_site)).'.php', "w");
|
|||
|
|
fwrite($fd, $config_data, strlen($config_data));
|
|||
|
|
fclose($fd);
|
|||
|
|
// save lists to backup location
|
|||
|
|
if (!is_writable(sh404SEF_ABS_PATH . 'media/sh404_upgrade_conf_security')) {
|
|||
|
|
@mkdir(sh404SEF_ABS_PATH . 'media/sh404_upgrade_conf_security');
|
|||
|
|
}
|
|||
|
|
shSaveFile(sh404SEF_ABS_PATH . 'media/sh404_upgrade_conf_security/sh404SEF_IP_white_list.txt',
|
|||
|
|
$this->ipWhiteList);
|
|||
|
|
shSaveFile(sh404SEF_ABS_PATH . 'media/sh404_upgrade_conf_security/sh404SEF_IP_black_list.txt',
|
|||
|
|
$this->ipBlackList);
|
|||
|
|
shSaveFile(sh404SEF_ABS_PATH . 'media/sh404_upgrade_conf_security/sh404SEF_uAgent_white_list.txt',
|
|||
|
|
$this->uAgentWhiteList);
|
|||
|
|
shSaveFile(sh404SEF_ABS_PATH . 'media/sh404_upgrade_conf_security/sh404SEF_uAgent_black_list.txt',
|
|||
|
|
$this->uAgentBlackList);
|
|||
|
|
shSaveFile(sh404SEF_ABS_PATH . 'media/sh404_upgrade_conf_'
|
|||
|
|
.str_replace('/','_',str_replace('http://', '', $mosConfig_live_site)).'.default.php',
|
|||
|
|
$quoteGPC ? stripslashes($this->defaultParamList) : $this->defaultParamList);
|
|||
|
|
return $ret;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Return array of URL characters to be replaced.
|
|||
|
|
* Copied from Artio Joomsef V 1.4.0
|
|||
|
|
*
|
|||
|
|
* @return array
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
function shGetReplacements()
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
// V 1.2.4.q : initialize variable
|
|||
|
|
static $shReplacements = null;
|
|||
|
|
if (isset($shReplacements)) return $shReplacements;
|
|||
|
|
$shReplacements = array();
|
|||
|
|
$items = explode(',', $this->shReplacements);
|
|||
|
|
foreach ($items as $item) {
|
|||
|
|
if (!empty($item)) { // V 1.2.4.q better protection. Returns null array if empty
|
|||
|
|
@list($src, $dst) = explode('|', trim($item));
|
|||
|
|
$shReplacements[trim($src)] = trim($dst);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return $shReplacements;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Return array of URL characters to be replaced.
|
|||
|
|
* Copied from Artio Joomsef V 1.4.0
|
|||
|
|
*
|
|||
|
|
* @return array
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
function shGetStripCharList()
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
static $shStripCharList = null;
|
|||
|
|
if (is_null($shStripCharList)) {
|
|||
|
|
$shStripCharList = array();
|
|||
|
|
$shStripCharList = explode('|', $this->stripthese);
|
|||
|
|
}
|
|||
|
|
return $shStripCharList;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function set($var, $val) {
|
|||
|
|
|
|||
|
|
if (isset($this->$var)) {
|
|||
|
|
$this->$var = $val;
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function version() {
|
|||
|
|
|
|||
|
|
return $this->$version;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// set of utility functions
|
|||
|
|
|
|||
|
|
function shSortURL($string) {
|
|||
|
|
// URL must be like : index.php?param2=xxx&option=com_ccccc¶m1=zzz
|
|||
|
|
// URL returned will be ! index.php?option=com_ccccc¶m1=zzz¶m2=xxx
|
|||
|
|
$ret = '';
|
|||
|
|
$st = str_replace('&', '&',$string);
|
|||
|
|
$st = str_replace('index.php', '', $st);
|
|||
|
|
$st = str_replace('?', '', $st);
|
|||
|
|
parse_str( $st,$shVars);
|
|||
|
|
if (count($shVars) > 0) {
|
|||
|
|
ksort($shVars); // sort URL array
|
|||
|
|
$shNewString = '';
|
|||
|
|
$ret = 'index.php?';
|
|||
|
|
foreach ($shVars as $key => $value) {
|
|||
|
|
if (strtolower($key) != 'option') // option is always first parameter
|
|||
|
|
$shNewString .= '&'.$key.'='.$value;
|
|||
|
|
else
|
|||
|
|
$ret .= $key.'='.$value;
|
|||
|
|
}
|
|||
|
|
$ret .= $ret == 'index.php?' ? ltrim( $shNewString, '&') : $shNewString;
|
|||
|
|
}
|
|||
|
|
return $ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// returns found languages, but will check request language ($_GET or $_POST)
|
|||
|
|
// and use that over user lang if it exists
|
|||
|
|
// returns a lnguage code : en, fr, sp
|
|||
|
|
function shDecideRequestLanguage() {
|
|||
|
|
|
|||
|
|
$reqLang = mosGetParam( $_REQUEST, 'lang', '' );
|
|||
|
|
if( $reqLang != '' )
|
|||
|
|
$finalLang = $reqLang;
|
|||
|
|
else
|
|||
|
|
$finalLang = shDiscoverUserLanguage();
|
|||
|
|
return $finalLang;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** The function finds the language which is to be used for the user/session
|
|||
|
|
*
|
|||
|
|
* It is possible to choose the language based on the client browsers configuration,
|
|||
|
|
* the activated language of the configuration and the language a user has choosen in
|
|||
|
|
* the past. The decision of this order is done in the JoomFish configuration.
|
|||
|
|
*
|
|||
|
|
* This is a modified copy of what's available in Joomfish system bot.
|
|||
|
|
* Returns a language code : en, fr, sp
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
function shDiscoverUserLanguage() {
|
|||
|
|
|
|||
|
|
$shCookieLang = shGetCookieLanguage();
|
|||
|
|
$userLang = empty( $shCookieLang) ? shGetParamUserLanguage() : $shCookieLang;
|
|||
|
|
return $userLang;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// returns language code (en, fr, sp after lookign up Joomfish params
|
|||
|
|
// probably does not work with NokKaew
|
|||
|
|
function shGetParamUserLanguage() {
|
|||
|
|
global $mosConfig_lang, $database,$_MAMBOTS;
|
|||
|
|
|
|||
|
|
if (!shIsMultilingual())
|
|||
|
|
return $mosConfig_lang;
|
|||
|
|
|
|||
|
|
// check if param query has previously been processed
|
|||
|
|
if ( !isset($_MAMBOTS->_system_mambot_params['jfSystembot']) ) {
|
|||
|
|
// load mambot params info
|
|||
|
|
$query = "SELECT params"
|
|||
|
|
. "\n FROM #__mambots"
|
|||
|
|
. "\n WHERE element = 'jfdatabase.systembot'"
|
|||
|
|
. "\n AND folder = 'system'"
|
|||
|
|
;
|
|||
|
|
$database->setQuery( $query );
|
|||
|
|
$database->loadObject($mambot);
|
|||
|
|
|
|||
|
|
// save query to class variable
|
|||
|
|
$_MAMBOTS->_system_mambot_params['jfSystembot'] = $mambot;
|
|||
|
|
}
|
|||
|
|
// pull query data from class variable
|
|||
|
|
$mambot = $_MAMBOTS->_system_mambot_params['jfSystembot'];
|
|||
|
|
|
|||
|
|
$botParams = new mosParameters( $mambot->params );
|
|||
|
|
$determitLanguage = $botParams->def( 'determitLanguage', 1 );
|
|||
|
|
$newVisitorAction = $botParams->def( 'newVisitorAction', "browser" );
|
|||
|
|
|
|||
|
|
if ($newVisitorAction=="browser" && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) ) {
|
|||
|
|
// no language chooses - assume from browser configuration
|
|||
|
|
// language negotiation by Kochin Chang, June 16, 2004
|
|||
|
|
// retrieve active languages from database
|
|||
|
|
$active_lang = null;
|
|||
|
|
$activeLanguages = shGetActiveLanguages();
|
|||
|
|
if( count( $activeLanguages ) == 0 ) {
|
|||
|
|
return $mosConfig_lang;
|
|||
|
|
}
|
|||
|
|
foreach ($activeLanguages as $lang) {
|
|||
|
|
$active_lang[] = $lang->iso;
|
|||
|
|
}
|
|||
|
|
// figure out which language to use
|
|||
|
|
$browserLang = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
|
|||
|
|
foreach( $browserLang as $lang ) {
|
|||
|
|
$shortLang = substr( $lang, 0, 2 );
|
|||
|
|
if( in_array($lang, $active_lang) ) {
|
|||
|
|
$client_lang = $lang;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if ( in_array($shortLang, $active_lang) ) {
|
|||
|
|
$client_lang = $shortLang;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// if language is still blank then use first active language!
|
|||
|
|
if ($client_lang==""){
|
|||
|
|
$client_lang = $activeLanguages[0]->iso;
|
|||
|
|
}
|
|||
|
|
} elseif ($newVisitorAction=="joomfish"){
|
|||
|
|
// This list is ordered already!
|
|||
|
|
$activeLanguages = shGetActiveLanguages();
|
|||
|
|
if( count( $activeLanguages ) == 0 ) {
|
|||
|
|
return $mosConfig_lang;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
$client_lang = $activeLanguages[0]->iso;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} else {// otherwise default use site default language
|
|||
|
|
$activeLanguages = shGetActiveLanguages();
|
|||
|
|
if( count( $activeLanguages ) == 0 ) {
|
|||
|
|
return $mosConfig_lang;
|
|||
|
|
}
|
|||
|
|
foreach ($activeLanguages as $lang) {
|
|||
|
|
if ($lang->code==$mosConfig_lang){
|
|||
|
|
$client_lang = $lang->iso;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// if language is still blank then use first active language!
|
|||
|
|
if ($client_lang==""){
|
|||
|
|
$client_lang = $activeLanguages[0]->iso;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return $client_lang;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shGetCookieLanguage() {
|
|||
|
|
|
|||
|
|
$mbfcookie = mosGetParam( $_COOKIE, 'mbfcookie', null );
|
|||
|
|
if (isset($mbfcookie["lang"]) && $mbfcookie["lang"] != "") {
|
|||
|
|
$lang = $mbfcookie["lang"];
|
|||
|
|
} else {
|
|||
|
|
$lang = '';
|
|||
|
|
}
|
|||
|
|
return $lang;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Check if user session exists. Adapted from Joomla original code
|
|||
|
|
*/
|
|||
|
|
function shLookupSession() {
|
|||
|
|
|
|||
|
|
global $database, $mainframe;
|
|||
|
|
// initailize session variables
|
|||
|
|
$session = new mosSession( $database );
|
|||
|
|
$option = strval( strtolower( mosGetParam( $_REQUEST, 'option' ) ) );
|
|||
|
|
$mainframe = new mosMainFrame( $database, $option, '.' );
|
|||
|
|
// purge expired sessions
|
|||
|
|
$session->purge('core'); // can't purge as $mainframe is not initialized yet
|
|||
|
|
// Session Cookie `name`
|
|||
|
|
// WARNING : I am using the Hack from
|
|||
|
|
$sessionCookieName = mosMainFrame::sessionCookieName();
|
|||
|
|
// Get Session Cookie `value`
|
|||
|
|
$sessioncookie = strval( mosGetParam( $_COOKIE, $sessionCookieName, null ) );
|
|||
|
|
// Session ID / `value`
|
|||
|
|
$sessionValueCheck = mosMainFrame::sessionCookieValue( $sessioncookie );
|
|||
|
|
// Check if existing session exists in db corresponding to Session cookie `value`
|
|||
|
|
// extra check added in 1.0.8 to test sessioncookie value is of correct length
|
|||
|
|
$ret = false;
|
|||
|
|
if ( $sessioncookie && strlen($sessioncookie) == 32 && $sessioncookie != '-' && $session->load($sessionValueCheck) )
|
|||
|
|
$ret = true;
|
|||
|
|
unset($mainframe);
|
|||
|
|
return $ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// redirect user according to its language preference
|
|||
|
|
function shGuessLanguageAndRedirect( $queryString) {
|
|||
|
|
|
|||
|
|
if (!sh404SEF_DE_ACTIVATE_LANG_AUTO_REDIRECT
|
|||
|
|
&& shIsMultilingual() == 'joomfish') {
|
|||
|
|
//$referer = empty($_SERVER['HTTP_REFERER']) ? '' : $_SERVER['HTTP_REFERER'];
|
|||
|
|
//$isSelfReferer = rtrim($referer, '/') == rtrim($GLOBALS['mosConfig_live_site'], '/');
|
|||
|
|
$cookieLang = shGetCookieLanguage();
|
|||
|
|
$sessionExists = shLookupSession();
|
|||
|
|
$reqLang = mosGetParam( $_REQUEST, 'lang', '' );
|
|||
|
|
$targetLang = '';
|
|||
|
|
if (!$sessionExists /*&& !$isSelfReferer*/) { // no session and not coming from self
|
|||
|
|
if (empty($cookieLang)) { // this is really first visit (or visitor does not accept cookie)
|
|||
|
|
$discoveredLang = shGetParamUserLanguage();
|
|||
|
|
if ( $discoveredLang != $reqLang)
|
|||
|
|
$targetLang = $discoveredLang;
|
|||
|
|
} else { // returning visitor, with only a cookie set
|
|||
|
|
if ($cookieLang != $reqLang)
|
|||
|
|
$targetLang = $cookieLang;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!empty($targetLang)) { // 303 redirect to same URL in preferred language
|
|||
|
|
$queryString = shSetURLVar( 'index.php?'.$queryString, 'lang', $targetLang);
|
|||
|
|
_log('Redirecting (303) to user language |cookie = '.$cookieLang. '|session='.$sessionExists.'|req='.$reqLang.'|target='.$targetLang);
|
|||
|
|
shRedirect( $GLOBALS['mosConfig_live_site'].'/'.$queryString, '', 303);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 1.2.4.t 10/08/2007 12:17:37 return false if not multilingual
|
|||
|
|
function shIsMultilingual() {
|
|||
|
|
|
|||
|
|
if (class_exists('JoomFishManager'))
|
|||
|
|
$shIsMultiLingual = 'joomfish';
|
|||
|
|
elseif (class_exists('NokKaewManager'))
|
|||
|
|
$shIsMultiLingual = 'mambo';
|
|||
|
|
else $shIsMultiLingual = false;
|
|||
|
|
return $shIsMultiLingual;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 1.2.4.t 10/08/2007 12:17:37 return true if param is default language
|
|||
|
|
function shIsDefaultLang( $langName) {
|
|||
|
|
|
|||
|
|
return $langName == shGetDefaultLang();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 1.2.4.t 10/08/2007 12:17:37 return true if param is default language
|
|||
|
|
function shGetDefaultLang() {
|
|||
|
|
|
|||
|
|
$type = shIsMultilingual();
|
|||
|
|
switch ($type) {
|
|||
|
|
case false:
|
|||
|
|
$shDefaultLang = $GLOBALS['mosConfig_lang'];
|
|||
|
|
break;
|
|||
|
|
case 'joomfish':
|
|||
|
|
if (!empty($GLOBALS['mosConfig_defaultLang']))
|
|||
|
|
$shDefaultLang = $GLOBALS['mosConfig_defaultLang'];
|
|||
|
|
else $shDefaultLang = $GLOBALS['mosConfig_lang'];
|
|||
|
|
break;
|
|||
|
|
case 'mambo':
|
|||
|
|
$shDefaultLang = shGetNameFromIsoCode(empty($GLOBALS['mosConfig_defaultLang']) ?
|
|||
|
|
$GLOBALS['mosConfig_lang']:$GLOBALS['mosConfig_defaultLang']);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
return $shDefaultLang;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function shAdjustToRewriteMode( $url) {
|
|||
|
|
global $sefConfig;
|
|||
|
|
// V 1.2.4.r if no mod_rewrite, need to force trailing /
|
|||
|
|
/*if (!empty($sefConfig->shRewriteMode)) { // V 1.2.4.s removed, may not be needed.
|
|||
|
|
$urlBits = explode('?', $url);
|
|||
|
|
if (!isset($urlBits[1]))
|
|||
|
|
$url = rtrim( str_replace( $sefConfig->suffix,'', $url), '/').'/';
|
|||
|
|
else {
|
|||
|
|
$url = rtrim( str_replace( $sefConfig->suffix,'', $urlBits[0]), '/').'/?'.$urlBits[1];
|
|||
|
|
}
|
|||
|
|
}*/
|
|||
|
|
return $url;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shFinalizeURL( $url) {
|
|||
|
|
global $sefConfig;
|
|||
|
|
if (!empty($url) && (strpos($url, '/index.php?/') === false)) { // V w 27/08/2007 13:38:34 sh_NetURL does not work if
|
|||
|
|
$URI = new sh_Net_URL($url); // using this rewrite mode as the added ? fools it if there is indeed
|
|||
|
|
if (!empty($URI->path)) { // a query string. Better not do anything
|
|||
|
|
$url = $URI->protocol.'://'.$URI->host.(!sh404SEF_USE_NON_STANDARD_PORT || empty($URI->port) ? '' : ':'.$URI->port);
|
|||
|
|
//$shTemp = $sefConfig->LowerCase ? strtolower($URI->path) : $URI->path; // V w 27/08/2007 13:10:00
|
|||
|
|
//$url .= $sefConfig->shEncodeUrl ? shUrlEncode( $shTemp) : $shTemp;
|
|||
|
|
$url .= $sefConfig->shEncodeUrl ? shUrlEncode( $URI->path) : $URI->path;
|
|||
|
|
if (count($URI->querystring) > 0) {
|
|||
|
|
$shTemp = '';
|
|||
|
|
foreach ($URI->querystring as $key=>$value)
|
|||
|
|
$shTemp .= '&'.$key.'='.($sefConfig->shEncodeUrl ? shUrlEncode($value) : $value);
|
|||
|
|
$shTemp = ltrim( $shTemp, '&'); // V x 02/09/2007 21:17:19
|
|||
|
|
$url .= '?'. $shTemp; // V x 02/09/2007 21:17:24
|
|||
|
|
}
|
|||
|
|
if ($URI->anchor)
|
|||
|
|
$url .= '#'.($sefConfig->shEncodeUrl ? shUrlEncode($URI->anchor) : $URI->anchor);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// V 1.2.4.s hack to workaround Virtuemart/SearchEngines issue with cookie check
|
|||
|
|
// V 1.2.4.t fixed bug, was checking for vmcchk instead of vmchk
|
|||
|
|
if (shIsSearchEngine() && (strpos( $url, 'vmchk') !== false)) {
|
|||
|
|
$url = str_replace('vmchk/', '', $url); // remove check,
|
|||
|
|
//cookie will be forced if user agent is searchengine
|
|||
|
|
}
|
|||
|
|
$url = shAdjustToRewriteMode ($url);
|
|||
|
|
return str_replace('&', '&', $url); // V 1.2.4.t XHTML validation
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V 1.2.4.p compatibility function with SEFAdvance
|
|||
|
|
function sefencode( $string) {
|
|||
|
|
return titleToLocation( $string);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function titleToLocation(&$title)
|
|||
|
|
{
|
|||
|
|
global $sefConfig;
|
|||
|
|
$debug = 0;
|
|||
|
|
if ($debug) $t[] = $title;
|
|||
|
|
$shRep = $sefConfig->shGetReplacements();
|
|||
|
|
if (!empty($shRep))
|
|||
|
|
$title = strtr($title, $shRep);
|
|||
|
|
if ($debug) $t[] = $title;
|
|||
|
|
$shStrip = $sefConfig->shGetStripCharList();
|
|||
|
|
if (!empty($shStrip))
|
|||
|
|
$title = str_replace( $shStrip, '', $title);
|
|||
|
|
if ($debug) $t[] = $title;
|
|||
|
|
// V 1.2.4.t remove spaces
|
|||
|
|
$title = preg_replace( '/[\s]+/', $sefConfig->replacement, $title);
|
|||
|
|
if ($debug) $t[] = $title;
|
|||
|
|
$title = str_replace('\'', $sefConfig->replacement, $title);
|
|||
|
|
$title = str_replace('"', $sefConfig->replacement, $title);
|
|||
|
|
// V x strip # as it breaks anchor management
|
|||
|
|
$title = str_replace('#', $sefConfig->replacement, $title);
|
|||
|
|
// V u - 26/08/2007 10:26:58 remove question marks
|
|||
|
|
$title = str_replace('?', $sefConfig->replacement, $title);
|
|||
|
|
if ($debug) $t[] = $title;
|
|||
|
|
$title = str_replace('\\', $sefConfig->replacement, $title);
|
|||
|
|
if ($debug) $t[] = $title;
|
|||
|
|
// V 1.2.4.t remove duplicate replacement chars
|
|||
|
|
if (!empty($sefConfig->replacement)) // V x protect/allow empty
|
|||
|
|
$title = preg_replace('/'.preg_quote($sefConfig->replacement).'{2,}/', $sefConfig->replacement, $title);
|
|||
|
|
if ($debug) $t[] = $title;
|
|||
|
|
//$title = trim( $title, $sefConfig->friendlytrim); // V 1.2.4.t add SEF URL trimming of user set characters
|
|||
|
|
// V u 26/08/2007 10:33:56 removed, need to trim only full url
|
|||
|
|
$title = $sefConfig->LowerCase ? strtolower($title) : $title; // V w 27/08/2007 13:11:48
|
|||
|
|
if ($debug) $t[] = $title;
|
|||
|
|
if ($debug && strpos($t[0], '\'') !== false) {
|
|||
|
|
var_dump($t);
|
|||
|
|
die();
|
|||
|
|
}
|
|||
|
|
return $title;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V x utility 01/09/2007 22:18:55 function to remove mosmsg var from url
|
|||
|
|
function shCleanUpMosMsg( $string) {
|
|||
|
|
return preg_replace( '/(&|\?)mosmsg=[^&]*/i', '', $string);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V x utility function to remove a variable from an URL
|
|||
|
|
function shCleanUpVar( $string, $var) {
|
|||
|
|
return preg_replace( '/(&|\?)'.preg_quote($var).'=[^&]*/i', '', $string);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V x utility 01/09/2007 22:18:55 function to return mosmsg var from url
|
|||
|
|
function shGetMosMsg( $string) {
|
|||
|
|
$matches = array();
|
|||
|
|
$result = preg_match( '/(&|\?)mosmsg=[^&]*/i', $string, $matches);
|
|||
|
|
if (!empty($matches))
|
|||
|
|
return trim( $matches[0], '&?');
|
|||
|
|
else return '';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V x utility function to return lang var from url
|
|||
|
|
function shGetURLLang( $string) {
|
|||
|
|
$matches = array();
|
|||
|
|
$string = str_replace('&', '&', $string); // normalize
|
|||
|
|
$result = preg_match( '/(&|\?)lang=[^&]*/i', $string, $matches);
|
|||
|
|
if (!empty($matches)) {
|
|||
|
|
$result = trim( $matches[0], '&?');
|
|||
|
|
$result = str_replace('lang=', '', $result);
|
|||
|
|
return shGetNameFromIsoCode($result);
|
|||
|
|
}
|
|||
|
|
else return '';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V x utility function to return a var from url
|
|||
|
|
function shGetURLVar( $string, $var) {
|
|||
|
|
$matches = array();
|
|||
|
|
$string = str_replace('&', '&', $string); // normalize
|
|||
|
|
$result = preg_match( '/(&|\?)'.preg_quote($var).'=[^&]*/i', $string, $matches);
|
|||
|
|
if (!empty($matches)) {
|
|||
|
|
$result = trim( $matches[0], '&?');
|
|||
|
|
$result = str_replace($var.'=', '', $result);
|
|||
|
|
return $result;
|
|||
|
|
}
|
|||
|
|
else return '';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V x utility function to set a var in an url
|
|||
|
|
function shSetURLVar( $string, $var, $value) {
|
|||
|
|
if (empty( $string) || empty($var) || empty($value)) return $string;
|
|||
|
|
$string = str_replace('&', '&', $string); // normalize
|
|||
|
|
$exp = '/(&|\?)'.preg_quote($var).'=[^&]*/i';
|
|||
|
|
$result = preg_match( $exp, $string);
|
|||
|
|
if ($result) // var already in URL
|
|||
|
|
$result = preg_replace( $exp, '$1'.$var.'='.$value, $string);
|
|||
|
|
else { // var does not exist in URL
|
|||
|
|
$result = $string.(strpos( $string, '?') !== false ? '&':'?').$var.'='.$value;
|
|||
|
|
$result = shSortURL($result);
|
|||
|
|
}
|
|||
|
|
return $result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V 1.2.4.q utility function to clean language and pagination info from url
|
|||
|
|
function shCleanUpPag( $string) {
|
|||
|
|
$shTempString = preg_replace( '/(&|\?)limit=[^&]*/i', '', $string);
|
|||
|
|
$shTempString = preg_replace( '/(&|\?)limitstart=[^&]*/i', '', $shTempString);
|
|||
|
|
return $shTempString;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V 1.2.4.t utility function to clean language from url
|
|||
|
|
function shCleanUpLang( $string) {
|
|||
|
|
return preg_replace( '/(&|\?)lang=[a-zA-Z]{2,3}/iU', '', $string);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V 1.2.4.q utility function to clean language and pagination info from url
|
|||
|
|
function shCleanUpLangAndPag( $string) {
|
|||
|
|
$shTempString = shCleanUpLang( $string);
|
|||
|
|
$shTempString = shCleanUpPag($shTempString);
|
|||
|
|
return $shTempString;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V 1.2.4.t utility function to clean anchor from url
|
|||
|
|
function shCleanUpAnchor( $string) {
|
|||
|
|
$bits = explode('#', $string);
|
|||
|
|
return $bits[0];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// V 1.2.4.t
|
|||
|
|
function shIncludeLanguageFile() {
|
|||
|
|
if (defined( '_COM_SEF_SH_REDIR_404')) return;
|
|||
|
|
if (file_exists(sh404SEF_ADMIN_ABS_PATH.'language/'.$GLOBALS['mosConfig_lang'].'.php')) {
|
|||
|
|
include_once(sh404SEF_ADMIN_ABS_PATH.'language/'.$GLOBALS['mosConfig_lang'].'.php');
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
include_once(sh404SEF_ADMIN_ABS_PATH.'language/english.php');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function shGETGarbageCollect() { // V 1.2.4.m moved to main component from plugins
|
|||
|
|
// builds up a string using all remaining GET parameters, to be appended to the URL without any sef transformation
|
|||
|
|
// those variables passed litterally must be removed from $string as well, so that they are not stored in DB
|
|||
|
|
global $sefConfig, $shGETVars;
|
|||
|
|
if (!$sefConfig->shAppendRemainingGETVars || empty($shGETVars)) return '';
|
|||
|
|
$ret = '';
|
|||
|
|
ksort($shGETVars);
|
|||
|
|
foreach ($shGETVars as $param => $value) {
|
|||
|
|
$ret .= '&'.$param.'='.(empty($value) ? '0' : $value); // V 1.2.4.s allow value = 0
|
|||
|
|
}
|
|||
|
|
return $ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shRebuildNonSefString( $string) { // V 1.2.4.m moved to main component from plugins
|
|||
|
|
// rebuild a non-sef string, removing all GET vars that were not turned into SEF
|
|||
|
|
// as we do not want to store them in DB
|
|||
|
|
|
|||
|
|
global $sefConfig, $shRebuildNonSef;
|
|||
|
|
if (!$sefConfig->shAppendRemainingGETVars || empty($shRebuildNonSef)) return $string;
|
|||
|
|
$shNewString = '';
|
|||
|
|
if (!empty($shRebuildNonSef)) {
|
|||
|
|
foreach ($shRebuildNonSef as $param) { // need to sort, and still place option in first pos.
|
|||
|
|
if (strpos($param, 'sh404SEF_title=') !== false)
|
|||
|
|
$param = str_replace('sh404SEF_title=', 'title=', $param);
|
|||
|
|
$shNewString .= $param;
|
|||
|
|
}
|
|||
|
|
$ret = shSortUrl('index.php?'.ltrim( $shNewString, '&'));
|
|||
|
|
}
|
|||
|
|
return $ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shRemoveFromGETVarsList( $paramName) {
|
|||
|
|
global $shGETVars, $sefConfig, $shRebuildNonSef;
|
|||
|
|
|
|||
|
|
if (!$sefConfig->shAppendRemainingGETVars) return null;
|
|||
|
|
if (!empty($paramName)) {
|
|||
|
|
if (isset($shGETVars[$paramName])) {
|
|||
|
|
if (!empty($shGETVars[$paramName]))
|
|||
|
|
$shValue = $shGETVars[$paramName];
|
|||
|
|
else $shValue = '0'; // V 1.2.4.s
|
|||
|
|
$shRebuildNonSef[] = '&'.$paramName.'='.$shValue; // build up a non-sef string with the GET vars used to
|
|||
|
|
// build the SEF string. This string will be the one stored in db instead of
|
|||
|
|
// the full, original one
|
|||
|
|
unset( $shGETVars[@$paramName]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shAddToGETVarsList( $paramName, $paramValue) { // V 1.2.4.m
|
|||
|
|
global $shGETVars, $shRebuildNonSef;
|
|||
|
|
if (empty( $paramName)) return;
|
|||
|
|
$shGETVars[$paramName] = $paramValue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shFinalizePlugin( $string, $title, &$shAppendString, $shItemidString,
|
|||
|
|
$limit, $limitstart, $shLangName) { // V 1.2.4.s
|
|||
|
|
if (!empty($shItemidString))
|
|||
|
|
$title[] = $shItemidString; // V 1.2.4.m
|
|||
|
|
// stitch back additional parameters, not sef-ified
|
|||
|
|
$shAppendString .= shGETGarbageCollect(); // add automatically all GET variables that had not been used already
|
|||
|
|
if (!empty($shAppendString))
|
|||
|
|
$shAppendString = '?'.ltrim( $shAppendString, '&'); // don't add to $string, otherwise it will be stored in the DB
|
|||
|
|
return sef_404::sefGetLocation( shRebuildNonSefString( $string), $title, null, (isset($limit) ? @$limit : null), (isset($limitstart) ? @$limitstart : null), (isset($shLangName) ? @$shLangName : null));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shInitializePlugin($lang, &$shLangName, &$shLangIso, $option) {
|
|||
|
|
global $mosConfig_lang;
|
|||
|
|
|
|||
|
|
$shLangName = empty($lang) ? $mosConfig_lang : shGetNameFromIsoCode( $lang);
|
|||
|
|
$shLangIso = (shTranslateUrl($option, $shLangName)) ?
|
|||
|
|
(isset($lang) ? $lang : shGetIsoCodeFromName( $mosConfig_lang))
|
|||
|
|
: (isset($GLOBALS['mosConfig_defaultLang']) ?
|
|||
|
|
shGetIsoCodeFromName($GLOBALS['mosConfig_defaultLang'])
|
|||
|
|
: shGetIsoCodeFromName( $mosConfig_lang));
|
|||
|
|
if (strpos($shLangIso, '_') !== false) { //11/08/2007 14:30:16 mambo compat
|
|||
|
|
$shTemp = explode( '_', $shLangIso);
|
|||
|
|
$shLangIso = $shTemp[0];
|
|||
|
|
}
|
|||
|
|
// added protection : do not SEF if component is not installed. Do not attempt to build SEF URL
|
|||
|
|
// if component is not installed, or else plugin may try to read from comp DB tables. This will cause DB table names
|
|||
|
|
// to be displayed
|
|||
|
|
return !sh404SEF_CHECK_COMP_IS_INSTALLED
|
|||
|
|
|| ( sh404SEF_CHECK_COMP_IS_INSTALLED &&
|
|||
|
|
file_exists(sh404SEF_ABS_PATH.'components/'.$option.'/'.str_replace('com_', '',$option).'.php'));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shLoadPluginLanguage ( $pluginName, $language, $defaultString) { // V 1.2.4.m
|
|||
|
|
global $sh_LANG;
|
|||
|
|
// load the Language File
|
|||
|
|
if (file_exists( sh404SEF_ADMIN_ABS_PATH.'language/plugins/'.$pluginName.'.php' )) {
|
|||
|
|
include_once( sh404SEF_ADMIN_ABS_PATH.'language/plugins/'.$pluginName.'.php' );
|
|||
|
|
}
|
|||
|
|
else die('sh404SEF - missing language file for plugin '.$pluginName.'. Cannot continue.');
|
|||
|
|
|
|||
|
|
if (!isset($sh_LANG[$language][$defaultString]))
|
|||
|
|
return 'en';
|
|||
|
|
else return $language;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shInsertIsoCodeInUrl($compName, $shLang = null) { // V 1.2.4.m
|
|||
|
|
global $sefConfig, $mosConfig_lang;
|
|||
|
|
$shLang = empty($shLang) ? $mosConfig_lang : $shLang; // V 1.2.4.q
|
|||
|
|
if (empty($compName) || !$sefConfig->shInsertLanguageCode // if no compname or global param is off
|
|||
|
|
|| $sefConfig->shLangInsertCodeList[$shLang] == 2 // set to not insertcode
|
|||
|
|
|| ( $sefConfig->shLangInsertCodeList[$shLang] == 0 && shGetDefaultlang() == $shLang) // or set to default
|
|||
|
|
) // but this is default language
|
|||
|
|
return false;
|
|||
|
|
$compName = str_replace('com_', '', $compName);
|
|||
|
|
return !in_array($compName, $sefConfig->notInsertIsoCodeList);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shTranslateUrl ($compName, $shLang = null) { // V 1.2.4.m // V 1.2.4.q added $shLang param
|
|||
|
|
global $sefConfig, $mosConfig_lang;
|
|||
|
|
|
|||
|
|
$shLang = empty($shLang) ? $mosConfig_lang : $shLang;
|
|||
|
|
if (empty($compName) || !$sefConfig->shTranslateURL
|
|||
|
|
|| $sefConfig->shLangTranslateList[$shLang] == 2 ) // set to not translate
|
|||
|
|
return false;
|
|||
|
|
$compName = str_replace('com_', '', $compName);
|
|||
|
|
$result = !in_array($compName, $sefConfig->notTranslateURLList);
|
|||
|
|
return $result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V 1.2.4.q returns true if current page is home page.
|
|||
|
|
function shIsCurrentPageHome() {
|
|||
|
|
global $option, $shHomeLink;
|
|||
|
|
|
|||
|
|
$currentPage = shSortUrl( preg_replace( '/(&|\?)lang=[a-zA-Z]{2,3}/iU', '', $_SERVER['QUERY_STRING'])); // V 1.2.4.t
|
|||
|
|
$currentPage = ltrim( str_replace('index.php', '', $currentPage), '/');
|
|||
|
|
$currentPage = ltrim( $currentPage, '?');
|
|||
|
|
$shHomePage = preg_replace( '/(&|\?)lang=[a-zA-Z]{2,3}/iU', '', $shHomeLink);
|
|||
|
|
$shHomePage = ltrim( str_replace('index.php', '', $shHomePage), '/');
|
|||
|
|
$shHomePage = ltrim( $shHomePage, '?');
|
|||
|
|
return $currentPage == $shHomePage;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shUrlEncode( $path) {
|
|||
|
|
$ret = $path;
|
|||
|
|
if (!empty($path)) {
|
|||
|
|
$bits = explode('/', $path);
|
|||
|
|
$enc = array();
|
|||
|
|
if (count($bits)) {
|
|||
|
|
foreach ($bits as $key=>$value) {
|
|||
|
|
$enc[$key] = rawurlencode($value);
|
|||
|
|
}
|
|||
|
|
$ret = implode($enc,'/');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return $ret;
|
|||
|
|
}
|
|||
|
|
function shUrlDecode( $path) {
|
|||
|
|
$ret = $path;
|
|||
|
|
if (!empty($path)) {
|
|||
|
|
$bits = explode('/', $path);
|
|||
|
|
$dec = array();
|
|||
|
|
if (count($bits)) {
|
|||
|
|
foreach ($bits as $key=>$value) {
|
|||
|
|
$dec[$key] = rawurldecode($value);
|
|||
|
|
}
|
|||
|
|
$ret = implode($dec,'/');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return $ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// returns default items per page from menu items params. menu item selected by its id taken from a URL
|
|||
|
|
function shGetDefaultDisplayNumFromURL($url) {
|
|||
|
|
|
|||
|
|
$menuItemid = shGetURLVar($url, 'Itemid');
|
|||
|
|
return shGetDefaultDisplayNum($menuItemid);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// returns default items per page from menu items params. menu item selected by its id taken from a URL
|
|||
|
|
function shGetDefaultDisplayNum($menuItemid) {
|
|||
|
|
global $mainframe, $database, $mosConfig_list_limit;
|
|||
|
|
|
|||
|
|
$ret = $mosConfig_list_limit; // defaults to site default items per page value
|
|||
|
|
if (empty($menuItemid)) return $ret; // no itemid
|
|||
|
|
$menu = new mosMenu( $database );
|
|||
|
|
$menuItem = $menu->load($menuItemid); // load menu item from DB
|
|||
|
|
if (empty($menuItem)) return $ret; // if none, default
|
|||
|
|
$params = new mosParameters( $menu->params ); // get params from menu item
|
|||
|
|
$ret = $params->get('display_num', $mosConfig_list_limit); // get number of items per page
|
|||
|
|
return $ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getSefUrlFromDatabase($url, &$sefString) // V 1.2.4.t
|
|||
|
|
{
|
|||
|
|
global $database;
|
|||
|
|
$query = "SELECT oldurl, dateadd FROM #__redirection WHERE newurl = '".$database->getEscaped($url)."'";
|
|||
|
|
$database->setQuery($query); // 10/08/2007 22:10:05 mambo compat
|
|||
|
|
if ($database->loadObject($result)) {
|
|||
|
|
$sefString = $result->oldurl;
|
|||
|
|
if (empty($result->oldurl))
|
|||
|
|
return sh404SEF_URLTYPE_404;
|
|||
|
|
return $result->dateadd == '0000-00-00' ? sh404SEF_URLTYPE_AUTO : sh404SEF_URLTYPE_CUSTOM;
|
|||
|
|
} else
|
|||
|
|
return sh404SEF_URLTYPE_NONE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V 1.2.4.t check both cache and DB
|
|||
|
|
function shGetSefURLFromCacheOrDB($string, &$sefString) {
|
|||
|
|
global $sefConfig;
|
|||
|
|
if (empty($string)) return sh404SEF_URLTYPE_NONE;
|
|||
|
|
$sefString = '';
|
|||
|
|
$urlType = sh404SEF_URLTYPE_NONE;
|
|||
|
|
if ($sefConfig->shUseURLCache)
|
|||
|
|
$urlType = shGetSefURLFromCache($string, $sefString);
|
|||
|
|
// Check if the url is already saved in the database.
|
|||
|
|
if ($urlType == sh404SEF_URLTYPE_NONE) {
|
|||
|
|
$urlType = getSefUrlFromDatabase($string, $sefString);
|
|||
|
|
if ($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404)
|
|||
|
|
return $urlType;
|
|||
|
|
else {
|
|||
|
|
if ($sefConfig->shUseURLCache) {
|
|||
|
|
shAddSefURLToCache( $string, $sefString, $urlType);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return $urlType;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// add URL to DB and cache. URL must no exists, this is insert, not update
|
|||
|
|
function shAddSefUrlToDBAndCache( $nonSefUrl, $sefString, $rank, $urlType) {
|
|||
|
|
global $database;
|
|||
|
|
$sefString = ltrim( $sefString, '/'); // V 1.2.4.t just in case you forgot to remove leading slash
|
|||
|
|
switch ($urlType) {
|
|||
|
|
case sh404SEF_URLTYPE_AUTO :
|
|||
|
|
$dateAdd = '0000-00-00';
|
|||
|
|
break;
|
|||
|
|
case sh404SEF_URLTYPE_CUSTOM :
|
|||
|
|
$dateAdd = date("Y-m-d");
|
|||
|
|
break;
|
|||
|
|
case sh404SEF_URLTYPE_NONE :
|
|||
|
|
return null;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
$query = '';
|
|||
|
|
if ($urlType == sh404SEF_URLTYPE_AUTO) { // before adding a full sef, we must check it does not already exists as a 404
|
|||
|
|
$query = 'SELECT id FROM #__redirection where oldurl=\''.$sefString.'\' AND newurl = \'\';';
|
|||
|
|
_log('Querying for 404 : '.$query);
|
|||
|
|
$database->setQuery($query);
|
|||
|
|
$database->loadObject($result); // instead of inserting, we must update this 404 record
|
|||
|
|
if (!empty($result))
|
|||
|
|
$query = 'UPDATE #__redirection SET '. // V 1.2.4.q
|
|||
|
|
"newurl='".addslashes(urldecode($nonSefUrl))."', rank='".$rank."', dateadd='".$dateAdd.'\' '
|
|||
|
|
."WHERE oldurl = '".$sefString."';";
|
|||
|
|
else $query = '';
|
|||
|
|
}
|
|||
|
|
if (empty($query)) {
|
|||
|
|
$query = "INSERT INTO #__redirection (oldurl, newurl, rank, dateadd) ". // V 1.2.4.q
|
|||
|
|
"VALUES ('".$sefString."', '".addslashes(urldecode($nonSefUrl))."', '".$rank."', '".$dateAdd."')"; // V 1.2.4.q
|
|||
|
|
}
|
|||
|
|
_log('Querying to insert/update sef record : '.$query);
|
|||
|
|
$database->setQuery($query);
|
|||
|
|
if (!$database->query()) {
|
|||
|
|
_log('Bad query '. $query);
|
|||
|
|
}
|
|||
|
|
// shumisha 2007-03-13 added URL caching, need to store this new URL
|
|||
|
|
shAddSefURLToCache( $nonSefUrl, $sefString, $urlType);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// V 1.2.4.t build up a string with a page number
|
|||
|
|
function shBuildPageNumberString( $pagenum) {
|
|||
|
|
global $sefConfig;
|
|||
|
|
|
|||
|
|
if ($sefConfig->pagetext && (false !== strpos($sefConfig->pagetext, '%s'))){
|
|||
|
|
return str_replace('%s', $pagenum, $sefConfig->pagetext);
|
|||
|
|
} else {
|
|||
|
|
return $pagenum;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shReadFile($shFileName, $asString = false){
|
|||
|
|
$ret = array();
|
|||
|
|
if (is_readable($shFileName)) {
|
|||
|
|
$shFile = fOpen($shFileName, 'r');
|
|||
|
|
do {
|
|||
|
|
$shRead = fgets($shFile,1024);
|
|||
|
|
if (!empty($shRead) && substr($shRead, 0, 1) != '#') $ret[] = trim(stripslashes($shRead));
|
|||
|
|
}
|
|||
|
|
while (!feof($shFile));
|
|||
|
|
fclose($shFile);
|
|||
|
|
}
|
|||
|
|
if ($asString)
|
|||
|
|
$ret = implode("\n", $ret);
|
|||
|
|
return $ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shSaveFile($shFileName, $fileData){
|
|||
|
|
if (empty($shFileName)) return;
|
|||
|
|
$fileIsThere = file_exists($shFileName);
|
|||
|
|
if (!$fileIsThere || ($fileIsThere && is_writable($shFileName))) {
|
|||
|
|
$dataFile=fopen( $shFileName,'wb');
|
|||
|
|
if ($dataFile) {
|
|||
|
|
if (is_array($fileData)) {
|
|||
|
|
$fileData = implode("\n",$fileData); //make sure we write a string
|
|||
|
|
}
|
|||
|
|
fWrite( $dataFile, empty($fileData) ? '':$fileData);
|
|||
|
|
fClose( $dataFile);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// shumisha utility function to obtain iso code from language name
|
|||
|
|
function shGetIsoCodeFromName($langName) {
|
|||
|
|
global $database, $shIsoCodeCache, $mosConfig_locale, $mosConfig_lang;
|
|||
|
|
if (!isset( $shIsoCodeCache[$langName])) {
|
|||
|
|
$type = shIsMultilingual();
|
|||
|
|
if ($type != false) {
|
|||
|
|
if ($type == 'joomfish') {
|
|||
|
|
$isFish17 = strpos(JoomFishManager::getVersion(), 'V1.7') !== false;
|
|||
|
|
$select = $isFish17 ? 'iso, code' : 'iso, shortcode, code';
|
|||
|
|
}
|
|||
|
|
$query = 'SELECT '.($type == 'joomfish' ? $select :'mambo,name')
|
|||
|
|
.' FROM '.($type == 'joomfish' ? '#__languages':'#__nok_language').' WHERE 1';
|
|||
|
|
$database->setQuery($query);
|
|||
|
|
$rows = $database->loadObjectList();
|
|||
|
|
foreach ($rows as $row) {
|
|||
|
|
if ($type == 'joomfish')
|
|||
|
|
$jfIsoCode = $isFish17 ? $row->iso : (empty($row->shortcode) ? $row->iso:$row->shortcode);
|
|||
|
|
$shIsoCodeCache[($type == 'joomfish' ? $row->code:$row->name)] = ($type == 'joomfish' ? $jfIsoCode:$row->mambo);
|
|||
|
|
}
|
|||
|
|
} else { // no joomfish, so it has to be default language
|
|||
|
|
$shTemp = explode( '_', $mosConfig_locale);
|
|||
|
|
$langName = $mosConfig_lang;
|
|||
|
|
$shIsoCodeCache[$mosConfig_lang] = $shTemp[0] ? $shTemp[0] : 'en';
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return empty($shIsoCodeCache[$langName]) ? 'en' : $shIsoCodeCache[$langName];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// shumisha utility function to obtain language name from iso code
|
|||
|
|
function shGetNameFromIsoCode($langCode) {
|
|||
|
|
global $database, $shLangNameCache, $mosConfig_lang, $shLangNameCache;
|
|||
|
|
if (empty( $shLangNameCache)) {
|
|||
|
|
$type = shIsMultilingual();
|
|||
|
|
if ($type !== false) {
|
|||
|
|
if ($type == 'joomfish') {
|
|||
|
|
$isFish17 = strpos(JoomFishManager::getVersion(), 'V1.7') !== false;
|
|||
|
|
$select = $isFish17 ? 'iso, code' : 'iso, shortcode, code';
|
|||
|
|
}
|
|||
|
|
$query = 'SELECT '.($type == 'joomfish' ? $select:'mambo, name')
|
|||
|
|
.' FROM '.($type == 'joomfish' ? '#__languages':'#__nok_language').' WHERE 1';
|
|||
|
|
$database->setQuery($query);
|
|||
|
|
$rows = $database->loadObjectList();
|
|||
|
|
foreach ($rows as $row) {
|
|||
|
|
if ($type == 'joomfish')
|
|||
|
|
$jfIsoCode = $isFish17 ? $row->iso : (empty($row->shortcode) ? $row->iso:$row->shortcode);
|
|||
|
|
$shLangNameCache[($type == 'joomfish' ? $jfIsoCode:$row->mambo)] = ($type == 'joomfish' ? $row->code:$row->name);
|
|||
|
|
}
|
|||
|
|
return empty($shLangNameCache[$langCode]) ? $mosConfig_lang : $shLangNameCache[$langCode];
|
|||
|
|
} else { // no joomfish, so it has to be default language
|
|||
|
|
return $mosConfig_lang;
|
|||
|
|
}
|
|||
|
|
} else return empty($shLangNameCache[$langCode]) ? $mosConfig_lang : $shLangNameCache[$langCode];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// utility function to return list of available languages / isolate from JFish/Nokkaew compat issues
|
|||
|
|
function shGetActiveLanguages() {
|
|||
|
|
|
|||
|
|
static $shActiveLanguages = null; // cache this, to reduce DB queries
|
|||
|
|
if (!is_null($shActiveLanguages))
|
|||
|
|
return $shActiveLanguages;
|
|||
|
|
|
|||
|
|
$shKind = shIsMultilingual();
|
|||
|
|
if (empty($shKind)) { // not multilingual
|
|||
|
|
$shLang->code = $GLOBALS['mosConfig_lang'];
|
|||
|
|
$shTemp = explode( '_', $GLOBALS['mosConfig_locale']);
|
|||
|
|
$shLang->iso = $shTemp[0] ? $shTemp[0] : 'en';
|
|||
|
|
$shActiveLanguages[] = $shLang;
|
|||
|
|
return $shActiveLanguages;
|
|||
|
|
}
|
|||
|
|
if ($shKind == 'joomfish')
|
|||
|
|
$tempList = JoomFishManager::getActiveLanguages();
|
|||
|
|
else {
|
|||
|
|
if (empty($database) && class_exists('mamboDatabase')) { // sometimes with Mambo, $databse is not set
|
|||
|
|
$database =& mamboDatabase::getInstance();
|
|||
|
|
$flag = true;
|
|||
|
|
}
|
|||
|
|
$tempList = array();
|
|||
|
|
|
|||
|
|
$database->setQuery( 'SELECT * FROM #__nok_language WHERE active=1 order by ordering' );
|
|||
|
|
$rows = $database->loadObjectList('id');
|
|||
|
|
if( $rows ) {
|
|||
|
|
foreach ($rows as $row) {
|
|||
|
|
$shTemp = null;
|
|||
|
|
$shTemp->code = $row->name;
|
|||
|
|
$shTemp->iso = $row->mambo;
|
|||
|
|
$tempList[] = $shTemp;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
foreach ($tempList as $language) {
|
|||
|
|
$shLang = null;
|
|||
|
|
$shLang->code = $language->code;
|
|||
|
|
$shLang->iso = $language->iso;
|
|||
|
|
$shActiveLanguages[] = $shLang;
|
|||
|
|
}
|
|||
|
|
return $shActiveLanguages;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// returns prefix for $option component, as per user settings
|
|||
|
|
function shGetComponentPrefix( $option) {
|
|||
|
|
|
|||
|
|
if (empty($option)) return '';
|
|||
|
|
global $sefConfig;
|
|||
|
|
$option = str_replace('com_', '', $option);
|
|||
|
|
$prefix = '';
|
|||
|
|
$prefix = empty($sefConfig->defaultComponentStringList[@$option]) ?
|
|||
|
|
'':$sefConfig->defaultComponentStringList[@$option];
|
|||
|
|
return $prefix;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// returns default Itemid for $option component, as per user settings
|
|||
|
|
function shGetDefaultItemid( $option) {
|
|||
|
|
|
|||
|
|
if (empty($option)) return '';
|
|||
|
|
global $sefConfig;
|
|||
|
|
$option = str_replace('com_', '', $option);
|
|||
|
|
$itemid = '';
|
|||
|
|
$itemid = empty($sefConfig->defaultComponentItemidList[@$option]) ?
|
|||
|
|
'':intval($sefConfig->defaultComponentItemidList[@$option]);
|
|||
|
|
return $itemid;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shRedirect( $url, $msg='', $redirKind = '301' ) {
|
|||
|
|
|
|||
|
|
global $mainframe, $sefConfig;
|
|||
|
|
|
|||
|
|
// specific filters
|
|||
|
|
if (class_exists('InputFilter')) { // mambo does not have Input filters
|
|||
|
|
$iFilter = new InputFilter();
|
|||
|
|
$url = $iFilter->process( $url );
|
|||
|
|
if (!empty($msg)) {
|
|||
|
|
$msg = $iFilter->process( $msg );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ($iFilter->badAttributeValue( array( 'href', $url ))) {
|
|||
|
|
$url = $GLOBALS['mosConfig_live_site'];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (trim( $msg )) {
|
|||
|
|
if (strpos( $url, '?' ) !== false && $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode] != '/index.php?/') {
|
|||
|
|
$url .= '&mosmsg=' . rawurlencode( $msg );
|
|||
|
|
} else {
|
|||
|
|
$url .= '?mosmsg=' . rawurlencode( $msg );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (headers_sent()) {
|
|||
|
|
echo "<script>document.location.href='$url';</script>\n";
|
|||
|
|
} else {
|
|||
|
|
@ob_end_clean(); // clear output buffer
|
|||
|
|
switch ($redirKind) {
|
|||
|
|
case '302':
|
|||
|
|
$redirHeader ='HTTP/1.1 302 Moved Temporarily';
|
|||
|
|
break;
|
|||
|
|
case '303':
|
|||
|
|
$redirHeader ='HTTP/1.1 303 See Other';
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
$redirHeader = 'HTTP/1.1 301 Moved Permanently';
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
header( $redirHeader );
|
|||
|
|
header( "Location: ". $url );
|
|||
|
|
}
|
|||
|
|
exit();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Net/Url.php From the PEAR Library (http://pear.php.net/package/sh_Net_URL)
|
|||
|
|
// +-----------------------------------------------------------------------+
|
|||
|
|
// | Copyright (c) 2002-2004, Richard Heyes |
|
|||
|
|
// | All rights reserved. |
|
|||
|
|
// | |
|
|||
|
|
// | Redistribution and use in source and binary forms, with or without |
|
|||
|
|
// | modification, are permitted provided that the following conditions |
|
|||
|
|
// | are met: |
|
|||
|
|
// | |
|
|||
|
|
// | o Redistributions of source code must retain the above copyright |
|
|||
|
|
// | notice, this list of conditions and the following disclaimer. |
|
|||
|
|
// | o Redistributions in binary form must reproduce the above copyright |
|
|||
|
|
// | notice, this list of conditions and the following disclaimer in the |
|
|||
|
|
// | documentation and/or other materials provided with the distribution.|
|
|||
|
|
// | o The names of the authors may not be used to endorse or promote |
|
|||
|
|
// | products derived from this software without specific prior written |
|
|||
|
|
// | permission. |
|
|||
|
|
// | |
|
|||
|
|
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
|||
|
|
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
|||
|
|
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
|||
|
|
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
|||
|
|
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
|||
|
|
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
|||
|
|
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
|||
|
|
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
|||
|
|
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
|||
|
|
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
|||
|
|
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|||
|
|
// | |
|
|||
|
|
// +-----------------------------------------------------------------------+
|
|||
|
|
// | Author: Richard Heyes <richard at php net> |
|
|||
|
|
// +-----------------------------------------------------------------------+
|
|||
|
|
//
|
|||
|
|
// $Id: sh404sef.class.php 764 2008-10-03 20:47:22Z silianacom-svn $
|
|||
|
|
//
|
|||
|
|
// sh_Net_URL Class
|
|||
|
|
class sh_Net_URL
|
|||
|
|
{
|
|||
|
|
/**
|
|||
|
|
* Full url
|
|||
|
|
* @var string
|
|||
|
|
*/
|
|||
|
|
var $url;
|
|||
|
|
/**
|
|||
|
|
* Protocol
|
|||
|
|
* @var string
|
|||
|
|
*/
|
|||
|
|
var $protocol;
|
|||
|
|
/**
|
|||
|
|
* Username
|
|||
|
|
* @var string
|
|||
|
|
*/
|
|||
|
|
var $username;
|
|||
|
|
/**
|
|||
|
|
* Password
|
|||
|
|
* @var string
|
|||
|
|
*/
|
|||
|
|
var $password;
|
|||
|
|
/**
|
|||
|
|
* Host
|
|||
|
|
* @var string
|
|||
|
|
*/
|
|||
|
|
var $host;
|
|||
|
|
/**
|
|||
|
|
* Port
|
|||
|
|
* @var integer
|
|||
|
|
*/
|
|||
|
|
var $port;
|
|||
|
|
/**
|
|||
|
|
* Path
|
|||
|
|
* @var string
|
|||
|
|
*/
|
|||
|
|
var $path;
|
|||
|
|
/**
|
|||
|
|
* Query string
|
|||
|
|
* @var array
|
|||
|
|
*/
|
|||
|
|
var $querystring;
|
|||
|
|
/**
|
|||
|
|
* Anchor
|
|||
|
|
* @var string
|
|||
|
|
*/
|
|||
|
|
var $anchor;
|
|||
|
|
/**
|
|||
|
|
* Whether to use []
|
|||
|
|
* @var bool
|
|||
|
|
*/
|
|||
|
|
var $useBrackets;
|
|||
|
|
/**
|
|||
|
|
* PHP4 Constructor
|
|||
|
|
*
|
|||
|
|
* @see __construct()
|
|||
|
|
*/
|
|||
|
|
function sh_Net_URL($url = null, $useBrackets = true)
|
|||
|
|
{
|
|||
|
|
$this->__construct($url, $useBrackets);
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* PHP5 Constructor
|
|||
|
|
*
|
|||
|
|
* Parses the given url and stores the various parts
|
|||
|
|
* Defaults are used in certain cases
|
|||
|
|
*
|
|||
|
|
* @param string $url Optional URL
|
|||
|
|
* @param bool $useBrackets Whether to use square brackets when
|
|||
|
|
* multiple querystrings with the same name
|
|||
|
|
* exist
|
|||
|
|
*/
|
|||
|
|
function __construct($url = null, $useBrackets = true)
|
|||
|
|
{
|
|||
|
|
$HTTP_SERVER_VARS = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
|
|||
|
|
$this->useBrackets = $useBrackets;
|
|||
|
|
$this->url = $url;
|
|||
|
|
$this->user = '';
|
|||
|
|
$this->pass = '';
|
|||
|
|
$this->host = '';
|
|||
|
|
$this->port = 80;
|
|||
|
|
$this->path = '';
|
|||
|
|
$this->querystring = array();
|
|||
|
|
$this->anchor = '';
|
|||
|
|
// Only use defaults if not an absolute URL given
|
|||
|
|
if (!preg_match('/^[a-z0-9]+:\/\//i', $url)) {
|
|||
|
|
$this->protocol = (isset ($HTTP_SERVER_VARS['HTTPS']) ?
|
|||
|
|
(@$HTTP_SERVER_VARS['HTTPS'] == 'on' ? 'https' : 'http') : 'http');
|
|||
|
|
/**
|
|||
|
|
* Figure out host/port
|
|||
|
|
*/
|
|||
|
|
if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) AND preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches)) {
|
|||
|
|
$host = $matches[1];
|
|||
|
|
if (!empty($matches[3])) {
|
|||
|
|
$port = $matches[3];
|
|||
|
|
} else {
|
|||
|
|
$port = $this->getStandardPort($this->protocol);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
$this->user = '';
|
|||
|
|
$this->pass = '';
|
|||
|
|
$this->host = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost');
|
|||
|
|
$this->port = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol));
|
|||
|
|
$this->path = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/';
|
|||
|
|
$this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null;
|
|||
|
|
$this->anchor = '';
|
|||
|
|
}
|
|||
|
|
// Parse the url and store the various parts
|
|||
|
|
if (!empty($url)) {
|
|||
|
|
$urlinfo = parse_url($url);
|
|||
|
|
// Default querystring
|
|||
|
|
$this->querystring = array();
|
|||
|
|
foreach ($urlinfo as $key => $value) {
|
|||
|
|
switch ($key) {
|
|||
|
|
case 'scheme':
|
|||
|
|
$this->protocol = $value;
|
|||
|
|
$this->port = $this->getStandardPort($value);
|
|||
|
|
break;
|
|||
|
|
case 'user':
|
|||
|
|
case 'pass':
|
|||
|
|
case 'host':
|
|||
|
|
case 'port':
|
|||
|
|
$this->$key = $value;
|
|||
|
|
break;
|
|||
|
|
case 'path':
|
|||
|
|
if ($value{0} == '/') {
|
|||
|
|
$this->path = $value;
|
|||
|
|
} else {
|
|||
|
|
$path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path);
|
|||
|
|
$this->path = sprintf('%s/%s', $path, $value);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 'query':
|
|||
|
|
$this->querystring = $this->_parseRawQueryString($value);
|
|||
|
|
break;
|
|||
|
|
case 'fragment':
|
|||
|
|
$this->anchor = $value;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Returns full url
|
|||
|
|
*
|
|||
|
|
* @return string Full url
|
|||
|
|
* @access public
|
|||
|
|
*/
|
|||
|
|
function getURL()
|
|||
|
|
{
|
|||
|
|
$querystring = $this->getQueryString();
|
|||
|
|
$this->url = $this->protocol . '://'
|
|||
|
|
. $this->user . (!empty($this->pass) ? ':' : '')
|
|||
|
|
. $this->pass . (!empty($this->user) ? '@' : '')
|
|||
|
|
. $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port)
|
|||
|
|
. $this->path
|
|||
|
|
. (!empty($querystring) ? '?' . $querystring : '')
|
|||
|
|
. (!empty($this->anchor) ? '#' . $this->anchor : '');
|
|||
|
|
return $this->url;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Adds a querystring item
|
|||
|
|
*
|
|||
|
|
* @param string $name Name of item
|
|||
|
|
* @param string $value Value of item
|
|||
|
|
* @param bool $preencoded Whether value is urlencoded or not, default = not
|
|||
|
|
* @access public
|
|||
|
|
*/
|
|||
|
|
function addQueryString($name, $value, $preencoded = false)
|
|||
|
|
{
|
|||
|
|
if ($preencoded) {
|
|||
|
|
$this->querystring[$name] = $value;
|
|||
|
|
} else {
|
|||
|
|
$this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Removes a querystring item
|
|||
|
|
*
|
|||
|
|
* @param string $name Name of item
|
|||
|
|
* @access public
|
|||
|
|
*/
|
|||
|
|
function removeQueryString($name)
|
|||
|
|
{
|
|||
|
|
if (isset($this->querystring[$name])) {
|
|||
|
|
unset($this->querystring[$name]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Sets the querystring to literally what you supply
|
|||
|
|
*
|
|||
|
|
* @param string $querystring The querystring data. Should be of the format foo=bar&x=y etc
|
|||
|
|
* @access public
|
|||
|
|
*/
|
|||
|
|
function addRawQueryString($querystring)
|
|||
|
|
{
|
|||
|
|
$this->querystring = $this->_parseRawQueryString($querystring);
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Returns flat querystring
|
|||
|
|
*
|
|||
|
|
* @return string Querystring
|
|||
|
|
* @access public
|
|||
|
|
*/
|
|||
|
|
function getQueryString()
|
|||
|
|
{
|
|||
|
|
if (!empty($this->querystring)) {
|
|||
|
|
foreach ($this->querystring as $name => $value) {
|
|||
|
|
if (is_array($value)) {
|
|||
|
|
foreach ($value as $k => $v) {
|
|||
|
|
$querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v);
|
|||
|
|
}
|
|||
|
|
} elseif (!is_null($value)) {
|
|||
|
|
$querystring[] = $name . '=' . $value;
|
|||
|
|
} else {
|
|||
|
|
$querystring[] = $name;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
$querystring = implode(ini_get('arg_separator.output'), $querystring);
|
|||
|
|
} else {
|
|||
|
|
$querystring = '';
|
|||
|
|
}
|
|||
|
|
return $querystring;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Parses raw querystring and returns an array of it
|
|||
|
|
*
|
|||
|
|
* @param string $querystring The querystring to parse
|
|||
|
|
* @return array An array of the querystring data
|
|||
|
|
* @access private
|
|||
|
|
*/
|
|||
|
|
function _parseRawQuerystring($querystring)
|
|||
|
|
{
|
|||
|
|
$parts = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY);
|
|||
|
|
$return = array();
|
|||
|
|
foreach ($parts as $part) {
|
|||
|
|
if (strpos($part, '=') !== false) {
|
|||
|
|
$value = substr($part, strpos($part, '=') + 1);
|
|||
|
|
$key = substr($part, 0, strpos($part, '='));
|
|||
|
|
} else {
|
|||
|
|
$value = null;
|
|||
|
|
$key = $part;
|
|||
|
|
}
|
|||
|
|
if (substr($key, -2) == '[]') {
|
|||
|
|
$key = substr($key, 0, -2);
|
|||
|
|
if (@!is_array($return[$key])) {
|
|||
|
|
$return[$key] = array();
|
|||
|
|
$return[$key][] = $value;
|
|||
|
|
} else {
|
|||
|
|
$return[$key][] = $value;
|
|||
|
|
}
|
|||
|
|
} elseif (!$this->useBrackets AND !empty($return[$key])) {
|
|||
|
|
$return[$key] = (array)$return[$key];
|
|||
|
|
$return[$key][] = $value;
|
|||
|
|
} else {
|
|||
|
|
$return[$key] = $value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return $return;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Resolves //, ../ and ./ from a path and returns
|
|||
|
|
* the result. Eg:
|
|||
|
|
*
|
|||
|
|
* /foo/bar/../boo.php => /foo/boo.php
|
|||
|
|
* /foo/bar/../../boo.php => /boo.php
|
|||
|
|
* /foo/bar/.././/boo.php => /foo/boo.php
|
|||
|
|
*
|
|||
|
|
* This method can also be called statically.
|
|||
|
|
*
|
|||
|
|
* @param string $url URL path to resolve
|
|||
|
|
* @return string The result
|
|||
|
|
*/
|
|||
|
|
function resolvePath($path)
|
|||
|
|
{
|
|||
|
|
$path = explode('/', str_replace('//', '/', $path));
|
|||
|
|
for ($i=0; $i<count($path); $i++) {
|
|||
|
|
if ($path[$i] == '.') {
|
|||
|
|
unset($path[$i]);
|
|||
|
|
$path = array_values($path);
|
|||
|
|
$i--;
|
|||
|
|
} elseif ($path[$i] == '..' AND ($i > 1 OR ($i == 1 AND $path[0] != '') ) ) {
|
|||
|
|
unset($path[$i]);
|
|||
|
|
unset($path[$i-1]);
|
|||
|
|
$path = array_values($path);
|
|||
|
|
$i -= 2;
|
|||
|
|
} elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') {
|
|||
|
|
unset($path[$i]);
|
|||
|
|
$path = array_values($path);
|
|||
|
|
$i--;
|
|||
|
|
} else {
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return implode('/', $path);
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Returns the standard port number for a protocol
|
|||
|
|
*
|
|||
|
|
* @param string $scheme The protocol to lookup
|
|||
|
|
* @return integer Port number or NULL if no scheme matches
|
|||
|
|
*
|
|||
|
|
* @author Philippe Jausions <Philippe.Jausions@11abacus.com>
|
|||
|
|
*/
|
|||
|
|
function getStandardPort($scheme)
|
|||
|
|
{
|
|||
|
|
switch (strtolower($scheme)) {
|
|||
|
|
case 'http': return 80;
|
|||
|
|
case 'https': return 443;
|
|||
|
|
case 'ftp': return 21;
|
|||
|
|
case 'imap': return 143;
|
|||
|
|
case 'imaps': return 993;
|
|||
|
|
case 'pop3': return 110;
|
|||
|
|
case 'pop3s': return 995;
|
|||
|
|
default: return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* Forces the URL to a particular protocol
|
|||
|
|
*
|
|||
|
|
* @param string $protocol Protocol to force the URL to
|
|||
|
|
* @param integer $port Optional port (standard port is used by default)
|
|||
|
|
*/
|
|||
|
|
function setProtocol($protocol, $port = null)
|
|||
|
|
{
|
|||
|
|
$this->protocol = $protocol;
|
|||
|
|
$this->port = is_null($port) ? $this->getStandardPort() : $port;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function shCloseLogFile() {
|
|||
|
|
|
|||
|
|
global $shLogger;
|
|||
|
|
if (!empty($shLogger)) {
|
|||
|
|
$shLogger->log('Closing log file at shutdown'."\n\n");
|
|||
|
|
if (!empty($shLogger->logFile))
|
|||
|
|
fClose( $shLogger->logFile);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function _log($text, $data = '') {
|
|||
|
|
|
|||
|
|
global $sefConfig, $shLogger;
|
|||
|
|
static $shutdownRegistered = false;
|
|||
|
|
|
|||
|
|
if (empty($sefConfig) || empty($sefConfig->debugToLogFile)) return;
|
|||
|
|
if (!empty($sefConfig->debugDuration) && (time()-$sefConfig->debugStartedAt) > $sefConfig->debugDuration)
|
|||
|
|
return;
|
|||
|
|
if (empty($shLogger)) {
|
|||
|
|
$shLogger = new shSimpleLogger( $GLOBALS['mosConfig_live_site'],
|
|||
|
|
sh404SEF_ADMIN_ABS_PATH.'logs/',
|
|||
|
|
'sh404SEF_debug_log',
|
|||
|
|
$sefConfig->debugToLogFile);
|
|||
|
|
}
|
|||
|
|
if (!$shutdownRegistered) {
|
|||
|
|
register_shutdown_function('shCloseLogFile');
|
|||
|
|
$shutdownRegistered = true;
|
|||
|
|
}
|
|||
|
|
$shLogger->log($text, $data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class shSimpleLogger {
|
|||
|
|
|
|||
|
|
var $traceFileName = '';
|
|||
|
|
var $isActive = 0;
|
|||
|
|
var $logFile = null;
|
|||
|
|
|
|||
|
|
function shSimpleLogger( $siteName, $basePath, $fileName, $isActive) {
|
|||
|
|
global $sefConfig;
|
|||
|
|
if (empty($isActive)) {
|
|||
|
|
$this->isActive = 0;
|
|||
|
|
return;
|
|||
|
|
} else $this->isActive = 1;
|
|||
|
|
$traceFileName = $basePath.$sefConfig->debugStartedAt.'.'.$fileName.'_'
|
|||
|
|
.str_replace('/','_',str_replace('http://', '', $siteName))
|
|||
|
|
.'.log';
|
|||
|
|
// Create file
|
|||
|
|
$fileIsThere = file_exists($traceFileName);
|
|||
|
|
$sep = "\t";
|
|||
|
|
if (!$fileIsThere) { // create file
|
|||
|
|
$shortVersion = explode(' - ', $GLOBALS['sefConfig']->version);
|
|||
|
|
$fileHeader = 'sh404SEF trace file - created : '.$this->logTime(). ' by sh404SEF '.$shortVersion[0]
|
|||
|
|
.' for '.$siteName."\n\n".str_repeat('-',25).' PHP Configuration '.str_repeat('-',25)."\n\n";
|
|||
|
|
$config = $this->parsePHPConfig();
|
|||
|
|
$line = str_repeat('-',69)."\n\n";
|
|||
|
|
} else $fileHeader = '';
|
|||
|
|
$file = fopen($traceFileName, 'ab');
|
|||
|
|
if ($file) {
|
|||
|
|
if (!empty($fileHeader)) {
|
|||
|
|
fWrite( $file, $fileHeader);
|
|||
|
|
fWrite( $file, print_r($config, true));
|
|||
|
|
fwrite( $file, $line);
|
|||
|
|
}
|
|||
|
|
$this->logFile = $file;
|
|||
|
|
} else {
|
|||
|
|
$this->isActive = 0;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function logTime() {
|
|||
|
|
return date('Y-m-d')."\t".date('H:i:s');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function log($text, $data='') {
|
|||
|
|
if (empty($this->isActive) || empty($text)) return;
|
|||
|
|
$logData = empty($data) ? '' : ":\t".print_r($data, true);
|
|||
|
|
fWrite($this->logFile, $this->logTime()."\t".$text.$logData."\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function parsePHPConfig() {
|
|||
|
|
// by Andrew dot Boag at catalyst dot net dot nz
|
|||
|
|
// found on php.net doc
|
|||
|
|
|
|||
|
|
ob_start();
|
|||
|
|
phpinfo(-1);
|
|||
|
|
$s = ob_get_contents();
|
|||
|
|
ob_end_clean();
|
|||
|
|
$a = $mtc = array();
|
|||
|
|
if (preg_match_all('/<tr><td class="e">(.*?)<\/td><td class="v">(.*?)<\/td>(:?<td class="v">(.*?)<\/td>)?<\/tr>/',$s,$mtc,PREG_SET_ORDER)){
|
|||
|
|
foreach($mtc as $v){
|
|||
|
|
if($v[2] == '<i>no value</i>') continue;
|
|||
|
|
$a[$v[1]] = $v[2];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return $a;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
?>
|