- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/htmlpage.php
- Класс: BitrixMainHtmlPage
- Вызов: HtmlPage::getHtmlToSpreadCookiesOverSites
protected function getHtmlToSpreadCookiesOverSites()
{
static $firstExecution = true;
if (!$firstExecution)
throw new NotSupportedException("getHtmlToSpreadCookiesOverSites() must be called only once");
if (ConfigOption::get("main", "ALLOW_SPREAD_COOKIE", "Y") !== "Y")
return "";
$result = "";
$context = $this->getContext();
/** @var $response HttpResponse */
$response = $context->getResponse();
$params = "";
foreach ($response->getCookies() as $cookie)
{
/** @var $cookie BitrixMainWebCookie */
if ($cookie->getSpread() & WebCookie::SPREAD_SITES)
$params .= $cookie->getName().chr(1).$cookie->getValue().chr(1).$cookie->getExpires().chr(1).$cookie->getPath().chr(1).''.chr(1).$cookie->getSecure().chr(2);
}
if (isset($_SESSION['SPREAD_COOKIE']) && is_array($_SESSION['SPREAD_COOKIE']) && !empty($_SESSION['SPREAD_COOKIE']))
{
reset($_SESSION['SPREAD_COOKIE']);
while (list($cookieName, $cookieData) = each($_SESSION['SPREAD_COOKIE']))
{
$cookieData["D"] = ""; // domain must be empty
$params .= $cookieName.chr(1).$cookieData["V"].chr(1).$cookieData["T"].chr(1).$cookieData["F"].chr(1).$cookieData["D"].chr(1).$cookieData["S"].chr(2);
}
unset($_SESSION['SPREAD_COOKIE']);
}
if (!empty($params))
{
$server = $context->getServer();
/** @var $request HttpRequest */
$request = $context->getRequest();
$versionFile = new IOFile(IOPath::convertRelativeToAbsolute("/bitrix/modules/main/classes/general/version.php"));
$salt = $request->getRemoteAddress()."|".$versionFile->getModificationTime()."|".LICENSE_KEY;
$params = "s=".urlencode(base64_encode($params))."&k=".urlencode(md5($params.$salt));
$domainList = array();
$domainList[] = $server->getHttpHost();
$recordset = SiteTable::getList(
array(
'filter' => array('ACTIVE' => 'Y'),
)
);
while ($record = $recordset->Fetch())
{
$siteDomainsList = explode("n", str_replace("r", "n", $record["DOMAINS"]));
if (is_array($siteDomainsList) && count($siteDomainsList) > 0)
{
foreach ($siteDomainsList as $d)
{
$d = trim($d);
if (!empty($d))
$domainList[] = $d;
}
}
}
if (count($domainList) > 0)
{
$uniqueDomainList = array();
$domainList = array_unique($domainList);
$domainList2 = array_unique($domainList);
foreach ($domainList as $domain1)
{
$goodDomain = true;
foreach ($domainList2 as $domain2)
{
if (strlen($domain1) > strlen($domain2) && substr($domain1, -(strlen($domain2) + 1)) == ".".$domain2)
{
$goodDomain = false;
break;
}
}
if ($goodDomain)
$uniqueDomainList[] = $domain1;
}
$protocol = ($request->isHttps()) ? "https://" : "http://";
$host = $server->getHttpHost();
$requestUri = $request->getRequestUri();
$currentUri = new WebUri($protocol.$host."/".$requestUri, WebUriType::ABSOLUTE);
$currentUriParts = $currentUri->parse();
foreach ($uniqueDomainList as $domain)
{
$uriString = $protocol.$domain."/bitrix/spread.php?".$params;
$domainUri = new WebUri($uriString, WebUriType::ABSOLUTE);
$domainUriParts = $domainUri->parse();
if ($currentUriParts["host"] != $domainUriParts["host"])
$result .= '
'."n";
}
}
}
$firstExecution = false;
return $result;
}