PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 2.0.26
Advanced Ads – Ad Manager & AdSense v2.0.26
2.0.26 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 3 weeks ago class-licenses.php 3 weeks ago class-onboarding.php 1 year ago class-page-quick-edit.php 3 weeks ago class-placements.php 3 weeks ago class-utilities.php 1 month ago
class-licenses.php
246 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_Site_Activation;
17 use AdvancedAds\License\License_Utils;
18 use AdvancedAds\Utilities\Conditional;
19 use WP_Error;
20 use WP_REST_Request;
21 use WP_REST_Server;
22
23 defined( 'ABSPATH' ) || exit;
24
25 /**
26 * Rest Licenses.
27 */
28 class Licenses implements Routes_Interface {
29 /**
30 * Registers routes with WordPress.
31 *
32 * @return void
33 */
34 public function register_routes(): void {
35 register_rest_route(
36 Constants::REST_BASE,
37 '/licenses',
38 [
39 [
40 'methods' => WP_REST_Server::READABLE,
41 'callback' => [ $this, 'get_licenses' ],
42 'permission_callback' => [ $this, 'can_manage' ],
43 ],
44 [
45 'methods' => WP_REST_Server::CREATABLE,
46 'callback' => [ $this, 'set_licenses' ],
47 'permission_callback' => [ $this, 'can_manage' ],
48 'args' => [
49 'licenses' => [
50 'required' => true,
51 'type' => 'array',
52 ],
53 'activate' => [
54 'required' => false,
55 'type' => 'boolean',
56 'default' => false,
57 ],
58 'activatingLicenseKey' => [
59 'required' => false,
60 'type' => 'string',
61 'default' => '',
62 ],
63 'activatingAddonId' => [
64 'required' => false,
65 'type' => 'string',
66 'default' => '',
67 ],
68 'installOnly' => [
69 'required' => false,
70 'type' => 'boolean',
71 'default' => false,
72 ],
73 'deactivatingAddonId' => [
74 'required' => false,
75 'type' => 'string',
76 'default' => '',
77 ],
78 'deactivatingLicenseKey' => [
79 'required' => false,
80 'type' => 'string',
81 'default' => '',
82 ],
83 ],
84 ],
85 ]
86 );
87
88 register_rest_route(
89 Constants::REST_BASE,
90 '/plugin-autoupdate',
91 [
92 'methods' => WP_REST_Server::CREATABLE,
93 'callback' => [ $this, 'set_plugin_autoupdate' ],
94 'permission_callback' => [ $this, 'can_manage' ],
95 'args' => [
96 'addonId' => [
97 'required' => false,
98 'type' => 'string',
99 'default' => Plugin_Auto_Update::MAIN_ADDON_KEY,
100 ],
101 'state' => [
102 'required' => true,
103 'type' => 'string',
104 'enum' => [ Plugin_Auto_Update::STATE_ON, Plugin_Auto_Update::STATE_OFF ],
105 ],
106 ],
107 ]
108 );
109 }
110
111 /**
112 * Permission callback.
113 *
114 * @return bool
115 */
116 public function can_manage(): bool {
117 return Conditional::user_can( 'advanced_ads_manage_options' );
118 }
119
120 /**
121 * Get persisted licenses.
122 *
123 * @return array{licenses: array<int, array<string, mixed>>, appliedAddonKeyMap: array<string, string>, currentActiveLicenses: string, autoUpdateStates: array<string, string>, addonInstallStates: array<string, array{installed: bool, active: bool}>, lastSyncAt: mixed, expiryNoticeFlags: mixed}
124 */
125 public function get_licenses(): array {
126 License::maybe_complete_legacy_license_migration();
127
128 $rich = License::get_licenses();
129 $hostname = License::get_site_hostname();
130 $before = wp_json_encode( $rich );
131
132 // Heal Sites count when advanced-ads-licenses marks a key active but sitesActivated is empty.
133 if ( '' !== $hostname ) {
134 foreach ( License_Site_Activation::get_active_license_keys() as $license_key ) {
135 $row = License_Utils::get_rich_license_row_by_key( $rich, $license_key );
136 if ( ! is_array( $row ) ) {
137 continue;
138 }
139 if ( License::is_site_activated_on_license( $row, $hostname ) ) {
140 continue;
141 }
142 $rich = License::ensure_local_site_slot_on_license( $rich, $license_key );
143 }
144
145 if ( wp_json_encode( $rich ) !== $before ) {
146 update_option( License::OPTION_RICH, $rich, false );
147 }
148 }
149
150 // Passive reconcile on read: mirror addon status only; never reshuffle activations.
151 $rich = License::reconcile_persisted_licenses( $rich, false, false );
152 $rich = License::finalize_license_sync( $rich );
153
154 return $this->licenses_api_response( $rich );
155 }
156
157 /**
158 * Persist licenses.
159 *
160 * @param WP_REST_Request $request the request object.
161 *
162 * @return array{licenses: array<int, array<string, mixed>>, appliedAddonKeyMap: array<string, string>, currentActiveLicenses: string, autoUpdateStates: array<string, string>, addonInstallStates: array<string, array{installed: bool, active: bool}>, lastSyncAt: mixed, expiryNoticeFlags: mixed}|WP_Error
163 */
164 public function set_licenses( WP_REST_Request $request ) {
165 $licenses = $request->get_param( 'licenses' );
166 $licenses = is_array( $licenses ) ? $licenses : [];
167 $licenses = wp_unslash( $licenses );
168
169 $activate = (bool) $request->get_param( 'activate' );
170 $activating_license_key = (string) $request->get_param( 'activatingLicenseKey' );
171 $activating_license_key = sanitize_text_field( $activating_license_key );
172 $activating_addon_id = (string) $request->get_param( 'activatingAddonId' );
173 $activating_addon_id = sanitize_key( $activating_addon_id );
174 $install_only = (bool) $request->get_param( 'installOnly' );
175 $deactivating_addon_id = (string) $request->get_param( 'deactivatingAddonId' );
176 $deactivating_addon_id = sanitize_key( $deactivating_addon_id );
177 $deactivating_license_key = (string) $request->get_param( 'deactivatingLicenseKey' );
178 $deactivating_license_key = sanitize_text_field( $deactivating_license_key );
179
180 $rich = License::save_licenses(
181 $licenses,
182 [
183 'activate_new' => $activate,
184 'activating_license_key' => $activating_license_key,
185 'activating_addon_id' => $activating_addon_id,
186 'install_only' => $install_only,
187 'deactivating_addon_id' => $deactivating_addon_id,
188 'deactivating_license_key' => $deactivating_license_key,
189 ]
190 );
191
192 if ( is_wp_error( $rich ) ) {
193 return $rich;
194 }
195
196 return $this->licenses_api_response( $rich );
197 }
198
199 /**
200 * Toggle per-plugin auto-update (advanced-ads-{addon}-autoupdate).
201 *
202 * @param WP_REST_Request $request Request.
203 * @return array{addonId: string, state: string, autoUpdateStates: array<string, string>}|WP_Error
204 */
205 public function set_plugin_autoupdate( WP_REST_Request $request ) {
206 $addon_id = (string) $request->get_param( 'addonId' );
207 $state = (string) $request->get_param( 'state' );
208
209 $normalized = Plugin_Auto_Update::MAIN_ADDON_KEY === $addon_id || '' === $addon_id
210 ? null
211 : sanitize_key( $addon_id );
212
213 $result = Plugin_Auto_Update::set_state( $normalized, $state );
214
215 if ( is_wp_error( $result ) ) {
216 return $result;
217 }
218
219 $response_key = null === $normalized ? Plugin_Auto_Update::MAIN_ADDON_KEY : $normalized;
220
221 return [
222 'addonId' => $response_key,
223 'state' => Plugin_Auto_Update::get_state( $normalized ),
224 'autoUpdateStates' => Plugin_Auto_Update::get_all_states(),
225 ];
226 }
227
228 /**
229 * REST payload: rich rows plus derived addon key map / site activation state.
230 *
231 * @param array<int, array<string, mixed>> $rich Rich license list.
232 * @return array{licenses: array<int, array<string, mixed>>, appliedAddonKeyMap: array<string, string>}
233 */
234 private function licenses_api_response( array $rich ): array {
235 return [
236 'licenses' => $rich,
237 'appliedAddonKeyMap' => License::get_addon_key_map(),
238 'currentActiveLicenses' => implode( ',', License_Site_Activation::get_active_license_keys() ),
239 'autoUpdateStates' => Plugin_Auto_Update::get_all_states(),
240 'addonInstallStates' => License::get_addon_install_states(),
241 'lastSyncAt' => License_Utils::get_last_sync(),
242 'expiryNoticeFlags' => License_Utils::get_expiry_notice_flags(),
243 ];
244 }
245 }
246