| Current Path : /var/www/iplanru/data/www/i-plan.ru/administrator/components/com_sef/classes/ |
| Current File : /var/www/iplanru/data/www/i-plan.ru/administrator/components/com_sef/classes/seftools.php |
<?php
/**
* SEF component for Joomla!
*
* @package JoomSEF
* @version 4.7.8
* @author ARTIO s.r.o., http://www.artio.net
* @copyright Copyright (C) 2020 ARTIO s.r.o.
* @license GNU/GPLv3 http://www.artio.net/license/gnu-general-public-license
*/
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();
jimport('joomla.filesystem.file');
jimport('joomla.form.form');
define('_COM_SEF_PRIORITY_DEFAULT_ITEMID', 90);
define('_COM_SEF_PRIORITY_DEFAULT', 95);
JLoader::register('SefExt', JPATH_ROOT.'/components/com_sef/sef.ext.php');
JLoader::register('JoomSEF', JPATH_ROOT.'/components/com_sef/joomsef.php');
class SEFTools
{
static function getSEFVersion()
{
static $version;
if (! isset($version)) {
$xmlFile = JPATH_ADMINISTRATOR.'/components/com_sef/sef.xml';
if (JFile::exists($xmlFile)) {
$xml = simplexml_load_file($xmlFile);
if ($xml !== false) {
$version = (string)$xml->version;
}
}
}
return $version;
}
static function getSEFInfo()
{
static $info;
if( !isset($info) ) {
$info = array();
$xmlFile = JPATH_ADMINISTRATOR . '/' . 'components' . '/' . 'com_sef' . '/' . 'sef.xml';
if (JFile::exists($xmlFile)) {
$xml = simplexml_load_file($xmlFile);
if ($xml !== false) {
$info['version'] = (string)$xml->version;
$info['creationDate'] = (string)$xml->creationDate;
$info['author'] = (string)$xml->author;
$info['authorEmail'] = (string)$xml->authorEmail;
$info['authorUrl'] = (string)$xml->authorUrl;
$info['copyright'] = (string)$xml->copyright;
$info['license'] = (string)$xml->license;
$info['description'] = JText::_((string)$xml->description);
}
}
}
return $info;
}
static function getExtVersion($extension)
{
$xml = SEFTools::getExtXML($extension);
$version = null;
if ($xml) {
$root = $xml;
$ver = (string)$root['version'];
if (($root->getName() == 'extension') && version_compare($ver, '1.5', '>=') && ((string)$root['type'] == 'sef_ext')) {
$element = & $root->version;
$version = $element ? (string)$element : '';
}
}
return $version;
}
/**
* Returns extension name from its XML file.
*
* @return string
*/
static function getExtName($extension)
{
$xml = SEFTools::getExtXML($extension);
$name = null;
if ($xml) {
$root = $xml;
$ver = (string)$root['version'];
if (($root->getName() == 'extension') && version_compare($ver, '1.5', '>=') && ((string)$root['type'] == 'sef_ext')) {
$element = & $root->name;
$name = $element ? (string)$element : '';
}
}
return $name;
}
/**
* Returns the extension XML object
*
* @param string $extension Extension option
* @return JSimpleXML Extension XML
*/
static function getExtXML($extension)
{
static $xmls;
if (! isset($xmls)) {
$xmls = array();
}
if (! isset($xmls[$extension])) {
$xmls[$extension] = null;
$xmlFile = JPATH_ROOT . '/' . 'components' . '/' . 'com_sef' . '/' . 'sef_ext' . '/' . $extension . '.xml';
if (JFile::exists($xmlFile)) {
$xmls[$extension] = simplexml_load_file($xmlFile);
}
}
return $xmls[$extension];
}
static function &getExtAcceptVars($option, $includeGlobal = true)
{
static $acceptVars = array();
if( !isset($acceptVars[$option]) ) {
$sefConfig = SEFConfig::getConfig();
$params =& SEFTools::getExtParams($option);
$aVars = trim($params->get('acceptVars', ''));
if( $aVars == '' ) {
$acceptVars[$option] = array();
}
else {
$aVars = explode(';', $aVars);
$aVars = array_map('trim', $aVars);
$acceptVars[$option] = $aVars;
}
}
return $acceptVars[$option];
}
static function &getExtFilters($option, $includeGlobal = true)
{
static $filters = array();
if( !isset($filters[$option]) ) {
$filters[$option] = array();
$filters[$option]['pos'] = array();
$filters[$option]['neg'] = array();
$db = JFactory::getDBO();
$element = str_replace('com_', 'ext_joomsef4_', $option);
$query = $db->getQuery(true);
$query->select('custom_data')->from('#__extensions')->where('type='.$db->quote('sef_ext'))->where('enabled=1')->where('element='.$db->quote($element));
$db->setQuery($query);
$row = $db->loadResult();
if ($row) {
// Parse the filters
$rules = explode("\n", $row);
$rules = array_map('trim', $rules);
if( count($rules) > 0 ) {
foreach($rules as $rule) {
// Is the rule positive or negative?
if( $rule[0] == '+' ) {
$type = 'pos';
}
else if( $rule[0] == '-' ) {
$type = 'neg';
}
else {
continue;
}
$rule = substr($rule, 1);
// Split the rule to regexp and variables parts
$pos = strrpos($rule, '=');
if( $pos === false ) {
continue;
}
$re = substr($rule, 0, $pos);
$vars = substr($rule, $pos + 1);
if ($re == '') {
continue;
}
// Create the filter object
$filter = new stdClass();
$filter->rule = $re;
if ($vars != '') {
$filter->vars = array_map('trim', explode(',', $vars));
}
else {
$filter->vars = array();
}
// Add the filter to filters
$filters[$option][$type][] = $filter;
}
}
}
}
return $filters[$option];
}
static function &getExtFiltersByVars($option, $includeGlobal = true)
{
static $byVars = array();
if (empty($option)) {
$option = '_default';
}
if( !isset($byVars[$option]) ) {
$byVars[$option] = array();
// Get filters
$filters =& SEFTools::getExtFilters($option, $includeGlobal);
if( count($filters) > 0 ) {
// Loop through filter types (pos, neg)
foreach($filters as $type => $typeFilters) {
if( count($typeFilters) > 0 ) {
// Loop through filters
foreach($typeFilters as $filter) {
if( count($filter->vars) > 0 ) {
// Loop through variables
foreach($filter->vars as $var) {
// Add filter to var and type
if( !isset($byVars[$option][$var]) ) {
$byVars[$option][$var] = array();
}
if( !isset($byVars[$option][$var][$type]) ) {
$byVars[$option][$var][$type] = array();
}
$byVars[$option][$var][$type][] = $filter->rule;
}
}
}
}
}
}
}
return $byVars[$option];
}
/**
* Returns JForm object representing extension's parameters
*
* @param string Extension name
* @return JForm Extension's parameters
*/
static function &getExtParamsForm($option)
{
static $forms;
if (!isset($forms)) {
$forms = array();
}
if (!isset($forms[$option])) {
$forms[$option] = new JForm($option, array('control' => 'params'));
// Set the extension's parameters renderer
$pxml = SEFTools::getExtParamsXML($option);
if (is_a($pxml, 'SimpleXMLElement')) {
$forms[$option]->load($pxml);
}
else if( is_array($pxml) && count($pxml) > 0 ) {
for( $i = 0, $n = count($pxml); $i < $n; $i++ ) {
if( is_a($pxml[$i], 'SimpleXMLElement') ) {
$forms[$option]->load($pxml[$i]);
}
}
}
// Set the default parameters renderer
$xml = SEFTools::getExtsDefaultParamsXML();
if (is_a($xml, 'SimpleXMLElement')) {
$forms[$option]->load($xml);
}
else if( is_array($xml) && count($xml) > 0 ) {
for( $i = 0, $n = count($xml); $i < $n; $i++ ) {
if( is_a($xml[$i], 'SimpleXMLElement') ) {
$forms[$option]->load($xml[$i]);
}
}
}
// Bind data
$forms[$option]->bind(self::getExtParams($option));
}
return $forms[$option];
}
static function &getExtParams($option)
{
$db = JFactory::getDBO();
$element = str_replace('com_', 'ext_joomsef4_', $option);
// Cache all data and parameters!!!
static $exts, $params;
// Load all params data only once
if (!isset($exts)) {
$query = $db->getQuery(true);
$query->select(array('element', 'params'))->from('#__extensions')->where('type='.$db->quote('sef_ext'));
$db->setQuery($query);
$exts = $db->loadObjectList('element');
}
// Cache params objects
if (!isset($params)) {
$params = array();
}
if (!isset($params[$element])) {
// Create new params object if used for the first time
$data = '';
if (isset($exts[$element])) {
$data = $exts[$element]->params;
}
$params[$element] = new JRegistry($data);
}
return $params[$element];
}
/**
* Returns the JSimpleXMLElement object representing
* the default parameters for every extension
*
* @return JSimpleXMLElement Extensions' default parameters
*/
static function getExtsDefaultParamsXML()
{
static $xml;
if (isset($xml)) {
return $xml;
}
$xml = null;
$xmlpath = JPATH_ROOT . '/' . 'administrator' . '/' . 'components' . '/' . 'com_sef' . '/' . 'extensions_params.xml';
if (JFile::exists($xmlpath)) {
$xml = simplexml_load_file($xmlpath);
}
return $xml;
}
/**
* Returns the JSimpleXMLElement object representing
* the extension's parameters
*
* @param string $option Extension name
* @return JSimpleXMLElement Extension's parameters
*/
static function getExtParamsXML($option)
{
static $xmls;
if (! isset($xmls)) {
$xmls = array();
}
if (! isset($xmls[$option])) {
$xmls[$option] = null;
$xml = SEFTools::getExtXML($option);
if ($xml) {
$form = $xml->form;
if (!empty($form)) {
$xmls[$option] = $form;
}
}
}
return $xmls[$option];
}
/** Returns the array of texts used by the extension for creating URLs
* in currently selected language (for JoomFish support)
*
* @param string Extension name
* @return array Extension's texts
*/
static function getExtTexts($option, $lang = '')
{
$database = JFactory::getDBO();
static $extTexts;
if ($option == '') {
return false;
}
// Set the language
if ($lang == '') {
$lang = JFactory::getLanguage()->getTag();
}
if (!isset($extTexts)) {
$extTexts = array();
}
if (!isset($extTexts[$option])) {
$extTexts[$option] = array();
}
if (!isset($extTexts[$option][$lang])) {
$extTexts[$option][$lang] = array();
// If lang is different than current language, change it
if ($lang !=JFactory::getLanguage()->getTag()) {
$language = JFactory::getLanguage();
$oldLang = $language->setLanguage($lang);
$language->load();
}
$query = "SELECT `lang_id` AS `id`";
$query.= " FROM `#__languages`";
$query.= " WHERE `lang_code` = ".$database->quote($lang);
$database->setQuery($query);
$lang_id = $database->loadResult();
//$query = "SELECT `id`, `name`, `value` FROM `#__sefexttexts` WHERE `extension` = '$option'";
$query = "SELECT `lang_id`, `name`, `value`";
$query.= " FROM `#__sefexttexts`";
$query.= " WHERE `extension` = ".$database->quote($option);
$query.= " AND (`lang_id` = 0".($lang_id ? " OR `lang_id` = ".$lang_id : "").")";
$query.= " ORDER BY `lang_id` DESC";
$database->setQuery($query);
$texts = $database->loadObjectList();
/*$ntexts=array();
for($i=0;$i<count($texts);$i++) {
$ntexts[$texts[$i]->lang_id][$texts[$i]->name]=$texts[$i];
}*/
if (is_array($texts) && (count($texts) > 0)) {
foreach (array_keys($texts) as $i) {
$name = $texts[$i]->name;
//$value = $texts[$i]->value;
if(!isset($extTexts[$option][$lang][$name])) {
$extTexts[$option][$lang][$name] = $texts[$i]->value;
}
//$extTexts[$option][$lang][$name] = $value;
}
}
// Set the language back to previously selected one
if (isset($oldLang) && ($oldLang != SEFTools::getLangLongCode())) {
$language = JFactory::getLanguage();
$language->setLanguage($oldLang);
$language->load();
}
}
return $extTexts[$option][$lang];
}
static function removeVariable($url, $var, $value = '')
{
if ($value == '') {
//$newurl = eregi_replace("(&|\?)$var=[^&]*", '\\1', $url);
$regex = "(&|\?)$var=[^&]*";
$regex = addcslashes($regex, '/');
$newurl = preg_replace('/' . $regex . '/i', '$1', $url);
} else {
$trans = array('?' => '\\?' , '.' => '\\.' , '+' => '\\+' , '*' => '\\*' , '^' => '\\^' , '$' => '\\$');
$value = strtr($value, $trans);
//$newurl = eregi_replace("(&|\?)$var=$value(&|\$)", '\\1\\2', $url);
$regex = "(&|\?)$var=$value(&|\$)";
$regex = addcslashes($regex, '/');
$newurl = preg_replace('/' . $regex . '/i', '$1$2', $url);
}
$newurl = trim($newurl, '&?');
$trans = array('&&' => '&' , '?&' => '?');
$newurl = strtr($newurl, $trans);
return $newurl;
}
static function getVariable($url, $var)
{
$value = null;
$matches = array();
if( preg_match("/[&\?]$var=([^&]*)/", $url, $matches) > 0 ) {
$value = $matches[1];
}
return $value;
}
static function extractVariable(&$url, $var)
{
$value = SEFTools::getVariable($url, $var);
$url = SEFTools::removeVariable($url, $var);
return $value;
}
/**
* Fixes numerical variable by converting it to integer in the URI
*/
static function fixVariable(&$uri, $varName)
{
$value = $uri->getVar($varName);
if (!is_null($value)) {
$value = (int) $value;
$uri->setVar($varName, $value);
}
}
/**
* Removes given variables from URI and returns a query string
* built of them
*
* @param JURI $uri
* @param array $vars Variables to remove
*/
static function RemoveVariables(&$uri, $vars)
{
$query = array();
if (is_array($vars) && count($vars) > 0) {
foreach($vars as $var) {
// Get the variable value
$value = $uri->getVar($var);
// Skip variables not present in URL
if( is_null($value) ) {
continue;
}
// Add variable to query
if( is_array($value) ) {
// Variable is an array, let's remove all its occurences
foreach($value as $key => $val) {
$query[] = $var.'['.$key.']='.urlencode($val);
}
}
else {
// Variable is not an array
$query[] = $var.'='.urlencode($value);
}
// Remove variable from URI
$uri->delVar($var);
}
}
$query = implode('&', $query);
return $query;
}
static function ReplaceAll($search, $replace, $subject)
{
while (strpos($subject, $search) !== false) {
$subject = str_replace($search, $replace, $subject);
}
return $subject;
}
/**
* Checks whether to use alias from extension parameter value
*
* @param string $params
* @param string $paramName
* @return boolean
*/
static function UseAlias(&$params, $paramName)
{
$sefConfig = SEFConfig::getConfig();
$param = $params->get($paramName, 'global');
if( ($param == 'alias') ||
($param == 'global' && $sefConfig->useAlias) )
{
return true;
}
return false;
}
/**
* Convert description of extensions from html to plain for metatags
*
* @param string $text
* @return string
*/
static function cleanDesc($text) {
// Remove javascript
$regex = "'<script[^>]*?>.*?</script>'si";
$text = preg_replace($regex, " ", $text);
$regex = "'<noscript[^>]*?>.*?</noscript>'si";
$text = preg_replace($regex, " ", $text);
// Strip any remaining html tags
$text = strip_tags($text);
// Remove any mambot codes
$regex = '(\{.*?\})';
$text = preg_replace($regex, " ", $text);
// Some replacements
$text = str_replace(array('\n', '\r', '"'), array(' ', '', '"'), $text);
$text = trim($text);
return $text;
}
/**
* Clip text to use as meta description
*
* @param string $text
* @param int $limit
* @return string
*/
static function clipDesc($text, $limit) {
if (JString::strlen($text) > $limit) {
$text = JString::substr($text, 0, $limit);
$pos = JString::strrpos($text, ' ');
if ($pos !== false) {
$text = JString::substr($text, 0, $pos);
}
$text = JString::trim($text);
}
return $text;
}
/**
* Generate for metatags
*
* @param string $desc
* @param string $blacklist
* @param int $count
* @param int $minLength
* @return string
*/
static function generateKeywords($desc, $blacklist, $count, $minLength) {
// Remove any email addresses
$regex = '/(([_A-Za-z0-9-]+)(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-]+)(\\.[A-Za-z0-9-]+)*)/ix';
$desc = preg_replace($regex, '', $desc);
// Some unwanted replaces
$desc = preg_replace('/<[^>]*>/', ' ', $desc);
$desc = preg_replace('/[\\\\.;:|\'"`,()\[\]]/', ' ', $desc);
$desc = str_replace(' - ', ' ', $desc);
$keysArray = explode(" ", $desc);
// Sort words from up to down
$keysArray = array_count_values(array_map(array('JoomSEF', '_utf8LowerCase'), $keysArray));
if( is_null($blacklist) ) {
$blacklist = "a, able, about, above, abroad, according, accordingly, across, actually, adj, after, afterwards, again, against, ago, ahead, ain't, all, allow, allows, almost, alone, along, alongside, already, also, although, always, am, amid, amidst, among, amongst, an, and, another, any, anybody, anyhow, anyone, anything, anyway, anyways, anywhere, apart, appear, appreciate, appropriate, are, aren't, around, as, a's, aside, ask, asking, associated, at, available, away, awfully, b, back, backward, backwards, be, became, because, become, becomes, becoming, been, before, beforehand, begin, behind, being, believe, below, beside, besides, best, better, between, beyond, both, brief, but, by, c, came, can, cannot, cant, can't, caption, cause, causes, certain, certainly, changes, clearly, c'mon, co, co., com, come, comes, concerning, consequently, consider, considering, contain, containing, contains, corresponding, could, couldn't, course, c's, currently, d, dare, daren't, definitely, described, despite, did, didn't, different, directly, do, does, doesn't, doing, done, don't, down, downwards, during, e, each, edu, eg, eight, eighty, either, else, elsewhere, end, ending, enough, entirely, especially, et, etc, even, ever, evermore, every, everybody, everyone, everything, everywhere, ex, exactly, example, except, f, fairly, far, farther, few, fewer, fifth, first, five, followed, following, follows, for, forever, former, formerly, forth, forward, found, four, from, further, furthermore, g, get, gets, getting, given, gives, go, goes, going, gone, got, gotten, greetings, h, had, hadn't, half, happens, hardly, has, hasn't, have, haven't, having, he, he'd, he'll, hello, help, , hence, her, here, hereafter, hereby, herein, here's, hereupon, hers, herself, he's, hi, him, himself, his, hither, hopefully, how, howbeit, however, hundred, i, i'd, ie, if, ignored, i'll, i'm, immediate, in, inasmuch, inc, inc., indeed, indicate, indicated, indicates, inner, inside, insofar, instead, into, inward, is, isn't, it, it'd, it'll, its, it's, itself, i've, j, just, k, keep, keeps, kept, know, known, knows, l, last, lately, later, latter, latterly, least, less, lest, let, let's, like, liked, likely, likewise, little, look, looking, looks, low, lower, ltd, m, made, mainly, make, makes, many, may, maybe, mayn't, me, mean, meantime, meanwhile, merely, might, mightn't, mine, minus, miss, more, moreover, most, mostly, mr, mrs, much, must, mustn't, my, myself, n, name, namely, nd, near, nearly, necessary, need, needn't, needs, neither, never, neverf, neverless, nevertheless, new, next, nine, ninety, no, nobody, non, none, nonetheless, noone, no-one, nor, normally, not, nothing, notwithstanding, novel, now, nowhere, o, obviously, of, off, often, oh, ok, okay, old, on, once, one, ones, one's, only, onto, opposite, or, other, others, otherwise, ought, oughtn't, our, ours, ourselves, out, outside, over, overall, own, p, particular, particularly, past, per, perhaps, placed, please, plus, possible, presumably, probably, provided, provides, q, que, quite, qv, r, rather, rd, re, really, reasonably, recent, recently, regarding, regardless, regards, relatively, respectively, right, round, s, said, same, saw, say, saying, says, second, secondly, , see, seeing, seem, seemed, seeming, seems, seen, self, selves, sensible, sent, serious, seriously, seven, several, shall, shan't, she, she'd, she'll, she's, should, shouldn't, since, six, so, some, somebody, someday, somehow, someone, something, sometime, sometimes, somewhat, somewhere, soon, sorry, specified, specify, specifying, still, sub, such, sup, sure, t, take, taken, taking, tell, tends, th, than, thank, thanks, thanx, that, that'll, thats, that's, that've, the, their, theirs, them, themselves, then, thence, there, thereafter, thereby, there'd, therefore, therein, there'll, there're, theres, there's, thereupon, there've, these, they, they'd, they'll, they're, they've, thing, things, think, third, thirty, this, thorough, thoroughly, those, though, three, through, throughout, thru, thus, till, to, together, too, took, toward, towards, tried, tries, truly, try, trying, t's, twice, two, u, un, under, underneath, undoing, unfortunately, unless, unlike, unlikely, until, unto, up, upon, upwards, us, use, used, useful, uses, using, usually, v, value, various, versus, very, via, viz, vs, w, want, wants, was, wasn't, way, we, we'd, welcome, well, we'll, went, were, we're, weren't, we've, what, whatever, what'll, what's, what've, when, whence, whenever, where, whereafter, whereas, whereby, wherein, where's, whereupon, wherever, whether, which, whichever, while, whilst, whither, who, who'd, whoever, whole, who'll, whom, whomever, who's, whose, why, will, willing, wish, with, within, without, wonder, won't, would, wouldn't, x, y, yes, yet, you, you'd, you'll, your, you're, yours, yourself, yourselves, you've, z, zero";
}
$blackArray = explode(",", $blacklist);
foreach($blackArray as $blackWord){
if(isset($keysArray[trim($blackWord)]))
unset($keysArray[trim($blackWord)]);
}
arsort($keysArray);
$i = 1;
$keywords = '';
foreach($keysArray as $word=>$instances){
if($i > $count)
break;
if(JString::strlen(trim($word)) >= $minLength ) {
$keywords .= $word . ", ";
$i++;
}
}
$keywords = rtrim($keywords, ", ");
return $keywords;
}
static function GetSEFGlobalMeta() {
return '6275a94572c5c3aa3f19065ac1a208dc'; // sef.global.meta
}
/**
* Sends the request and follows redirects
*
* @param string $url
* @param string $referer
* @param string|array $_data
* @param string $method
* @param string $userAgent
* @param array $headers
* @param int $maxRedirs
* @return object
*/
static function PostRequestFollowRedirects($url, $referer = null, $_data = null, $method = 'post', $userAgent = null, $headers = null, $maxRedirs = 5)
{
$response = false;
for ($redirs = 0; $redirs <= $maxRedirs; $redirs++) {
$response = self::PostRequest($url, $referer, $_data, $method, $userAgent, $headers);
// Check if we should redirect
if (is_object($response) && $response->code >= 300 && $response->code <= 399) {
// We got a redirect response code, try to parse new location from headers
$matches = array();
if (preg_match('/^Location:\s*(.*)$/im', $response->header, $matches)) {
// Found, update URL and send request again
$url = $matches[1];
continue;
}
}
// No redirect, return response
return $response;
}
return $response;
}
/**
* Sends the POST request
*
* @param string $url
* @param string $referer
* @param array $_data
* @return object
*/
static function PostRequest($url, $referer = null, $_data = null, $method = 'post', $userAgent = null, $headers = null) {
// convert variables array to string:
$data = '';
if( is_array($_data) && count($_data) > 0 ) {
// format --> test1=a&test2=b etc.
$data = array();
while( list($n, $v) = each($_data) ) {
$data[] = "$n=$v";
}
$data = implode('&', $data);
$contentType = "Content-type: application/x-www-form-urlencoded\r\n";
}
else {
$data = $_data;
$contentType = "Content-type: text/xml\r\n";
}
if( is_null($referer) ) {
$referer = JURI::root();
}
// parse the given URL
$url = parse_url($url);
if( !isset($url['scheme']) ) {
return false;
}
// extract host and path:
$host = $url['host'];
$path = isset($url['path']) ? $url['path'] : '/';
// Prepare host and port to connect to
$connhost = $host;
$port = 80;
// Workaround for some PHP versions, where fsockopen can't connect to
// 'localhost' string on Windows servers
if ($connhost == 'localhost') {
$connhost = gethostbyname('localhost');
}
// Handle scheme
if ($url['scheme'] == 'https') {
$connhost = 'ssl://'.$connhost;
$port = 443;
}
else if ($url['scheme'] != 'http') {
return false;
}
// open a socket connection
$errno = null;
$errstr = null;
$fp = @fsockopen($connhost, $port, $errno, $errstr, 5);
if (!is_resource($fp) || ($fp === false)) {
return false;
}
if (!is_null($userAgent)) {
$userAgent = "User-Agent: ".$userAgent."\r\n";
}
// send the request
if ($method == 'post') {
// Check the first fputs, sometimes fsockopen doesn't fail, but fputs doesn't work
if (!@fputs($fp, "POST $path HTTP/1.1\r\n")) {
@fclose($fp);
return false;
}
if (!is_null($userAgent)) {
fputs($fp, $userAgent);
}
fputs($fp, "Host: $host\r\n");
fputs($fp, "Referer: $referer\r\n");
fputs($fp, $contentType);
fputs($fp, "Content-length: ". strlen($data) ."\r\n");
// Send additional headers if set
if (is_array($headers)) {
foreach ($headers as $h) {
$h = rtrim($h);
$h .= "\r\n";
fputs($fp, $h);
}
}
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data);
}
elseif ($method == 'get') {
$query = '';
if (isset($url['query'])) {
$query = '?'.$url['query'];
}
// Check the first fputs, sometimes fsockopen doesn't fail, but fputs doesn't work
if (!@fputs($fp, "GET {$path}{$query} HTTP/1.1\r\n")) {
@fclose($fp);
return false;
}
if (!is_null($userAgent)) {
fputs($fp, $userAgent);
}
fputs($fp, "Host: $host\r\n");
// Send additional headers if set
if (is_array($headers)) {
foreach ($headers as $h) {
$h = rtrim($h);
$h .= "\r\n";
fputs($fp, $h);
}
}
fputs($fp, "Connection: close\r\n\r\n");
}
$result = '';
while(!feof($fp)) {
// receive the results of the request
$result .= fgets($fp, 128);
}
// close the socket connection:
fclose($fp);
// split the result header from the content
$result = explode("\r\n\r\n", $result, 2);
$header = isset($result[0]) ? $result[0] : '';
$content = isset($result[1]) ? $result[1] : '';
$response = new stdClass();
$response->header = $header;
$response->content = $content;
// Handle chunked transfer if needed
if( strpos(strtolower($response->header), 'transfer-encoding: chunked') !== false ) {
$parsed = '';
$left = $response->content;
while( true ) {
$pos = strpos($left, "\r\n");
if( $pos === false ) {
return $response;
}
$chunksize = substr($left, 0, $pos);
$pos += strlen("\r\n");
$left = substr($left, $pos);
$pos = strpos($chunksize, ';');
if( $pos !== false ) {
$chunksize = substr($chunksize, 0, $pos);
}
$chunksize = hexdec($chunksize);
if( $chunksize == 0 ) {
break;
}
$parsed .= substr($left, 0, $chunksize);
$left = substr($left, $chunksize + strlen("\r\n"));
}
$response->content = $parsed;
}
// Get the response code from header
$headerLines = explode("\n", $response->header);
$header1 = explode(' ', trim($headerLines[0]));
$code = intval($header1[1]);
$response->code = $code;
return $response;
}
static function getSEOStatus()
{
static $status;
if( !isset($status) ) {
$sefConfig = SEFConfig::getConfig();
$status = array();
$config = JFactory::getConfig();
$status['sef'] = (bool)$config->get('sef');
$status['mod_rewrite'] = (bool)$config->get('sef_rewrite');
$status['sef_suffix'] = (bool)$config->get('sef_suffix');
$status['joomsef'] = (bool)$sefConfig->enabled;
$status['plugin'] = JPluginHelper::isEnabled('system', 'joomsef');
$status['newurls'] = !$sefConfig->disableNewSEF;
}
return $status;
}
static function getNonSefVars(&$uri, $nonSefVars, $ignoreVars)
{
$mainframe = JFactory::getApplication();
$sefConfig = SEFConfig::getConfig();
// Get the parameters for this component
if( !is_null($uri->getVar('option')) ) {
$params =& SEFTools::getExtParams($uri->getVar('option'));
}
// Build array of nonSef vars if set to
$nonSef = array();
if( $sefConfig->appendNonSef ) {
// Save the given nonsef vars
$nonSef = $nonSefVars;
// load the nonSEF vars from option parameters
$paramNonSef = array();
if( isset($params) ) {
$nsef = $params->get('customNonSef', '');
if( !empty($nsef) ) {
// Some variables are set, let's explode them
$paramNonSef = explode(';', $nsef);
}
}
// get globally configured nonSEF vars
$configNonSef = array();
if( !empty($sefConfig->customNonSef) ) {
$configNonSef = explode(';', $sefConfig->customNonSef);
}
// Get nonSEF vars from variable filter test if set to
$failedVars = array();
// combine all the nonSEF vars arrays
$nsefvars = array_merge($paramNonSef, $configNonSef, $failedVars);
if (!empty($nsefvars)) {
foreach($nsefvars as $nsefvar) {
// add each variable, that isn't already set, and that is present in our URL
if( !isset($nonSef[$nsefvar]) && !is_null($uri->getVar($nsefvar)) ) {
$nonSef[$nsefvar] = $uri->getVar($nsefvar);
}
}
}
// if $nonSefVars mixes with $GLOBALS['JOOMSEF_NONSEFVARS'], exclude the mixed vars
// this is important to prevent duplicating params by adding JOOMSEF_NONSEFVARS to
// $ignoreSefVars
$gNonSef = JoomSEF::get('sef.global.nonsefvars');
if (!empty($gNonSef)) {
foreach (array_keys($gNonSef) as $key) {
if (isset($nonSef[$key])) unset($gNonSef[$key]);
}
JoomSEF::set('sef.global.nonsefvars', $gNonSef);
}
}
// Combine nonSef and ignore vars
if (!empty($ignoreVars)) {
$nonSef = array_merge($nonSef, $ignoreVars);
}
// Globally add the Smart Search's highlight variable
if (!is_null($uri->getVar('highlight'))) {
$nonSef['highlight'] = $uri->getVar('highlight');
}
// If the component requests strict accept variables filtering, add the ones that don't match
if( isset($params) && ($params->get('acceptStrict', '0') == '1') ) {
$acceptVars =& SEFTools::getExtAcceptVars($uri->getVar('option'));
$uriVars = $uri->getQuery(true);
if( (count($acceptVars) > 0) && (count($uriVars) > 0) ) {
foreach($uriVars as $name => $value) {
// Standard Joomla variables
if( in_array($name, array('option', 'Itemid', 'limit', 'limitstart', 'format', 'tmpl', 'lang')) ) {
continue;
}
// Accepted variables
if( in_array($name, $acceptVars) ) {
continue;
}
// Variable not accepted, add it to non-SEF
$nonSef[$name] = $value;
}
}
}
return $nonSef;
}
static function getHomeQueries($includeLang = true)
{
// Cache result to save DB queries!!!
static $items;
if (!isset($items)) {
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id, link, language')->from('#__menu')->where('home=1');
$db->setQuery($query);
$items = $db->loadObjectList('id');
}
return $items;
}
static function getMenuItemSubDomains($id)
{
// Cache results to save DB queries!!!
static $items;
if (!isset($items)) {
$items = array();
}
if (!isset($items[$id])) {
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('link')->from('#__menu')->where('id='.$id);
$db->setQuery($query);
$items[$id] = $db->loadResult();
}
return $items[$id];
}
static function getAllSubdomains()
{
// Cache subdomains data to save DB queries!
static $subdomains;
if (!isset($subdomains)) {
$subdomains = array();
// Load all subdomains
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('*')->from('#__sef_subdomains');
$db->setQuery($query);
$rows = $db->loadObjectList();
// Create structure of subdomains according to languages
foreach ($rows as $row) {
// Add subdomain to correct language
if (!empty($row->lang)) {
$subdomains[$row->lang][] = $row;
}
if ($row->lang != '*') {
$subdomains['*'][] = $row;
}
}
}
return $subdomains;
}
static function getSubDomain($Itemid,$uri,&$titlepage)
{
$sefConfig=SEFConfig::getConfig();
$titlepage=false;
$option=$uri->getVar('option');
$db=JFactory::getDBO();
$lang = '*';
if ($sefConfig->langEnable) {
$lang = $uri->getVar('lang', '*');
}
// Get subdomains
$subdomains = self::getAllSubdomains();
if (!array_key_exists($lang, $subdomains)) {
// No subdomain for given language
return null;
}
for($i=0;$i<count($subdomains[$lang]);$i++) {
$Itemids=explode(",",$subdomains[$lang][$i]->Itemid);
if($Itemid==$subdomains[$lang][$i]->Itemid_titlepage) {
$link=new JURI(self::getMenuItemSubDomains($Itemid));
$uri_query=$uri->getQuery(true);
$titlepage=true;
foreach($link->getQuery(true) as $opt=>$val) {
if($val!=@$uri_query[$opt]) {
$titlepage=false;
}
}
return $subdomains[$lang][$i]->subdomain;
}
if($option==$subdomains[$lang][$i]->option) {
return $subdomains[$lang][$i]->subdomain;
}
if(strlen($subdomains[$lang][$i]->Itemid) && in_array($Itemid,$Itemids)) {
return $subdomains[$lang][$i]->subdomain;
}
}
return null;
}
static function normalizeURI(&$uri)
{
$option = $uri->getVar('option');
if (!is_null($option)) {
$extfile = JPATH_ROOT.'/components/com_sef/sef_ext/'.$option.'.php';
if (file_exists($extfile)) {
require_once($extfile);
$class = 'SefExt_'.$option;
$ext = new $class();
$ext->beforeCreate($uri);
list($nonsef, $ignore) = $ext->getNonSefVars($uri);
if (!empty($ignore)) {
$nonsef = array_merge($nonsef, $ignore);
}
$keys = array_keys($nonsef);
SEFTools::RemoveVariables($uri, $keys);
}
}
}
/**
* Checks, whether the given Itemid is ignored for the given component
*
* @param string $option
* @param string $Itemid
* @return bool
*/
static function isItemidIgnored($option, $Itemid)
{
$params =& SEFTools::getExtParams($option);
$ignoredIds = trim($params->get('ignoreItemids', ''));
if (empty($ignoredIds)) {
return false;
}
$ids = array_map('trim', explode(',', $ignoredIds));
if (in_array($Itemid, $ids)) {
return true;
}
return false;
}
public static function getInstalledComponents()
{
static $components;
if (!isset($components)) {
$db = JFactory::getDbo();
// Get components
$db->setQuery("SELECT `name`, `element` AS `option` FROM `#__extensions` WHERE `type` = 'component'");
$components = $db->loadObjectList('option');
if (is_null($components)) {
$components = array();
return $components;
}
// Remove system components
$remove = array('com_sef', 'com_admin', 'com_cache', 'com_categories', 'com_checkin', 'com_config', 'com_cpanel', 'com_installer', 'com_joomfish', 'com_joomlaupdate', 'com_languages', 'com_login', 'com_media', 'com_menus', 'com_messages', 'com_modules', 'com_plugins', 'com_redirect', 'com_templates', 'com_falang');
foreach($remove as $r) {
if (isset($components[$r])) {
unset($components[$r]);
}
}
// Translate names
$lang = JFactory::getLanguage();
foreach($components as &$item) {
$extension = $item->option;
$source = JPATH_ADMINISTRATOR . '/components/' . $extension;
$lang->load("$extension.sys", JPATH_ADMINISTRATOR, null, false, false)
|| $lang->load("$extension.sys", $source, null, false, false)
|| $lang->load("$extension.sys", JPATH_ADMINISTRATOR, $lang->getDefault(), false, false)
|| $lang->load("$extension.sys", $source, $lang->getDefault(), false, false);
$item->name = JText::_($item->name);
}
// Sort by name
uasort($components, array('SEFTools', 'cmpComponents'));
}
return $components;
}
protected static function cmpComponents(&$a, &$b)
{
return strnatcasecmp($a->name, $b->name);
}
static function getDefaultParams($element)
{
//$element = $this->manifest->getElementByPath('install/defaultparams');
//$element=$this->manifest->install->defaultparams;
if( !is_a($element, 'SimpleXMLElement') || !count($element->children()) ) {
return '';
}
$defaultParams = $element->children();
if( count($defaultParams) == 0 ) {
return '';
}
$params = array();
foreach($defaultParams as $param) {
if( $param->getName() != 'defaultParam' ) {
continue;
}
$name = $param->attributes()->name;
$value = $param->attributes()->value;
$params[] = $name . '=' . $value;
}
if( count($params) > 0 ) {
return implode("\n", $params);
}
else {
return '';
}
}
static function getDefaultFilters($element)
{
//$element = $this->manifest->getElementByPath('install/defaultfilters');
//$element=$this->manigest->install->defaultfilters;
if( !is_a($element, 'SimpleXMLElement') || !count($element->children()) ) {
return '';
}
$defaultFilters = $element->children();
if( count($defaultFilters) == 0 ) {
return '';
}
$filters = array();
foreach($defaultFilters as $filter) {
if( $filter->getName() != 'defaultFilter' ) {
continue;
}
$filters[] = (string)$filter;
}
if( count($filters) > 0 ) {
return implode("\n", $filters);
}
else {
return '';
}
}
/**
* Redirects current page to given URL, handles different Joomla versions.
* By default uses 303 code, if $moved is true, uses 301 code.
* Optionally you can also specify message.
*
* @param string $url
* @param bool $moved
* @param string $message
* @param string $type
*/
public static function redirect($url, $moved = false, $message = '', $type = 'message')
{
// Make sure the URL is absolute
// #23740: Handle also empty URL
if ($url == '' || substr($url, 0, 1) == '/') {
$uri = JUri::getInstance();
$domain = $uri->toString(array('scheme', 'user', 'pass', 'host', 'port'));
$url = rtrim($domain, '/').$url;
}
// Change http protocol to https if set to
$sefConfig = SEFConfig::getConfig();
if ($sefConfig->forceSsl) {
if (substr($url, 0, 5) == 'http:') {
$url = 'https:'.substr($url, 5);
}
}
$app = JFactory::getApplication();
// Handle redirect according to Joomla version
if (version_compare(JVERSION, '3.2', 'ge')) {
// New handling
if ($message) {
$app->enqueueMessage($message, $type);
}
$app->redirect($url, $moved);
}
else {
// Old handling
$app->redirect($url, $message, $type, $moved);
}
$app->close();
}
/**
* Creates a new instance of JoomSefDomainUri object copied from given JUri with given host set. The JoomSefDomainUri
* is used with multi-language websites using different domains, its toString method always outputs scheme and host.
*
* @param JUri $srcUri
* @param string $host
* @return JoomSefDomainUri
*/
public static function createDomainUri($srcUri, $host)
{
$srcUri->setHost($host);
$newUri = new JoomSefDomainUri();
JoomSefUri::copyUri($srcUri, $newUri);
$newUri->storeHost();
return $newUri;
}
}