PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.8.4
Independent Analytics – WordPress Analytics Plugin v2.8.4
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 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 / AJAX / AJAX.php
independent-analytics / IAWP / AJAX Last commit date
AJAX.php 2 years ago AJAX_Manager.php 1 year ago Configure_Pruner.php 2 years ago Confirm_Cache_Cleared.php 2 years ago Copy_Report.php 2 years ago Create_Campaign.php 2 years ago Create_Report.php 2 years ago Delete_Campaign.php 2 years ago Delete_Data.php 2 years ago Delete_Report.php 2 years ago Export_Campaigns.php 2 years ago Export_Devices.php 2 years ago Export_Geo.php 2 years ago Export_Pages.php 2 years ago Export_Referrers.php 2 years ago Export_Reports.php 1 year ago Filter.php 1 year ago Import_Reports.php 2 years ago Migration_Status.php 2 years ago Preview_Email.php 2 years ago Real_Time_Data.php 2 years ago Rename_Report.php 2 years ago Reset_Analytics.php 2 years ago Save_Report.php 2 years ago Set_Favorite_Report.php 2 years ago Set_WooCommerce_Statuses_To_Track.php 1 year ago Sort_Reports.php 2 years ago Test_Email.php 2 years ago Update_Capabilities.php 2 years ago Update_User_Settings.php 2 years ago
AJAX.php
140 lines
1 <?php
2
3 namespace IAWP\AJAX;
4
5 use IAWP\Capability_Manager;
6 use IAWP\Migrations;
7 use IAWP\Utils\Server;
8 /** @internal */
9 abstract class AJAX
10 {
11 public function __construct()
12 {
13 if (\IAWPSCOPED\iawp_is_pro() || !$this->requires_pro()) {
14 \add_action('wp_ajax_' . $this->action_name(), [$this, 'intercept_ajax']);
15 }
16 }
17 /**
18 * Classes must define an action name for the ajax request
19 *
20 * The required nonce for the ajax request will be the action name with a "_nonce" postfix
21 * Example: "iawp_delete_data" require a "iawp_delete_data_nonce" nonce field
22 *
23 * @return string
24 */
25 protected abstract function action_name() : string;
26 /**
27 * Classes must define an action callback to run when an ajax request is made
28 *
29 * @return void
30 */
31 protected abstract function action_callback() : void;
32 /**
33 * This is the direct handler for ajax requests.
34 * Permissions and nonce values are checked before executing the ajax action_callback function.
35 *
36 * @return void
37 */
38 public function intercept_ajax() : void
39 {
40 // Todo - Should this be can_edit() instead?
41 $is_not_migrating = $this->allowed_during_migrations() || !Migrations\Migrations::is_migrating();
42 $valid_fields = !$this->missing_fields();
43 $can_view = Capability_Manager::can_view();
44 \check_ajax_referer($this->action_name(), 'nonce');
45 if ($is_not_migrating && $valid_fields && $can_view) {
46 Server::increase_max_execution_time();
47 $this->action_callback();
48 } else {
49 \wp_send_json_error(['errorMessage' => 'Unable to process IAWP AJAX request'], 400);
50 }
51 \wp_die();
52 }
53 public function get_action_signature() : array
54 {
55 $shorthand_name = $this->action_name();
56 if (\strpos($this->action_name(), "iawp_") === 0) {
57 $shorthand_name = \substr($this->action_name(), 5);
58 }
59 return [$shorthand_name => ['action' => $this->action_name(), 'nonce' => \wp_create_nonce($this->action_name())]];
60 }
61 /**
62 * Classes can define a set of required fields for an ajax request
63 *
64 * @return array
65 */
66 protected function action_required_fields() : array
67 {
68 return [];
69 }
70 /**
71 * Override method to allow the AJAX request to run during migrations
72 *
73 * @return bool false by default
74 */
75 protected function allowed_during_migrations() : bool
76 {
77 return \false;
78 }
79 protected function requires_pro() : bool
80 {
81 return \false;
82 }
83 /**
84 * Get a field value. This method supports text and arrays. Returns array if no field found.
85 *
86 * @param $field
87 *
88 * @return array|string|null
89 */
90 protected function get_field($field)
91 {
92 if (!\array_key_exists($field, $_POST)) {
93 return null;
94 }
95 $type = \gettype($_POST[$field]);
96 if ($type == 'array') {
97 if ($this->array_is_list($_POST[$field])) {
98 return \rest_sanitize_array($_POST[$field]);
99 } else {
100 return \rest_sanitize_object($_POST[$field]);
101 }
102 } else {
103 return \stripslashes(\sanitize_text_field($_POST[$field]));
104 }
105 }
106 protected function get_boolean_field($field) : ?bool
107 {
108 if (!\array_key_exists($field, $_POST)) {
109 return null;
110 }
111 $type = \gettype($_POST[$field]);
112 if ($type === 'string') {
113 return $_POST[$field] === 'true';
114 } else {
115 return null;
116 }
117 }
118 // This is the recommended polyfill: https://wiki.php.net/rfc/is_list
119 private function array_is_list(array $array) : bool
120 {
121 $expectedKey = 0;
122 foreach ($array as $i => $_) {
123 if ($i !== $expectedKey) {
124 return \false;
125 }
126 $expectedKey++;
127 }
128 return \true;
129 }
130 private function missing_fields() : bool
131 {
132 foreach ($this->action_required_fields() as $required_field) {
133 if (!\array_key_exists($required_field, $_POST)) {
134 return \true;
135 }
136 }
137 return \false;
138 }
139 }
140