MDL-12796 iplookup rewrite

This commit is contained in:
skodak 2008-01-02 16:47:57 +00:00
parent 25c3f91a52
commit 7c09710cbf
36 changed files with 5129 additions and 2044 deletions

View File

@ -13,13 +13,9 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
$options[0] = get_string('choose') .'...';
$temp->add(new admin_setting_configselect('country', get_string('country', 'admin'), get_string('configcountry', 'admin'), 0, $options));
$iplookups = array();
if ($plugins = get_list_of_plugins('iplookup')) {
foreach ($plugins as $plugin) {
$iplookups[$plugin] = $plugin;
}
}
$temp->add(new admin_setting_configselect('iplookup', get_string('iplookup', 'admin'), get_string('configiplookup', 'admin'), 'hostip', $iplookups));
$temp->add(new admin_setting_heading('iplookup', get_string('iplookup', 'admin'), get_string('iplookupinfo', 'admin')));
$temp->add(new admin_setting_configfile('geoipfile', get_string('geoipfile', 'admin'), get_string('configgeoipfile', 'admin', $CFG->dataroot.'/geoip/'), $CFG->dataroot.'/geoip/GeoLiteCity.dat'));
$temp->add(new admin_setting_configtext('googlemapkey', get_string('googlemapkey', 'admin'), get_string('configgooglemapkey', 'admin', $CFG->wwwroot), ''));
$ADMIN->add('location', $temp);

View File

@ -530,14 +530,14 @@ function print_log($course, $user=0, $date=0, $order="l.time ASC", $page=0, $per
echo "<td class=\"cell c1\" align=\"right\">".userdate($log->time, '%a').
' '.userdate($log->time, $strftimedatetime)."</td>\n";
echo "<td class=\"cell c2\">\n";
link_to_popup_window("/iplookup/index.php?ip=$log->ip&amp;user=$log->userid", 'iplookup',$log->ip, 400, 700);
link_to_popup_window("/iplookup/index.php?ip=$log->ip&amp;user=$log->userid", 'iplookup',$log->ip, 440, 700);
echo "</td>\n";
$fullname = fullname($log, has_capability('moodle/site:viewfullnames', get_context_instance(CONTEXT_COURSE, $course->id)));
echo "<td class=\"cell c3\">\n";
echo " <a href=\"$CFG->wwwroot/user/view.php?id={$log->userid}&amp;course={$log->course}\">$fullname</a>\n";
echo "</td>\n";
echo "<td class=\"cell c4\">\n";
link_to_popup_window( make_log_url($log->module,$log->url), 'fromloglive',"$log->module $log->action", 400, 600);
link_to_popup_window( make_log_url($log->module,$log->url), 'fromloglive',"$log->module $log->action", 440, 700);
echo "</td>\n";;
echo "<td class=\"cell c5\">{$log->info}</td>\n";
echo "</tr>\n";

View File

@ -1,18 +1,25 @@
iplookup
--------
iplookup info
-------------
These plugins will show you something about an IP address.
1/ old plugins are not supported anymore
Moodle scripts call the index.php in this directory like this:
/iplookup/index.php?ip=222.222.222.222&user=1
2/ general information in admin settings "Site Administration/Location/Location settings"
Both parameters are optional, they default to the current user.
3/ technical info:
index.php loads the lib.php from a specified subdirectory
to actually display some sort of map or description.
xplanet commadline
xplanet -projection rectangular -latitude 0.00 -longitude 0.00 -num_times 1 -geometry 620x310 -output earth.jpeg -quality 90 -config config.txt
The current plugin is selected using $CFG->iplookup.
config.txt
[earth]
shade=100
Cheers,
Martin
original Earth map from:
http://www.radcyberzine.com/xglobe/
marker.gif
custom made in Inkscape
Petr Skoda (skodak), January 2008
$Id$

BIN
iplookup/earth.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@ -1,22 +0,0 @@
<?php // $Id$
// Lookup a user using HostIP
function iplookup_display($ip, $user=0) {
print_header();
if ($user) {
if ($user = get_record('user', 'id', $user)) {
print_heading(fullname($user).", $user->city, $user->country", 'center', '4');
}
}
echo 'Search results: <iframe src="http://www.hostip.info/api/get.html?ip='.$ip.'" height="60" width="300"></iframe>';
echo '<object data="http://www.hostip.info/map/frame.html?ip='.$ip.'" '.
'type="text/html" border="0" width="610" height="330"></object>';
close_window_button();
print_footer('none');
}
?>

View File

@ -1,19 +1,177 @@
<?php // $Id$
// Do an IP lookup of a user, using selected plugin
///////////////////////////////////////////////////////////////////////////
// //
// NOTICE OF COPYRIGHT //
// //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// http://moodle.org //
// //
// Copyright (C) 2008 onwards Petr Skoda (skodak) //
// //
// 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 2 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: //
// //
// http://www.gnu.org/copyleft/gpl.html //
// //
///////////////////////////////////////////////////////////////////////////
require('../config.php');
require('../config.php');
require_once($CFG->libdir.'/filelib.php');
require_once($CFG->libdir.'/geoip/geoipcity.inc');
require_login();
require_login();
$ip = optional_param('ip', getremoteaddr());
$user = optional_param('user', $USER->id);
$ip = optional_param('ip', getremoteaddr(), PARAM_HOST);
$user = optional_param('user', $USER->id, PARAM_INT);
if (empty($CFG->iplookup)) {
set_config('iplookup', 'hostip');
if (isset($CFG->iplookup)) {
//clean up of old settings
set_config('iplookup', NULL);
}
$info = array($ip);
$note = array();
if (!preg_match('/(^\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/', $ip, $match)) {
print_error('invalidipformat', 'error');
}
if ($match[1] > 255 or $match[2] > 255 or $match[3] > 255 or $match[4] > 255) {
print_error('invalidipformat', 'error');
}
if ($match[1] == '127' or $match[1] == '10' or ($match[1] == '172' and $match[2] >= '16' and $match[2] <= '31') or ($match[1] == '192' and $match[2] == '168')) {
print_error('iplookupprivate', 'error');
}
if ($user) {
if ($user = get_record('user', 'id', $user, 'deleted', 0)) {
$info[] = fullname($user);
}
}
if (!empty($CFG->geoipfile) and file_exists($CFG->geoipfile)) {
$gi = geoip_open($CFG->geoipfile, GEOIP_STANDARD);
$location = geoip_record_by_addr($gi, $ip);
geoip_close($gi);
if (empty($location)) {
print_error('iplookupfailed', 'error', '', $ip);
}
if (!empty($location->city)) {
$info[] = $location->city;
}
require("$CFG->dirroot/iplookup/$CFG->iplookup/lib.php");
if (!empty($location->country_code)) {
$countries = get_list_of_countries();
if (isset($countries[$location->country_code])) {
// prefer our localized country names
$info[] = $countries[$location->country_code];
} else {
$info[] = $location->country_name;
}
}
$longitude = $location->longitude;
$latitude = $location->latitude;
$note[] = get_string('iplookupmaxmindnote', 'admin');
iplookup_display($ip, $user);
} else {
$ipdata = download_file_content('http://netgeo.caida.org/perl/netgeo.cgi?target='.$ip);
if ($ipdata === false) {
error('Can not connect to NetGeo server at http://netgeo.caida.org, please check proxy settings or better install MaxMind GeoLite City data file.');
}
$matches = null;
if (!preg_match('/LAT:\s*(-?\d+\.\d+)/s', $ipdata, $matches)) {
print_error('iplookupfailed', 'error', '', $ip);
}
$latitude = (float)$matches[1];
if (!preg_match('/LONG:\s*(-?\d+\.\d+)/s', $ipdata, $matches)) {
print_error('iplookupfailed', 'error', '', $ip);
}
$longitude = (float)$matches[1];
if (preg_match('/CITY:\s*([^<]*)/', $ipdata, $matches)) {
if (!empty($matches[1])) {
$info[] = s($matches[1]);
}
}
if (preg_match('/COUNTRY:\s*([^<]*)/', $ipdata, $matches)) {
if (!empty($matches[1])) {
$countrycode = $matches[1];
$countries = get_list_of_countries();
if (isset($countries[$countrycode])) {
// prefer our localized country names
$info[] = $countries[$countrycode];
} else {
$info[] = $countrycode;
}
}
}
$note[] = get_string('iplookupnetgeonote', 'admin');
}
if (empty($CFG->googlemapkey)) {
$info = implode(' - ', $info);
$note = implode('<br />', $note);
$imgwidth = 620;
$imgheight = 310;
$dotwidth = 18;
$dotheight = 30;
$dx = round((($longitude + 180) * ($imgwidth / 360)) - $imgwidth - $dotwidth/2);
$dy = round((($latitude + 90) * ($imgheight / 180)));
print_header(get_string('iplookup', 'admin').': '.$info, $info);
echo '<div id="map" style="width:'.($imgwidth+$dotwidth).'px; height:'.$imgheight.'px;">';
echo '<img src="earth.jpeg" style="width:'.$imgwidth.'px; height:'.$imgheight.'px" alt="" />';
echo '<img src="marker.gif" style="width:'.$dotwidth.'px; height:'.$dotheight.'px; margin-left:'.$dx.'px; margin-bottom:'.$dy.'px;" alt="" />';
echo '</div>';
echo '<div id="note">'.$note.'</div>';
print_footer('empty');
} else {
$info = implode(' - ', $info);
$note = implode('<br />', $note);
$meta = '
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key='.$CFG->googlemapkey.'" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
var point = new GLatLng('.$latitude.', '.$longitude.');
map.setCenter(point, 4);
map.addOverlay(new GMarker(point));
map.setMapType(G_HYBRID_MAP);
}
}
//]]>
</script>
';
print_header(get_string('iplookup', 'admin').': '.$info, $info, '', '', $meta, false, '&nbsp;', '', false, 'onload="load()" onunload="GUnload()"');
echo '<div id="map" style="width: 650px; height: 360px"></div>';
echo '<div id="note">'.$note.'</div>';
print_footer('empty');
}
?>

View File

@ -1,340 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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 2 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View File

@ -1,7 +0,0 @@
To make this program fit into Moodle, I:
- deleted the black and white earth image
- modified plotconf.inc slightly to use Moodle configs
- modified plot.php slightly to use Moodle's background colour
Martin Dougiamas, 26/8/2002

View File

@ -1,60 +0,0 @@
IP-Atlas version 1.0
-=----=-
Description
-----------
This script uses NetGeo to plot a host on the globe.
Requirements
------------
PHP 4 and GD (Optional).
The GD library is available at http://www.boutell.com/gd/ and PHP is at
http://www.php.net/
Installation
------------
Put these files somewhere on your webserver, and point your browser to plot.php
Note: You can symlink "ln -s plot.php index.php" if you need to. If you
have any problems running it, send an email to ivan@xpenguin.com
Configuration
-------------
All options can be edited in plotconf.inc.
If you want to integrate IP-Atlas into your website, open up plot.php and
ip-atlas_prefs.php and edit the parts where it starts writing the html
(find for "<html>") and where it ends (</html>). You should replace theses
with your site template headers/footers.
You can create a new language file for IP-Atlas if you follow the directions
inside any language file in the languages/ directory.
If you create a new language file, please email it to ivan@xpenguin.com so
it can be included in the next version.
Bugs
----
1. The famous windows bug (also happens in other cirumstances)
If nothing appears when running the script on windows, open up plotconf.inc
and change the $trygd variable to "0".
Contributions
-------------
Thanks to Sten Kalenda (sten@ipjam.com) for adding security features and
cleaning up the code.
Thanks to Armin Kunaschik (Armin.Kunaschik@varetis.de) for his proxy patch
that enables this program to run behind a firewall.
Thanks to Daniel Quinlan (daniel@chaosengine.net) for a patch that fixes
many problems on windows.
Also thanks to many users for reporting bugs.
Copyright
---------
IP-Atlas is Copyright (c) 2002 Ivan Kozik, and can be redistributed under
the GPL.

View File

@ -1,4 +0,0 @@
The database for this is REALLY old now and this service is
next to useless.
Included here for backward compatibility.

View File

@ -1,243 +0,0 @@
AD Andorra
AE United Arab Emirates
AF Afghanistan
AG Antigua and Barbuda
AI Anguilla
AL Albania
AM Armenia
AN Netherlands Antilles
AO Angola
AQ Antarctica
AR Argentina
AS American Samoa
AT Austria
AU Australia
AW Aruba
AZ Azerbaijan
BA Bosnia and Herzegovina
BB Barbados
BD Bangladesh
BE Belgium
BF Burkina Faso
BG Bulgaria
BH Bahrain
BI Burundi
BJ Benin
BM Bermuda
BN Brunei Darussalam
BO Bolivia
BR Brazil
BS Bahamas
BT Bhutan
BV Bouvet Island
BW Botswana
BY Belarus
BZ Belize
CA Canada
CC Cocos (Keeling) Islands
CF Central African Republic
CG Congo
CH Switzerland
CI Cote D'Ivoire (Ivory Coast)
CK Cook Islands
CL Chile
CM Cameroon
CN China
CO Colombia
CR Costa Rica
CS Czechoslovakia (former)
CU Cuba
CV Cape Verde
CX Christmas Island
CY Cyprus
CZ Czech Republic
DE Germany
DJ Djibouti
DK Denmark
DM Dominica
DO Dominican Republic
DZ Algeria
EC Ecuador
EE Estonia
EG Egypt
EH Western Sahara
ER Eritrea
ES Spain
ET Ethiopia
FI Finland
FJ Fiji
FK Falkland Islands (Malvinas)
FM Micronesia
FO Faroe Islands
FR France
FX France, Metropolitan
GA Gabon
GB Great Britain (UK)
GD Grenada
GE Georgia
GF French Guiana
GH Ghana
GI Gibraltar
GL Greenland
GM Gambia
GN Guinea
GP Guadeloupe
GQ Equatorial Guinea
GR Greece
GS S. Georgia and S. Sandwich Isls.
GT Guatemala
GU Guam
GW Guinea-Bissau
GY Guyana
HK Hong Kong
HM Heard and McDonald Islands
HN Honduras
HR Croatia (Hrvatska)
HT Haiti
HU Hungary
ID Indonesia
IE Ireland
IL Israel
IN India
IO British Indian Ocean Territory
IQ Iraq
IR Iran
IS Iceland
IT Italy
JM Jamaica
JO Jordan
JP Japan
KE Kenya
KG Kyrgyzstan
KH Cambodia
KI Kiribati
KM Comoros
KN Saint Kitts and Nevis
KP Korea (North)
KR Korea (South)
KW Kuwait
KY Cayman Islands
KZ Kazakhstan
LA Laos
LB Lebanon
LC Saint Lucia
LI Liechtenstein
LK Sri Lanka
LR Liberia
LS Lesotho
LT Lithuania
LU Luxembourg
LV Latvia
LY Libya
MA Morocco
MC Monaco
MD Moldova
MG Madagascar
MH Marshall Islands
MK Macedonia
ML Mali
MM Myanmar
MN Mongolia
MO Macau
MP Northern Mariana Islands
MQ Martinique
MR Mauritania
MS Montserrat
MT Malta
MU Mauritius
MV Maldives
MW Malawi
MX Mexico
MY Malaysia
MZ Mozambique
NA Namibia
NC New Caledonia
NE Niger
NF Norfolk Island
NG Nigeria
NI Nicaragua
NL Netherlands
NO Norway
NP Nepal
NR Nauru
NT Neutral Zone
NU Niue
NZ New Zealand (Aotearoa)
OM Oman
PA Panama
PE Peru
PF French Polynesia
PG Papua New Guinea
PH Philippines
PK Pakistan
PL Poland
PM St. Pierre and Miquelon
PN Pitcairn
PR Puerto Rico
PT Portugal
PW Palau
PY Paraguay
QA Qatar
RE Reunion
RO Romania
RU Russian Federation
RW Rwanda
SA Saudi Arabia
Sb Solomon Islands
SC Seychelles
SD Sudan
SE Sweden
SG Singapore
SH St. Helena
SI Slovenia
SJ Svalbard and Jan Mayen Islands
SK Slovak Republic
SL Sierra Leone
SM San Marino
SN Senegal
SO Somalia
SR Suriname
ST Sao Tome and Principe
SU USSR (former)
SV El Salvador
SY Syria
SZ Swaziland
TC Turks and Caicos Islands
TD Chad
TF French Southern Territories
TG Togo
TH Thailand
TJ Tajikistan
TK Tokelau
TM Turkmenistan
TN Tunisia
TO Tonga
TP East Timor
TR Turkey
TT Trinidad and Tobago
TV Tuvalu
TW Taiwan
TZ Tanzania
UA Ukraine
UG Uganda
UK United Kingdom
UM US Minor Outlying Islands
US United States
UY Uruguay
UZ Uzbekistan
VA Vatican City State (Holy See)
VC Saint Vincent and the Grenadines
VE Venezuela
VG Virgin Islands (British)
VI Virgin Islands (U.S.)
VN Viet Nam
VU Vanuatu
WF Wallis and Futuna Islands
WS Samoa
YE Yemen
YT Mayotte
YU Yugoslavia
ZA South Africa
ZM Zambia
ZR Zaire
ZW Zimbabwe

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

View File

@ -1,4 +0,0 @@
<img src="hr.gif" width="100%" height="2" vspace="2">
<table align="right" width="100%" cellpadding="0" cellspacing="0" border="0">
<tr><td align="right" width="100%"><a href="http://www.xpenguin.com/ip-atlas.php">IP-Atlas</a> <?php echo $version; ?></td></tr>
</table>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 B

View File

@ -1,5 +0,0 @@
A:link { font-weight: bold; text-decoration: none; color: #005177; }
A:visited { text-decoration: none; color: #005177; font-weight: bold; }
A:hover { text-decoration: underline; }
BODY { font-family: Verdana, Helvetica, Arial, sans-serif; font-size:12px; }
TD { font-family: Verdana, Helvetica, Arial, sans-serif; color: #000000; font-size: 12px; }

View File

@ -1,246 +0,0 @@
<?php
include("plotconf.inc");
include("plot.inc");
if (isset($HTTP_GET_VARS["lastquery"])){
$HTTP_GET_VARS["lastquery"] = clean_param($HTTP_GET_VARS["lastquery"], PARAM_HOST);
}
?>
<?php
if(shouldrun($HTTP_SERVER_VARS['HTTP_USER_AGENT'])) {
$drawmode = "GD";
} else {
$drawmode = "CSS";
}
if(isset($HTTP_POST_VARS["button"])) {
// cleanup post data
$HTTP_POST_VARS["shape"] = clean_param($HTTP_POST_VARS["shape"], PARAM_ALPHA);
$HTTP_POST_VARS["color"] = clean_param($HTTP_POST_VARS["color"], PARAM_ALPHA);
$HTTP_POST_VARS["color"] = clean_param($HTTP_POST_VARS["size"], PARAM_INT);
$HTTP_POST_VARS["earthimage"] = clean_param($HTTP_POST_VARS["earthimage"], PARAM_FILE);
$HTTP_POST_VARS["cssdot"] = clean_param($HTTP_POST_VARS["cssdot"], PARAM_FILE);
$HTTP_POST_VARS["seldrawmode"] = clean_param($HTTP_POST_VARS["seldrawmode"],PARAM_ALPHA);
// unset the earth image if we don't have it in our list
if (!in_array($HTTP_POST_VARS["earthimage"],$earthimages)) {
unset($HTTP_POST_VARS["earthimage"]);
}
// save data from the POST
setcookie ("atlasprefs", "", time() - 36000000);
setcookie ("atlasprefs", "$HTTP_POST_VARS[shape]:$HTTP_POST_VARS[color]:$HTTP_POST_VARS[size]:$HTTP_POST_VARS[earthimage]:$HTTP_POST_VARS[cssdot]:$HTTP_POST_VARS[seldrawmode]", time() + 36000000, $cookiepath);
$setshape = $HTTP_POST_VARS["shape"];
$setcolor = $HTTP_POST_VARS["color"];
$setsize = $HTTP_POST_VARS["size"];
$setearthimage = $HTTP_POST_VARS["earthimage"];
$setcssdot = $HTTP_POST_VARS["cssdot"];
$setseldrawmode = $HTTP_POST_VARS["seldrawmode"];
if($setseldrawmode == "1") {
$drawmode = "GD";
} else {
$drawmode = "CSS";
}
} elseif(isset($HTTP_COOKIE_VARS["atlasprefs"]) && validcookie($HTTP_COOKIE_VARS["atlasprefs"])) {
// get data from the cookie
@list($setshape, $setcolor, $setsize, $setearthimage, $setcssdot, $setseldrawmode) = split(":", $HTTP_COOKIE_VARS["atlasprefs"]);
} else {
$setshape = "Diamond";
$setsize = "3";
$setcolor = "red";
$setearthimage = $earthimages[$defaultimage];
$setcssdot = "reddot.gif";
if(shouldrun($HTTP_SERVER_VARS['HTTP_USER_AGENT'])) {
$setseldrawmode = 1;
} else {
$setseldrawmode = 0;
}
// override old cookie if there is post data
if(isset($HTTP_POST_VARS["seldrawmode"])) {
$setsetdrawmode = $HTTP_POST_VARS["seldrawmode"];
}
}
?>
<?php # START HTML
?>
<html><head><title><?php echo t("IP-Atlas Preferences") ?></title>
<!-- your head tags here -->
<link rel="Stylesheet" href="ip-atlas.css">
</head><body bgcolor="#ffffff">
</head><body>
<b><?php echo t("IP-Atlas preferences"); ?></b> <?php echo t("(cookie based)"); ?><br /><br />
<?php
if(isset($HTTP_POST_VARS["button"])) {
print t("Your settings have been saved. You can now try"); ?> <a href="plot.php<?php if(isset($HTTP_GET_VARS["lastquery"])) { echo "?address=$HTTP_GET_VARS[lastquery]"; } ?>"><?php print t("plotting something.")."</a>"."<br /><br />";
}
?>
<form action="ip-atlas_prefs.php<?php if(isset($HTTP_GET_VARS["lastquery"])) { echo "?lastquery=$HTTP_GET_VARS[lastquery]"; } ?>" method="POST">
<?php if(istheregd()) {
echo t("Draw mode (defaults guessed for your browser):");
print "<br /><select name=\"seldrawmode\">";
if(!isset($setseldrawmode)) {
if(shouldrun($HTTP_SERVER_VARS['HTTP_USER_AGENT'])) {
$setseldrawmode = 1;
} else {
$setseldrawmode = 0;
}
}
if($setseldrawmode == "1") {
echo "<option value=\"1\" selected>GD";
echo "<option value=\"0\">CSS";
} elseif($setseldrawmode == "0") {
echo "<option value=\"1\">GD";
echo "<option value=\"0\" selected>CSS";
}
print "</select><br /><br />";
} else {
print "<input type=\"hidden\" name=\"seldrawmode\" value=\"0\" />";
}
?>
<?php echo t("Pointer Preferences (the dot that marks lat/lon):"); ?><br />
<?php
if($drawmode == "GD") {
print '
<input type="hidden" name="cssdot" value="reddot.gif" />
<table><tr>
<td>'.t("Shape:").'</td><td><select name="shape">
';
$shapes = array("Diamond", "Diamond Outline", "Square", "Square Outline", "Cross");
foreach($shapes as $curshape) {
if($setshape == $curshape) {
print "<option value=\"$curshape\" selected>".t($curshape);
} else {
print "<option value=\"$curshape\">".t($curshape);
}
}
print "</select></td></tr><tr><td>".t("Size:")."</td><td><select name=\"size\">";
$sizes = array("2", "3", "4", "5", "6", "7", "8");
foreach($sizes as $cursize) {
if($setsize == $cursize) {
print "<option value=\"$cursize\" selected>$cursize";
} else {
print "<option value=\"$cursize\">$cursize";
}
}
print "</select></td></tr><tr><td>".t("Color:")."</td><td><select name=\"color\">";
$colors = array("red", "white", "yellow", "magenta", "cyan", "green", "violet");
foreach($colors as $curcolor) {
if($setcolor == $curcolor) {
print "<option value=\"$curcolor\" selected>".t($curcolor);
} else {
print "<option value=\"$curcolor\">".t($curcolor);
}
}
print "
</select></td></tr></table>
";
} elseif($drawmode == "CSS") {
print t("Pointer:")." <select name=\"cssdot\">";
foreach($cssdots as $curdot) {
list($filename, $curdot, , ) = split(":", $curdot);
if($setcssdot == $filename) {
print "<option value=\"$filename\" selected>$curdot";
} else {
print "<option value=\"$filename\">$curdot";
}
}
print "</select><br />";
print '
<input type="hidden" name="shape" value="Diamond" />
<input type="hidden" name="color" value="Red" />
<input type="hidden" name="size" value="3" />
';
}
?>
<br />
<?php echo t("Other Preferences:") ?><br />
<?php echo t("Earth Image:") ?>&nbsp;
<select name="earthimage">
<?php
foreach($earthimages as $curentry) {
list($curfile, $curname, , ) = split(":", $curentry);
if($setearthimage == $curfile) {
print "<option value=\"$curfile\" selected>$curname";
} else {
print "<option value=\"$curfile\">$curname";
}
}
?>
</select>
<br /><br />
<input type="Submit" name="button" value="<?php echo t("Save") ?>">
<div align="right">
[ <a href="plot.php<?php if(isset($HTTP_GET_VARS["lastquery"])) { echo "?address=$HTTP_GET_VARS[lastquery]"; } ?>"><?php echo t("main") ?></a> ]<br /><br />
</div>
<?php include("footer.inc"); ?>
</body></html>

View File

@ -1,182 +0,0 @@
<?php
/*
Blank Language File
copy this language file from messages.blank.inc to
messages.<country code>.inc.
please email new language files to ivan@xpenguin.com
copy a language file to messages.<cc>.inc and \
edit what $p is on encountering an english phrase.
please notice the punctuation and capitilization.
change the $language variable in plotconf.inc after
creating a language file.
*/
function lookup($phrase) {
switch($phrase) {
# start translating the $p here
case "Plotting" :
$p = ""; break;
case "preferences" :
$p = ""; break;
case "locate me" :
$p = ""; break;
case "IP/Hostname:" :
$p = ""; break;
case "You at" :
$p = ""; break;
case "Submit" :
$p = ""; break;
case "main" :
$p = ""; break;
# Used in context "(host) is located in"
case "is" :
$p = ""; break;
# Used in context "You at (host) are located in"
case "are" :
$p = ""; break;
case "located in" :
$p = ""; break;
case "cannot be located." :
$p = ""; break;
case "cannot be resolved." :
$p = ""; break;
case "is a host in the private IP address range." :
$p = ""; break;
case "does not resolve." :
$p = ""; break;
case "is not a valid IP address." :
$p = ""; break;
case "Temporary lookup failure." :
$p = ""; break;
case "IP-Atlas Preferences" :
$p = ""; break;
# make the 'p' lowercase if possible in your language
case "IP-Atlas preferences" :
$p = ""; break;
case "(cookie based)" :
$p = ""; break;
case "Draw mode (defaults guessed for your browser):" :
$p = ""; break;
// next two phrases are combined
case "Your settings have been saved. You can now try" :
$p = ""; break;
case "plotting something." :
$p = ""; break;
case "Pointer Preferences (the dot that marks lat/lon):" :
$p = ""; break;
case "Shape:" :
$p = ""; break;
case "Size:" :
$p = ""; break;
case "Color:" :
$p = ""; break;
case "Pointer:" :
$p = ""; break;
case "Other Preferences:" :
$p = ""; break;
case "Earth Image:" :
$p = ""; break;
case "Color" :
$p = ""; break;
case "Grayscale" :
$p = ""; break;
case "Save" :
$p = ""; break;
# shape names:
case "Diamond" :
$p = ""; break;
case "Diamond Outline" :
$p = ""; break;
case "Square" :
$p = ""; break;
case "Square Outline" :
$p = ""; break;
case "Cross" :
$p = ""; break;
# colors:
case "red" :
$p = ""; break;
case "white" :
$p = ""; break;
case "yellow" :
$p = ""; break;
case "magenta" :
$p = ""; break;
case "cyan" :
$p = ""; break;
case "green" :
$p = ""; break;
case "violet" :
$p = ""; break;
# stop here
// return in english if the phrase couldn't be found
default:
$p = $phrase; break;
}
// return english if match was blank
if($p == "") { $p = $phrase; }
return $p;
}
?>

View File

@ -1,185 +0,0 @@
<?php
/*
Italian Language File
I forgot who started translating this file, email me so i can put your
email here.
please email new language files to ivan@xpenguin.com
copy a language file to messages.<cc>.inc and \
edit what $p is on encountering an english phrase.
you can start off with messages.blank.inc
please notice the punctuation and capitilization.
change the $language variable in plotconf.inc after
creating a language file.
*/
function lookup($phrase) {
switch($phrase) {
# start translating the $p here
case "Plotting" :
$p = "Mappa di"; break;
case "preferences" :
$p = "preferenze"; break;
case "locate me" :
$p = "localizzami"; break;
case "IP/Hostname:" :
$p = "IP/Nome host:"; break;
case "You at" :
$p = "Tu"; break;
case "Submit" :
$p = ""; break;
case "main" :
$p = ""; break;
# Used in context "(host) is located in"
case "is" :
$p = "è"; break;
# Used in context "You at (host) are located in"
case "are" :
$p = "sei"; break;
case "located in" :
$p = "stato localizzato in"; break;
case "cannot be located." :
$p = "non può essere localizzato."; break;
case "cannot be resolved." :
$p = "non può essere risolto."; break;
case "is a host in the private IP address range." :
$p = "è un host in un range di IP privati."; break;
case "does not resolve." :
$p = "irrisolvibile."; break;
case "is not a valid IP address." :
$p = "non è un indirizzo IP valido."; break;
case "Temporary lookup failure." :
$p = "Errore temporaneo di lookup."; break;
case "IP-Atlas Preferences" :
$p = "Preferenze IP-Atlas"; break;
# make the 'p' lowercase if possible in your language
case "IP-Atlas preferences" :
$p = "Preferenze IP-Atlas"; break;
case "(cookie based)" :
$p = "(basato su cookie)"; break;
case "Draw mode (defaults guessed for your browser):" :
$p = ""; break;
// next two phrases are combined
case "Your settings have been saved. You can now try" :
$p = "Le tue impostazioni sono state salvate "; break;
case "plotting something." :
$p = "torna indietro."; break;
case "Pointer Preferences (the dot that marks lat/lon):" :
$p = "Preferenze puntatore (il simbolo che indica la lat/lon):"; break;
case "Shape:" :
$p = "Forma:"; break;
case "Size:" :
$p = "Dimensione:"; break;
case "Color:" :
$p = "Colore:"; break;
case "Pointer:" :
$p = "Puntatore:"; break;
# any help here?
case "Other Preferences:" :
$p = ""; break;
case "Earth Image:" :
$p = ""; break;
case "Color" :
$p = "Colore"; break;
case "Grayscale" :
$p = ""; break;
case "Save" :
$p = ""; break;
# shape names:
case "Diamond" :
$p = ""; break;
case "Diamond Outline" :
$p = ""; break;
case "Square" :
$p = ""; break;
case "Square Outline" :
$p = ""; break;
case "Cross" :
$p = ""; break;
# colors:
case "red" :
$p = ""; break;
case "white" :
$p = ""; break;
case "yellow" :
$p = ""; break;
case "magenta" :
$p = ""; break;
case "cyan" :
$p = ""; break;
case "green" :
$p = ""; break;
case "violet" :
$p = ""; break;
# stop here
// return in english if the phrase couldn't be found
default:
$p = $phrase; break;
}
if($p == "") { $p = $phrase; }
return $p;
}
?>

View File

@ -1,13 +0,0 @@
<?php // $Id$
// Lookup a user using ipatlas and NetGeo
// The database for this is REALLY old now and this service is
// next to useless.
function iplookup_display($ip, $user=0) {
global $CFG;
redirect($CFG->wwwroot.'/iplookup/ipatlas/plot.php?address='.$ip.'&amp;user='.$user);
}
?>

View File

@ -1,398 +0,0 @@
<?php
$version = "1.0";
// check for bad agents immidietly
$blockbadagents=1;
if($blockbadagents == 1) {
// those metaquery assholes at t-dialin and others can't
// get another dumber using the default user-agent, can they?
$agent = $HTTP_SERVER_VARS['HTTP_USER_AGENT'];
if(
strstr("libwww-perl", $agent) ||
strstr("lwp-trivial", $agent) ||
strstr("LWP::Simple", $agent) ||
strstr("PHP/", $agent)) {
// goodbye
exit;
}
}
function s10_rfc_1918_ip($in) {
if (ereg('^(127\.)', $in, $part)) {
return TRUE;
}
if (ereg('^(10\.)', $in, $part)) {
return TRUE;
}
if (ereg('^(192\.168\.)', $in, $part)) {
return TRUE;
}
if (ereg('^(172\.)' . '([0-9]{1,3})', $in, $part)) {
if(($part[2] > 15) and ($part[2] < 32)) {
return TRUE;
}
}
return FALSE;
}
function stuffanalyze($stuff) {
$stuff2[0] = array_values(preg_grep ("/CITY:/", $stuff)) or die("Sorry, but the lookup for this IP address failed! (CITY)");
$stuff2[1] = array_values(preg_grep ("/STATE:/", $stuff)) or die("Sorry, but the lookup for this IP address failed! (STATE)");
$stuff2[2] = array_values(preg_grep ("/COUNTRY:/", $stuff)) or die("Sorry, but the lookup for this IP address failed! (COUNTRY)");
$stuff2[3] = array_values(preg_grep ("/LAT:/", $stuff)) or die("Sorry, but the lookup for this IP address failed! (LAT)");
$stuff2[4] = array_values(preg_grep ("/LONG:/", $stuff)) or die("Sorry, but the lookup for this IP address failed! (LONG)");
// all the stuff2 values are actually arrays, making the following code look like crap
// the power of $count
if(isset($stuff2[0][0])) {
for ($count = 0; $count < count($stuff2); $count++) {
$stuff2[$count] = $stuff2[$count][0];
$stuff2[$count] = ucwords(strtolower(trim(substr(substr($stuff2[$count], 15), 0, -5))));
}
} else {
// if no data was found
$stuff2 = array("bad", "bad", "bad", "bad", "bad");
}
$count = 0;
return $stuff2;
}
function getlatdata($ip) {
global $firewall_host;
global $firewall_port;
global $use_firewall;
$data = array("");
if ($use_firewall) {
$fp = fsockopen ($firewall_host, $firewall_port, $errno, $errstr, 30) or die("Could not open socket to proxy");
if (!$fp) {
echo "$errstr ($errno)<br/>\n";
} else {
fputs ($fp, "GET http://netgeo.caida.org/perl/netgeo.cgi?target=$ip HTTP/1.0\r\nHost: netgeo.caida.org\r\n\r\n") or die("Could not write to socket");
while (!feof($fp)) {
$packet = fgets ($fp,128) or die("Could not read from socket");
array_push($data, $packet) or die("Could not push data into array");
}
fclose ($fp);
}
} else {
$fp = fsockopen ("netgeo.caida.org", 80, $errno, $errstr, 30) or die("Could not open socket to caida.org");
if (!$fp) {
echo "$errstr ($errno)<br/>\n";
} else {
fputs ($fp, "GET /perl/netgeo.cgi?target=$ip HTTP/1.0\r\nHost: netgeo.caida.org\r\n\r\n") or die("Could not write to socket");
while (!feof($fp)) {
$packet = fgets ($fp,128) or die("Could not read from socket");
array_push($data, $packet) or die("Could not push socket data into array");
}
fclose ($fp);
}
}
// make it an array
return $data;
}
function finddot($name, $cssdots, $defaultdot) {
foreach($cssdots as $x) {
list($filename, , $width, $height) = split(":", $x);
if($filename == $name) { $found = 1; $return = array($name, $width, $height); }
}
if(isset($found)) {
return $return;
} else {
$dott = $cssdots[$defaultdot];
list($dott, , $width, $height) = split(":", $dott);
return array($dott, $width, $height);
}
}
function getlocationcoords($lat, $lon, $width, $height) {
// some cartographers weren't mathematicians, up is apparently negative to them
$lat = ($lat * -1);
$lat = ($lat + 90);
$lon = ($lon + 180);
$x = ($lon * ($width / 360));
$y = ($lat * ($height / 180));
$x = round($x);
$y = round($y);
return array($x, $y);
}
function getimagecoords($earthimages, $image) {
foreach($earthimages as $x) {
list($file, , $width, $height) = split(":", $x);
if($file == $image) {
$coords = array("$width", "$height");
return $coords;
}
}
}
function validcookie($cookie) {
if(preg_match("/.*.:.*.:.*.:.*.:.*./", $cookie)) {
return TRUE;
} else {
return FALSE;
}
}
function isvalidimage($cookie, $earthimages, $defaultimage) {
# list(, , , $setearthimage) = split(":", $cookie);
$setearthimage = $cookie;
if(isset($setearthimage)) {
// check if the image is one actually defined, not a cookie edit
foreach($earthimages as $image) {
list($testearthimage, , , ) = split(":", $image);
if($testearthimage == $setearthimage) {
$found = 1;
}
}
if(isset($found)) {
return $setearthimage;
} else {
return $earthimages[$defaultimage];
}
} else {
return $earthimages[$defaultimage];
}
}
function istheregd() {
global $trygd;
if($trygd == 1) {
if (@ImageTypes() & IMG_PNG) {
return TRUE;
} else {
return FALSE;
}
} else {
return FALSE;
}
}
function checkbrowser($agent) {
if (strstr($agent, "Mozilla/4.7") || strstr($agent, "Opera 6") || strstr($agent, "Opera/6")) {
return FALSE;
} else {
return TRUE;
}
}
function shouldrun($agent) {
// could cause probs... dunno
global $HTTP_COOKIE_VARS;
// check for new format of cookie with 6 parameters
if(@preg_match("/.*.:.*.:.*.:.*.:.*.:.*./", $HTTP_COOKIE_VARS["atlasprefs"])) {
list( , , , , , $drawmode) = split(":", $HTTP_COOKIE_VARS["atlasprefs"]);
} else {
$drawmode = "";
}
// don't try to understand below, it figures out whether
// to run it in css or gd based of prefs, server ability, and user agent.
if(istheregd() && ($drawmode == "1")) {
return TRUE;
} elseif($drawmode == "0") {
return FALSE;
} elseif(checkbrowser($agent) && istheregd()) {
return TRUE;
} elseif(!checkbrowser($agent)) {
return FALSE;
} elseif (!istheregd()) {
return FALSE;
}
}
function s10_validate_ip($in) {
if (is_string($in) && ereg('^([0-9]{1,3})\.([0-9]{1,3})\.' .
'([0-9]{1,3})\.([0-9]{1,3})$' ,
$in, $part)) {
if ($part[1] <= 255 && $part[2] <= 255 &&
$part[3] <= 255 && $part[4] <= 255)
return TRUE;
}
return FALSE;
}
function getstuff($address, $local) {
$address = trim($address);
# some people still think that urls are hostnames
$address = str_replace("http://", "", $address);
$address = preg_replace("/\/.*$/", "", $address);
// Security checks
$address = escapeshellcmd($address);
$values = array();
$values["address"] = $address;
if(eregi("[a-z]", $address)){
$ipaddress = gethostbyname($address);
if($ipaddress == $address) {
$values["validity"] = "no";
}
$values["hostname"] = $address;
$values["ishost"] = "yes";
} else {
if(s10_validate_ip($address)) {
$ipaddress = $address;
$values["hostname"] = "";
} else {
$values["validity"] = "no";
}
}
if(!isset($values["validity"])) {
if(s10_rfc_1918_ip($ipaddress)) {
$private = "yes";
} else {
$private = "no";
}
} else {
$private = "no";
}
if(!isset($ipaddress)) { $ipaddress = ""; }
$values["ipaddress"] = $ipaddress;
if(!isset($values["validity"]) && ($private == "no")) {
$stuff = getlatdata($ipaddress);
list(
$values["city"],
$values["state"],
$values["country"],
$values["lat"],
$values["lon"]
) = stuffanalyze($stuff);
$desc = "";
// check if it is the user's ip address
if($local == 1) { $desc .= t("You at"); }
// add the ip address and hostname
$desc .= "<b>$values[hostname]</b> (<b>$values[ipaddress]</b>) ";
// use "are" if it is the user's ip address
if($local == 1) { $desc .= t("are"); } else { $desc .= t("is"); }
$desc .= " ".t("located in")." ";
// add the city if it's there
if($values["city"]) {
$desc .= "$values[city], ";
}
// add the state if its there
if($values["state"]) {
$desc .= "$values[state], ";
}
if($values["country"]) {
// make the country code capital so its ready for lookup
$values["country"] = strtoupper($values["country"]);
// convert the country code to a country name
$countries = file("countries.txt") or die("Could not open countries file");
$precountry = array_values(preg_grep("/$values[country] /", $countries));
$values["country"] = trim(substr($precountry[0], 4));
$desc .= "$values[country].";
}
$desc .= " <font color=\"#aaaaaa\">($values[lat], $values[lon])</font>";
$state = $values["state"];
$city = $values["city"];
// decide if address can't resolve, be located, or if it's fine
if($values["lat"] == "0.00" && $values["lon"] == "0.00" && (@($state != "bad" && $city != "bad"))) {
$values["desc"] = "<b>$values[address]</b> ".t("cannot be located.");
$values["lat"] = "";
$values["lon"] = "";
} elseif($values["lat"] == "" && $values["lon"] == "") {
$values["desc"] = "<b>$values[address]</b> ".t("cannot be located.");
} else {
$values["desc"] = $desc;
}
} else {
// check if it was a host before and decide on an error message
if($private == "yes") {
$values["desc"] = "<b>$address</b> ".t("is a host in the private IP address range.");
} elseif(@($values["state"] == "bad" && $values["city"] == "bad")) {
$values["desc"] = t("Temporary lookup failure.");
} elseif(isset($values["ishost"])) {
$values["desc"] = "<b>$address</b> ".t("does not resolve.");
} else {
$values["desc"] = "<b>$address</b> ".t("is not a valid IP address.");
}
// some blank lat/lon for the image script or it will plot us in the center
$values["lon"] = "";
$values["lat"] = "";
}
return($values);
}
?>

View File

@ -1,139 +0,0 @@
<?php
include("plotconf.inc");
include("plot.inc");
if (isset($user)) {
$user = get_record("user", "id", $user);
$fullname = fullname($user, true);
$username = "<b>$fullname</b> [$user->city, $user->country] : ";
} else {
$username = "";
}
// cleanup
if (isset($HTTP_GET_VARS["lastquery"])) {
$HTTP_GET_VARS["lastquery"] = clean_param($HTTP_GET_VARS["lastquery"], PARAM_HOST);
}
// check if it is the user's ip, or another host
if(!isset($HTTP_GET_VARS["address"]) || ($HTTP_GET_VARS["address"] == "")) {
$address = $HTTP_SERVER_VARS['REMOTE_ADDR'];
$local = 1;
} else {
$HTTP_GET_VARS["address"] = clean_param($HTTP_GET_VARS["address"], PARAM_HOST);
$address = $HTTP_GET_VARS["address"];
$local = 0;
}
// this is the most important function, gets lat/lon and description of location
$values = getstuff($address, $local) or die("Error in plot.inc");
if(isset($logging) && is_writable("plotlog.txt")) {
$log = @fopen("plotlog.txt", "a") or print "";
@fputs($log, $HTTP_SERVER_VARS["REMOTE_ADDR"] ."\t". date("F j, Y, g:i a") . "\t$address\t$values[address]\t$values[lat]\t$values[lon]\n") or print "";
@fclose($log);
}
if(isset($HTTP_COOKIE_VARS["atlasprefs"]) && validcookie($HTTP_COOKIE_VARS["atlasprefs"])) {
list( , , , $imagething) = split(":", $HTTP_COOKIE_VARS["atlasprefs"]);
$imagething = clean_param($imagething, PARAM_FILE);
$earthimage = isvalidimage($imagething, $earthimages, $defaultimage);
} else {
$earthimage = $earthimages[$defaultimage];
}
if(strstr($earthimage, ":")) {
list($earthimage, , , ) = split(":", $earthimage);
}
// check if we need to run it in css mode
if(!shouldrun($HTTP_SERVER_VARS['HTTP_USER_AGENT'])) {
list($width, $height) = getimagecoords($earthimages, $earthimage);
// make sure some coords were found
if($values["lat"] == "" || $values["lon"] == "") {
$display = "&nbsp;";
$extracss = "";
} else {
list($x, $y) = getlocationcoords($values["lat"], $values["lon"], $width, $height);
if(isset($HTTP_COOKIE_VARS["atlasprefs"])) {
list( , , , , $dotname) = split(":", $HTTP_COOKIE_VARS["atlasprefs"]);
$dotname = clean_param($dotname, PARAM_FILE);
list($thedot, $dotwidth, $dotheight) = finddot($dotname, $cssdots, $defaultdot);
} else {
$dotname = $cssdots[$defaultdot];
list($dotname, , , ) = split(":", $dotname);
$dotname = clean_param($dotname, PARAM_FILE);
list($thedot, $dotwidth, $dotheight) = finddot($dotname, $cssdots, $defaultdot);
}
// magical formula for placing the css dot
$x = ($x - floor($dotwidth / 2));
$y = ($y - floor($dotheight / 2));
$extracss = "<style>
#dotDiv { padding-left:$x; padding-top:$y; }
</style>";
$display = "<div id=\"dotDiv\"><img width=\"$dotwidth\" height=\"$dotheight\" src=\"$thedot\">";
}
} else {
// gd mode
list($width, $height) = getimagecoords($earthimages, $earthimage) or die("Unable to find width/height for image $earthimage in config file");
$extracss = "";
$display = "<img src=\"plotimage.php?lat=$values[lat]&amp;lon=$values[lon]\" width=\"$width\" height=\"$height\" alt=\"\" />";
}
# START HTML
print '
<html><head><title>'.t("Plotting").' '.$values["address"].'</title>
'.$extracss.'
<!-- your head tags here -->
<link rel="Stylesheet" href="ip-atlas.css">
</head><body bgcolor="#FFFFFF">
<a name="map"></a>
<table valign="top" cellpadding=0 cellspacing=0 border=0 background="'.$earthimage.'" width="'.$width.'" height="'.$height.'"><tr><td valign="top">'.$display.'</td></tr></table>
<br />
';
if(isset($address)) {
print "$username $values[desc]";
}
$PHP_SELF = 'plot.php';
print '
<br /><br />
<form method="GET" action="'.$PHP_SELF.'#map">
<table width="100%"><tr><td nowrap align="left">
'.t("IP/Hostname:").' <input value="'.$values["address"].'" type="text" size="30" name="address" /><input type="Submit" value="'.t("Submit").'" /></td><td align="right" width="100%">
[ <a href="ip-atlas_prefs.php?lastquery='?><?php if(isset($HTTP_GET_VARS["address"])) { echo $HTTP_GET_VARS["address"]; } ?><?php echo '">'.t("preferences").'</a> ]
[ <a href="'."$PHP_SELF".'">'.t("locate me").'</a> ]
</td></tr></table>
</form>
';
include("footer.inc");
print "</body></html>";
?>

View File

@ -1,61 +0,0 @@
<?php
require("../../config.php");
# try to find GD on the server? set this
# to "0" if the script doesn't work or there is a broken image
if ($CFG->gdversion == 1 or $CFG->gdversion == 2) {
$trygd = "1";
} else {
$trygd = "0";
}
# language (look in language/ dir for language files)
$language = "en"; global $language;
include("translate.inc");
# display warnings? set to "0" if there are warnings
# on the screen. report these to ivan@xpenguin.com so
# this option will become unnessessary.
$warnings = "1";
# earth images
# url path:name:width:height
# everything must be accurate!
# take new image names out of the t()
$earthimages = array();
$earthimages[0] = "earth_620.jpg:".t("Color").":620:310";
# which image out of those is the default?
$defaultimage = 0;
# css dots for netscape 4 users and systems without GD
# url path:name:width:height
$cssdots = array();
$cssdots[0] = "reddot.gif:Red 7x7:7:7";
$cssdots[1] = "yellowdot.gif:Yellow 7x7:7:7";
$defaultdot = 0;
# block user agents "libwww-perl" "lwp-trivial" "LWP::Simple" "PHP/"
$blockbadagents = 1;
# log entries? comment the line to disable.
#$logging = "yes";
# path to the cookie
$cookiepath = "/";
# set $use_firewall to "1" if behind a proxy
if ($CFG->proxyhost and $CFG->proxyport) {
$use_firewall="1";
$firewall_host=$CFG->proxyhost;
$firewall_port=$CFG->proxyport;
} else {
$use_firewall="";
$firewall_host="localhost";
$firewall_port=3128;
}
?>

View File

@ -1,91 +0,0 @@
<?php
include("plotconf.inc");
include("plot.inc");
$form_vars = ${"HTTP_".$HTTP_SERVER_VARS["REQUEST_METHOD"]."_VARS"};
$lat = $form_vars['lat'];
$lon = $form_vars['lon'];
if(isset($HTTP_COOKIE_VARS["atlasprefs"]) && validcookie($HTTP_COOKIE_VARS["atlasprefs"])) {
list($setshape, $setcolor, $setsize, $earthimage, , ) = split(":", $HTTP_COOKIE_VARS["atlasprefs"]);
} else {
$setshape = "Diamond";
$setcolor = "red";
$setsize = "3";
$earthimage = $earthimages[$defaultimage];
list($earthimage, , , ) = split(":", $earthimage);
}
$earthimage = isvalidimage($earthimage, $earthimages, $defaultimage);
if(strstr($earthimage, ":")) {
list($earthimage, , , ) = split(":", $earthimage);
}
list($width, $height) = getimagecoords($earthimages, $earthimage);
if($setsize > 8 || $setsize < 2) {
$setsize = 2;
}
$im = @ImageCreate ($width, $height)
or die ("Cannot Initialize new GD image stream");
$background_color = ImageColorAllocate ($im, 255, 255, 255);
// color table
if($setcolor == "red") { $r = "255"; $g = "0"; $b = "0"; }
elseif($setcolor == "white") { $r = "255"; $g = "255"; $b = "254"; }
elseif($setcolor == "yellow") { $r = "255"; $g = "255"; $b = "0"; }
elseif($setcolor == "magenta") { $r = "255"; $g = "0"; $b = "255"; }
elseif($setcolor == "cyan") { $r = "0"; $g = "255"; $b = "255"; }
elseif($setcolor == "green") { $r = "0"; $g = "225"; $b = "0"; }
elseif($setcolor == "violet") { $r = "191"; $g = "0"; $b = "255"; }
else { $r = "255"; $g = "0"; $b = "0"; }
$loc_color = ImageColorAllocate ($im, $r, $g, $b);
if($lat == "" && $lon == "") { } else {
list($x, $y) = getlocationcoords($lat, $lon, $width, $height);
if($setshape == "Diamond") {
ImageLine($im, ($x - $setsize), $y, $x, ($y + $setsize), $loc_color);
ImageLine($im, ($x - $setsize), $y, $x, ($y - $setsize), $loc_color);
ImageLine($im, ($x + $setsize), $y, $x, ($y + $setsize), $loc_color);
ImageLine($im, ($x + $setsize), $y, $x, ($y - $setsize), $loc_color);
ImageFill($im, $x, $y, $loc_color);
} elseif($setshape == "Diamond Outline") {
ImageLine($im, ($x - $setsize), $y, $x, ($y + $setsize), $loc_color);
ImageLine($im, ($x - $setsize), $y, $x, ($y - $setsize), $loc_color);
ImageLine($im, ($x + $setsize), $y, $x, ($y + $setsize), $loc_color);
ImageLine($im, ($x + $setsize), $y, $x, ($y - $setsize), $loc_color);
} elseif($setshape == "Square") {
ImageFilledRectangle($im, ($x - $setsize), ($y - $setsize), ($x + $setsize), ($y + $setsize), $loc_color);
} elseif($setshape == "Square Outline") {
ImageRectangle($im, ($x - $setsize), ($y - $setsize), ($x + $setsize), ($y + $setsize), $loc_color);
} elseif($setshape == "Cross") {
ImageLine($im, ($x - $setsize), $y, ($x + $setsize), $y, $loc_color);
ImageLine($im, $x, ($y - $setsize), $x, ($y + $setsize), $loc_color);
} else {
// draw a diamond if error
ImageLine($im, ($x - $setsize), $y, $x, ($y + $setsize), $loc_color);
ImageLine($im, ($x - $setsize), $y, $x, ($y - $setsize), $loc_color);
ImageLine($im, ($x + $setsize), $y, $x, ($y + $setsize), $loc_color);
ImageLine($im, ($x + $setsize), $y, $x, ($y - $setsize), $loc_color);
ImageFill($im, $x, $y, $loc_color);
}
}
ImageColorTransparent ($im, $background_color);
Header("Pragma: no-cache");
Header("Expires: Thu, 26-Oct-1972 12:00:00");
Header("Content-type: image/png");
ImagePng ($im);
ImageDestroy($im);
?>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 B

View File

@ -1,14 +0,0 @@
<?php
function t($phrase) {
global $language;
if($language == "en") {
return $phrase;
} else {
include_once("languages/messages.$language.inc");
$phrase = lookup($phrase, $language);
return $phrase;
}
}
?>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 B

BIN
iplookup/marker.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 649 B

View File

@ -120,6 +120,8 @@ $string['configfrontpage'] = 'The items selected above will be displayed on the
$string['configfrontpageloggedin'] = 'The items selected above will be displayed on the site\'s front page when a user is logged in.';
$string['configfullnamedisplay'] = 'This defines how names are shown when they are displayed in full. For most mono-lingual sites the most efficient setting is the default \"First name + Surname\", but you may choose to hide surnames altogether, or to leave it up to the current language pack to decide (some languages have different conventions).';
$string['configgdversion'] = 'Indicate the version of GD that is installed. The version shown by default is the one that has been auto-detected. Don\'t change this unless you really know what you\'re doing.';
$string['configgeoipfile'] = 'Location of GeoIP City binary data file. This file is not part of Moodle distribution and must be obtained separately from <a href=\"http://www.maxmind.com/\">MaxMind</a>. You can either buy a commercial version or use the free version.<br />Simply download <a href=\"http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz\">http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz</a> and extract it into \"$a\" directory on your server.';
$string['configgooglemapkey'] = 'You need to enter a special key to use Google Maps for IP address lookup visualization. You can obtain the key free of charge at <a href=\"http://code.google.com/apis/maps/signup.html\">http://code.google.com/apis/maps/signup.html</a>.<br />Your web site URL is: $a';
$string['configgradebookroles'] = 'This setting allows you to control who appears on the gradebook. Users need to have at least one of these roles in a course to be shown in the gradebook for that course.';
$string['configgradeexport'] = 'Choose which gradebook export formats are your primary methods for exporting grades. Chosen plugins will then set and use a \"last exported\" field for every grade. For example, this might result in exported records being identified as being \"new\" or \"updated\". If you are not sure about this then leave everything unchecked.';
$string['configguestroleid'] = 'This role is automatically assigned to the guest user. It is also temporarily assigned to not enrolled users when they enter course that allows guests without password. Please verify that the role has moodle/legacy:guest and moodle/course:view capability.';
@ -352,7 +354,9 @@ $string['frontpagesettings'] = 'Front Page settings';
$string['fullnamedisplay'] = 'Full Name Format';
$string['gdversion'] = 'GD version';
$string['generalsettings'] = 'General settings';
$string['geoipfile'] = 'GeoIP City data file';
$string['globalsquoteswarning'] = '<p><strong>Security Warning</strong>: to operate properly, Moodle requires <br />that you make certain changes to your current PHP settings.<p/><p>You <em>must</em> set <code>register_globals=off</code> and/or <code>magic_quotes_gpc=on</code>. <br />If possible, you should set <code>register_globals=off</code> to improve general <br /> server security, setting <code>magic_quotes_gpc=on</code> is also recommended.<p/><p>These settings are controlled by editing your <code>php.ini</code>, Apache/IIS <br />configuration or <code>.htaccess</code> file.</p>';
$string['googlemapkey'] = 'Google Maps API key';
$string['gotofirst'] = 'Go to first missing string';
$string['gradebook'] = 'Gradebook';
$string['gradebookroles'] = 'Graded roles';
@ -387,6 +391,12 @@ $string['intcachemax'] = 'Int. cache max';
$string['invalidsection'] = 'Invalid section.';
$string['invaliduserchangeme'] = 'Username \"changeme\" is reserved -- you cannot create an account with it.';
$string['iplookup'] = 'IP address lookup';
$string['iplookupinfo'] = '
By default Moodle uses the free online NetGeo (The Internet Geographic Database) server to lookup location of IP addresses, unfortunately this database is not maintained anymore and may return <em>wildly incorrect</em> data.
It is recommended to install local copy of free GeoLite City database from MaxMind.<br />
IP address location is displayed on simple map or using Google Maps. Please note that you need to have a Google account and apply for free Google Maps API key to enable interactive maps.';
$string['iplookupmaxmindnote'] = 'This product includes GeoLite data created by MaxMind, available from <a href=\"http://www.maxmind.com/\">http://www.maxmind.com/</a>.';
$string['iplookupnetgeonote'] = 'The NetGeo server is currently being used to look up geographical information. For more accurate results we recommend installing a local copy of the MaxMind GeoLite database.';
$string['keeptagnamecase'] = 'Keep tag name casing';
$string['lang'] = 'Default language';
$string['lang16notify'] = 'Moodle 1.6 and above allows you to install and update language packs directly from download.moodle.org by following the link below';

View File

@ -49,10 +49,13 @@ $string['guestnoeditprofileother'] = 'The guest user profile cannot be edited';
$string['invalidcourse'] = 'Invalid course';
$string['invalidfieldname'] = '\"$a\" is not a valid field name';
$string['invalidfiletype'] = '\"$a\" is not a valid file type';
$string['invalidipformat'] = 'Invalid IP address format';
$string['invalidmd5'] = 'Invalid md5';
$string['invalidrequest'] = 'Invalid request';
$string['invalidrole'] = 'Invalid role';
$string['invalidurl'] = 'Invalid url';
$string['iplookupfailed'] = 'Can not find geo information about this IP address $a.';
$string['iplookupprivate'] = 'Can not display lookup of private IP address';
$string['invalidxmlfile'] = '\"$a\" is not a valid XML file';
$string['listnopeers'] = 'No peers of item found.';
$string['listnoitem'] = 'Item not found.';

44
lib/geoip/ChangeLog.htm Normal file
View File

@ -0,0 +1,44 @@
* Fix bug where PHP API didn't work with new edition of GeoIP ISP
1.6 2007-1-10
* Added AX/Aland Islands, GG/Guernsey, IM/Isle of Man, JE/Jersey (ISO-3166-1 changes)
* Replaced CS/Serbia and Montenegro with RS/Serbia, removed ZR/Zaire, added ME/Montenegro
* geoip_country_(code|name)_by_addr now work against Geo(IP|Lite) City (Frank Mather)
* Added code to lookup zoneinfo timezone given country and region (Frank Mather)
* TP/East Timor changed to TL/Timor-Leste, reflecting changes in ISO-3166
1.5 2005-11-1
* Added Shared Memory support for GeoIP City (Frank Mather)
* Replaced Yugoslavia with Serbia and Montenegro
* Removed global declaration for $GEOIP_COUNTRY_CODE_TO_NUMBER, $GEOIP_COUNTRY_CODES,
and $GEOIP_COUNTRY_CODES3
1.4 2005-01-13 Andrew Hill, Awarez Ltd. (http://www.awarez.net)
* Formatted file according to PEAR library standards.
* Moved $GEOIP_COUNTRY_CODE_TO_NUMBER, $GEOIP_COUNTRY_CODES,
* $GEOIP_COUNTRY_CODES3 and $GEOIP_COUNTRY_NAMES into the
* GeoIP class, so that library will still work even when
* not included in the $GLOBAL context.
* Updated geoip_country_code_by_addr to work with PHP5 (Eric of Host Ultra)
* Replaced bit operators (| and &) with logical operators (|| and &&)
* Defined GEOIP_ISP_EDITION
1.3 2004-8-4
* Changed license from GPL to LGPL so code can be included in PEAR
* added global definitions to prevent undefined variables error when including from function (C<>dric Dufour)
* Updated country names
* Added support for GeoIP City, version 1 with DMA and Area codes
1.2 2003-10-28
* Added support for Shared Memory (Jason Priebe)
* Added support for Distributed queries
* Added support for GeoIP Region, version 1
* Added Anonymous Proxy and Satellite Provider code/labels
* Changed Taiwan, Province of China to Taiwan
1.1 2003-01-15
* Added support for GeoIP Region and GeoIP City
1.0 2002-11-21
* Initial checkin to CVS

43
lib/geoip/README.htm Normal file
View File

@ -0,0 +1,43 @@
Requirements
None (only the 'GeoIP.dat' file is needed). To download a free GeoIP Standard Country
database, go to
http://maxmind.com/download/geoip/database/
Install
Just place the 'geoip.inc' file somewhere according to the 'include_path' directive of
your 'php.ini' file, or just place it in the same directory as your PHP scripts.
Usage
Gets country name by hostname :
include("geoip.inc");
$gi = geoip_open("/usr/local/share/GeoIP/GeoIP.dat",GEOIP_STANDARD);
echo geoip_country_code_by_addr($gi, "24.24.24.24") . "\t" .
geoip_country_name_by_addr($gi, "24.24.24.24") . "\n";
echo geoip_country_code_by_addr($gi, "80.24.24.24") . "\t" .
geoip_country_name_by_addr($gi, "80.24.24.24") . "\n";
geoip_close($gi);
Memory Caching:
To enable memory caching, pass GEOIP_SHARED_MEMORY or
GEOIP_MEMORY_CACHE to the second argument of geoip_open
For GEOIP_SHARED_MEMORY, requires php >= 4.0.4,
and --enable-shmop passed at configure time, see
http://us2.php.net/manual/en/ref.shmop.php
In addition, you should call geoip_load_shared_mem
before calling geoip_open. See sample_city.php for an
example of shared memory caching.
Working with PHP5.
geoip_country_code_by_addr should work
with PHP. For help with the other
routines, please contact support@maxmind.com
Thanks to Jim Winstead.

498
lib/geoip/geoip.inc Normal file
View File

@ -0,0 +1,498 @@
<?php
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
/* geoip.inc
*
* Copyright (C) 2007 MaxMind LLC
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
define("GEOIP_COUNTRY_BEGIN", 16776960);
define("GEOIP_STATE_BEGIN_REV0", 16700000);
define("GEOIP_STATE_BEGIN_REV1", 16000000);
define("GEOIP_STANDARD", 0);
define("GEOIP_MEMORY_CACHE", 1);
define("GEOIP_SHARED_MEMORY", 2);
define("STRUCTURE_INFO_MAX_SIZE", 20);
define("DATABASE_INFO_MAX_SIZE", 100);
define("GEOIP_COUNTRY_EDITION", 106);
define("GEOIP_PROXY_EDITION", 8);
define("GEOIP_ASNUM_EDITION", 9);
define("GEOIP_NETSPEED_EDITION", 10);
define("GEOIP_REGION_EDITION_REV0", 112);
define("GEOIP_REGION_EDITION_REV1", 3);
define("GEOIP_CITY_EDITION_REV0", 111);
define("GEOIP_CITY_EDITION_REV1", 2);
define("GEOIP_ORG_EDITION", 110);
define("GEOIP_ISP_EDITION", 4);
define("SEGMENT_RECORD_LENGTH", 3);
define("STANDARD_RECORD_LENGTH", 3);
define("ORG_RECORD_LENGTH", 4);
define("MAX_RECORD_LENGTH", 4);
define("MAX_ORG_RECORD_LENGTH", 300);
define("GEOIP_SHM_KEY", 0x4f415401);
define("US_OFFSET", 1);
define("CANADA_OFFSET", 677);
define("WORLD_OFFSET", 1353);
define("FIPS_RANGE", 360);
define("GEOIP_UNKNOWN_SPEED", 0);
define("GEOIP_DIALUP_SPEED", 1);
define("GEOIP_CABLEDSL_SPEED", 2);
define("GEOIP_CORPORATE_SPEED", 3);
class GeoIP {
var $flags;
var $filehandle;
var $memory_buffer;
var $databaseType;
var $databaseSegments;
var $record_length;
var $shmid;
var $GEOIP_COUNTRY_CODE_TO_NUMBER = array(
"" => 0, "AP" => 1, "EU" => 2, "AD" => 3, "AE" => 4, "AF" => 5,
"AG" => 6, "AI" => 7, "AL" => 8, "AM" => 9, "AN" => 10, "AO" => 11,
"AQ" => 12, "AR" => 13, "AS" => 14, "AT" => 15, "AU" => 16, "AW" => 17,
"AZ" => 18, "BA" => 19, "BB" => 20, "BD" => 21, "BE" => 22, "BF" => 23,
"BG" => 24, "BH" => 25, "BI" => 26, "BJ" => 27, "BM" => 28, "BN" => 29,
"BO" => 30, "BR" => 31, "BS" => 32, "BT" => 33, "BV" => 34, "BW" => 35,
"BY" => 36, "BZ" => 37, "CA" => 38, "CC" => 39, "CD" => 40, "CF" => 41,
"CG" => 42, "CH" => 43, "CI" => 44, "CK" => 45, "CL" => 46, "CM" => 47,
"CN" => 48, "CO" => 49, "CR" => 50, "CU" => 51, "CV" => 52, "CX" => 53,
"CY" => 54, "CZ" => 55, "DE" => 56, "DJ" => 57, "DK" => 58, "DM" => 59,
"DO" => 60, "DZ" => 61, "EC" => 62, "EE" => 63, "EG" => 64, "EH" => 65,
"ER" => 66, "ES" => 67, "ET" => 68, "FI" => 69, "FJ" => 70, "FK" => 71,
"FM" => 72, "FO" => 73, "FR" => 74, "FX" => 75, "GA" => 76, "GB" => 77,
"GD" => 78, "GE" => 79, "GF" => 80, "GH" => 81, "GI" => 82, "GL" => 83,
"GM" => 84, "GN" => 85, "GP" => 86, "GQ" => 87, "GR" => 88, "GS" => 89,
"GT" => 90, "GU" => 91, "GW" => 92, "GY" => 93, "HK" => 94, "HM" => 95,
"HN" => 96, "HR" => 97, "HT" => 98, "HU" => 99, "ID" => 100, "IE" => 101,
"IL" => 102, "IN" => 103, "IO" => 104, "IQ" => 105, "IR" => 106, "IS" => 107,
"IT" => 108, "JM" => 109, "JO" => 110, "JP" => 111, "KE" => 112, "KG" => 113,
"KH" => 114, "KI" => 115, "KM" => 116, "KN" => 117, "KP" => 118, "KR" => 119,
"KW" => 120, "KY" => 121, "KZ" => 122, "LA" => 123, "LB" => 124, "LC" => 125,
"LI" => 126, "LK" => 127, "LR" => 128, "LS" => 129, "LT" => 130, "LU" => 131,
"LV" => 132, "LY" => 133, "MA" => 134, "MC" => 135, "MD" => 136, "MG" => 137,
"MH" => 138, "MK" => 139, "ML" => 140, "MM" => 141, "MN" => 142, "MO" => 143,
"MP" => 144, "MQ" => 145, "MR" => 146, "MS" => 147, "MT" => 148, "MU" => 149,
"MV" => 150, "MW" => 151, "MX" => 152, "MY" => 153, "MZ" => 154, "NA" => 155,
"NC" => 156, "NE" => 157, "NF" => 158, "NG" => 159, "NI" => 160, "NL" => 161,
"NO" => 162, "NP" => 163, "NR" => 164, "NU" => 165, "NZ" => 166, "OM" => 167,
"PA" => 168, "PE" => 169, "PF" => 170, "PG" => 171, "PH" => 172, "PK" => 173,
"PL" => 174, "PM" => 175, "PN" => 176, "PR" => 177, "PS" => 178, "PT" => 179,
"PW" => 180, "PY" => 181, "QA" => 182, "RE" => 183, "RO" => 184, "RU" => 185,
"RW" => 186, "SA" => 187, "SB" => 188, "SC" => 189, "SD" => 190, "SE" => 191,
"SG" => 192, "SH" => 193, "SI" => 194, "SJ" => 195, "SK" => 196, "SL" => 197,
"SM" => 198, "SN" => 199, "SO" => 200, "SR" => 201, "ST" => 202, "SV" => 203,
"SY" => 204, "SZ" => 205, "TC" => 206, "TD" => 207, "TF" => 208, "TG" => 209,
"TH" => 210, "TJ" => 211, "TK" => 212, "TM" => 213, "TN" => 214, "TO" => 215,
"TL" => 216, "TR" => 217, "TT" => 218, "TV" => 219, "TW" => 220, "TZ" => 221,
"UA" => 222, "UG" => 223, "UM" => 224, "US" => 225, "UY" => 226, "UZ" => 227,
"VA" => 228, "VC" => 229, "VE" => 230, "VG" => 231, "VI" => 232, "VN" => 233,
"VU" => 234, "WF" => 235, "WS" => 236, "YE" => 237, "YT" => 238, "RS" => 239,
"ZA" => 240, "ZM" => 241, "ME" => 242, "ZW" => 243, "A1" => 244, "A2" => 245,
"O1" => 246, "AX" => 247, "GG" => 248, "IM" => 249, "JE" => 250
);
var $GEOIP_COUNTRY_CODES = array(
"", "AP", "EU", "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", "AO", "AQ",
"AR", "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH",
"BI", "BJ", "BM", "BN", "BO", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA",
"CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU",
"CV", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG",
"EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "FX", "GA", "GB",
"GD", "GE", "GF", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT",
"GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN",
"IO", "IQ", "IR", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM",
"KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS",
"LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MH", "MK", "ML", "MM", "MN",
"MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA",
"NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA",
"PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY",
"QA", "RE", "RO", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI",
"SJ", "SK", "SL", "SM", "SN", "SO", "SR", "ST", "SV", "SY", "SZ", "TC", "TD",
"TF", "TG", "TH", "TJ", "TK", "TM", "TN", "TO", "TL", "TR", "TT", "TV", "TW",
"TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN",
"VU", "WF", "WS", "YE", "YT", "RS", "ZA", "ZM", "ME", "ZW", "A1", "A2", "O1",
"AX", "GG", "IM", "JE"
);
var $GEOIP_COUNTRY_CODES3 = array(
"","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT","AGO","AQ","ARG",
"ASM","AUT","AUS","ABW","AZE","BIH","BRB","BGD","BEL","BFA","BGR","BHR","BDI",
"BEN","BMU","BRN","BOL","BRA","BHS","BTN","BV","BWA","BLR","BLZ","CAN","CC",
"COD","CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI","CUB","CPV",
"CX","CYP","CZE","DEU","DJI","DNK","DMA","DOM","DZA","ECU","EST","EGY","ESH",
"ERI","ESP","ETH","FIN","FJI","FLK","FSM","FRO","FRA","FX","GAB","GBR","GRD",
"GEO","GUF","GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","GS","GTM","GUM",
"GNB","GUY","HKG","HM","HND","HRV","HTI","HUN","IDN","IRL","ISR","IND","IO",
"IRQ","IRN","ISL","ITA","JAM","JOR","JPN","KEN","KGZ","KHM","KIR","COM","KNA",
"PRK","KOR","KWT","CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",
"LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI","MMR","MNG","MAC",
"MNP","MTQ","MRT","MSR","MLT","MUS","MDV","MWI","MEX","MYS","MOZ","NAM","NCL",
"NER","NFK","NGA","NIC","NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER",
"PYF","PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW","PRY","QAT",
"REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN","SWE","SGP","SHN","SVN","SJM",
"SVK","SLE","SMR","SEN","SOM","SUR","STP","SLV","SYR","SWZ","TCA","TCD","TF",
"TGO","THA","TJK","TKL","TLS","TKM","TUN","TON","TUR","TTO","TUV","TWN","TZA",
"UKR","UGA","UM","USA","URY","UZB","VAT","VCT","VEN","VGB","VIR","VNM","VUT",
"WLF","WSM","YEM","YT","SRB","ZAF","ZMB","MNE","ZWE","A1","A2","O1",
"ALA","GGY","IMN","JEY"
);
var $GEOIP_COUNTRY_NAMES = array(
"", "Asia/Pacific Region", "Europe", "Andorra", "United Arab Emirates",
"Afghanistan", "Antigua and Barbuda", "Anguilla", "Albania", "Armenia",
"Netherlands Antilles", "Angola", "Antarctica", "Argentina", "American Samoa",
"Austria", "Australia", "Aruba", "Azerbaijan", "Bosnia and Herzegovina",
"Barbados", "Bangladesh", "Belgium", "Burkina Faso", "Bulgaria", "Bahrain",
"Burundi", "Benin", "Bermuda", "Brunei Darussalam", "Bolivia", "Brazil",
"Bahamas", "Bhutan", "Bouvet Island", "Botswana", "Belarus", "Belize",
"Canada", "Cocos (Keeling) Islands", "Congo, The Democratic Republic of the",
"Central African Republic", "Congo", "Switzerland", "Cote D'Ivoire", "Cook
Islands", "Chile", "Cameroon", "China", "Colombia", "Costa Rica", "Cuba", "Cape
Verde", "Christmas Island", "Cyprus", "Czech Republic", "Germany", "Djibouti",
"Denmark", "Dominica", "Dominican Republic", "Algeria", "Ecuador", "Estonia",
"Egypt", "Western Sahara", "Eritrea", "Spain", "Ethiopia", "Finland", "Fiji",
"Falkland Islands (Malvinas)", "Micronesia, Federated States of", "Faroe
Islands", "France", "France, Metropolitan", "Gabon", "United Kingdom",
"Grenada", "Georgia", "French Guiana", "Ghana", "Gibraltar", "Greenland",
"Gambia", "Guinea", "Guadeloupe", "Equatorial Guinea", "Greece", "South Georgia
and the South Sandwich Islands", "Guatemala", "Guam", "Guinea-Bissau",
"Guyana", "Hong Kong", "Heard Island and McDonald Islands", "Honduras",
"Croatia", "Haiti", "Hungary", "Indonesia", "Ireland", "Israel", "India",
"British Indian Ocean Territory", "Iraq", "Iran, Islamic Republic of",
"Iceland", "Italy", "Jamaica", "Jordan", "Japan", "Kenya", "Kyrgyzstan",
"Cambodia", "Kiribati", "Comoros", "Saint Kitts and Nevis", "Korea, Democratic
People's Republic of", "Korea, Republic of", "Kuwait", "Cayman Islands",
"Kazakstan", "Lao People's Democratic Republic", "Lebanon", "Saint Lucia",
"Liechtenstein", "Sri Lanka", "Liberia", "Lesotho", "Lithuania", "Luxembourg",
"Latvia", "Libyan Arab Jamahiriya", "Morocco", "Monaco", "Moldova, Republic
of", "Madagascar", "Marshall Islands", "Macedonia",
"Mali", "Myanmar", "Mongolia", "Macau", "Northern Mariana Islands",
"Martinique", "Mauritania", "Montserrat", "Malta", "Mauritius", "Maldives",
"Malawi", "Mexico", "Malaysia", "Mozambique", "Namibia", "New Caledonia",
"Niger", "Norfolk Island", "Nigeria", "Nicaragua", "Netherlands", "Norway",
"Nepal", "Nauru", "Niue", "New Zealand", "Oman", "Panama", "Peru", "French
Polynesia", "Papua New Guinea", "Philippines", "Pakistan", "Poland", "Saint
Pierre and Miquelon", "Pitcairn Islands", "Puerto Rico", "Palestinian Territory",
"Portugal", "Palau", "Paraguay", "Qatar", "Reunion", "Romania",
"Russian Federation", "Rwanda", "Saudi Arabia", "Solomon Islands",
"Seychelles", "Sudan", "Sweden", "Singapore", "Saint Helena", "Slovenia",
"Svalbard and Jan Mayen", "Slovakia", "Sierra Leone", "San Marino", "Senegal",
"Somalia", "Suriname", "Sao Tome and Principe", "El Salvador", "Syrian Arab
Republic", "Swaziland", "Turks and Caicos Islands", "Chad", "French Southern
Territories", "Togo", "Thailand", "Tajikistan", "Tokelau", "Turkmenistan",
"Tunisia", "Tonga", "Timor-Leste", "Turkey", "Trinidad and Tobago", "Tuvalu",
"Taiwan", "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", "Virgin Islands, British", "Virgin Islands, U.S.",
"Vietnam", "Vanuatu", "Wallis and Futuna", "Samoa", "Yemen", "Mayotte",
"Serbia", "South Africa", "Zambia", "Montenegro", "Zimbabwe",
"Anonymous Proxy","Satellite Provider","Other",
"Aland Islands","Guernsey","Isle of Man","Jersey"
);
}
function geoip_load_shared_mem ($file) {
$fp = fopen($file, "rb");
if (!$fp) {
print "error opening $file: $php_errormsg\n";
exit;
}
$s_array = fstat($fp);
$size = $s_array['size'];
if ($shmid = @shmop_open (GEOIP_SHM_KEY, "w", 0, 0)) {
shmop_delete ($shmid);
shmop_close ($shmid);
}
$shmid = shmop_open (GEOIP_SHM_KEY, "c", 0644, $size);
shmop_write ($shmid, fread($fp, $size), 0);
shmop_close ($shmid);
}
function _setup_segments($gi){
$gi->databaseType = GEOIP_COUNTRY_EDITION;
$gi->record_length = STANDARD_RECORD_LENGTH;
if ($gi->flags & GEOIP_SHARED_MEMORY) {
$offset = @shmop_size ($gi->shmid) - 3;
for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
$delim = @shmop_read ($gi->shmid, $offset, 3);
$offset += 3;
if ($delim == (chr(255).chr(255).chr(255))) {
$gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1));
$offset++;
if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
} else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
} else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)||
($gi->databaseType == GEOIP_CITY_EDITION_REV1)
|| ($gi->databaseType == GEOIP_ORG_EDITION)
|| ($gi->databaseType == GEOIP_ISP_EDITION)
|| ($gi->databaseType == GEOIP_ASNUM_EDITION)){
$gi->databaseSegments = 0;
$buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH);
for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
$gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
}
if (($gi->databaseType == GEOIP_ORG_EDITION)||
($gi->databaseType == GEOIP_ISP_EDITION)) {
$gi->record_length = ORG_RECORD_LENGTH;
}
}
break;
} else {
$offset -= 4;
}
}
if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
($gi->databaseType == GEOIP_PROXY_EDITION)||
($gi->databaseType == GEOIP_NETSPEED_EDITION)){
$gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
}
} else {
$filepos = ftell($gi->filehandle);
fseek($gi->filehandle, -3, SEEK_END);
for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
$delim = fread($gi->filehandle,3);
if ($delim == (chr(255).chr(255).chr(255))){
$gi->databaseType = ord(fread($gi->filehandle,1));
if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
}
else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
$gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
} else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0) ||
($gi->databaseType == GEOIP_CITY_EDITION_REV1) ||
($gi->databaseType == GEOIP_ORG_EDITION) ||
($gi->databaseType == GEOIP_ISP_EDITION) ||
($gi->databaseType == GEOIP_ASNUM_EDITION)){
$gi->databaseSegments = 0;
$buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH);
for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
$gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
}
if ($gi->databaseType == GEOIP_ORG_EDITION ||
$gi->databaseType == GEOIP_ISP_EDITION) {
$gi->record_length = ORG_RECORD_LENGTH;
}
}
break;
} else {
fseek($gi->filehandle, -4, SEEK_CUR);
}
}
if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
($gi->databaseType == GEOIP_PROXY_EDITION)||
($gi->databaseType == GEOIP_NETSPEED_EDITION)){
$gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
}
fseek($gi->filehandle,$filepos,SEEK_SET);
}
return $gi;
}
function geoip_open($filename, $flags) {
$gi = new GeoIP;
$gi->flags = $flags;
if ($gi->flags & GEOIP_SHARED_MEMORY) {
$gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0);
} else {
$gi->filehandle = fopen($filename,"rb");
if ($gi->flags & GEOIP_MEMORY_CACHE) {
$s_array = fstat($gi->filehandle);
$gi->memory_buffer = fread($gi->filehandle, $s_array['size']);
}
}
$gi = _setup_segments($gi);
return $gi;
}
function geoip_close($gi) {
if ($gi->flags & GEOIP_SHARED_MEMORY) {
return true;
}
return fclose($gi->filehandle);
}
function geoip_country_id_by_name($gi, $name) {
$addr = gethostbyname($name);
if (!$addr || $addr == $name) {
return false;
}
return geoip_country_id_by_addr($gi, $addr);
}
function geoip_country_code_by_name($gi, $name) {
$country_id = geoip_country_id_by_name($gi,$name);
if ($country_id !== false) {
return $gi->GEOIP_COUNTRY_CODES[$country_id];
}
return false;
}
function geoip_country_name_by_name($gi, $name) {
$country_id = geoip_country_id_by_name($gi,$name);
if ($country_id !== false) {
return $gi->GEOIP_COUNTRY_NAMES[$country_id];
}
return false;
}
function geoip_country_id_by_addr($gi, $addr) {
$ipnum = ip2long($addr);
return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
}
function geoip_country_code_by_addr($gi, $addr) {
if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
$record = geoip_record_by_addr($gi,$addr);
return $record->country_code;
} else {
$country_id = geoip_country_id_by_addr($gi,$addr);
if ($country_id !== false) {
return $gi->GEOIP_COUNTRY_CODES[$country_id];
}
}
return false;
}
function geoip_country_name_by_addr($gi, $addr) {
if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
$record = geoip_record_by_addr($gi,$addr);
return $record->country_name;
} else {
$country_id = geoip_country_id_by_addr($gi,$addr);
if ($country_id !== false) {
return $gi->GEOIP_COUNTRY_NAMES[$country_id];
}
}
return false;
}
function _geoip_seek_country($gi, $ipnum) {
$offset = 0;
for ($depth = 31; $depth >= 0; --$depth) {
if ($gi->flags & GEOIP_MEMORY_CACHE) {
$buf = substr($gi->memory_buffer,
2 * $gi->record_length * $offset,
2 * $gi->record_length);
} elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
$buf = @shmop_read ($gi->shmid,
2 * $gi->record_length * $offset,
2 * $gi->record_length );
} else {
fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
or die("fseek failed");
$buf = fread($gi->filehandle, 2 * $gi->record_length);
}
$x = array(0,0);
for ($i = 0; $i < 2; ++$i) {
for ($j = 0; $j < $gi->record_length; ++$j) {
$x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
}
}
if ($ipnum & (1 << $depth)) {
if ($x[1] >= $gi->databaseSegments) {
return $x[1];
}
$offset = $x[1];
} else {
if ($x[0] >= $gi->databaseSegments) {
return $x[0];
}
$offset = $x[0];
}
}
trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
return false;
}
function _get_org($gi,$ipnum){
$seek_org = _geoip_seek_country($gi,$ipnum);
if ($seek_org == $gi->databaseSegments) {
return NULL;
}
$record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments;
if ($gi->flags & GEOIP_SHARED_MEMORY) {
$org_buf = @shmop_read ($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH);
} else {
fseek($gi->filehandle, $record_pointer, SEEK_SET);
$org_buf = fread($gi->filehandle,MAX_ORG_RECORD_LENGTH);
}
$org_buf = substr($org_buf, 0, strpos($org_buf, 0));
return $org_buf;
}
function geoip_org_by_addr ($gi,$addr) {
if ($addr == NULL) {
return 0;
}
$ipnum = ip2long($addr);
return _get_org($gi, $ipnum);
}
function _get_region($gi,$ipnum){
if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
$seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV0;
if ($seek_region >= 1000){
$country_code = "US";
$region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65);
} else {
$country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region];
$region = "";
}
return array ($country_code,$region);
} else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1) {
$seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV1;
//print $seek_region;
if ($seek_region < US_OFFSET){
$country_code = "";
$region = "";
} else if ($seek_region < CANADA_OFFSET) {
$country_code = "US";
$region = chr(($seek_region - US_OFFSET)/26 + 65) . chr(($seek_region - US_OFFSET)%26 + 65);
} else if ($seek_region < WORLD_OFFSET) {
$country_code = "CA";
$region = chr(($seek_region - CANADA_OFFSET)/26 + 65) . chr(($seek_region - CANADA_OFFSET)%26 + 65);
} else {
$country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE];
$region = "";
}
return array ($country_code,$region);
}
}
function geoip_region_by_addr ($gi,$addr) {
if ($addr == NULL) {
return 0;
}
$ipnum = ip2long($addr);
return _get_region($gi, $ipnum);
}
function getdnsattributes ($l,$ip){
$r = new Net_DNS_Resolver();
$r->nameservers = array("ws1.maxmind.com");
$p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN");
$str = is_object($p->answer[0])?$p->answer[0]->string():'';
ereg("\"(.*)\"",$str,$regs);
$str = $regs[1];
return $str;
}
?>

205
lib/geoip/geoipcity.inc Normal file
View File

@ -0,0 +1,205 @@
<?php
/* geoipcity.inc
*
* Copyright (C) 2004 Maxmind LLC
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Changelog:
*
* 2005-01-13 Andrew Hill, Awarez Ltd. (http://www.awarez.net)
* Formatted file according to PEAR library standards.
* Changed inclusion of geoip.inc file to require_once, so that
* this library can be used in the same script as geoip.inc.
*/
define("FULL_RECORD_LENGTH",50);
require_once 'geoip.inc';
require_once 'geoipregionvars.php';
class geoiprecord {
var $country_code;
var $country_code3;
var $country_name;
var $region;
var $city;
var $postal_code;
var $latitude;
var $longitude;
var $area_code;
var $dma_code;
}
class geoipdnsrecord {
var $country_code;
var $country_code3;
var $country_name;
var $region;
var $regionname;
var $city;
var $postal_code;
var $latitude;
var $longitude;
var $areacode;
var $dmacode;
var $isp;
var $org;
}
function getrecordwithdnsservice($str){
$record = new geoipdnsrecord;
$keyvalue = split(";",$str);
foreach ($keyvalue as $keyvalue2){
list($key,$value) = split("=",$keyvalue2);
if ($key == "co"){
$record->country_code = $value;
}
if ($key == "ci"){
$record->city = $value;
}
if ($key == "re"){
$record->region = $value;
}
if ($key == "ac"){
$record->areacode = $value;
}
if ($key == "dm"){
$record->dmacode = $value;
}
if ($key == "is"){
$record->isp = $value;
}
if ($key == "or"){
$record->org = $value;
}
if ($key == "zi"){
$record->postal_code = $value;
}
if ($key == "la"){
$record->latitude = $value;
}
if ($key == "lo"){
$record->longitude = $value;
}
}
$number = $GLOBALS['GEOIP_COUNTRY_CODE_TO_NUMBER'][$record->country_code];
$record->country_code3 = $GLOBALS['GEOIP_COUNTRY_CODES3'][$number];
$record->country_name = $GLOBALS['GEOIP_COUNTRY_NAMES'][$number];
if ($record->region != "") {
if (($record->country_code == "US") || ($record->country_code == "CA")){
$record->regionname = $GLOBALS['ISO'][$record->country_code][$record->region];
} else {
$record->regionname = $GLOBALS['FIPS'][$record->country_code][$record->region];
}
}
return $record;
}
function _get_record($gi,$ipnum){
$seek_country = _geoip_seek_country($gi,$ipnum);
if ($seek_country == $gi->databaseSegments) {
return NULL;
}
$record_pointer = $seek_country + (2 * $gi->record_length - 1) * $gi->databaseSegments;
if ($gi->flags & GEOIP_MEMORY_CACHE) {
$record_buf = substr($gi->memory_buffer,$record_pointer,FULL_RECORD_LENGTH);
} elseif ($gi->flags & GEOIP_SHARED_MEMORY){
$record_buf = @shmop_read($gi->shmid,$record_pointer,FULL_RECORD_LENGTH);
} else {
fseek($gi->filehandle, $record_pointer, SEEK_SET);
$record_buf = fread($gi->filehandle,FULL_RECORD_LENGTH);
}
$record = new geoiprecord;
$record_buf_pos = 0;
$char = ord(substr($record_buf,$record_buf_pos,1));
$record->country_code = $gi->GEOIP_COUNTRY_CODES[$char];
$record->country_code3 = $gi->GEOIP_COUNTRY_CODES3[$char];
$record->country_name = $gi->GEOIP_COUNTRY_NAMES[$char];
$record_buf_pos++;
$str_length = 0;
// Get region
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
while ($char != 0){
$str_length++;
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
}
if ($str_length > 0){
$record->region = substr($record_buf,$record_buf_pos,$str_length);
}
$record_buf_pos += $str_length + 1;
$str_length = 0;
// Get city
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
while ($char != 0){
$str_length++;
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
}
if ($str_length > 0){
$record->city = substr($record_buf,$record_buf_pos,$str_length);
}
$record_buf_pos += $str_length + 1;
$str_length = 0;
// Get postal code
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
while ($char != 0){
$str_length++;
$char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
}
if ($str_length > 0){
$record->postal_code = substr($record_buf,$record_buf_pos,$str_length);
}
$record_buf_pos += $str_length + 1;
$str_length = 0;
// Get latitude and longitude
$latitude = 0;
$longitude = 0;
for ($j = 0;$j < 3; ++$j){
$char = ord(substr($record_buf,$record_buf_pos++,1));
$latitude += ($char << ($j * 8));
}
$record->latitude = ($latitude/10000) - 180;
for ($j = 0;$j < 3; ++$j){
$char = ord(substr($record_buf,$record_buf_pos++,1));
$longitude += ($char << ($j * 8));
}
$record->longitude = ($longitude/10000) - 180;
if (GEOIP_CITY_EDITION_REV1 == $gi->databaseType){
$dmaarea_combo = 0;
if ($record->country_code == "US"){
for ($j = 0;$j < 3;++$j){
$char = ord(substr($record_buf,$record_buf_pos++,1));
$dmaarea_combo += ($char << ($j * 8));
}
$record->dma_code = floor($dmaarea_combo/1000);
$record->area_code = $dmaarea_combo%1000;
}
}
return $record;
}
function GeoIP_record_by_addr ($gi,$addr){
if ($addr == NULL){
return 0;
}
$ipnum = ip2long($addr);
return _get_record($gi, $ipnum);
}
?>

File diff suppressed because it is too large Load Diff

View File

@ -675,6 +675,14 @@ body#user-index #longtimenosee {
font-size: 0.8em;
}
.iplookup #header h1.headermain {
font-size:1em;
}
.iplookup #note {
font-size:0.8em;
font-style: italic;
}
/***
*** Modules: Assignment

View File

@ -3150,6 +3150,14 @@ body#user-index .rolesform {
height:100%;
}
.iplookup #map {
margin:auto;
}
.iplookup #note {
text-align:center;
}
/***
*** Modules: Assignment
***/