1
1
const express = require ( 'express' ) ;
2
2
const multer = require ( 'multer' ) ;
3
+ const bencode = require ( 'bencode' ) ;
3
4
const cyrpto = require ( 'crypto' ) ;
4
5
const db = require ( './../db.js' ) ;
5
6
const _ = require ( 'lodash' ) ;
@@ -15,6 +16,87 @@ const storage = multer.diskStorage({
15
16
}
16
17
} ) ;
17
18
18
- const hashTorrent = ( torrentBuffer ) => {
19
+ const fileFilter = ( req , file , cb ) => {
20
+ file . hash = hashTorrent ( stripTrackers ( file . buffer ) ) ;
21
+ cb ( null , true ) ;
22
+ } ;
19
23
20
- } ;
24
+ const upload = multer ( { storage, fileFilter } ) ;
25
+
26
+ const stripTrackers = torrentBuffer => {
27
+ const torrent = bencode . decode ( torrentBuffer ) ;
28
+ delete torrent . announce ;
29
+ return bencode . encode ( torrent ) ;
30
+ } ;
31
+
32
+ const hashTorrent = torrentBuffer => {
33
+ const hash = crypto . createHash ( 'sha256' ) ;
34
+ const code = process . env . COOKIE_SECRET + torrentBuffer . toString ( ) + Math . floor ( ( new Date ) . getTime ( ) / 1000 ) . toString ( ) ;
35
+ hash . update ( code ) ;
36
+ return hash . digest ( 'hex' ) ;
37
+ } ;
38
+
39
+ const verifyAlbum = group => {
40
+ const requiredFields = [ 'artist' , 'album' , 'year' , 'release_type' , 'format' , 'bitrate' , 'media' ] ;
41
+ const allowedFields = [ 'artist' , 'album' , 'year' , 'release_type' , 'format' , 'bitrate' , 'media' ] ;
42
+
43
+ const verifiedGroup = new Map ( ) ;
44
+
45
+ Object . entries ( group ) . forEach ( entry => {
46
+ let key = entry [ 0 ] ;
47
+ let value = entry [ 1 ] ;
48
+
49
+ if ( allowedFields . includes ( key ) ) {
50
+ verifiedGroup . set ( key , value ) ;
51
+ }
52
+ } ) ;
53
+
54
+ requiredField . forEach ( field => {
55
+ if ( ! verifiedGroup . has ( field ) ) {
56
+ return Promise . reject ( new Error ( 'Missing required fields.' ) ) ;
57
+ }
58
+ } )
59
+
60
+ return Promise . resolve ( verifiedGroup ) ;
61
+ } ;
62
+
63
+ const upTo = to => {
64
+ let upToArray = [ ] ;
65
+ for ( let i = 1 ; i <= to ; i ++ ) {
66
+ upToArray . push ( `$${ i } ` ) ;
67
+ }
68
+ return upToArray . toString ( ) ;
69
+ } ;
70
+
71
+ const createGroup = group => {
72
+ return verifyAlbum ( group ) . then ( verifiedGroup => {
73
+ const keys = verifiedGroup . keys ( ) ;
74
+ const values = verifiedGroup . values ( ) ;
75
+ const length = verifiedGroup . size ( ) ;
76
+
77
+ return db . query ( `insert into tracker.groups (${ keys . toString ( ) } ) values (${ upTo ( length ) } ) return id` , values ) ;
78
+ } ) ;
79
+ } ;
80
+
81
+ const store = ( torrent , group ) => {
82
+ return db . query ( 'insert into tracker.torrents (hash, path, group) values ($1, $2, $3)' , [ torrent . hash , torrent . path , group ] ) ;
83
+ } ;
84
+
85
+ app . post ( '/upload' , upload . fields ( [ { name : 'torrent' , maxCount : 1 } ] ) , ( req , res ) => {
86
+ let group = req . body . group ;
87
+ if ( typeof ( group ) !== 'Number' ) {
88
+ createGroup ( group ) . then ( result => {
89
+ group = result . rows [ 0 ] . id ;
90
+ } ) . catch ( err => {
91
+ res . send ( 400 ) ;
92
+ } ) ;
93
+ }
94
+ store ( req . file , group ) . then ( result => {
95
+ const torrentId = result . rows [ 0 ] . id ;
96
+ if ( torrentId ) {
97
+ res . send ( 200 , { id : torrentId } ) ;
98
+ }
99
+ } ) ;
100
+ } ) ;
101
+
102
+ module . exports = app ;
0 commit comments