Skip to content
Snippets Groups Projects
Commit 5bdf39d3 authored by Cédric Moreau's avatar Cédric Moreau
Browse files

Added time reference in Block & Status documents

parent 4326ddac
Branches
Tags
No related merge requests found
...@@ -13,6 +13,7 @@ var link2pubkey = require('../lib/streams/link2pubkey'); ...@@ -13,6 +13,7 @@ var link2pubkey = require('../lib/streams/link2pubkey');
var extractSignature = require('../lib/streams/extractSignature'); var extractSignature = require('../lib/streams/extractSignature');
var verifySignature = require('../lib/streams/verifySignature'); var verifySignature = require('../lib/streams/verifySignature');
var logger = require('../lib/logger'); var logger = require('../lib/logger');
var constants = require('../lib/constants');
var plogger = logger('peering'); var plogger = logger('peering');
var slogger = logger('status'); var slogger = logger('status');
...@@ -87,36 +88,45 @@ function NetworkBinding (peerServer, conf) { ...@@ -87,36 +88,45 @@ function NetworkBinding (peerServer, conf) {
var onError = http400(res); var onError = http400(res);
async.waterfall([ async.waterfall([
function (next) { function (next) {
function errorPeer (err) {
if (err == constants.ERROR.PEER.ALREADY_RECORDED)
next();
else
next(err);
}
// If peer is provided, parse it first // If peer is provided, parse it first
if (req.body && req.body.peer) { if (req.body && req.body.peer) {
http2raw.peer(req, onError) http2raw.peer(req, errorPeer)
.pipe(dos2unix()) .pipe(dos2unix())
.pipe(parsers.parsePeer(onError)) .pipe(parsers.parsePeer(errorPeer))
.pipe(versionFilter(onError)) .pipe(versionFilter(errorPeer))
.pipe(currencyFilter(conf.currency, onError)) .pipe(currencyFilter(conf.currency, errorPeer))
// .pipe(verifySignature(onError)) // .pipe(verifySignature(errorPeer))
.pipe(peerServer.singleWriteStream(onError)) .pipe(peerServer.singleWriteStream(errorPeer))
.pipe(es.mapSync(function () { .pipe(es.mapSync(function (data) {
next(); next();
})) }))
} }
else next(); else next();
}, },
function (next) { function (next) {
http2raw.status(req, onError) http2raw.status(req, next)
.pipe(dos2unix()) .pipe(dos2unix())
.pipe(parsers.parseStatus(onError)) .pipe(parsers.parseStatus(next))
.pipe(versionFilter(onError)) .pipe(versionFilter(next))
.pipe(currencyFilter(conf.currency, onError)) .pipe(currencyFilter(conf.currency, next))
// .pipe(extractSignature(onError)) // .pipe(extractSignature(next))
// .pipe(link2pubkey(peerServer.PublicKeyService, onError)) // .pipe(link2pubkey(peerServer.PublicKeyService, next))
// .pipe(verifySignature(onError)) // .pipe(verifySignature(next))
.pipe(peerServer.singleWriteStream(onError)) .pipe(peerServer.singleWriteStream(next))
.pipe(jsoner()) .pipe(jsoner())
.pipe(es.stringify()) .pipe(es.stringify())
.pipe(res); .pipe(res);
next(); next();
} }
]); ], function (err) {
if (err)
onError(err);
});
} }
} }
...@@ -20,6 +20,9 @@ module.exports = { ...@@ -20,6 +20,9 @@ module.exports = {
PUBKEY: { PUBKEY: {
ALREADY_UPDATED: 1 ALREADY_UPDATED: 1
},
PEER: {
ALREADY_RECORDED: 'Peer document is older than currently recorded'
} }
}, },
...@@ -69,6 +72,14 @@ module.exports = { ...@@ -69,6 +72,14 @@ module.exports = {
TARGET: exact(PUBKEY + ":" + POSITIVE_INT), TARGET: exact(PUBKEY + ":" + POSITIVE_INT),
COMMENT: find("Comment: (" + COMMENT + ")"), COMMENT: find("Comment: (" + COMMENT + ")"),
}, },
PEER: {
BLOCK: find("Block: (" + INTEGER + "-" + FINGERPRINT + ")"),
SPECIAL_BLOCK: '0-DA39A3EE5E6B4B0D3255BFEF95601890AFD80709'
},
STATUS: {
BLOCK: find("Block: (" + INTEGER + "-" + FINGERPRINT + ")"),
SPECIAL_BLOCK: '0-DA39A3EE5E6B4B0D3255BFEF95601890AFD80709'
},
setUDID2Format: function () { setUDID2Format: function () {
module.exports.USER_ID = module.exports.UDID2_FORMAT; module.exports.USER_ID = module.exports.UDID2_FORMAT;
......
...@@ -33,6 +33,7 @@ module.exports = new function() { ...@@ -33,6 +33,7 @@ module.exports = new function() {
raw += "Type: Peer\n"; raw += "Type: Peer\n";
raw += "Currency: " + json.currency + "\n"; raw += "Currency: " + json.currency + "\n";
raw += "PublicKey: " + json.pub + "\n"; raw += "PublicKey: " + json.pub + "\n";
raw += "Block: " + json.block + "\n";
raw += "Endpoints:" + "\n"; raw += "Endpoints:" + "\n";
json.endpoints.forEach(function(ep){ json.endpoints.forEach(function(ep){
raw += ep + "\n"; raw += ep + "\n";
...@@ -50,6 +51,7 @@ module.exports = new function() { ...@@ -50,6 +51,7 @@ module.exports = new function() {
raw += "Type: Status\n"; raw += "Type: Status\n";
raw += "Currency: " + json.currency + "\n"; raw += "Currency: " + json.currency + "\n";
raw += "Status: " + json.status + "\n"; raw += "Status: " + json.status + "\n";
raw += "Block: " + json.block + "\n";
raw += "From: " + json.from + "\n"; raw += "From: " + json.from + "\n";
raw += "To: " + json.to + "\n"; raw += "To: " + json.to + "\n";
return dos2unix(raw); return dos2unix(raw);
......
...@@ -17,7 +17,7 @@ function PeerParser (onError) { ...@@ -17,7 +17,7 @@ function PeerParser (onError) {
{prop: "version", regexp: /Version: (.*)/}, {prop: "version", regexp: /Version: (.*)/},
{prop: "currency", regexp: /Currency: (.*)/}, {prop: "currency", regexp: /Currency: (.*)/},
{prop: "pub", regexp: /PublicKey: (.*)/}, {prop: "pub", regexp: /PublicKey: (.*)/},
{prop: "time", regexp: /Time: (.*)/}, {prop: "block", regexp: constants.PEER.BLOCK},
{prop: "endpoints", regexp: /Endpoints:\n([\s\S]*)/, parser: split("\n")}, {prop: "endpoints", regexp: /Endpoints:\n([\s\S]*)/, parser: split("\n")},
]; ];
var multilineFields = []; var multilineFields = [];
...@@ -59,6 +59,7 @@ function PeerParser (onError) { ...@@ -59,6 +59,7 @@ function PeerParser (onError) {
'BAD_IPV6': 154, 'BAD_IPV6': 154,
'BAD_PORT': 155, 'BAD_PORT': 155,
'BAD_FINGERPRINT': 156, 'BAD_FINGERPRINT': 156,
'BAD_BLOCK': 157,
'NO_IP_GIVEN': 158 'NO_IP_GIVEN': 158
} }
if(!err){ if(!err){
...@@ -71,6 +72,11 @@ function PeerParser (onError) { ...@@ -71,6 +72,11 @@ function PeerParser (onError) {
if(!obj.pub || !obj.pub.match(constants.BASE58)) if(!obj.pub || !obj.pub.match(constants.BASE58))
err = {code: codes['BAD_FINGERPRINT'], message: "Incorrect PublicKey field"}; err = {code: codes['BAD_FINGERPRINT'], message: "Incorrect PublicKey field"};
} }
if(!err){
// Block
if(!obj.block)
err = {code: codes['BAD_BLOCK'], message: "Incorrect Block field"};
}
// Basic Merkled API requirements // Basic Merkled API requirements
var bma = obj.getBMA(); var bma = obj.getBMA();
if(!err){ if(!err){
......
...@@ -15,7 +15,7 @@ function StatusParser (onError) { ...@@ -15,7 +15,7 @@ function StatusParser (onError) {
{prop: "version", regexp: /Version: (.*)/}, {prop: "version", regexp: /Version: (.*)/},
{prop: "currency", regexp: /Currency: (.*)/}, {prop: "currency", regexp: /Currency: (.*)/},
{prop: "status", regexp: /Status: (.*)/}, {prop: "status", regexp: /Status: (.*)/},
{prop: "time", regexp: /Time: (.*)/, parser: parseDateFromTimestamp}, {prop: "block", regexp: constants.STATUS.BLOCK},
{prop: "from", regexp: /From: (.*)/}, {prop: "from", regexp: /From: (.*)/},
{prop: "to", regexp: /To: (.*)/}, {prop: "to", regexp: /To: (.*)/},
]; ];
...@@ -59,8 +59,4 @@ function StatusParser (onError) { ...@@ -59,8 +59,4 @@ function StatusParser (onError) {
}; };
} }
function parseDateFromTimestamp (value) {
return new Date(parseInt(value)*1000);
}
util.inherits(StatusParser, GenericParser); util.inherits(StatusParser, GenericParser);
...@@ -23,7 +23,10 @@ var PeerSchema = new Schema({ ...@@ -23,7 +23,10 @@ var PeerSchema = new Schema({
endpoints: [String], endpoints: [String],
signature: String, signature: String,
hash: String, hash: String,
status: { type: String, default: STATUS.NOTHING }, hash: String,
block: { type: String },
statusBlock: { type: String },
status: { type: String },
statusSent: { type: String, default: STATUS.NOTHING }, statusSent: { type: String, default: STATUS.NOTHING },
statusSigDate: { type: Date, default: function(){ return new Date(0); } }, statusSigDate: { type: Date, default: function(){ return new Date(0); } },
propagated: { type: Boolean, default: false }, propagated: { type: Boolean, default: false },
...@@ -64,14 +67,14 @@ PeerSchema.methods = { ...@@ -64,14 +67,14 @@ PeerSchema.methods = {
copyValues: function(to) { copyValues: function(to) {
var obj = this; var obj = this;
["version", "currency", "pub", "endpoints", "hash", "status", "signature"].forEach(function (key) { ["version", "currency", "pub", "endpoints", "hash", "status", "block", "signature"].forEach(function (key) {
to[key] = obj[key]; to[key] = obj[key];
}); });
}, },
copyValuesFrom: function(from) { copyValuesFrom: function(from) {
var obj = this; var obj = this;
["version", "currency", "pub", "endpoints", "signature"].forEach(function (key) { ["version", "currency", "pub", "endpoints", "block", "signature"].forEach(function (key) {
obj[key] = from[key]; obj[key] = from[key];
}); });
}, },
...@@ -79,7 +82,7 @@ PeerSchema.methods = { ...@@ -79,7 +82,7 @@ PeerSchema.methods = {
json: function() { json: function() {
var obj = this; var obj = this;
var json = {}; var json = {};
["version", "currency", "endpoints", "status", "signature"].forEach(function (key) { ["version", "currency", "endpoints", "status", "block", "signature"].forEach(function (key) {
json[key] = obj[key]; json[key] = obj[key];
}); });
json.raw = this.getRaw(); json.raw = this.getRaw();
......
...@@ -6,13 +6,13 @@ var _ = require('underscore'); ...@@ -6,13 +6,13 @@ var _ = require('underscore');
module.exports = function StatusMessage (values) { module.exports = function StatusMessage (values) {
var that = this; var that = this;
['version', 'currency', 'status', 'from', 'to', 'hash', 'pubkey', 'time', 'signature'].forEach(function(field){ ['version', 'currency', 'status', 'from', 'to', 'hash', 'pubkey', 'block', 'signature'].forEach(function(field){
that[field] = values && values[field] || ''; that[field] = values && values[field] || '';
}); });
this.json = function () { this.json = function () {
var obj = {}; var obj = {};
['version', 'currency', 'status', 'from', 'to', 'signature'].forEach(function(field){ ['version', 'currency', 'status', 'from', 'to', 'block', 'signature'].forEach(function(field){
obj[field] = that[field] || ''; obj[field] = that[field] || '';
}); });
obj.raw = this.getRaw(); obj.raw = this.getRaw();
......
...@@ -7,12 +7,14 @@ var Status = require('../models/statusMessage'); ...@@ -7,12 +7,14 @@ var Status = require('../models/statusMessage');
var logger = require('../lib/logger')('peering'); var logger = require('../lib/logger')('peering');
var base58 = require('../lib/base58'); var base58 = require('../lib/base58');
var moment = require('moment'); var moment = require('moment');
var constants = require('../lib/constants');
var localValidator = require('../lib/localValidator'); var localValidator = require('../lib/localValidator');
function PeeringService(conn, conf, pair, signFunc, ParametersService) { function PeeringService(conn, conf, pair, signFunc, ParametersService) {
var currency = conf.currency; var currency = conf.currency;
var Block = conn.model('Block');
var Transaction = conn.model('Transaction'); var Transaction = conn.model('Transaction');
var Merkle = conn.model('Merkle'); var Merkle = conn.model('Merkle');
var Peer = conn.model('Peer'); var Peer = conn.model('Peer');
...@@ -71,12 +73,20 @@ function PeeringService(conn, conf, pair, signFunc, ParametersService) { ...@@ -71,12 +73,20 @@ function PeeringService(conn, conf, pair, signFunc, ParametersService) {
this.submit = function(peering, callback){ this.submit = function(peering, callback){
var peer = new Peer(peering); var peer = new Peer(peering);
var sp = peer.block.split('-');
var number = sp[0], fpr = sp[1];
async.waterfall([ async.waterfall([
function (next) { function (next) {
localValidator(null).checkPeerSignature(peer, next); localValidator(null).checkPeerSignature(peer, next);
}, },
function (next) { function (next) {
that.addPeer(peer); if (peer.block == constants.PEER.SPECIAL_BLOCK)
next(null, null);
else
// Check if document is based upon an existing block as time reference
Block.findByNumberAndHash(number, fpr, next);
},
function (block, next){
Peer.find({ pub: peer.pub }, next); Peer.find({ pub: peer.pub }, next);
}, },
function (peers, next){ function (peers, next){
...@@ -84,8 +94,10 @@ function PeeringService(conn, conf, pair, signFunc, ParametersService) { ...@@ -84,8 +94,10 @@ function PeeringService(conn, conf, pair, signFunc, ParametersService) {
var previousHash = null; var previousHash = null;
if(peers.length > 0){ if(peers.length > 0){
// Already existing peer // Already existing peer
if(peers[0].sigDate > peerEntity.sigDate){ var sp2 = peers[0].block.split('-');
next('Cannot record a previous peering'); var number2 = sp2[0], fpr2 = sp2[1];
if(number <= number2){
next(constants.ERROR.PEER.ALREADY_RECORDED);
return; return;
} }
peerEntity = peers[0]; peerEntity = peers[0];
...@@ -108,19 +120,32 @@ function PeeringService(conn, conf, pair, signFunc, ParametersService) { ...@@ -108,19 +120,32 @@ function PeeringService(conn, conf, pair, signFunc, ParametersService) {
var status = new Status(obj); var status = new Status(obj);
var peer; var peer;
var wasStatus = null; var wasStatus = null;
var sp = status.block.split('-');
var number = sp[0], fpr = sp[1];
async.waterfall([ async.waterfall([
function (next) { function (next) {
localValidator(null).checkStatusSignature(status, next); localValidator(null).checkStatusSignature(status, next);
}, },
function (next) { function (next) {
if (status.block == constants.STATUS.SPECIAL_BLOCK)
next(null, null);
else
// Check if document is based upon an existing block as time reference
Block.findByNumberAndHash(number, fpr, next);
},
function (block, next){
Peer.getTheOne(status.from, next); Peer.getTheOne(status.from, next);
}, },
function (theOne, next){ function (theOne, next){
peer = theOne; peer = theOne;
if (peer.statusSigDate > status.sigDate) { if (peer.statusBlock) {
var sp2 = peer.statusBlock.split('-');
var number2 = sp2[0], fpr2 = sp2[1];
if(number <= number2){
next('Old status given'); next('Old status given');
return; return;
} }
}
wasStatus = peer.status; wasStatus = peer.status;
peer.statusSigDate = status.sigDate; peer.statusSigDate = status.sigDate;
peers[peer.pub] = peers[peer.pub] || peer; peers[peer.pub] = peers[peer.pub] || peer;
...@@ -220,7 +245,14 @@ function PeeringService(conn, conf, pair, signFunc, ParametersService) { ...@@ -220,7 +245,14 @@ function PeeringService(conn, conf, pair, signFunc, ParametersService) {
* @param pubs List of peers' pubs to which status is to be sent * @param pubs List of peers' pubs to which status is to be sent
*/ */
this.sendStatusTo = function (statusStr, pubs, done) { this.sendStatusTo = function (statusStr, pubs, done) {
var current = null;
async.waterfall([ async.waterfall([
function (next) {
Block.current(function (err, block) {
current = block;
next();
});
},
async.apply(Peer.getList.bind(Peer), pubs), async.apply(Peer.getList.bind(Peer), pubs),
function (peers, next) { function (peers, next) {
async.forEach(peers, function(peer, callback){ async.forEach(peers, function(peer, callback){
...@@ -229,6 +261,7 @@ function PeeringService(conn, conf, pair, signFunc, ParametersService) { ...@@ -229,6 +261,7 @@ function PeeringService(conn, conf, pair, signFunc, ParametersService) {
currency: currency, currency: currency,
time: new Date(moment.utc().unix()*1000), time: new Date(moment.utc().unix()*1000),
status: statusStr, status: statusStr,
block: current ? [current.number, current.hash].join('-') : '0-DA39A3EE5E6B4B0D3255BFEF95601890AFD80709',
from: selfPubkey, from: selfPubkey,
to: peer.pub to: peer.pub
}); });
......
...@@ -9,6 +9,7 @@ var WOTServer = require('./wotserver'); ...@@ -9,6 +9,7 @@ var WOTServer = require('./wotserver');
var signature = require('./app/lib/signature'); var signature = require('./app/lib/signature');
var parsers = require('./app/lib/streams/parsers/doc'); var parsers = require('./app/lib/streams/parsers/doc');
var multicaster = require('./app/lib/streams/multicaster'); var multicaster = require('./app/lib/streams/multicaster');
var constants = require('./app/lib/constants');
function PeerServer (dbConf, overrideConf, interceptors, onInit) { function PeerServer (dbConf, overrideConf, interceptors, onInit) {
...@@ -244,8 +245,13 @@ function PeerServer (dbConf, overrideConf, interceptors, onInit) { ...@@ -244,8 +245,13 @@ function PeerServer (dbConf, overrideConf, interceptors, onInit) {
this.initPeeringEntry = function (conn, conf, done) { this.initPeeringEntry = function (conn, conf, done) {
var Peer = conn.model('Peer'); var Peer = conn.model('Peer');
var currency = conf.currency; var currency = conf.currency;
var current = null;
async.waterfall([ async.waterfall([
function (next) { function (next) {
that.BlockchainService.current(next);
},
function (currentBlock, next) {
current = currentBlock;
Peer.find({ pub: that.PeeringService.pubkey }, next); Peer.find({ pub: that.PeeringService.pubkey }, next);
}, },
function (peers, next) { function (peers, next) {
...@@ -270,6 +276,7 @@ function PeerServer (dbConf, overrideConf, interceptors, onInit) { ...@@ -270,6 +276,7 @@ function PeerServer (dbConf, overrideConf, interceptors, onInit) {
version: 1, version: 1,
currency: currency, currency: currency,
pub: that.PeeringService.pubkey, pub: that.PeeringService.pubkey,
block: current ? [current.number, current.hash].join('-') : constants.PEER.SPECIAL_BLOCK,
endpoints: [endpoint] endpoints: [endpoint]
}; };
var raw1 = p1.getRaw().dos2unix(); var raw1 = p1.getRaw().dos2unix();
......
...@@ -12,6 +12,7 @@ var rawPeer = "" + ...@@ -12,6 +12,7 @@ var rawPeer = "" +
"Type: Peer\n" + "Type: Peer\n" +
"Currency: beta_brousouf\n" + "Currency: beta_brousouf\n" +
"PublicKey: 3Z7w5g4gC9oxwEbATnmK2UFgGWhLZPmZQb5dRxvNrXDu\n" + "PublicKey: 3Z7w5g4gC9oxwEbATnmK2UFgGWhLZPmZQb5dRxvNrXDu\n" +
"Block: 0-DA39A3EE5E6B4B0D3255BFEF95601890AFD80709\n" +
"Endpoints:\n" + "Endpoints:\n" +
"BASIC_MERKLED_API ucoin.twiced.fr 88.163.127.43 9101\n" + "BASIC_MERKLED_API ucoin.twiced.fr 88.163.127.43 9101\n" +
"OTHER_PROTOCOL 88.163.127.43 9102\n" + "OTHER_PROTOCOL 88.163.127.43 9102\n" +
......
...@@ -12,7 +12,7 @@ var rawStatus = "" + ...@@ -12,7 +12,7 @@ var rawStatus = "" +
"Type: Status\n" + "Type: Status\n" +
"Currency: beta_brousouf\n" + "Currency: beta_brousouf\n" +
"Status: UP\n" + "Status: UP\n" +
"Time: 1414937786\n" + "Block: 0-DA39A3EE5E6B4B0D3255BFEF95601890AFD80709\n" +
"From: 3Z7w5g4gC9oxwEbATnmK2UFgGWhLZPmZQb5dRxvNrXDu\n" + "From: 3Z7w5g4gC9oxwEbATnmK2UFgGWhLZPmZQb5dRxvNrXDu\n" +
"To: 6GCnm36t4DnvoJshCYS13i64PxsqyJnGxuNXkzt9Rkh7\n" + "To: 6GCnm36t4DnvoJshCYS13i64PxsqyJnGxuNXkzt9Rkh7\n" +
"bvuKzc6+cGWMGC8FIkZHN8kdQhaRL/MK60KYyw5vJqkKEgxXbygQHAzfoojeSY4gPKIu4FggBkR1HndSEm2FAQ==\n"; "bvuKzc6+cGWMGC8FIkZHN8kdQhaRL/MK60KYyw5vJqkKEgxXbygQHAzfoojeSY4gPKIu4FggBkR1HndSEm2FAQ==\n";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment