From 9c90e0ee62b8f2cf02577bf77f57f24de134e558 Mon Sep 17 00:00:00 2001
From: cgeek <cem.moreau@gmail.com>
Date: Mon, 1 Feb 2016 12:53:37 +0100
Subject: [PATCH] Fix: network layer issue

---
 app/lib/entity/block.js             |  6 ++++-
 app/lib/entity/identity.js          |  2 ++
 app/lib/entity/membership.js        |  2 ++
 app/lib/entity/transaction.js       |  2 ++
 app/lib/streams/multicaster.js      | 40 +++++++++++++++++++----------
 app/lib/streams/parsers/http2raw.js |  9 ++++++-
 server.js                           |  4 +--
 test/integration/identity-test.js   |  2 +-
 8 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/app/lib/entity/block.js b/app/lib/entity/block.js
index cc82a3ee0..55314a71b 100644
--- a/app/lib/entity/block.js
+++ b/app/lib/entity/block.js
@@ -192,4 +192,8 @@ function Block(json) {
     });
     return transactions;
   };
-}
\ No newline at end of file
+}
+
+Block.statics = {};
+
+Block.statics.fromJSON = (json) => new Block(json);
diff --git a/app/lib/entity/identity.js b/app/lib/entity/identity.js
index de3fec8c6..12d3ac695 100644
--- a/app/lib/entity/identity.js
+++ b/app/lib/entity/identity.js
@@ -128,4 +128,6 @@ Identity.statics.toInline = function (entity) {
   return [entity.pubkey, entity.sig, moment(entity.time).unix(), entity.uid].join(':');
 };
 
+Identity.statics.fromJSON = (json) => new Identity(json);
+
 module.exports = Identity;
diff --git a/app/lib/entity/membership.js b/app/lib/entity/membership.js
index b312451ab..29aff5343 100644
--- a/app/lib/entity/membership.js
+++ b/app/lib/entity/membership.js
@@ -90,4 +90,6 @@ Membership.statics.toInline = function (entity) {
   return [entity.issuer, entity.signature, entity.number, entity.fpr, moment(entity.certts).unix(), entity.userid].join(':');
 };
 
+Membership.statics.fromJSON = (json) => new Membership(json);
+
 module.exports = Membership;
diff --git a/app/lib/entity/transaction.js b/app/lib/entity/transaction.js
index f151958a5..1546fe074 100644
--- a/app/lib/entity/transaction.js
+++ b/app/lib/entity/transaction.js
@@ -93,4 +93,6 @@ var Transaction = function(obj, currency) {
 
 Transaction.statics = {};
 
+Transaction.statics.fromJSON = (json) => new Transaction(json);
+
 module.exports = Transaction;
diff --git a/app/lib/streams/multicaster.js b/app/lib/streams/multicaster.js
index dcb47b993..38ab9af89 100644
--- a/app/lib/streams/multicaster.js
+++ b/app/lib/streams/multicaster.js
@@ -6,6 +6,10 @@ var request = require('request');
 var co      = require('co');
 var constants = require('../../lib/constants');
 var Peer    = require('../../lib/entity/peer');
+var Identity = require('../../lib/entity/identity');
+var Membership = require('../../lib/entity/membership');
+var Block = require('../../lib/entity/block');
+var Transaction = require('../../lib/entity/transaction');
 var logger  = require('../../lib/logger')('multicaster');
 
 const WITH_ISOLATION = true;
@@ -21,6 +25,7 @@ function Multicaster (isolate, timeout) {
   var that = this;
 
   let blockForward = forward({
+    transform: Block.statics.fromJSON,
     type: 'Block',
     uri: '/blockchain/block',
     getObj: (block) => {
@@ -32,6 +37,7 @@ function Multicaster (isolate, timeout) {
   });
 
   let idtyForward = forward({
+    transform: Identity.statics.fromJSON,
     type: 'Identity',
     uri: '/wot/add',
     getObj: (idty) => {
@@ -45,6 +51,7 @@ function Multicaster (isolate, timeout) {
   });
 
   let txForward = forward({
+    transform: Transaction.statics.fromJSON,
     type: 'Transaction',
     uri: '/tx/process',
     getObj: (transaction) => {
@@ -69,6 +76,7 @@ function Multicaster (isolate, timeout) {
   });
 
   let msForward = forward({
+    transform: Membership.statics.fromJSON,
     type: 'Membership',
     uri: '/blockchain/membership',
     getObj: (membership) => {
@@ -96,22 +104,26 @@ function Multicaster (isolate, timeout) {
   function forward(params) {
     return function(doc, peers) {
       return co(function *() {
-        if(!params.withIsolation || !isolate) {
-          let theDoc = params.transform ? params.transform(doc) : doc;
-          logger.debug('--> new %s to be sent to %s peer(s)', params.type, peers.length);
-          if (params.getDocID) {
-            logger.info('POST %s %s', params.type, params.getDocID(theDoc));
+        try {
+          if(!params.withIsolation || !isolate) {
+            let theDoc = params.transform ? params.transform(doc) : doc;
+            logger.debug('--> new %s to be sent to %s peer(s)', params.type, peers.length);
+            if (params.getDocID) {
+              logger.info('POST %s %s', params.type, params.getDocID(theDoc));
+            } else {
+              logger.info('POST %s', params.type);
+            }
+            for (let i = 0, len = peers.length; i < len; i++) {
+              let p = peers[i];
+              let peer = Peer.statics.peerize(p);
+              logger.debug(' `--> to peer %s [%s] (%s)', peer.keyID(), peer.member ? 'member' : '------', peer.getNamedURL());
+              yield post(peer, params.uri, params.getObj(theDoc));
+            }
           } else {
-            logger.info('POST %s', params.type);
+            logger.debug('[ISOLATE] Prevent --> new Peer to be sent to %s peer(s)', peers.length);
           }
-          for (let i = 0, len = peers.length; i < len; i++) {
-            let p = peers[i];
-            let peer = Peer.statics.peerize(p);
-            logger.debug(' `--> to peer %s [%s] (%s)', peer.keyID(), peer.member ? 'member' : '------', peer.getNamedURL());
-            yield post(peer, params.uri, params.getObj(theDoc));
-          }
-        } else {
-          logger.debug('[ISOLATE] Prevent --> new Peer to be sent to %s peer(s)', peers.length);
+        } catch (err) {
+          logger.error(err);
         }
       });
     };
diff --git a/app/lib/streams/parsers/http2raw.js b/app/lib/streams/parsers/http2raw.js
index a9fcfdc7f..8e9f937d7 100644
--- a/app/lib/streams/parsers/http2raw.js
+++ b/app/lib/streams/parsers/http2raw.js
@@ -73,7 +73,14 @@ function Http2RawMembership (req) {
   if(!(req.body && req.body.membership)){
     throw constants.ERRORS.HTTP_PARAM_MEMBERSHIP_REQUIRED;
   }
-  return req.body.membership;
+  let ms = req.body.membership;
+  if(req.body && req.body.signature){
+    ms = [ms, req.body.signature].join('');
+    if (!ms.match(/\n$/)) {
+      ms += '\n';
+    }
+  }
+  return ms;
 }
 
 function Http2RawBlock (req) {
diff --git a/server.js b/server.js
index 30c82ebce..434e90dfb 100644
--- a/server.js
+++ b/server.js
@@ -82,8 +82,8 @@ function Server (dbConf, overrideConf) {
         }
         if (res) {
           // Only emit valid documents
-          that.emit(obj.documentType, res);
-          that.push(res);
+          that.emit(obj.documentType, _.clone(res));
+          that.push(_.clone(res));
         }
         isInnerWrite ? done(null, res) : done();
       } catch (err) {
diff --git a/test/integration/identity-test.js b/test/integration/identity-test.js
index b0d1f52d9..bbc8e9ea8 100644
--- a/test/integration/identity-test.js
+++ b/test/integration/identity-test.js
@@ -360,7 +360,7 @@ describe("Identities", function() {
 
   it('difficulties', function() {
     return expectAnswer(rp('http://127.0.0.1:7799/blockchain/difficulties', { json: true }), function(res) {
-      res.should.have.property('block').equal(1);
+      res.should.have.property('block').equal(2);
       res.should.have.property('levels').length(1);
       res.levels[0].should.have.property('uid').equal('cat');
       res.levels[0].should.have.property('level').equal(0);
-- 
GitLab