PluginProbe ʕ •ᴥ•ʔ
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More / 4.0.7
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More v4.0.7
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0 trunk 1.0.0 2.0.0 2.0.1 2.0.2 2.0.3 3.0 3.0.1 3.0.2 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.2 3.1.3 3.2.0 3.2.1 3.2.2 3.2.4 3.2.5 3.2.7 3.2.8 3.2.9 3.3.0 3.3.1 3.3.2 3.4.0 3.4.1 3.4.2 3.4.5 3.4.6 3.5.0 3.5.1 3.5.2 3.5.3 3.5.4 3.5.6 3.5.7 3.5.8 3.5.9 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1
superb-blocks / src / admin / controllers / class-settings-controller.php
superb-blocks / src / admin / controllers Last commit date
wizard 4 days ago class-dashboard-controller.php 4 days ago class-license-resolve-controller.php 4 days ago class-newsletter-signup-controller.php 4 days ago class-notice-controller.php 4 days ago class-plugin-reset-controller.php 4 days ago class-review-controller.php 4 days ago class-rewrite-check-controller.php 4 days ago class-settings-controller.php 4 days ago class-troubleshooting-controller.php 4 days ago
class-settings-controller.php
598 lines
1 <?php
2
3 namespace SuperbAddons\Admin\Controllers;
4
5 defined('ABSPATH') || exit();
6
7 use SuperbAddons\Admin\Controllers\PluginResetController;
8 use SuperbAddons\Config\Capabilities;
9 use SuperbAddons\Data\Controllers\CacheController;
10 use SuperbAddons\Data\Controllers\KeyController;
11 use SuperbAddons\Data\Controllers\OptionController;
12 use SuperbAddons\Data\Controllers\RestController;
13 use SuperbAddons\Data\Controllers\SettingsOptionKey;
14 use Exception;
15 use SuperbAddons\Admin\Controllers\Wizard\WizardRestorationPointController;
16 use SuperbAddons\Data\Controllers\CompatibilitySettingsOptionKey;
17 use SuperbAddons\Data\Controllers\LogController;
18 use SuperbAddons\Data\Utils\KeyException;
19 use SuperbAddons\Data\Utils\SettingsException;
20 use SuperbAddons\Gutenberg\Controllers\GutenbergController;
21 use SuperbAddons\Gutenberg\Controllers\GutenbergEnhancementsController;
22 use SuperbAddons\Gutenberg\Form\FormAccessControl;
23 use SuperbAddons\Gutenberg\Form\FormIntegrationHandler;
24 use SuperbAddons\Gutenberg\Form\FormPermissions;
25 use SuperbAddons\Gutenberg\Form\FormSettings;
26
27 class SettingsController
28 {
29 const SETTINGS_ROUTE = '/settings';
30
31 public function __construct()
32 {
33 RestController::AddRoute(self::SETTINGS_ROUTE, array(
34 'methods' => 'POST',
35 'permission_callback' => array($this, 'SettingsCallbackPermissionCheck'),
36 'callback' => array($this, 'SettingsRouteCallback'),
37 ));
38 }
39
40 public function SettingsCallbackPermissionCheck()
41 {
42 // Restrict endpoint to only users who have the proper capability.
43 if (!current_user_can(Capabilities::ADMIN)) {
44 return new \WP_Error('rest_forbidden', esc_html__('Unauthorized. Please check user permissions.', "superb-blocks"), array('status' => 401));
45 }
46
47 return true;
48 }
49
50 public function SettingsRouteCallback($request)
51 {
52 if (!isset($request['action'])) {
53 return new \WP_Error('bad_request_plugin', 'Bad Plugin Request', array('status' => 400));
54 }
55 switch ($request['action']) {
56 case 'submit_feedback':
57 return $this->SubmitFeedbackCallback($request);
58 case 'addkey':
59 return $this->RegisterKeyCallback($request);
60 case 'removekey':
61 return $this->RemoveKeyCallback();
62 case SettingsOptionKey::LOGS_ENABLED:
63 case SettingsOptionKey::LOG_SHARE_ENABLED:
64 case 'clear_cache':
65 case 'clear_logs':
66 case 'view_logs':
67 case 'clear_restoration_points':
68 return $this->SaveSettingsCallback($request['action']);
69 case GutenbergEnhancementsController::HIGHLIGHTS_KEY:
70 case GutenbergEnhancementsController::HIGHLIGHTS_QUICKOPTIONS_KEY:
71 case GutenbergEnhancementsController::HIGHLIGHTS_QUICKOPTIONS_BOTTOM_KEY:
72 case GutenbergEnhancementsController::RESPONSIVE_KEY:
73 case GutenbergEnhancementsController::ANIMATIONS_KEY:
74 case GutenbergEnhancementsController::CONDITIONS_KEY:
75 case GutenbergEnhancementsController::DYNAMIC_CONTENT_KEY:
76 case GutenbergEnhancementsController::NAVIGATION_KEY:
77 case GutenbergEnhancementsController::RICHTEXT_KEY:
78 case GutenbergEnhancementsController::SOCIAL_ICONS_KEY:
79 case GutenbergEnhancementsController::DASHBOARD_SHORTCUTS_KEY:
80 case GutenbergEnhancementsController::STICKY_KEY:
81 case GutenbergEnhancementsController::Z_INDEX_KEY:
82 case GutenbergEnhancementsController::PANEL_DEFAULT_STATE_KEY:
83 return GutenbergEnhancementsController::OptionsSaveCallback($request);
84 case CompatibilitySettingsOptionKey::SPECTRA_BLOCK_SPACING:
85 return $this->SaveCompatibilitySettingsCallback($request['action']);
86 case 'save_integration_key':
87 return $this->SaveIntegrationKeyCallback($request);
88 case 'remove_integration_key':
89 return $this->RemoveIntegrationKeyCallback($request);
90 case 'toggle_block':
91 return $this->ToggleBlockCallback($request);
92 case 'save_form_permissions':
93 return $this->SaveFormPermissionsCallback($request);
94 case 'save_default_email':
95 return $this->SaveDefaultEmailCallback($request);
96 case 'save_data_retention':
97 return $this->SaveDataRetentionCallback($request);
98 case 'save_captcha_key':
99 return $this->SaveCaptchaKeyCallback($request);
100 case 'remove_captcha_key':
101 return $this->RemoveCaptchaKeyCallback($request);
102 case 'get_integration_usage':
103 return $this->GetIntegrationUsageCallback($request);
104 case 'remove_all_data':
105 return $this->RemoveAllDataCallback($request);
106 default:
107 return new \WP_Error('bad_request_plugin', 'Bad Plugin Request', array('status' => 400));
108 }
109 }
110
111 private function SubmitFeedbackCallback($request)
112 {
113 try {
114 if (!isset($request['spbaddons_reason']) || empty($request['spbaddons_reason'])) throw new SettingsException(__('Unable to send feedback. No feedback provided.', "superb-blocks"));
115
116 if ($request['spbaddons_reason'] === 'other' && isset($request['spbaddons_other'])) {
117 $message = sanitize_text_field($request['spbaddons_other']);
118 } else {
119 $message = sanitize_text_field($request['spbaddons_reason']);
120 }
121 LogController::SendFeedback($message);
122
123 return rest_ensure_response(['success' => true]);
124 } catch (SettingsException $s_ex) {
125 return rest_ensure_response(['success' => false, "text" => esc_html($s_ex->getMessage())]);
126 } catch (Exception $ex) {
127 LogController::HandleException($ex);
128 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
129 }
130 }
131
132 private function RegisterKeyCallback($request)
133 {
134 try {
135 KeyController::RegisterKey($request['key'], true);
136 return rest_ensure_response(['success' => true]);
137 } catch (KeyException $k_ex) {
138 return rest_ensure_response(['success' => false, "text" => esc_html($k_ex->getMessage())]);
139 } catch (Exception $ex) {
140 LogController::HandleException($ex);
141 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
142 }
143 }
144
145 private function RemoveKeyCallback()
146 {
147 try {
148 $removed = KeyController::RemoveKey();
149 return rest_ensure_response(['success' => $removed]);
150 } catch (KeyException $k_ex) {
151 return rest_ensure_response(['success' => false, "text" => esc_html($k_ex->getMessage())]);
152 } catch (Exception $ex) {
153 LogController::HandleException($ex);
154 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
155 }
156 }
157
158 public static function GetSettings()
159 {
160 return OptionController::GetSettings();
161 }
162
163 public static function GetCompatibilitySettings()
164 {
165 return OptionController::GetCompatibilitySettings();
166 }
167
168 private function SaveSettingsCallback($action)
169 {
170 try {
171 $option_controller = new OptionController();
172 $current_settings = OptionController::GetSettings();
173
174 switch ($action) {
175 case SettingsOptionKey::LOGS_ENABLED:
176 $current_settings[SettingsOptionKey::LOGS_ENABLED] = !$current_settings[SettingsOptionKey::LOGS_ENABLED];
177 $option_controller->SaveSettings($current_settings);
178 break;
179 case SettingsOptionKey::LOG_SHARE_ENABLED:
180 $current_settings[SettingsOptionKey::LOG_SHARE_ENABLED] = !$current_settings[SettingsOptionKey::LOG_SHARE_ENABLED];
181 $saved = $option_controller->SaveSettings($current_settings);
182 if ($saved) {
183 $current_settings[SettingsOptionKey::LOG_SHARE_ENABLED] ? LogController::MaybeSubscribeCron() : LogController::MaybeUnsubscribeCron();
184 }
185 break;
186 case 'clear_cache':
187 $cleared = CacheController::ClearCacheAll();
188 if (!$cleared) throw new SettingsException(__('Cache could not be cleared.', "superb-blocks"));
189 break;
190 case 'clear_logs':
191 $cleared = LogController::ClearLogs();
192 if (!$cleared) throw new SettingsException(__('Logs could not be cleared.', "superb-blocks"));
193 break;
194 case 'view_logs':
195 return rest_ensure_response(['success' => true, 'content' => LogController::GetLogs()]);
196 case 'clear_restoration_points':
197 $cleared = WizardRestorationPointController::FullRestorationCleanup();
198 if (!$cleared) throw new SettingsException(__('Restoration points could not be cleared.', "superb-blocks"));
199 break;
200 }
201
202 return rest_ensure_response(['success' => true]);
203 } catch (SettingsException $s_ex) {
204 return rest_ensure_response(['success' => false, "text" => esc_html($s_ex->getMessage())]);
205 } catch (Exception $ex) {
206 LogController::HandleException($ex);
207 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
208 }
209 }
210
211 private function SaveCompatibilitySettingsCallback($action)
212 {
213 try {
214 $option_controller = new OptionController();
215 $current_settings = OptionController::GetCompatibilitySettings();
216
217 switch ($action) {
218 case CompatibilitySettingsOptionKey::SPECTRA_BLOCK_SPACING:
219 $current_settings[CompatibilitySettingsOptionKey::SPECTRA_BLOCK_SPACING] = !$current_settings[CompatibilitySettingsOptionKey::SPECTRA_BLOCK_SPACING];
220 $option_controller->SaveCompatibilitySettings($current_settings);
221 break;
222 }
223
224 return rest_ensure_response(['success' => true]);
225 } catch (SettingsException $s_ex) {
226 return rest_ensure_response(['success' => false, "text" => esc_html($s_ex->getMessage())]);
227 } catch (Exception $ex) {
228 LogController::HandleException($ex);
229 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
230 }
231 }
232
233 private static function GetIntegrationOptionKey($integration)
234 {
235 $map = array(
236 'mailchimp' => FormSettings::OPTION_MAILCHIMP_API_KEY,
237 'brevo' => FormSettings::OPTION_BREVO_API_KEY,
238 );
239 return isset($map[$integration]) ? $map[$integration] : false;
240 }
241
242 private function SaveIntegrationKeyCallback($request)
243 {
244 try {
245 // REST body params are already unslashed by core (WP_REST_Server::serve_request),
246 // so no wp_unslash here — a second pass would strip the \n escapes in pasted JSON keys.
247 $integration = isset($request['integration']) ? sanitize_text_field($request['integration']) : '';
248 $api_key = isset($request['api_key']) ? $request['api_key'] : '';
249
250 // Google Sheets uses a JSON Service Account key
251 if ($integration === 'google_sheets') {
252 return $this->SaveGoogleSheetsKeyCallback($api_key);
253 }
254
255 $api_key = sanitize_text_field($api_key);
256 $option_key = self::GetIntegrationOptionKey($integration);
257 if (!$option_key) {
258 throw new SettingsException(__('Invalid integration.', "superb-blocks"));
259 }
260 if (empty($api_key)) {
261 throw new SettingsException(__('API key cannot be empty.', "superb-blocks"));
262 }
263
264 // Save the key so the integration handler can use it for validation.
265 FormSettings::Set($option_key, $api_key);
266
267 // Validate the key by attempting to fetch lists from the service.
268 if ($integration === 'mailchimp') {
269 $result = FormIntegrationHandler::GetMailchimpLists();
270 } else {
271 $result = FormIntegrationHandler::GetBrevoLists();
272 }
273
274 if (is_wp_error($result)) {
275 // Validation failed — remove the key and return the error.
276 FormSettings::Remove($option_key);
277 throw new SettingsException($result->get_error_message());
278 }
279
280 return rest_ensure_response(array(
281 'success' => true,
282 'masked_key' => FormSettings::GetMasked($option_key),
283 ));
284 } catch (SettingsException $s_ex) {
285 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
286 } catch (Exception $ex) {
287 LogController::HandleException($ex);
288 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
289 }
290 }
291
292 private function SaveGoogleSheetsKeyCallback($json_string)
293 {
294 try {
295 if (empty($json_string)) {
296 throw new SettingsException(__('Service Account JSON key cannot be empty.', 'superb-blocks'));
297 }
298
299 $json = json_decode($json_string, true);
300 if (!is_array($json)) {
301 throw new SettingsException(__('Invalid JSON format. Please paste the entire contents of your Service Account JSON key.', 'superb-blocks'));
302 }
303
304 $client_email = isset($json['client_email']) ? sanitize_email($json['client_email']) : '';
305 $private_key = isset($json['private_key']) ? $json['private_key'] : '';
306
307 if (empty($client_email) || empty($private_key)) {
308 throw new SettingsException(__('The JSON key must contain "client_email" and "private_key" fields.', 'superb-blocks'));
309 }
310
311 // Validate email format
312 if (!is_email($client_email)) {
313 throw new SettingsException(__('Invalid client_email in the Service Account key.', 'superb-blocks'));
314 }
315
316 // Validate the private key is a usable PEM key now, so a truncated/corrupt paste fails
317 // here with a clear message instead of later as "Failed to sign JWT" on submission.
318 if (function_exists('openssl_pkey_get_private') && openssl_pkey_get_private($private_key) === false) {
319 throw new SettingsException(__('The private_key in the Service Account JSON is not a valid key. Paste the entire JSON file.', 'superb-blocks'));
320 }
321
322 // Store the extracted values
323 FormSettings::Set(FormSettings::OPTION_GOOGLE_SHEETS_CLIENT_EMAIL, $client_email);
324 FormSettings::Set(FormSettings::OPTION_GOOGLE_SHEETS_PRIVATE_KEY, $private_key);
325
326 // New credentials invalidate any access token cached from the previous key.
327 delete_transient('spb_google_token');
328
329 return rest_ensure_response(array(
330 'success' => true,
331 'masked_key' => $client_email,
332 ));
333 } catch (SettingsException $s_ex) {
334 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
335 } catch (Exception $ex) {
336 LogController::HandleException($ex);
337 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
338 }
339 }
340
341 private function RemoveIntegrationKeyCallback($request)
342 {
343 try {
344 $integration = isset($request['integration']) ? sanitize_text_field($request['integration']) : '';
345
346 // Google Sheets has two option keys
347 if ($integration === 'google_sheets') {
348 FormSettings::Remove(FormSettings::OPTION_GOOGLE_SHEETS_CLIENT_EMAIL);
349 FormSettings::Remove(FormSettings::OPTION_GOOGLE_SHEETS_PRIVATE_KEY);
350 delete_transient('spb_google_token');
351 return rest_ensure_response(array('success' => true));
352 }
353
354 $option_key = self::GetIntegrationOptionKey($integration);
355 if (!$option_key) {
356 throw new SettingsException(__('Invalid integration.', "superb-blocks"));
357 }
358
359 FormSettings::Remove($option_key);
360
361 return rest_ensure_response(array('success' => true));
362 } catch (SettingsException $s_ex) {
363 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
364 } catch (Exception $ex) {
365 LogController::HandleException($ex);
366 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
367 }
368 }
369
370 public static function GetRelevantCompatibilitySettings()
371 {
372 $relevant_settings = array();
373 // Check if Spectra is active
374 if (class_exists('UAGB_Loader')) {
375 $relevant_settings[CompatibilitySettingsOptionKey::SPECTRA_BLOCK_SPACING] = true;
376 }
377
378 return $relevant_settings;
379 }
380
381 public static function IsCompatibilitySettingRelevantAndEnabled($compatibility_setting)
382 {
383 $relevant_settings = self::GetRelevantCompatibilitySettings();
384 if (!isset($relevant_settings[$compatibility_setting])) return false;
385
386 $compatibility_settings = self::GetCompatibilitySettings();
387 return $compatibility_settings[$compatibility_setting];
388 }
389
390 private function ToggleBlockCallback($request)
391 {
392 try {
393 if (!isset($request['block'])) {
394 throw new SettingsException(__('No block specified.', 'superb-blocks'));
395 }
396
397 $block_slug = sanitize_text_field($request['block']);
398
399 // Validate the block is in the toggleable list
400 if (!in_array($block_slug, GutenbergController::TOGGLEABLE_BLOCKS, true)) {
401 throw new SettingsException(__('Invalid block.', 'superb-blocks'));
402 }
403
404 $disabled = OptionController::GetDisabledBlocks();
405 $key = array_search($block_slug, $disabled, true);
406 if ($key !== false) {
407 // Currently disabled, re-enable it
408 unset($disabled[$key]);
409 $disabled = array_values($disabled);
410 } else {
411 // Currently enabled, disable it
412 $disabled[] = $block_slug;
413 }
414
415 OptionController::SaveDisabledBlocks($disabled);
416
417 return rest_ensure_response(array('success' => true));
418 } catch (SettingsException $s_ex) {
419 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
420 } catch (Exception $ex) {
421 LogController::HandleException($ex);
422 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
423 }
424 }
425
426 private function SaveFormPermissionsCallback($request)
427 {
428 try {
429 $raw = isset($request['permissions']) ? $request['permissions'] : '';
430 $permissions = is_string($raw) ? json_decode(wp_unslash($raw), true) : $raw;
431 if (!is_array($permissions)) {
432 throw new SettingsException(__('Invalid permissions data.', 'superb-blocks'));
433 }
434
435 FormPermissions::SaveAll($permissions);
436
437 // Save access control toggle
438 $access_control_enabled = isset($request['access_control_enabled']) && $request['access_control_enabled'] === '1';
439 update_option(FormAccessControl::OPTION_ENABLED, $access_control_enabled ? '1' : '', false);
440
441 return rest_ensure_response(array('success' => true));
442 } catch (SettingsException $s_ex) {
443 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
444 } catch (Exception $ex) {
445 LogController::HandleException($ex);
446 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
447 }
448 }
449
450 private function SaveDefaultEmailCallback($request)
451 {
452 try {
453 $from_name = isset($request['from_name']) ? sanitize_text_field($request['from_name']) : '';
454 $from_email = isset($request['from_email']) ? sanitize_email($request['from_email']) : '';
455
456 // Validate email if provided
457 if ($from_email !== '' && !is_email($from_email)) {
458 throw new SettingsException(__('Please enter a valid email address.', 'superb-blocks'));
459 }
460
461 update_option('superbaddons_form_default_email', array(
462 'from_name' => $from_name,
463 'from_email' => $from_email,
464 ));
465
466 return rest_ensure_response(array('success' => true));
467 } catch (SettingsException $s_ex) {
468 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
469 } catch (Exception $ex) {
470 LogController::HandleException($ex);
471 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
472 }
473 }
474
475 private function SaveDataRetentionCallback($request)
476 {
477 try {
478 $days = isset($request['days']) ? intval($request['days']) : 0;
479
480 // Validate allowed values
481 $allowed = array(0, 30, 60, 90, 180, 365);
482 if (!in_array($days, $allowed, true)) {
483 throw new SettingsException(__('Invalid retention period.', 'superb-blocks'));
484 }
485
486 update_option('superbaddons_form_data_retention', $days);
487
488 return rest_ensure_response(array('success' => true));
489 } catch (SettingsException $s_ex) {
490 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
491 } catch (Exception $ex) {
492 LogController::HandleException($ex);
493 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
494 }
495 }
496
497 private static function GetCaptchaOptionKeys($provider)
498 {
499 $map = array(
500 'hcaptcha' => array(
501 'site_key' => FormSettings::OPTION_HCAPTCHA_SITE_KEY,
502 'secret_key' => FormSettings::OPTION_HCAPTCHA_SECRET_KEY,
503 ),
504 'recaptcha' => array(
505 'site_key' => FormSettings::OPTION_RECAPTCHA_SITE_KEY,
506 'secret_key' => FormSettings::OPTION_RECAPTCHA_SECRET_KEY,
507 ),
508 'turnstile' => array(
509 'site_key' => FormSettings::OPTION_TURNSTILE_SITE_KEY,
510 'secret_key' => FormSettings::OPTION_TURNSTILE_SECRET_KEY,
511 ),
512 );
513 return isset($map[$provider]) ? $map[$provider] : false;
514 }
515
516 private function SaveCaptchaKeyCallback($request)
517 {
518 try {
519 $provider = isset($request['provider']) ? sanitize_text_field($request['provider']) : '';
520 $site_key = isset($request['site_key']) ? sanitize_text_field($request['site_key']) : '';
521 $secret_key = isset($request['secret_key']) ? sanitize_text_field($request['secret_key']) : '';
522
523 $keys = self::GetCaptchaOptionKeys($provider);
524 if (!$keys) {
525 throw new SettingsException(__('Invalid CAPTCHA provider.', 'superb-blocks'));
526 }
527 if (empty($site_key) || empty($secret_key)) {
528 throw new SettingsException(__('Both site key and secret key are required.', 'superb-blocks'));
529 }
530
531 FormSettings::Set($keys['site_key'], $site_key);
532 FormSettings::Set($keys['secret_key'], $secret_key);
533
534 return rest_ensure_response(array(
535 'success' => true,
536 'masked_secret' => FormSettings::GetMasked($keys['secret_key']),
537 ));
538 } catch (SettingsException $s_ex) {
539 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
540 } catch (Exception $ex) {
541 LogController::HandleException($ex);
542 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
543 }
544 }
545
546 private function RemoveCaptchaKeyCallback($request)
547 {
548 try {
549 $provider = isset($request['provider']) ? sanitize_text_field($request['provider']) : '';
550 $keys = self::GetCaptchaOptionKeys($provider);
551 if (!$keys) {
552 throw new SettingsException(__('Invalid CAPTCHA provider.', 'superb-blocks'));
553 }
554
555 FormSettings::Remove($keys['site_key']);
556 FormSettings::Remove($keys['secret_key']);
557
558 return rest_ensure_response(array('success' => true));
559 } catch (SettingsException $s_ex) {
560 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
561 } catch (Exception $ex) {
562 LogController::HandleException($ex);
563 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
564 }
565 }
566
567 private function GetIntegrationUsageCallback($request)
568 {
569 try {
570 return rest_ensure_response(array(
571 'success' => true,
572 'mailchimp' => FormSettings::CountFormsUsingIntegration('mailchimp'),
573 'brevo' => FormSettings::CountFormsUsingIntegration('brevo'),
574 'hcaptcha' => FormSettings::CountFormsUsingCaptchaProvider('hcaptcha'),
575 'recaptcha' => FormSettings::CountFormsUsingCaptchaProvider('recaptcha'),
576 'turnstile' => FormSettings::CountFormsUsingCaptchaProvider('turnstile'),
577 ));
578 } catch (Exception $ex) {
579 LogController::HandleException($ex);
580 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
581 }
582 }
583
584 private function RemoveAllDataCallback($request)
585 {
586 try {
587 $include_submissions = isset($request['include_submissions']) && $request['include_submissions'] === '1';
588 PluginResetController::RemoveAllPluginData($include_submissions);
589 return rest_ensure_response(array('success' => true));
590 } catch (SettingsException $s_ex) {
591 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
592 } catch (Exception $ex) {
593 LogController::HandleException($ex);
594 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
595 }
596 }
597 }
598