| Current Path : /var/www/element/data/www/revenuestory.ru/bitrix/modules/main/lib/engine/response/ |
| Current File : /var/www/element/data/www/revenuestory.ru/bitrix/modules/main/lib/engine/response/redirect.php |
<?php
namespace Bitrix\Main\Engine\Response;
use Bitrix\Main;
use Bitrix\Main\Context;
use Bitrix\Main\Text\Encoding;
class Redirect extends Main\HttpResponse
{
/** @var string|Main\Web\Uri $url */
private $url;
/** @var bool */
private $skipSecurity;
public function __construct($url, bool $skipSecurity = false)
{
parent::__construct();
$this
->setStatus('302 Found')
->setSkipSecurity($skipSecurity)
->setUrl($url)
;
}
/**
* @return Main\Web\Uri|string
*/
public function getUrl()
{
return $this->url;
}
/**
* @param Main\Web\Uri|string $url
* @return $this
*/
public function setUrl($url)
{
$this->url = $url;
return $this;
}
/**
* @return bool
*/
public function isSkippedSecurity(): bool
{
return $this->skipSecurity;
}
/**
* @param bool $skipSecurity
* @return $this
*/
public function setSkipSecurity(bool $skipSecurity)
{
$this->skipSecurity = $skipSecurity;
return $this;
}
private function checkTrial(): bool
{
$isTrial =
defined("DEMO") && DEMO === "Y" &&
(
!defined("SITEEXPIREDATE") ||
!defined("OLDSITEEXPIREDATE") ||
SITEEXPIREDATE == '' ||
SITEEXPIREDATE != OLDSITEEXPIREDATE
)
;
return $isTrial;
}
private function isExternalUrl($url): bool
{
return preg_match("'^(http://|https://|ftp://)'i", $url);
}
private function modifyBySecurity($url)
{
/** @global \CMain $APPLICATION */
global $APPLICATION;
$isExternal = $this->isExternalUrl($url);
if(!$isExternal && strpos($url, "/") !== 0)
{
$url = $APPLICATION->GetCurDir() . $url;
}
//doubtful about & and http response splitting defence
$url = str_replace(["&", "\r", "\n"], ["&", "", ""], $url);
if (!defined("BX_UTF") && defined("LANG_CHARSET"))
{
$url = Encoding::convertEncoding($url, LANG_CHARSET, "UTF-8");
}
return $url;
}
private function processInternalUrl($url)
{
/** @global \CMain $APPLICATION */
global $APPLICATION;
//store cookies for next hit (see CMain::GetSpreadCookieHTML())
$APPLICATION->StoreCookies();
$server = Context::getCurrent()->getServer();
$protocol = Context::getCurrent()->getRequest()->isHttps() ? "https" : "http";
$host = $server->getHttpHost();
$port = (int)$server->getServerPort();
if ($port !== 80 && $port !== 443 && $port > 0 && strpos($host, ":") === false)
{
$host .= ":" . $port;
}
return "{$protocol}://{$host}{$url}";
}
public function send()
{
if ($this->checkTrial())
{
die(Main\Localization\Loc::getMessage('MAIN_ENGINE_REDIRECT_TRIAL_EXPIRED'));
}
$url = $this->getUrl();
$isExternal = $this->isExternalUrl($url);
$url = $this->modifyBySecurity($url);
foreach (GetModuleEvents("main", "OnBeforeLocalRedirect", true) as $event)
{
ExecuteModuleEventEx($event, [&$url, $this->isSkippedSecurity(), &$isExternal, $this]);
}
if (!$isExternal)
{
$url = $this->processInternalUrl($url);
}
$this->addHeader('Location', $url);
foreach (GetModuleEvents("main", "OnLocalRedirect", true) as $event)
{
ExecuteModuleEventEx($event);
}
Main\Application::getInstance()->getKernelSession()["BX_REDIRECT_TIME"] = time();
parent::send();
}
}