140 lines
5.1 KiB
PHP
140 lines
5.1 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This file is part of the package thucke/th-rating.
|
||
|
*
|
||
|
* For the full copyright and license information, please read the
|
||
|
* LICENSE file that was distributed with this source code.
|
||
|
*/
|
||
|
|
||
|
namespace WapplerSystems\BookmarksLikesRatings\Service;
|
||
|
|
||
|
use TYPO3\CMS\Core\Log\LogLevel;
|
||
|
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||
|
|
||
|
/**
|
||
|
* Service for setting cookies like Typo3 does
|
||
|
*
|
||
|
* @version $Id:$
|
||
|
* @license http://opensource.org/licenses/gpl-license.php GNU protected License, version 2
|
||
|
*/
|
||
|
class CookieService extends AbstractExtensionService
|
||
|
{
|
||
|
/**
|
||
|
* Indicator for cookieProtection has been set
|
||
|
* @var bool
|
||
|
*/
|
||
|
protected $cookieProtection = false;
|
||
|
|
||
|
/**
|
||
|
* Gets the domain to be used on setting cookies.
|
||
|
* The information is taken from the value in $GLOBALS['TYPO3_CONF_VARS']['SYS']['cookieDomain'].
|
||
|
* Protected function taken from t3lib_userAuth (t3 4.7.7)
|
||
|
*
|
||
|
* @return string The domain to be used on setting cookies
|
||
|
*/
|
||
|
protected function getCookieDomain()
|
||
|
{
|
||
|
$result = '';
|
||
|
$cookieDomain = $GLOBALS['TYPO3_CONF_VARS']['SYS']['cookieDomain'];
|
||
|
// If a specific cookie domain is defined for a given TYPO3_MODE,
|
||
|
// use that domain
|
||
|
if (!empty($GLOBALS['TYPO3_CONF_VARS']['FE']['cookieDomain'])) {
|
||
|
$cookieDomain = $GLOBALS['TYPO3_CONF_VARS']['FE']['cookieDomain'];
|
||
|
}
|
||
|
if ($cookieDomain) {
|
||
|
if ($cookieDomain[0] === '/') {
|
||
|
$match = [];
|
||
|
/** @noinspection PhpUsageOfSilenceOperatorInspection */
|
||
|
$matchCnt = @preg_match(
|
||
|
$cookieDomain,
|
||
|
GeneralUtility::getIndpEnv('TYPO3_HOST_ONLY'),
|
||
|
$match
|
||
|
);
|
||
|
if ($matchCnt === false) {
|
||
|
$this->logger->log(
|
||
|
LogLevel::ERROR,
|
||
|
'getCookieDomain: The regular expression for the cookie domain contains errors.' .
|
||
|
'The session is not shared across sub-domains.',
|
||
|
['cookieDomain' => $cookieDomain, 'errorCode' => 1399137882]
|
||
|
);
|
||
|
} elseif ($matchCnt) {
|
||
|
$result = $match[0];
|
||
|
}
|
||
|
} else {
|
||
|
$result = $cookieDomain;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the cookie
|
||
|
* Protected function taken from t3lib_userAuth (t3 4.7.7)
|
||
|
*
|
||
|
* @param string $cookieName identifier for the cookie
|
||
|
* @param string $cookieValue cookie value
|
||
|
* @param int $cookieExpire expire time for the cookie (UNIX timestamp)
|
||
|
*
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
public function setVoteCookie($cookieName, $cookieValue, $cookieExpire = 0): void
|
||
|
{
|
||
|
// do not set session cookies
|
||
|
if (!empty($cookieExpire)) {
|
||
|
$settings = $GLOBALS['TYPO3_CONF_VARS']['SYS'];
|
||
|
// Get the domain to be used for the cookie (if any):
|
||
|
$cookieDomain = $this->getCookieDomain();
|
||
|
// If no cookie domain is set, use the base path:
|
||
|
$cookiePath = ($cookieDomain ? '/' : GeneralUtility::getIndpEnv('TYPO3_SITE_PATH'));
|
||
|
// Use the secure option when the current request is served by a secure connection:
|
||
|
$cookieSecure = (bool)$settings['cookieSecure'] && GeneralUtility::getIndpEnv('TYPO3_SSL');
|
||
|
// Deliver cookies only via HTTP and prevent possible XSS by JavaScript:
|
||
|
$cookieHttpOnly = (bool)$settings['cookieHttpOnly'];
|
||
|
|
||
|
// Do not set cookie if cookieSecure is set to "1" (force HTTPS) and no secure channel is used:
|
||
|
if ((int)$settings['cookieSecure'] !== 1 || GeneralUtility::getIndpEnv('TYPO3_SSL')) {
|
||
|
setcookie(
|
||
|
$cookieName,
|
||
|
$cookieValue,
|
||
|
(int)$cookieExpire,
|
||
|
$cookiePath,
|
||
|
$cookieDomain,
|
||
|
$cookieSecure,
|
||
|
$cookieHttpOnly
|
||
|
);
|
||
|
$this->cookieProtection = true;
|
||
|
$this->logger->log(
|
||
|
LogLevel::INFO,
|
||
|
'setVoteCookie: Cookie set',
|
||
|
[
|
||
|
'cookieName' => $cookieName,
|
||
|
'cookieValue' => $cookieValue,
|
||
|
'cookieExpire' => $cookieExpire,
|
||
|
'cookiePath' => $cookiePath,
|
||
|
'cookieDomain' => $cookieDomain,
|
||
|
'cookieSecure' => $cookieSecure,
|
||
|
'cookieHttpOnly' => $cookieHttpOnly,
|
||
|
]
|
||
|
);
|
||
|
} else {
|
||
|
throw new Exception(
|
||
|
"Cookie was not set since HTTPS was forced in \$GLOBALS['TYPO3_CONF_VARS'][SYS][cookieSecure].",
|
||
|
1254325546
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Return if cookie protection has been set
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function isProtected()
|
||
|
{
|
||
|
return $this->cookieProtection;
|
||
|
}
|
||
|
}
|