PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.10.3
Independent Analytics – WordPress Analytics Plugin v2.10.3
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 1 year ago AJAX_Manager.php 1 year ago Archive_Link.php 1 year ago Click_Tracking_Cache_Cleared.php 1 year ago Configure_Pruner.php 2 years ago Copy_Report.php 1 year 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_Link.php 1 year ago Delete_Report.php 1 year ago Dismiss_Notice.php 1 year ago Edit_Link.php 1 year ago Export_Report_Statistics.php 1 year ago Export_Report_Table.php 1 year 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 1 year ago Reset_Analytics.php 2 years ago Save_Report.php 1 year ago Set_Favorite_Report.php 2 years ago Set_WooCommerce_Statuses_To_Track.php 1 year ago Sort_Links.php 1 year ago Sort_Reports.php 1 year ago Test_Email.php 2 years ago Update_Capabilities.php 2 years ago Update_User_Settings.php 2 years ago
AJAX.php
154 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_int_field($field) : ?int
107 {
108 if (!\array_key_exists($field, $_POST)) {
109 return null;
110 }
111 $type = \gettype($_POST[$field]);
112 if ($type === 'int') {
113 return $_POST[$field];
114 } elseif ($type === 'string') {
115 return \ctype_digit($_POST[$field]) ? (int) $_POST[$field] : null;
116 } else {
117 return null;
118 }
119 }
120 protected function get_boolean_field($field) : ?bool
121 {
122 if (!\array_key_exists($field, $_POST)) {
123 return null;
124 }
125 $type = \gettype($_POST[$field]);
126 if ($type === 'string') {
127 return $_POST[$field] === 'true';
128 } else {
129 return null;
130 }
131 }
132 // This is the recommended polyfill: https://wiki.php.net/rfc/is_list
133 private function array_is_list(array $array) : bool
134 {
135 $expectedKey = 0;
136 foreach ($array as $i => $_) {
137 if ($i !== $expectedKey) {
138 return \false;
139 }
140 $expectedKey++;
141 }
142 return \true;
143 }
144 private function missing_fields() : bool
145 {
146 foreach ($this->action_required_fields() as $required_field) {
147 if (!\array_key_exists($required_field, $_POST)) {
148 return \true;
149 }
150 }
151 return \false;
152 }
153 }
154