PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.12.2
Independent Analytics – WordPress Analytics Plugin v2.12.2
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Click_Tracking / Click_Processing_Job.php
independent-analytics / IAWP / Click_Tracking Last commit date
Click.php 1 year ago Click_Processing_Job.php 1 year ago Config_File_Manager.php 1 year ago Link_Rule.php 1 year ago Link_Rule_Finder.php 1 year ago
Click_Processing_Job.php
89 lines
1 <?php
2
3 namespace IAWP\Click_Tracking;
4
5 use IAWP\Cron_Job;
6 use IAWP\Models\Visitor;
7 use IAWP\Payload_Validator;
8 use IAWP\Utils\Security;
9 use IAWPSCOPED\Illuminate\Support\Str;
10 /** @internal */
11 class Click_Processing_Job extends Cron_Job
12 {
13 protected $name = 'iawp_click_processing';
14 protected $interval = 'every_minute';
15 public function handle() : void
16 {
17 // Periodically recreate the config file
18 \IAWP\Click_Tracking\Config_File_Manager::recreate();
19 if (\IAWPSCOPED\iawp_is_free()) {
20 self::unschedule();
21 return;
22 }
23 $click_data_file = $this->get_click_data_file();
24 if ($click_data_file === null) {
25 return;
26 }
27 $job_file = $this->create_job_file($click_data_file);
28 if ($job_file === null) {
29 return;
30 }
31 $job_handle = \fopen($job_file, 'r');
32 if ($job_handle === \false) {
33 return;
34 }
35 // The first line for the PHP file is an exit statement to keep the contents private. This
36 // should be skipped when parsing the file.
37 if (\pathinfo($job_file, \PATHINFO_EXTENSION) === 'php') {
38 \fgets($job_handle);
39 // Skip first line
40 }
41 while (($json = \fgets($job_handle)) !== \false) {
42 $event = \json_decode($json, \true);
43 $event['href'] = \sanitize_url($event['href']);
44 $event['classes'] = Security::string($event['classes']);
45 $event['ids'] = Security::string($event['ids']);
46 if (\is_null($event)) {
47 continue;
48 }
49 $payload_validator = Payload_Validator::new($event['payload'], $event['signature']);
50 if (!$payload_validator->is_valid() || \is_null($payload_validator->resource())) {
51 continue;
52 }
53 $click = \IAWP\Click_Tracking\Click::new(['href' => $event['href'], 'classes' => $event['classes'], 'ids' => $event['ids'], 'resource_id' => $payload_validator->resource()['id'], 'visitor_id' => Visitor::fetch_visitor_id_by_hash($event['visitor_token']), 'created_at' => \DateTime::createFromFormat('U', $event['created_at'])]);
54 $click->track();
55 }
56 \fclose($job_handle);
57 \unlink($job_file);
58 }
59 private function get_click_data_file() : ?string
60 {
61 $avoid_temporary_directory = \defined('IAWP_AVOID_TEMPORARY_DIRECTORY') ? \IAWP_AVOID_TEMPORARY_DIRECTORY === \true : \false;
62 if (!$avoid_temporary_directory) {
63 $text_file = Str::finish(\sys_get_temp_dir(), \DIRECTORY_SEPARATOR) . "iawp-click-data.txt";
64 if (\is_file($text_file) && \is_readable($text_file) && \is_writable($text_file)) {
65 return $text_file;
66 }
67 }
68 $php_file = \IAWPSCOPED\iawp_path_to('iawp-click-data.php');
69 if (\is_file($php_file)) {
70 return $php_file;
71 }
72 return null;
73 }
74 private function create_job_file(string $file) : ?string
75 {
76 if (!\is_readable($file) || !\is_writable($file)) {
77 return null;
78 }
79 $job_id = \rand();
80 $extension = \pathinfo($file, \PATHINFO_EXTENSION);
81 $job_file = Str::finish(\dirname($file), \DIRECTORY_SEPARATOR) . "iawp-click-data-{$job_id}.{$extension}";
82 $was_renamed = \rename($file, $job_file);
83 if (!$was_renamed || !\is_file($job_file)) {
84 return null;
85 }
86 return $job_file;
87 }
88 }
89