← All changes
|
includes/widgets/Form_Builder/helpers/Send_Webhook.php
+96
-0
51.1.2
→
51.1.86
View file →
| @@ -1,0 +1,96 @@ | ||
| 1 | +<?php | |
| 2 | + | |
| 3 | +namespace King_Addons; | |
| 4 | + | |
| 5 | +if (!defined('ABSPATH')) { | |
| 6 | + exit; | |
| 7 | +} | |
| 8 | + | |
| 9 | +class Send_Webhook | |
| 10 | +{ | |
| 11 | + | |
| 12 | + public function __construct() | |
| 13 | + { | |
| 14 | + add_action('wp_ajax_king_addons_form_builder_webhook', [$this, 'send_webhook']); | |
| 15 | + add_action('wp_ajax_nopriv_king_addons_form_builder_webhook', [$this, 'send_webhook']); | |
| 16 | + } | |
| 17 | + | |
| 18 | + public function send_webhook() | |
| 19 | + { | |
| 20 | + $nonce = $_POST['nonce']; | |
| 21 | + | |
| 22 | + // Security fix: Generate nonce server-side instead of relying on client-provided nonce | |
| 23 | + $server_nonce = wp_create_nonce('king-addons-js'); | |
| 24 | + if (!wp_verify_nonce($nonce, 'king-addons-js')) { | |
| 25 | + return; | |
| 26 | + } | |
| 27 | + | |
| 28 | + Form_Builder_Security::guard_spam(); | |
| 29 | + | |
| 30 | + $webhook_option_key = 'king_addons_webhook_url_' . $_POST['king_addons_form_id']; | |
| 31 | + $webhook_url_raw = get_option($webhook_option_key); | |
| 32 | + $webhook_url = $webhook_url_raw ? esc_url_raw(trim($webhook_url_raw)) : ''; | |
| 33 | + | |
| 34 | + if (!$webhook_url || !wp_http_validate_url($webhook_url)) { | |
| 35 | + wp_send_json_error([ | |
| 36 | + 'action' => 'king_addons_form_builder_webhook', | |
| 37 | + 'message' => esc_html__('Invalid webhook URL.', 'king-addons'), | |
| 38 | + 'status' => 'error', | |
| 39 | + ]); | |
| 40 | + } | |
| 41 | + | |
| 42 | + $parsed = parse_url($webhook_url); | |
| 43 | + if (empty($parsed['scheme']) || !in_array($parsed['scheme'], ['http', 'https'], true)) { | |
| 44 | + wp_send_json_error([ | |
| 45 | + 'action' => 'king_addons_form_builder_webhook', | |
| 46 | + 'message' => esc_html__('Webhook URL must use http or https.', 'king-addons'), | |
| 47 | + 'status' => 'error', | |
| 48 | + ]); | |
| 49 | + } | |
| 50 | + | |
| 51 | + $message_body = []; | |
| 52 | + | |
| 53 | + foreach ($_POST['form_content'] as $key => $value) { | |
| 54 | + if (is_array($value[1])) { | |
| 55 | + if (empty($value[2])) { | |
| 56 | + $message_body[trim($key)] = implode("\n", $value[1]); | |
| 57 | + } else { | |
| 58 | + $message_body[trim($value[2])] = implode("\n", $value[1]); | |
| 59 | + } | |
| 60 | + } else { | |
| 61 | + if (empty($value[2])) { | |
| 62 | + $message_body[trim($key)] = $value[1]; | |
| 63 | + } else { | |
| 64 | + $message_body[trim($value[2])] = $value[1]; | |
| 65 | + } | |
| 66 | + } | |
| 67 | + } | |
| 68 | + | |
| 69 | + $message_body['form_id'] = $_POST['king_addons_form_id']; | |
| 70 | + $message_body['form_name'] = $_POST['form_name']; | |
| 71 | + | |
| 72 | + $args = [ | |
| 73 | + 'body' => $message_body, | |
| 74 | + ]; | |
| 75 | + | |
| 76 | + $response = wp_remote_post(trim(get_option('king_addons_webhook_url_' . $_POST['king_addons_form_id'])), $args); | |
| 77 | + | |
| 78 | + if (200 !== (int)wp_remote_retrieve_response_code($response)) { | |
| 79 | + wp_send_json_error(array( | |
| 80 | + 'action' => 'king_addons_form_builder_webhook', | |
| 81 | + 'message' => esc_html__('Webhook error', 'king-addons'), | |
| 82 | + 'status' => 'error', | |
| 83 | + 'details' => json_encode($message_body) | |
| 84 | + )); | |
| 85 | + } else { | |
| 86 | + wp_send_json_success(array( | |
| 87 | + 'action' => 'king_addons_form_builder_webhook', | |
| 88 | + 'message' => esc_html__('Webhook success', 'king-addons'), | |
| 89 | + 'status' => 'success', | |
| 90 | + 'details' => json_encode($message_body) | |
| 91 | + )); | |
| 92 | + } | |
| 93 | + } | |
| 94 | +} | |
| 95 | + | |
| 96 | +new Send_Webhook(); | |