Prehod na novo geoip2 knjiznico za detekcijo lokacije, prenesen modul geoip v admin/survey/modules

This commit is contained in:
pero1203 2020-08-25 10:05:46 +02:00
parent eff6fca973
commit 5c25bcfe53
7 changed files with 534 additions and 424 deletions

View File

@ -1,226 +0,0 @@
<?php
/*
* Modul za dolocanje lokacije na podlagi IP-ja
*
* Zaenkrat se uporablja GeoIP z GeoLiteCity knjiznico
*
*/
class SurveyGeoIP{
var $anketa; # id ankete
var $data = array(); # tabela z ip analizo lokacij
var $countryDB = false;
var $countriesLocationsData = array();
function __construct($anketa){
global $site_url;
// Ce imamo anketo
if ((int)$anketa > 0){
$this->anketa = $anketa;
}
//check if we have data for countries
$sql = sisplet_query("SELECT COUNT(*) AS cnt FROM countries_locations", 'obj');
if($sql->cnt>0)
$this->countryDB = true;
}
public function displayData(){
global $lang;
/*ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);*/
// Zakesiramo podatke o lokacijah
$this->calculateLocations();
//var_dump($this->data);
// Opozorilo o nenatancnosti
echo '<p class="bold">'.$lang['srv_geoip_warning'].'</p>';
echo '<div>';
echo '<div class="floatLeft">';
// Izpis tabele frekvenc
echo '<table class="geoip_table">';
// Prva vrstica
echo '<tr>';
echo '<th>'.$lang['srv_geoip_country'].'</th>';
echo '<th>'.$lang['srv_geoip_city'].'</th>';
echo '<th>'.$lang['srv_geoip_freq'].'</th>';
echo '<th>%</th>';
echo '</tr>';
// Vrstice s podatki
if(isset($this->data['all']))
foreach($this->data['all'] as $country => $country_freq){
if($country !== 'all'){
// Frekvenca po drzavi
$country_percent = ($this->data['freq'] > 0) ? round($country_freq['freq'] / $this->data['freq'], 3) * 100 : 0;
echo '<tr class="country">';
echo '<td>'.($country == '' ? '<i>'.$lang['srv_geoip_unknown'].'<i>' : mb_convert_encoding($country, "UTF-8", "ISO-8859-1")).'</td>';
$cities = mb_convert_encoding($this->data['all'][$country]['cities'], "UTF-8", "ISO-8859-1");
echo '<td>'.(isset($country_freq['showMap']) ? '<a class="fMap rawData" title="'.$lang['srv_view_data_on_map'].'" href="javascript:void(0);" onclick=\'passMapDataRaw('.json_encode($cities).');\'><img src="img_0/Google_Maps_Icon.png" height="24" width="24" /></a></td>' : '');
echo '<td>'.$country_freq['freq'].'</td>';
echo '<td>'.$country_percent.' %</td>';
echo '</tr>';
// Se frekvence po mestih
foreach($this->data['all'][$country]['cities'] as $city => $city_data){
$city_percent = ($this->data['freq'] > 0) ? round($city_data['cnt'] / $this->data['freq'], 3) * 100 : 0;
echo '<tr class="city">';
echo '<td></td>';
echo '<td>'.($city == '' ? '<i>'.$lang['srv_geoip_unknown'].'<i>' : mb_convert_encoding($city, "UTF-8", "ISO-8859-1")).'</td>';
echo '<td>'.$city_data['cnt'].'</td>';
echo '<td>'.$city_percent.' %</td>';
echo '</tr>';
}
}
}
// Zadnja vrstica
echo '<tr class="country">';
echo '<td>'.$lang['hour_total'].'</td>';
echo '<td></td>';
echo '<td>'.$this->data['freq'].'</td>';
echo '<td>100%</td>';
echo '</tr>';
echo '</table>';
echo '</div>';
//google maps on right of table
if(count($this->countriesLocationsData)>0){
echo '<div class="floatLeft" style="margin: 15px 0px 0px 50px;">';
if(count($this->countriesLocationsData)>1)
$this->displayNavigationMaps();
echo '<div id="map_ip" style="width: 800px; height:500px;border-style: solid;border-width: 1px;border-color: #b4b3b3;"></div>';
echo '</div>';
$cities = mb_convert_encoding($this->data['all']['all']['cities'], "UTF-8", "ISO-8859-1");
echo '<script type="text/javascript">passMapDataRaw('.json_encode($cities).');googleMapsAPIProcedura(initializeMapGeneralForIPs);</script>';
}
echo '</div>';
}
// Loop cez response in zackesiramo ip-je in lokacije
private function calculateLocations(){
$sql = sisplet_query("SELECT ip, preview, testdata, last_status, lurker
FROM srv_user
WHERE ank_id='".$this->anketa."' AND testdata='0' AND preview='0' AND deleted='0'");
while($row = mysqli_fetch_array($sql)){
// Ce locimo glede na status
//$index = $row['last_status'].'_'.$row['lurker'];
$index = 'all';
// Shranimo vse podatke za ip
$location_data = geoip_record_by_name($row['ip']);
$this->data['ip'][$row['ip']] = $location_data;
// Frekvence po drzavah
if(isset($this->data[$index][$location_data['country_name']]['freq'])){
$this->data[$index][$location_data['country_name']]['freq']++;
if($location_data['country_name']!='')
$this->countriesLocationsData[$location_data['country_name']]['cnt']++;
}
else{
$this->data[$index][$location_data['country_name']]['freq'] = 1;
//store coordinates for country
if($this->countryDB && $location_data['country_name']!=''){
$sqlc = sisplet_query("SELECT latitude, longitude FROM countries_locations WHERE country_code='".$location_data['country_code']."'", 'obj');
$this->countriesLocationsData[$location_data['country_name']]['cnt'] = 1;
$this->countriesLocationsData[$location_data['country_name']]['lat'] = $sqlc->latitude;
$this->countriesLocationsData[$location_data['country_name']]['lng'] = $sqlc->longitude;
}
}
// Frekvence po mestih
if(isset($this->data[$index][$location_data['country_name']]['cities'][$location_data['city']])){
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']]['cnt']++;
$this->data[$index]['all']['cities'][$location_data['city']]['cnt']++;
}
else{
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']]['cnt'] = 1;
$this->data[$index]['all']['cities'][$location_data['city']]['cnt'] = 1;
if($location_data['city'] !== ''){
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']]['lat'] = floatval($location_data['latitude']);
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']]['lng'] = floatval($location_data['longitude']);
$this->data[$index]['all']['cities'][$location_data['city']]['lat'] = floatval($location_data['latitude']);
$this->data[$index]['all']['cities'][$location_data['city']]['lng'] = floatval($location_data['longitude']);
}
}
if($location_data['city'] == '' && isset($location_data['longitude']) && ($location_data['longitude'] != 0 || $location_data['longitude'] != 0)){
if(isset($this->data[$index][$location_data['country_name']]['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])])){
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['cnt']++;
$this->data[$index]['all']['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['cnt']++;
}
else{
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['cnt'] = 1;
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['lat'] = floatval($location_data['latitude']);
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['lng'] = floatval($location_data['longitude']);
$this->data[$index]['all']['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['cnt'] = 1;
$this->data[$index]['all']['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['lat'] = floatval($location_data['latitude']);
$this->data[$index]['all']['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['lng'] = floatval($location_data['longitude']);
}
}
if(isset($location_data['latitude']) && $location_data['latitude'] !== ""){
$this->data[$index][$location_data['country_name']]['showMap']=1;
$this->data[$index]['all']['showMap']=1;
}
// Frekvenca vseh
if(isset($this->data['freq']))
$this->data['freq']++;
else
$this->data['freq'] = 1;
}
}
function displayNavigationMaps() {
global $lang;
$countries = mb_convert_encoding($this->countriesLocationsData, "UTF-8", "ISO-8859-1");
$cities = mb_convert_encoding($this->data['all']['all']['cities'], "UTF-8", "ISO-8859-1");
echo '<div class="secondNavigation">';
echo '<ul class="secondNavigation">';
echo'<li>';
echo '<a class="no-img active" id="geoip_cities" onclick=\'geoip_map_navigation_toggle(this, '.json_encode($cities).');\'>';
echo '<span class="label">' . $lang['srv_geoip_map_cities'] . '</span>';
echo '</a>';
echo'</li>';
#space
echo'<li class="space">';
// onclick=\'passMapDataRaw('.json_encode($countries).');googleMapsAPIProcedura(initializeMapGeneralForIPs);\'
//echo '<td>'.($this->countryDB ? '<a class="fMap rawData" title="'.$lang['srv_view_data_on_map'].'" href="javascript:void(0);" onclick=\'passMapDataRaw('.json_encode($countries).');\'><img src="img_0/Google_Maps_Icon.png" height="24" width="24" /></a></td>' : '');
//echo '<td>'.(isset($country_freq['showMap']) ? '<a class="fMap rawData" title="'.$lang['srv_view_data_on_map'].'" href="javascript:void(0);" onclick=\'passMapDataRaw('.json_encode($cities).');\'><img src="img_0/Google_Maps_Icon.png" height="24" width="24" /></a></td>' : '');
echo'<li>';
echo '<a class="no-img" id="geoip_countries" onclick=\'geoip_map_navigation_toggle(this, '.json_encode($countries).');\'>';
echo '<span class="label">' . $lang['srv_geoip_map_countries'] . '</span>';
echo '</a>';
echo'</li>';
echo'</ul>';
echo '</div>';
echo '<br class="clr" />';
echo '<br class="clr" />';
}
}

View File

@ -0,0 +1,276 @@
<?php
/*
* Modul za dolocanje lokacije na podlagi IP-ja
*
* Po novem se uporablja GeoIP2 z GeoLiteCity knjiznico
*
*/
use GeoIp2\Database\Reader;
class SurveyGeoIP{
var $anketa; # id ankete
var $data = array(); # tabela z ip analizo lokacij
var $countryDB = false;
var $countriesLocationsData = array();
function __construct($anketa){
global $site_url;
// Ce imamo anketo
if ((int)$anketa > 0){
$this->anketa = $anketa;
}
// Check if we have data for countries
$sql = sisplet_query("SELECT COUNT(*) AS cnt FROM countries_locations", 'obj');
if($sql->cnt > 0){
$this->countryDB = true;
}
}
public function displayData(){
global $lang;
// Zakesiramo podatke o lokacijah
$this->calculateLocations();
//var_dump($this->data);
// Opozorilo o nenatancnosti
echo '<p class="bold">'.$lang['srv_geoip_warning'].'</p>';
echo '<div>';
echo '<div class="floatLeft">';
// Izpis tabele frekvenc
echo '<table class="geoip_table">';
// Prva vrstica
echo '<tr>';
echo '<th>'.$lang['srv_geoip_country'].'</th>';
echo '<th>'.$lang['srv_geoip_city'].'</th>';
echo '<th>'.$lang['srv_geoip_freq'].'</th>';
echo '<th>%</th>';
echo '</tr>';
// Vrstice s podatki
if(isset($this->data['all'])){
foreach($this->data['all'] as $country => $country_freq){
if($country !== 'all'){
// Frekvenca po drzavi
$country_percent = ($this->data['freq'] > 0) ? round($country_freq['freq'] / $this->data['freq'], 3) * 100 : 0;
echo '<tr class="country">';
echo '<td>'.($country == '' ? '<i>'.$lang['srv_geoip_unknown'].'<i>' : mb_convert_encoding($country, "UTF-8", "ISO-8859-1")).'</td>';
$cities = mb_convert_encoding($this->data['all'][$country]['cities'], "UTF-8", "ISO-8859-1");
echo '<td>'.(isset($country_freq['showMap']) ? '<a class="fMap rawData" title="'.$lang['srv_view_data_on_map'].'" href="javascript:void(0);" onclick=\'passMapDataRaw('.json_encode($cities).');\'><img src="img_0/Google_Maps_Icon.png" height="24" width="24" /></a></td>' : '');
echo '<td>'.$country_freq['freq'].'</td>';
echo '<td>'.$country_percent.' %</td>';
echo '</tr>';
// Se frekvence po mestih
foreach($this->data['all'][$country]['cities'] as $city => $city_data){
$city_percent = ($this->data['freq'] > 0) ? round($city_data['cnt'] / $this->data['freq'], 3) * 100 : 0;
echo '<tr class="city">';
echo '<td></td>';
echo '<td>'.($city == '' ? '<i>'.$lang['srv_geoip_unknown'].'<i>' : mb_convert_encoding($city, "UTF-8", "ISO-8859-1")).'</td>';
echo '<td>'.$city_data['cnt'].'</td>';
echo '<td>'.$city_percent.' %</td>';
echo '</tr>';
}
}
}
}
// Zadnja vrstica
echo '<tr class="country">';
echo '<td>'.$lang['hour_total'].'</td>';
echo '<td></td>';
echo '<td>'.$this->data['freq'].'</td>';
echo '<td>100%</td>';
echo '</tr>';
echo '</table>';
echo '</div>';
// Google maps on right of table
if(count($this->countriesLocationsData)>0){
echo '<div class="floatLeft" style="margin: 15px 0px 0px 50px;">';
if(count($this->countriesLocationsData) > 1)
$this->displayNavigationMaps();
echo '<div id="map_ip" style="width: 800px; height:500px;border-style: solid;border-width: 1px;border-color: #b4b3b3;"></div>';
echo '</div>';
$cities = mb_convert_encoding($this->data['all']['all']['cities'], "UTF-8", "ISO-8859-1");
echo '<script type="text/javascript">passMapDataRaw('.json_encode($cities).');googleMapsAPIProcedura(initializeMapGeneralForIPs);</script>';
}
echo '</div>';
}
// Loop cez response in zackesiramo ip-je in lokacije
private function calculateLocations(){
global $site_path;
global $lang;
// Inicializiramo reader s knjiznico ip lokacij
$reader = new Reader($site_path.'admin/survey/modules/mod_geoIP/db/GeoLite2-City.mmdb');
//$reader = new Reader($site_path.'admin/survey/modules/mod_geoIP/db/GeoLite2-Country.mmdb');
$sql = sisplet_query("SELECT ip, preview, testdata, last_status, lurker
FROM srv_user
WHERE ank_id='".$this->anketa."' AND testdata='0' AND preview='0' AND deleted='0'
");
while($row = mysqli_fetch_array($sql)){
// Ce locimo glede na status
//$index = $row['last_status'].'_'.$row['lurker'];
$index = 'all';
// Poskusimo ustvariti objekt z lokacijo za IP
$unknown_location = false;
try {
$location_object = $reader->city($row['ip']);
}
catch (Exception $e) {
//echo 'Error: ', $e->getMessage();
$unknown_location = true;
}
// Ce ni ip-ja v bazi gre za neznano lokacijo
if($unknown_location){
$location_data['country_name'] = $lang['srv_unknown'];
$location_data['country_code'] = '';
$location_data['city'] = $lang['srv_unknown'];
$location_data['longitude'] = '';
$location_data['latitude'] = '';
}
// Drugace preberemo iz knjiznice podatke o lokaciji
else{
$location_data['country_name'] = $location_object->country->name;
$location_data['country_code'] = $location_object->country->isoCode;
$location_data['city'] = $location_object->city->name;
$location_data['longitude'] = $location_object->location->longitude;
$location_data['latitude'] = $location_object->location->latitude;
}
// Frekvence po drzavah
if(isset($this->data[$index][$location_data['country_name']]['freq'])){
$this->data[$index][$location_data['country_name']]['freq']++;
if($location_data['country_name']!='')
$this->countriesLocationsData[$location_data['country_name']]['cnt']++;
}
else{
$this->data[$index][$location_data['country_name']]['freq'] = 1;
//store coordinates for country
if($this->countryDB && $location_data['country_name'] != '' && $location_data['country_name'] != $lang['srv_unknown']){
$sqlc = sisplet_query("SELECT latitude, longitude FROM countries_locations WHERE country_code='".$location_data['country_code']."'", 'obj');
$this->countriesLocationsData[$location_data['country_name']]['cnt'] = 1;
$this->countriesLocationsData[$location_data['country_name']]['lat'] = $sqlc->latitude;
$this->countriesLocationsData[$location_data['country_name']]['lng'] = $sqlc->longitude;
}
}
// Frekvence po mestih
if(isset($this->data[$index][$location_data['country_name']]['cities'][$location_data['city']])){
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']]['cnt']++;
$this->data[$index]['all']['cities'][$location_data['city']]['cnt']++;
}
else{
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']]['cnt'] = 1;
$this->data[$index]['all']['cities'][$location_data['city']]['cnt'] = 1;
if($location_data['city'] != '' && $location_data['city'] != $lang['srv_unknown']){
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']]['lat'] = floatval($location_data['latitude']);
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']]['lng'] = floatval($location_data['longitude']);
$this->data[$index]['all']['cities'][$location_data['city']]['lat'] = floatval($location_data['latitude']);
$this->data[$index]['all']['cities'][$location_data['city']]['lng'] = floatval($location_data['longitude']);
}
}
// Mesto ni znano, imamo pa koordinate
if($location_data['city'] == '' && isset($location_data['longitude']) && $location_data['longitude'] != '' && isset($location_data['latitude']) && $location_data['latitude'] != ''){
if(isset($this->data[$index][$location_data['country_name']]['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])])){
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['cnt']++;
$this->data[$index]['all']['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['cnt']++;
}
else{
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['cnt'] = 1;
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['lat'] = floatval($location_data['latitude']);
$this->data[$index][$location_data['country_name']]['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['lng'] = floatval($location_data['longitude']);
$this->data[$index]['all']['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['cnt'] = 1;
$this->data[$index]['all']['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['lat'] = floatval($location_data['latitude']);
$this->data[$index]['all']['cities'][$location_data['city']][''.floatval($location_data['latitude']).floatval($location_data['longitude'])]['lng'] = floatval($location_data['longitude']);
}
}
if(isset($location_data['latitude']) && $location_data['latitude'] != ''){
$this->data[$index][$location_data['country_name']]['showMap'] = 1;
$this->data[$index]['all']['showMap'] = 1;
}
// Frekvenca vseh
if(isset($this->data['freq']))
$this->data['freq']++;
else
$this->data['freq'] = 1;
}
}
function displayNavigationMaps() {
global $lang;
$countries = mb_convert_encoding($this->countriesLocationsData, "UTF-8", "ISO-8859-1");
$cities = mb_convert_encoding($this->data['all']['all']['cities'], "UTF-8", "ISO-8859-1");
echo '<div class="secondNavigation">';
echo '<ul class="secondNavigation">';
echo'<li>';
echo '<a class="no-img active" id="geoip_cities" onclick=\'geoip_map_navigation_toggle(this, '.json_encode($cities).');\'>';
echo '<span class="label">' . $lang['srv_geoip_map_cities'] . '</span>';
echo '</a>';
echo'</li>';
#space
echo'<li class="space">';
echo'</li>';
echo'<li>';
echo '<a class="no-img" id="geoip_countries" onclick=\'geoip_map_navigation_toggle(this, '.json_encode($countries).');\'>';
echo '<span class="label">' . $lang['srv_geoip_map_countries'] . '</span>';
echo '</a>';
echo'</li>';
echo'</ul>';
echo '</div>';
echo '<br class="clr" />';
echo '<br class="clr" />';
}
}

View File

@ -0,0 +1,2 @@
*
!.gitignore

View File

@ -18,7 +18,8 @@
"sonata-project/google-authenticator": "^2.2",
"phpmailer/phpmailer": "~6.0",
"minishlink/web-push": "^5.2",
"stripe/stripe-php": "^7.40"
"stripe/stripe-php": "^7.40",
"geoip2/geoip2": "~2.0"
},
"require-dev": {
"kint-php/kint": "^1.1",

447
composer.lock generated
View File

@ -1,11 +1,68 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"content-hash": "5beee59315d18e9164ddfcc230b4550f",
"hash": "f48f2e76d23925213a1c248388654ed4",
"content-hash": "4faadcc7d5b72636e2d9ac9a18b062a2",
"packages": [
{
"name": "composer/ca-bundle",
"version": "1.2.8",
"source": {
"type": "git",
"url": "https://github.com/composer/ca-bundle.git",
"reference": "8a7ecad675253e4654ea05505233285377405215"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/8a7ecad675253e4654ea05505233285377405215",
"reference": "8a7ecad675253e4654ea05505233285377405215",
"shasum": ""
},
"require": {
"ext-openssl": "*",
"ext-pcre": "*",
"php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
"phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
"psr/log": "^1.0",
"symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"Composer\\CaBundle\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be"
}
],
"description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
"keywords": [
"cabundle",
"cacert",
"certificate",
"ssl",
"tls"
],
"time": "2020-08-23 12:54:47"
},
{
"name": "fgrosse/phpasn1",
"version": "v2.1.1",
@ -73,7 +130,60 @@
"x509",
"x690"
],
"time": "2018-12-02T01:34:34+00:00"
"time": "2018-12-02 01:34:34"
},
{
"name": "geoip2/geoip2",
"version": "v2.10.0",
"source": {
"type": "git",
"url": "https://github.com/maxmind/GeoIP2-php.git",
"reference": "419557cd21d9fe039721a83490701a58c8ce784a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/419557cd21d9fe039721a83490701a58c8ce784a",
"reference": "419557cd21d9fe039721a83490701a58c8ce784a",
"shasum": ""
},
"require": {
"ext-json": "*",
"maxmind-db/reader": "~1.5",
"maxmind/web-service-common": "~0.6",
"php": ">=5.6"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "2.*",
"phpunit/phpunit": "5.*",
"squizlabs/php_codesniffer": "3.*"
},
"type": "library",
"autoload": {
"psr-4": {
"GeoIp2\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Gregory J. Oschwald",
"email": "goschwald@maxmind.com",
"homepage": "https://www.maxmind.com/"
}
],
"description": "MaxMind GeoIP2 PHP API",
"homepage": "https://github.com/maxmind/GeoIP2-php",
"keywords": [
"IP",
"geoip",
"geoip2",
"geolocation",
"maxmind"
],
"time": "2019-12-12 18:48:39"
},
{
"name": "guzzlehttp/guzzle",
@ -140,7 +250,7 @@
"rest",
"web service"
],
"time": "2020-06-16T21:01:06+00:00"
"time": "2020-06-16 21:01:06"
},
{
"name": "guzzlehttp/promises",
@ -191,7 +301,7 @@
"keywords": [
"promise"
],
"time": "2016-12-20T10:07:11+00:00"
"time": "2016-12-20 10:07:11"
},
{
"name": "guzzlehttp/psr7",
@ -262,7 +372,113 @@
"uri",
"url"
],
"time": "2019-07-01T23:21:34+00:00"
"time": "2019-07-01 23:21:34"
},
{
"name": "maxmind-db/reader",
"version": "v1.7.0",
"source": {
"type": "git",
"url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
"reference": "942553da239f12051275f9c666538b5dd09e2908"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/942553da239f12051275f9c666538b5dd09e2908",
"reference": "942553da239f12051275f9c666538b5dd09e2908",
"shasum": ""
},
"require": {
"php": ">=7.2"
},
"conflict": {
"ext-maxminddb": "<1.7.0,>=2.0.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "2.*",
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpcov": ">=6.0.0",
"phpunit/phpunit": ">=8.0.0,<10.0.0",
"squizlabs/php_codesniffer": "3.*"
},
"suggest": {
"ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
"ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
"ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
},
"type": "library",
"autoload": {
"psr-4": {
"MaxMind\\Db\\": "src/MaxMind/Db"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Gregory J. Oschwald",
"email": "goschwald@maxmind.com",
"homepage": "https://www.maxmind.com/"
}
],
"description": "MaxMind DB Reader API",
"homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php",
"keywords": [
"database",
"geoip",
"geoip2",
"geolocation",
"maxmind"
],
"time": "2020-08-07 22:10:05"
},
{
"name": "maxmind/web-service-common",
"version": "v0.7.0",
"source": {
"type": "git",
"url": "https://github.com/maxmind/web-service-common-php.git",
"reference": "74c996c218ada5c639c8c2f076756e059f5552fc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/74c996c218ada5c639c8c2f076756e059f5552fc",
"reference": "74c996c218ada5c639c8c2f076756e059f5552fc",
"shasum": ""
},
"require": {
"composer/ca-bundle": "^1.0.3",
"ext-curl": "*",
"ext-json": "*",
"php": ">=5.6"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "2.*",
"phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0",
"squizlabs/php_codesniffer": "3.*"
},
"type": "library",
"autoload": {
"psr-4": {
"MaxMind\\Exception\\": "src/Exception",
"MaxMind\\WebService\\": "src/WebService"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Gregory Oschwald",
"email": "goschwald@maxmind.com"
}
],
"description": "Internal MaxMind Web Service API",
"homepage": "https://github.com/maxmind/web-service-common-php",
"time": "2020-05-06 14:07:26"
},
{
"name": "minishlink/web-push",
@ -318,7 +534,7 @@
"push",
"web"
],
"time": "2020-08-02T08:58:01+00:00"
"time": "2020-08-02 08:58:01"
},
{
"name": "paragonie/random_compat",
@ -363,7 +579,7 @@
"pseudorandom",
"random"
],
"time": "2018-07-02T15:55:56+00:00"
"time": "2018-07-02 15:55:56"
},
{
"name": "paragonie/sodium_compat",
@ -445,7 +661,7 @@
"secret-key cryptography",
"side-channel resistant"
],
"time": "2020-03-20T21:48:09+00:00"
"time": "2020-03-20 21:48:09"
},
{
"name": "phpmailer/phpmailer",
@ -507,13 +723,7 @@
}
],
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"funding": [
{
"url": "https://github.com/synchro",
"type": "github"
}
],
"time": "2020-07-14T18:50:27+00:00"
"time": "2020-07-14 18:50:27"
},
{
"name": "psr/http-message",
@ -563,7 +773,7 @@
"request",
"response"
],
"time": "2016-08-06T14:39:51+00:00"
"time": "2016-08-06 14:39:51"
},
{
"name": "ralouphie/getallheaders",
@ -603,7 +813,7 @@
}
],
"description": "A polyfill for getallheaders.",
"time": "2019-03-08T08:55:37+00:00"
"time": "2019-03-08 08:55:37"
},
{
"name": "sonata-project/google-authenticator",
@ -660,7 +870,7 @@
"keywords": [
"google authenticator"
],
"time": "2018-07-18T22:08:02+00:00"
"time": "2018-07-18 22:08:02"
},
{
"name": "spomky-labs/base64url",
@ -712,7 +922,7 @@
"safe",
"url"
],
"time": "2020-08-01T14:15:43+00:00"
"time": "2020-08-01 14:15:43"
},
{
"name": "stripe/stripe-php",
@ -769,7 +979,7 @@
"payment processing",
"stripe"
],
"time": "2020-08-19T22:48:20+00:00"
"time": "2020-08-19 22:48:20"
},
{
"name": "symfony/polyfill-intl-idn",
@ -840,21 +1050,7 @@
"portable",
"shim"
],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-08-04T06:02:08+00:00"
"time": "2020-08-04 06:02:08"
},
{
"name": "symfony/polyfill-intl-normalizer",
@ -921,21 +1117,7 @@
"portable",
"shim"
],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-07-14T12:35:20+00:00"
"time": "2020-07-14 12:35:20"
},
{
"name": "symfony/polyfill-php70",
@ -998,21 +1180,7 @@
"portable",
"shim"
],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-07-14T12:35:20+00:00"
"time": "2020-07-14 12:35:20"
},
{
"name": "symfony/polyfill-php72",
@ -1071,21 +1239,7 @@
"portable",
"shim"
],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-07-14T12:35:20+00:00"
"time": "2020-07-14 12:35:20"
},
{
"name": "web-token/jwt-core",
@ -1160,13 +1314,7 @@
"jwt",
"symfony"
],
"funding": [
{
"url": "https://www.patreon.com/FlorentMorselli",
"type": "patreon"
}
],
"time": "2020-03-20T13:29:04+00:00"
"time": "2020-03-20 13:29:04"
},
{
"name": "web-token/jwt-key-mgmt",
@ -1243,13 +1391,7 @@
"jwt",
"symfony"
],
"funding": [
{
"url": "https://www.patreon.com/FlorentMorselli",
"type": "patreon"
}
],
"time": "2020-03-20T13:29:04+00:00"
"time": "2020-03-20 13:29:04"
},
{
"name": "web-token/jwt-signature",
@ -1329,13 +1471,7 @@
"jwt",
"symfony"
],
"funding": [
{
"url": "https://www.patreon.com/FlorentMorselli",
"type": "patreon"
}
],
"time": "2020-03-20T13:29:04+00:00"
"time": "2020-03-20 13:29:04"
},
{
"name": "web-token/jwt-signature-algorithm-ecdsa",
@ -1402,13 +1538,7 @@
"jwt",
"symfony"
],
"funding": [
{
"url": "https://www.patreon.com/FlorentMorselli",
"type": "patreon"
}
],
"time": "2020-03-20T13:29:04+00:00"
"time": "2020-03-20 13:29:04"
},
{
"name": "web-token/jwt-signature-algorithm-eddsa",
@ -1475,13 +1605,7 @@
"jwt",
"symfony"
],
"funding": [
{
"url": "https://www.patreon.com/FlorentMorselli",
"type": "patreon"
}
],
"time": "2020-03-20T13:29:04+00:00"
"time": "2020-03-20 13:29:04"
},
{
"name": "web-token/jwt-signature-algorithm-hmac",
@ -1548,13 +1672,7 @@
"jwt",
"symfony"
],
"funding": [
{
"url": "https://www.patreon.com/FlorentMorselli",
"type": "patreon"
}
],
"time": "2020-03-20T13:29:04+00:00"
"time": "2020-03-20 13:29:04"
},
{
"name": "web-token/jwt-signature-algorithm-none",
@ -1621,13 +1739,7 @@
"jwt",
"symfony"
],
"funding": [
{
"url": "https://www.patreon.com/FlorentMorselli",
"type": "patreon"
}
],
"time": "2020-03-20T13:29:04+00:00"
"time": "2020-03-20 13:29:04"
},
{
"name": "web-token/jwt-signature-algorithm-rsa",
@ -1694,13 +1806,7 @@
"jwt",
"symfony"
],
"funding": [
{
"url": "https://www.patreon.com/FlorentMorselli",
"type": "patreon"
}
],
"time": "2020-03-20T13:29:04+00:00"
"time": "2020-03-20 13:29:04"
},
{
"name": "web-token/jwt-util-ecc",
@ -1769,13 +1875,7 @@
"jwt",
"symfony"
],
"funding": [
{
"url": "https://www.patreon.com/FlorentMorselli",
"type": "patreon"
}
],
"time": "2020-03-20T13:29:04+00:00"
"time": "2020-03-20 13:29:04"
}
],
"packages-dev": [
@ -1838,7 +1938,7 @@
"throwable",
"whoops"
],
"time": "2020-06-14T09:00:00+00:00"
"time": "2020-06-14 09:00:00"
},
{
"name": "kint-php/kint",
@ -1889,7 +1989,7 @@
"kint",
"php"
],
"time": "2017-01-15T14:23:43+00:00"
"time": "2017-01-15 14:23:43"
},
{
"name": "maximebf/debugbar",
@ -1950,7 +2050,7 @@
"debug",
"debugbar"
],
"time": "2020-05-06T07:06:27+00:00"
"time": "2020-05-06 07:06:27"
},
{
"name": "psr/log",
@ -1997,7 +2097,7 @@
"psr",
"psr-3"
],
"time": "2020-03-23T09:12:05+00:00"
"time": "2020-03-23 09:12:05"
},
{
"name": "symfony/polyfill-mbstring",
@ -2060,21 +2160,7 @@
"portable",
"shim"
],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-07-14T12:35:20+00:00"
"time": "2020-07-14 12:35:20"
},
{
"name": "symfony/polyfill-php80",
@ -2140,21 +2226,7 @@
"portable",
"shim"
],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-07-14T12:35:20+00:00"
"time": "2020-07-14 12:35:20"
},
{
"name": "symfony/var-dumper",
@ -2231,21 +2303,7 @@
"debug",
"dump"
],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-06-24T13:34:53+00:00"
"time": "2020-06-24 13:34:53"
}
],
"aliases": [],
@ -2256,6 +2314,5 @@
"platform": {
"php": "^5.5|^7.0"
},
"platform-dev": [],
"plugin-api-version": "1.1.0"
"platform-dev": []
}

View File

@ -6318,7 +6318,7 @@ $lang = array (
'srv_geoip_unknown' => 'Neznano',
'srv_geoip_map_cities' => 'Vsa mesta',
'srv_geoip_map_countries' => 'Vse države',
'srv_geoip_warning' => 'Prosimo, upoštevajte, da so navedene IP lokacije lahko v določenih primerih nenatančne in zgolj ocene. Ocenjene so na podlagi knjižnice IP lokacij (verzija 2019), zato lahko pride do odstopanj od realnih podatkov.',
'srv_geoip_warning' => 'Prosimo, upoštevajte, da so navedene IP lokacije lahko v določenih primerih nenatančne in zgolj ocene. Ocenjene so na podlagi knjižnice IP lokacij, zato lahko pride do odstopanj od realnih podatkov.',
'srv_edits_analysis' => 'Analize urejanja',
'srv_edits_analysis_seansa' => 'Kriterij seanse: ',
'srv_edits_analysis_seansa_1h' => '1 ura',

View File

@ -6201,7 +6201,7 @@ $lang = array (
'srv_geoip_unknown' => 'Unknown',
'srv_geoip_map_cities' => 'All cities',
'srv_geoip_map_countries' => 'All countries',
'srv_geoip_warning' => 'Please note that the listed IP locations may in certain cases be inaccurate and are only estimates. They are estimated based on the library of IP locations (version 2019), so there may be deviations from the real data.',
'srv_geoip_warning' => 'Please note that the listed IP locations may in certain cases be inaccurate and are only estimates. They are estimated based on the library of IP locations, so there may be deviations from the real data.',
'srv_edits_analysis' => 'Edits analysis',
'srv_edits_analysis_seansa' => 'Session criteria: ',
'srv_edits_analysis_seansa_1h' => '1 hour',