diff options
-rw-r--r-- | server/controllers/tracker.ts | 8 | ||||
-rw-r--r-- | server/models/video/video-file.ts | 15 | ||||
-rw-r--r-- | server/tests/api/index-fast.ts | 1 | ||||
-rw-r--r-- | server/tests/api/server/tracker.ts | 71 |
4 files changed, 94 insertions, 1 deletions
diff --git a/server/controllers/tracker.ts b/server/controllers/tracker.ts index 42f5aea81..9bc7586d1 100644 --- a/server/controllers/tracker.ts +++ b/server/controllers/tracker.ts | |||
@@ -5,6 +5,7 @@ import * as bitTorrentTracker from 'bittorrent-tracker' | |||
5 | import * as proxyAddr from 'proxy-addr' | 5 | import * as proxyAddr from 'proxy-addr' |
6 | import { Server as WebSocketServer } from 'ws' | 6 | import { Server as WebSocketServer } from 'ws' |
7 | import { CONFIG, TRACKER_RATE_LIMITS } from '../initializers/constants' | 7 | import { CONFIG, TRACKER_RATE_LIMITS } from '../initializers/constants' |
8 | import { VideoFileModel } from '../models/video/video-file' | ||
8 | 9 | ||
9 | const TrackerServer = bitTorrentTracker.Server | 10 | const TrackerServer = bitTorrentTracker.Server |
10 | 11 | ||
@@ -37,7 +38,12 @@ const trackerServer = new TrackerServer({ | |||
37 | return cb(new Error(`Too many requests (${peersIpInfoHash[ key ]} of ip ${ip} for torrent ${infoHash}`)) | 38 | return cb(new Error(`Too many requests (${peersIpInfoHash[ key ]} of ip ${ip} for torrent ${infoHash}`)) |
38 | } | 39 | } |
39 | 40 | ||
40 | return cb() | 41 | VideoFileModel.isInfohashExists(infoHash) |
42 | .then(exists => { | ||
43 | if (exists === false) return cb(new Error(`Unknown infoHash ${infoHash}`)) | ||
44 | |||
45 | return cb() | ||
46 | }) | ||
41 | } | 47 | } |
42 | }) | 48 | }) |
43 | 49 | ||
diff --git a/server/models/video/video-file.ts b/server/models/video/video-file.ts index f5a2b6c1f..3bc4855f3 100644 --- a/server/models/video/video-file.ts +++ b/server/models/video/video-file.ts | |||
@@ -9,6 +9,7 @@ import { | |||
9 | import { CONSTRAINTS_FIELDS } from '../../initializers' | 9 | import { CONSTRAINTS_FIELDS } from '../../initializers' |
10 | import { throwIfNotValid } from '../utils' | 10 | import { throwIfNotValid } from '../utils' |
11 | import { VideoModel } from './video' | 11 | import { VideoModel } from './video' |
12 | import * as Sequelize from 'sequelize' | ||
12 | 13 | ||
13 | @Table({ | 14 | @Table({ |
14 | tableName: 'videoFile', | 15 | tableName: 'videoFile', |
@@ -68,4 +69,18 @@ export class VideoFileModel extends Model<VideoFileModel> { | |||
68 | onDelete: 'CASCADE' | 69 | onDelete: 'CASCADE' |
69 | }) | 70 | }) |
70 | Video: VideoModel | 71 | Video: VideoModel |
72 | |||
73 | static isInfohashExists (infoHash: string) { | ||
74 | const query = 'SELECT 1 FROM "videoFile" WHERE "infoHash" = $infoHash LIMIT 1' | ||
75 | const options = { | ||
76 | type: Sequelize.QueryTypes.SELECT, | ||
77 | bind: { infoHash }, | ||
78 | raw: true | ||
79 | } | ||
80 | |||
81 | return VideoModel.sequelize.query(query, options) | ||
82 | .then(results => { | ||
83 | return results.length === 1 | ||
84 | }) | ||
85 | } | ||
71 | } | 86 | } |
diff --git a/server/tests/api/index-fast.ts b/server/tests/api/index-fast.ts index 531a09b82..02ffdd4f1 100644 --- a/server/tests/api/index-fast.ts +++ b/server/tests/api/index-fast.ts | |||
@@ -15,3 +15,4 @@ import './server/email' | |||
15 | import './server/config' | 15 | import './server/config' |
16 | import './server/reverse-proxy' | 16 | import './server/reverse-proxy' |
17 | import './search/search-videos' | 17 | import './search/search-videos' |
18 | import './server/tracker' | ||
diff --git a/server/tests/api/server/tracker.ts b/server/tests/api/server/tracker.ts new file mode 100644 index 000000000..5d61c1558 --- /dev/null +++ b/server/tests/api/server/tracker.ts | |||
@@ -0,0 +1,71 @@ | |||
1 | /* tslint:disable:no-unused-expression */ | ||
2 | |||
3 | import * as magnetUtil from 'magnet-uri' | ||
4 | import * as chai from 'chai' | ||
5 | import 'mocha' | ||
6 | import { getVideo, killallServers, runServer, ServerInfo, uploadVideo } from '../../utils' | ||
7 | import { flushTests, setAccessTokensToServers } from '../../utils/index' | ||
8 | import { VideoDetails } from '../../../../shared/models/videos' | ||
9 | import * as WebTorrent from 'webtorrent' | ||
10 | |||
11 | describe('Test tracker', function () { | ||
12 | let server: ServerInfo | ||
13 | let badMagnet: string | ||
14 | let goodMagnet: string | ||
15 | |||
16 | before(async function () { | ||
17 | this.timeout(60000) | ||
18 | |||
19 | await flushTests() | ||
20 | server = await runServer(1) | ||
21 | await setAccessTokensToServers([ server ]) | ||
22 | |||
23 | { | ||
24 | const res = await uploadVideo(server.url, server.accessToken, {}) | ||
25 | const videoUUID = res.body.video.uuid | ||
26 | |||
27 | const resGet = await getVideo(server.url, videoUUID) | ||
28 | const video: VideoDetails = resGet.body | ||
29 | goodMagnet = video.files[0].magnetUri | ||
30 | |||
31 | const parsed = magnetUtil.decode(goodMagnet) | ||
32 | parsed.infoHash = '010597bb88b1968a5693a4fa8267c592ca65f2e9' | ||
33 | |||
34 | badMagnet = magnetUtil.encode(parsed) | ||
35 | } | ||
36 | }) | ||
37 | |||
38 | it('Should return an error when adding an incorrect infohash', done => { | ||
39 | this.timeout(10000) | ||
40 | const webtorrent = new WebTorrent() | ||
41 | |||
42 | const torrent = webtorrent.add(badMagnet) | ||
43 | |||
44 | torrent.on('error', done) | ||
45 | torrent.on('warning', warn => { | ||
46 | const message = typeof warn === 'string' ? warn : warn.message | ||
47 | if (message.indexOf('Unknown infoHash ') !== -1) return done() | ||
48 | }) | ||
49 | |||
50 | torrent.on('done', () => done(new Error('No error on infohash'))) | ||
51 | }) | ||
52 | |||
53 | it('Should succeed with the correct infohash', done => { | ||
54 | this.timeout(10000) | ||
55 | const webtorrent = new WebTorrent() | ||
56 | |||
57 | const torrent = webtorrent.add(goodMagnet) | ||
58 | |||
59 | torrent.on('error', done) | ||
60 | torrent.on('warning', warn => { | ||
61 | const message = typeof warn === 'string' ? warn : warn.message | ||
62 | if (message.indexOf('Unknown infoHash ') !== -1) return done(new Error('Error on infohash')) | ||
63 | }) | ||
64 | |||
65 | torrent.on('done', done) | ||
66 | }) | ||
67 | |||
68 | after(async function () { | ||
69 | killallServers([ server ]) | ||
70 | }) | ||
71 | }) | ||