.= ' | JetpackProtect/' . constant( 'JETPACK_PROTECT_VERSION' ); } if ( is_multisite() ) { $request['multisite'] = get_blog_count(); } /** * Filter controls maximum timeout in waiting for reponse from Protect servers. * * @module protect * * @since 4.0.4 * * @param int $timeout Max time (in seconds) to wait for a response. */ $timeout = apply_filters( 'jetpack_protect_connect_timeout', 30 ); $args = array( 'body' => $request, 'user-agent' => $user_agent, 'httpversion' => '1.0', 'timeout' => absint( $timeout ), ); Waf_Constants::define_brute_force_api_host(); $response_json = wp_remote_post( JETPACK_PROTECT__API_HOST, $args ); $this->last_response_raw = $response_json; $transient_name = $this->get_transient_name(); $this->delete_transient( $transient_name ); if ( is_array( $response_json ) ) { $response = json_decode( $response_json['body'], true ); } if ( isset( $response['blocked_attempts'] ) && $response['blocked_attempts'] ) { update_site_option( 'jetpack_protect_blocked_attempts', $response['blocked_attempts'] ); } if ( isset( $response['status'] ) && ! isset( $response['error'] ) ) { $response['expire'] = time() + $response['seconds_remaining']; $this->set_transient( $transient_name, $response, $response['seconds_remaining'] ); $this->delete_transient( 'brute_use_math' ); } else { // Fallback to Math Captcha if no response from API host. $this->set_transient( 'brute_use_math', 1, 600 ); $response['status'] = 'ok'; $response['math'] = true; } if ( isset( $response['error'] ) ) { update_site_option( 'jetpack_protect_error', $response['error'] ); } else { delete_site_option( 'jetpack_protect_error' ); } return $response; } /** * Gets the transient name. */ public function get_transient_name() { $headers = $this->get_headers(); $header_hash = md5( wp_json_encode( $headers ) ); return 'jpp_li_' . $header_hash; } /** * Wrapper for WordPress set_transient function, our version sets * the transient on the main site in the network if this is a multisite network * * We do it this way (instead of set_site_transient) because of an issue where * sitewide transients are always autoloaded * https://core.trac.wordpress.org/ticket/22846 * * @param string $transient Transient name. Expected to not be SQL-escaped. Must be * 45 characters or fewer in length. * @param mixed $value Transient value. Must be serializable if non-scalar. * Expected to not be SQL-escaped. * @param int $expiration Optional. Time until expiration in seconds. Default 0. * * @return bool False if value was not set and true if value was set. */ public function set_transient( $transient, $value, $expiration ) { if ( is_multisite() && ! is_main_site() ) { switch_to_blog( $this->get_main_blog_id() ); $return = set_transient( $transient, $value, $expiration ); restore_current_blog(); return $return; } return set_transient( $transient, $value, $expiration ); } /** * Wrapper for WordPress delete_transient function, our version deletes * the transient on the main site in the network if this is a multisite network * * @param string $transient Transient name. Expected to not be SQL-escaped. * * @return bool true if successful, false otherwise */ public function delete_transient( $transient ) { if ( is_multisite() && ! is_main_site() ) { switch_to_blog( $this->get_main_blog_id() ); $return = delete_transient( $transient ); restore_current_blog(); return $return; } return delete_transient( $transient ); } /** * Wrapper for WordPress get_transient function, our version gets * the transient on the main site in the network if this is a multisite network * * @param string $transient Transient name. Expected to not be SQL-escaped. * * @return mixed Value of transient. */ public function get_transient( $transient ) { if ( is_multisite() && ! is_main_site() ) { switch_to_blog( $this->get_main_blog_id() ); $return = get_transient( $transient ); restore_current_blog(); return $return; } return get_transient( $transient ); } /** * Returns the local host. */ public function get_local_host() { if ( isset( $this->local_host ) ) { return $this->local_host; } $uri = 'http://' . strtolower( isset( $_SERVER['HTTP_HOST'] ) ? filter_var( wp_unslash( $_SERVER['HTTP_HOST'] ) ) : '' ); if ( is_multisite() ) { $uri = network_home_url(); } $uridata = wp_parse_url( $uri ); $domain = $uridata['host']; // If we still don't have the site_url, get it. if ( ! $domain ) { $uri = get_site_url( 1 ); $uridata = wp_parse_url( $uri ); $domain = $uridata['host']; } $this->local_host = $domain; return $this->local_host; } }