File "class-wc-geolocation.php"
Full path: /home/kosmetik/public_html/wp-content/plugins/woocommerce/includes/class-wc-geolocation.php
File
size: 7.62 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
defined('ABSPATH') || exit;
class WC_Geolocation
{
const GEOLITE_DB = 'http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz';
const GEOLITE_IPV6_DB = 'http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz';
const GEOLITE2_DB = 'http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz';
private static $ip_lookup_apis = array('ipify' => 'http://api.ipify.org/', 'ipecho' => 'http://ipecho.net/plain', 'ident' => 'http://ident.me', 'whatismyipaddress' => 'http://bot.whatismyipaddress.com');
private static $geoip_apis = array('ipinfo.io' => 'https://ipinfo.io/%s/json', 'ip-api.com' => 'http://ip-api.com/json/%s');
private static function is_geolocation_enabled($current_settings)
{
return in_array($current_settings, array('geolocation', 'geolocation_ajax'), true);
}
public static function get_ip_address()
{
if (isset($_SERVER['HTTP_X_REAL_IP'])) {
return sanitize_text_field(wp_unslash($_SERVER['HTTP_X_REAL_IP']));
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return (string) rest_is_ip_address(trim(current(preg_split('/,/', sanitize_text_field(wp_unslash($_SERVER['HTTP_X_FORWARDED_FOR']))))));
} elseif (isset($_SERVER['REMOTE_ADDR'])) {
return sanitize_text_field(wp_unslash($_SERVER['REMOTE_ADDR']));
}
return '';
}
public static function get_external_ip_address()
{
$external_ip_address = '0.0.0.0';
if ('' !== self::get_ip_address()) {
$transient_name = 'external_ip_address_' . self::get_ip_address();
$external_ip_address = get_transient($transient_name);
}
if (false === $external_ip_address) {
$external_ip_address = '0.0.0.0';
$ip_lookup_services = apply_filters('woocommerce_geolocation_ip_lookup_apis', self::$ip_lookup_apis);
$ip_lookup_services_keys = array_keys($ip_lookup_services);
shuffle($ip_lookup_services_keys);
foreach ($ip_lookup_services_keys as $service_name) {
$service_endpoint = $ip_lookup_services[$service_name];
$response = wp_safe_remote_get($service_endpoint, array('timeout' => 2));
if (!is_wp_error($response) && rest_is_ip_address($response['body'])) {
$external_ip_address = apply_filters('woocommerce_geolocation_ip_lookup_api_response', wc_clean($response['body']), $service_name);
break;
}
}
set_transient($transient_name, $external_ip_address, DAY_IN_SECONDS);
}
return $external_ip_address;
}
public static function geolocate_ip($ip_address = '', $fallback = false, $api_fallback = true)
{
$country_code = apply_filters('woocommerce_geolocate_ip', false, $ip_address, $fallback, $api_fallback);
if (false !== $country_code) {
return array('country' => $country_code, 'state' => '', 'city' => '', 'postcode' => '');
}
if (empty($ip_address)) {
$ip_address = self::get_ip_address();
}
$country_code = self::get_country_code_from_headers();
$geolocation = apply_filters('woocommerce_get_geolocation', array('country' => $country_code, 'state' => '', 'city' => '', 'postcode' => ''), $ip_address);
if ('' === $geolocation['country'] && $api_fallback) {
$geolocation['country'] = self::geolocate_via_api($ip_address);
}
if ('' === $geolocation['country'] && $fallback) {
$external_ip_address = self::get_external_ip_address();
if ('0.0.0.0' !== $external_ip_address && $external_ip_address !== $ip_address) {
return self::geolocate_ip($external_ip_address, false, $api_fallback);
}
}
return array('country' => $geolocation['country'], 'state' => $geolocation['state'], 'city' => $geolocation['city'], 'postcode' => $geolocation['postcode']);
}
public static function get_local_database_path($deprecated = '2')
{
wc_deprecated_function('WC_Geolocation::get_local_database_path', '3.9.0');
$integration = wc()->integrations->get_integration('maxmind_geolocation');
return $integration->get_database_service()->get_database_path();
}
public static function update_database()
{
wc_deprecated_function('WC_Geolocation::update_database', '3.9.0');
$integration = wc()->integrations->get_integration('maxmind_geolocation');
$integration->update_database();
}
private static function get_country_code_from_headers()
{
$country_code = '';
$headers = array('MM_COUNTRY_CODE', 'GEOIP_COUNTRY_CODE', 'HTTP_CF_IPCOUNTRY', 'HTTP_X_COUNTRY_CODE');
foreach ($headers as $header) {
if (empty($_SERVER[$header])) {
continue;
}
$country_code = strtoupper(sanitize_text_field(wp_unslash($_SERVER[$header])));
break;
}
return $country_code;
}
private static function geolocate_via_api($ip_address)
{
$country_code = get_transient('geoip_' . $ip_address);
if (false === $country_code) {
$geoip_services = apply_filters('woocommerce_geolocation_geoip_apis', self::$geoip_apis);
if (empty($geoip_services)) {
return '';
}
$geoip_services_keys = array_keys($geoip_services);
shuffle($geoip_services_keys);
foreach ($geoip_services_keys as $service_name) {
$service_endpoint = $geoip_services[$service_name];
$response = wp_safe_remote_get(sprintf($service_endpoint, $ip_address), array('timeout' => 2));
if (!is_wp_error($response) && $response['body']) {
switch ($service_name) {
case 'ipinfo.io':
$data = json_decode($response['body']);
$country_code = isset($data->country) ? $data->country : '';
break;
case 'ip-api.com':
$data = json_decode($response['body']);
$country_code = isset($data->countryCode) ? $data->countryCode : '';
break;
default:
$country_code = apply_filters('woocommerce_geolocation_geoip_response_' . $service_name, '', $response['body']);
break;
}
$country_code = sanitize_text_field(strtoupper($country_code));
if ($country_code) {
break;
}
}
}
set_transient('geoip_' . $ip_address, $country_code, DAY_IN_SECONDS);
}
return $country_code;
}
public static function init()
{
wc_deprecated_function('WC_Geolocation::init', '3.9.0');
return null;
}
public static function disable_geolocation_on_legacy_php($default_customer_address)
{
wc_deprecated_function('WC_Geolocation::disable_geolocation_on_legacy_php', '3.9.0');
if (self::is_geolocation_enabled($default_customer_address)) {
$default_customer_address = 'base';
}
return $default_customer_address;
}
public static function maybe_update_database($new_value, $old_value)
{
wc_deprecated_function('WC_Geolocation::maybe_update_database', '3.9.0');
if ($new_value !== $old_value && self::is_geolocation_enabled($new_value)) {
self::update_database();
}
return $new_value;
}
}