PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.12.1
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.12.1
5.12.1 5.12.0 5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / core / Tracker / FingerprintSalt.php
matomo / app / core / Tracker Last commit date
Config 5 months ago Db 2 weeks ago Handler 2 years ago Visit 2 weeks ago Action.php 2 weeks ago ActionPageview.php 2 years ago BotRequest.php 4 months ago BotRequestProcessor.php 2 months ago Cache.php 2 weeks ago Db.php 2 weeks ago Failures.php 8 months ago FingerprintSalt.php 2 weeks ago GoalManager.php 2 weeks ago Handler.php 2 years ago IgnoreCookie.php 1 year ago LogTable.php 2 weeks ago Model.php 2 weeks ago PageUrl.php 2 weeks ago Request.php 2 weeks ago RequestHandlerTrait.php 5 months ago RequestProcessor.php 2 months ago RequestSet.php 8 months ago Response.php 4 months ago ScheduledTasksRunner.php 1 year ago Settings.php 2 weeks ago TableLogAction.php 2 weeks ago TrackerCodeGenerator.php 2 weeks ago TrackerConfig.php 2 months ago Visit.php 2 weeks ago VisitExcluded.php 2 weeks ago VisitInterface.php 4 months ago Visitor.php 2 months ago VisitorNotFoundInDb.php 2 months ago VisitorRecognizer.php 2 weeks ago
FingerprintSalt.php
72 lines
1 <?php
2
3 /**
4 * Matomo - free/libre analytics platform
5 *
6 * @link https://matomo.org
7 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8 */
9 namespace Piwik\Tracker;
10
11 use Piwik\Common;
12 use Piwik\Date;
13 use Piwik\Option;
14 class FingerprintSalt
15 {
16 public const OPTION_PREFIX = 'fingerprint_salt_';
17 public const DELETE_FINGERPRINT_OLDER_THAN_SECONDS = 432000;
18 // 5 days in seconds
19 public function generateSalt()
20 {
21 return Common::getRandomString(32);
22 }
23 public function deleteOldSalts()
24 {
25 // we want to make sure to delete salts that were created more than five days ago as they are likely not in
26 // use anymore. We should delete them to ensure the fingerprint is truly random for each day because if we used
27 // eg the regular salt then it would technically still be possible to try and regenerate the fingerprint based
28 // on certain information.
29 // Typically, only the salts for today and yesterday are used. However, if someone was to import historical data
30 // for the same day and this takes more than five days, then it could technically happen that we delete a
31 // fingerprint that is still in use now and as such after deletion a few visitors would have a new configId
32 // within one visit and such a new visit would be created. That should be very much edge case though.
33 $deleteSaltsCreatedBefore = Date::getNowTimestamp() - self::DELETE_FINGERPRINT_OLDER_THAN_SECONDS;
34 $options = Option::getLike(self::OPTION_PREFIX . '%');
35 $deleted = array();
36 foreach ($options as $name => $value) {
37 $value = $this->decode($value);
38 if (empty($value['time']) || $value['time'] < $deleteSaltsCreatedBefore) {
39 Option::delete($name);
40 $deleted[] = $name;
41 }
42 }
43 return $deleted;
44 }
45 public function getDateString(Date $date, $timezone)
46 {
47 $dateString = Date::factory($date->getTimestampUTC(), $timezone)->toString();
48 return $dateString;
49 }
50 private function encode($value)
51 {
52 return json_encode($value);
53 }
54 private function decode($value)
55 {
56 return @json_decode($value, \true);
57 }
58 public function getSalt($dateString, $idSite)
59 {
60 $fingerprintSaltKey = self::OPTION_PREFIX . (int) $idSite . '_' . $dateString;
61 $salt = Option::get($fingerprintSaltKey);
62 if (!empty($salt)) {
63 $salt = $this->decode($salt);
64 }
65 if (empty($salt['value'])) {
66 $salt = array('value' => $this->generateSalt(), 'time' => Date::getNowTimestamp());
67 Option::set($fingerprintSaltKey, $this->encode($salt));
68 }
69 return $salt['value'];
70 }
71 }
72