diff --git a/server/controllers/api/remote/videos.ts b/server/controllers/api/remote/videos.ts index ebe4eca36..eb033637e 100644 --- a/server/controllers/api/remote/videos.ts +++ b/server/controllers/api/remote/videos.ts @@ -64,8 +64,7 @@ function remoteVideos (req: express.Request, res: express.Response, next: expres const fromPod = res.locals.secure.pod // We need to process in the same order to keep consistency - // TODO: optimization - Promise.mapSeries(requests, (request: any) => { + Promise.each(requests, (request: any) => { const data = request.data // Get the function we need to call in order to process the request @@ -79,7 +78,7 @@ function remoteVideos (req: express.Request, res: express.Response, next: expres }) .catch(err => logger.error('Error managing remote videos.', { error: err })) - // We don't need to keep the other pod waiting + // Don't block the other pod return res.type('json').status(204).end() } @@ -87,7 +86,7 @@ function remoteVideosQadu (req: express.Request, res: express.Response, next: ex const requests = req.body.data const fromPod = res.locals.secure.pod - Promise.mapSeries(requests, (request: any) => { + Promise.each(requests, (request: any) => { const videoData = request.data return quickAndDirtyUpdateVideoRetryWrapper(videoData, fromPod) @@ -101,7 +100,7 @@ function remoteVideosEvents (req: express.Request, res: express.Response, next: const requests = req.body.data const fromPod = res.locals.secure.pod - Promise.mapSeries(requests, (request: any) => { + Promise.each(requests, (request: any) => { const eventData = request.data return processVideosEventsRetryWrapper(eventData, fromPod) diff --git a/server/controllers/client.ts b/server/controllers/client.ts index e4d69eae7..d42e8396d 100644 --- a/server/controllers/client.ts +++ b/server/controllers/client.ts @@ -8,15 +8,14 @@ import { CONFIG, REMOTE_SCHEME, STATIC_PATHS, - STATIC_MAX_AGE + STATIC_MAX_AGE, + OPENGRAPH_COMMENT } from '../initializers' import { root, readFileBufferPromise } from '../helpers' import { VideoInstance } from '../models' const clientsRouter = express.Router() -// TODO: move to constants -const opengraphComment = '' const distPath = join(root(), 'client', 'dist') const embedPath = join(distPath, 'standalone', 'videos', 'embed.html') const indexPath = join(distPath, 'index.html') @@ -85,7 +84,7 @@ function addOpenGraphTags (htmlStringPage: string, video: VideoInstance) { tagsString += '' }) - return htmlStringPage.replace(opengraphComment, tagsString) + return htmlStringPage.replace(OPENGRAPH_COMMENT, tagsString) } function generateWatchHtmlPage (req: express.Request, res: express.Response, next: express.NextFunction) { diff --git a/server/helpers/peertube-crypto.ts b/server/helpers/peertube-crypto.ts index 8e8001cd6..0c73e8539 100644 --- a/server/helpers/peertube-crypto.ts +++ b/server/helpers/peertube-crypto.ts @@ -1,5 +1,5 @@ import * as crypto from 'crypto' -import * as fs from 'fs' +import * as Promise from 'bluebird' import { join } from 'path' import { @@ -52,18 +52,15 @@ function sign (data: string|Object) { dataString = JSON.stringify(data) } catch (err) { logger.error('Cannot sign data.', { error: err }) - return '' + return Promise.resolve('') } } sign.update(dataString, 'utf8') - // TODO: make async - const certPath = join(CONFIG.STORAGE.CERT_DIR, PRIVATE_CERT_NAME) - const myKey = fs.readFileSync(certPath) - const signature = sign.sign(myKey.toString(), SIGNATURE_ENCODING) - - return signature + return getMyPrivateCert().then(myKey => { + return sign.sign(myKey, SIGNATURE_ENCODING) + }) } function comparePassword (plainPassword: string, hashPassword: string) { diff --git a/server/helpers/requests.ts b/server/helpers/requests.ts index b31074373..183f6df0d 100644 --- a/server/helpers/requests.ts +++ b/server/helpers/requests.ts @@ -33,7 +33,6 @@ type MakeSecureRequestParams = { method: 'GET'|'POST' toPod: PodInstance path: string - sign: boolean data?: Object } function makeSecureRequest (params: MakeSecureRequestParams) { @@ -47,31 +46,30 @@ function makeSecureRequest (params: MakeSecureRequestParams) { return rej(new Error('Cannot make a secure request with a non POST method.')) } - // Add signature if it is specified in the params - if (params.sign === true) { - const host = CONFIG.WEBSERVER.HOST + const host = CONFIG.WEBSERVER.HOST - let dataToSign - if (params.data) { - dataToSign = params.data - } else { - // We do not have data to sign so we just take our host - // It is not ideal but the connection should be in HTTPS - dataToSign = host - } + let dataToSign + if (params.data) { + dataToSign = params.data + } else { + // We do not have data to sign so we just take our host + // It is not ideal but the connection should be in HTTPS + dataToSign = host + } + sign(dataToSign).then(signature => { requestParams.json['signature'] = { host, // Which host we pretend to be - signature: sign(dataToSign) + signature } - } - // If there are data informations - if (params.data) { - requestParams.json['data'] = params.data - } + // If there are data informations + if (params.data) { + requestParams.json['data'] = params.data + } - request.post(requestParams, (err, response, body) => err ? rej(err) : res({ response, body })) + request.post(requestParams, (err, response, body) => err ? rej(err) : res({ response, body })) + }) }) } diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index bf99f4df6..2792d3228 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -287,6 +287,10 @@ const USER_ROLES: { [ id: string ]: UserRole } = { // --------------------------------------------------------------------------- +const OPENGRAPH_COMMENT = '' + +// --------------------------------------------------------------------------- + // Special constants for a test instance if (isTestInstance() === true) { CONSTRAINTS_FIELDS.VIDEOS.DURATION.max = 14 @@ -306,12 +310,13 @@ export { CONFIG, CONSTRAINTS_FIELDS, FRIEND_SCORE, - JOBS_FETCHING_INTERVAL, JOB_STATES, JOBS_CONCURRENCY, JOBS_FETCH_LIMIT_PER_CYCLE, + JOBS_FETCHING_INTERVAL, LAST_MIGRATION_VERSION, OAUTH_LIFETIME, + OPENGRAPH_COMMENT, PAGINATION_COUNT_DEFAULT, PODS_SCORE, PREVIEWS_SIZE, diff --git a/server/initializers/migrator.ts b/server/initializers/migrator.ts index d381551b5..3184ec920 100644 --- a/server/initializers/migrator.ts +++ b/server/initializers/migrator.ts @@ -35,9 +35,7 @@ function migrate () { return getMigrationScripts().then(migrationScripts => ({ actualVersion, migrationScripts })) }) .then(({ actualVersion, migrationScripts }) => { - return Promise.mapSeries(migrationScripts, entity => { - return executeMigration(actualVersion, entity) - }) + return Promise.each(migrationScripts, entity => executeMigration(actualVersion, entity)) }) .then(() => { logger.info('Migrations finished. New migration version schema: %s', LAST_MIGRATION_VERSION) diff --git a/server/lib/friends.ts b/server/lib/friends.ts index 498144318..c24839cb6 100644 --- a/server/lib/friends.ts +++ b/server/lib/friends.ts @@ -141,9 +141,7 @@ function makeFriends (hosts: string[]) { logger.info('Make friends!') return getMyPublicCert() .then(cert => { - return Promise.mapSeries(hosts, host => { - return computeForeignPodsList(host, podsScore) - }).then(() => cert) + return Promise.each(hosts, host => computeForeignPodsList(host, podsScore)).then(() => cert) }) .then(cert => { logger.debug('Pods scores computed.', { podsScore: podsScore }) @@ -169,7 +167,6 @@ function quitFriends () { const requestParams = { method: 'POST' as 'POST', path: '/api/' + API_VERSION + '/remote/pods/remove', - sign: true, toPod: null } @@ -178,6 +175,7 @@ function quitFriends () { // The other pod will exclude us automatically after a while return Promise.map(pods, pod => { requestParams.toPod = pod + return makeSecureRequest(requestParams) }, { concurrency: REQUESTS_IN_PARALLEL }) .then(() => pods) diff --git a/server/lib/request/abstract-request-scheduler.ts b/server/lib/request/abstract-request-scheduler.ts index dd77fddb7..128fc5b28 100644 --- a/server/lib/request/abstract-request-scheduler.ts +++ b/server/lib/request/abstract-request-scheduler.ts @@ -70,7 +70,6 @@ abstract class AbstractRequestScheduler { protected makeRequest (toPod: PodInstance, requestEndpoint: string, requestsToMake: Object) { const params = { toPod: toPod, - sign: true, // Prove our identity method: 'POST' as 'POST', path: '/api/' + API_VERSION + '/remote/' + requestEndpoint, data: requestsToMake // Requests we need to make diff --git a/server/lib/request/request-scheduler.ts b/server/lib/request/request-scheduler.ts index 0dd796fb0..8927d53bb 100644 --- a/server/lib/request/request-scheduler.ts +++ b/server/lib/request/request-scheduler.ts @@ -61,16 +61,9 @@ class RequestScheduler extends AbstractRequestScheduler { } createRequest ({ type, endpoint, data, toIds, transaction }: RequestSchedulerOptions) { - // TODO: check the setPods works - const podIds = [] - // If there are no destination pods abort if (toIds.length === 0) return undefined - toIds.forEach(toPod => { - podIds.push(toPod) - }) - const createQuery = { endpoint, request: { @@ -85,7 +78,7 @@ class RequestScheduler extends AbstractRequestScheduler { return db.Request.create(createQuery, dbRequestOptions) .then(request => { - return request.setPods(podIds, dbRequestOptions) + return request.setPods(toIds, dbRequestOptions) }) } diff --git a/server/middlewares/secure.ts b/server/middlewares/secure.ts index 0fa9ee9d2..f58bea734 100644 --- a/server/middlewares/secure.ts +++ b/server/middlewares/secure.ts @@ -41,7 +41,7 @@ function checkSignature (req: express.Request, res: express.Response, next: expr return res.sendStatus(403) }) .catch(err => { - logger.error('Cannot get signed host in body.', { error: err }) + logger.error('Cannot get signed host in body.', { error: err.stack, signature: req.body.signature.signature }) return res.sendStatus(500) }) }