File "CaptchaAPIClient.php"
Full Path: /home/amervokv/ecomlive.net/wp-content/mu-plugins/vendor/wpsec/wp-captcha-plugin/src/client/CaptchaAPIClient.php
File size: 3 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace Wpsec\captcha\client;
use WP_Error;
use WPaaS\Plugin;
use Wpsec\captcha\constants\CookieConstants;
use Wpsec\captcha\utils\Logger;
class CaptchaAPIClient {
/** @var string host */
private $host = '';
/** @var string events_endpoint_path */
private $events_endpoint_path = '/api/v1/events';
/** @var array $default_request_options */
private $default_request_options = array(
'body' => '',
'headers' => array(
'Content-Type' => 'application/json',
),
'method' => 'POST',
'timeout' => 3,
'blocking' => true,
);
/**
* Documentation for cURL errors: https://curl.se/libcurl/c/libcurl-errors.html
*
* @var array $timeout_curl_errors
*/
private static $timeout_curl_errors = array(
'cURL error 6', // CURLE_COULDNT_RESOLVE_HOST
'cURL error 7', // CURLE_COULDNT_CONNECT
'cURL error 28', // CURLE_OPERATION_TIMEDOUT
);
/**
* Define the Captcha Stats Client.
*
* @since 1.0.0
*/
public function __construct( $captcha_api_host ) {
$this->host = $captcha_api_host;
}
/**
* Sends event type to API with meta data
*
* @param string $event_type
* @param array $client_ips
* @param array $event_meta
*
* @return array|WP_Error
*
* @since 1.0.0
*/
public function send_event_type( $event_type, $client_ips, $event_meta = array() ) {
$endpoint = sprintf( '%s%s', $this->host, $this->events_endpoint_path );
$options = $this->default_request_options;
$cp_challenge = isset( $_COOKIE[ CookieConstants::CP_CHALLENGE ] ) ? $_COOKIE[ CookieConstants::CP_CHALLENGE ] : '';
$options['body'] = wp_json_encode(
array(
'event_type' => $event_type,
'ips' => $client_ips,
'event_meta' => $event_meta,
'cp_challenge' => $cp_challenge,
)
);
$signed_request_headers = Plugin::sign_http_request( $options['body'] );
if ( empty( $signed_request_headers ) ) {
return array( 'response' => array( 'code' => 504 ) );
}
$options['headers'] = array_merge( $options['headers'], $signed_request_headers );
$response = wp_remote_post( $endpoint, $options );
if ( $this->is_timeout( $response ) ) {
return array( 'response' => array( 'code' => 504 ) );
}
return $response;
}
/**
* Check if request response is timeout
* Since WordPress does not have any built in functionality, we are checking this manually
*
* @param object $response
*
* @return bool
* @since 1.0.0
*
*/
private function is_timeout( $response ) {
if ( ! is_wp_error( $response ) || ! isset( $response->errors['http_request_failed'] ) ) {
return false;
}
$response_error = substr( $response->errors['http_request_failed'][0], 0, 13 );
foreach ( self::$timeout_curl_errors as $curl_error ) {
if ( false !== strpos( $response_error, $curl_error ) ) {
Logger::log(
'Request Timeout',
array(
'captcha_id' => isset( $_POST['wpsec_captcha_id'] ) ? $_POST['wpsec_captcha_id'] : '',
'error' => $curl_error,
)
);
return true;
}
}
return false;
}
}