diff options
author | Minteck <nekostarfan@gmail.com> | 2021-08-08 18:27:46 +0200 |
---|---|---|
committer | Minteck <nekostarfan@gmail.com> | 2021-08-08 18:27:46 +0200 |
commit | a20dff82a7e2602738f847fa4f1428af3235aafc (patch) | |
tree | e607db59fd59561c055a1b68b29d1cf3c6c99d4e /admin | |
parent | c69d44149f544cc80fbe32c26dc4c34266d97bf6 (diff) | |
download | main-a20dff82a7e2602738f847fa4f1428af3235aafc.tar.gz main-a20dff82a7e2602738f847fa4f1428af3235aafc.tar.bz2 main-a20dff82a7e2602738f847fa4f1428af3235aafc.zip |
Updating... the update... that updates
Diffstat (limited to 'admin')
-rw-r--r-- | admin/.htpasswd | 1 | ||||
-rw-r--r-- | admin/api/getIpLocation.php | 38 | ||||
-rw-r--r-- | admin/index.php | 11 | ||||
-rw-r--r-- | admin/panes/audit.php | 226 | ||||
-rw-r--r-- | admin/panes/shortens.php | 41 | ||||
-rw-r--r-- | admin/private/ipcache.json | 1 |
6 files changed, 317 insertions, 1 deletions
diff --git a/admin/.htpasswd b/admin/.htpasswd deleted file mode 100644 index b678dd2..0000000 --- a/admin/.htpasswd +++ /dev/null @@ -1 +0,0 @@ -test:$apr1$aD1qs9Kn$f1A2MaHyqhBNODYMQC7l91 diff --git a/admin/api/getIpLocation.php b/admin/api/getIpLocation.php new file mode 100644 index 0000000..fe34438 --- /dev/null +++ b/admin/api/getIpLocation.php @@ -0,0 +1,38 @@ +<?php
+
+require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.api.php";
+
+if (isset($_GET['_']) && strpos($_GET['_'], "/") === false) {
+ $arg = $_GET['_'];
+} else {
+ die();
+}
+
+if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/admin/private/ipcache.json")) {
+ file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/admin/private/ipcache.json", "[]");
+}
+
+$ipCache = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/admin/private/ipcache.json"), true);
+
+$data = null;
+foreach ($ipCache as $ip => $item) {
+ if ($ip === $_GET['_']) {
+ $data = $item;
+ }
+}
+
+if ($data === null) {
+ $data = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip=' . $arg));
+ $ipCache[$_GET['_']] = $data;
+ file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/admin/private/ipcache.json", json_encode($ipCache));
+}
+
+if ($data["geoplugin_status"] === 404) {
+ die("<span class='text-muted'>Local IP address</span>");
+} else {
+ if ($data["geoplugin_inEU"]) {
+ die($data["geoplugin_countryName"] . " <span class='badge text-light border-light' style='border:1px solid;vertical-align: middle;'>EU</span>");
+ } else {
+ die($data["geoplugin_countryName"]);
+ }
+}
\ No newline at end of file diff --git a/admin/index.php b/admin/index.php index a7b4ced..0473560 100644 --- a/admin/index.php +++ b/admin/index.php @@ -155,6 +155,11 @@ <span class="item-text">Files</span>
<img alt="" src="/static/reload.png" class="reloadbtn">
</div>
+ <div class="item" id="activity-audit">
+ <img src="/static/admin/audit.svg" class="item-icon" alt="">
+ <span class="item-text">Security Audit</span>
+ <img alt="" src="/static/reload.png" class="reloadbtn">
+ </div>
<div class="item" id="activity-hardware">
<img src="/static/admin/hardware.svg" class="item-icon" alt="">
<span class="item-text">Hardware</span>
@@ -189,6 +194,10 @@ <img src="/static/admin/telemetry.svg" class="item-icon" alt="">
<span class="item-text">Telemetry</span>
<img alt="" src="/static/reload.png" class="reloadbtn">
+ </div><div class="item" id="activity-shortens">
+ <img src="/static/admin/shortens.svg" class="item-icon" alt="">
+ <span class="item-text">Shortened URLs</span>
+ <img alt="" src="/static/reload.png" class="reloadbtn">
</div>
<div class="item" id="activity-code">
<img src="/static/admin/code.svg" class="item-icon" alt="">
@@ -237,7 +246,9 @@ document.getElementById("activity-hardware").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/hardware.php", event.target); }, true)
document.getElementById("activity-disk").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/disk.php", event.target); }, true)
document.getElementById("activity-uptime").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/uptime.php", event.target); }, true)
+ document.getElementById("activity-audit").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/audit.php", event.target); }, true)
document.getElementById("activity-version").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/version.php", event.target); }, true)
+ document.getElementById("activity-shortens").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/shortens.php", event.target); }, true)
document.getElementById("activity-kartik").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/kartik.php", event.target); }, true)
document.getElementById("activity-code").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/code.php", event.target); }, true)
document.getElementById("activity-quotas").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/quotas.php", event.target); }, true)
diff --git a/admin/panes/audit.php b/admin/panes/audit.php new file mode 100644 index 0000000..c2a8609 --- /dev/null +++ b/admin/panes/audit.php @@ -0,0 +1,226 @@ +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.php";/** @var array $_DATA */ ?>
+
+<style>
+ ::-webkit-scrollbar {
+ width: 5px;
+ }
+
+ ::-webkit-scrollbar-track {
+ border-radius: 9999px;
+ background: transparent;
+ }
+
+ ::-webkit-scrollbar-thumb {
+ border-radius: 9999px;
+ background-color: rgba(136, 136, 136, 0.5);
+ transition: background 200ms;
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background-color: rgba(85, 85, 85, 0.75);
+ }
+
+ ::-webkit-scrollbar-thumb:active {
+ background-color: #222;
+ }
+
+ .list-group-item {
+ background: #34373c;
+ }
+
+ table, table * {
+ color: white !important;
+ border-color: #292b2f !important;
+ }
+
+ th {
+ border-top: 0 !important;
+ }
+
+ table a {
+ color: #007bff !important;
+ }
+
+ td.users {
+ width: 20vw;
+ }
+
+ .addr-location {
+ width: 20vw;
+ }
+</style>
+
+<div class="container" style="color:white;padding-top:15vh;padding-bottom:15vh;">
+ <h2 style="text-align:center;">Security Audit</h2>
+ <table class="table table-hover">
+ <thead>
+ <tr>
+ <th>IP address</th>
+ <th>Connections</th>
+ <th>Username(s)</th>
+ <th>Actions</th>
+ </tr>
+ </thead>
+ <tbody><?php
+
+ $ips = [];
+ $data = "";
+ $dir = scandir("/var/log");
+
+ $dir = array_reverse($dir);
+
+ foreach ($dir as $file) {
+ if ($file !== "." && $file !== "..") {
+ if (substr($file, 0, 5) === "auth.") {
+ if (substr($file, -3) === ".gz") {
+ exec("gzip --decompress /var/log/" . $file);
+ $raw = file_get_contents("/var/log/" . substr($file, 0, -3));
+ } else {
+ $raw = file_get_contents("/var/log/" . $file);
+ }
+
+ $data .= "\n" . $raw;
+ }
+ }
+ }
+
+ $lines = explode("\n", strip_tags($data));
+ $lines = array_reverse($lines);
+
+ foreach ($lines as $line) {
+ if (trim($line) !== "" && strpos($line, "sshd") !== false && strpos($line, "error: kex_exchange_identification: Connection closed by remote host") === false && (strpos($line, "]: Connection closed by invalid user ") !== false || strpos($line, "]: Unable to negotiate with ") !== false || strpos($line, "]: Accepted publickey for ") !== false)) {
+ $data = [];
+
+ $parts = explode(": ", $line);
+
+ $data["date"] = $parts[0];
+ array_shift($parts);
+ $data["message"] = implode(": ", $parts);
+
+
+ if (substr($data["message"], 0, 23) === "Accepted publickey for ") { // Successful connection
+ $data["status"] = "ok";
+ $data["ip"] = explode(" ", $data["message"])[5];
+ $data["user"] = explode(" ", $data["message"])[3];
+ }
+
+ if (substr($data["message"], 0, 25) === "Unable to negotiate with ") { // Errored connection
+ $data["status"] = "error";
+ $data["ip"] = explode(" ", $data["message"])[4];
+ $data["user"] = null;
+ }
+
+ if (substr($data["message"], 0, 34) === "Connection closed by invalid user ") { // Invalid connection
+ $data["status"] = "invalid";
+ $data["ip"] = explode(" ", $data["message"])[count(explode(" ", $data["message"])) - 4];
+ $data["user"] = explode(" ", $data["message"])[5];
+ }
+
+ if (!isset($ips[$data["ip"]])) {
+ $ips[$data["ip"]] = [];
+ }
+ if (!isset($ips[$data["ip"]]["connections"])) {
+ $ips[$data["ip"]]["connections"] = [];
+ }
+ $ips[$data["ip"]]["connections"][] = $data;
+ }
+ }
+
+ $index = 1;
+ foreach ($ips as $ip => $info) {
+ if ($ip !== "port") {
+ echo("<tr>
+ <td class='addr-location'><code>" . $ip . "</code><br><span id='iplocation-" . $ip . "'><span class='text-muted'>Please wait...</span></span>");?>
+ <!--suppress JSUnresolvedVariable -->
+ <script>
+
+ setTimeout(() => {
+ document.getElementById("iplocation-<?= $ip ?>").innerHTML = $.ajax({
+ type: "GET",
+ url: "/admin/api/getIpLocation.php?_=<?= $ip ?>",
+ async: false
+ }).responseText;
+ }, <?= $index ?> * 1000);
+
+ </script>
+ <?php
+ if ($ip === $_SERVER['REMOTE_ADDR']) {
+ echo(" <span class='badge text-primary border-primary' style='border:1px solid;vertical-align: middle;'>You</span>");
+ }
+ echo("</td>
+ <td>");
+
+ $success = 0;
+ $invalid = 0;
+ $failed = 0;
+
+ foreach ($info["connections"] as $connection) {
+ if ($connection["status"] === "invalid") {
+ $invalid++;
+ }
+ if ($connection["status"] === "error") {
+ $failed++;
+ }
+ if ($connection["status"] === "ok") {
+ $success++;
+ }
+ }
+ if (count($info["connections"]) === 0) {
+ echo("<span class='text-muted'>Never connected</span>");
+ } else {
+ echo($success . " succeeded, " . $failed . " failed, " . $invalid . " invalid");
+ }
+
+ echo("<br>Last: ");
+
+ if ($info["connections"][0]["status"] === "ok") {
+ echo("<span class='badge text-success border-success' style='border:1px solid;vertical-align: middle;'>Succeeded</span>");
+ }
+
+ if ($info["connections"][0]["status"] === "error") {
+ echo("<span class='badge text-warning border-warning' style='border:1px solid;vertical-align: middle;'>Failed</span>");
+ }
+
+ if ($info["connections"][0]["status"] === "invalid") {
+ echo("<span class='badge text-danger border-danger' style='border:1px solid;vertical-align: middle;'>Invalid</span>");
+ }
+
+ echo("</td>
+ <td class='users'><details><summary>Show full list</summary><ul class='list-group'>");
+
+ $uniqueUsers = [];
+ $connectionsWithUsers = 0;
+
+ foreach ($info["connections"] as $connection) {
+ if (!in_array($connection["user"], $uniqueUsers) && $connection["user"] !== null) {
+ if (isset($uniqueUsers[$connection["user"]])) {
+ $uniqueUsers[$connection["user"]]++;
+ $connectionsWithUsers++;
+ } else {
+ $uniqueUsers[$connection["user"]] = 1;
+ $connectionsWithUsers++;
+ }
+ }
+ }
+
+ foreach ($uniqueUsers as $user => $occurrences) {
+ echo("<li class='list-group-item'><code>" . $user . "</code> <span style='float:right;'>(" . $occurrences . "×, " . round(($occurrences/$connectionsWithUsers)*100, 2) . "%)</span></li>");
+ }
+
+ if (count($uniqueUsers) === 0) {
+ echo("<li class='list-group-item text-muted'>Username was never sent to server</li>");
+ }
+
+ echo("</ul></details></td></td>
+ <td><a href='#'>Details</a> · <a href='https://cleantalk.org/blacklists/report-ip' target='_blank'>Report</a></td>
+ </tr>");
+
+ $index++;
+ }
+ }
+
+ ?></tbody>
+ </table>
+</div>
+
+<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/footer.php"; ?>
\ No newline at end of file diff --git a/admin/panes/shortens.php b/admin/panes/shortens.php new file mode 100644 index 0000000..51afcbb --- /dev/null +++ b/admin/panes/shortens.php @@ -0,0 +1,41 @@ +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.php";/** @var array $_DATA */ ?>
+
+<style>
+ ::-webkit-scrollbar {
+ width: 5px;
+ }
+
+ ::-webkit-scrollbar-track {
+ border-radius: 9999px;
+ background: transparent;
+ }
+
+ ::-webkit-scrollbar-thumb {
+ border-radius: 9999px;
+ background-color: rgba(136, 136, 136, 0.5);
+ transition: background 200ms;
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background-color: rgba(85, 85, 85, 0.75);
+ }
+
+ ::-webkit-scrollbar-thumb:active {
+ background-color: #222;
+ }
+
+ .list-group-item {
+ background: #34373c;
+ }
+</style>
+
+<div class="container" style="color:white;padding-top:15vh;padding-bottom:15vh;">
+ <h2 style="text-align:center;">Shortened URLs</h2>
+
+ <ul class="list-group" style="margin-top:20px;">
+ <li class="list-group-item">English (primary) <span style="float:right;"><a href="/admin/panes/editor.php?file=conduct.en&name=Code%20of%20Conduct%20-%20English&context=code">Edit</a> · <a href="/code-of-conduct/?en" target="_blank">View</a></span></li>
+ <li class="list-group-item">French <span style="float:right;"><a href="/admin/panes/editor.php?file=conduct.fr&name=Code%20of%20Conduct%20-%20French&context=code">Edit</a> · <a href="/code-of-conduct/?fr" target="_blank">View</a></span></li>
+ </ul>
+</div>
+
+<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/footer.php"; ?>
\ No newline at end of file diff --git a/admin/private/ipcache.json b/admin/private/ipcache.json new file mode 100644 index 0000000..028bb8d --- /dev/null +++ b/admin/private/ipcache.json @@ -0,0 +1 @@ +{"127.0.0.1":{"geoplugin_request":"127.0.0.1","geoplugin_status":404,"geoplugin_delay":"1ms","geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http:\/\/www.maxmind.com\\'>http:\/\/www.maxmind.com<\/a>.","geoplugin_city":null,"geoplugin_region":null,"geoplugin_regionCode":null,"geoplugin_regionName":null,"geoplugin_areaCode":null,"geoplugin_dmaCode":null,"geoplugin_countryCode":null,"geoplugin_countryName":null,"geoplugin_inEU":0,"geoplugin_euVATrate":false,"geoplugin_continentCode":null,"geoplugin_continentName":null,"geoplugin_latitude":null,"geoplugin_longitude":null,"geoplugin_locationAccuracyRadius":null,"geoplugin_timezone":null,"geoplugin_currencyCode":null,"geoplugin_currencySymbol":null,"geoplugin_currencySymbol_UTF8":"","geoplugin_currencyConverter":"0"},"92.152.77.195":{"geoplugin_request":"92.152.77.195","geoplugin_status":200,"geoplugin_delay":"1ms","geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http:\/\/www.maxmind.com\\'>http:\/\/www.maxmind.com<\/a>.","geoplugin_city":"Orl\u00e9ans","geoplugin_region":"Centre-Val de Loire","geoplugin_regionCode":"45","geoplugin_regionName":"Loiret","geoplugin_areaCode":"","geoplugin_dmaCode":"","geoplugin_countryCode":"FR","geoplugin_countryName":"France","geoplugin_inEU":1,"geoplugin_euVATrate":20,"geoplugin_continentCode":"EU","geoplugin_continentName":"Europe","geoplugin_latitude":"47.9047","geoplugin_longitude":"1.9076","geoplugin_locationAccuracyRadius":"5","geoplugin_timezone":"Europe\/Paris","geoplugin_currencyCode":"EUR","geoplugin_currencySymbol":"€","geoplugin_currencySymbol_UTF8":"\u20ac","geoplugin_currencyConverter":"0.8501"},"190.2.132.224":{"geoplugin_request":"190.2.132.224","geoplugin_status":200,"geoplugin_delay":"1ms","geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http:\/\/www.maxmind.com\\'>http:\/\/www.maxmind.com<\/a>.","geoplugin_city":"Naaldwijk","geoplugin_region":"South Holland","geoplugin_regionCode":"ZH","geoplugin_regionName":"South Holland","geoplugin_areaCode":"","geoplugin_dmaCode":"","geoplugin_countryCode":"NL","geoplugin_countryName":"Netherlands","geoplugin_inEU":1,"geoplugin_euVATrate":21,"geoplugin_continentCode":"EU","geoplugin_continentName":"Europe","geoplugin_latitude":"51.9934","geoplugin_longitude":"4.2158","geoplugin_locationAccuracyRadius":"1000","geoplugin_timezone":"Europe\/Amsterdam","geoplugin_currencyCode":"EUR","geoplugin_currencySymbol":"€","geoplugin_currencySymbol_UTF8":"\u20ac","geoplugin_currencyConverter":"0.8501"},"86.196.89.109":{"geoplugin_request":"86.196.89.109","geoplugin_status":200,"geoplugin_delay":"2ms","geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http:\/\/www.maxmind.com\\'>http:\/\/www.maxmind.com<\/a>.","geoplugin_city":"Orl\u00e9ans","geoplugin_region":"Centre-Val de Loire","geoplugin_regionCode":"45","geoplugin_regionName":"Loiret","geoplugin_areaCode":"","geoplugin_dmaCode":"","geoplugin_countryCode":"FR","geoplugin_countryName":"France","geoplugin_inEU":1,"geoplugin_euVATrate":20,"geoplugin_continentCode":"EU","geoplugin_continentName":"Europe","geoplugin_latitude":"47.9047","geoplugin_longitude":"1.9076","geoplugin_locationAccuracyRadius":"10","geoplugin_timezone":"Europe\/Paris","geoplugin_currencyCode":"EUR","geoplugin_currencySymbol":"€","geoplugin_currencySymbol_UTF8":"\u20ac","geoplugin_currencyConverter":"0.8501"},"141.98.10.27":{"geoplugin_request":"141.98.10.27","geoplugin_status":206,"geoplugin_delay":"0ms","geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http:\/\/www.maxmind.com\\'>http:\/\/www.maxmind.com<\/a>.","geoplugin_city":"","geoplugin_region":"","geoplugin_regionCode":"","geoplugin_regionName":"","geoplugin_areaCode":"","geoplugin_dmaCode":"","geoplugin_countryCode":"LT","geoplugin_countryName":"Lithuania","geoplugin_inEU":1,"geoplugin_euVATrate":21,"geoplugin_continentCode":"EU","geoplugin_continentName":"Europe","geoplugin_latitude":"56","geoplugin_longitude":"24","geoplugin_locationAccuracyRadius":"200","geoplugin_timezone":"Europe\/Vilnius","geoplugin_currencyCode":"EUR","geoplugin_currencySymbol":"€","geoplugin_currencySymbol_UTF8":"\u20ac","geoplugin_currencyConverter":"0.8501"},"82.65.121.132":{"geoplugin_request":"82.65.121.132","geoplugin_status":200,"geoplugin_delay":"2ms","geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http:\/\/www.maxmind.com\\'>http:\/\/www.maxmind.com<\/a>.","geoplugin_city":"Paris","geoplugin_region":"\u00cele-de-France","geoplugin_regionCode":"75","geoplugin_regionName":"Paris","geoplugin_areaCode":"","geoplugin_dmaCode":"","geoplugin_countryCode":"FR","geoplugin_countryName":"France","geoplugin_inEU":1,"geoplugin_euVATrate":20,"geoplugin_continentCode":"EU","geoplugin_continentName":"Europe","geoplugin_latitude":"48.8579","geoplugin_longitude":"2.3491","geoplugin_locationAccuracyRadius":"200","geoplugin_timezone":"Europe\/Paris","geoplugin_currencyCode":"EUR","geoplugin_currencySymbol":"€","geoplugin_currencySymbol_UTF8":"\u20ac","geoplugin_currencyConverter":"0.8501"},"209.141.47.35":{"geoplugin_request":"209.141.47.35","geoplugin_status":200,"geoplugin_delay":"1ms","geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http:\/\/www.maxmind.com\\'>http:\/\/www.maxmind.com<\/a>.","geoplugin_city":"Las Vegas","geoplugin_region":"Nevada","geoplugin_regionCode":"NV","geoplugin_regionName":"Nevada","geoplugin_areaCode":"","geoplugin_dmaCode":"839","geoplugin_countryCode":"US","geoplugin_countryName":"United States","geoplugin_inEU":0,"geoplugin_euVATrate":false,"geoplugin_continentCode":"NA","geoplugin_continentName":"North America","geoplugin_latitude":"36.1685","geoplugin_longitude":"-115.1164","geoplugin_locationAccuracyRadius":"1000","geoplugin_timezone":"America\/Los_Angeles","geoplugin_currencyCode":"USD","geoplugin_currencySymbol":"$","geoplugin_currencySymbol_UTF8":"$","geoplugin_currencyConverter":"1"},"125.160.65.57":{"geoplugin_request":"125.160.65.57","geoplugin_status":200,"geoplugin_delay":"2ms","geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http:\/\/www.maxmind.com\\'>http:\/\/www.maxmind.com<\/a>.","geoplugin_city":"Balikpapan","geoplugin_region":"East Kalimantan","geoplugin_regionCode":"KI","geoplugin_regionName":"East Kalimantan","geoplugin_areaCode":"","geoplugin_dmaCode":"","geoplugin_countryCode":"ID","geoplugin_countryName":"Indonesia","geoplugin_inEU":0,"geoplugin_euVATrate":false,"geoplugin_continentCode":"AS","geoplugin_continentName":"Asia","geoplugin_latitude":"-1.2551","geoplugin_longitude":"116.8428","geoplugin_locationAccuracyRadius":"100","geoplugin_timezone":"Asia\/Makassar","geoplugin_currencyCode":"IDR","geoplugin_currencySymbol":"Rp","geoplugin_currencySymbol_UTF8":"Rp","geoplugin_currencyConverter":"14444.5"},"37.239.53.5":{"geoplugin_request":"37.239.53.5","geoplugin_status":206,"geoplugin_delay":"1ms","geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http:\/\/www.maxmind.com\\'>http:\/\/www.maxmind.com<\/a>.","geoplugin_city":"","geoplugin_region":"","geoplugin_regionCode":"","geoplugin_regionName":"","geoplugin_areaCode":"","geoplugin_dmaCode":"","geoplugin_countryCode":"IQ","geoplugin_countryName":"Iraq","geoplugin_inEU":0,"geoplugin_euVATrate":false,"geoplugin_continentCode":"AS","geoplugin_continentName":"Asia","geoplugin_latitude":"33","geoplugin_longitude":"44","geoplugin_locationAccuracyRadius":"50","geoplugin_timezone":"Asia\/Baghdad","geoplugin_currencyCode":"IQD","geoplugin_currencySymbol":"ID","geoplugin_currencySymbol_UTF8":"ID","geoplugin_currencyConverter":"1464.2007"},"188.157.253.48":{"geoplugin_request":"188.157.253.48","geoplugin_status":200,"geoplugin_delay":"2ms","geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http:\/\/www.maxmind.com\\'>http:\/\/www.maxmind.com<\/a>.","geoplugin_city":"Szigetszentmiklos","geoplugin_region":"Pest megye","geoplugin_regionCode":"PE","geoplugin_regionName":"Pest megye","geoplugin_areaCode":"","geoplugin_dmaCode":"","geoplugin_countryCode":"HU","geoplugin_countryName":"Hungary","geoplugin_inEU":1,"geoplugin_euVATrate":27,"geoplugin_continentCode":"EU","geoplugin_continentName":"Europe","geoplugin_latitude":"47.3485","geoplugin_longitude":"19.0476","geoplugin_locationAccuracyRadius":"5","geoplugin_timezone":"Europe\/Budapest","geoplugin_currencyCode":"HUF","geoplugin_currencySymbol":"Ft","geoplugin_currencySymbol_UTF8":"Ft","geoplugin_currencyConverter":"300.8604"}}
\ No newline at end of file |