()
| 60 | } |
| 61 | |
| 62 | start() { |
| 63 | let me = this; |
| 64 | |
| 65 | let server = net.createServer(async (client) => { |
| 66 | if (me.blacklist.has(client.remoteAddress) && me.blacklist.get(client.remoteAddress).size > 20) return client.dispose(); |
| 67 | |
| 68 | let data = await client.readAsync(); |
| 69 | if (!data) return client.dispose(); |
| 70 | |
| 71 | let meta = cryptoEx.SupportedCiphers[me.cipherAlgorithm]; |
| 72 | if (!meta) meta = cryptoEx.SupportedCiphers[defaultCipherAlgorithm]; |
| 73 | let ivLength = meta[1]; |
| 74 | |
| 75 | if (data.length < ivLength) { |
| 76 | console.warn(client.remoteAddress, 'Malicious Access'); |
| 77 | return me.addToBlacklist(client); |
| 78 | } |
| 79 | |
| 80 | let iv = data.slice(0, ivLength); |
| 81 | let decipher = cryptoEx.createDecipher(me.cipherAlgorithm, me.password, iv); |
| 82 | |
| 83 | let et = data.slice(ivLength, data.length); |
| 84 | let dt = Buffer.concat([decipher.update(et), decipher.final()]); |
| 85 | |
| 86 | if (dt.length < 2) { |
| 87 | console.warn(client.remoteAddress, 'Malicious Access') |
| 88 | return me.addToBlacklist(client); |
| 89 | } |
| 90 | |
| 91 | let vpnType = dt[0]; |
| 92 | let paddingSize = dt[1]; |
| 93 | |
| 94 | let options = { |
| 95 | iv, |
| 96 | password: me.password, |
| 97 | cipherAlgorithm: me.cipherAlgorithm, |
| 98 | timeout: me.timeout, |
| 99 | xorNum: paddingSize, |
| 100 | speed: me.speed, |
| 101 | ivLength, |
| 102 | }; |
| 103 | |
| 104 | let request = dt.slice(2 + paddingSize, data.length); |
| 105 | |
| 106 | let handler = me.requestHandlers.get(vpnType); |
| 107 | if (!handler) return me.addToBlacklist(client); |
| 108 | |
| 109 | let handled = handler(client, request, options); |
| 110 | |
| 111 | if (handled) return; |
| 112 | me.addToBlacklist(client); |
| 113 | }); |
| 114 | |
| 115 | this.server = server; |
| 116 | server.listen(this.port); |
| 117 | server.on('error', (err) => { |
| 118 | console.error(err.message); |
| 119 | me.stop(); |
no test coverage detected