Licensing FAQ for more details.)', 'geoip-detect'); }
public function getStatusInformationHTML() {
$html = parent::getStatusInformationHTML();
$date_format = get_option('date_format') . ' ' . get_option('time_format');
$rescheduled = '';
$next_cron_update = wp_next_scheduled( 'geoipdetectupdate' );
if ($next_cron_update === false) {
$rescheduled = ' ' . __('(Was rescheduled just now)', 'geoip-detect');
$this->set_cron_schedule();
$next_cron_update = wp_next_scheduled( 'geoipdetectupdate' );
}
$html .= '
' . sprintf(__('Next update: %s', 'geoip-detect'), $next_cron_update !== false ? date_i18n($date_format, $next_cron_update) : __('Never', 'geoip-detect'));
$html .= $rescheduled;
return $html;
}
public function getParameterHTML() {
$text_update = __('Update now', 'geoip-detect');
$nonce_field = wp_nonce_field( 'geoip_detect_update' );
$html = <<
$nonce_field
HTML;
return $html;
}
public function saveParameters($post) {}
public function __construct() {
parent::__construct();
add_action('geoipdetectupdate', array($this, 'hook_cron'), 10, 1);
add_action('plugins_loaded', array($this, 'on_plugins_loaded'));
}
public function on_plugins_loaded() {
if (!defined('GEOIP_DETECT_AUTO_UPDATE_DEACTIVATED'))
define('GEOIP_DETECT_AUTO_UPDATE_DEACTIVATED', false);
}
public function maxmindGetFilename() {
$data_filename = $this->maxmindGetUploadFilename();
if (!is_readable($data_filename))
$data_filename = '';
$data_filename = apply_filters('geoip_detect_get_abs_db_filename', $data_filename);
return $data_filename;
}
protected function maxmindGetUploadFilename() {
$upload_dir = wp_upload_dir();
$dir = $upload_dir['basedir'];
$filename = $dir . '/' . GEOIP_DETECT_DATA_UPDATE_FILENAME;
return $filename;
}
protected function download_url($url, $modified = 0) {
// Similar to wordpress download_url, but with custom UA
$url_filename = basename( parse_url( $url, PHP_URL_PATH ) );
$tmpfname = wp_tempnam( $url_filename );
if ( ! $tmpfname )
return new \WP_Error('http_no_file', __('Could not create temporary file.', 'geoip-detect'));
$headers = array();
$headers['User-Agent'] = GEOIP_DETECT_USER_AGENT;
if ($modified) {
$headers['If-Modified-Since'] = date('r', $modified);
}
$response = wp_safe_remote_get( $url, array('timeout' => 300, 'stream' => true, 'filename' => $tmpfname, 'headers' => $headers ) );
$http_response_code = wp_remote_retrieve_response_code( $response );
if (304 === $http_response_code) {
return new \WP_Error( 'http_304', __('It has not changed since the last update.', 'geoip-detect') );
}
if (is_wp_error( $response ) || 200 != $http_response_code) {
unlink($tmpfname);
$body = wp_remote_retrieve_body($response);
return new \WP_Error( 'http_404', $http_response_code . ': ' . trim( wp_remote_retrieve_response_message( $response ) ) . ' ' . $body );
}
return $tmpfname;
}
public function maxmindUpdate()
{
require_once(ABSPATH.'/wp-admin/includes/file.php');
$download_url = 'http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz';
//$download_url = 'http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz';
$download_url = apply_filters('geoip_detect2_download_url', $download_url);
$outFile = $this->maxmindGetUploadFilename();
$modified = 0;
if (\is_readable($outFile)) {
$modified = filemtime($outFile);
}
// Check if existing download should be resumed
$tmpFile = get_option('geoip-detect-auto_downloaded_file');
if (!$tmpFile || !file_exists($tmpFile)) {
// Download file
$tmpFile = $this->download_url($download_url, $modified);
}
if (is_wp_error($tmpFile)) {
return $tmpFile->get_error_message();
}
update_option('geoip-detect-auto_downloaded_file', $tmpFile);
// Unpack tar.gz
$ret = $this->unpackArchive($tmpFile, $outFile);
if (is_string($ret)) {
return $ret;
}
if (!is_readable($outFile)) {
return 'Something went wrong: the unpacked file cannot be found.';
}
update_option('geoip-detect-auto_downloaded_file', '');
unlink($tmpFile);
return true;
}
// Ungzip File
protected function unpackArchive($downloadedFilename, $outFile) {
if (!is_readable($downloadedFilename))
return __('Downloaded file could not be opened for reading.', 'geoip-detect');
if (!\is_writable(dirname($outFile)))
return sprintf(__('Database could not be written (%s).', 'geoip-detect'), $outFile);
$phar = new \PharData( $downloadedFilename );
$outDir = get_temp_dir() . 'geoip-detect/';
global $wp_filesystem;
if (!$wp_filesystem) {
\WP_Filesystem(false, get_temp_dir());
}
if (\is_dir($outDir)) {
$wp_filesystem->rmdir($outDir, true);
}
mkdir($outDir);
$phar->extractTo($outDir, null, true);
$files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($outDir));
$inFile = '';
foreach($files as $file) {
if (!$file->isDir() && mb_substr($file->getFilename(), -5) == '.mmdb') {
$inFile = $file->getPathname();
break;
}
}
if (!\is_readable($inFile))
return __('Downloaded file could not be opened for reading.', 'geoip-detect');
$ret = copy($inFile, $outFile);
if (!$ret)
return sprintf(__('Downloaded file could not write or overwrite %s.', 'geoip-detect'), $outFile);
$wp_filesystem->rmdir($outDir, true);
return true;
}
public function hook_cron() {
/**
* Filter:
* Cron has fired.
* Find out if file should be updated now.
*
* @param $do_it False if deactivated by define
* @param $immediately_after_activation True if this is fired because the plugin was recently activated (deprecated, will now always be false)
*/
$do_it = apply_filters('geoip_detect_cron_do_update', !GEOIP_DETECT_AUTO_UPDATE_DEACTIVATED, false);
$this->schedule_next_cron_run();
if ($do_it)
$this->maxmindUpdate();
}
public function set_cron_schedule()
{
$next = wp_next_scheduled( 'geoipdetectupdate' );
if ( $next === false ) {
$this->schedule_next_cron_run();
}
}
public function schedule_next_cron_run() {
// Try to update every 1-2 weeks
$next = time() + WEEK_IN_SECONDS;
$next += mt_rand(1, WEEK_IN_SECONDS);
wp_schedule_single_event($next, 'geoipdetectupdate');
}
public function activate() {
$this->set_cron_schedule();
}
public function deactivate()
{
wp_clear_scheduled_hook('geoipdetectupdate');
}
public function uninstall() {
// Delete the automatically downloaded file, if it exists
$filename = $this->maxmindGetFilename();
if ($filename) {
unlink($filename);
}
}
}
geoip_detect2_register_source(new AutoDataSource());