mirror of https://github.com/Chocobozzz/PeerTube
Filter tracker based on infohash
parent
08c11bec43
commit
cc43831a90
|
@ -5,6 +5,7 @@ import * as bitTorrentTracker from 'bittorrent-tracker'
|
||||||
import * as proxyAddr from 'proxy-addr'
|
import * as proxyAddr from 'proxy-addr'
|
||||||
import { Server as WebSocketServer } from 'ws'
|
import { Server as WebSocketServer } from 'ws'
|
||||||
import { CONFIG, TRACKER_RATE_LIMITS } from '../initializers/constants'
|
import { CONFIG, TRACKER_RATE_LIMITS } from '../initializers/constants'
|
||||||
|
import { VideoFileModel } from '../models/video/video-file'
|
||||||
|
|
||||||
const TrackerServer = bitTorrentTracker.Server
|
const TrackerServer = bitTorrentTracker.Server
|
||||||
|
|
||||||
|
@ -37,7 +38,12 @@ const trackerServer = new TrackerServer({
|
||||||
return cb(new Error(`Too many requests (${peersIpInfoHash[ key ]} of ip ${ip} for torrent ${infoHash}`))
|
return cb(new Error(`Too many requests (${peersIpInfoHash[ key ]} of ip ${ip} for torrent ${infoHash}`))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VideoFileModel.isInfohashExists(infoHash)
|
||||||
|
.then(exists => {
|
||||||
|
if (exists === false) return cb(new Error(`Unknown infoHash ${infoHash}`))
|
||||||
|
|
||||||
return cb()
|
return cb()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ import {
|
||||||
import { CONSTRAINTS_FIELDS } from '../../initializers'
|
import { CONSTRAINTS_FIELDS } from '../../initializers'
|
||||||
import { throwIfNotValid } from '../utils'
|
import { throwIfNotValid } from '../utils'
|
||||||
import { VideoModel } from './video'
|
import { VideoModel } from './video'
|
||||||
|
import * as Sequelize from 'sequelize'
|
||||||
|
|
||||||
@Table({
|
@Table({
|
||||||
tableName: 'videoFile',
|
tableName: 'videoFile',
|
||||||
|
@ -68,4 +69,18 @@ export class VideoFileModel extends Model<VideoFileModel> {
|
||||||
onDelete: 'CASCADE'
|
onDelete: 'CASCADE'
|
||||||
})
|
})
|
||||||
Video: VideoModel
|
Video: VideoModel
|
||||||
|
|
||||||
|
static isInfohashExists (infoHash: string) {
|
||||||
|
const query = 'SELECT 1 FROM "videoFile" WHERE "infoHash" = $infoHash LIMIT 1'
|
||||||
|
const options = {
|
||||||
|
type: Sequelize.QueryTypes.SELECT,
|
||||||
|
bind: { infoHash },
|
||||||
|
raw: true
|
||||||
|
}
|
||||||
|
|
||||||
|
return VideoModel.sequelize.query(query, options)
|
||||||
|
.then(results => {
|
||||||
|
return results.length === 1
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,3 +15,4 @@ import './server/email'
|
||||||
import './server/config'
|
import './server/config'
|
||||||
import './server/reverse-proxy'
|
import './server/reverse-proxy'
|
||||||
import './search/search-videos'
|
import './search/search-videos'
|
||||||
|
import './server/tracker'
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
/* tslint:disable:no-unused-expression */
|
||||||
|
|
||||||
|
import * as magnetUtil from 'magnet-uri'
|
||||||
|
import * as chai from 'chai'
|
||||||
|
import 'mocha'
|
||||||
|
import { getVideo, killallServers, runServer, ServerInfo, uploadVideo } from '../../utils'
|
||||||
|
import { flushTests, setAccessTokensToServers } from '../../utils/index'
|
||||||
|
import { VideoDetails } from '../../../../shared/models/videos'
|
||||||
|
import * as WebTorrent from 'webtorrent'
|
||||||
|
|
||||||
|
describe('Test tracker', function () {
|
||||||
|
let server: ServerInfo
|
||||||
|
let badMagnet: string
|
||||||
|
let goodMagnet: string
|
||||||
|
|
||||||
|
before(async function () {
|
||||||
|
this.timeout(60000)
|
||||||
|
|
||||||
|
await flushTests()
|
||||||
|
server = await runServer(1)
|
||||||
|
await setAccessTokensToServers([ server ])
|
||||||
|
|
||||||
|
{
|
||||||
|
const res = await uploadVideo(server.url, server.accessToken, {})
|
||||||
|
const videoUUID = res.body.video.uuid
|
||||||
|
|
||||||
|
const resGet = await getVideo(server.url, videoUUID)
|
||||||
|
const video: VideoDetails = resGet.body
|
||||||
|
goodMagnet = video.files[0].magnetUri
|
||||||
|
|
||||||
|
const parsed = magnetUtil.decode(goodMagnet)
|
||||||
|
parsed.infoHash = '010597bb88b1968a5693a4fa8267c592ca65f2e9'
|
||||||
|
|
||||||
|
badMagnet = magnetUtil.encode(parsed)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Should return an error when adding an incorrect infohash', done => {
|
||||||
|
this.timeout(10000)
|
||||||
|
const webtorrent = new WebTorrent()
|
||||||
|
|
||||||
|
const torrent = webtorrent.add(badMagnet)
|
||||||
|
|
||||||
|
torrent.on('error', done)
|
||||||
|
torrent.on('warning', warn => {
|
||||||
|
const message = typeof warn === 'string' ? warn : warn.message
|
||||||
|
if (message.indexOf('Unknown infoHash ') !== -1) return done()
|
||||||
|
})
|
||||||
|
|
||||||
|
torrent.on('done', () => done(new Error('No error on infohash')))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Should succeed with the correct infohash', done => {
|
||||||
|
this.timeout(10000)
|
||||||
|
const webtorrent = new WebTorrent()
|
||||||
|
|
||||||
|
const torrent = webtorrent.add(goodMagnet)
|
||||||
|
|
||||||
|
torrent.on('error', done)
|
||||||
|
torrent.on('warning', warn => {
|
||||||
|
const message = typeof warn === 'string' ? warn : warn.message
|
||||||
|
if (message.indexOf('Unknown infoHash ') !== -1) return done(new Error('Error on infohash'))
|
||||||
|
})
|
||||||
|
|
||||||
|
torrent.on('done', done)
|
||||||
|
})
|
||||||
|
|
||||||
|
after(async function () {
|
||||||
|
killallServers([ server ])
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in New Issue