Add loopback <-> external IP translation
This commit is contained in:
parent
7882278947
commit
ea352a640a
2 changed files with 56 additions and 1 deletions
10
announce.php
10
announce.php
|
|
@ -1,5 +1,6 @@
|
|||
<?php
|
||||
require("../php/config.php");
|
||||
require("network.php");
|
||||
$DB_NAME = "torrent";
|
||||
$ANN_MIN_INTERVAL = 15;
|
||||
$ANN_INTERVAL = 60;
|
||||
|
|
@ -106,6 +107,8 @@ if (isset($_GET["port"])) {
|
|||
bad_request("No port");
|
||||
}
|
||||
|
||||
$externalIp = get_external_ip();
|
||||
|
||||
$date = new DateTime("now");
|
||||
$now = $date->format('Y-m-d H:i:s');
|
||||
|
||||
|
|
@ -114,7 +117,7 @@ $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|||
|
||||
$stmt = $conn->prepare("REPLACE INTO `tracker` (info_hash, ip, port, update_time) VALUES (:info_hash, :ip, :port, :update_time)");
|
||||
$stmt->bindValue(":info_hash", $hash, PDO::PARAM_STR);
|
||||
$stmt->bindValue(":ip", $ip, PDO::PARAM_STR);
|
||||
$stmt->bindValue(":ip", is_loopback($ip) ? $externalIp : $ip, PDO::PARAM_STR);
|
||||
$stmt->bindValue(":port", $port, PDO::PARAM_INT);
|
||||
$stmt->bindValue(":update_time", $now, PDO::PARAM_STR);
|
||||
$stmt->execute();
|
||||
|
|
@ -127,6 +130,11 @@ $stmt->execute();
|
|||
$stmt->bindColumn(1, $peerIp);
|
||||
$stmt->bindColumn(2, $peerPort);
|
||||
while ($stmt->fetch(PDO::FETCH_BOUND)) {
|
||||
if (is_loopback($peerIp) && !is_loopback($ip)) {
|
||||
$peerIp = $externalIp;
|
||||
} else if ($peerIp == $externalIp && is_loopback($ip)) {
|
||||
$peerIp = ip4_loopback();
|
||||
}
|
||||
$peers .= pack("Nn", inet_pton($peerIp), $peerPort);
|
||||
}
|
||||
|
||||
|
|
|
|||
47
network.php
Normal file
47
network.php
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
function ip4_loopback()
|
||||
{
|
||||
return inet_pton("127.0.0.1");
|
||||
}
|
||||
|
||||
function ip6_loopback()
|
||||
{
|
||||
return inet_pton("::1");
|
||||
}
|
||||
|
||||
function ip_address($ip)
|
||||
{
|
||||
$ipAddr = inet_pton($ip);
|
||||
if ($ipAddr == false) {
|
||||
throw new Exception("invalid ip address");
|
||||
}
|
||||
|
||||
return $ipAddr;
|
||||
}
|
||||
|
||||
function is_loopback($ip)
|
||||
{
|
||||
$ipAddr = ip_address($ip);
|
||||
return $ipAddr == ip4_loopback() || $ipAddr == ip6_loopback();
|
||||
}
|
||||
|
||||
function get_external_ip()
|
||||
{
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, "http://ident.me");
|
||||
curl_setopt($ch, CURLOPT_PORT, 80);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
$result = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
|
||||
if (result == false) {
|
||||
throw new Exception("request to ident.me failed");
|
||||
} else if (inet_pton($result) == false) {
|
||||
throw new Exception("ident.me respond invalid ip");
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
?>
|
||||
Loading…
Add table
Reference in a new issue