Version Description
- New: posts only parameters for [CPD_MOST_VISITED_POSTS]
- New: don't count password protected posts without password
- New: translate widget titles if possible
- New: flags of Cambodia, Nigeria and Sudan
- Bugfix: massbot post list has not show all post
- Bugfix: security fix, XSS
- Bugfix: problems while adding widgets
- Bugfix: start session only in backend
- Bugfix: empty database query
Download this release
Release Info
Developer | Tom Braider |
Plugin | ![]() |
Version | 3.2.6 |
Comparing to | |
See all releases |
Code changes from version 3.2.5 to 3.2.6
- ajax.php +4 -4
- counter-core.php +78 -71
- counter.css +31 -22
- counter.php +30 -16
- geoip/GeoIP.dat +0 -0
- geoip/cpd_geoip.inc +0 -713
- geoip/geoip.inc +433 -221
- geoip/geoip.php +35 -16
- img/cpd_flags.png +0 -0
- locale/cpd-sr_RS.mo +0 -0
- locale/cpd-sr_RS.po +1119 -0
- massbots.php +8 -8
- notes.php +3 -3
- readme.txt +57 -32
- userperspan.php +10 -8
ajax.php
CHANGED
@@ -5,7 +5,7 @@ if ( $_GET['f'] == 'count' )
|
|
5 |
if ( empty($_GET['time']) || time() - $_GET['time'] > 20 )
|
6 |
{
|
7 |
header("HTTP/1.0 403 Forbidden");
|
8 |
-
die();
|
9 |
}
|
10 |
|
11 |
if (!session_id()) session_start();
|
@@ -27,11 +27,11 @@ if ( $_GET['f'] == 'count' )
|
|
27 |
{
|
28 |
echo $f.'===';
|
29 |
if ( $f == 'getUserPerDay' )
|
30 |
-
|
31 |
else if ( $f == 'show' )
|
32 |
-
|
33 |
else
|
34 |
-
|
35 |
echo '|';
|
36 |
}
|
37 |
}
|
5 |
if ( empty($_GET['time']) || time() - $_GET['time'] > 20 )
|
6 |
{
|
7 |
header("HTTP/1.0 403 Forbidden");
|
8 |
+
die('wrong request');
|
9 |
}
|
10 |
|
11 |
if (!session_id()) session_start();
|
27 |
{
|
28 |
echo $f.'===';
|
29 |
if ( $f == 'getUserPerDay' )
|
30 |
+
echo $count_per_day->getUserPerDay($count_per_day->options['dashboard_last_days']);
|
31 |
else if ( $f == 'show' )
|
32 |
+
echo $count_per_day->show("", "", false, false, '.$page.');
|
33 |
else
|
34 |
+
echo call_user_func('$count_per_day->'.$f);
|
35 |
echo '|';
|
36 |
}
|
37 |
}
|
counter-core.php
CHANGED
@@ -147,7 +147,8 @@ function init()
|
|
147 |
add_action('admin_enqueue_scripts', array(&$this,'addThickbox'));
|
148 |
|
149 |
// Session
|
150 |
-
|
|
|
151 |
|
152 |
$this->aton = 'INET_ATON';
|
153 |
$this->ntoa = 'INET_NTOA';
|
@@ -159,11 +160,11 @@ function init()
|
|
159 |
function addPostTypesColumns()
|
160 |
{
|
161 |
$post_types = get_post_types(array('public'=>true),'objects');
|
162 |
-
foreach ($post_types
|
163 |
{
|
164 |
$name = trim($post_type->name);
|
165 |
-
add_action('manage_'
|
166 |
-
add_filter('manage_edit-'
|
167 |
}
|
168 |
}
|
169 |
|
@@ -179,17 +180,6 @@ function addThickbox()
|
|
179 |
wp_enqueue_script('cpd_flot', $this->dir.'/js/jquery.flot.min.js', 'jQuery');
|
180 |
}
|
181 |
|
182 |
-
function cpdReadsOrderby( $vars )
|
183 |
-
{
|
184 |
-
if ( isset($vars['orderby']) && $vars['orderby'] == 'cpd_reads' )
|
185 |
-
{
|
186 |
-
$vars = array_merge( $vars, array(
|
187 |
-
'meta_key' => 'cpd_reads',
|
188 |
-
'orderby' => 'meta_value_num'
|
189 |
-
));
|
190 |
-
}
|
191 |
-
return $vars;
|
192 |
-
}
|
193 |
|
194 |
/**
|
195 |
* starts session to provide WP variables to "addons"
|
@@ -204,7 +194,7 @@ function startSession()
|
|
204 |
/**
|
205 |
* get result from database
|
206 |
* @param string $kind kind of result
|
207 |
-
* @param string $sql sql query
|
208 |
* @param string $func name for debug info
|
209 |
*/
|
210 |
function mysqlQuery( $kind = '', $sql, $func = '' )
|
@@ -214,14 +204,26 @@ function mysqlQuery( $kind = '', $sql, $func = '' )
|
|
214 |
return;
|
215 |
$t = microtime(true);
|
216 |
$con = $wpdb->dbh;
|
217 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
218 |
$r = false;
|
219 |
if ($kind == 'var')
|
220 |
$r = $wpdb->get_var( $preparedSql );
|
221 |
else if ($kind == 'count')
|
222 |
{
|
223 |
-
|
224 |
-
$r = $wpdb->get_var(
|
225 |
}
|
226 |
else if ($kind == 'rows')
|
227 |
{
|
@@ -262,6 +264,10 @@ function checkInstalledVersion()
|
|
262 |
*/
|
263 |
function anonymize_ip( $ip )
|
264 |
{
|
|
|
|
|
|
|
|
|
265 |
if ( $this->options['debug'] )
|
266 |
$this->queries[] = 'called Function: <b style="color:blue">anonymize_ip</b> IP: <code>'.$ip.'</code>';
|
267 |
if ($this->options['anoip'])
|
@@ -360,7 +366,7 @@ function checkVersion()
|
|
360 |
if (!empty($_GET['networkwide']))
|
361 |
{
|
362 |
$old_blog = $wpdb->blogid;
|
363 |
-
$blogids = $wpdb->get_col($wpdb->prepare("SELECT blog_id FROM $wpdb->blogs
|
364 |
foreach ($blogids as $blog_id)
|
365 |
{
|
366 |
// create tables in all sub blogs
|
@@ -401,11 +407,12 @@ function createTables()
|
|
401 |
`client` varchar(150) NOT NULL,
|
402 |
`date` date NOT NULL,
|
403 |
`page` mediumint(9) NOT NULL,
|
|
|
404 |
`referer` varchar(100) NOT NULL,
|
405 |
PRIMARY KEY (`id`),
|
406 |
KEY `idx_page` (`page`),
|
407 |
KEY `idx_dateip` (`date`,`ip`) )
|
408 |
-
$charset_collate
|
409 |
$this->mysqlQuery('', $sql, 'createTables '.__LINE__);
|
410 |
|
411 |
// update fields in old table
|
@@ -438,15 +445,12 @@ function createTables()
|
|
438 |
$sql .= 'ADD KEY `idx_dateip` (`date`,`ip`), ADD KEY `idx_page` (`page`)';
|
439 |
$this->mysqlQuery('', $sql, 'make keys '.__LINE__);
|
440 |
|
441 |
-
//
|
442 |
-
|
443 |
-
|
444 |
-
$this->mysqlQuery('', "
|
445 |
-
if ((int) mysql_errno() == 1054)
|
446 |
-
$this->mysqlQuery('', "ALTER TABLE `$cpd_c` ADD `country` CHAR(2) NOT NULL", 'make country '.__LINE__);
|
447 |
-
}
|
448 |
|
449 |
-
// referrer
|
450 |
$this->mysqlQuery('', "SELECT referer FROM `$cpd_c` LIMIT 1", 'check referer '.__LINE__);
|
451 |
if ((int) mysql_errno() == 1054)
|
452 |
$this->mysqlQuery('', "ALTER TABLE `$cpd_c` ADD `referer` VARCHAR(100) NOT NULL", 'make referer '.__LINE__);
|
@@ -567,7 +571,7 @@ function addAjaxScript()
|
|
567 |
<script type="text/javascript">
|
568 |
// Count per Day
|
569 |
//<![CDATA[
|
570 |
-
jQuery(document).ready( function(
|
571 |
{
|
572 |
jQuery.get('{$this->dir}/ajax.php?f=count&page={$this->page}&time={$time}', function(text)
|
573 |
{
|
@@ -664,9 +668,9 @@ function updateOptions()
|
|
664 |
'dashboard_last_days' => 7,
|
665 |
'show_in_lists' => 1,
|
666 |
'chart_days' => 60,
|
667 |
-
'chart_height' =>
|
668 |
'countries' => 20,
|
669 |
-
'startdate' => '
|
670 |
'startcount' => '',
|
671 |
'startreads' => '',
|
672 |
'anoip' => 0,
|
@@ -702,39 +706,6 @@ function dashboardWidgetSetup()
|
|
702 |
wp_add_dashboard_widget( 'cpdDashboardWidget', 'Count per Day', array(&$this,'dashboardWidget') );
|
703 |
}
|
704 |
|
705 |
-
/**
|
706 |
-
* add counter column to page/post lists
|
707 |
-
*/
|
708 |
-
function cpdColumn($defaults)
|
709 |
-
{
|
710 |
-
if ( $this->options['show_in_lists'] )
|
711 |
-
$defaults['cpd_reads'] = '<img src="'.$this->img('cpd_menu.gif').'" alt="'.__('Reads', 'cpd').'" title="'.__('Reads', 'cpd').'" style="width:12px;height:12px;" />';
|
712 |
-
return $defaults;
|
713 |
-
}
|
714 |
-
|
715 |
-
function cpdSortableColumns($columns)
|
716 |
-
{
|
717 |
-
// meta column id => sortby value used in query
|
718 |
-
$custom = array('cpd_reads' => 'cpd_reads');
|
719 |
-
return wp_parse_args($custom, $columns);
|
720 |
-
}
|
721 |
-
|
722 |
-
/**
|
723 |
-
* adds content to the counter column
|
724 |
-
*/
|
725 |
-
function cpdColumnContent($column_name, $id = 0)
|
726 |
-
{
|
727 |
-
global $wpdb;
|
728 |
-
if( $column_name == 'cpd_reads' )
|
729 |
-
{
|
730 |
-
$c = $this->mysqlQuery('count', "SELECT 1 FROM $wpdb->cpd_counter WHERE page='$id'", 'cpdColumn_'.$id.'_'.__LINE__);
|
731 |
-
$coll = get_option('count_per_day_posts');
|
732 |
-
if ( $coll && isset($coll['p'.$id]) )
|
733 |
-
$c += $coll['p'.$id];
|
734 |
-
echo $c;
|
735 |
-
}
|
736 |
-
}
|
737 |
-
|
738 |
/**
|
739 |
* gets image recource with given name
|
740 |
*/
|
@@ -748,7 +719,7 @@ function img( $r )
|
|
748 |
*/
|
749 |
function screenLayoutColumns($columns, $screen)
|
750 |
{
|
751 |
-
if ($screen == $this->pagehook)
|
752 |
$columns[$this->pagehook] = 4;
|
753 |
return $columns;
|
754 |
}
|
@@ -856,8 +827,8 @@ function onShowPage()
|
|
856 |
</div>
|
857 |
<script type="text/javascript">
|
858 |
//<![CDATA[
|
859 |
-
jQuery(document).ready( function(
|
860 |
-
|
861 |
postboxes.add_postbox_toggles('<?php echo $this->pagehook; ?>');
|
862 |
});
|
863 |
//]]>
|
@@ -918,10 +889,20 @@ function shortUserPerMonth() { return $this->getUserPerMonth(true, true); }
|
|
918 |
function shortUserPerPost() { return $this->getUserPerPost(0, true, true); }
|
919 |
function shortCountries() { return $this->getCountries(0, true, false, true); }
|
920 |
function shortCountriesUsers(){ return $this->getCountries(0, true, true, true); }
|
921 |
-
function shortMostVisitedPosts(){ return $this->getMostVisitedPosts(0, 0, true, false, true); }
|
922 |
function shortReferers() { return $this->getReferers(0, true, 0); }
|
923 |
function shortDayWithMostReads(){ return $this->getDayWithMostReads(true, true); }
|
924 |
function shortDayWithMostUsers(){ return $this->getDayWithMostUsers(true, true); }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
925 |
function shortGetSearches( $atts )
|
926 |
{
|
927 |
extract( shortcode_atts( array(
|
@@ -1451,7 +1432,7 @@ function getSearchString()
|
|
1451 |
{
|
1452 |
if (empty($_SERVER['HTTP_REFERER']))
|
1453 |
return false;
|
1454 |
-
$ref = parse_url(rawurldecode($_SERVER['HTTP_REFERER']));
|
1455 |
if ( empty($ref['host']) || empty($ref['query']) )
|
1456 |
return false;
|
1457 |
$keys = array('p','q','s','query','search','prev','qkw','qry');
|
@@ -1459,11 +1440,37 @@ function getSearchString()
|
|
1459 |
foreach ($keys as $key)
|
1460 |
if (isset($query[$key]))
|
1461 |
$search = str_ireplace(array('/search?q=','/images?q='), '', $query[$key]);
|
1462 |
-
|
|
|
1463 |
if (empty($search) || is_numeric($search)) // non WordPress postID
|
1464 |
$search = '';
|
1465 |
return trim($search);
|
1466 |
}
|
1467 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1468 |
|
1469 |
} // class
|
147 |
add_action('admin_enqueue_scripts', array(&$this,'addThickbox'));
|
148 |
|
149 |
// Session
|
150 |
+
if (strpos($_SERVER['SCRIPT_NAME'], '/wp-admin/') !== false )
|
151 |
+
add_action('init', array(&$this,'startSession'), 1);
|
152 |
|
153 |
$this->aton = 'INET_ATON';
|
154 |
$this->ntoa = 'INET_NTOA';
|
160 |
function addPostTypesColumns()
|
161 |
{
|
162 |
$post_types = get_post_types(array('public'=>true),'objects');
|
163 |
+
foreach ($post_types as $post_type )
|
164 |
{
|
165 |
$name = trim($post_type->name);
|
166 |
+
add_action('manage_'.$name.'s_custom_column', array(&$this,'cpdColumnContent'), 10, 2);
|
167 |
+
add_filter('manage_edit-'.$name.'_columns', array(&$this,'cpdColumn'));
|
168 |
}
|
169 |
}
|
170 |
|
180 |
wp_enqueue_script('cpd_flot', $this->dir.'/js/jquery.flot.min.js', 'jQuery');
|
181 |
}
|
182 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
183 |
|
184 |
/**
|
185 |
* starts session to provide WP variables to "addons"
|
194 |
/**
|
195 |
* get result from database
|
196 |
* @param string $kind kind of result
|
197 |
+
* @param string|array $sql sql query [and args]
|
198 |
* @param string $func name for debug info
|
199 |
*/
|
200 |
function mysqlQuery( $kind = '', $sql, $func = '' )
|
204 |
return;
|
205 |
$t = microtime(true);
|
206 |
$con = $wpdb->dbh;
|
207 |
+
|
208 |
+
if ( is_array($sql) )
|
209 |
+
{
|
210 |
+
$sql = array_shift($sql);
|
211 |
+
$args = $sql;
|
212 |
+
$preparedSql = $wpdb->prepare($sql, $args);
|
213 |
+
}
|
214 |
+
else
|
215 |
+
$preparedSql = $sql;
|
216 |
+
|
217 |
+
if (empty($preparedSql))
|
218 |
+
return;
|
219 |
+
|
220 |
$r = false;
|
221 |
if ($kind == 'var')
|
222 |
$r = $wpdb->get_var( $preparedSql );
|
223 |
else if ($kind == 'count')
|
224 |
{
|
225 |
+
// $sql = 'SELECT COUNT(*) FROM ('.trim($sql,';').') t';
|
226 |
+
$r = $wpdb->get_var('SELECT COUNT(*) FROM ('.trim($preparedSql,';').') t');
|
227 |
}
|
228 |
else if ($kind == 'rows')
|
229 |
{
|
264 |
*/
|
265 |
function anonymize_ip( $ip )
|
266 |
{
|
267 |
+
// not on IPv6
|
268 |
+
if (strpos($ip,':'))
|
269 |
+
return $ip;
|
270 |
+
|
271 |
if ( $this->options['debug'] )
|
272 |
$this->queries[] = 'called Function: <b style="color:blue">anonymize_ip</b> IP: <code>'.$ip.'</code>';
|
273 |
if ($this->options['anoip'])
|
366 |
if (!empty($_GET['networkwide']))
|
367 |
{
|
368 |
$old_blog = $wpdb->blogid;
|
369 |
+
$blogids = $wpdb->get_col($wpdb->prepare("SELECT blog_id FROM %s", $wpdb->blogs));
|
370 |
foreach ($blogids as $blog_id)
|
371 |
{
|
372 |
// create tables in all sub blogs
|
407 |
`client` varchar(150) NOT NULL,
|
408 |
`date` date NOT NULL,
|
409 |
`page` mediumint(9) NOT NULL,
|
410 |
+
`country` CHAR(2) NOT NULL,
|
411 |
`referer` varchar(100) NOT NULL,
|
412 |
PRIMARY KEY (`id`),
|
413 |
KEY `idx_page` (`page`),
|
414 |
KEY `idx_dateip` (`date`,`ip`) )
|
415 |
+
$charset_collate";
|
416 |
$this->mysqlQuery('', $sql, 'createTables '.__LINE__);
|
417 |
|
418 |
// update fields in old table
|
445 |
$sql .= 'ADD KEY `idx_dateip` (`date`,`ip`), ADD KEY `idx_page` (`page`)';
|
446 |
$this->mysqlQuery('', $sql, 'make keys '.__LINE__);
|
447 |
|
448 |
+
// column country
|
449 |
+
$this->mysqlQuery('', "SELECT country FROM `$cpd_c` LIMIT 1", 'check country '.__LINE__);
|
450 |
+
if ((int) mysql_errno() == 1054)
|
451 |
+
$this->mysqlQuery('', "ALTER TABLE `$cpd_c` ADD `country` CHAR(2) NOT NULL", 'make country '.__LINE__);
|
|
|
|
|
|
|
452 |
|
453 |
+
// column referrer
|
454 |
$this->mysqlQuery('', "SELECT referer FROM `$cpd_c` LIMIT 1", 'check referer '.__LINE__);
|
455 |
if ((int) mysql_errno() == 1054)
|
456 |
$this->mysqlQuery('', "ALTER TABLE `$cpd_c` ADD `referer` VARCHAR(100) NOT NULL", 'make referer '.__LINE__);
|
571 |
<script type="text/javascript">
|
572 |
// Count per Day
|
573 |
//<![CDATA[
|
574 |
+
jQuery(document).ready( function()
|
575 |
{
|
576 |
jQuery.get('{$this->dir}/ajax.php?f=count&page={$this->page}&time={$time}', function(text)
|
577 |
{
|
668 |
'dashboard_last_days' => 7,
|
669 |
'show_in_lists' => 1,
|
670 |
'chart_days' => 60,
|
671 |
+
'chart_height' => 200,
|
672 |
'countries' => 20,
|
673 |
+
'startdate' => '',
|
674 |
'startcount' => '',
|
675 |
'startreads' => '',
|
676 |
'anoip' => 0,
|
706 |
wp_add_dashboard_widget( 'cpdDashboardWidget', 'Count per Day', array(&$this,'dashboardWidget') );
|
707 |
}
|
708 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
709 |
/**
|
710 |
* gets image recource with given name
|
711 |
*/
|
719 |
*/
|
720 |
function screenLayoutColumns($columns, $screen)
|
721 |
{
|
722 |
+
if ( isset($this->pagehook) && $screen == $this->pagehook )
|
723 |
$columns[$this->pagehook] = 4;
|
724 |
return $columns;
|
725 |
}
|
827 |
</div>
|
828 |
<script type="text/javascript">
|
829 |
//<![CDATA[
|
830 |
+
jQuery(document).ready( function() {
|
831 |
+
jQuery('.if-js-closed').removeClass('if-js-closed').addClass('closed');
|
832 |
postboxes.add_postbox_toggles('<?php echo $this->pagehook; ?>');
|
833 |
});
|
834 |
//]]>
|
889 |
function shortUserPerPost() { return $this->getUserPerPost(0, true, true); }
|
890 |
function shortCountries() { return $this->getCountries(0, true, false, true); }
|
891 |
function shortCountriesUsers(){ return $this->getCountries(0, true, true, true); }
|
892 |
+
// function shortMostVisitedPosts(){ return $this->getMostVisitedPosts(0, 0, true, false, true); }
|
893 |
function shortReferers() { return $this->getReferers(0, true, 0); }
|
894 |
function shortDayWithMostReads(){ return $this->getDayWithMostReads(true, true); }
|
895 |
function shortDayWithMostUsers(){ return $this->getDayWithMostUsers(true, true); }
|
896 |
+
function shortMostVisitedPosts( $atts )
|
897 |
+
{
|
898 |
+
extract( shortcode_atts( array(
|
899 |
+
'days' => 0,
|
900 |
+
'limit' => 0,
|
901 |
+
'postsonly' => 0,
|
902 |
+
'posttypes' => ''
|
903 |
+
), $atts) );
|
904 |
+
return $this->getMostVisitedPosts( $days, $limit, true, $postsonly, false, $posttypes );
|
905 |
+
}
|
906 |
function shortGetSearches( $atts )
|
907 |
{
|
908 |
extract( shortcode_atts( array(
|
1432 |
{
|
1433 |
if (empty($_SERVER['HTTP_REFERER']))
|
1434 |
return false;
|
1435 |
+
$ref = parse_url(rawurldecode(wp_strip_all_tags($_SERVER['HTTP_REFERER'])));
|
1436 |
if ( empty($ref['host']) || empty($ref['query']) )
|
1437 |
return false;
|
1438 |
$keys = array('p','q','s','query','search','prev','qkw','qry');
|
1440 |
foreach ($keys as $key)
|
1441 |
if (isset($query[$key]))
|
1442 |
$search = str_ireplace(array('/search?q=','/images?q='), '', $query[$key]);
|
1443 |
+
if (isset($search))
|
1444 |
+
$search = wp_strip_all_tags($search);
|
1445 |
if (empty($search) || is_numeric($search)) // non WordPress postID
|
1446 |
$search = '';
|
1447 |
return trim($search);
|
1448 |
}
|
1449 |
|
1450 |
+
/**
|
1451 |
+
* add counter column to page/post lists
|
1452 |
+
*/
|
1453 |
+
function cpdColumn($defaults)
|
1454 |
+
{
|
1455 |
+
if ( $this->options['show_in_lists'] )
|
1456 |
+
$defaults['cpd_reads'] = '<img src="'.$this->img('cpd_menu.gif').'" alt="'.__('Reads', 'cpd').'" title="'.__('Reads', 'cpd').'" style="width:12px;height:12px;" />';
|
1457 |
+
return $defaults;
|
1458 |
+
}
|
1459 |
+
|
1460 |
+
/**
|
1461 |
+
* adds content to the counter column
|
1462 |
+
*/
|
1463 |
+
function cpdColumnContent($column_name, $id = 0)
|
1464 |
+
{
|
1465 |
+
global $wpdb;
|
1466 |
+
if( $column_name == 'cpd_reads' )
|
1467 |
+
{
|
1468 |
+
$c = $this->mysqlQuery('count', "SELECT 1 FROM $wpdb->cpd_counter WHERE page='$id'", 'cpdColumn_'.$id.'_'.__LINE__);
|
1469 |
+
$coll = get_option('count_per_day_posts');
|
1470 |
+
if ( $coll && isset($coll['p'.$id]) )
|
1471 |
+
$c += $coll['p'.$id];
|
1472 |
+
echo $c;
|
1473 |
+
}
|
1474 |
+
}
|
1475 |
|
1476 |
} // class
|
counter.css
CHANGED
@@ -85,26 +85,26 @@ h2 .cpd_icon {
|
|
85 |
vertical-align: text-bottom;
|
86 |
padding: 0 !important;
|
87 |
}
|
88 |
-
.cpd_backup{background-position: 0 0}
|
89 |
-
.cpd_clean{background-position: 0 -46px}
|
90 |
-
.cpd_collection{background-position: 0 -92px}
|
91 |
-
.cpd_computer{background-position: 0 -138px}
|
92 |
-
.cpd_calendar{background-position: 0 -184px}
|
93 |
-
.cpd_day{background-position: 0 -230px}
|
94 |
-
.cpd_geoip{background-position: 0 -276px}
|
95 |
-
.cpd_help{background-position: 0 -322px}
|
96 |
-
.cpd_massbots{background-position: 0 -368px}
|
97 |
-
.cpd_online{background-position: 0 -414px}
|
98 |
-
.cpd_post{background-position: 0 -460px}
|
99 |
-
.cpd_reads{background-position: 0 -506px}
|
100 |
-
.cpd_referrer{background-position: 0 -552px}
|
101 |
-
.cpd_reset{background-position: 0 -598px}
|
102 |
-
.cpd_settings{background-position: 0 -644px}
|
103 |
-
.cpd_summary{background-position: 0 -690px}
|
104 |
-
.cpd_tools{background-position: 0 -736px}
|
105 |
-
.cpd_uninstall{background-position: 0 -782px}
|
106 |
-
.cpd_update{background-position: 0 -828px}
|
107 |
-
.cpd_user{background-position: 0 -874px}
|
108 |
|
109 |
/* dashboard */
|
110 |
|
@@ -121,7 +121,9 @@ h2 .cpd_icon {
|
|
121 |
}
|
122 |
|
123 |
#cpd-flot {
|
|
|
124 |
overflow: hidden;
|
|
|
125 |
}
|
126 |
|
127 |
#cpd-tooltip {
|
@@ -209,7 +211,7 @@ h2 .cpd_icon {
|
|
209 |
.cpd_widget_item .widefat {
|
210 |
width: 235px !important;
|
211 |
margin-left: 15px;
|
212 |
-
|
213 |
}
|
214 |
|
215 |
/* thickbox */
|
@@ -268,7 +270,7 @@ h2 .cpd_icon {
|
|
268 |
color: #ff0;
|
269 |
}
|
270 |
|
271 |
-
.cpd-notes input {
|
272 |
width: 97%;
|
273 |
font: 12px Verdana, Arial, Helvetica, sans-serif;
|
274 |
}
|
@@ -433,3 +435,10 @@ h2 .cpd_icon {
|
|
433 |
.cpd-flag-cm{background-position:0 -1586px;}
|
434 |
.cpd-flag-mn{background-position:0 -1599px;}
|
435 |
.cpd-flag-kz{background-position:0 -1612px;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
vertical-align: text-bottom;
|
86 |
padding: 0 !important;
|
87 |
}
|
88 |
+
.cpd_backup{background-position: 0 0}
|
89 |
+
.cpd_clean{background-position: 0 -46px}
|
90 |
+
.cpd_collection{background-position: 0 -92px}
|
91 |
+
.cpd_computer{background-position: 0 -138px}
|
92 |
+
.cpd_calendar{background-position: 0 -184px}
|
93 |
+
.cpd_day{background-position: 0 -230px}
|
94 |
+
.cpd_geoip{background-position: 0 -276px}
|
95 |
+
.cpd_help{background-position: 0 -322px}
|
96 |
+
.cpd_massbots{background-position: 0 -368px}
|
97 |
+
.cpd_online{background-position: 0 -414px}
|
98 |
+
.cpd_post{background-position: 0 -460px}
|
99 |
+
.cpd_reads{background-position: 0 -506px}
|
100 |
+
.cpd_referrer{background-position: 0 -552px}
|
101 |
+
.cpd_reset{background-position: 0 -598px}
|
102 |
+
.cpd_settings{background-position: 0 -644px}
|
103 |
+
.cpd_summary{background-position: 0 -690px}
|
104 |
+
.cpd_tools{background-position: 0 -736px}
|
105 |
+
.cpd_uninstall{background-position: 0 -782px}
|
106 |
+
.cpd_update{background-position: 0 -828px}
|
107 |
+
.cpd_user{background-position: 0 -874px}
|
108 |
|
109 |
/* dashboard */
|
110 |
|
121 |
}
|
122 |
|
123 |
#cpd-flot {
|
124 |
+
clear: both;
|
125 |
overflow: hidden;
|
126 |
+
margin-top: 5px;
|
127 |
}
|
128 |
|
129 |
#cpd-tooltip {
|
211 |
.cpd_widget_item .widefat {
|
212 |
width: 235px !important;
|
213 |
margin-left: 15px;
|
214 |
+
|
215 |
}
|
216 |
|
217 |
/* thickbox */
|
270 |
color: #ff0;
|
271 |
}
|
272 |
|
273 |
+
.cpd-notes input {
|
274 |
width: 97%;
|
275 |
font: 12px Verdana, Arial, Helvetica, sans-serif;
|
276 |
}
|
435 |
.cpd-flag-cm{background-position:0 -1586px;}
|
436 |
.cpd-flag-mn{background-position:0 -1599px;}
|
437 |
.cpd-flag-kz{background-position:0 -1612px;}
|
438 |
+
.cpd-flag-ng{background-position:0 -1625px;}
|
439 |
+
.cpd-flag-kh{background-position:0 -1638px;}
|
440 |
+
.cpd-flag-sd{background-position:0 -1651px;}
|
441 |
+
|
442 |
+
|
443 |
+
|
444 |
+
|
counter.php
CHANGED
@@ -3,16 +3,19 @@
|
|
3 |
Plugin Name: Count Per Day
|
4 |
Plugin URI: http://www.tomsdimension.de/wp-plugins/count-per-day
|
5 |
Description: Counter, shows reads and visitors per page; today, yesterday, last week, last months ... on dashboard, per shortcode or in widget.
|
6 |
-
Version: 3.2.
|
7 |
License: Postcardware
|
8 |
Author: Tom Braider
|
9 |
Author URI: http://www.tomsdimension.de
|
10 |
*/
|
11 |
|
12 |
$cpd_dir_name = 'count-per-day';
|
13 |
-
$cpd_version = '3.2.
|
14 |
|
15 |
-
|
|
|
|
|
|
|
16 |
include_once($cpd_path.'counter-core.php');
|
17 |
|
18 |
/**
|
@@ -53,7 +56,7 @@ function show( $before='', $after=' reads', $show = true, $count = true, $page =
|
|
53 |
// get count from collection
|
54 |
$c = $this->getCollectedPostReads($page);
|
55 |
// add current data
|
56 |
-
$c += $this->mysqlQuery('var', $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->cpd_counter WHERE page=
|
57 |
if ($show)
|
58 |
echo $before.$c.$after;
|
59 |
else
|
@@ -103,8 +106,8 @@ function count( $x, $page = 'x' )
|
|
103 |
.'page: <code>'.$page.'</code> '
|
104 |
.'userlevel: <code>'.$userlevel.'</code>';
|
105 |
|
106 |
-
// only count if: non bot, Logon is ok
|
107 |
-
if ( !$isBot && $countUser && isset($page) )
|
108 |
{
|
109 |
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
|
110 |
{
|
@@ -116,8 +119,8 @@ function count( $x, $page = 'x' )
|
|
116 |
$real_ip = $_SERVER['REMOTE_ADDR'];
|
117 |
|
118 |
$userip = $this->anonymize_ip($real_ip);
|
119 |
-
$client = ($this->options['referers']) ? $_SERVER['HTTP_USER_AGENT'] : '';
|
120 |
-
$referer = ($this->options['referers'] && isset($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : '';
|
121 |
if ($this->options['referers_cut'])
|
122 |
$referer = substr( $referer, 0, strpos($referer,'?') );
|
123 |
|
@@ -130,7 +133,7 @@ function count( $x, $page = 'x' )
|
|
130 |
{
|
131 |
// with GeoIP addon save country
|
132 |
$gi = cpd_geoip_open($cpd_path.'geoip/GeoIP.dat', GEOIP_STANDARD);
|
133 |
-
$country = strtolower(
|
134 |
$this->mysqlQuery('', $wpdb->prepare("INSERT INTO $wpdb->cpd_counter (page, ip, client, date, country, referer)
|
135 |
VALUES (%s, $this->aton(%s), %s, %s, %s, %s)", $page, $userip, $client, $date, $country, $referer), 'count insert '.__LINE__);
|
136 |
}
|
@@ -665,7 +668,7 @@ function getUserPerDay( $days = 0, $return = false )
|
|
665 |
* @param integer $limit count of posts (last posts)
|
666 |
* @param boolean $postsonly don't show categories and taxonomies
|
667 |
*/
|
668 |
-
function getMostVisitedPosts( $days = 0, $limit = 0, $frontend = false, $postsonly = false, $return = false )
|
669 |
{
|
670 |
global $wpdb;
|
671 |
if ( $days == 0 )
|
@@ -674,6 +677,15 @@ function getMostVisitedPosts( $days = 0, $limit = 0, $frontend = false, $postson
|
|
674 |
$limit = $this->options['dashboard_last_posts'];
|
675 |
$date = date_i18n('Y-m-d', current_time('timestamp') - 86400 * $days);
|
676 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
677 |
if ($postsonly)
|
678 |
$sql = $wpdb->prepare("
|
679 |
SELECT COUNT(c.id) count,
|
@@ -684,6 +696,7 @@ function getMostVisitedPosts( $days = 0, $limit = 0, $frontend = false, $postson
|
|
684 |
ON p.id = c.page
|
685 |
WHERE c.date >= %s
|
686 |
AND c.page > 0
|
|
|
687 |
GROUP BY c.page
|
688 |
ORDER BY count DESC
|
689 |
LIMIT %d",
|
@@ -790,6 +803,7 @@ function getVisitedPostsOnDay( $date = 0, $limit = 0, $show_form = true, $show_n
|
|
790 |
$date = $_GET['daytoshow'];
|
791 |
else if ( $date == 0 )
|
792 |
$date = date_i18n('Y-m-d');
|
|
|
793 |
if ( $limit == 0 )
|
794 |
$limit = $this->options['dashboard_last_posts'];
|
795 |
|
@@ -1258,12 +1272,12 @@ class CountPerDay_Widget extends WP_Widget
|
|
1258 |
echo '<span id="cpd_number_'.$k.'" class="cpd-r">';
|
1259 |
// parameters only for special functions
|
1260 |
if ( $f == 'getUserPerDay' )
|
1261 |
-
|
1262 |
else if ( $f == 'show' )
|
1263 |
-
|
1264 |
else
|
1265 |
-
|
1266 |
-
echo '</span>'
|
1267 |
}
|
1268 |
}
|
1269 |
}
|
@@ -1318,7 +1332,8 @@ class CountPerDay_Widget extends WP_Widget
|
|
1318 |
'getuseronline_name' => __('Visitors currently online', 'cpd'),
|
1319 |
'getfirstcount_name' => __('Counter starts on', 'cpd')
|
1320 |
);
|
1321 |
-
|
|
|
1322 |
|
1323 |
// title field
|
1324 |
$field_id = $this->get_field_id('title');
|
@@ -1362,7 +1377,6 @@ class CountPerDay_Widget extends WP_Widget
|
|
1362 |
?>
|
1363 |
<script type="text/javascript">
|
1364 |
//<![CDATA[
|
1365 |
-
jQuery.noConflict();
|
1366 |
jQuery(document).ready(function(){
|
1367 |
jQuery('#cpdwidgetlist<?php echo $field_id ?>').sortable({
|
1368 |
items: 'li:not(.cpd_widget_title)',
|
3 |
Plugin Name: Count Per Day
|
4 |
Plugin URI: http://www.tomsdimension.de/wp-plugins/count-per-day
|
5 |
Description: Counter, shows reads and visitors per page; today, yesterday, last week, last months ... on dashboard, per shortcode or in widget.
|
6 |
+
Version: 3.2.6
|
7 |
License: Postcardware
|
8 |
Author: Tom Braider
|
9 |
Author URI: http://www.tomsdimension.de
|
10 |
*/
|
11 |
|
12 |
$cpd_dir_name = 'count-per-day';
|
13 |
+
$cpd_version = '3.2.6';
|
14 |
|
15 |
+
if (strpos($_SERVER['SERVER_NAME'], '.test'))
|
16 |
+
$cpd_path = str_replace('/', DIRECTORY_SEPARATOR, ABSPATH.PLUGINDIR.'/'.$cpd_dir_name.'/');
|
17 |
+
else
|
18 |
+
$cpd_path = dirname(__FILE__).'/';
|
19 |
include_once($cpd_path.'counter-core.php');
|
20 |
|
21 |
/**
|
56 |
// get count from collection
|
57 |
$c = $this->getCollectedPostReads($page);
|
58 |
// add current data
|
59 |
+
$c += $this->mysqlQuery('var', $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->cpd_counter WHERE page = %d", $page), 'show '.__LINE__);
|
60 |
if ($show)
|
61 |
echo $before.$c.$after;
|
62 |
else
|
106 |
.'page: <code>'.$page.'</code> '
|
107 |
.'userlevel: <code>'.$userlevel.'</code>';
|
108 |
|
109 |
+
// only count if: non bot, Logon is ok, no password required or ok
|
110 |
+
if ( !$isBot && $countUser && isset($page) && !post_password_required($page) )
|
111 |
{
|
112 |
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
|
113 |
{
|
119 |
$real_ip = $_SERVER['REMOTE_ADDR'];
|
120 |
|
121 |
$userip = $this->anonymize_ip($real_ip);
|
122 |
+
$client = ($this->options['referers']) ? wp_strip_all_tags($_SERVER['HTTP_USER_AGENT']) : '';
|
123 |
+
$referer = ($this->options['referers'] && isset($_SERVER['HTTP_REFERER'])) ? wp_strip_all_tags($_SERVER['HTTP_REFERER']) : '';
|
124 |
if ($this->options['referers_cut'])
|
125 |
$referer = substr( $referer, 0, strpos($referer,'?') );
|
126 |
|
133 |
{
|
134 |
// with GeoIP addon save country
|
135 |
$gi = cpd_geoip_open($cpd_path.'geoip/GeoIP.dat', GEOIP_STANDARD);
|
136 |
+
$country = strtolower(cpd_geoip_country_code_by_addr_v6($gi, $userip));
|
137 |
$this->mysqlQuery('', $wpdb->prepare("INSERT INTO $wpdb->cpd_counter (page, ip, client, date, country, referer)
|
138 |
VALUES (%s, $this->aton(%s), %s, %s, %s, %s)", $page, $userip, $client, $date, $country, $referer), 'count insert '.__LINE__);
|
139 |
}
|
668 |
* @param integer $limit count of posts (last posts)
|
669 |
* @param boolean $postsonly don't show categories and taxonomies
|
670 |
*/
|
671 |
+
function getMostVisitedPosts( $days = 0, $limit = 0, $frontend = false, $postsonly = false, $return = false, $posttypes = '' )
|
672 |
{
|
673 |
global $wpdb;
|
674 |
if ( $days == 0 )
|
677 |
$limit = $this->options['dashboard_last_posts'];
|
678 |
$date = date_i18n('Y-m-d', current_time('timestamp') - 86400 * $days);
|
679 |
|
680 |
+
if ($posttypes)
|
681 |
+
{
|
682 |
+
$types = str_replace(' ', '', $posttypes);
|
683 |
+
$types = str_replace(',', "','", $types);
|
684 |
+
$postsonly = 1;
|
685 |
+
}
|
686 |
+
else
|
687 |
+
$types = false;
|
688 |
+
|
689 |
if ($postsonly)
|
690 |
$sql = $wpdb->prepare("
|
691 |
SELECT COUNT(c.id) count,
|
696 |
ON p.id = c.page
|
697 |
WHERE c.date >= %s
|
698 |
AND c.page > 0
|
699 |
+
".( ($types) ? "AND p.post_type IN ('$types')" : '' )."
|
700 |
GROUP BY c.page
|
701 |
ORDER BY count DESC
|
702 |
LIMIT %d",
|
803 |
$date = $_GET['daytoshow'];
|
804 |
else if ( $date == 0 )
|
805 |
$date = date_i18n('Y-m-d');
|
806 |
+
$date = wp_strip_all_tags($date);
|
807 |
if ( $limit == 0 )
|
808 |
$limit = $this->options['dashboard_last_posts'];
|
809 |
|
1272 |
echo '<span id="cpd_number_'.$k.'" class="cpd-r">';
|
1273 |
// parameters only for special functions
|
1274 |
if ( $f == 'getUserPerDay' )
|
1275 |
+
echo $count_per_day->getUserPerDay($count_per_day->options['dashboard_last_days']);
|
1276 |
else if ( $f == 'show' )
|
1277 |
+
echo $count_per_day->show('', '', false, false);
|
1278 |
else
|
1279 |
+
echo call_user_func( array(&$count_per_day, $f) );
|
1280 |
+
echo '</span>'.__($instance[$k.'_name']).':</li>';
|
1281 |
}
|
1282 |
}
|
1283 |
}
|
1332 |
'getuseronline_name' => __('Visitors currently online', 'cpd'),
|
1333 |
'getfirstcount_name' => __('Counter starts on', 'cpd')
|
1334 |
);
|
1335 |
+
if (empty($instance['order']))
|
1336 |
+
$instance = array_merge( (array) $instance, $default );
|
1337 |
|
1338 |
// title field
|
1339 |
$field_id = $this->get_field_id('title');
|
1377 |
?>
|
1378 |
<script type="text/javascript">
|
1379 |
//<![CDATA[
|
|
|
1380 |
jQuery(document).ready(function(){
|
1381 |
jQuery('#cpdwidgetlist<?php echo $field_id ?>').sortable({
|
1382 |
items: 'li:not(.cpd_widget_title)',
|
geoip/GeoIP.dat
CHANGED
Binary file
|
geoip/cpd_geoip.inc
DELETED
@@ -1,713 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
|
4 |
-
/* geoip.inc
|
5 |
-
*
|
6 |
-
* Copyright (C) 2007 MaxMind LLC
|
7 |
-
*
|
8 |
-
* This library is free software; you can redistribute it and/or
|
9 |
-
* modify it under the terms of the GNU Lesser General Public
|
10 |
-
* License as published by the Free Software Foundation; either
|
11 |
-
* version 2.1 of the License, or (at your option) any later version.
|
12 |
-
*
|
13 |
-
* This library is distributed in the hope that it will be useful,
|
14 |
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15 |
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
16 |
-
* Lesser General Public License for more details.
|
17 |
-
*
|
18 |
-
* You should have received a copy of the GNU Lesser General Public
|
19 |
-
* License along with this library; if not, write to the Free Software
|
20 |
-
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
21 |
-
*/
|
22 |
-
|
23 |
-
define("GEOIP_COUNTRY_BEGIN", 16776960);
|
24 |
-
define("GEOIP_STATE_BEGIN_REV0", 16700000);
|
25 |
-
define("GEOIP_STATE_BEGIN_REV1", 16000000);
|
26 |
-
define("GEOIP_STANDARD", 0);
|
27 |
-
define("GEOIP_MEMORY_CACHE", 1);
|
28 |
-
define("GEOIP_SHARED_MEMORY", 2);
|
29 |
-
define("STRUCTURE_INFO_MAX_SIZE", 20);
|
30 |
-
define("DATABASE_INFO_MAX_SIZE", 100);
|
31 |
-
define("GEOIP_COUNTRY_EDITION", 106);
|
32 |
-
define("GEOIP_PROXY_EDITION", 8);
|
33 |
-
define("GEOIP_ASNUM_EDITION", 9);
|
34 |
-
define("GEOIP_NETSPEED_EDITION", 10);
|
35 |
-
define("GEOIP_REGION_EDITION_REV0", 112);
|
36 |
-
define("GEOIP_REGION_EDITION_REV1", 3);
|
37 |
-
define("GEOIP_CITY_EDITION_REV0", 111);
|
38 |
-
define("GEOIP_CITY_EDITION_REV1", 2);
|
39 |
-
define("GEOIP_ORG_EDITION", 110);
|
40 |
-
define("GEOIP_ISP_EDITION", 4);
|
41 |
-
define("SEGMENT_RECORD_LENGTH", 3);
|
42 |
-
define("STANDARD_RECORD_LENGTH", 3);
|
43 |
-
define("ORG_RECORD_LENGTH", 4);
|
44 |
-
define("MAX_RECORD_LENGTH", 4);
|
45 |
-
define("MAX_ORG_RECORD_LENGTH", 300);
|
46 |
-
define("GEOIP_SHM_KEY", 0x4f415401);
|
47 |
-
define("US_OFFSET", 1);
|
48 |
-
define("CANADA_OFFSET", 677);
|
49 |
-
define("WORLD_OFFSET", 1353);
|
50 |
-
define("FIPS_RANGE", 360);
|
51 |
-
define("GEOIP_UNKNOWN_SPEED", 0);
|
52 |
-
define("GEOIP_DIALUP_SPEED", 1);
|
53 |
-
define("GEOIP_CABLEDSL_SPEED", 2);
|
54 |
-
define("GEOIP_CORPORATE_SPEED", 3);
|
55 |
-
define("GEOIP_DOMAIN_EDITION", 11);
|
56 |
-
define("GEOIP_COUNTRY_EDITION_V6", 12);
|
57 |
-
define("GEOIP_LOCATIONA_EDITION", 13);
|
58 |
-
define("GEOIP_ACCURACYRADIUS_EDITION", 14);
|
59 |
-
define("GEOIP_CITYCOMBINED_EDITION", 15);
|
60 |
-
define("GEOIP_CITY_EDITION_REV1_V6", 30);
|
61 |
-
define("GEOIP_CITY_EDITION_REV0_V6",31);
|
62 |
-
define("GEOIP_NETSPEED_EDITION_REV1",32);
|
63 |
-
define("GEOIP_NETSPEED_EDITION_REV1_V6",33);
|
64 |
-
define("GEOIP_USERTYPE_EDITION",28);
|
65 |
-
define("GEOIP_USERTYPE_EDITION_V6",29);
|
66 |
-
define("GEOIP_ASNUM_EDITION_V6",21);
|
67 |
-
define("GEOIP_ISP_EDITION_V6",22);
|
68 |
-
define("GEOIP_ORG_EDITION_V6",23);
|
69 |
-
define("GEOIP_DOMAIN_EDITION_V6",24);
|
70 |
-
|
71 |
-
define("CITYCOMBINED_FIXED_RECORD", 7 );
|
72 |
-
|
73 |
-
class GeoIPCpD {
|
74 |
-
var $flags;
|
75 |
-
var $filehandle;
|
76 |
-
var $memory_buffer;
|
77 |
-
var $databaseType;
|
78 |
-
var $databaseSegments;
|
79 |
-
var $record_length;
|
80 |
-
var $shmid;
|
81 |
-
var $GEOIP_COUNTRY_CODE_TO_NUMBER = array(
|
82 |
-
"" => 0, "AP" => 1, "EU" => 2, "AD" => 3, "AE" => 4, "AF" => 5,
|
83 |
-
"AG" => 6, "AI" => 7, "AL" => 8, "AM" => 9, "CW" => 10, "AO" => 11,
|
84 |
-
"AQ" => 12, "AR" => 13, "AS" => 14, "AT" => 15, "AU" => 16, "AW" => 17,
|
85 |
-
"AZ" => 18, "BA" => 19, "BB" => 20, "BD" => 21, "BE" => 22, "BF" => 23,
|
86 |
-
"BG" => 24, "BH" => 25, "BI" => 26, "BJ" => 27, "BM" => 28, "BN" => 29,
|
87 |
-
"BO" => 30, "BR" => 31, "BS" => 32, "BT" => 33, "BV" => 34, "BW" => 35,
|
88 |
-
"BY" => 36, "BZ" => 37, "CA" => 38, "CC" => 39, "CD" => 40, "CF" => 41,
|
89 |
-
"CG" => 42, "CH" => 43, "CI" => 44, "CK" => 45, "CL" => 46, "CM" => 47,
|
90 |
-
"CN" => 48, "CO" => 49, "CR" => 50, "CU" => 51, "CV" => 52, "CX" => 53,
|
91 |
-
"CY" => 54, "CZ" => 55, "DE" => 56, "DJ" => 57, "DK" => 58, "DM" => 59,
|
92 |
-
"DO" => 60, "DZ" => 61, "EC" => 62, "EE" => 63, "EG" => 64, "EH" => 65,
|
93 |
-
"ER" => 66, "ES" => 67, "ET" => 68, "FI" => 69, "FJ" => 70, "FK" => 71,
|
94 |
-
"FM" => 72, "FO" => 73, "FR" => 74, "SX" => 75, "GA" => 76, "GB" => 77,
|
95 |
-
"GD" => 78, "GE" => 79, "GF" => 80, "GH" => 81, "GI" => 82, "GL" => 83,
|
96 |
-
"GM" => 84, "GN" => 85, "GP" => 86, "GQ" => 87, "GR" => 88, "GS" => 89,
|
97 |
-
"GT" => 90, "GU" => 91, "GW" => 92, "GY" => 93, "HK" => 94, "HM" => 95,
|
98 |
-
"HN" => 96, "HR" => 97, "HT" => 98, "HU" => 99, "ID" => 100, "IE" => 101,
|
99 |
-
"IL" => 102, "IN" => 103, "IO" => 104, "IQ" => 105, "IR" => 106, "IS" => 107,
|
100 |
-
"IT" => 108, "JM" => 109, "JO" => 110, "JP" => 111, "KE" => 112, "KG" => 113,
|
101 |
-
"KH" => 114, "KI" => 115, "KM" => 116, "KN" => 117, "KP" => 118, "KR" => 119,
|
102 |
-
"KW" => 120, "KY" => 121, "KZ" => 122, "LA" => 123, "LB" => 124, "LC" => 125,
|
103 |
-
"LI" => 126, "LK" => 127, "LR" => 128, "LS" => 129, "LT" => 130, "LU" => 131,
|
104 |
-
"LV" => 132, "LY" => 133, "MA" => 134, "MC" => 135, "MD" => 136, "MG" => 137,
|
105 |
-
"MH" => 138, "MK" => 139, "ML" => 140, "MM" => 141, "MN" => 142, "MO" => 143,
|
106 |
-
"MP" => 144, "MQ" => 145, "MR" => 146, "MS" => 147, "MT" => 148, "MU" => 149,
|
107 |
-
"MV" => 150, "MW" => 151, "MX" => 152, "MY" => 153, "MZ" => 154, "NA" => 155,
|
108 |
-
"NC" => 156, "NE" => 157, "NF" => 158, "NG" => 159, "NI" => 160, "NL" => 161,
|
109 |
-
"NO" => 162, "NP" => 163, "NR" => 164, "NU" => 165, "NZ" => 166, "OM" => 167,
|
110 |
-
"PA" => 168, "PE" => 169, "PF" => 170, "PG" => 171, "PH" => 172, "PK" => 173,
|
111 |
-
"PL" => 174, "PM" => 175, "PN" => 176, "PR" => 177, "PS" => 178, "PT" => 179,
|
112 |
-
"PW" => 180, "PY" => 181, "QA" => 182, "RE" => 183, "RO" => 184, "RU" => 185,
|
113 |
-
"RW" => 186, "SA" => 187, "SB" => 188, "SC" => 189, "SD" => 190, "SE" => 191,
|
114 |
-
"SG" => 192, "SH" => 193, "SI" => 194, "SJ" => 195, "SK" => 196, "SL" => 197,
|
115 |
-
"SM" => 198, "SN" => 199, "SO" => 200, "SR" => 201, "ST" => 202, "SV" => 203,
|
116 |
-
"SY" => 204, "SZ" => 205, "TC" => 206, "TD" => 207, "TF" => 208, "TG" => 209,
|
117 |
-
"TH" => 210, "TJ" => 211, "TK" => 212, "TM" => 213, "TN" => 214, "TO" => 215,
|
118 |
-
"TL" => 216, "TR" => 217, "TT" => 218, "TV" => 219, "TW" => 220, "TZ" => 221,
|
119 |
-
"UA" => 222, "UG" => 223, "UM" => 224, "US" => 225, "UY" => 226, "UZ" => 227,
|
120 |
-
"VA" => 228, "VC" => 229, "VE" => 230, "VG" => 231, "VI" => 232, "VN" => 233,
|
121 |
-
"VU" => 234, "WF" => 235, "WS" => 236, "YE" => 237, "YT" => 238, "RS" => 239,
|
122 |
-
"ZA" => 240, "ZM" => 241, "ME" => 242, "ZW" => 243, "A1" => 244, "A2" => 245,
|
123 |
-
"O1" => 246, "AX" => 247, "GG" => 248, "IM" => 249, "JE" => 250, "BL" => 251,
|
124 |
-
"MF" => 252, "BQ" => 253,
|
125 |
-
);
|
126 |
-
var $GEOIP_COUNTRY_CODES = array(
|
127 |
-
"","AP","EU","AD","AE","AF","AG","AI","AL","AM","CW",
|
128 |
-
"AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB",
|
129 |
-
"BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO",
|
130 |
-
"BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD",
|
131 |
-
"CF","CG","CH","CI","CK","CL","CM","CN","CO","CR",
|
132 |
-
"CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO",
|
133 |
-
"DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ",
|
134 |
-
"FK","FM","FO","FR","SX","GA","GB","GD","GE","GF",
|
135 |
-
"GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT",
|
136 |
-
"GU","GW","GY","HK","HM","HN","HR","HT","HU","ID",
|
137 |
-
"IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO",
|
138 |
-
"JP","KE","KG","KH","KI","KM","KN","KP","KR","KW",
|
139 |
-
"KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT",
|
140 |
-
"LU","LV","LY","MA","MC","MD","MG","MH","MK","ML",
|
141 |
-
"MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV",
|
142 |
-
"MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI",
|
143 |
-
"NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF",
|
144 |
-
"PG","PH","PK","PL","PM","PN","PR","PS","PT","PW",
|
145 |
-
"PY","QA","RE","RO","RU","RW","SA","SB","SC","SD",
|
146 |
-
"SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO",
|
147 |
-
"SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH",
|
148 |
-
"TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW",
|
149 |
-
"TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE",
|
150 |
-
"VG","VI","VN","VU","WF","WS","YE","YT","RS","ZA",
|
151 |
-
"ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE",
|
152 |
-
"BL","MF", "BQ");
|
153 |
-
var $GEOIP_COUNTRY_CODES3 = array(
|
154 |
-
"","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","CUW",
|
155 |
-
"AGO","ATA","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB",
|
156 |
-
"BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL",
|
157 |
-
"BRA","BHS","BTN","BVT","BWA","BLR","BLZ","CAN","CCK","COD",
|
158 |
-
"CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI",
|
159 |
-
"CUB","CPV","CXR","CYP","CZE","DEU","DJI","DNK","DMA","DOM",
|
160 |
-
"DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI",
|
161 |
-
"FLK","FSM","FRO","FRA","SXM","GAB","GBR","GRD","GEO","GUF",
|
162 |
-
"GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","SGS","GTM",
|
163 |
-
"GUM","GNB","GUY","HKG","HMD","HND","HRV","HTI","HUN","IDN",
|
164 |
-
"IRL","ISR","IND","IOT","IRQ","IRN","ISL","ITA","JAM","JOR",
|
165 |
-
"JPN","KEN","KGZ","KHM","KIR","COM","KNA","PRK","KOR","KWT",
|
166 |
-
"CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",
|
167 |
-
"LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI",
|
168 |
-
"MMR","MNG","MAC","MNP","MTQ","MRT","MSR","MLT","MUS","MDV",
|
169 |
-
"MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","NGA","NIC",
|
170 |
-
"NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER","PYF",
|
171 |
-
"PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW",
|
172 |
-
"PRY","QAT","REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN",
|
173 |
-
"SWE","SGP","SHN","SVN","SJM","SVK","SLE","SMR","SEN","SOM",
|
174 |
-
"SUR","STP","SLV","SYR","SWZ","TCA","TCD","ATF","TGO","THA",
|
175 |
-
"TJK","TKL","TKM","TUN","TON","TLS","TUR","TTO","TUV","TWN",
|
176 |
-
"TZA","UKR","UGA","UMI","USA","URY","UZB","VAT","VCT","VEN",
|
177 |
-
"VGB","VIR","VNM","VUT","WLF","WSM","YEM","MYT","SRB","ZAF",
|
178 |
-
"ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY",
|
179 |
-
"BLM","MAF", "BES"
|
180 |
-
);
|
181 |
-
var $GEOIP_COUNTRY_NAMES = array(
|
182 |
-
"","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Curacao",
|
183 |
-
"Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados",
|
184 |
-
"Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain","Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia",
|
185 |
-
"Brazil","Bahamas","Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada","Cocos (Keeling) Islands","Congo, The Democratic Republic of the",
|
186 |
-
"Central African Republic","Congo","Switzerland","Cote D'Ivoire","Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica",
|
187 |
-
"Cuba","Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany","Djibouti","Denmark","Dominica","Dominican Republic",
|
188 |
-
"Algeria","Ecuador","Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji",
|
189 |
-
"Falkland Islands (Malvinas)","Micronesia, Federated States of","Faroe Islands","France","Sint Maarten (Dutch part)","Gabon","United Kingdom","Grenada","Georgia","French Guiana",
|
190 |
-
"Ghana","Gibraltar","Greenland","Gambia","Guinea","Guadeloupe","Equatorial Guinea","Greece","South Georgia and the South Sandwich Islands","Guatemala",
|
191 |
-
"Guam","Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands","Honduras","Croatia","Haiti","Hungary","Indonesia",
|
192 |
-
"Ireland","Israel","India","British Indian Ocean Territory","Iraq","Iran, Islamic Republic of","Iceland","Italy","Jamaica","Jordan",
|
193 |
-
"Japan","Kenya","Kyrgyzstan","Cambodia","Kiribati","Comoros","Saint Kitts and Nevis","Korea, Democratic People's Republic of","Korea, Republic of","Kuwait",
|
194 |
-
"Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon","Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania",
|
195 |
-
"Luxembourg","Latvia","Libya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia","Mali",
|
196 |
-
"Myanmar","Mongolia","Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat","Malta","Mauritius","Maldives",
|
197 |
-
"Malawi","Mexico","Malaysia","Mozambique","Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua",
|
198 |
-
"Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama","Peru","French Polynesia",
|
199 |
-
"Papua New Guinea","Philippines","Pakistan","Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","Palestinian Territory","Portugal","Palau",
|
200 |
-
"Paraguay","Qatar","Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Sudan",
|
201 |
-
"Sweden","Singapore","Saint Helena","Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino","Senegal","Somalia","Suriname",
|
202 |
-
"Sao Tome and Principe","El Salvador","Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad","French Southern Territories","Togo","Thailand",
|
203 |
-
"Tajikistan","Tokelau","Turkmenistan","Tunisia","Tonga","Timor-Leste","Turkey","Trinidad and Tobago","Tuvalu","Taiwan",
|
204 |
-
"Tanzania, United Republic of","Ukraine","Uganda","United States Minor Outlying Islands","United States","Uruguay","Uzbekistan","Holy See (Vatican City State)","Saint Vincent and the Grenadines","Venezuela",
|
205 |
-
"Virgin Islands, British","Virgin Islands, U.S.","Vietnam","Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia","South Africa",
|
206 |
-
"Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey",
|
207 |
-
"Saint Barthelemy","Saint Martin", "Bonaire, Saint Eustatius and Saba"
|
208 |
-
);
|
209 |
-
|
210 |
-
var $GEOIP_CONTINENT_CODES = array(
|
211 |
-
"--", "AS","EU","EU","AS","AS","NA","NA","EU","AS","NA",
|
212 |
-
"AF","AN","SA","OC","EU","OC","NA","AS","EU","NA",
|
213 |
-
"AS","EU","AF","EU","AS","AF","AF","NA","AS","SA",
|
214 |
-
"SA","NA","AS","AN","AF","EU","NA","NA","AS","AF",
|
215 |
-
"AF","AF","EU","AF","OC","SA","AF","AS","SA","NA",
|
216 |
-
"NA","AF","AS","AS","EU","EU","AF","EU","NA","NA",
|
217 |
-
"AF","SA","EU","AF","AF","AF","EU","AF","EU","OC",
|
218 |
-
"SA","OC","EU","EU","NA","AF","EU","NA","AS","SA",
|
219 |
-
"AF","EU","NA","AF","AF","NA","AF","EU","AN","NA",
|
220 |
-
"OC","AF","SA","AS","AN","NA","EU","NA","EU","AS",
|
221 |
-
"EU","AS","AS","AS","AS","AS","EU","EU","NA","AS",
|
222 |
-
"AS","AF","AS","AS","OC","AF","NA","AS","AS","AS",
|
223 |
-
"NA","AS","AS","AS","NA","EU","AS","AF","AF","EU",
|
224 |
-
"EU","EU","AF","AF","EU","EU","AF","OC","EU","AF",
|
225 |
-
"AS","AS","AS","OC","NA","AF","NA","EU","AF","AS",
|
226 |
-
"AF","NA","AS","AF","AF","OC","AF","OC","AF","NA",
|
227 |
-
"EU","EU","AS","OC","OC","OC","AS","NA","SA","OC",
|
228 |
-
"OC","AS","AS","EU","NA","OC","NA","AS","EU","OC",
|
229 |
-
"SA","AS","AF","EU","EU","AF","AS","OC","AF","AF",
|
230 |
-
"EU","AS","AF","EU","EU","EU","AF","EU","AF","AF",
|
231 |
-
"SA","AF","NA","AS","AF","NA","AF","AN","AF","AS",
|
232 |
-
"AS","OC","AS","AF","OC","AS","EU","NA","OC","AS",
|
233 |
-
"AF","EU","AF","OC","NA","SA","AS","EU","NA","SA",
|
234 |
-
"NA","NA","AS","OC","OC","OC","AS","AF","EU","AF",
|
235 |
-
"AF","EU","AF","--","--","--","EU","EU","EU","EU",
|
236 |
-
"NA","NA","NA"
|
237 |
-
);
|
238 |
-
|
239 |
-
}
|
240 |
-
function cpd_geoip_load_shared_mem ($file) {
|
241 |
-
|
242 |
-
$fp = fopen($file, "rb");
|
243 |
-
if (!$fp) {
|
244 |
-
print "error opening $file: $php_errormsg\n";
|
245 |
-
exit;
|
246 |
-
}
|
247 |
-
$s_array = fstat($fp);
|
248 |
-
$size = $s_array['size'];
|
249 |
-
if ($shmid = @shmop_open (GEOIP_SHM_KEY, "w", 0, 0)) {
|
250 |
-
shmop_delete ($shmid);
|
251 |
-
shmop_close ($shmid);
|
252 |
-
}
|
253 |
-
$shmid = shmop_open (GEOIP_SHM_KEY, "c", 0644, $size);
|
254 |
-
shmop_write ($shmid, fread($fp, $size), 0);
|
255 |
-
shmop_close ($shmid);
|
256 |
-
}
|
257 |
-
|
258 |
-
function cpd_setup_segments($gi){
|
259 |
-
$gi->databaseType = GEOIP_COUNTRY_EDITION;
|
260 |
-
$gi->record_length = STANDARD_RECORD_LENGTH;
|
261 |
-
if ($gi->flags & GEOIP_SHARED_MEMORY) {
|
262 |
-
$offset = @shmop_size ($gi->shmid) - 3;
|
263 |
-
for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
|
264 |
-
$delim = @shmop_read ($gi->shmid, $offset, 3);
|
265 |
-
$offset += 3;
|
266 |
-
if ($delim == (chr(255).chr(255).chr(255))) {
|
267 |
-
$gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1));
|
268 |
-
$offset++;
|
269 |
-
|
270 |
-
if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
|
271 |
-
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
|
272 |
-
} else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
|
273 |
-
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
|
274 |
-
} else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)||
|
275 |
-
($gi->databaseType == GEOIP_CITY_EDITION_REV1)
|
276 |
-
|| ($gi->databaseType == GEOIP_ORG_EDITION)
|
277 |
-
|| ($gi->databaseType == GEOIP_ORG_EDITION_V6)
|
278 |
-
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION)
|
279 |
-
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
|
280 |
-
|| ($gi->databaseType == GEOIP_ISP_EDITION)
|
281 |
-
|| ($gi->databaseType == GEOIP_ISP_EDITION_V6)
|
282 |
-
|| ($gi->databaseType == GEOIP_USERTYPE_EDITION)
|
283 |
-
|| ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
|
284 |
-
|| ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
|
285 |
-
|| ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
|
286 |
-
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
|
287 |
-
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
|
288 |
-
|| ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
|
289 |
-
|| ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
|
290 |
-
|| ($gi->databaseType == GEOIP_ASNUM_EDITION)
|
291 |
-
|| ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
|
292 |
-
$gi->databaseSegments = 0;
|
293 |
-
$buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH);
|
294 |
-
for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
|
295 |
-
$gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
|
296 |
-
}
|
297 |
-
if (($gi->databaseType == GEOIP_ORG_EDITION)
|
298 |
-
|| ($gi->databaseType == GEOIP_ORG_EDITION_V6)
|
299 |
-
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION)
|
300 |
-
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
|
301 |
-
|| ($gi->databaseType == GEOIP_ISP_EDITION)
|
302 |
-
|| ($gi->databaseType == GEOIP_ISP_EDITION_V6)) {
|
303 |
-
$gi->record_length = ORG_RECORD_LENGTH;
|
304 |
-
}
|
305 |
-
}
|
306 |
-
break;
|
307 |
-
} else {
|
308 |
-
$offset -= 4;
|
309 |
-
}
|
310 |
-
}
|
311 |
-
if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
|
312 |
-
($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
|
313 |
-
($gi->databaseType == GEOIP_PROXY_EDITION)||
|
314 |
-
($gi->databaseType == GEOIP_NETSPEED_EDITION)){
|
315 |
-
$gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
|
316 |
-
}
|
317 |
-
} else {
|
318 |
-
$filepos = ftell($gi->filehandle);
|
319 |
-
fseek($gi->filehandle, -3, SEEK_END);
|
320 |
-
for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
|
321 |
-
$delim = fread($gi->filehandle,3);
|
322 |
-
if ($delim == (chr(255).chr(255).chr(255))){
|
323 |
-
$gi->databaseType = ord(fread($gi->filehandle,1));
|
324 |
-
if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
|
325 |
-
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
|
326 |
-
}
|
327 |
-
else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
|
328 |
-
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
|
329 |
-
} else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)
|
330 |
-
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
|
331 |
-
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
|
332 |
-
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
|
333 |
-
|| ($gi->databaseType == GEOIP_ORG_EDITION)
|
334 |
-
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION)
|
335 |
-
|| ($gi->databaseType == GEOIP_ISP_EDITION)
|
336 |
-
|| ($gi->databaseType == GEOIP_ORG_EDITION_V6)
|
337 |
-
|| ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
|
338 |
-
|| ($gi->databaseType == GEOIP_ISP_EDITION_V6)
|
339 |
-
|| ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
|
340 |
-
|| ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
|
341 |
-
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
|
342 |
-
|| ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
|
343 |
-
|| ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
|
344 |
-
|| ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
|
345 |
-
|| ($gi->databaseType == GEOIP_USERTYPE_EDITION)
|
346 |
-
|| ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
|
347 |
-
|| ($gi->databaseType == GEOIP_ASNUM_EDITION)
|
348 |
-
|| ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
|
349 |
-
$gi->databaseSegments = 0;
|
350 |
-
$buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH);
|
351 |
-
for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
|
352 |
-
$gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
|
353 |
-
}
|
354 |
-
if ( ( $gi->databaseType == GEOIP_ORG_EDITION )
|
355 |
-
|| ( $gi->databaseType == GEOIP_DOMAIN_EDITION )
|
356 |
-
|| ( $gi->databaseType == GEOIP_ISP_EDITION )
|
357 |
-
|| ( $gi->databaseType == GEOIP_ORG_EDITION_V6 )
|
358 |
-
|| ( $gi->databaseType == GEOIP_DOMAIN_EDITION_V6 )
|
359 |
-
|| ( $gi->databaseType == GEOIP_ISP_EDITION_V6 )) {
|
360 |
-
$gi->record_length = ORG_RECORD_LENGTH;
|
361 |
-
}
|
362 |
-
}
|
363 |
-
break;
|
364 |
-
} else {
|
365 |
-
fseek($gi->filehandle, -4, SEEK_CUR);
|
366 |
-
}
|
367 |
-
}
|
368 |
-
if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
|
369 |
-
($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
|
370 |
-
($gi->databaseType == GEOIP_PROXY_EDITION)||
|
371 |
-
($gi->databaseType == GEOIP_NETSPEED_EDITION)){
|
372 |
-
$gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
|
373 |
-
}
|
374 |
-
fseek($gi->filehandle,$filepos,SEEK_SET);
|
375 |
-
}
|
376 |
-
return $gi;
|
377 |
-
}
|
378 |
-
|
379 |
-
function cpd_geoip_open($filename, $flags) {
|
380 |
-
$gi = new GeoIPCpD;
|
381 |
-
$gi->flags = $flags;
|
382 |
-
if ($gi->flags & GEOIP_SHARED_MEMORY) {
|
383 |
-
$gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0);
|
384 |
-
} else {
|
385 |
-
$gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" );
|
386 |
-
if ($gi->flags & GEOIP_MEMORY_CACHE) {
|
387 |
-
$s_array = fstat($gi->filehandle);
|
388 |
-
$gi->memory_buffer = fread($gi->filehandle, $s_array['size']);
|
389 |
-
}
|
390 |
-
}
|
391 |
-
|
392 |
-
$gi = cpd_setup_segments($gi);
|
393 |
-
return $gi;
|
394 |
-
}
|
395 |
-
|
396 |
-
function cpd_geoip_close($gi) {
|
397 |
-
if ($gi->flags & GEOIP_SHARED_MEMORY) {
|
398 |
-
return true;
|
399 |
-
}
|
400 |
-
|
401 |
-
return fclose($gi->filehandle);
|
402 |
-
}
|
403 |
-
|
404 |
-
function cpd_geoip_country_id_by_name_v6($gi, $name) {
|
405 |
-
$rec = dns_get_record($name, DNS_AAAA);
|
406 |
-
if ( !$rec ) {
|
407 |
-
return false;
|
408 |
-
}
|
409 |
-
$addr = $rec[0]["ipv6"];
|
410 |
-
if (!$addr || $addr == $name) {
|
411 |
-
return false;
|
412 |
-
}
|
413 |
-
return cpd_geoip_country_id_by_addr_v6($gi, $addr);
|
414 |
-
}
|
415 |
-
|
416 |
-
function cpd_geoip_country_id_by_name($gi, $name) {
|
417 |
-
$addr = gethostbyname($name);
|
418 |
-
if (!$addr || $addr == $name) {
|
419 |
-
return false;
|
420 |
-
}
|
421 |
-
return cpd_geoip_country_id_by_addr($gi, $addr);
|
422 |
-
}
|
423 |
-
|
424 |
-
function cpd_geoip_country_code_by_name_v6($gi, $name) {
|
425 |
-
$country_id = cpd_geoip_country_id_by_name_v6($gi,$name);
|
426 |
-
if ($country_id !== false) {
|
427 |
-
return $gi->GEOIP_COUNTRY_CODES[$country_id];
|
428 |
-
}
|
429 |
-
return false;
|
430 |
-
}
|
431 |
-
|
432 |
-
function cpd_geoip_country_code_by_name($gi, $name) {
|
433 |
-
$country_id = cpd_geoip_country_id_by_name($gi,$name);
|
434 |
-
if ($country_id !== false) {
|
435 |
-
return $gi->GEOIP_COUNTRY_CODES[$country_id];
|
436 |
-
}
|
437 |
-
return false;
|
438 |
-
}
|
439 |
-
|
440 |
-
function cpd_geoip_country_name_by_name_v6($gi, $name) {
|
441 |
-
$country_id = cpd_geoip_country_id_by_name_v6($gi,$name);
|
442 |
-
if ($country_id !== false) {
|
443 |
-
return $gi->GEOIP_COUNTRY_NAMES[$country_id];
|
444 |
-
}
|
445 |
-
return false;
|
446 |
-
}
|
447 |
-
|
448 |
-
function cpd_geoip_country_name_by_name($gi, $name) {
|
449 |
-
$country_id = cpd_geoip_country_id_by_name($gi,$name);
|
450 |
-
if ($country_id !== false) {
|
451 |
-
return $gi->GEOIP_COUNTRY_NAMES[$country_id];
|
452 |
-
}
|
453 |
-
return false;
|
454 |
-
}
|
455 |
-
|
456 |
-
function cpd_geoip_country_id_by_addr_v6($gi, $addr) {
|
457 |
-
$ipnum = inet_pton($addr);
|
458 |
-
return cpd_geoip_seek_country_v6($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
|
459 |
-
}
|
460 |
-
|
461 |
-
function cpd_geoip_country_id_by_addr($gi, $addr) {
|
462 |
-
$ipnum = ip2long($addr);
|
463 |
-
return cpd_geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
|
464 |
-
}
|
465 |
-
|
466 |
-
function cpd_geoip_country_code_by_addr_v6($gi, $addr) {
|
467 |
-
$country_id = cpd_geoip_country_id_by_addr_v6($gi,$addr);
|
468 |
-
if ($country_id !== false) {
|
469 |
-
return $gi->GEOIP_COUNTRY_CODES[$country_id];
|
470 |
-
}
|
471 |
-
return false;
|
472 |
-
}
|
473 |
-
|
474 |
-
function cpd_geoip_country_code_by_addr($gi, $addr) {
|
475 |
-
if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
|
476 |
-
$record = cpd_geoip_record_by_addr($gi,$addr);
|
477 |
-
if ( $record !== false ) {
|
478 |
-
return $record->country_code;
|
479 |
-
}
|
480 |
-
} else {
|
481 |
-
$country_id = cpd_geoip_country_id_by_addr($gi,$addr);
|
482 |
-
if ($country_id !== false) {
|
483 |
-
return $gi->GEOIP_COUNTRY_CODES[$country_id];
|
484 |
-
}
|
485 |
-
}
|
486 |
-
return false;
|
487 |
-
}
|
488 |
-
|
489 |
-
function cpd_geoip_country_name_by_addr_v6($gi, $addr) {
|
490 |
-
$country_id = cpd_geoip_country_id_by_addr_v6($gi,$addr);
|
491 |
-
if ($country_id !== false) {
|
492 |
-
return $gi->GEOIP_COUNTRY_NAMES[$country_id];
|
493 |
-
}
|
494 |
-
return false;
|
495 |
-
}
|
496 |
-
|
497 |
-
function cpd_geoip_country_name_by_addr($gi, $addr) {
|
498 |
-
if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
|
499 |
-
$record = cpd_geoip_record_by_addr($gi,$addr);
|
500 |
-
return $record->country_name;
|
501 |
-
} else {
|
502 |
-
$country_id = cpd_geoip_country_id_by_addr($gi,$addr);
|
503 |
-
if ($country_id !== false) {
|
504 |
-
return $gi->GEOIP_COUNTRY_NAMES[$country_id];
|
505 |
-
}
|
506 |
-
}
|
507 |
-
return false;
|
508 |
-
}
|
509 |
-
|
510 |
-
function cpd_geoip_seek_country_v6($gi, $ipnum) {
|
511 |
-
|
512 |
-
# arrays from unpack start with offset 1
|
513 |
-
# yet another php mystery. array_merge work around
|
514 |
-
# this broken behaviour
|
515 |
-
$v6vec = array_merge(unpack( "C16", $ipnum));
|
516 |
-
|
517 |
-
$offset = 0;
|
518 |
-
for ($depth = 127; $depth >= 0; --$depth) {
|
519 |
-
if ($gi->flags & GEOIP_MEMORY_CACHE) {
|
520 |
-
// workaround php's broken substr, strpos, etc handling with
|
521 |
-
// mbstring.func_overload and mbstring.internal_encoding
|
522 |
-
$enc = mb_internal_encoding();
|
523 |
-
mb_internal_encoding('ISO-8859-1');
|
524 |
-
|
525 |
-
$buf = substr($gi->memory_buffer,
|
526 |
-
2 * $gi->record_length * $offset,
|
527 |
-
2 * $gi->record_length);
|
528 |
-
|
529 |
-
mb_internal_encoding($enc);
|
530 |
-
} elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
|
531 |
-
$buf = @shmop_read ($gi->shmid,
|
532 |
-
2 * $gi->record_length * $offset,
|
533 |
-
2 * $gi->record_length );
|
534 |
-
} else {
|
535 |
-
fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
|
536 |
-
or die("fseek failed");
|
537 |
-
$buf = fread($gi->filehandle, 2 * $gi->record_length);
|
538 |
-
}
|
539 |
-
$x = array(0,0);
|
540 |
-
for ($i = 0; $i < 2; ++$i) {
|
541 |
-
for ($j = 0; $j < $gi->record_length; ++$j) {
|
542 |
-
$x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
|
543 |
-
}
|
544 |
-
}
|
545 |
-
|
546 |
-
$bnum = 127 - $depth;
|
547 |
-
$idx = $bnum >> 3;
|
548 |
-
$b_mask = 1 << ( $bnum & 7 ^ 7 );
|
549 |
-
if (($v6vec[$idx] & $b_mask) > 0) {
|
550 |
-
if ($x[1] >= $gi->databaseSegments) {
|
551 |
-
return $x[1];
|
552 |
-
}
|
553 |
-
$offset = $x[1];
|
554 |
-
} else {
|
555 |
-
if ($x[0] >= $gi->databaseSegments) {
|
556 |
-
return $x[0];
|
557 |
-
}
|
558 |
-
$offset = $x[0];
|
559 |
-
}
|
560 |
-
}
|
561 |
-
trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
|
562 |
-
return false;
|
563 |
-
}
|
564 |
-
|
565 |
-
function cpd_geoip_seek_country($gi, $ipnum) {
|
566 |
-
$offset = 0;
|
567 |
-
for ($depth = 31; $depth >= 0; --$depth) {
|
568 |
-
if ($gi->flags & GEOIP_MEMORY_CACHE) {
|
569 |
-
// workaround php's broken substr, strpos, etc handling with
|
570 |
-
// mbstring.func_overload and mbstring.internal_encoding
|
571 |
-
$enc = mb_internal_encoding();
|
572 |
-
mb_internal_encoding('ISO-8859-1');
|
573 |
-
|
574 |
-
$buf = substr($gi->memory_buffer,
|
575 |
-
2 * $gi->record_length * $offset,
|
576 |
-
2 * $gi->record_length);
|
577 |
-
|
578 |
-
mb_internal_encoding($enc);
|
579 |
-
} elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
|
580 |
-
$buf = @shmop_read ($gi->shmid,
|
581 |
-
2 * $gi->record_length * $offset,
|
582 |
-
2 * $gi->record_length );
|
583 |
-
} else {
|
584 |
-
fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
|
585 |
-
or die("fseek failed");
|
586 |
-
$buf = fread($gi->filehandle, 2 * $gi->record_length);
|
587 |
-
}
|
588 |
-
$x = array(0,0);
|
589 |
-
for ($i = 0; $i < 2; ++$i) {
|
590 |
-
for ($j = 0; $j < $gi->record_length; ++$j) {
|
591 |
-
$x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
|
592 |
-
}
|
593 |
-
}
|
594 |
-
if ($ipnum & (1 << $depth)) {
|
595 |
-
if ($x[1] >= $gi->databaseSegments) {
|
596 |
-
return $x[1];
|
597 |
-
}
|
598 |
-
$offset = $x[1];
|
599 |
-
} else {
|
600 |
-
if ($x[0] >= $gi->databaseSegments) {
|
601 |
-
return $x[0];
|
602 |
-
}
|
603 |
-
$offset = $x[0];
|
604 |
-
}
|
605 |
-
}
|
606 |
-
trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
|
607 |
-
return false;
|
608 |
-
}
|
609 |
-
|
610 |
-
function cpd_common_get_org($gi, $seek_org){
|
611 |
-
$record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments;
|
612 |
-
if ($gi->flags & GEOIP_SHARED_MEMORY) {
|
613 |
-
$org_buf = @shmop_read ($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH);
|
614 |
-
} else {
|
615 |
-
fseek($gi->filehandle, $record_pointer, SEEK_SET);
|
616 |
-
$org_buf = fread($gi->filehandle,MAX_ORG_RECORD_LENGTH);
|
617 |
-
}
|
618 |
-
// workaround php's broken substr, strpos, etc handling with
|
619 |
-
// mbstring.func_overload and mbstring.internal_encoding
|
620 |
-
$enc = mb_internal_encoding();
|
621 |
-
mb_internal_encoding('ISO-8859-1');
|
622 |
-
$org_buf = substr($org_buf, 0, strpos($org_buf, "\0"));
|
623 |
-
mb_internal_encoding($enc);
|
624 |
-
return $org_buf;
|
625 |
-
}
|
626 |
-
|
627 |
-
function cpd_get_org_v6($gi,$ipnum){
|
628 |
-
$seek_org = cpd_geoip_seek_country_v6($gi,$ipnum);
|
629 |
-
if ($seek_org == $gi->databaseSegments) {
|
630 |
-
return NULL;
|
631 |
-
}
|
632 |
-
return cpd_common_get_org($gi, $seek_org);
|
633 |
-
}
|
634 |
-
|
635 |
-
function cpd_get_org($gi,$ipnum){
|
636 |
-
$seek_org = cpd_geoip_seek_country($gi,$ipnum);
|
637 |
-
if ($seek_org == $gi->databaseSegments) {
|
638 |
-
return NULL;
|
639 |
-
}
|
640 |
-
return cpd_common_get_org($gi, $seek_org);
|
641 |
-
}
|
642 |
-
|
643 |
-
|
644 |
-
|
645 |
-
function cpd_geoip_name_by_addr_v6 ($gi,$addr) {
|
646 |
-
if ($addr == NULL) {
|
647 |
-
return 0;
|
648 |
-
}
|
649 |
-
$ipnum = inet_pton($addr);
|
650 |
-
return cpd_get_org_v6($gi, $ipnum);
|
651 |
-
}
|
652 |
-
|
653 |
-
function cpd_geoip_name_by_addr ($gi,$addr) {
|
654 |
-
if ($addr == NULL) {
|
655 |
-
return 0;
|
656 |
-
}
|
657 |
-
$ipnum = ip2long($addr);
|
658 |
-
return cpd_get_org($gi, $ipnum);
|
659 |
-
}
|
660 |
-
|
661 |
-
function cpd_geoip_org_by_addr ($gi,$addr) {
|
662 |
-
return cpd_geoip_name_by_addr($gi, $addr);
|
663 |
-
}
|
664 |
-
|
665 |
-
function cpd_get_region($gi,$ipnum){
|
666 |
-
if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
|
667 |
-
$seek_region = cpd_geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV0;
|
668 |
-
if ($seek_region >= 1000){
|
669 |
-
$country_code = "US";
|
670 |
-
$region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65);
|
671 |
-
} else {
|
672 |
-
$country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region];
|
673 |
-
$region = "";
|
674 |
-
}
|
675 |
-
return array ($country_code,$region);
|
676 |
-
} else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1) {
|
677 |
-
$seek_region = cpd_geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV1;
|
678 |
-
//print $seek_region;
|
679 |
-
if ($seek_region < US_OFFSET){
|
680 |
-
$country_code = "";
|
681 |
-
$region = "";
|
682 |
-
} else if ($seek_region < CANADA_OFFSET) {
|
683 |
-
$country_code = "US";
|
684 |
-
$region = chr(($seek_region - US_OFFSET)/26 + 65) . chr(($seek_region - US_OFFSET)%26 + 65);
|
685 |
-
} else if ($seek_region < WORLD_OFFSET) {
|
686 |
-
$country_code = "CA";
|
687 |
-
$region = chr(($seek_region - CANADA_OFFSET)/26 + 65) . chr(($seek_region - CANADA_OFFSET)%26 + 65);
|
688 |
-
} else {
|
689 |
-
$country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE];
|
690 |
-
$region = "";
|
691 |
-
}
|
692 |
-
return array ($country_code,$region);
|
693 |
-
}
|
694 |
-
}
|
695 |
-
|
696 |
-
function cpd_geoip_region_by_addr ($gi,$addr) {
|
697 |
-
if ($addr == NULL) {
|
698 |
-
return 0;
|
699 |
-
}
|
700 |
-
$ipnum = ip2long($addr);
|
701 |
-
return cpd_get_region($gi, $ipnum);
|
702 |
-
}
|
703 |
-
|
704 |
-
function cpd_getdnsattributes ($l,$ip){
|
705 |
-
$r = new Net_DNS_Resolver();
|
706 |
-
$r->nameservers = array("ws1.maxmind.com");
|
707 |
-
$p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN");
|
708 |
-
$str = is_object($p->answer[0])?$p->answer[0]->string():'';
|
709 |
-
$str = substr( $str, 1, -1 );
|
710 |
-
return $str;
|
711 |
-
}
|
712 |
-
|
713 |
-
?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
geoip/geoip.inc
CHANGED
@@ -52,6 +52,23 @@ define("GEOIP_UNKNOWN_SPEED", 0);
|
|
52 |
define("GEOIP_DIALUP_SPEED", 1);
|
53 |
define("GEOIP_CABLEDSL_SPEED", 2);
|
54 |
define("GEOIP_CORPORATE_SPEED", 3);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
|
56 |
class GeoIPCpd {
|
57 |
var $flags;
|
@@ -62,147 +79,163 @@ class GeoIPCpd {
|
|
62 |
var $record_length;
|
63 |
var $shmid;
|
64 |
var $GEOIP_COUNTRY_CODE_TO_NUMBER = array(
|
65 |
-
"" => 0, "AP" => 1, "EU" => 2, "AD" => 3, "AE" => 4, "AF" => 5,
|
66 |
-
"AG" => 6, "AI" => 7, "AL" => 8, "AM" => 9, "
|
67 |
-
"AQ" => 12, "AR" => 13, "AS" => 14, "AT" => 15, "AU" => 16, "AW" => 17,
|
68 |
-
"AZ" => 18, "BA" => 19, "BB" => 20, "BD" => 21, "BE" => 22, "BF" => 23,
|
69 |
-
"BG" => 24, "BH" => 25, "BI" => 26, "BJ" => 27, "BM" => 28, "BN" => 29,
|
70 |
-
"BO" => 30, "BR" => 31, "BS" => 32, "BT" => 33, "BV" => 34, "BW" => 35,
|
71 |
-
"BY" => 36, "BZ" => 37, "CA" => 38, "CC" => 39, "CD" => 40, "CF" => 41,
|
72 |
-
"CG" => 42, "CH" => 43, "CI" => 44, "CK" => 45, "CL" => 46, "CM" => 47,
|
73 |
-
"CN" => 48, "CO" => 49, "CR" => 50, "CU" => 51, "CV" => 52, "CX" => 53,
|
74 |
-
"CY" => 54, "CZ" => 55, "DE" => 56, "DJ" => 57, "DK" => 58, "DM" => 59,
|
75 |
-
"DO" => 60, "DZ" => 61, "EC" => 62, "EE" => 63, "EG" => 64, "EH" => 65,
|
76 |
-
"ER" => 66, "ES" => 67, "ET" => 68, "FI" => 69, "FJ" => 70, "FK" => 71,
|
77 |
-
"FM" => 72, "FO" => 73, "FR" => 74, "
|
78 |
-
"GD" => 78, "GE" => 79, "GF" => 80, "GH" => 81, "GI" => 82, "GL" => 83,
|
79 |
-
"GM" => 84, "GN" => 85, "GP" => 86, "GQ" => 87, "GR" => 88, "GS" => 89,
|
80 |
-
"GT" => 90, "GU" => 91, "GW" => 92, "GY" => 93, "HK" => 94, "HM" => 95,
|
81 |
-
"HN" => 96, "HR" => 97, "HT" => 98, "HU" => 99, "ID" => 100, "IE" => 101,
|
82 |
-
"IL" => 102, "IN" => 103, "IO" => 104, "IQ" => 105, "IR" => 106, "IS" => 107,
|
83 |
-
"IT" => 108, "JM" => 109, "JO" => 110, "JP" => 111, "KE" => 112, "KG" => 113,
|
84 |
-
"KH" => 114, "KI" => 115, "KM" => 116, "KN" => 117, "KP" => 118, "KR" => 119,
|
85 |
-
"KW" => 120, "KY" => 121, "KZ" => 122, "LA" => 123, "LB" => 124, "LC" => 125,
|
86 |
-
"LI" => 126, "LK" => 127, "LR" => 128, "LS" => 129, "LT" => 130, "LU" => 131,
|
87 |
-
"LV" => 132, "LY" => 133, "MA" => 134, "MC" => 135, "MD" => 136, "MG" => 137,
|
88 |
-
"MH" => 138, "MK" => 139, "ML" => 140, "MM" => 141, "MN" => 142, "MO" => 143,
|
89 |
-
"MP" => 144, "MQ" => 145, "MR" => 146, "MS" => 147, "MT" => 148, "MU" => 149,
|
90 |
"MV" => 150, "MW" => 151, "MX" => 152, "MY" => 153, "MZ" => 154, "NA" => 155,
|
91 |
-
"NC" => 156, "NE" => 157, "NF" => 158, "NG" => 159, "NI" => 160, "NL" => 161,
|
92 |
-
"NO" => 162, "NP" => 163, "NR" => 164, "NU" => 165, "NZ" => 166, "OM" => 167,
|
93 |
-
"PA" => 168, "PE" => 169, "PF" => 170, "PG" => 171, "PH" => 172, "PK" => 173,
|
94 |
-
"PL" => 174, "PM" => 175, "PN" => 176, "PR" => 177, "PS" => 178, "PT" => 179,
|
95 |
-
"PW" => 180, "PY" => 181, "QA" => 182, "RE" => 183, "RO" => 184, "RU" => 185,
|
96 |
-
"RW" => 186, "SA" => 187, "SB" => 188, "SC" => 189, "SD" => 190, "SE" => 191,
|
97 |
-
"SG" => 192, "SH" => 193, "SI" => 194, "SJ" => 195, "SK" => 196, "SL" => 197,
|
98 |
-
"SM" => 198, "SN" => 199, "SO" => 200, "SR" => 201, "ST" => 202, "SV" => 203,
|
99 |
-
"SY" => 204, "SZ" => 205, "TC" => 206, "TD" => 207, "TF" => 208, "TG" => 209,
|
100 |
-
"TH" => 210, "TJ" => 211, "TK" => 212, "TM" => 213, "TN" => 214, "TO" => 215,
|
101 |
-
"TL" => 216, "TR" => 217, "TT" => 218, "TV" => 219, "TW" => 220, "TZ" => 221,
|
102 |
-
"UA" => 222, "UG" => 223, "UM" => 224, "US" => 225, "UY" => 226, "UZ" => 227,
|
103 |
"VA" => 228, "VC" => 229, "VE" => 230, "VG" => 231, "VI" => 232, "VN" => 233,
|
104 |
-
"VU" => 234, "WF" => 235, "WS" => 236, "YE" => 237, "YT" => 238, "RS" => 239,
|
105 |
-
"ZA" => 240, "ZM" => 241, "ME" => 242, "ZW" => 243, "A1" => 244, "A2" => 245,
|
106 |
"O1" => 246, "AX" => 247, "GG" => 248, "IM" => 249, "JE" => 250, "BL" => 251,
|
107 |
-
"MF" => 252
|
108 |
);
|
109 |
var $GEOIP_COUNTRY_CODES = array(
|
110 |
-
"",
|
111 |
-
"AR",
|
112 |
-
"
|
113 |
-
"
|
114 |
-
"
|
115 |
-
"
|
116 |
-
"
|
117 |
-
"
|
118 |
-
"
|
119 |
-
"
|
120 |
-
"
|
121 |
-
"
|
122 |
-
"
|
123 |
-
"
|
124 |
-
"
|
125 |
-
"
|
126 |
-
"
|
127 |
-
"
|
128 |
-
"
|
129 |
-
"
|
130 |
-
|
|
|
|
|
|
|
|
|
|
|
131 |
var $GEOIP_COUNTRY_CODES3 = array(
|
132 |
-
"","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","
|
133 |
-
"
|
134 |
-
"
|
135 |
-
"
|
136 |
-
"
|
137 |
-
"
|
138 |
-
"
|
139 |
-
"
|
140 |
-
"
|
141 |
-
"
|
142 |
-
"
|
143 |
-
"
|
144 |
-
"
|
145 |
-
"
|
146 |
-
"
|
147 |
-
"
|
148 |
-
"
|
149 |
-
"
|
150 |
-
"
|
151 |
-
"
|
152 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
153 |
var $GEOIP_COUNTRY_NAMES = array(
|
154 |
-
"",
|
155 |
-
"
|
156 |
-
"
|
157 |
-
"
|
158 |
-
"
|
159 |
-
"
|
160 |
-
"
|
161 |
-
"
|
162 |
-
"
|
163 |
-
"
|
164 |
-
"
|
165 |
-
"
|
166 |
-
"
|
167 |
-
"
|
168 |
-
"
|
169 |
-
"
|
170 |
-
"
|
171 |
-
"
|
172 |
-
"
|
173 |
-
"
|
174 |
-
"
|
175 |
-
"
|
176 |
-
"
|
177 |
-
"
|
178 |
-
"
|
179 |
-
"
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
"
|
184 |
-
"
|
185 |
-
"
|
186 |
-
"
|
187 |
-
"
|
188 |
-
"
|
189 |
-
"
|
190 |
-
"
|
191 |
-
"
|
192 |
-
"
|
193 |
-
"
|
194 |
-
"
|
195 |
-
"
|
196 |
-
"
|
197 |
-
"
|
198 |
-
"
|
199 |
-
"
|
200 |
-
"
|
201 |
-
"
|
202 |
-
"
|
203 |
-
"
|
204 |
-
"
|
|
|
|
|
|
|
|
|
205 |
);
|
|
|
206 |
}
|
207 |
|
208 |
function cpd_geoip_load_shared_mem ($file) {
|
@@ -223,7 +256,7 @@ function cpd_geoip_load_shared_mem ($file) {
|
|
223 |
shmop_close ($shmid);
|
224 |
}
|
225 |
|
226 |
-
function
|
227 |
$gi->databaseType = GEOIP_COUNTRY_EDITION;
|
228 |
$gi->record_length = STANDARD_RECORD_LENGTH;
|
229 |
if ($gi->flags & GEOIP_SHARED_MEMORY) {
|
@@ -242,15 +275,32 @@ function cpd_setup_segments($gi){
|
|
242 |
} else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)||
|
243 |
($gi->databaseType == GEOIP_CITY_EDITION_REV1)
|
244 |
|| ($gi->databaseType == GEOIP_ORG_EDITION)
|
|
|
|
|
|
|
245 |
|| ($gi->databaseType == GEOIP_ISP_EDITION)
|
246 |
-
|| ($gi->databaseType ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
247 |
$gi->databaseSegments = 0;
|
248 |
$buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH);
|
249 |
for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
|
250 |
$gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
|
251 |
}
|
252 |
-
if (($gi->databaseType == GEOIP_ORG_EDITION)
|
253 |
-
|
|
|
|
|
|
|
|
|
254 |
$gi->record_length = ORG_RECORD_LENGTH;
|
255 |
}
|
256 |
}
|
@@ -260,6 +310,7 @@ function cpd_setup_segments($gi){
|
|
260 |
}
|
261 |
}
|
262 |
if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
|
|
|
263 |
($gi->databaseType == GEOIP_PROXY_EDITION)||
|
264 |
($gi->databaseType == GEOIP_NETSPEED_EDITION)){
|
265 |
$gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
|
@@ -276,18 +327,37 @@ function cpd_setup_segments($gi){
|
|
276 |
}
|
277 |
else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
|
278 |
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
|
279 |
-
} else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
284 |
$gi->databaseSegments = 0;
|
285 |
$buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH);
|
286 |
for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
|
287 |
$gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
|
288 |
}
|
289 |
-
if ($gi->databaseType == GEOIP_ORG_EDITION
|
290 |
-
|
|
|
|
|
|
|
|
|
291 |
$gi->record_length = ORG_RECORD_LENGTH;
|
292 |
}
|
293 |
}
|
@@ -297,6 +367,7 @@ function cpd_setup_segments($gi){
|
|
297 |
}
|
298 |
}
|
299 |
if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
|
|
|
300 |
($gi->databaseType == GEOIP_PROXY_EDITION)||
|
301 |
($gi->databaseType == GEOIP_NETSPEED_EDITION)){
|
302 |
$gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
|
@@ -307,7 +378,7 @@ function cpd_setup_segments($gi){
|
|
307 |
}
|
308 |
|
309 |
function cpd_geoip_open($filename, $flags) {
|
310 |
-
$gi = new
|
311 |
$gi->flags = $flags;
|
312 |
if ($gi->flags & GEOIP_SHARED_MEMORY) {
|
313 |
$gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0);
|
@@ -319,7 +390,7 @@ function cpd_geoip_open($filename, $flags) {
|
|
319 |
}
|
320 |
}
|
321 |
|
322 |
-
$gi =
|
323 |
return $gi;
|
324 |
}
|
325 |
|
@@ -331,6 +402,18 @@ function cpd_geoip_close($gi) {
|
|
331 |
return fclose($gi->filehandle);
|
332 |
}
|
333 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
334 |
function cpd_geoip_country_id_by_name($gi, $name) {
|
335 |
$addr = gethostbyname($name);
|
336 |
if (!$addr || $addr == $name) {
|
@@ -339,6 +422,14 @@ function cpd_geoip_country_id_by_name($gi, $name) {
|
|
339 |
return cpd_geoip_country_id_by_addr($gi, $addr);
|
340 |
}
|
341 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
342 |
function cpd_geoip_country_code_by_name($gi, $name) {
|
343 |
$country_id = cpd_geoip_country_id_by_name($gi,$name);
|
344 |
if ($country_id !== false) {
|
@@ -347,6 +438,14 @@ function cpd_geoip_country_code_by_name($gi, $name) {
|
|
347 |
return false;
|
348 |
}
|
349 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
350 |
function cpd_geoip_country_name_by_name($gi, $name) {
|
351 |
$country_id = cpd_geoip_country_id_by_name($gi,$name);
|
352 |
if ($country_id !== false) {
|
@@ -355,9 +454,22 @@ function cpd_geoip_country_name_by_name($gi, $name) {
|
|
355 |
return false;
|
356 |
}
|
357 |
|
|
|
|
|
|
|
|
|
|
|
358 |
function cpd_geoip_country_id_by_addr($gi, $addr) {
|
359 |
$ipnum = ip2long($addr);
|
360 |
-
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
361 |
}
|
362 |
|
363 |
function cpd_geoip_country_code_by_addr($gi, $addr) {
|
@@ -375,6 +487,14 @@ function cpd_geoip_country_code_by_addr($gi, $addr) {
|
|
375 |
return false;
|
376 |
}
|
377 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
378 |
function cpd_geoip_country_name_by_addr($gi, $addr) {
|
379 |
if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
|
380 |
$record = cpd_geoip_record_by_addr($gi,$addr);
|
@@ -388,14 +508,76 @@ function cpd_geoip_country_name_by_addr($gi, $addr) {
|
|
388 |
return false;
|
389 |
}
|
390 |
|
391 |
-
function
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|