Edit File by line
/home/zeestwma/ajeebong.../wp-conte.../plugins/zero-spa.../modules
File: class-zerospam.php
<?php // phpcs:ignore
[0] Fix | Delete
/**
[1] Fix | Delete
* Zero Spam class for enhanced site protection.
[2] Fix | Delete
*
[3] Fix | Delete
* Handles the core functionality of interacting with the Zero Spam API,
[4] Fix | Delete
* managing site settings for spam prevention, and reporting detections.
[5] Fix | Delete
*
[6] Fix | Delete
* @package ZeroSpam
[7] Fix | Delete
*/
[8] Fix | Delete
[9] Fix | Delete
namespace ZeroSpam\Modules;
[10] Fix | Delete
[11] Fix | Delete
defined( 'ABSPATH' ) || exit; // Prevent direct access.
[12] Fix | Delete
[13] Fix | Delete
/**
[14] Fix | Delete
* Core class for Zero Spam functionality.
[15] Fix | Delete
*/
[16] Fix | Delete
class Zero_Spam {
[17] Fix | Delete
/**
[18] Fix | Delete
* Class constructor.
[19] Fix | Delete
*
[20] Fix | Delete
* Adds necessary hooks for initialization.
[21] Fix | Delete
*/
[22] Fix | Delete
public function __construct() {
[23] Fix | Delete
add_action( 'init', [ $this, 'init' ] );
[24] Fix | Delete
}
[25] Fix | Delete
[26] Fix | Delete
/**
[27] Fix | Delete
* Initialization.
[28] Fix | Delete
*
[29] Fix | Delete
* Fires after WordPress has finished loading but before any headers are sent.
[30] Fix | Delete
* Registers plugin filters and actions.
[31] Fix | Delete
*/
[32] Fix | Delete
public function init() {
[33] Fix | Delete
add_filter( 'zerospam_setting_sections', [ $this, 'sections' ] );
[34] Fix | Delete
add_filter( 'zerospam_settings', [ $this, 'settings' ], 10, 1 );
[35] Fix | Delete
add_action( 'zerospam_share_detection', [ $this, 'share_detection' ], 10, 1 );
[36] Fix | Delete
[37] Fix | Delete
if (
[38] Fix | Delete
'enabled' === \ZeroSpam\Core\Settings::get_settings( 'zerospam' ) &&
[39] Fix | Delete
\ZeroSpam\Core\Access::process()
[40] Fix | Delete
) {
[41] Fix | Delete
add_filter( 'zerospam_access_checks', [ $this, 'access_check' ], 10, 2 );
[42] Fix | Delete
}
[43] Fix | Delete
}
[44] Fix | Delete
[45] Fix | Delete
/**
[46] Fix | Delete
* Site access check.
[47] Fix | Delete
*
[48] Fix | Delete
* Determines if a visitor should be blocked based on the zerospam.org API query results.
[49] Fix | Delete
*
[50] Fix | Delete
* @param array $access_checks Existing access check results.
[51] Fix | Delete
* @param string $user_ip Visitor's IP address.
[52] Fix | Delete
* @return array Updated access checks with Zero Spam results.
[53] Fix | Delete
*/
[54] Fix | Delete
public function access_check( $access_checks, $user_ip ) {
[55] Fix | Delete
$settings = \ZeroSpam\Core\Settings::get_settings();
[56] Fix | Delete
[57] Fix | Delete
$access_checks['zero_spam'] = [
[58] Fix | Delete
'blocked' => false,
[59] Fix | Delete
];
[60] Fix | Delete
[61] Fix | Delete
$response = self::query( [ 'ip' => $user_ip ] );
[62] Fix | Delete
if ( $response && ! empty( $response['ip_addresses'][ $user_ip ] ) ) {
[63] Fix | Delete
$ip_data = $response['ip_addresses'][ $user_ip ];
[64] Fix | Delete
$min_confidence_score = (float) $settings['zerospam_confidence_min']['value'];
[65] Fix | Delete
[66] Fix | Delete
if ( ! empty( $ip_data['confidence'] ) ) {
[67] Fix | Delete
$confidence_score = (float) $ip_data['confidence'] * 100;
[68] Fix | Delete
[69] Fix | Delete
if ( $confidence_score >= $min_confidence_score ) {
[70] Fix | Delete
$access_checks['zero_spam']['blocked'] = true;
[71] Fix | Delete
$access_checks['zero_spam']['type'] = 'blocked';
[72] Fix | Delete
$access_checks['zero_spam']['details'] = $ip_data;
[73] Fix | Delete
}
[74] Fix | Delete
}
[75] Fix | Delete
}
[76] Fix | Delete
[77] Fix | Delete
return $access_checks;
[78] Fix | Delete
}
[79] Fix | Delete
[80] Fix | Delete
/**
[81] Fix | Delete
* Admin setting sections
[82] Fix | Delete
*
[83] Fix | Delete
* @param array $sections Array of admin setting sections.
[84] Fix | Delete
*/
[85] Fix | Delete
public function sections( $sections ) {
[86] Fix | Delete
$sections['zerospam'] = array(
[87] Fix | Delete
'title' => __( 'Enhanced Protection', 'zero-spam' ),
[88] Fix | Delete
'icon' => 'assets/img/icon.svg',
[89] Fix | Delete
);
[90] Fix | Delete
[91] Fix | Delete
return $sections;
[92] Fix | Delete
}
[93] Fix | Delete
[94] Fix | Delete
/**
[95] Fix | Delete
* Admin settings
[96] Fix | Delete
*
[97] Fix | Delete
* @param array $settings Array of available settings.
[98] Fix | Delete
*/
[99] Fix | Delete
public function settings( $settings ) {
[100] Fix | Delete
$options = get_option( 'zero-spam-zerospam' );
[101] Fix | Delete
[102] Fix | Delete
$settings['zerospam'] = array(
[103] Fix | Delete
'title' => __( 'Status', 'zero-spam' ),
[104] Fix | Delete
'section' => 'zerospam',
[105] Fix | Delete
'module' => 'zerospam',
[106] Fix | Delete
'type' => 'checkbox',
[107] Fix | Delete
'options' => array(
[108] Fix | Delete
'enabled' => __( 'Enabled', 'zero-spam' ),
[109] Fix | Delete
),
[110] Fix | Delete
'desc' => sprintf(
[111] Fix | Delete
wp_kses(
[112] Fix | Delete
/* translators: %s: Replaced with the Zero Spam URL */
[113] Fix | Delete
__( 'Blocks visitor IPs &amp; supported submitted forms with an email address that meets the <a href="%s" target="_blank" rel="noopener noreferrer">Zero Spam</a> <em>Confidence Minimum</em> score.', 'zero-spam' ),
[114] Fix | Delete
array(
[115] Fix | Delete
'strong' => array(),
[116] Fix | Delete
'a' => array(
[117] Fix | Delete
'target' => array(),
[118] Fix | Delete
'href' => array(),
[119] Fix | Delete
'rel' => array(),
[120] Fix | Delete
),
[121] Fix | Delete
'em' => array(),
[122] Fix | Delete
)
[123] Fix | Delete
),
[124] Fix | Delete
esc_url( ZEROSPAM_URL )
[125] Fix | Delete
),
[126] Fix | Delete
'value' => ! empty( $options['zerospam'] ) ? $options['zerospam'] : false,
[127] Fix | Delete
'recommended' => 'enabled',
[128] Fix | Delete
);
[129] Fix | Delete
[130] Fix | Delete
$settings['zerospam_license'] = array(
[131] Fix | Delete
'title' => __( 'License Key', 'zero-spam' ),
[132] Fix | Delete
'desc' => sprintf(
[133] Fix | Delete
wp_kses(
[134] Fix | Delete
/* translators: 1: the zerospam.org URL 2: the zerospam.org premium product URL */
[135] Fix | Delete
__( 'Enter your <a href="%1$s" target="_blank" rel="noopener noreferrer">Zero Spam</a> license key or define it in <code>wp-config.php</code>, using the constant <code>ZEROSPAM_LICENSE_KEY</code> to enable enhanced protection. Don\'t have an license key? <a href="%2$s" target="_blank" rel="noopener noreferrer"><strong>Get one now!</strong></a>', 'zero-spam' ),
[136] Fix | Delete
array(
[137] Fix | Delete
'strong' => array(),
[138] Fix | Delete
'a' => array(
[139] Fix | Delete
'target' => array(),
[140] Fix | Delete
'href' => array(),
[141] Fix | Delete
'rel' => array(),
[142] Fix | Delete
),
[143] Fix | Delete
'code' => array(),
[144] Fix | Delete
)
[145] Fix | Delete
),
[146] Fix | Delete
esc_url( ZEROSPAM_URL ),
[147] Fix | Delete
esc_url( ZEROSPAM_URL . 'product/premium/' )
[148] Fix | Delete
),
[149] Fix | Delete
'section' => 'zerospam',
[150] Fix | Delete
'module' => 'zerospam',
[151] Fix | Delete
'type' => 'text',
[152] Fix | Delete
'field_class' => 'regular-text',
[153] Fix | Delete
'placeholder' => __( 'Enter your Zero Spam license key.', 'zero-spam' ),
[154] Fix | Delete
'value' => ! empty( $options['zerospam_license'] ) ? $options['zerospam_license'] : false,
[155] Fix | Delete
);
[156] Fix | Delete
[157] Fix | Delete
if ( defined( 'ZEROSPAM_LICENSE_KEY' ) && ! $settings['zerospam_license']['value'] ) {
[158] Fix | Delete
$settings['zerospam_license']['value'] = ZEROSPAM_LICENSE_KEY;
[159] Fix | Delete
}
[160] Fix | Delete
[161] Fix | Delete
$settings['zerospam_timeout'] = array(
[162] Fix | Delete
'title' => __( 'API Timeout', 'zero-spam' ),
[163] Fix | Delete
'section' => 'zerospam',
[164] Fix | Delete
'module' => 'zerospam',
[165] Fix | Delete
'type' => 'number',
[166] Fix | Delete
'field_class' => 'small-text',
[167] Fix | Delete
'suffix' => __( 'seconds', 'zero-spam' ),
[168] Fix | Delete
'placeholder' => __( '5', 'zero-spam' ),
[169] Fix | Delete
'min' => 0,
[170] Fix | Delete
'desc' => __( 'Setting to high could result in degraded site performance, too low won\'t allow to API enough time to respond; recommended 5 seconds.', 'zero-spam' ),
[171] Fix | Delete
'value' => ! empty( $options['zerospam_timeout'] ) ? $options['zerospam_timeout'] : 5,
[172] Fix | Delete
'recommended' => 5,
[173] Fix | Delete
);
[174] Fix | Delete
[175] Fix | Delete
$settings['zerospam_cache'] = array(
[176] Fix | Delete
'title' => __( 'Cache Expiration', 'zero-spam' ),
[177] Fix | Delete
'section' => 'zerospam',
[178] Fix | Delete
'module' => 'zerospam',
[179] Fix | Delete
'type' => 'number',
[180] Fix | Delete
'field_class' => 'small-text',
[181] Fix | Delete
'suffix' => __( 'day(s)', 'zero-spam' ),
[182] Fix | Delete
'placeholder' => WEEK_IN_SECONDS,
[183] Fix | Delete
'min' => 0,
[184] Fix | Delete
'desc' => __( 'Setting to high could result in outdated information, too low could cause a decrease in performance; recommended 14 days.', 'zero-spam' ),
[185] Fix | Delete
'value' => ! empty( $options['zerospam_cache'] ) ? $options['zerospam_cache'] : 14,
[186] Fix | Delete
'recommended' => 14,
[187] Fix | Delete
);
[188] Fix | Delete
[189] Fix | Delete
$settings['zerospam_confidence_min'] = array(
[190] Fix | Delete
'title' => __( 'Confidence Minimum', 'zero-spam' ),
[191] Fix | Delete
'section' => 'zerospam',
[192] Fix | Delete
'module' => 'zerospam',
[193] Fix | Delete
'type' => 'number',
[194] Fix | Delete
'field_class' => 'small-text',
[195] Fix | Delete
'suffix' => __( '%', 'zero-spam' ),
[196] Fix | Delete
'placeholder' => __( '30', 'zero-spam' ),
[197] Fix | Delete
'min' => 0,
[198] Fix | Delete
'max' => 100,
[199] Fix | Delete
'step' => 0.1,
[200] Fix | Delete
'desc' => sprintf(
[201] Fix | Delete
wp_kses(
[202] Fix | Delete
/* translators: %s: Replaced with the Zero Spam API URL */
[203] Fix | Delete
__( 'Minimum <a href="%s" target="_blank" rel="noopener noreferrer">confidence score</a> an IP must meet before being blocked. Setting this too low could cause users to be blocked that shouldn\'t be; recommended 20%%.', 'zero-spam' ),
[204] Fix | Delete
array(
[205] Fix | Delete
'a' => array(
[206] Fix | Delete
'target' => array(),
[207] Fix | Delete
'href' => array(),
[208] Fix | Delete
'rel' => array(),
[209] Fix | Delete
),
[210] Fix | Delete
)
[211] Fix | Delete
),
[212] Fix | Delete
esc_url( ZEROSPAM_URL . 'spam-blacklist-api/?utm_source=' . site_url() . '&utm_medium=admin_confidence_score&utm_campaign=wpzerospam' )
[213] Fix | Delete
),
[214] Fix | Delete
'value' => ! empty( $options['zerospam_confidence_min'] ) ? $options['zerospam_confidence_min'] : 30,
[215] Fix | Delete
'recommended' => 30,
[216] Fix | Delete
);
[217] Fix | Delete
[218] Fix | Delete
return $settings;
[219] Fix | Delete
}
[220] Fix | Delete
[221] Fix | Delete
/**
[222] Fix | Delete
* Global API data.
[223] Fix | Delete
*/
[224] Fix | Delete
public function global_api_data() {
[225] Fix | Delete
$api_data = array();
[226] Fix | Delete
$api_data['reporter_email'] = sanitize_email( get_bloginfo( 'admin_email' ) );
[227] Fix | Delete
$api_data['app_key'] = \ZeroSpam\Core\Utilities::clean_domain( esc_url( site_url() ) );
[228] Fix | Delete
$api_data['app_type'] = 'WordPress';
[229] Fix | Delete
$api_data['app_details'] = array(
[230] Fix | Delete
'app_version' => sanitize_text_field( get_bloginfo( 'version' ) ),
[231] Fix | Delete
'app_type_version' => sanitize_text_field( ZEROSPAM_VERSION ),
[232] Fix | Delete
'app_language' => sanitize_text_field( strtolower( get_bloginfo( 'language' ) ) ),
[233] Fix | Delete
'app_email' => sanitize_email( get_bloginfo( 'admin_email' ) ),
[234] Fix | Delete
'app_name' => sanitize_text_field( get_bloginfo( 'name' ) ),
[235] Fix | Delete
'app_desc' => sanitize_text_field( get_bloginfo( 'description' ) ),
[236] Fix | Delete
);
[237] Fix | Delete
[238] Fix | Delete
return $api_data;
[239] Fix | Delete
}
[240] Fix | Delete
[241] Fix | Delete
/**
[242] Fix | Delete
* Shares detection details with zerospam.org.
[243] Fix | Delete
*
[244] Fix | Delete
* @param array $data Contains all detection details. Must include 'type' and may include 'failed'.
[245] Fix | Delete
* @return true|WP_Error True on success, WP_Error on failure.
[246] Fix | Delete
*/
[247] Fix | Delete
public function share_detection( $data ) {
[248] Fix | Delete
if ( ! is_array( $data ) || empty( $data['type'] ) ) {
[249] Fix | Delete
\ZeroSpam\Core\Utilities::log( __( 'Invalid or incomplete detection data provided.', 'zero-spam' ) );
[250] Fix | Delete
}
[251] Fix | Delete
[252] Fix | Delete
$last_api_report_submitted = get_site_option( 'zero_spam_last_api_request' );
[253] Fix | Delete
if ( $last_api_report_submitted ) {
[254] Fix | Delete
$last_api_report_submitted = new \DateTime( $last_api_report_submitted );
[255] Fix | Delete
$current_time = new \DateTime();
[256] Fix | Delete
if ( $last_api_report_submitted->diff( $current_time )->i < 30 ) {
[257] Fix | Delete
\ZeroSpam\Core\Utilities::log( __( 'API requests are throttled to every 30 minutes.', 'zero-spam' ) );
[258] Fix | Delete
}
[259] Fix | Delete
}
[260] Fix | Delete
[261] Fix | Delete
$endpoint = ZEROSPAM_URL . 'wp-json/v5.4/report/';
[262] Fix | Delete
$ip = \ZeroSpam\Core\User::get_ip();
[263] Fix | Delete
if ( ! $ip ) {
[264] Fix | Delete
\ZeroSpam\Core\Utilities::log( __( 'IP address retrieval failed.', 'zero-spam' ) );
[265] Fix | Delete
}
[266] Fix | Delete
[267] Fix | Delete
$api_data = [
[268] Fix | Delete
'report_type' => 'ip_address',
[269] Fix | Delete
'report_module' => sanitize_text_field( $data['type'] ),
[270] Fix | Delete
'report_key' => sanitize_text_field( $ip ),
[271] Fix | Delete
'report_failed' => isset( $data['failed'] ) ? sanitize_text_field( $data['failed'] ) : '',
[272] Fix | Delete
];
[273] Fix | Delete
[274] Fix | Delete
$global_data = self::global_api_data();
[275] Fix | Delete
$api_data = array_merge( $api_data, $global_data );
[276] Fix | Delete
[277] Fix | Delete
$response = wp_remote_post( $endpoint, [ 'body' => [ 'data' => $api_data ] ] );
[278] Fix | Delete
if ( is_wp_error( $response ) ) {
[279] Fix | Delete
\ZeroSpam\Core\Utilities::log( __( 'API request failed.', 'zero-spam' ) );
[280] Fix | Delete
}
[281] Fix | Delete
[282] Fix | Delete
// Process email fields.
[283] Fix | Delete
$valid_email_fields = [
[284] Fix | Delete
'comment_author_email', // Comments.
[285] Fix | Delete
'user_email', // Registration.
[286] Fix | Delete
'email', // WooCommerce Registration.
[287] Fix | Delete
'post' => [ // Mailchimp.
[288] Fix | Delete
'EMAIL',
[289] Fix | Delete
],
[290] Fix | Delete
'data' => [ // Give.
[291] Fix | Delete
'give_email',
[292] Fix | Delete
],
[293] Fix | Delete
];
[294] Fix | Delete
[295] Fix | Delete
$valid_name_fields = [
[296] Fix | Delete
'comment_author', // Comment.
[297] Fix | Delete
'user_login', // Register.
[298] Fix | Delete
'username', // WooCommerce Registration.
[299] Fix | Delete
'data' => [ // Give.
[300] Fix | Delete
'give_first',
[301] Fix | Delete
'give_last',
[302] Fix | Delete
],
[303] Fix | Delete
];
[304] Fix | Delete
[305] Fix | Delete
foreach ( $valid_email_fields as $key => $field ) {
[306] Fix | Delete
if ( is_array( $field ) ) {
[307] Fix | Delete
foreach ( $field as $f ) {
[308] Fix | Delete
if ( ! empty( $data[ $key ][ $f ] ) && \ZeroSpam\Core\Utilities::is_email( $data[ $key ][ $f ] ) ) {
[309] Fix | Delete
$email = sanitize_email( $data[ $key ][ $f ] );
[310] Fix | Delete
break 2; // Exit both loops.
[311] Fix | Delete
}
[312] Fix | Delete
}
[313] Fix | Delete
} elseif ( ! empty( $data[ $field ] ) && \ZeroSpam\Core\Utilities::is_email( $data[ $field ] ) ) {
[314] Fix | Delete
$email = sanitize_email( $data[ $field ] );
[315] Fix | Delete
break; // Exit the loop.
[316] Fix | Delete
}
[317] Fix | Delete
}
[318] Fix | Delete
[319] Fix | Delete
if ( ! empty( $email ) ) {
[320] Fix | Delete
$report_details = [
[321] Fix | Delete
'report_type' => 'email_address',
[322] Fix | Delete
'report_module' => sanitize_text_field( $data['type'] ),
[323] Fix | Delete
'report_key' => $email,
[324] Fix | Delete
'report_failed' => isset( $data['failed'] ) ? sanitize_text_field( $data['failed'] ) : '',
[325] Fix | Delete
'email_details' => [
[326] Fix | Delete
'names' => [],
[327] Fix | Delete
'companies' => [],
[328] Fix | Delete
'titles' => [],
[329] Fix | Delete
'phones' => [],
[330] Fix | Delete
'locations' => [],
[331] Fix | Delete
],
[332] Fix | Delete
];
[333] Fix | Delete
[334] Fix | Delete
foreach ( $valid_name_fields as $key => $field ) {
[335] Fix | Delete
if ( is_array( $field ) ) {
[336] Fix | Delete
$names = array_map(
[337] Fix | Delete
function ( $f ) use ( $data, $key ) {
[338] Fix | Delete
return ! empty( $data[ $key ][ $f ] ) ? sanitize_text_field( $data[ $key ][ $f ] ) : '';
[339] Fix | Delete
},
[340] Fix | Delete
$field
[341] Fix | Delete
);
[342] Fix | Delete
$names = array_filter( $names ); // Remove empty values.
[343] Fix | Delete
if ( $names ) {
[344] Fix | Delete
$report_details['email_details']['names'][] = implode( ' ', $names );
[345] Fix | Delete
}
[346] Fix | Delete
} elseif ( ! empty( $data[ $field ] ) ) {
[347] Fix | Delete
$report_details['email_details']['names'][] = sanitize_text_field( $data[ $field ] );
[348] Fix | Delete
}
[349] Fix | Delete
}
[350] Fix | Delete
[351] Fix | Delete
// Append global data and submit the email report.
[352] Fix | Delete
$response = wp_remote_post( $endpoint, [ 'body' => [ 'data' => array_merge( $report_details, $global_data ) ] ] );
[353] Fix | Delete
if ( is_wp_error( $response ) ) {
[354] Fix | Delete
\ZeroSpam\Core\Utilities::log( __( 'Email report submission failed.', 'zero-spam' ) );
[355] Fix | Delete
}
[356] Fix | Delete
}
[357] Fix | Delete
[358] Fix | Delete
// Successfully updated the last API request time.
[359] Fix | Delete
update_site_option( 'zero_spam_last_api_request', current_time( 'mysql' ) );
[360] Fix | Delete
[361] Fix | Delete
return true;
[362] Fix | Delete
}
[363] Fix | Delete
[364] Fix | Delete
/**
[365] Fix | Delete
* Returns license key data from the API
[366] Fix | Delete
*
[367] Fix | Delete
* @param string $license The license key.
[368] Fix | Delete
*/
[369] Fix | Delete
public static function get_license( $license ) {
[370] Fix | Delete
if ( strpos( $license, 'invalid' ) !== false ) {
[371] Fix | Delete
return false;
[372] Fix | Delete
}
[373] Fix | Delete
[374] Fix | Delete
$cache_key = sanitize_title( 'license_' . $license );
[375] Fix | Delete
$license_data = wp_cache_get( $cache_key );
[376] Fix | Delete
if ( false === $license_data ) {
[377] Fix | Delete
$endpoint = ZEROSPAM_URL . 'wp-json/v1/get-license';
[378] Fix | Delete
$args = array(
[379] Fix | Delete
'body' => array( 'license_key' => $license ),
[380] Fix | Delete
);
[381] Fix | Delete
[382] Fix | Delete
$license_data = \ZeroSpam\Core\Utilities::remote_post( $endpoint, $args );
[383] Fix | Delete
[384] Fix | Delete
if ( $license_data ) {
[385] Fix | Delete
$license_data = json_decode( $license_data, true );
[386] Fix | Delete
[387] Fix | Delete
if ( empty( $license_data['license_key'] ) ) {
[388] Fix | Delete
\ZeroSpam\Core\Utilities::log( 'Zero Spam License Check: ' . $license_data['response'] );
[389] Fix | Delete
}
[390] Fix | Delete
[391] Fix | Delete
if ( ! empty( $license_data['license_key'] ) ) {
[392] Fix | Delete
$expiration = 1 * MONTH_IN_SECONDS;
[393] Fix | Delete
wp_cache_set( $cache_key, $license_data, 'zero_spam_store', $expiration );
[394] Fix | Delete
}
[395] Fix | Delete
}
[396] Fix | Delete
}
[397] Fix | Delete
[398] Fix | Delete
return $license_data;
[399] Fix | Delete
}
[400] Fix | Delete
[401] Fix | Delete
/**
[402] Fix | Delete
* Query the Zero Spam Blacklist API
[403] Fix | Delete
*
[404] Fix | Delete
* @param array $params Array of query parameters.
[405] Fix | Delete
*/
[406] Fix | Delete
public static function query( $params ) {
[407] Fix | Delete
if (
[408] Fix | Delete
empty( $params['ip'] ) &&
[409] Fix | Delete
empty( $params['email'] )
[410] Fix | Delete
) {
[411] Fix | Delete
return false;
[412] Fix | Delete
}
[413] Fix | Delete
[414] Fix | Delete
$settings = \ZeroSpam\Core\Settings::get_settings();
[415] Fix | Delete
[416] Fix | Delete
if ( empty( $settings['zerospam_license']['value'] ) ) {
[417] Fix | Delete
return false;
[418] Fix | Delete
}
[419] Fix | Delete
[420] Fix | Delete
$cache_array = array( 'zero_spam' );
[421] Fix | Delete
$cache_array = array_merge( $cache_array, $params );
[422] Fix | Delete
$cache_key = \ZeroSpam\Core\Utilities::cache_key( $cache_array );
[423] Fix | Delete
[424] Fix | Delete
$response = wp_cache_get( $cache_key );
[425] Fix | Delete
if ( false === $response ) {
[426] Fix | Delete
// Limit the number of requests.
[427] Fix | Delete
$last_query_option = get_site_option( 'zero_spam_last_api_query', false );
[428] Fix | Delete
[429] Fix | Delete
if ( $last_query_option ) {
[430] Fix | Delete
list( $first_query_date, $num_queries) = explode( '*', $last_query_option );
[431] Fix | Delete
[432] Fix | Delete
if ( gmdate( 'Y-m-d', strtotime( $first_query_date ) ) !== gmdate( 'Y-m-d' ) ) {
[433] Fix | Delete
// New day.
[434] Fix | Delete
update_site_option( 'zero_spam_last_api_query', current_time( 'mysql' ) . '*1' );
[435] Fix | Delete
} elseif ( $num_queries > 200 ) {
[436] Fix | Delete
return false;
[437] Fix | Delete
} else {
[438] Fix | Delete
update_site_option( 'zero_spam_last_api_query', $first_query_date . '*' . ( $num_queries + 1 ) );
[439] Fix | Delete
}
[440] Fix | Delete
} else {
[441] Fix | Delete
update_site_option( 'zero_spam_last_api_query', $first_query_date . '*' . ( $num_queries + 1 ) );
[442] Fix | Delete
}
[443] Fix | Delete
[444] Fix | Delete
$endpoint = 'https://www.zerospam.org/wp-json/v2/query';
[445] Fix | Delete
[446] Fix | Delete
$args = array(
[447] Fix | Delete
'body' => array(
[448] Fix | Delete
'license_key' => $settings['zerospam_license']['value'],
[449] Fix | Delete
),
[450] Fix | Delete
);
[451] Fix | Delete
[452] Fix | Delete
if ( ! empty( $params['ip'] ) ) {
[453] Fix | Delete
$args['body']['ip'] = $params['ip'];
[454] Fix | Delete
}
[455] Fix | Delete
[456] Fix | Delete
if ( ! empty( $params['email'] ) ) {
[457] Fix | Delete
$args['body']['email'] = $params['email'];
[458] Fix | Delete
}
[459] Fix | Delete
[460] Fix | Delete
$args['timeout'] = 5;
[461] Fix | Delete
if ( ! empty( $settings['zerospam_timeout'] ) ) {
[462] Fix | Delete
$args['timeout'] = intval( $settings['zerospam_timeout']['value'] );
[463] Fix | Delete
}
[464] Fix | Delete
[465] Fix | Delete
$response = \ZeroSpam\Core\Utilities::remote_post( $endpoint, $args );
[466] Fix | Delete
if ( $response ) {
[467] Fix | Delete
// Response should be a JSON string.
[468] Fix | Delete
$response = json_decode( $response, true );
[469] Fix | Delete
[470] Fix | Delete
if (
[471] Fix | Delete
! is_array( $response ) ||
[472] Fix | Delete
empty( $response['status'] ) ||
[473] Fix | Delete
200 !== $response['status'] ||
[474] Fix | Delete
empty( $response['body_response'] )
[475] Fix | Delete
) {
[476] Fix | Delete
if ( ! empty( $response['response'] ) ) {
[477] Fix | Delete
\ZeroSpam\Core\Utilities::log( $response['response'] );
[478] Fix | Delete
} else {
[479] Fix | Delete
\ZeroSpam\Core\Utilities::log( __( 'There was a problem querying the Zero Spam Blacklist API.', 'zero-spam' ) );
[480] Fix | Delete
}
[481] Fix | Delete
[482] Fix | Delete
return false;
[483] Fix | Delete
}
[484] Fix | Delete
[485] Fix | Delete
$response = $response['body_response'];
[486] Fix | Delete
[487] Fix | Delete
$expiration = 14 * DAY_IN_SECONDS;
[488] Fix | Delete
if ( ! empty( $settings['zerospam_confidence_min']['value'] ) ) {
[489] Fix | Delete
$expiration = $settings['zerospam_confidence_min']['value'] * DAY_IN_SECONDS;
[490] Fix | Delete
}
[491] Fix | Delete
[492] Fix | Delete
wp_cache_set( $cache_key, $response, 'zerospam', $expiration );
[493] Fix | Delete
}
[494] Fix | Delete
}
[495] Fix | Delete
[496] Fix | Delete
return $response;
[497] Fix | Delete
}
[498] Fix | Delete
}
[499] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function