events(); } public function events() { add_action( 'wp_ajax_acb_data_truncate', array( $this, 'ACB_message_truncate' ) ); add_action("wp_ajax_nopriv_acb_data_truncate", array( $this, 'ACB_message_truncate')); /* Demo check Creation */ add_action( 'wp_ajax_show_user_inputed_data', array( $this, 'ACB_message_creation' ) ); add_action("wp_ajax_nopriv_show_user_inputed_data", array( $this, 'ACB_message_creation')); /* Firebase Configuration */ add_action( 'wp_ajax_acb_save_firebase_config', array( $this, 'save_firebase_config' ) ); add_action( 'wp_ajax_acb_test_firebase_connection', array( $this, 'test_firebase_connection' ) ); add_action( 'wp_ajax_acb_firebase_auth', array( $this, 'firebase_auth' ) ); } /**Chat data truncate */ public function ACB_message_truncate() { // Verify nonce for security if (!wp_verify_nonce($_POST['nonce'] ?? '', 'acb_message_nonce')) { wp_send_json_error('Security check failed'); } $ACB_message_truncate = new ACB_MessageCreation(); $ACB_message_truncate->ACB_message_truncate(); } /**Chat data fetch */ public function ACB_message_creation() { // Verify nonce for security if (!wp_verify_nonce($_POST['nonce'] ?? '', 'acb_message_nonce')) { wp_send_json_error('Security check failed'); } $ACB_message_creation = new ACB_MessageCreation(); $ACB_message_creation->ACB_message_creation(); } /** * Save Firebase configuration - Only for administrators */ public function save_firebase_config() { // Verify nonce if (!wp_verify_nonce($_POST['nonce'] ?? '', 'acb_firebase_nonce')) { wp_send_json_error('Security check failed'); } // Check user permissions - Only administrators can save Firebase config if (!current_user_can('manage_options')) { wp_send_json_error('Insufficient permissions - Only administrators can save Firebase configuration'); } // Validate POST data exists if (!isset($_POST['config']) || empty($_POST['config'])) { wp_send_json_error('Configuration data is required'); } // Sanitize and unslash the config data $config = wp_unslash($_POST['config']); $config = sanitize_textarea_field($config); $config_array = json_decode($config, true); // Check for JSON decode errors if (json_last_error() !== JSON_ERROR_NONE) { $error_msg = 'Invalid configuration format: ' . json_last_error_msg(); wp_send_json_error($error_msg); } if (!is_array($config_array)) { wp_send_json_error('Configuration must be a valid JSON object'); } // Validate required fields $required_fields = ['apiKey', 'authDomain', 'projectId', 'storageBucket', 'messagingSenderId', 'appId']; foreach ($required_fields as $field) { if (!isset($config_array[$field]) || empty(trim($config_array[$field]))) { $error_msg = "Missing or empty required field: $field"; wp_send_json_error($error_msg); } } // Sanitize individual fields $sanitized_config = array(); foreach ($config_array as $key => $value) { $sanitized_config[$key] = sanitize_text_field( wp_unslash($value)); } // Validate sanitized config still has required fields foreach ($required_fields as $field) { if (!isset($sanitized_config[$field]) || empty($sanitized_config[$field])) { wp_send_json_error("Invalid data for required field: $field"); } } // Check if the option already exists and has the same value $existing_config = get_option('acb_firebase_config', []); // Save to WordPress options $saved = update_option('acb_firebase_config', $sanitized_config); // Verify the option was actually saved $saved_config = get_option('acb_firebase_config', []); if ($saved || $saved_config == $sanitized_config) { wp_send_json_success('Firebase configuration saved successfully'); } else { wp_send_json_error('Failed to save configuration - WordPress option update failed'); } } /** * Test Firebase connection - Only for administrators */ public function test_firebase_connection() { // Verify nonce if (!wp_verify_nonce($_POST['nonce'] ?? '', 'acb_firebase_nonce')) { wp_send_json_error('Security check failed'); } // Check user permissions - Only administrators can test Firebase connection if (!current_user_can('manage_options')) { wp_send_json_error('Insufficient permissions - Only administrators can test Firebase connection'); } // Validate POST data exists if (!isset($_POST['config']) || empty($_POST['config'])) { wp_send_json_error('Configuration data is required'); } // Sanitize and unslash the config data $config = wp_unslash($_POST['config']); $config = sanitize_textarea_field($config); $config_array = json_decode($config, true); // Check for JSON decode errors if (json_last_error() !== JSON_ERROR_NONE) { wp_send_json_error('Invalid configuration format: ' . json_last_error_msg()); } if (!is_array($config_array)) { wp_send_json_error('Configuration must be a valid JSON object'); } // Validate required fields exist if (!isset($config_array['apiKey']) || !isset($config_array['projectId'])) { wp_send_json_error('Missing required configuration fields (apiKey, projectId)'); } try { // Sanitize the API key and project ID $api_key = sanitize_text_field($config_array['apiKey']); $project_id = sanitize_text_field($config_array['projectId']); if (empty($api_key) || empty($project_id)) { wp_send_json_error('Invalid API key or project ID'); } // Test Firebase Auth API $test_url = "https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=" . urlencode($api_key); $response = wp_remote_post($test_url, [ 'body' => wp_json_encode([ 'email' => 'test@example.com', 'password' => 'testpassword123', 'returnSecureToken' => true ]), 'headers' => [ 'Content-Type' => 'application/json' ], 'timeout' => 10, 'sslverify' => true ]); if (is_wp_error($response)) { wp_send_json_error('Connection failed: ' . esc_html($response->get_error_message())); } $response_code = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); $data = json_decode($body, true); // Check if we got a valid response if ($response_code >= 200 && $response_code < 500) { wp_send_json_success('Firebase connection successful! Configuration is valid.'); } else { wp_send_json_error('Firebase connection failed. Response code: ' . absint($response_code)); } } catch (Exception $e) { wp_send_json_error('Connection test failed: ' . esc_html($e->getMessage())); } } /** * Handle Firebase user authentication - Available to all logged-in users */ public function firebase_auth() { // Verify nonce if (!wp_verify_nonce($_POST['nonce'] ?? '', 'acb_firebase_nonce')) { wp_send_json_error('Security check failed'); } // Check user permissions - Any logged-in user can authenticate if (!is_user_logged_in()) { wp_send_json_error('User must be logged in'); } // Validate required POST data $required_fields = ['firebase_uid', 'user_email']; foreach ($required_fields as $field) { if (!isset($_POST[$field]) || empty(trim($_POST[$field]))) { wp_send_json_error("Missing required field: $field"); } } // Sanitize input data $firebase_uid = sanitize_text_field(wp_unslash($_POST['firebase_uid'])); $user_name = isset($_POST['user_name']) ? sanitize_text_field(wp_unslash($_POST['user_name'])) : ''; $user_email = sanitize_email(wp_unslash($_POST['user_email'])); $user_avatar = isset($_POST['user_avatar']) ? esc_url_raw(wp_unslash($_POST['user_avatar'])) : ''; $auth_provider = isset($_POST['auth_provider']) ? sanitize_text_field(wp_unslash($_POST['auth_provider'])) : 'firebase'; // Validate email format if (!is_email($user_email)) { wp_send_json_error('Invalid email format'); } // Validate firebase_uid is not empty after sanitization if (empty($firebase_uid)) { wp_send_json_error('Invalid Firebase UID'); } try { // Check if user exists in WordPress $wp_user = get_user_by('email', $user_email); if (!$wp_user) { // Create new WordPress user $username = !empty($user_name) ? sanitize_user($user_name) : sanitize_user($user_email); $counter = 1; $original_username = $username; // Ensure unique username while (username_exists($username)) { $username = $original_username . '_' . $counter; $counter++; } // Generate secure password $password = wp_generate_password(12, false); $user_id = wp_create_user($username, $password, $user_email); if (is_wp_error($user_id)) { wp_send_json_error('Failed to create WordPress user: ' . esc_html($user_id->get_error_message())); } // Set display name $display_name = !empty($user_name) ? $user_name : $username; wp_update_user([ 'ID' => $user_id, 'display_name' => $display_name, 'first_name' => $display_name ]); // Add user meta update_user_meta($user_id, 'firebase_uid', $firebase_uid); if (!empty($user_avatar)) { update_user_meta($user_id, 'firebase_avatar', $user_avatar); } update_user_meta($user_id, 'auth_provider', $auth_provider); } else { // Update existing user $user_id = $wp_user->ID; update_user_meta($user_id, 'firebase_uid', $firebase_uid); if (!empty($user_avatar)) { update_user_meta($user_id, 'firebase_avatar', $user_avatar); } update_user_meta($user_id, 'auth_provider', $auth_provider); // Update display name if provided and different if (!empty($user_name) && $wp_user->display_name !== $user_name) { wp_update_user([ 'ID' => $user_id, 'display_name' => $user_name ]); } } // Log in the user wp_set_current_user($user_id); wp_set_auth_cookie($user_id); wp_send_json_success([ 'user_id' => absint($user_id), 'message' => 'Authentication successful' ]); } catch (Exception $e) { wp_send_json_error('Authentication failed: ' . esc_html($e->getMessage())); } } }