Initial commit
This commit is contained in:
commit
0fc7659b1b
2 changed files with 191 additions and 0 deletions
141
announce.php
Normal file
141
announce.php
Normal file
|
|
@ -0,0 +1,141 @@
|
||||||
|
<?php
|
||||||
|
require("../php/config.php");
|
||||||
|
$DB_NAME = "torrent";
|
||||||
|
$ANN_MIN_INTERVAL = 15;
|
||||||
|
$ANN_INTERVAL = 60;
|
||||||
|
|
||||||
|
function bad_request($msg)
|
||||||
|
{
|
||||||
|
http_response_code(400);
|
||||||
|
echo($msg);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
function do_error($msg)
|
||||||
|
{
|
||||||
|
die($msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hash_decode($urldata)
|
||||||
|
{
|
||||||
|
return bin2hex(rawurldecode($urldata));
|
||||||
|
}
|
||||||
|
|
||||||
|
function hash_encode($str)
|
||||||
|
{
|
||||||
|
return hex2bin($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
function bencode ($var)
|
||||||
|
{
|
||||||
|
if (is_string($var)) {
|
||||||
|
return strlen($var) .':'. $var;
|
||||||
|
} else if (is_int($var)) {
|
||||||
|
return 'i'. $var .'e';
|
||||||
|
} else if (is_float($var)) {
|
||||||
|
return 'i'. sprintf('%.0f', $var) .'e';
|
||||||
|
} else if (is_array($var)) {
|
||||||
|
if (count($var) == 0) {
|
||||||
|
return 'de';
|
||||||
|
} else {
|
||||||
|
$assoc = false;
|
||||||
|
|
||||||
|
foreach ($var as $key => $val) {
|
||||||
|
if (!is_int($key)) {
|
||||||
|
$assoc = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($assoc) {
|
||||||
|
ksort($var, SORT_REGULAR);
|
||||||
|
$ret = 'd';
|
||||||
|
|
||||||
|
foreach ($var as $key => $val) {
|
||||||
|
$ret .= bencode($key) . bencode($val);
|
||||||
|
}
|
||||||
|
return $ret .'e';
|
||||||
|
} else {
|
||||||
|
$ret = 'l';
|
||||||
|
|
||||||
|
foreach ($var as $val) {
|
||||||
|
$ret .= bencode($val);
|
||||||
|
}
|
||||||
|
return $ret .'e';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_error('bencode wrong data type');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!isset($_GET["info_hash"])) {
|
||||||
|
bad_request("No info_hash");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$hash = hash_decode($_GET["info_hash"]);
|
||||||
|
$hashLen = strlen($hash);
|
||||||
|
if ($hashLen < 40 || $hashLen > 40) {
|
||||||
|
bad_request("Invalid info_hash");
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
bad_request("Invalid info_hash");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (isset($_GET["ip"])) {
|
||||||
|
$ip = urldecode($_GET["ip"]);
|
||||||
|
} else if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
|
||||||
|
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
|
||||||
|
} else {
|
||||||
|
$ip = $_SERVER["REMOTE_ADDR"];
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
bad_request("Invalid ip");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$ipAddr = inet_pton($ip)) {
|
||||||
|
bad_request("Invalid ip");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET["port"])) {
|
||||||
|
$port = intval(urldecode($_GET["port"]));
|
||||||
|
} else {
|
||||||
|
bad_request("No port");
|
||||||
|
}
|
||||||
|
|
||||||
|
$date = new DateTime("now");
|
||||||
|
$now = $date->format('Y-m-d H:i:s');
|
||||||
|
|
||||||
|
$conn = new PDO("mysql:host=$DB_HOST;dbname=$DB_NAME", $DB_USER, $DB_PASS);
|
||||||
|
$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(":port", $port, PDO::PARAM_INT);
|
||||||
|
$stmt->bindValue(":update_time", $now, PDO::PARAM_STR);
|
||||||
|
$stmt->execute();
|
||||||
|
|
||||||
|
$peers = '';
|
||||||
|
|
||||||
|
$stmt = $conn->prepare("SELECT ip, port FROM `tracker` WHERE info_hash = :info_hash");
|
||||||
|
$stmt->bindValue(":info_hash", $hash, PDO::PARAM_STR);
|
||||||
|
$stmt->execute();
|
||||||
|
$stmt->bindColumn(1, $peerIp);
|
||||||
|
$stmt->bindColumn(2, $peerPort);
|
||||||
|
while ($stmt->fetch(PDO::FETCH_BOUND)) {
|
||||||
|
//echo($peerIp . "\t" . $peerPort . "\n");
|
||||||
|
$peers .= pack("Nn", inet_pton($peerIp), $peerPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
$response = array(
|
||||||
|
"min interval" => $ANN_MIN_INTERVAL,
|
||||||
|
"interval" => $ANN_INTERVAL,
|
||||||
|
"peers" => $peers,
|
||||||
|
);
|
||||||
|
echo(bencode($response));
|
||||||
|
|
||||||
|
?>
|
||||||
50
tracker.sql
Normal file
50
tracker.sql
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
-- phpMyAdmin SQL Dump
|
||||||
|
-- version 5.1.3
|
||||||
|
-- https://www.phpmyadmin.net/
|
||||||
|
--
|
||||||
|
-- Host: localhost
|
||||||
|
-- Generation Time: Mar 16, 2022 at 01:15 PM
|
||||||
|
-- Server version: 10.7.3-MariaDB
|
||||||
|
-- PHP Version: 7.4.28
|
||||||
|
|
||||||
|
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||||
|
START TRANSACTION;
|
||||||
|
SET time_zone = "+00:00";
|
||||||
|
|
||||||
|
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||||
|
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||||
|
/*!40101 SET NAMES utf8mb4 */;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Database: `torrent`
|
||||||
|
--
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tracker`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tracker` (
|
||||||
|
`info_hash` char(40) COLLATE utf8mb4_unicode_ci NOT NULL,
|
||||||
|
`ip` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL,
|
||||||
|
`port` smallint(5) NOT NULL,
|
||||||
|
`update_time` timestamp NOT NULL DEFAULT current_timestamp()
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Indexes for dumped tables
|
||||||
|
--
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Indexes for table `tracker`
|
||||||
|
--
|
||||||
|
ALTER TABLE `tracker`
|
||||||
|
ADD PRIMARY KEY (`info_hash`,`ip`,`port`);
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||||
|
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||||
|
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||||
Loading…
Add table
Reference in a new issue