283 lines
6.8 KiB
PHP
Executable File
283 lines
6.8 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* @author Amasty Team
|
|
* @copyright Copyright (c) Amasty (https://www.amasty.com)
|
|
* @package GeoIP Data for Magento 2 (System)
|
|
*/
|
|
|
|
namespace Amasty\Geoip\Helper;
|
|
|
|
use Magento\Config\App\Config\Type\System;
|
|
use Magento\Framework\App\Cache\StateInterface;
|
|
use Magento\Framework\App\Cache\Type\Config;
|
|
use Magento\Framework\App\Config\ConfigResource\ConfigInterface;
|
|
use Magento\Framework\App\Filesystem\DirectoryList;
|
|
use Magento\Framework\App\Helper\AbstractHelper;
|
|
use Magento\Framework\App\Helper\Context;
|
|
use Magento\Framework\Exception\FileSystemException;
|
|
use Magento\Framework\Filesystem\Driver\File;
|
|
use Magento\Framework\ObjectManagerInterface;
|
|
|
|
class Data extends AbstractHelper
|
|
{
|
|
public const BLOCK_FILE = 'amgeoip/general/block_file_url';
|
|
public const BLOCK_V6_FILE = 'amgeoip/general/block_v6_file_url';
|
|
public const LOCATION_FILE = 'amgeoip/general/location_file_url';
|
|
public const BLOCK_HASH = 'amgeoip/general/block_hash_url';
|
|
public const BLOCK_V6_HASH = 'amgeoip/general/block_v6_hash_url';
|
|
public const LOCATION_HASH = 'amgeoip/general/location_hash_url';
|
|
public const FORCED_IP_ENABLED = 'amgeoip/debug/force_ip_enabled';
|
|
public const FORCED_IP = 'amgeoip/debug/forced_ip';
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
public $_geoipCsvFiles = [
|
|
'block' => 'GeoLite2-City-Blocks-IPv4.csv',
|
|
'block_v6' => 'GeoLite2-City-Blocks-IPv6.csv',
|
|
'location' => 'GeoLite2-City-Locations-en.csv'
|
|
];
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
public $_geoipIgnoredLines = [
|
|
'block' => 1,
|
|
'block_v6' => 1,
|
|
'location' => 1
|
|
];
|
|
|
|
/**
|
|
* @var DirectoryList
|
|
*/
|
|
protected $directoryList;
|
|
|
|
/**
|
|
* Resource model of config data
|
|
*
|
|
* @var ConfigInterface
|
|
*/
|
|
protected $_resource;
|
|
|
|
/**
|
|
* @var StateInterface $_state
|
|
*/
|
|
protected $_state;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
protected $_cacheEnabled;
|
|
|
|
/**
|
|
* @var File
|
|
*/
|
|
private $fileDriver;
|
|
|
|
/**
|
|
* @var ObjectManagerInterface
|
|
*/
|
|
private $objectManager;
|
|
|
|
public function __construct(
|
|
Context $context,
|
|
DirectoryList $directoryList,
|
|
ConfigInterface $_resource,
|
|
StateInterface $state,
|
|
File $fileDriver,
|
|
ObjectManagerInterface $objectManager
|
|
) {
|
|
parent::__construct($context);
|
|
$this->directoryList = $directoryList;
|
|
$this->_resource = $_resource;
|
|
$this->fileDriver = $fileDriver;
|
|
$this->_state = $state;
|
|
$this->objectManager = $objectManager;
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getUrlBlockFile()
|
|
{
|
|
return $this->scopeConfig->getValue(self::BLOCK_FILE);
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getUrlBlockV6File()
|
|
{
|
|
return $this->scopeConfig->getValue(self::BLOCK_V6_FILE);
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getUrlLocationFile()
|
|
{
|
|
return $this->scopeConfig->getValue(self::LOCATION_FILE);
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getHashUrlBlock()
|
|
{
|
|
return $this->scopeConfig->getValue(self::BLOCK_HASH);
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getHashUrlBlockV6()
|
|
{
|
|
return $this->scopeConfig->getValue(self::BLOCK_V6_HASH);
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getHashUrlLocation()
|
|
{
|
|
return $this->scopeConfig->getValue(self::LOCATION_HASH);
|
|
}
|
|
|
|
/**
|
|
* @param bool $flushCache
|
|
* @return bool
|
|
*/
|
|
public function isDone($flushCache = true)
|
|
{
|
|
if ($flushCache) {
|
|
$this->flushConfigCache();
|
|
}
|
|
|
|
return $this->scopeConfig->getValue('amgeoip/import/location')
|
|
&& $this->scopeConfig->getValue('amgeoip/import/block')
|
|
&& $this->scopeConfig->getValue('amgeoip/import/block_v6');
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
public function resetDone()
|
|
{
|
|
$this->_resource->saveConfig('amgeoip/import/block', 0, 'default', 0);
|
|
$this->_resource->saveConfig('amgeoip/import/block_v6', 0, 'default', 0);
|
|
$this->_resource->saveConfig('amgeoip/import/location', 0, 'default', 0);
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
* @throws FileSystemException
|
|
*/
|
|
public function getDirPath()
|
|
{
|
|
$varDir = $this->directoryList->getPath('var');
|
|
|
|
$dir = $varDir . DIRECTORY_SEPARATOR . 'amasty' . DIRECTORY_SEPARATOR . 'geoip';
|
|
|
|
return $dir;
|
|
}
|
|
|
|
/**
|
|
* @param $type
|
|
* @return string
|
|
* @throws FileSystemException
|
|
*/
|
|
public function getCsvFilePath($type)
|
|
{
|
|
$dir = $this->getDirPath();
|
|
$file = $dir . DIRECTORY_SEPARATOR . $this->_geoipCsvFiles[$type];
|
|
|
|
return $file;
|
|
}
|
|
|
|
/**
|
|
* is file exist
|
|
*
|
|
* @param string $filePath
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isFileExist($filePath)
|
|
{
|
|
try {
|
|
return $this->fileDriver->isExists($filePath);
|
|
} catch (FileSystemException $exception) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
public function flushConfigCache()
|
|
{
|
|
if (class_exists(System::class)) {
|
|
$this->objectManager->get(System::class)->clean();
|
|
} else {
|
|
$this->objectManager->get(Config::class)
|
|
->clean(
|
|
\Zend_Cache::CLEANING_MODE_MATCHING_TAG,
|
|
['config_scopes']
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $type
|
|
* @return bool
|
|
*/
|
|
public function isCacheEnabled($type)
|
|
{
|
|
if (!isset($this->_cacheEnabled)) {
|
|
$this->_cacheEnabled = $this->_state->isEnabled($type);
|
|
}
|
|
|
|
return $this->_cacheEnabled;
|
|
}
|
|
|
|
/**
|
|
* @param $ip
|
|
*
|
|
* @return string
|
|
*
|
|
* @throws \Exception
|
|
*/
|
|
public function getLongIpV6($ip)
|
|
{
|
|
$ipN = inet_pton($ip);
|
|
$binary = '';
|
|
for ($bit = strlen($ipN) - 1; $bit >= 0; $bit--) {
|
|
$binary = sprintf('%08b', ord($ipN[$bit])) . $binary;
|
|
}
|
|
|
|
if (function_exists('gmp_init')) {
|
|
return gmp_strval(gmp_init($binary, 2), 10);
|
|
} elseif (function_exists('bcadd')) {
|
|
$decimal = '0';
|
|
$strLength = strlen($binary);
|
|
for ($i = 0; $i < $strLength; $i++) {
|
|
$decimal = bcmul($decimal, '2', 0);
|
|
$decimal = bcadd($decimal, $binary[$i], 0);
|
|
}
|
|
|
|
return $decimal;
|
|
} else {
|
|
throw new \Magento\Framework\Exception\LocalizedException(__('GMP or BCMATH extension not installed!'));
|
|
}
|
|
}
|
|
|
|
public function isForcedIpEnabled(): bool
|
|
{
|
|
return $this->scopeConfig->isSetFlag(self::FORCED_IP_ENABLED);
|
|
}
|
|
|
|
public function getForcedIp(): ?string
|
|
{
|
|
return $this->scopeConfig->getValue(self::FORCED_IP);
|
|
}
|
|
}
|