PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 2.0.25
Advanced Ads – Ad Manager & AdSense v2.0.25
2.0.25 2.0.24 2.0.23 2.0.22 2.0.21 1.38.0 1.39.0 1.39.1 1.39.2 1.39.3 1.39.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.40.0 1.40.1 1.40.2 1.41.0 1.42.0 1.42.1 1.42.2 1.43.0 1.44.0 1.44.1 1.45.0 1.45.1 1.46.0 1.47.0 1.47.1 1.47.2 1.47.3 1.47.4 1.47.5 1.48.0 1.48.1 1.49.0 1.5.0 1.5.0.1 1.5.1 1.5.2 1.5.2.1 1.5.4 1.5.4.1 1.5.5 1.50.0 1.51.0 1.51.1 1.51.2 1.51.3 1.52.0 1.52.1 1.52.2 1.52.3 1.52.4 1.53.0 1.53.1 1.53.2 1.54.0 1.54.1 1.55.0 1.56.0 1.56.1 1.56.2 1.56.3 1.56.4 1.6 1.6.1 1.6.10 1.6.10.1 1.6.10.2 1.6.11 1.6.11.1 1.6.12 1.6.13 1.6.14 1.6.15 1.6.16 1.6.17 1.6.17.1 1.6.17.2 1.6.2 1.6.2.1 1.6.3 1.6.4 1.6.4.1 1.6.5 1.6.6 1.6.6.1 1.6.7 1.6.7.1 1.6.8 1.6.8.1 1.6.8.2 1.6.8.3 1.6.9 1.6.9.1 1.6.9.2 1.6.9.3 1.6.9.4 1.7 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.1.1 1.7.1.2 1.7.1.3 1.7.1.4 1.7.1.5 1.7.10 trunk 1.7.11 1.0.1 1.7.12 1.0.2 1.7.13 1.0.3 1.7.14 1.1.0 1.7.15 1.1.1 1.7.16 1.1.2 1.7.17 1.1.3 1.7.18 1.10 1.7.19 1.10.1 1.7.2 1.10.10 1.7.2.1 1.10.11 1.7.20 1.10.12 1.7.21 1.10.2 1.7.22 1.10.3 1.7.23 1.10.4 1.7.24 1.10.5 1.7.25 1.10.6 1.7.3 1.10.7 1.7.4 1.10.8 1.7.4.1 1.10.9 1.7.4.2 1.11 1.7.4.3 1.11.1 1.7.4.4 1.11.2 1.7.4.5 1.12 1.7.5 1.13 1.7.5.1 1.13.1 1.7.6 1.13.2 1.7.7 1.13.3 1.7.8 1.13.4 1.7.9 1.13.5 1.7.9.1 1.13.6 1.7.9.2 1.13.7 1.7.9.3 1.13.8 1.8 1.14 1.8.1 1.14.1 1.8.10 1.14.10 1.8.11 1.14.11 1.8.12 1.14.2 1.8.13 1.14.3 1.8.14 1.14.4 1.8.15 1.14.5 1.8.16 1.14.6 1.8.17 1.14.7 1.8.18 1.14.8 1.8.19 1.14.9 1.8.2 1.15 1.8.20 1.16 1.8.21 1.16.1 1.8.22 1.17 1.8.23 1.17.1 1.8.24 1.17.10 1.8.25 1.17.10-rc.1 1.8.26 1.17.11 1.8.27 1.17.12 1.8.28 1.17.12-rc.1 1.8.29 1.17.2 1.8.3 1.17.3 1.8.30 1.17.4 1.8.4 1.17.5 1.8.5 1.17.6 1.8.6 1.17.7 1.8.7 1.17.8 1.8.8 1.17.9 1.8.9 1.17.9-beta.1 1.9 1.18.0 2.0.0 1.19.0 2.0.1 1.19.1 2.0.10 1.2 2.0.11 1.2.1 2.0.12 1.2.2 2.0.13 1.2.3 2.0.14 1.2.4 2.0.15 1.2.5 2.0.16 1.2.6 2.0.17 1.2.7 2.0.18 1.20.0 2.0.19 1.20.0-rc.1 2.0.2 1.20.0-rc.2 2.0.20 1.20.1 2.0.3 1.20.2 2.0.4 1.20.3 2.0.5 1.21.0 2.0.6 1.21.1 2.0.7 1.22.0 2.0.8 1.22.1 2.0.9 1.22.2 1.23.0 1.23.1 1.23.2 1.24.0 1.24.1 1.24.2 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.29.0 1.29.1 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.14 1.3.15 1.3.16 1.3.17 1.3.18 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.30.0 1.30.1 1.30.2 1.30.2-rc.1 1.30.3 1.30.4 1.30.4-rc.1 1.30.5 1.31.0 1.31.1 1.32.0 1.32.0-rc.1 1.33.0 1.33.1 1.33.2 1.34.0 1.35.0 1.35.1 1.36.0 1.36.1 1.36.2 1.36.3 1.37.0 1.37.1 1.37.2
advanced-ads / includes / rest / class-licenses.php
advanced-ads / includes / rest Last commit date
class-groups.php 5 days ago class-licenses.php 2 days ago class-onboarding.php 1 year ago class-page-quick-edit.php 2 days ago class-placements.php 1 year ago class-utilities.php 2 days ago
class-licenses.php
224 lines
1 <?php
2 /**
3 * Licenses Rest route and endpoints.
4 *
5 * @package AdvancedAds
6 * @author Advanced Ads <info@wpadvancedads.com>
7 * @since 1.50.0
8 */
9
10 namespace AdvancedAds\Rest;
11
12 use AdvancedAds\Admin\Plugin_Auto_Update;
13 use AdvancedAds\Constants;
14 use AdvancedAds\Framework\Interfaces\Routes_Interface;
15 use AdvancedAds\License\License;
16 use AdvancedAds\License\License_Utils;
17 use AdvancedAds\Utilities\Conditional;
18 use WP_Error;
19 use WP_REST_Request;
20 use WP_REST_Server;
21
22 defined( 'ABSPATH' ) || exit;
23
24 /**
25 * Rest Licenses.
26 */
27 class Licenses implements Routes_Interface {
28 /**
29 * Registers routes with WordPress.
30 *
31 * @return void
32 */
33 public function register_routes(): void {
34 register_rest_route(
35 Constants::REST_BASE,
36 '/licenses',
37 [
38 [
39 'methods' => WP_REST_Server::READABLE,
40 'callback' => [ $this, 'get_licenses' ],
41 'permission_callback' => [ $this, 'can_manage' ],
42 ],
43 [
44 'methods' => WP_REST_Server::CREATABLE,
45 'callback' => [ $this, 'set_licenses' ],
46 'permission_callback' => [ $this, 'can_manage' ],
47 'args' => [
48 'licenses' => [
49 'required' => true,
50 'type' => 'array',
51 ],
52 'activate' => [
53 'required' => false,
54 'type' => 'boolean',
55 'default' => false,
56 ],
57 'activatingLicenseKey' => [
58 'required' => false,
59 'type' => 'string',
60 'default' => '',
61 ],
62 'activatingAddonId' => [
63 'required' => false,
64 'type' => 'string',
65 'default' => '',
66 ],
67 'installOnly' => [
68 'required' => false,
69 'type' => 'boolean',
70 'default' => false,
71 ],
72 'deactivatingAddonId' => [
73 'required' => false,
74 'type' => 'string',
75 'default' => '',
76 ],
77 'deactivatingLicenseKey' => [
78 'required' => false,
79 'type' => 'string',
80 'default' => '',
81 ],
82 ],
83 ],
84 ]
85 );
86
87 register_rest_route(
88 Constants::REST_BASE,
89 '/plugin-autoupdate',
90 [
91 'methods' => WP_REST_Server::CREATABLE,
92 'callback' => [ $this, 'set_plugin_autoupdate' ],
93 'permission_callback' => [ $this, 'can_manage' ],
94 'args' => [
95 'addonId' => [
96 'required' => false,
97 'type' => 'string',
98 'default' => Plugin_Auto_Update::MAIN_ADDON_KEY,
99 ],
100 'state' => [
101 'required' => true,
102 'type' => 'string',
103 'enum' => [ Plugin_Auto_Update::STATE_ON, Plugin_Auto_Update::STATE_OFF ],
104 ],
105 ],
106 ]
107 );
108 }
109
110 /**
111 * Permission callback.
112 *
113 * @return bool
114 */
115 public function can_manage(): bool {
116 return Conditional::user_can( 'advanced_ads_manage_options' );
117 }
118
119 /**
120 * Get persisted licenses.
121 *
122 * @return array
123 */
124 public function get_licenses(): array {
125 License::maybe_complete_legacy_license_migration();
126
127 $rich = License::get_licenses();
128
129 // Passive reconcile on read: mirror addon status only; never reshuffle activations.
130 $rich = License::reconcile_persisted_licenses( $rich, false, false );
131 $rich = License::finalize_license_sync( $rich );
132
133 return $this->licenses_api_response( $rich );
134 }
135
136 /**
137 * Persist licenses.
138 *
139 * @param WP_REST_Request $request the request object.
140 *
141 * @return array|WP_Error
142 */
143 public function set_licenses( WP_REST_Request $request ) {
144 $licenses = $request->get_param( 'licenses' );
145 $licenses = is_array( $licenses ) ? $licenses : [];
146 $licenses = wp_unslash( $licenses );
147
148 $activate = (bool) $request->get_param( 'activate' );
149 $activating_license_key = (string) $request->get_param( 'activatingLicenseKey' );
150 $activating_license_key = sanitize_text_field( $activating_license_key );
151 $activating_addon_id = (string) $request->get_param( 'activatingAddonId' );
152 $activating_addon_id = sanitize_key( $activating_addon_id );
153 $install_only = (bool) $request->get_param( 'installOnly' );
154 $deactivating_addon_id = (string) $request->get_param( 'deactivatingAddonId' );
155 $deactivating_addon_id = sanitize_key( $deactivating_addon_id );
156 $deactivating_license_key = (string) $request->get_param( 'deactivatingLicenseKey' );
157 $deactivating_license_key = sanitize_text_field( $deactivating_license_key );
158
159 $rich = License::save_licenses(
160 $licenses,
161 $activate,
162 $activating_license_key,
163 $activating_addon_id,
164 $install_only,
165 $deactivating_addon_id,
166 $deactivating_license_key
167 );
168
169 if ( is_wp_error( $rich ) ) {
170 return $rich;
171 }
172
173 return $this->licenses_api_response( $rich );
174 }
175
176 /**
177 * Toggle per-plugin auto-update (advanced-ads-{addon}-autoupdate).
178 *
179 * @param WP_REST_Request $request Request.
180 * @return array|WP_Error
181 */
182 public function set_plugin_autoupdate( WP_REST_Request $request ) {
183 $addon_id = (string) $request->get_param( 'addonId' );
184 $state = (string) $request->get_param( 'state' );
185
186 $normalized = Plugin_Auto_Update::MAIN_ADDON_KEY === $addon_id || '' === $addon_id
187 ? null
188 : sanitize_key( $addon_id );
189
190 $result = Plugin_Auto_Update::set_state( $normalized, $state );
191
192 if ( is_wp_error( $result ) ) {
193 return $result;
194 }
195
196 $response_key = null === $normalized ? Plugin_Auto_Update::MAIN_ADDON_KEY : $normalized;
197
198 return [
199 'addonId' => $response_key,
200 'state' => Plugin_Auto_Update::get_state( $normalized ),
201 'autoUpdateStates' => Plugin_Auto_Update::get_all_states(),
202 ];
203 }
204
205 /**
206 * REST payload: rich rows plus legacy addon key map (advanced-ads-licenses).
207 *
208 * @param array<int, array<string, mixed>> $rich Rich license list.
209 * @return array{licenses: array<int, array<string, mixed>>, appliedAddonKeyMap: array<string, string>}
210 */
211 private function licenses_api_response( array $rich ): array {
212 $rich = License::normalize_rich_license_list( $rich );
213
214 return [
215 'licenses' => $rich,
216 'appliedAddonKeyMap' => License::get_addon_key_map(),
217 'autoUpdateStates' => Plugin_Auto_Update::get_all_states(),
218 'addonInstallStates' => License::get_addon_install_states(),
219 'lastSyncAt' => License_Utils::get_last_sync(),
220 'expiryNoticeFlags' => License_Utils::get_expiry_notice_flags(),
221 ];
222 }
223 }
224