!empty($result['success']), 'ok' => !empty($result['ok']) || !empty($result['success']), 'code' => sanitize_key((string) ($result['code'] ?? ($result['message'] ?? 'unknown'))), 'message' => sanitize_text_field((string) ($result['message'] ?? '')), 'status' => sanitize_key((string) ($result['status'] ?? '')), 'agency_id' => sanitize_key((string) ($result['agency_id'] ?? '')), 'agency_name' => sanitize_text_field((string) ($result['agency_name'] ?? '')), 'own_site_access' => !empty($result['own_site_access']), 'agency_hub' => !empty($result['agency_hub']), 'client_seats' => $client_seats, 'seat_source' => sanitize_key((string) ($result['seat_source'] ?? 'none')), 'access_start' => sanitize_text_field((string) ($result['access_start'] ?? '')), 'access_expiry' => sanitize_text_field((string) ($result['access_expiry'] ?? '')), 'revoked' => !empty($result['revoked']), 'checked_at' => time(), 'endpoint' => matewa_agency_registry_get_endpoint(), 'site_url' => matewa_agency_registry_get_site_url(), 'domain' => matewa_agency_registry_get_domain(), 'install_uuid' => matewa_agency_registry_get_install_uuid(), 'masked_key' => '' !== $access_code ? matewa_agency_registry_mask_key($access_code) : '', 'activation_code_hash' => '' !== $access_code ? hash('sha256', $access_code . '|' . home_url('/')) : sanitize_text_field((string) ($result['activation_code_hash'] ?? '')), 'configured' => matewa_agency_registry_is_configured(), 'privacy_note' => 'No IP address, visitor data, lead content, raw admin email, or raw agency key is stored by the plugin-side agency registry client.', ); } } if (!function_exists('matewa_agency_registry_store_last_result')) { function matewa_agency_registry_store_last_result($result, $access_code = '') { $safe = matewa_agency_registry_sanitise_result($result, $access_code); update_option(MATEWA_AGENCY_REGISTRY_LAST_RESULT_OPTION, $safe, false); if (!empty($safe['success'])) { delete_option(MATEWA_AGENCY_REGISTRY_LAST_ERROR_OPTION); } else { update_option(MATEWA_AGENCY_REGISTRY_LAST_ERROR_OPTION, $safe, false); } return $safe; } } if (!function_exists('matewa_agency_registry_get_last_result')) { function matewa_agency_registry_get_last_result() { $stored = get_option(MATEWA_AGENCY_REGISTRY_LAST_RESULT_OPTION, array()); return is_array($stored) ? $stored : array(); } } if (!function_exists('matewa_agency_registry_get_last_error')) { function matewa_agency_registry_get_last_error() { $stored = get_option(MATEWA_AGENCY_REGISTRY_LAST_ERROR_OPTION, array()); return is_array($stored) ? $stored : array(); } } if (!function_exists('matewa_agency_registry_error')) { function matewa_agency_registry_error($code, $message, $access_code = '') { return matewa_agency_registry_store_last_result( array( 'success' => false, 'ok' => false, 'code' => sanitize_key((string) $code), 'message' => sanitize_text_field((string) $message), 'status' => 'unavailable', ), $access_code ); } } if (!function_exists('matewa_agency_registry_build_payload')) { function matewa_agency_registry_build_payload($access_code = '') { $access_code = matewa_agency_registry_sanitise_access_code($access_code); if ('' === $access_code) { $access_code = matewa_agency_registry_get_saved_access_code(); } return array( 'plugin' => '247chatmate', 'plugin_version'=> defined('MATEWA_VERSION') ? (string) MATEWA_VERSION : '', 'site_url' => matewa_agency_registry_get_site_url(), 'domain' => matewa_agency_registry_get_domain(), 'whatsapp' => matewa_agency_registry_normalise_whatsapp(get_option('matewa_number', '')), 'install_uuid' => matewa_agency_registry_get_install_uuid(), 'email_hash' => matewa_agency_registry_get_admin_email_hash(), 'agency_key' => $access_code, 'request_type' => 'agency_own_site_access', ); } } if (!function_exists('matewa_agency_registry_validate_access')) { function matewa_agency_registry_validate_access($access_code = '') { if (!matewa_agency_registry_is_configured()) { return matewa_agency_registry_error( 'agency_registry_not_configured', 'Agency access registry is not configured. Admin remains usable; try again after the endpoint is configured.', $access_code ); } $access_code = matewa_agency_registry_sanitise_access_code($access_code); if ('' === $access_code) { $access_code = matewa_agency_registry_get_saved_access_code(); } if (!matewa_agency_registry_is_access_code($access_code)) { return matewa_agency_registry_error( 'missing_agency_key', 'Enter a valid agency own-site access key before refreshing agency access.', $access_code ); } $payload = matewa_agency_registry_build_payload($access_code); if (empty($payload['site_url']) || empty($payload['domain']) || empty($payload['install_uuid'])) { return matewa_agency_registry_error( 'missing_required_fields', 'This site could not be identified clearly enough to validate agency access.', $access_code ); } $body = wp_json_encode($payload, JSON_UNESCAPED_SLASHES); if (!is_string($body) || '' === $body) { return matewa_agency_registry_error( 'invalid_payload', 'Agency access validation payload could not be created.', $access_code ); } $endpoint = matewa_agency_registry_get_endpoint(); $attempts = array(); $attempts['json_post'] = wp_remote_post( $endpoint, array( 'timeout' => MATEWA_AGENCY_REGISTRY_TIMEOUT, 'headers' => array( 'Accept' => 'application/json', 'Content-Type' => 'application/json; charset=utf-8', ), 'body' => $body, ) ); $attempts['form_post'] = wp_remote_post( $endpoint, array( 'timeout' => MATEWA_AGENCY_REGISTRY_TIMEOUT, 'headers' => array( 'Accept' => 'application/json', ), 'body' => $payload, ) ); $attempts['query_get'] = wp_remote_get( add_query_arg($payload, $endpoint), array( 'timeout' => MATEWA_AGENCY_REGISTRY_TIMEOUT, 'headers' => array( 'Accept' => 'application/json', ), ) ); $last_method = ''; $last_status = 0; $last_excerpt = ''; $last_error_message = ''; $data = null; foreach ($attempts as $method => $attempt_response) { $last_method = $method; if (is_wp_error($attempt_response)) { $last_error_message = $attempt_response->get_error_message(); continue; } $last_status = (int) wp_remote_retrieve_response_code($attempt_response); $response_body = (string) wp_remote_retrieve_body($attempt_response); $last_excerpt = sanitize_text_field(substr(wp_strip_all_tags($response_body), 0, 220)); $decoded = json_decode($response_body, true); if ($last_status >= 200 && $last_status < 300 && is_array($decoded)) { $data = $decoded; break; } } if (!is_array($data)) { if ('' !== $last_error_message && 0 === $last_status) { return matewa_agency_registry_error( 'agency_registry_unavailable', 'Agency access registry could not be reached. Admin remains usable; try again later. ' . $last_error_message, $access_code ); } return matewa_agency_registry_store_last_result( array( 'success' => false, 'ok' => false, 'code' => 'invalid_agency_registry_response', 'message' => 'Agency access registry returned an invalid response. HTTP ' . $last_status . ' via ' . $last_method . '. Admin remains usable; try again later.', 'status' => 'unavailable', 'http_status' => $last_status, 'response_method' => sanitize_key($last_method), 'response_excerpt' => $last_excerpt, ), $access_code ); } $data['success'] = !empty($data['success']) || !empty($data['ok']); $data['ok'] = !empty($data['ok']) || !empty($data['success']); $data['code'] = sanitize_key((string) ($data['code'] ?? ($data['message'] ?? 'unknown'))); $data['message'] = sanitize_text_field((string) ($data['message'] ?? '')); $data['status'] = sanitize_key((string) ($data['status'] ?? '')); return matewa_agency_registry_store_last_result($data, $access_code); } } if (!function_exists('matewa_clear_agency_registry_validation_state')) { function matewa_clear_agency_registry_validation_state($old_access_code = '', $new_access_code = '') { $old_access_code = matewa_agency_registry_sanitise_access_code($old_access_code); $new_access_code = matewa_agency_registry_sanitise_access_code($new_access_code); $old_is_agency = matewa_agency_registry_is_access_code($old_access_code); $new_is_agency = matewa_agency_registry_is_access_code($new_access_code); if ($new_is_agency && $old_access_code === $new_access_code) { return false; } if (!$old_is_agency && !$new_is_agency) { $stored = matewa_agency_registry_get_last_result(); if (empty($stored)) { return false; } } delete_option(MATEWA_AGENCY_REGISTRY_LAST_RESULT_OPTION); delete_option(MATEWA_AGENCY_REGISTRY_LAST_ERROR_OPTION); return true; } }