Async signature and various fixes
authorChocobozzz <florian.bigard@gmail.com>
Fri, 7 Jul 2017 14:57:28 +0000 (16:57 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Fri, 7 Jul 2017 16:23:18 +0000 (18:23 +0200)
server/controllers/api/remote/videos.ts
server/controllers/client.ts
server/helpers/peertube-crypto.ts
server/helpers/requests.ts
server/initializers/constants.ts
server/initializers/migrator.ts
server/lib/friends.ts
server/lib/request/abstract-request-scheduler.ts
server/lib/request/request-scheduler.ts
server/middlewares/secure.ts

index ebe4eca365c1fffcfe6e9b87d0e7734878048f01..eb033637e14a1c40dbc108a764554cd8a5504ec2 100644 (file)
@@ -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)
index e4d69eae7d3cc70130e8b5959e0abee28615b339..d42e8396df39be22621d0bbcbb0d540bbc506a9b 100644 (file)
@@ -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 = '<!-- opengraph tags -->'
 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 += '<meta property="' + tagName + '" content="' + tagValue + '" />'
   })
 
-  return htmlStringPage.replace(opengraphComment, tagsString)
+  return htmlStringPage.replace(OPENGRAPH_COMMENT, tagsString)
 }
 
 function generateWatchHtmlPage (req: express.Request, res: express.Response, next: express.NextFunction) {
index 8e8001cd69bbd3563351ad025e176852a28cac1e..0c73e853909b9484e383b0bc011ae84a65c03d43 100644 (file)
@@ -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) {
index b31074373e2c9c449db2a20c475ff0846a6ee455..183f6df0daf2b9de488c7740799310bd8b3b97ee 100644 (file)
@@ -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 }))
+    })
   })
 }
 
index bf99f4df6925425c7de5a02e8af2df65cb8e5620..2792d32283b5e8a259111df22734b1466385a052 100644 (file)
@@ -287,6 +287,10 @@ const USER_ROLES: { [ id: string ]: UserRole } = {
 
 // ---------------------------------------------------------------------------
 
+const OPENGRAPH_COMMENT = '<!-- opengraph tags -->'
+
+// ---------------------------------------------------------------------------
+
 // 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,
index d381551b583bec39aa1b8b9b0908b7122b48c921..3184ec920824d47ed4076bc22cc19629fb282ac5 100644 (file)
@@ -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)
index 498144318a78819a0a59ade60b282e4013a527a3..c24839cb6ad28e76bc4055ee767d8ef53fe2917b 100644 (file)
@@ -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)
index dd77fddb71fc2b4b94cccc13e9823b40ff280c32..128fc5b28eb92f9098fa697619c79d94a8888e27 100644 (file)
@@ -70,7 +70,6 @@ abstract class AbstractRequestScheduler <T> {
   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
index 0dd796fb070d4c0149232e7771cec83d01299fab..8927d53bb899031ec4d0e254e65a67a5b54b22c8 100644 (file)
@@ -61,16 +61,9 @@ class RequestScheduler extends AbstractRequestScheduler<RequestsGrouped> {
   }
 
   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<RequestsGrouped> {
 
     return db.Request.create(createQuery, dbRequestOptions)
       .then(request => {
-        return request.setPods(podIds, dbRequestOptions)
+        return request.setPods(toIds, dbRequestOptions)
       })
   }
 
index 0fa9ee9d2822932e50561f5a9eb130d9212fd61e..f58bea734b535f117c980229b9f841511a45cc52 100644 (file)
@@ -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)
     })
 }