Initial commit

This commit is contained in:
mykola2312 2022-03-16 15:18:16 +02:00
commit 0fc7659b1b
2 changed files with 191 additions and 0 deletions

141
announce.php Normal file
View 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
View 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 */;