]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - src/utils.js
Add stylesheets vendor and global.css to ignore
[github/Chocobozzz/PeerTube.git] / src / utils.js
CommitLineData
8c308c2b
C
1;(function () {
2 'use strict'
3
8c308c2b 4 var config = require('config')
a1860380 5 var crypto = require('crypto')
8c308c2b
C
6 var fs = require('fs')
7 var openssl = require('openssl-wrapper')
a1860380
C
8 var request = require('request')
9 var replay = require('request-replay')
10 var ursa = require('ursa')
8c308c2b
C
11
12 var logger = require('./logger')
13
a1860380
C
14 var utils = {}
15
8c308c2b
C
16 var http = config.get('webserver.https') ? 'https' : 'http'
17 var host = config.get('webserver.host')
18 var port = config.get('webserver.port')
19 var algorithm = 'aes-256-ctr'
20
8c308c2b
C
21 // ----------- Private functions ----------
22
23 function makeRetryRequest (params, from_url, to_pod, signature, callbackEach) {
24 // Append the signature
25 if (signature) {
26 params.json.signature = {
27 url: from_url,
28 signature: signature
29 }
30 }
31
a1860380 32 logger.debug('Sending informations to %s.', to_pod.url, { params: params })
8c308c2b
C
33
34 // Replay 15 times, with factor 3
35 replay(
36 request.post(params, function (err, response, body) {
37 callbackEach(err, response, body, to_pod.url)
38 }),
39 {
40 retries: 10,
41 factor: 3,
42 maxTimeout: Infinity,
43 errorCodes: [ 'EADDRINFO', 'ETIMEDOUT', 'ECONNRESET', 'ESOCKETTIMEDOUT', 'ENOTFOUND', 'ECONNREFUSED' ]
44 }
45 ).on('replay', function (replay) {
46 logger.info('Replaying request to %s. Request failed: %d %s. Replay number: #%d. Will retry in: %d ms.',
47 params.url, replay.error.code, replay.error.message, replay.number, replay.delay)
48 })
49 }
50
51 // ----------- Public attributes ----------
52 utils.certDir = __dirname + '/../' + config.get('storage.certs')
53
54 // { path, data }
a1860380 55 utils.makeMultipleRetryRequest = function (all_data, pods, callbackEach, callback) {
8c308c2b
C
56 if (!callback) {
57 callback = callbackEach
58 callbackEach = function () {}
59 }
60
61 var url = http + '://' + host + ':' + port
62 var signature
63
a1860380
C
64 // Add signature if it is specified in the params
65 if (all_data.method === 'POST' && all_data.data && all_data.sign === true) {
d148f3b9 66 var myKey = ursa.createPrivateKey(fs.readFileSync(utils.certDir + 'peertube.key.pem'))
8c308c2b
C
67 signature = myKey.hashAndSign('sha256', url, 'utf8', 'hex')
68 }
69
70 // Make a request for each pod
71 for (var pod of pods) {
72 var params = {
a1860380
C
73 url: pod.url + all_data.path,
74 method: all_data.method
8c308c2b
C
75 }
76
77 // Add data with POST requst ?
a1860380 78 if (all_data.method === 'POST' && all_data.data) {
8c308c2b
C
79 logger.debug('Make a POST request.')
80
81 // Encrypt data ?
a1860380 82 if (all_data.encrypt === true) {
8c308c2b
C
83 var crt = ursa.createPublicKey(pod.publicKey)
84
85 // TODO: ES6 with let
86 ;(function (crt_copy, copy_params, copy_url, copy_pod, copy_signature) {
a1860380 87 utils.symetricEncrypt(JSON.stringify(all_data.data), function (err, dataEncrypted) {
8c308c2b
C
88 if (err) throw err
89
90 var passwordEncrypted = crt_copy.encrypt(dataEncrypted.password, 'utf8', 'hex')
91 copy_params.json = {
92 data: dataEncrypted.crypted,
93 key: passwordEncrypted
94 }
95
96 makeRetryRequest(copy_params, copy_url, copy_pod, copy_signature, callbackEach)
97 })
98 })(crt, params, url, pod, signature)
99 } else {
a1860380 100 params.json = { data: all_data.data }
8c308c2b
C
101 makeRetryRequest(params, url, pod, signature, callbackEach)
102 }
103 } else {
104 logger.debug('Make a GET/DELETE request')
105 makeRetryRequest(params, url, pod, signature, callbackEach)
106 }
107 }
108
109 return callback()
110 }
111
112 utils.certsExist = function (callback) {
d148f3b9 113 fs.exists(utils.certDir + 'peertube.key.pem', function (exists) {
8c308c2b
C
114 return callback(exists)
115 })
116 }
117
118 utils.createCerts = function (callback) {
119 utils.certsExist(function (exist) {
120 if (exist === true) {
121 var string = 'Certs already exist.'
122 logger.warning(string)
123 return callback(new Error(string))
124 }
125
a1860380 126 logger.info('Generating a RSA key...')
2696b9af 127 openssl.exec('genrsa', { 'out': utils.certDir + 'peertube.key.pem', '2048': false }, function (err) {
8c308c2b
C
128 if (err) {
129 logger.error('Cannot create private key on this pod.', { error: err })
130 return callback(err)
131 }
a1860380 132 logger.info('RSA key generated.')
8c308c2b 133
a1860380 134 logger.info('Manage public key...')
d148f3b9 135 openssl.exec('rsa', { 'in': utils.certDir + 'peertube.key.pem', 'pubout': true, 'out': utils.certDir + 'peertube.pub' }, function (err) {
8c308c2b
C
136 if (err) {
137 logger.error('Cannot create public key on this pod .', { error: err })
138 return callback(err)
139 }
140
a1860380 141 logger.info('Public key managed.')
8c308c2b
C
142 return callback(null)
143 })
144 })
145 })
146 }
147
148 utils.createCertsIfNotExist = function (callback) {
149 utils.certsExist(function (exist) {
150 if (exist === true) {
151 return callback(null)
152 }
153
154 utils.createCerts(function (err) {
155 return callback(err)
156 })
157 })
158 }
159
160 utils.generatePassword = function (callback) {
161 crypto.randomBytes(32, function (err, buf) {
162 if (err) {
163 return callback(err)
164 }
165
166 callback(null, buf.toString('utf8'))
167 })
168 }
169
170 utils.symetricEncrypt = function (text, callback) {
171 utils.generatePassword(function (err, password) {
172 if (err) {
173 return callback(err)
174 }
175
176 var cipher = crypto.createCipher(algorithm, password)
177 var crypted = cipher.update(text, 'utf8', 'hex')
178 crypted += cipher.final('hex')
179 callback(null, { crypted: crypted, password: password })
180 })
181 }
182
183 utils.symetricDecrypt = function (text, password) {
184 var decipher = crypto.createDecipher(algorithm, password)
185 var dec = decipher.update(text, 'hex', 'utf8')
186 dec += decipher.final('utf8')
187 return dec
188 }
189
0ae2e7f7
C
190 utils.cleanForExit = function (webtorrent_process) {
191 logger.info('Gracefully exiting')
192 process.kill(-webtorrent_process.pid)
193 }
194
8c308c2b
C
195 module.exports = utils
196})()