Spaces:
No application file
No application file
namespace Mautic\CoreBundle\IpLookup; | |
use Mautic\CoreBundle\IpLookup\DoNotSellList\MaxMindDoNotSellList; | |
abstract class AbstractMaxmindLookup extends AbstractRemoteDataLookup | |
{ | |
/** | |
* @return string | |
*/ | |
public function getAttribution() | |
{ | |
return '<a href="https://www.maxmind.com/en/geoip2-precision-services" target="_blank">MaxMind Precision Services</a> is a pay per query lookup service that offers solutions with multiple levels of accuracy and details.'; | |
} | |
abstract protected function getName(): string; | |
/** | |
* @return array | |
*/ | |
protected function getHeaders() | |
{ | |
if (!$this->auth) { | |
throw new \InvalidArgumentException('Maxmind Authentication key canot be empty.'); | |
} | |
return ['Authorization' => 'Basic '.base64_encode($this->auth)]; | |
} | |
/** | |
* @return string | |
*/ | |
protected function getUrl() | |
{ | |
$url = 'https://geoip.maxmind.com/geoip/v2.1/'; | |
match ($this->getName()) { | |
'maxmind_country' => $url .= 'country', | |
'maxmind_precision' => $url .= 'city', | |
'maxmind_omni' => $url .= 'insights', | |
default => $url."/{$this->ip}", | |
}; | |
return $url."/{$this->ip}"; | |
} | |
protected function parseResponse($response) | |
{ | |
$data = json_decode($response); | |
if ($data) { | |
if (empty($data->error)) { | |
if (isset($data->postal)) { | |
$this->zipcode = $data->postal->code; | |
} | |
if (isset($data->country)) { | |
$this->country = $data->country->names->en; | |
} | |
if (isset($data->city)) { | |
$this->city = $data->city->names->en; | |
} | |
if (isset($data->subdivisions[0])) { | |
if (count($data->subdivisions) > 1) { | |
// Use the first listed as the country and second as state | |
// UK -> England -> Winchester | |
$this->country = $data->subdivisions[0]->names->en; | |
$this->region = $data->subdivisions[1]->names->en; | |
} else { | |
$this->region = $data->subdivisions[0]->names->en; | |
} | |
} | |
$this->latitude = $data->location->latitude; | |
$this->longitude = $data->location->longitude; | |
$this->timezone = $data->location->time_zone; | |
if (isset($data->traits->isp)) { | |
$this->isp = $data->traits->isp; | |
} | |
if (isset($data->traits->organization)) { | |
$this->organization = $data->traits->organization; | |
} | |
} elseif (null !== $this->logger) { | |
$this->logger->warning('IP LOOKUP: '.$data->error); | |
} | |
} | |
} | |
protected function shouldPerformLookup(): bool | |
{ | |
if (!isset($this->ip)) { | |
return false; | |
} | |
$doNotSellList = new MaxMindDoNotSellList($this->coreParametersHelper); | |
$ip = $this->ip; | |
$doNotSellList->loadList(); | |
$ipMatch = array_filter($doNotSellList->getList(), function ($item) use ($ip, $doNotSellList): bool { | |
return $doNotSellList->stripCIDR($item['value']) == $ip; | |
}); | |
return !boolval(count($ipMatch)); | |
} | |
} | |