MDL-23695 fixed yet another PAGE->context issue
[moodle.git] / iplookup / index.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * Displays IP address on map
20  *
21  * @package    moodlecore
22  * @subpackage iplookup
23  * @copyright  2008 Petr Skoda (http://skodak.org)
24  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
27 require('../config.php');
28 require_once($CFG->libdir.'/filelib.php');
29 require_once($CFG->libdir.'/geoip/geoipcity.inc');
31 require_login();
33 $ip   = optional_param('ip', getremoteaddr(), PARAM_HOST);
34 $user = optional_param('user', $USER->id, PARAM_INT);
36 if (isset($CFG->iplookup)) {
37     //clean up of old settings
38     set_config('iplookup', NULL);
39 }
41 $PAGE->set_url('/iplookup/index.php', array('id'=>$ip, 'user'=>$user));
42 $PAGE->set_pagelayout('popup');
43 $PAGE->set_context(get_context_instance(CONTEXT_SYSTEM));
45 $info = array($ip);
46 $note = array();
48 if (!preg_match('/(^\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/', $ip, $match)) {
49     print_error('invalidipformat', 'error');
50 }
52 if ($match[1] > 255 or $match[2] > 255 or $match[3] > 255 or $match[4] > 255) {
53     print_error('invalidipformat', 'error');
54 }
56 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')) {
57     print_error('iplookupprivate', 'error');
58 }
60 if ($user) {
61     if ($user = $DB->get_record('user', array('id'=>$user, 'deleted'=>0))) {
62         $info[] = fullname($user);
63     }
64 }
66 if (!empty($CFG->geoipfile) and file_exists($CFG->geoipfile)) {
67     $gi = geoip_open($CFG->geoipfile, GEOIP_STANDARD);
68     $location = geoip_record_by_addr($gi, $ip);
69     geoip_close($gi);
71     if (empty($location)) {
72         print_error('iplookupfailed', 'error', '', $ip);
73     }
74     if (!empty($location->city)) {
75         $info[] = $location->city;
76     }
78     if (!empty($location->country_code)) {
79         $countries = get_string_manager()->get_list_of_countries(true);
80         if (isset($countries[$location->country_code])) {
81             // prefer our localized country names
82             $info[] = $countries[$location->country_code];
83         } else {
84             $info[] = $location->country_name;
85         }
86     }
87     $longitude = $location->longitude;
88     $latitude  = $location->latitude;
89     $note[] = get_string('iplookupmaxmindnote', 'admin');
91 } else {
92     $ipdata = download_file_content('http://netgeo.caida.org/perl/netgeo.cgi?target='.$ip);
93     if ($ipdata === false) {
94         print_error('cannotnetgeo');
95     }
96     $matches = null;
97     if (!preg_match('/LAT:\s*(-?\d+\.\d+)/s', $ipdata, $matches)) {
98         print_error('iplookupfailed', 'error', '', $ip);
99     }
100     $latitude  = (float)$matches[1];
101     if (!preg_match('/LONG:\s*(-?\d+\.\d+)/s', $ipdata, $matches)) {
102         print_error('iplookupfailed', 'error', '', $ip);
103     }
104     $longitude = (float)$matches[1];
106     if (preg_match('/CITY:\s*([^<]*)/', $ipdata, $matches)) {
107         if (!empty($matches[1])) {
108             $info[] = s($matches[1]);
109         }
110     }
112     if (preg_match('/COUNTRY:\s*([^<]*)/', $ipdata, $matches)) {
113         if (!empty($matches[1])) {
114             $countrycode = $matches[1];
115             $countries = get_string_manager()->get_list_of_countries(true);
116             if (isset($countries[$countrycode])) {
117                 // prefer our localized country names
118                 $info[] = $countries[$countrycode];
119             } else {
120                 $info[] = $countrycode;
121             }
122         }
123     }
124     $note[] = get_string('iplookupnetgeonote', 'admin');
129 if (empty($CFG->googlemapkey)) {
130     $info = implode(' - ', $info);
131     $note = implode('<br />', $note);
133     $imgwidth  = 620;
134     $imgheight = 310;
135     $dotwidth  = 18;
136     $dotheight = 30;
138     $dx = round((($longitude + 180) * ($imgwidth / 360)) - $imgwidth - $dotwidth/2);
139     $dy = round((($latitude + 90) * ($imgheight / 180)));
141     $PAGE->set_title(get_string('iplookup', 'admin').': '.$info);
142     $PAGE->set_heading($info);
143     echo $OUTPUT->header();
145     echo '<div id="map" style="width:'.($imgwidth+$dotwidth).'px; height:'.$imgheight.'px;">';
146     echo '<img src="earth.jpeg" style="width:'.$imgwidth.'px; height:'.$imgheight.'px" alt="" />';
147     echo '<img src="marker.gif" style="width:'.$dotwidth.'px; height:'.$dotheight.'px; margin-left:'.$dx.'px; margin-bottom:'.$dy.'px;" alt="" />';
148     echo '</div>';
149     echo '<div id="note">'.$note.'</div>';
151     echo $OUTPUT->footer();
153 } else {
154     $info = implode(' - ', $info);
155     $note = implode('<br />', $note);
157     $PAGE->requires->js(new moodle_url("http://maps.google.com/maps?file=api&v=2&key=$CFG->googlemapkey"));
158     $module = array('name'=>'core_iplookup', 'fullpath'=>'/iplookup/module.js');
159     $PAGE->requires->js_init_call('M.core_iplookup.init', array($latitude, $longitude), true, $module);
161     $PAGE->set_title(get_string('iplookup', 'admin').': '.$info);
162     $PAGE->set_heading($info);
163     echo $OUTPUT->header();
165     echo '<div id="map" style="width: 650px; height: 360px"></div>';
166     echo '<div id="note">'.$note.'</div>';
168     echo $OUTPUT->footer();