PluginProbe ʕ •ᴥ•ʔ
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More / 4.0.6
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More v4.0.6
4.0.8 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 3 weeks ago class-dashboard-controller.php 3 weeks ago class-license-resolve-controller.php 3 weeks ago class-newsletter-signup-controller.php 3 weeks ago class-notice-controller.php 3 weeks ago class-plugin-reset-controller.php 3 weeks ago class-review-controller.php 3 weeks ago class-rewrite-check-controller.php 3 weeks ago class-settings-controller.php 3 weeks ago class-troubleshooting-controller.php 3 weeks ago
class-settings-controller.php
596 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(wp_unslash($request['spbaddons_other']));
118 } else {
119 $message = sanitize_text_field(wp_unslash($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 $integration = isset($request['integration']) ? sanitize_text_field(wp_unslash($request['integration'])) : '';
246 $api_key = isset($request['api_key']) ? wp_unslash($request['api_key']) : '';
247
248 // Google Sheets uses a JSON Service Account key
249 if ($integration === 'google_sheets') {
250 return $this->SaveGoogleSheetsKeyCallback($api_key);
251 }
252
253 $api_key = sanitize_text_field($api_key);
254 $option_key = self::GetIntegrationOptionKey($integration);
255 if (!$option_key) {
256 throw new SettingsException(__('Invalid integration.', "superb-blocks"));
257 }
258 if (empty($api_key)) {
259 throw new SettingsException(__('API key cannot be empty.', "superb-blocks"));
260 }
261
262 // Save the key so the integration handler can use it for validation.
263 FormSettings::Set($option_key, $api_key);
264
265 // Validate the key by attempting to fetch lists from the service.
266 if ($integration === 'mailchimp') {
267 $result = FormIntegrationHandler::GetMailchimpLists();
268 } else {
269 $result = FormIntegrationHandler::GetBrevoLists();
270 }
271
272 if (is_wp_error($result)) {
273 // Validation failed — remove the key and return the error.
274 FormSettings::Remove($option_key);
275 throw new SettingsException($result->get_error_message());
276 }
277
278 return rest_ensure_response(array(
279 'success' => true,
280 'masked_key' => FormSettings::GetMasked($option_key),
281 ));
282 } catch (SettingsException $s_ex) {
283 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
284 } catch (Exception $ex) {
285 LogController::HandleException($ex);
286 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
287 }
288 }
289
290 private function SaveGoogleSheetsKeyCallback($json_string)
291 {
292 try {
293 if (empty($json_string)) {
294 throw new SettingsException(__('Service Account JSON key cannot be empty.', 'superb-blocks'));
295 }
296
297 $json = json_decode($json_string, true);
298 if (!is_array($json)) {
299 throw new SettingsException(__('Invalid JSON format. Please paste the entire contents of your Service Account JSON key.', 'superb-blocks'));
300 }
301
302 $client_email = isset($json['client_email']) ? sanitize_email($json['client_email']) : '';
303 $private_key = isset($json['private_key']) ? $json['private_key'] : '';
304
305 if (empty($client_email) || empty($private_key)) {
306 throw new SettingsException(__('The JSON key must contain "client_email" and "private_key" fields.', 'superb-blocks'));
307 }
308
309 // Validate email format
310 if (!is_email($client_email)) {
311 throw new SettingsException(__('Invalid client_email in the Service Account key.', 'superb-blocks'));
312 }
313
314 // Validate the private key is a usable PEM key now, so a truncated/corrupt paste fails
315 // here with a clear message instead of later as "Failed to sign JWT" on submission.
316 if (function_exists('openssl_pkey_get_private') && openssl_pkey_get_private($private_key) === false) {
317 throw new SettingsException(__('The private_key in the Service Account JSON is not a valid key. Paste the entire JSON file.', 'superb-blocks'));
318 }
319
320 // Store the extracted values
321 FormSettings::Set(FormSettings::OPTION_GOOGLE_SHEETS_CLIENT_EMAIL, $client_email);
322 FormSettings::Set(FormSettings::OPTION_GOOGLE_SHEETS_PRIVATE_KEY, $private_key);
323
324 // New credentials invalidate any access token cached from the previous key.
325 delete_transient('spb_google_token');
326
327 return rest_ensure_response(array(
328 'success' => true,
329 'masked_key' => $client_email,
330 ));
331 } catch (SettingsException $s_ex) {
332 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
333 } catch (Exception $ex) {
334 LogController::HandleException($ex);
335 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
336 }
337 }
338
339 private function RemoveIntegrationKeyCallback($request)
340 {
341 try {
342 $integration = isset($request['integration']) ? sanitize_text_field(wp_unslash($request['integration'])) : '';
343
344 // Google Sheets has two option keys
345 if ($integration === 'google_sheets') {
346 FormSettings::Remove(FormSettings::OPTION_GOOGLE_SHEETS_CLIENT_EMAIL);
347 FormSettings::Remove(FormSettings::OPTION_GOOGLE_SHEETS_PRIVATE_KEY);
348 delete_transient('spb_google_token');
349 return rest_ensure_response(array('success' => true));
350 }
351
352 $option_key = self::GetIntegrationOptionKey($integration);
353 if (!$option_key) {
354 throw new SettingsException(__('Invalid integration.', "superb-blocks"));
355 }
356
357 FormSettings::Remove($option_key);
358
359 return rest_ensure_response(array('success' => true));
360 } catch (SettingsException $s_ex) {
361 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
362 } catch (Exception $ex) {
363 LogController::HandleException($ex);
364 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
365 }
366 }
367
368 public static function GetRelevantCompatibilitySettings()
369 {
370 $relevant_settings = array();
371 // Check if Spectra is active
372 if (class_exists('UAGB_Loader')) {
373 $relevant_settings[CompatibilitySettingsOptionKey::SPECTRA_BLOCK_SPACING] = true;
374 }
375
376 return $relevant_settings;
377 }
378
379 public static function IsCompatibilitySettingRelevantAndEnabled($compatibility_setting)
380 {
381 $relevant_settings = self::GetRelevantCompatibilitySettings();
382 if (!isset($relevant_settings[$compatibility_setting])) return false;
383
384 $compatibility_settings = self::GetCompatibilitySettings();
385 return $compatibility_settings[$compatibility_setting];
386 }
387
388 private function ToggleBlockCallback($request)
389 {
390 try {
391 if (!isset($request['block'])) {
392 throw new SettingsException(__('No block specified.', 'superb-blocks'));
393 }
394
395 $block_slug = sanitize_text_field($request['block']);
396
397 // Validate the block is in the toggleable list
398 if (!in_array($block_slug, GutenbergController::TOGGLEABLE_BLOCKS, true)) {
399 throw new SettingsException(__('Invalid block.', 'superb-blocks'));
400 }
401
402 $disabled = OptionController::GetDisabledBlocks();
403 $key = array_search($block_slug, $disabled, true);
404 if ($key !== false) {
405 // Currently disabled, re-enable it
406 unset($disabled[$key]);
407 $disabled = array_values($disabled);
408 } else {
409 // Currently enabled, disable it
410 $disabled[] = $block_slug;
411 }
412
413 OptionController::SaveDisabledBlocks($disabled);
414
415 return rest_ensure_response(array('success' => true));
416 } catch (SettingsException $s_ex) {
417 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
418 } catch (Exception $ex) {
419 LogController::HandleException($ex);
420 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
421 }
422 }
423
424 private function SaveFormPermissionsCallback($request)
425 {
426 try {
427 $raw = isset($request['permissions']) ? $request['permissions'] : '';
428 $permissions = is_string($raw) ? json_decode(wp_unslash($raw), true) : $raw;
429 if (!is_array($permissions)) {
430 throw new SettingsException(__('Invalid permissions data.', 'superb-blocks'));
431 }
432
433 FormPermissions::SaveAll($permissions);
434
435 // Save access control toggle
436 $access_control_enabled = isset($request['access_control_enabled']) && $request['access_control_enabled'] === '1';
437 update_option(FormAccessControl::OPTION_ENABLED, $access_control_enabled ? '1' : '', false);
438
439 return rest_ensure_response(array('success' => true));
440 } catch (SettingsException $s_ex) {
441 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
442 } catch (Exception $ex) {
443 LogController::HandleException($ex);
444 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
445 }
446 }
447
448 private function SaveDefaultEmailCallback($request)
449 {
450 try {
451 $from_name = isset($request['from_name']) ? sanitize_text_field(wp_unslash($request['from_name'])) : '';
452 $from_email = isset($request['from_email']) ? sanitize_email(wp_unslash($request['from_email'])) : '';
453
454 // Validate email if provided
455 if ($from_email !== '' && !is_email($from_email)) {
456 throw new SettingsException(__('Please enter a valid email address.', 'superb-blocks'));
457 }
458
459 update_option('superbaddons_form_default_email', array(
460 'from_name' => $from_name,
461 'from_email' => $from_email,
462 ));
463
464 return rest_ensure_response(array('success' => true));
465 } catch (SettingsException $s_ex) {
466 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
467 } catch (Exception $ex) {
468 LogController::HandleException($ex);
469 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
470 }
471 }
472
473 private function SaveDataRetentionCallback($request)
474 {
475 try {
476 $days = isset($request['days']) ? intval($request['days']) : 0;
477
478 // Validate allowed values
479 $allowed = array(0, 30, 60, 90, 180, 365);
480 if (!in_array($days, $allowed, true)) {
481 throw new SettingsException(__('Invalid retention period.', 'superb-blocks'));
482 }
483
484 update_option('superbaddons_form_data_retention', $days);
485
486 return rest_ensure_response(array('success' => true));
487 } catch (SettingsException $s_ex) {
488 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
489 } catch (Exception $ex) {
490 LogController::HandleException($ex);
491 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
492 }
493 }
494
495 private static function GetCaptchaOptionKeys($provider)
496 {
497 $map = array(
498 'hcaptcha' => array(
499 'site_key' => FormSettings::OPTION_HCAPTCHA_SITE_KEY,
500 'secret_key' => FormSettings::OPTION_HCAPTCHA_SECRET_KEY,
501 ),
502 'recaptcha' => array(
503 'site_key' => FormSettings::OPTION_RECAPTCHA_SITE_KEY,
504 'secret_key' => FormSettings::OPTION_RECAPTCHA_SECRET_KEY,
505 ),
506 'turnstile' => array(
507 'site_key' => FormSettings::OPTION_TURNSTILE_SITE_KEY,
508 'secret_key' => FormSettings::OPTION_TURNSTILE_SECRET_KEY,
509 ),
510 );
511 return isset($map[$provider]) ? $map[$provider] : false;
512 }
513
514 private function SaveCaptchaKeyCallback($request)
515 {
516 try {
517 $provider = isset($request['provider']) ? sanitize_text_field(wp_unslash($request['provider'])) : '';
518 $site_key = isset($request['site_key']) ? sanitize_text_field(wp_unslash($request['site_key'])) : '';
519 $secret_key = isset($request['secret_key']) ? sanitize_text_field(wp_unslash($request['secret_key'])) : '';
520
521 $keys = self::GetCaptchaOptionKeys($provider);
522 if (!$keys) {
523 throw new SettingsException(__('Invalid CAPTCHA provider.', 'superb-blocks'));
524 }
525 if (empty($site_key) || empty($secret_key)) {
526 throw new SettingsException(__('Both site key and secret key are required.', 'superb-blocks'));
527 }
528
529 FormSettings::Set($keys['site_key'], $site_key);
530 FormSettings::Set($keys['secret_key'], $secret_key);
531
532 return rest_ensure_response(array(
533 'success' => true,
534 'masked_secret' => FormSettings::GetMasked($keys['secret_key']),
535 ));
536 } catch (SettingsException $s_ex) {
537 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
538 } catch (Exception $ex) {
539 LogController::HandleException($ex);
540 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
541 }
542 }
543
544 private function RemoveCaptchaKeyCallback($request)
545 {
546 try {
547 $provider = isset($request['provider']) ? sanitize_text_field(wp_unslash($request['provider'])) : '';
548 $keys = self::GetCaptchaOptionKeys($provider);
549 if (!$keys) {
550 throw new SettingsException(__('Invalid CAPTCHA provider.', 'superb-blocks'));
551 }
552
553 FormSettings::Remove($keys['site_key']);
554 FormSettings::Remove($keys['secret_key']);
555
556 return rest_ensure_response(array('success' => true));
557 } catch (SettingsException $s_ex) {
558 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
559 } catch (Exception $ex) {
560 LogController::HandleException($ex);
561 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
562 }
563 }
564
565 private function GetIntegrationUsageCallback($request)
566 {
567 try {
568 return rest_ensure_response(array(
569 'success' => true,
570 'mailchimp' => FormSettings::CountFormsUsingIntegration('mailchimp'),
571 'brevo' => FormSettings::CountFormsUsingIntegration('brevo'),
572 'hcaptcha' => FormSettings::CountFormsUsingCaptchaProvider('hcaptcha'),
573 'recaptcha' => FormSettings::CountFormsUsingCaptchaProvider('recaptcha'),
574 'turnstile' => FormSettings::CountFormsUsingCaptchaProvider('turnstile'),
575 ));
576 } catch (Exception $ex) {
577 LogController::HandleException($ex);
578 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
579 }
580 }
581
582 private function RemoveAllDataCallback($request)
583 {
584 try {
585 $include_submissions = isset($request['include_submissions']) && $request['include_submissions'] === '1';
586 PluginResetController::RemoveAllPluginData($include_submissions);
587 return rest_ensure_response(array('success' => true));
588 } catch (SettingsException $s_ex) {
589 return rest_ensure_response(array('success' => false, 'text' => esc_html($s_ex->getMessage())));
590 } catch (Exception $ex) {
591 LogController::HandleException($ex);
592 return new \WP_Error('internal_error_plugin', 'Internal Plugin Error', array('status' => 500));
593 }
594 }
595 }
596