X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Ftracker.ts;h=19a8b2bc937529d999006b7a7a72c8ea7b96ec79;hb=64fd6158fd276f258bcfc4bb0c8fc2f64a220a11;hp=e9c8a13da22dc1848b3b34b5a4d854bd961bbf05;hpb=7cd1b12c19d0589d1d692ed0571ca0800f028aea;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/tracker.ts b/server/controllers/tracker.ts index e9c8a13da..19a8b2bc9 100644 --- a/server/controllers/tracker.ts +++ b/server/controllers/tracker.ts @@ -1,15 +1,14 @@ +import { Server as TrackerServer } from 'bittorrent-tracker' +import express from 'express' +import { createServer } from 'http' +import proxyAddr from 'proxy-addr' +import { WebSocketServer } from 'ws' +import { Redis } from '@server/lib/redis' import { logger } from '../helpers/logger' -import * as express from 'express' -import * as http from 'http' -import * as bitTorrentTracker from 'bittorrent-tracker' -import * as proxyAddr from 'proxy-addr' -import { Server as WebSocketServer } from 'ws' +import { CONFIG } from '../initializers/config' import { TRACKER_RATE_LIMITS } from '../initializers/constants' import { VideoFileModel } from '../models/video/video-file' import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist' -import { CONFIG } from '../initializers/config' - -const TrackerServer = bitTorrentTracker.Server const trackerRouter = express.Router() @@ -21,7 +20,6 @@ const trackerServer = new TrackerServer({ http: false, udp: false, ws: false, - dht: false, filter: async function (infoHash, params, cb) { if (CONFIG.TRACKER.ENABLED === false) { return cb(new Error('Tracker is disabled on this instance.')) @@ -30,7 +28,7 @@ const trackerServer = new TrackerServer({ let ip: string if (params.type === 'ws') { - ip = params.socket.ip + ip = params.ip } else { ip = params.httpReq.ip } @@ -50,10 +48,19 @@ const trackerServer = new TrackerServer({ const videoFileExists = await VideoFileModel.doesInfohashExistCached(infoHash) if (videoFileExists === true) return cb() - const playlistExists = await VideoStreamingPlaylistModel.doesInfohashExist(infoHash) + const playlistExists = await VideoStreamingPlaylistModel.doesInfohashExistCached(infoHash) if (playlistExists === true) return cb() - return cb(new Error(`Unknown infoHash ${infoHash}`)) + cb(new Error(`Unknown infoHash ${infoHash} requested by ip ${ip}`)) + + // Close socket connection and block IP for a few time + if (params.type === 'ws') { + Redis.Instance.setTrackerBlockIP(ip) + .catch(err => logger.error('Cannot set tracker block ip.', { err })) + + // setTimeout to wait filter response + setTimeout(() => params.socket.close(), 0) + } } catch (err) { logger.error('Error in tracker filter.', { err }) return cb(err) @@ -62,12 +69,17 @@ const trackerServer = new TrackerServer({ }) if (CONFIG.TRACKER.ENABLED !== false) { - trackerServer.on('error', function (err) { logger.error('Error in tracker.', { err }) }) trackerServer.on('warning', function (err) { + const message = err.message || '' + + if (CONFIG.LOG.LOG_TRACKER_UNKNOWN_INFOHASH === false && message.includes('Unknown infoHash')) { + return + } + logger.warn('Warning in tracker.', { err }) }) } @@ -77,7 +89,7 @@ trackerRouter.get('/tracker/announce', (req, res) => onHttpRequest(req, res, { a trackerRouter.get('/tracker/scrape', (req, res) => onHttpRequest(req, res, { action: 'scrape' })) function createWebsocketTrackerServer (app: express.Application) { - const server = http.createServer(app) + const server = createServer(app) const wss = new WebSocketServer({ noServer: true }) wss.on('connection', function (ws, req) { @@ -87,8 +99,23 @@ function createWebsocketTrackerServer (app: express.Application) { }) server.on('upgrade', (request: express.Request, socket, head) => { - if (request.path === '/tracker/socket') { - wss.handleUpgrade(request, socket, head, ws => wss.emit('connection', ws, request)) + if (request.url === '/tracker/socket') { + const ip = proxyAddr(request, CONFIG.TRUST_PROXY) + + Redis.Instance.doesTrackerBlockIPExist(ip) + .then(result => { + if (result === true) { + logger.debug('Blocking IP %s from tracker.', ip) + + socket.write('HTTP/1.1 403 Forbidden\r\n\r\n') + socket.destroy() + return + } + + // FIXME: typings + return wss.handleUpgrade(request, socket as any, head, ws => wss.emit('connection', ws, request)) + }) + .catch(err => logger.error('Cannot check if tracker block ip exists.', { err })) } // Don't destroy socket, we have Socket.IO too