| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Tracker; |
|
|
| use Piwik\Common; |
| use Piwik\Date; |
| use Piwik\Option; |
|
|
| class FingerprintSalt |
| { |
| public const OPTION_PREFIX = 'fingerprint_salt_'; |
| public const DELETE_FINGERPRINT_OLDER_THAN_SECONDS = 432000; |
|
|
| public function generateSalt() |
| { |
| return Common::getRandomString(32); |
| } |
|
|
| public function deleteOldSalts() |
| { |
| |
| |
| |
| |
| |
| |
| |
| |
| $deleteSaltsCreatedBefore = Date::getNowTimestamp() - self::DELETE_FINGERPRINT_OLDER_THAN_SECONDS; |
| $options = Option::getLike(self::OPTION_PREFIX . '%'); |
| $deleted = array(); |
| foreach ($options as $name => $value) { |
| $value = $this->decode($value); |
| if (empty($value['time']) || $value['time'] < $deleteSaltsCreatedBefore) { |
| Option::delete($name); |
| $deleted[] = $name; |
| } |
| } |
|
|
| return $deleted; |
| } |
|
|
| public function getDateString(Date $date, $timezone) |
| { |
| $dateString = Date::factory($date->getTimestampUTC(), $timezone)->toString(); |
| return $dateString; |
| } |
|
|
| private function encode($value) |
| { |
| return json_encode($value); |
| } |
|
|
| private function decode($value) |
| { |
| return @json_decode($value, true); |
| } |
|
|
| public function getSalt($dateString, $idSite) |
| { |
| $fingerprintSaltKey = self::OPTION_PREFIX . (int) $idSite . '_' . $dateString; |
| $salt = Option::get($fingerprintSaltKey); |
| if (!empty($salt)) { |
| $salt = $this->decode($salt); |
| } |
| if (empty($salt['value'])) { |
| $salt = array( |
| 'value' => $this->generateSalt(), |
| 'time' => Date::getNowTimestamp(), |
| ); |
| Option::set($fingerprintSaltKey, $this->encode($salt)); |
| } |
| return $salt['value']; |
| } |
| } |
|
|