/modules/main/lib/engine/response/redirect.php
https://gitlab.com/alexprowars/bitrix · PHP · 157 lines · 108 code · 29 blank · 20 comment · 13 complexity · d13d9c168dcc52698c0059dbf0e8d9c6 MD5 · raw file
- <?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();
- }
- }