PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 1.3.1
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v1.3.1
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
Db 6 years ago Handler 6 years ago TableLogAction 6 years ago Visit 6 years ago Action.php 6 years ago ActionPageview.php 6 years ago Cache.php 6 years ago Db.php 6 years ago Failures.php 6 years ago FingerprintSalt.php 6 years ago GoalManager.php 6 years ago Handler.php 6 years ago IgnoreCookie.php 6 years ago LogTable.php 6 years ago Model.php 6 years ago PageUrl.php 6 years ago Request.php 5 years ago RequestProcessor.php 6 years ago RequestSet.php 6 years ago Response.php 6 years ago ScheduledTasksRunner.php 6 years ago Settings.php 5 years ago TableLogAction.php 6 years ago TrackerCodeGenerator.php 6 years ago TrackerConfig.php 6 years ago Visit.php 5 years ago VisitExcluded.php 6 years ago VisitInterface.php 6 years ago Visitor.php 6 years ago VisitorNotFoundInDb.php 6 years ago VisitorRecognizer.php 6 years ago
FingerprintSalt.php
89 lines
1 <?php
2 /**
3 * Matomo - free/libre analytics platform
4 *
5 * @link https://matomo.org
6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7 *
8 */
9
10 namespace Piwik\Tracker;
11
12 use Piwik\Common;
13 use Piwik\Date;
14 use Piwik\Exception\InvalidRequestParameterException;
15 use Piwik\Exception\UnexpectedWebsiteFoundException;
16 use Piwik\Option;
17 use Piwik\Piwik;
18 use Piwik\SettingsServer;
19 use Piwik\Site;
20 use Piwik\Db as PiwikDb;
21
22 class FingerprintSalt
23 {
24 const OPTION_PREFIX = 'fingerprint_salt_';
25 const DELETE_FINGERPRINT_OLDER_THAN_SECONDS = 432000; // 5 days in seconds
26
27 public function generateSalt()
28 {
29 return Common::getRandomString(32);
30 }
31
32 public function deleteOldSalts()
33 {
34 // we want to make sure to delete salts that were created more than three days ago as they are likely not in
35 // use anymore. We should delete them to ensure the fingerprint is truly random for each day because if we used
36 // eg the regular salt then it would technically still be possible to try and regenerate the fingerprint based
37 // on certain information.
38 // Typically, only the salts for today and yesterday are used. However, if someone was to import historical data
39 // for the same day and this takes more than five days, then it could technically happen that we delete a
40 // fingerprint that is still in use now and as such after deletion a few visitors would have a new configId
41 // within one visit and such a new visit would be created. That should be very much edge case though.
42 $deleteSaltsCreatedBefore = Date::getNowTimestamp() - self::DELETE_FINGERPRINT_OLDER_THAN_SECONDS;
43 $options = Option::getLike(self::OPTION_PREFIX . '%');
44 $deleted = array();
45 foreach ($options as $name => $value) {
46 $value = $this->decode($value);
47 if (empty($value['time']) || $value['time'] < $deleteSaltsCreatedBefore) {
48 Option::delete($name);
49 $deleted[] = $name;
50 }
51 }
52
53 return $deleted;
54 }
55
56 public function getDateString(Date $date, $timezone)
57 {
58 $dateString = Date::factory($date->getTimestampUTC(), $timezone)->toString();
59 return $dateString;
60 }
61
62 private function encode($value)
63 {
64 return json_encode($value);
65 }
66
67 private function decode($value)
68 {
69 return @json_decode($value, true);
70 }
71
72 public function getSalt($dateString, $idSite)
73 {
74 $fingerprintSaltKey = self::OPTION_PREFIX . (int) $idSite . '_' . $dateString;
75 $salt = Option::get($fingerprintSaltKey);
76 if (!empty($salt)) {
77 $salt = $this->decode($salt);
78 }
79 if (empty($salt['value'])) {
80 $salt = array(
81 'value' => $this->generateSalt(),
82 'time' => Date::getNowTimestamp()
83 );
84 Option::set($fingerprintSaltKey, $this->encode($salt));
85 }
86 return $salt['value'];
87 }
88 }
89