From 0fc7659b1bb07e526c2336dd8703e39ab2ef1612 Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Wed, 16 Mar 2022 15:18:16 +0200 Subject: [PATCH] Initial commit --- announce.php | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++ tracker.sql | 50 ++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 announce.php create mode 100644 tracker.sql diff --git a/announce.php b/announce.php new file mode 100644 index 0000000..eb32ec4 --- /dev/null +++ b/announce.php @@ -0,0 +1,141 @@ + $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)); + +?> \ No newline at end of file diff --git a/tracker.sql b/tracker.sql new file mode 100644 index 0000000..e66331f --- /dev/null +++ b/tracker.sql @@ -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 */;