diff options
Diffstat (limited to 'helpers/utils.js')
-rw-r--r-- | helpers/utils.js | 111 |
1 files changed, 62 insertions, 49 deletions
diff --git a/helpers/utils.js b/helpers/utils.js index 7cdb2600d..ec46631b1 100644 --- a/helpers/utils.js +++ b/helpers/utils.js | |||
@@ -13,47 +13,29 @@ | |||
13 | var constants = require('../initializers/constants') | 13 | var constants = require('../initializers/constants') |
14 | var logger = require('./logger') | 14 | var logger = require('./logger') |
15 | 15 | ||
16 | var utils = {} | 16 | var certDir = __dirname + '/../' + config.get('storage.certs') |
17 | |||
18 | var http = config.get('webserver.https') ? 'https' : 'http' | 17 | var http = config.get('webserver.https') ? 'https' : 'http' |
19 | var host = config.get('webserver.host') | 18 | var host = config.get('webserver.host') |
20 | var port = config.get('webserver.port') | 19 | var port = config.get('webserver.port') |
21 | var algorithm = 'aes-256-ctr' | 20 | var algorithm = 'aes-256-ctr' |
22 | 21 | ||
23 | // ----------- Private functions ---------- | 22 | var utils = { |
24 | 23 | getCertDir: getCertDir, | |
25 | function makeRetryRequest (params, from_url, to_pod, signature, callbackEach) { | 24 | certsExist: certsExist, |
26 | // Append the signature | 25 | cleanForExit: cleanForExit, |
27 | if (signature) { | 26 | createCerts: createCerts, |
28 | params.json.signature = { | 27 | createCertsIfNotExist: createCertsIfNotExist, |
29 | url: from_url, | 28 | generatePassword: generatePassword, |
30 | signature: signature | 29 | makeMultipleRetryRequest: makeMultipleRetryRequest, |
31 | } | 30 | symetricEncrypt: symetricEncrypt, |
32 | } | 31 | symetricDecrypt: symetricDecrypt |
33 | |||
34 | logger.debug('Make retry requests to %s.', to_pod.url) | ||
35 | |||
36 | replay( | ||
37 | request.post(params, function (err, response, body) { | ||
38 | callbackEach(err, response, body, params.url, to_pod) | ||
39 | }), | ||
40 | { | ||
41 | retries: constants.REQUEST_RETRIES, | ||
42 | factor: 3, | ||
43 | maxTimeout: Infinity, | ||
44 | errorCodes: [ 'EADDRINFO', 'ETIMEDOUT', 'ECONNRESET', 'ESOCKETTIMEDOUT', 'ENOTFOUND', 'ECONNREFUSED' ] | ||
45 | } | ||
46 | ).on('replay', function (replay) { | ||
47 | logger.info('Replaying request to %s. Request failed: %d %s. Replay number: #%d. Will retry in: %d ms.', | ||
48 | params.url, replay.error.code, replay.error.message, replay.number, replay.delay) | ||
49 | }) | ||
50 | } | 32 | } |
51 | 33 | ||
52 | // ----------- Public attributes ---------- | 34 | function getCertDir () { |
53 | utils.certDir = __dirname + '/../' + config.get('storage.certs') | 35 | return certDir |
36 | } | ||
54 | 37 | ||
55 | // { path, data } | 38 | function makeMultipleRetryRequest (all_data, pods, callbackEach, callback) { |
56 | utils.makeMultipleRetryRequest = function (all_data, pods, callbackEach, callback) { | ||
57 | if (!callback) { | 39 | if (!callback) { |
58 | callback = callbackEach | 40 | callback = callbackEach |
59 | callbackEach = null | 41 | callbackEach = null |
@@ -64,7 +46,7 @@ | |||
64 | 46 | ||
65 | // Add signature if it is specified in the params | 47 | // Add signature if it is specified in the params |
66 | if (all_data.method === 'POST' && all_data.data && all_data.sign === true) { | 48 | if (all_data.method === 'POST' && all_data.data && all_data.sign === true) { |
67 | var myKey = ursa.createPrivateKey(fs.readFileSync(utils.certDir + 'peertube.key.pem')) | 49 | var myKey = ursa.createPrivateKey(fs.readFileSync(certDir + 'peertube.key.pem')) |
68 | signature = myKey.hashAndSign('sha256', url, 'utf8', 'hex') | 50 | signature = myKey.hashAndSign('sha256', url, 'utf8', 'hex') |
69 | } | 51 | } |
70 | 52 | ||
@@ -93,7 +75,7 @@ | |||
93 | 75 | ||
94 | // TODO: ES6 with let | 76 | // TODO: ES6 with let |
95 | ;(function (crt_copy, copy_params, copy_url, copy_pod, copy_signature) { | 77 | ;(function (crt_copy, copy_params, copy_url, copy_pod, copy_signature) { |
96 | utils.symetricEncrypt(JSON.stringify(all_data.data), function (err, dataEncrypted) { | 78 | symetricEncrypt(JSON.stringify(all_data.data), function (err, dataEncrypted) { |
97 | if (err) throw err | 79 | if (err) throw err |
98 | 80 | ||
99 | var passwordEncrypted = crt_copy.encrypt(dataEncrypted.password, 'utf8', 'hex') | 81 | var passwordEncrypted = crt_copy.encrypt(dataEncrypted.password, 'utf8', 'hex') |
@@ -115,14 +97,14 @@ | |||
115 | }, callback) | 97 | }, callback) |
116 | } | 98 | } |
117 | 99 | ||
118 | utils.certsExist = function (callback) { | 100 | function certsExist (callback) { |
119 | fs.exists(utils.certDir + 'peertube.key.pem', function (exists) { | 101 | fs.exists(certDir + 'peertube.key.pem', function (exists) { |
120 | return callback(exists) | 102 | return callback(exists) |
121 | }) | 103 | }) |
122 | } | 104 | } |
123 | 105 | ||
124 | utils.createCerts = function (callback) { | 106 | function createCerts (callback) { |
125 | utils.certsExist(function (exist) { | 107 | certsExist(function (exist) { |
126 | if (exist === true) { | 108 | if (exist === true) { |
127 | var string = 'Certs already exist.' | 109 | var string = 'Certs already exist.' |
128 | logger.warning(string) | 110 | logger.warning(string) |
@@ -130,7 +112,7 @@ | |||
130 | } | 112 | } |
131 | 113 | ||
132 | logger.info('Generating a RSA key...') | 114 | logger.info('Generating a RSA key...') |
133 | openssl.exec('genrsa', { 'out': utils.certDir + 'peertube.key.pem', '2048': false }, function (err) { | 115 | openssl.exec('genrsa', { 'out': certDir + 'peertube.key.pem', '2048': false }, function (err) { |
134 | if (err) { | 116 | if (err) { |
135 | logger.error('Cannot create private key on this pod.', { error: err }) | 117 | logger.error('Cannot create private key on this pod.', { error: err }) |
136 | return callback(err) | 118 | return callback(err) |
@@ -138,7 +120,7 @@ | |||
138 | logger.info('RSA key generated.') | 120 | logger.info('RSA key generated.') |
139 | 121 | ||
140 | logger.info('Manage public key...') | 122 | logger.info('Manage public key...') |
141 | openssl.exec('rsa', { 'in': utils.certDir + 'peertube.key.pem', 'pubout': true, 'out': utils.certDir + 'peertube.pub' }, function (err) { | 123 | openssl.exec('rsa', { 'in': certDir + 'peertube.key.pem', 'pubout': true, 'out': certDir + 'peertube.pub' }, function (err) { |
142 | if (err) { | 124 | if (err) { |
143 | logger.error('Cannot create public key on this pod .', { error: err }) | 125 | logger.error('Cannot create public key on this pod .', { error: err }) |
144 | return callback(err) | 126 | return callback(err) |
@@ -151,19 +133,19 @@ | |||
151 | }) | 133 | }) |
152 | } | 134 | } |
153 | 135 | ||
154 | utils.createCertsIfNotExist = function (callback) { | 136 | function createCertsIfNotExist (callback) { |
155 | utils.certsExist(function (exist) { | 137 | certsExist(function (exist) { |
156 | if (exist === true) { | 138 | if (exist === true) { |
157 | return callback(null) | 139 | return callback(null) |
158 | } | 140 | } |
159 | 141 | ||
160 | utils.createCerts(function (err) { | 142 | createCerts(function (err) { |
161 | return callback(err) | 143 | return callback(err) |
162 | }) | 144 | }) |
163 | }) | 145 | }) |
164 | } | 146 | } |
165 | 147 | ||
166 | utils.generatePassword = function (callback) { | 148 | function generatePassword (callback) { |
167 | crypto.randomBytes(32, function (err, buf) { | 149 | crypto.randomBytes(32, function (err, buf) { |
168 | if (err) { | 150 | if (err) { |
169 | return callback(err) | 151 | return callback(err) |
@@ -173,8 +155,8 @@ | |||
173 | }) | 155 | }) |
174 | } | 156 | } |
175 | 157 | ||
176 | utils.symetricEncrypt = function (text, callback) { | 158 | function symetricEncrypt (text, callback) { |
177 | utils.generatePassword(function (err, password) { | 159 | generatePassword(function (err, password) { |
178 | if (err) { | 160 | if (err) { |
179 | return callback(err) | 161 | return callback(err) |
180 | } | 162 | } |
@@ -186,17 +168,48 @@ | |||
186 | }) | 168 | }) |
187 | } | 169 | } |
188 | 170 | ||
189 | utils.symetricDecrypt = function (text, password) { | 171 | function symetricDecrypt (text, password) { |
190 | var decipher = crypto.createDecipher(algorithm, password) | 172 | var decipher = crypto.createDecipher(algorithm, password) |
191 | var dec = decipher.update(text, 'hex', 'utf8') | 173 | var dec = decipher.update(text, 'hex', 'utf8') |
192 | dec += decipher.final('utf8') | 174 | dec += decipher.final('utf8') |
193 | return dec | 175 | return dec |
194 | } | 176 | } |
195 | 177 | ||
196 | utils.cleanForExit = function (webtorrent_process) { | 178 | function cleanForExit (webtorrent_process) { |
197 | logger.info('Gracefully exiting') | 179 | logger.info('Gracefully exiting') |
198 | process.kill(-webtorrent_process.pid) | 180 | process.kill(-webtorrent_process.pid) |
199 | } | 181 | } |
200 | 182 | ||
183 | // --------------------------------------------------------------------------- | ||
184 | |||
201 | module.exports = utils | 185 | module.exports = utils |
186 | |||
187 | // --------------------------------------------------------------------------- | ||
188 | |||
189 | function makeRetryRequest (params, from_url, to_pod, signature, callbackEach) { | ||
190 | // Append the signature | ||
191 | if (signature) { | ||
192 | params.json.signature = { | ||
193 | url: from_url, | ||
194 | signature: signature | ||
195 | } | ||
196 | } | ||
197 | |||
198 | logger.debug('Make retry requests to %s.', to_pod.url) | ||
199 | |||
200 | replay( | ||
201 | request.post(params, function (err, response, body) { | ||
202 | callbackEach(err, response, body, params.url, to_pod) | ||
203 | }), | ||
204 | { | ||
205 | retries: constants.REQUEST_RETRIES, | ||
206 | factor: 3, | ||
207 | maxTimeout: Infinity, | ||
208 | errorCodes: [ 'EADDRINFO', 'ETIMEDOUT', 'ECONNRESET', 'ESOCKETTIMEDOUT', 'ENOTFOUND', 'ECONNREFUSED' ] | ||
209 | } | ||
210 | ).on('replay', function (replay) { | ||
211 | logger.info('Replaying request to %s. Request failed: %d %s. Replay number: #%d. Will retry in: %d ms.', | ||
212 | params.url, replay.error.code, replay.error.message, replay.number, replay.delay) | ||
213 | }) | ||
214 | } | ||
202 | })() | 215 | })() |