X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Ftracker.ts;h=c4f3a8889f75586049a2868298ac5c02f2396802;hb=e364e31e25bd1d4b8d801c845a96d6be708f0a18;hp=23bcb971ed3849658e01b84c67ee3fd286c70453;hpb=17d85f48b51ef7dad747f7471c8237320e40e2a4;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/tracker.ts b/server/controllers/tracker.ts index 23bcb971e..c4f3a8889 100644 --- a/server/controllers/tracker.ts +++ b/server/controllers/tracker.ts @@ -1,17 +1,22 @@ import { Server as TrackerServer } from 'bittorrent-tracker' import express from 'express' import { createServer } from 'http' +import LRUCache from 'lru-cache' import proxyAddr from 'proxy-addr' import { WebSocketServer } from 'ws' -import { Redis } from '@server/lib/redis' import { logger } from '../helpers/logger' import { CONFIG } from '../initializers/config' -import { TRACKER_RATE_LIMITS } from '../initializers/constants' +import { LRU_CACHE, TRACKER_RATE_LIMITS } from '../initializers/constants' import { VideoFileModel } from '../models/video/video-file' import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist' const trackerRouter = express.Router() +const blockedIPs = new LRUCache({ + max: LRU_CACHE.TRACKER_IPS.MAX_SIZE, + ttl: TRACKER_RATE_LIMITS.BLOCK_IP_LIFETIME +}) + let peersIps = {} let peersIpInfoHash = {} runPeersChecker() @@ -55,8 +60,7 @@ const trackerServer = new TrackerServer({ // 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 })) + blockedIPs.set(ip, true) // setTimeout to wait filter response setTimeout(() => params.socket.close(), 0) @@ -74,9 +78,10 @@ if (CONFIG.TRACKER.ENABLED !== false) { }) trackerServer.on('warning', function (err) { - if (CONFIG.LOG.LOG_TRACKER_UNKNOWN_INFOHASH) { - const message = err.message || '' - if (message.includes('Unknown infoHash')) return + const message = err.message || '' + + if (CONFIG.LOG.LOG_TRACKER_UNKNOWN_INFOHASH === false && message.includes('Unknown infoHash')) { + return } logger.warn('Warning in tracker.', { err }) @@ -101,26 +106,22 @@ function createWebsocketTrackerServer (app: express.Application) { 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) + if (blockedIPs.has(ip)) { + logger.debug('Blocking IP %s from tracker.', ip) - socket.write('HTTP/1.1 403 Forbidden\r\n\r\n') - socket.destroy() - return - } + 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 })) + // FIXME: typings + return wss.handleUpgrade(request, socket as any, head, ws => wss.emit('connection', ws, request)) } // Don't destroy socket, we have Socket.IO too }) - return server + return { server, trackerServer } } // ---------------------------------------------------------------------------