230 lines
6.7 KiB
PHP
230 lines
6.7 KiB
PHP
<?php
|
|
/*
|
|
Copyright 2013-2019 Yellow Tree, Siegen, Germany
|
|
Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
|
|
|
|
function geoip_detect_menu() {
|
|
require_once ABSPATH . '/wp-admin/admin.php';
|
|
add_submenu_page('tools.php', __('GeoIP Detection Lookup', 'geoip-detect'), __('GeoIP Lookup', 'geoip-detect'), 'activate_plugins', GEOIP_PLUGIN_BASENAME, 'geoip_detect_lookup_page');
|
|
add_options_page(__('GeoIP Detection', 'geoip-detect'), __('GeoIP Detection', 'geoip-detect'), 'manage_options', GEOIP_PLUGIN_BASENAME, 'geoip_detect_option_page');
|
|
}
|
|
add_action('admin_menu', 'geoip_detect_menu');
|
|
|
|
function geoip_detect_add_settings_link( $links ) {
|
|
$link = '<a href="tools.php?page=' . GEOIP_PLUGIN_BASENAME . '">' . __('Lookup', 'geoip-detect') . '</a>';
|
|
array_push( $links, $link );
|
|
|
|
$link = '<a href="options-general.php?page=' . GEOIP_PLUGIN_BASENAME . '">' . __('Options', 'geoip-detect') . '</a>';
|
|
array_push( $links, $link );
|
|
|
|
return $links;
|
|
}
|
|
add_filter( "plugin_action_links_" . GEOIP_PLUGIN_BASENAME, 'geoip_detect_add_settings_link' );
|
|
|
|
|
|
// ------------- Admin GUI --------------------
|
|
|
|
function geoip_detect_verify_nonce($action) {
|
|
$nonce = isset($_POST['_wpnonce']) ? $_POST['_wpnonce'] : '';
|
|
return wp_verify_nonce( $nonce, 'geoip_detect_' . $action );
|
|
}
|
|
|
|
function geoip_detect_lookup_page()
|
|
{
|
|
if (!is_admin())
|
|
return;
|
|
|
|
$ip_lookup_result = false;
|
|
$message = '';
|
|
$action = isset($_POST['action']) ? $_POST['action'] : '';
|
|
|
|
if (geoip_detect_verify_nonce($action)) {
|
|
switch($action) {
|
|
case 'lookup':
|
|
if (isset($_POST['ip']))
|
|
{
|
|
$request_ip = $_POST['ip'];
|
|
$request_skipCache = !empty($_POST['skip_cache']);
|
|
$options = array('skipCache' => $request_skipCache);
|
|
|
|
$request_locales = null;
|
|
if (!empty($_POST['locales']))
|
|
$request_locales = explode(',', $_POST['locales']);
|
|
|
|
$start = microtime(true);
|
|
$ip_lookup_result = geoip_detect2_get_info_from_ip($request_ip, $request_locales, $options);
|
|
$end = microtime(true);
|
|
$ip_lookup_duration = $end - $start;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
include_once(GEOIP_PLUGIN_DIR . '/views/lookup.php');
|
|
}
|
|
|
|
function geoip_detect_option_page() {
|
|
if (!is_admin() || !current_user_can('manage_options'))
|
|
return;
|
|
|
|
if (isset($_GET['geoip_detect_part'])) {
|
|
switch ($_GET['geoip_detect_part']) {
|
|
case 'client-ip':
|
|
return geoip_detect_option_client_ip_page();
|
|
break;
|
|
}
|
|
}
|
|
|
|
$registry = DataSourceRegistry::getInstance();
|
|
$sources = $registry->getAllSources();
|
|
|
|
$message = '';
|
|
|
|
$numeric_options = array('set_css_country', 'has_reverse_proxy', 'disable_pagecache', 'ajax_enabled', 'ajax_enqueue_js');
|
|
$text_options = array('external_ip', 'trusted_proxy_ips');
|
|
$option_names = array_merge($numeric_options, $text_options);
|
|
|
|
$action = isset($_POST['action']) ? $_POST['action'] : '';
|
|
|
|
if (geoip_detect_verify_nonce($action)) {
|
|
switch($action)
|
|
{
|
|
case 'update':
|
|
$registry->setCurrentSource('auto');
|
|
|
|
$s = new \YellowTree\GeoipDetect\DataSources\Auto\AutoDataSource();
|
|
$ret = $s->maxmindUpdate();
|
|
|
|
if ($ret === true)
|
|
$message .= __('Updated successfully.', 'geoip-detect');
|
|
else
|
|
$message .= __('File was not updated', 'geoip-detect') .': '. $ret;
|
|
|
|
break;
|
|
|
|
case 'choose':
|
|
$registry->setCurrentSource($_POST['options']['source']);
|
|
break;
|
|
|
|
|
|
case 'options-source':
|
|
$messages = array();
|
|
foreach ($sources as $s) {
|
|
$ret = $s->saveParameters($_POST);
|
|
if (is_string($ret) && $ret) {
|
|
$messages[] = $ret;
|
|
}
|
|
}
|
|
if ($messages)
|
|
$message .= implode('<br />', $messages);
|
|
|
|
break;
|
|
|
|
case 'options':
|
|
// Empty IP Cache
|
|
delete_transient('geoip_detect_external_ip');
|
|
|
|
if (!empty($_POST['options']['external_ip'])) {
|
|
if (!geoip_detect_is_ip($_POST['options']['external_ip'])) {
|
|
$message .= 'The external IP "' . esc_html($_POST['options']['external_ip']) . '" is not a valid IP.';
|
|
unset($_POST['options']['external_ip']);
|
|
} else if (!geoip_detect_is_public_ip($_POST['options']['external_ip'])) {
|
|
$message .= 'Warning: The external IP "' . esc_html($_POST['options']['external_ip']) . '" is not a public internet IP, so it will probably not work.';
|
|
}
|
|
}
|
|
|
|
|
|
foreach ($option_names as $opt_name) {
|
|
if (in_array($opt_name, $numeric_options))
|
|
$opt_value = isset($_POST['options'][$opt_name]) ? (int) $_POST['options'][$opt_name] : 0;
|
|
else
|
|
$opt_value = isset($_POST['options'][$opt_name]) ? $_POST['options'][$opt_name] : '';
|
|
update_option('geoip-detect-' . $opt_name, $opt_value);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
$currentSource = $registry->getCurrentSource();
|
|
|
|
$wp_options = array();
|
|
foreach ($option_names as $opt_name) {
|
|
$wp_options[$opt_name] = get_option('geoip-detect-'. $opt_name);
|
|
}
|
|
|
|
$ipv6_supported = GEOIP_DETECT_IPV6_SUPPORTED;
|
|
|
|
include_once(GEOIP_PLUGIN_DIR . '/views/options.php');
|
|
}
|
|
|
|
function geoip_detect_option_client_ip_page() {
|
|
include_once(GEOIP_PLUGIN_DIR . '/views/client-ip.php');
|
|
}
|
|
|
|
function _geoip_detect_improve_data_for_lookup($data, $shorten_attributes = false) {
|
|
if ($shorten_attributes) {
|
|
$short = [
|
|
'city',
|
|
'subdivisions',
|
|
'country',
|
|
'location'
|
|
];
|
|
$short = array_combine($short, $short);
|
|
$data = array_intersect_key($data, $short);
|
|
|
|
unset($data['city']['geoname_id']);
|
|
unset($data['country']['geoname_id']);
|
|
unset($data['country']['is_in_european_union']);
|
|
unset($data['location']['accuracy_radius']);
|
|
if (!empty($data['subdivisions'])) {
|
|
foreach ($data['subdivisions'] as $i => $s) {
|
|
unset($data['subdivisions'][$i]['geoname_id']);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Logical order
|
|
$order = [
|
|
'is_empty',
|
|
'city',
|
|
'most_specific_subdivision',
|
|
'subdivisions',
|
|
'postal',
|
|
'country',
|
|
'registered_country',
|
|
'represented_country',
|
|
'continent',
|
|
'location',
|
|
'traits',
|
|
'maxmind',
|
|
'extra'
|
|
];
|
|
|
|
uksort($data, function($a, $b) use ($order) {
|
|
$a_found = array_search($a, $order);
|
|
$b_found = array_search($b, $order);
|
|
|
|
if ($a_found === false) $a_found = 1000;
|
|
if ($b_found === false) $b_found = 1000;
|
|
return $a_found > $b_found;
|
|
});
|
|
|
|
return $data;
|
|
} |