diff --git a/app/lib/streams/parsers/doc/keyblock.js b/app/lib/streams/parsers/doc/keyblock.js index 6f8bdf90cfafb481894b31ded76f60180d0641a4..377de1d22b42cc95fd569cf37e323098c9e90dfa 100644 --- a/app/lib/streams/parsers/doc/keyblock.js +++ b/app/lib/streams/parsers/doc/keyblock.js @@ -114,6 +114,7 @@ function extractKeyChanges(raw) { var keychanges = []; var currentKC; var lines = raw.split(/\n/); + lines = lines.slice(0, lines.length - 1); var nbKeys = 0; lines.forEach(function(line){ if (line.match(/^#####----(F|N|U|L|B):[A-Z0-9]{40}----#####$/)) { diff --git a/app/service/KeychainService.js b/app/service/KeychainService.js index ef3ce86a117445f665549b33e0e04dbefd914a2e..f861ad5cb9da0bd96e0132f68d3d95954389d108 100644 --- a/app/service/KeychainService.js +++ b/app/service/KeychainService.js @@ -175,7 +175,7 @@ function KeyService (conn, conf, PublicKeyService) { checkPulseBlockKeychanges(block, done); } else if (current) { - done('Post-root blocks are not managed yet'); + checkNormalBlockKeychanges(block, done); } else { checkRootBlockKeychanges(block, function (err) { @@ -217,6 +217,29 @@ function KeyService (conn, conf, PublicKeyService) { }); } + function checkNormalBlockKeychanges(block, done) { + var newLinks = {}; + async.forEach(block.keysChanges, function(kc, callback){ + if (kc.type != 'U') { + callback('Only UPDATE block are managed for now'); + return; + } + async.waterfall([ + function (next){ + // Check keychange (certifications verification notably) + checkKeychange(block, kc, next); + }, + function (next){ + // Memorize new links from signatures + newLinks[kc.fingerprint] = kc.certifiers; + next(); + }, + ], callback); + }, function (err) { + done(err, newLinks); + }); + } + function checkKeychange (block, kc, done) { try { @@ -933,6 +956,8 @@ function KeyService (conn, conf, PublicKeyService) { block.version = 1; block.currency = current.currency; block.number = current.number + 1; + block.previousHash = current.hash; + block.previousIssuer = current.issuer; // Members merkle var stayers = members.slice(); // copy var leavers = leaving.slice(); // copy