snappymail/rainloop/v/1.2.6.410/app/libraries/Buzz/Util/Cookie.php
RainLoop Team d839db3a0c v1.2.6.410
2013-09-26 23:21:30 +04:00

216 lines
5 KiB
PHP

<?php
namespace Buzz\Util;
use Buzz\Message\RequestInterface;
class Cookie
{
const ATTR_DOMAIN = 'domain';
const ATTR_PATH = 'path';
const ATTR_SECURE = 'secure';
const ATTR_MAX_AGE = 'max-age';
const ATTR_EXPIRES = 'expires';
protected $name;
protected $value;
protected $attributes = array();
protected $createdAt;
/**
* Constructor.
*/
public function __construct()
{
$this->createdAt = time();
}
/**
* Returns true if the current cookie matches the supplied request.
*
* @return boolean
*/
public function matchesRequest(RequestInterface $request)
{
// domain
if (!$this->matchesDomain(parse_url($request->getHost(), PHP_URL_HOST))) {
return false;
}
// path
if (!$this->matchesPath($request->getResource())) {
return false;
}
// secure
if ($this->hasAttribute(static::ATTR_SECURE) && !$request->isSecure()) {
return false;
}
return true;
}
/**
* Returns true of the current cookie has expired.
*
* Checks the max-age and expires attributes.
*
* @return boolean Whether the current cookie has expired
*/
public function isExpired()
{
$maxAge = $this->getAttribute(static::ATTR_MAX_AGE);
if ($maxAge && time() - $this->getCreatedAt() > $maxAge) {
return true;
}
$expires = $this->getAttribute(static::ATTR_EXPIRES);
if ($expires && strtotime($expires) < time()) {
return true;
}
return false;
}
/**
* Returns true if the current cookie matches the supplied domain.
*
* @param string $domain A domain hostname
*
* @return boolean
*/
public function matchesDomain($domain)
{
$cookieDomain = $this->getAttribute(static::ATTR_DOMAIN);
if (0 === strpos($cookieDomain, '.')) {
$pattern = '/\b'.preg_quote(substr($cookieDomain, 1), '/').'$/i';
return (boolean) preg_match($pattern, $domain);
} else {
return 0 == strcasecmp($cookieDomain, $domain);
}
}
/**
* Returns true if the current cookie matches the supplied path.
*
* @param string $path A path
*
* @return boolean
*/
public function matchesPath($path)
{
$needle = $this->getAttribute(static::ATTR_PATH);
return null === $needle || 0 === strpos($path, $needle);
}
/**
* Populates the current cookie with data from the supplied Set-Cookie header.
*
* @param string $header A Set-Cookie header
* @param string $issuingDomain The domain that issued the header
*/
public function fromSetCookieHeader($header, $issuingDomain)
{
list($this->name, $header) = explode('=', $header, 2);
if (false === strpos($header, ';')) {
$this->value = $header;
$header = null;
} else {
list($this->value, $header) = explode(';', $header, 2);
}
$this->clearAttributes();
foreach (array_map('trim', explode(';', trim($header))) as $pair) {
if (false === strpos($pair, '=')) {
$name = $pair;
$value = null;
} else {
list($name, $value) = explode('=', $pair);
}
$this->setAttribute($name, $value);
}
if (!$this->getAttribute(static::ATTR_DOMAIN)) {
$this->setAttribute(static::ATTR_DOMAIN, $issuingDomain);
}
}
/**
* Formats a Cookie header for the current cookie.
*
* @return string An HTTP request Cookie header
*/
public function toCookieHeader()
{
return 'Cookie: '.$this->getName().'='.$this->getValue();
}
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
public function setValue($value)
{
$this->value = $value;
}
public function getValue()
{
return $this->value;
}
public function setAttributes(array $attributes)
{
// attributes are case insensitive
$this->attributes = array_change_key_case($attributes);
}
public function setAttribute($name, $value)
{
$this->attributes[strtolower($name)] = $value;
}
public function getAttributes()
{
return $this->attributes;
}
public function getAttribute($name)
{
$name = strtolower($name);
if (isset($this->attributes[$name])) {
return $this->attributes[$name];
}
}
public function hasAttribute($name)
{
return array_key_exists($name, $this->attributes);
}
public function clearAttributes()
{
$this->setAttributes(array());
}
public function setCreatedAt($createdAt)
{
$this->createdAt = $createdAt;
}
public function getCreatedAt()
{
return $this->createdAt;
}
}