<?php
namespace Skorp\Dissua;
class SameSite {
protected $userAgent = null;
public function __construct($userAgent=null) {
if($userAgent != null)
$this->userAgent = $userAgent;
}
public static function handle($userAgent = null) : bool {
return (new self($userAgent))->shouldSendSameSiteNone();
}
public function shouldSendSameSiteNone() : bool {
return !$this->isSameSiteNoneIncompatible();
}
protected function isSameSiteNoneIncompatible() : bool {
return $this->hasWebKitSameSiteBug() || $this->dropsUnrecognizedSameSiteCookies();
}
protected function hasWebKitSameSiteBug() : bool {
return $this->isIosVersion(12) ||
($this->isMacosxVersion(10, 14) &&
($this->isSafari() || $this->isMacEmbeddedBrowser()));
}
protected function dropsUnrecognizedSameSiteCookies() : bool {
if ($this->isUcBrowser())
return !$this->isUcBrowserVersionAtLeast(12, 13, 2);
return $this->isChromiumBased() &&
$this->isChromiumVersionAtLeast(51) &&
!$this->isChromiumVersionAtLeast(67);
}
protected function isChromiumBased() : bool {
$regex = '/Chrom(e|ium)/';
return preg_match($regex,$this->userAgent);
}
protected function isChromiumVersionAtLeast($version) : bool {
$regex = '/Chrom[^ \/]+\/(\d+)[\.\d]*/';
preg_match($regex,$this->userAgent,$matches);
return ($matches[1]??null) >= $version;
}
protected function isIosVersion($major) : bool {
$regex = "/\(iP.+; CPU .*OS (\d+)[_\d]*.*\) AppleWebKit\//";
preg_match($regex,$this->userAgent,$matches);
return ($matches[1]??null) == $major;
}
protected function isMacosxVersion($major,$minor) : bool {
$regex = "/\(Macintosh;.*Mac OS X (\d+)_(\d+)[_\d]*.*\) AppleWebKit\//";
preg_match($regex,$this->userAgent,$matches);
return (($matches[1]??null) == $major && (($matches[2]??null) == $minor));
}
protected function isSafari() : bool {
$regex = "/Version\/.* Safari\//";
return preg_match($regex,$this->userAgent) && ! $this->isChromiumBased();
}
protected function isMacEmbeddedBrowser() : bool {
$regex = "#/^Mozilla\/[\.\d]+ \(Macintosh;.*Mac OS X [_\d]+\) AppleWebKit\/[\.\d]+ \(KHTML, like Gecko\)$#";
return preg_match($regex,$this->userAgent);
}
protected function isUcBrowser() : bool {
$regex = '/UCBrowser\//';
return preg_match($regex,$this->userAgent);
}
protected function isUcBrowserVersionAtLeast($major,$minor,$build) : bool {
$regex = "/UCBrowser\/(\d+)\.(\d+)\.(\d+)[\.\d]* /";
preg_match($regex,$this->userAgent,$matches);
$major_version = $matches[1] ?? null;
$minor_version = $matches[2] ?? null;
$build_version = $matches[3] ?? null;
if ($major_version != $major)
return $major_version > $major;
if ($minor_version != $minor)
return $minor_version > $minor;
return $build_version >= $build;
}
public function setUserAgent($useragent) {
$this->userAgent = $useragent;
}
}