aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/lib/friends.js
diff options
context:
space:
mode:
authorChocobozzz <florian.bigard@gmail.com>2016-11-14 20:03:04 +0100
committerChocobozzz <florian.bigard@gmail.com>2016-11-16 20:29:26 +0100
commit49abbbbedca83b9031d3e2eb3ae9ad9b6a7d96ed (patch)
tree68c59d67637a297d513e07ea96ba236a7f0cd43b /server/lib/friends.js
parent41b5da1d8cb41f5c49f0e0a01a54106c9a5925dd (diff)
downloadPeerTube-49abbbbedca83b9031d3e2eb3ae9ad9b6a7d96ed.tar.gz
PeerTube-49abbbbedca83b9031d3e2eb3ae9ad9b6a7d96ed.tar.zst
PeerTube-49abbbbedca83b9031d3e2eb3ae9ad9b6a7d96ed.zip
Pod URL -> pod host. HTTPS is required to make friends.
Reason: in a network with mix http/https pods, https pods won't be able to play videos from http pod (insecure requests).
Diffstat (limited to 'server/lib/friends.js')
-rw-r--r--server/lib/friends.js59
1 files changed, 25 insertions, 34 deletions
diff --git a/server/lib/friends.js b/server/lib/friends.js
index eafffaab0..eaea040ca 100644
--- a/server/lib/friends.js
+++ b/server/lib/friends.js
@@ -6,7 +6,6 @@ const eachSeries = require('async/eachSeries')
6const fs = require('fs') 6const fs = require('fs')
7const mongoose = require('mongoose') 7const mongoose = require('mongoose')
8const request = require('request') 8const request = require('request')
9const urlUtil = require('url')
10const waterfall = require('async/waterfall') 9const waterfall = require('async/waterfall')
11 10
12const constants = require('../initializers/constants') 11const constants = require('../initializers/constants')
@@ -44,7 +43,7 @@ function getMyCertificate (callback) {
44 fs.readFile(constants.CONFIG.STORAGE.CERT_DIR + 'peertube.pub', 'utf8', callback) 43 fs.readFile(constants.CONFIG.STORAGE.CERT_DIR + 'peertube.pub', 'utf8', callback)
45} 44}
46 45
47function makeFriends (urls, callback) { 46function makeFriends (hosts, callback) {
48 const podsScore = {} 47 const podsScore = {}
49 48
50 logger.info('Make friends!') 49 logger.info('Make friends!')
@@ -54,13 +53,13 @@ function makeFriends (urls, callback) {
54 return callback(err) 53 return callback(err)
55 } 54 }
56 55
57 eachSeries(urls, function (url, callbackEach) { 56 eachSeries(hosts, function (host, callbackEach) {
58 computeForeignPodsList(url, podsScore, callbackEach) 57 computeForeignPodsList(host, podsScore, callbackEach)
59 }, function (err) { 58 }, function (err) {
60 if (err) return callback(err) 59 if (err) return callback(err)
61 60
62 logger.debug('Pods scores computed.', { podsScore: podsScore }) 61 logger.debug('Pods scores computed.', { podsScore: podsScore })
63 const podsList = computeWinningPods(urls, podsScore) 62 const podsList = computeWinningPods(hosts, podsScore)
64 logger.debug('Pods that we keep.', { podsToKeep: podsList }) 63 logger.debug('Pods that we keep.', { podsToKeep: podsList })
65 64
66 makeRequestsToWinningPods(cert, podsList, callback) 65 makeRequestsToWinningPods(cert, podsList, callback)
@@ -149,45 +148,45 @@ module.exports = friends
149 148
150// --------------------------------------------------------------------------- 149// ---------------------------------------------------------------------------
151 150
152function computeForeignPodsList (url, podsScore, callback) { 151function computeForeignPodsList (host, podsScore, callback) {
153 getForeignPodsList(url, function (err, foreignPodsList) { 152 getForeignPodsList(host, function (err, foreignPodsList) {
154 if (err) return callback(err) 153 if (err) return callback(err)
155 154
156 if (!foreignPodsList) foreignPodsList = [] 155 if (!foreignPodsList) foreignPodsList = []
157 156
158 // Let's give 1 point to the pod we ask the friends list 157 // Let's give 1 point to the pod we ask the friends list
159 foreignPodsList.push({ url: url }) 158 foreignPodsList.push({ host })
160 159
161 foreignPodsList.forEach(function (foreignPod) { 160 foreignPodsList.forEach(function (foreignPod) {
162 const foreignPodUrl = foreignPod.url 161 const foreignPodHost = foreignPod.host
163 162
164 if (podsScore[foreignPodUrl]) podsScore[foreignPodUrl]++ 163 if (podsScore[foreignPodHost]) podsScore[foreignPodHost]++
165 else podsScore[foreignPodUrl] = 1 164 else podsScore[foreignPodHost] = 1
166 }) 165 })
167 166
168 callback() 167 callback()
169 }) 168 })
170} 169}
171 170
172function computeWinningPods (urls, podsScore) { 171function computeWinningPods (hosts, podsScore) {
173 // Build the list of pods to add 172 // Build the list of pods to add
174 // Only add a pod if it exists in more than a half base pods 173 // Only add a pod if it exists in more than a half base pods
175 const podsList = [] 174 const podsList = []
176 const baseScore = urls.length / 2 175 const baseScore = hosts.length / 2
177 Object.keys(podsScore).forEach(function (podUrl) { 176 Object.keys(podsScore).forEach(function (podHost) {
178 // If the pod is not me and with a good score we add it 177 // If the pod is not me and with a good score we add it
179 if (isMe(podUrl) === false && podsScore[podUrl] > baseScore) { 178 if (isMe(podHost) === false && podsScore[podHost] > baseScore) {
180 podsList.push({ url: podUrl }) 179 podsList.push({ host: podHost })
181 } 180 }
182 }) 181 })
183 182
184 return podsList 183 return podsList
185} 184}
186 185
187function getForeignPodsList (url, callback) { 186function getForeignPodsList (host, callback) {
188 const path = '/api/' + constants.API_VERSION + '/pods' 187 const path = '/api/' + constants.API_VERSION + '/pods'
189 188
190 request.get(url + path, function (err, response, body) { 189 request.get(constants.REMOTE_SCHEME.HTTP + '://' + host + path, function (err, response, body) {
191 if (err) return callback(err) 190 if (err) return callback(err)
192 191
193 try { 192 try {
@@ -207,26 +206,26 @@ function makeRequestsToWinningPods (cert, podsList, callback) {
207 206
208 eachLimit(podsList, constants.REQUESTS_IN_PARALLEL, function (pod, callbackEach) { 207 eachLimit(podsList, constants.REQUESTS_IN_PARALLEL, function (pod, callbackEach) {
209 const params = { 208 const params = {
210 url: pod.url + '/api/' + constants.API_VERSION + '/pods/', 209 url: constants.REMOTE_SCHEME.HTTP + '://' + pod.host + '/api/' + constants.API_VERSION + '/pods/',
211 method: 'POST', 210 method: 'POST',
212 json: { 211 json: {
213 url: constants.CONFIG.WEBSERVER.URL, 212 host: constants.CONFIG.WEBSERVER.HOST,
214 publicKey: cert 213 publicKey: cert
215 } 214 }
216 } 215 }
217 216
218 requests.makeRetryRequest(params, function (err, res, body) { 217 requests.makeRetryRequest(params, function (err, res, body) {
219 if (err) { 218 if (err) {
220 logger.error('Error with adding %s pod.', pod.url, { error: err }) 219 logger.error('Error with adding %s pod.', pod.host, { error: err })
221 // Don't break the process 220 // Don't break the process
222 return callbackEach() 221 return callbackEach()
223 } 222 }
224 223
225 if (res.statusCode === 200) { 224 if (res.statusCode === 200) {
226 const podObj = new Pod({ url: pod.url, publicKey: body.cert }) 225 const podObj = new Pod({ host: pod.host, publicKey: body.cert })
227 podObj.save(function (err, podCreated) { 226 podObj.save(function (err, podCreated) {
228 if (err) { 227 if (err) {
229 logger.error('Cannot add friend %s pod.', pod.url, { error: err }) 228 logger.error('Cannot add friend %s pod.', pod.host, { error: err })
230 return callbackEach() 229 return callbackEach()
231 } 230 }
232 231
@@ -236,7 +235,7 @@ function makeRequestsToWinningPods (cert, podsList, callback) {
236 return callbackEach() 235 return callbackEach()
237 }) 236 })
238 } else { 237 } else {
239 logger.error('Status not 200 for %s pod.', pod.url) 238 logger.error('Status not 200 for %s pod.', pod.host)
240 return callbackEach() 239 return callbackEach()
241 } 240 }
242 }) 241 })
@@ -268,14 +267,6 @@ function createRequest (type, endpoint, data, to) {
268 }) 267 })
269} 268}
270 269
271function isMe (url) { 270function isMe (host) {
272 const parsedUrl = urlUtil.parse(url) 271 return host === constants.CONFIG.WEBSERVER.HOST
273
274 const hostname = parsedUrl.hostname
275 const port = parseInt(parsedUrl.port)
276
277 const myHostname = constants.CONFIG.WEBSERVER.HOSTNAME
278 const myPort = constants.CONFIG.WEBSERVER.PORT
279
280 return hostname === myHostname && port === myPort
281} 272}