110 lines
No EOL
2.7 KiB
PHP
110 lines
No EOL
2.7 KiB
PHP
<?php
|
|
|
|
require_once __DIR__ . '/../vendor/autoload.php';
|
|
|
|
require_once __DIR__ . '/wfIpLocation.php';
|
|
|
|
use Wordfence\MmdbReader\Database;
|
|
use Wordfence\MmdbReader\Exception\MmdbThrowable;
|
|
|
|
class wfIpLocator {
|
|
|
|
const SOURCE_BUNDLED = 0;
|
|
const SOURCE_WFLOGS = 1;
|
|
|
|
const DATABASE_FILE_NAME = 'GeoLite2-Country.mmdb';
|
|
|
|
private static $instances = array();
|
|
|
|
private $database;
|
|
private $preferred;
|
|
|
|
private function __construct($database, $preferred) {
|
|
$this->database = $database;
|
|
$this->preferred = $preferred;
|
|
}
|
|
|
|
public function isPreferred() {
|
|
return $this->preferred;
|
|
}
|
|
|
|
private static function logError($message) {
|
|
if (class_exists('wfUtils'))
|
|
wfUtils::check_and_log_last_error('ip_locator', 'IP Location Error:', $message, 0);
|
|
}
|
|
|
|
public function locate($ip) {
|
|
if ($this->database !== null) {
|
|
try {
|
|
$record = $this->database->search($ip);
|
|
if ($record !== null)
|
|
return new wfIpLocation($record);
|
|
}
|
|
catch (MmdbThrowable $t) {
|
|
self::logError('Failed to locate IP address: ' . $t->getMessage());
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function getCountryCode($ip, $default = '') {
|
|
$record = $this->locate($ip);
|
|
if ($record !== null)
|
|
return $record->getCountryCode();
|
|
return $default;
|
|
}
|
|
|
|
public function getDatabaseVersion() {
|
|
if ($this->database !== null) {
|
|
try {
|
|
return $this->database->getMetadata()->getBuildEpoch();
|
|
}
|
|
catch (MmdbThrowable $t) {
|
|
self::logError('Failed to retrieve database version: ' . $t->getMessage());
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static function getDatabaseDirectory($source) {
|
|
switch ($source) {
|
|
case self::SOURCE_BUNDLED:
|
|
return WFWAF_LOG_PATH;
|
|
case self::SOURCE_BUNDLED:
|
|
default:
|
|
return __DIR__;
|
|
}
|
|
}
|
|
|
|
private static function initializeDatabase($preferredSource, &$isPreferred) {
|
|
$sources = array();
|
|
if ($preferredSource !== self::SOURCE_BUNDLED)
|
|
$sources[] = $preferredSource;
|
|
$sources[] = self::SOURCE_BUNDLED;
|
|
$isPreferred = true;
|
|
foreach ($sources as $source) {
|
|
$directory = self::getDatabaseDirectory($source);
|
|
try {
|
|
$path = $directory . '/' . self::DATABASE_FILE_NAME;
|
|
if (file_exists($path)) //Preemptive check to prevent warnings
|
|
return Database::open($path);
|
|
}
|
|
catch (MmdbThrowable $t) {
|
|
self::logError('Failed to initialize IP location database: ' . $t->getMessage());
|
|
}
|
|
$preferred = false;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static function getInstance($preferredSource = null) {
|
|
if ($preferredSource === null)
|
|
$preferredSource = self::SOURCE_WFLOGS;
|
|
if (!array_key_exists($preferredSource, self::$instances)) {
|
|
$database = self::initializeDatabase($preferredSource, $isPreferred);
|
|
self::$instances[$preferredSource] = new wfIpLocator($database, $isPreferred);
|
|
}
|
|
return self::$instances[$preferredSource];
|
|
}
|
|
|
|
} |