chore: address review

This commit is contained in:
Vasco Santos 2020-06-24 15:54:24 +02:00 committed by Jacob Heun
parent 8a97dded26
commit 1d318e12d8
3 changed files with 47 additions and 114 deletions

View File

@ -8,5 +8,5 @@ module.exports.MULTICODEC_IDENTIFY = '/p2p/id/1.1.0'
module.exports.MULTICODEC_IDENTIFY_PUSH = '/p2p/id/push/1.1.0' module.exports.MULTICODEC_IDENTIFY_PUSH = '/p2p/id/push/1.1.0'
// Legacy // Legacy
module.exports.MULTICODEC_IDENTIFY_LEGACY = '/ipfs/id/1.0.0' module.exports.MULTICODEC_IDENTIFY_1_0_0 = '/ipfs/id/1.0.0'
module.exports.MULTICODEC_IDENTIFY_PUSH_LEGACY = '/ipfs/id/push/1.0.0' module.exports.MULTICODEC_IDENTIFY_PUSH_1_0_0 = '/ipfs/id/push/1.0.0'

View File

@ -22,9 +22,9 @@ const PeerRecord = require('../record/peer-record')
const { const {
MULTICODEC_IDENTIFY, MULTICODEC_IDENTIFY,
MULTICODEC_IDENTIFY_LEGACY, MULTICODEC_IDENTIFY_1_0_0,
MULTICODEC_IDENTIFY_PUSH, MULTICODEC_IDENTIFY_PUSH,
MULTICODEC_IDENTIFY_PUSH_LEGACY, MULTICODEC_IDENTIFY_PUSH_1_0_0,
AGENT_VERSION, AGENT_VERSION,
PROTOCOL_VERSION PROTOCOL_VERSION
} = require('./consts') } = require('./consts')
@ -97,26 +97,12 @@ class IdentifyService {
push (connections) { push (connections) {
const pushes = connections.map(async connection => { const pushes = connections.map(async connection => {
try { try {
const { protocol, stream } = await connection.newStream([MULTICODEC_IDENTIFY_PUSH, MULTICODEC_IDENTIFY_PUSH_LEGACY]) const { stream } = await connection.newStream([MULTICODEC_IDENTIFY_PUSH, MULTICODEC_IDENTIFY_PUSH_1_0_0])
const signedPeerRecord = await this._getSelfPeerRecord()
// Handle Legacy
if (protocol === MULTICODEC_IDENTIFY_PUSH_LEGACY) {
return pipe(
[{
listenAddrs: this._libp2p.multiaddrs.map((ma) => ma.buffer),
protocols: Array.from(this._protocols.keys())
}],
pb.encode(Message),
stream,
consume
)
}
const envelope = await this._getSelfPeerRecord()
const signedPeerRecord = envelope.marshal()
await pipe( await pipe(
[{ [{
listenAddrs: this._libp2p.multiaddrs.map((ma) => ma.buffer),
signedPeerRecord, signedPeerRecord,
protocols: Array.from(this._protocols.keys()) protocols: Array.from(this._protocols.keys())
}], }],
@ -159,7 +145,7 @@ class IdentifyService {
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
async identify (connection) { async identify (connection) {
const { protocol, stream } = await connection.newStream([MULTICODEC_IDENTIFY, MULTICODEC_IDENTIFY_LEGACY]) const { protocol, stream } = await connection.newStream([MULTICODEC_IDENTIFY, MULTICODEC_IDENTIFY_1_0_0])
const [data] = await pipe( const [data] = await pipe(
[], [],
stream, stream,
@ -198,7 +184,7 @@ class IdentifyService {
observedAddr = IdentifyService.getCleanMultiaddr(observedAddr) observedAddr = IdentifyService.getCleanMultiaddr(observedAddr)
// LEGACY: differentiate message with SignedPeerRecord // LEGACY: differentiate message with SignedPeerRecord
if (protocol === MULTICODEC_IDENTIFY_LEGACY) { if (protocol === MULTICODEC_IDENTIFY_1_0_0) {
// Update peers data in PeerStore // Update peers data in PeerStore
this.peerStore.addressBook.set(id, listenAddrs.map((addr) => multiaddr(addr))) this.peerStore.addressBook.set(id, listenAddrs.map((addr) => multiaddr(addr)))
this.peerStore.protoBook.set(id, protocols) this.peerStore.protoBook.set(id, protocols)
@ -250,13 +236,11 @@ class IdentifyService {
handleMessage ({ connection, stream, protocol }) { handleMessage ({ connection, stream, protocol }) {
switch (protocol) { switch (protocol) {
case MULTICODEC_IDENTIFY: case MULTICODEC_IDENTIFY:
case MULTICODEC_IDENTIFY_1_0_0:
return this._handleIdentify({ connection, stream }) return this._handleIdentify({ connection, stream })
case MULTICODEC_IDENTIFY_LEGACY:
return this._handleIdentifyLegacy({ connection, stream })
case MULTICODEC_IDENTIFY_PUSH: case MULTICODEC_IDENTIFY_PUSH:
case MULTICODEC_IDENTIFY_PUSH_1_0_0:
return this._handlePush({ connection, stream }) return this._handlePush({ connection, stream })
case MULTICODEC_IDENTIFY_PUSH_LEGACY:
return this._handlePushLegacy({ connection, stream })
default: default:
log.error('cannot handle unknown protocol %s', protocol) log.error('cannot handle unknown protocol %s', protocol)
} }
@ -276,45 +260,14 @@ class IdentifyService {
publicKey = this.peerId.pubKey.bytes publicKey = this.peerId.pubKey.bytes
} }
const envelope = await this._getSelfPeerRecord() const signedPeerRecord = await this._getSelfPeerRecord()
const signedPeerRecord = envelope.marshal()
const message = Message.encode({
protocolVersion: PROTOCOL_VERSION,
agentVersion: AGENT_VERSION,
publicKey,
signedPeerRecord,
observedAddr: connection.remoteAddr.buffer,
protocols: Array.from(this._protocols.keys())
})
pipe(
[message],
lp.encode(),
stream,
consume
)
}
/**
* Sends the `Identify` response with listen addresses (LEGACY)
* to the requesting peer over the given `connection`
* @private
* @param {object} options
* @param {*} options.stream
* @param {Connection} options.connection
*/
_handleIdentifyLegacy ({ connection, stream }) {
let publicKey = Buffer.alloc(0)
if (this.peerId.pubKey) {
publicKey = this.peerId.pubKey.bytes
}
const message = Message.encode({ const message = Message.encode({
protocolVersion: PROTOCOL_VERSION, protocolVersion: PROTOCOL_VERSION,
agentVersion: AGENT_VERSION, agentVersion: AGENT_VERSION,
publicKey, publicKey,
listenAddrs: this._libp2p.multiaddrs.map((ma) => ma.buffer), listenAddrs: this._libp2p.multiaddrs.map((ma) => ma.buffer),
signedPeerRecord,
observedAddr: connection.remoteAddr.buffer, observedAddr: connection.remoteAddr.buffer,
protocols: Array.from(this._protocols.keys()) protocols: Array.from(this._protocols.keys())
}) })
@ -354,6 +307,22 @@ class IdentifyService {
return log.error('received invalid message', err) return log.error('received invalid message', err)
} }
const id = connection.remotePeer
// Legacy
if (!message.signedPeerRecord) {
try {
this.peerStore.addressBook.set(id, message.listenAddrs.map((addr) => multiaddr(addr)))
} catch (err) {
return log.error('received invalid listen addrs', err)
}
// Update the protocols
this.peerStore.protoBook.set(id, message.protocols)
return
}
// Open envelope and verify if is authenticated // Open envelope and verify if is authenticated
let envelope let envelope
try { try {
@ -373,7 +342,6 @@ class IdentifyService {
} }
// Update peers data in PeerStore // Update peers data in PeerStore
const id = connection.remotePeer
try { try {
// TODO: Store as certified record // TODO: Store as certified record
@ -387,45 +355,8 @@ class IdentifyService {
} }
/** /**
* Reads the Identify Push message from the given `connection` * Get self signed peer record raw envelope.
* with listen addresses (LEGACY) * @return {Buffer}
* @private
* @param {object} options
* @param {*} options.stream
* @param {Connection} options.connection
*/
async _handlePushLegacy ({ connection, stream }) {
const [data] = await pipe(
[],
stream,
lp.decode(),
take(1),
toBuffer,
collect
)
let message
try {
message = Message.decode(data)
} catch (err) {
return log.error('received invalid message', err)
}
// Update peers data in PeerStore
const id = connection.remotePeer
try {
this.peerStore.addressBook.set(id, message.listenAddrs.map((addr) => multiaddr(addr)))
} catch (err) {
return log.error('received invalid listen addrs', err)
}
// Update the protocols
this.peerStore.protoBook.set(id, message.protocols)
}
/**
* Get self signed peer record envelope.
* @return {Envelope}
*/ */
async _getSelfPeerRecord () { async _getSelfPeerRecord () {
// TODO: Verify if updated // TODO: Verify if updated
@ -437,7 +368,9 @@ class IdentifyService {
peerId: this.peerId, peerId: this.peerId,
multiaddrs: this._libp2p.multiaddrs multiaddrs: this._libp2p.multiaddrs
}) })
this._selfRecord = await Envelope.seal(peerRecord, this.peerId) const envelope = await Envelope.seal(peerRecord, this.peerId)
this._selfRecord = envelope.marshal()
return this._selfRecord return this._selfRecord
} }
@ -450,8 +383,8 @@ module.exports.IdentifyService = IdentifyService
*/ */
module.exports.multicodecs = { module.exports.multicodecs = {
IDENTIFY: MULTICODEC_IDENTIFY, IDENTIFY: MULTICODEC_IDENTIFY,
IDENTIFY_LEGACY: MULTICODEC_IDENTIFY_LEGACY, IDENTIFY_1_0_0: MULTICODEC_IDENTIFY_1_0_0,
IDENTIFY_PUSH: MULTICODEC_IDENTIFY_PUSH, IDENTIFY_PUSH: MULTICODEC_IDENTIFY_PUSH,
IDENTIFY_PUSH_LEGACY: MULTICODEC_IDENTIFY_PUSH_LEGACY IDENTIFY_PUSH_1_0_0: MULTICODEC_IDENTIFY_PUSH_1_0_0
} }
module.exports.Message = Message module.exports.Message = Message

View File

@ -31,8 +31,8 @@ const protocols = new Map([
]) ])
const protocolsLegacy = new Map([ const protocolsLegacy = new Map([
[multicodecs.IDENTIFY_LEGACY, () => { }], [multicodecs.IDENTIFY_1_0_0, () => { }],
[multicodecs.IDENTIFY_PUSH_LEGACY, () => { }] [multicodecs.IDENTIFY_PUSH_1_0_0, () => { }]
]) ])
describe('Identify', () => { describe('Identify', () => {
@ -50,7 +50,7 @@ describe('Identify', () => {
sinon.restore() sinon.restore()
}) })
it('should be able to identify another peer with legacy protocol', async () => { it('should be able to identify another peer with 1.0.0 legacy protocol', async () => {
const localIdentify = new IdentifyService({ const localIdentify = new IdentifyService({
libp2p: { libp2p: {
peerId: localPeer, peerId: localPeer,
@ -82,7 +82,7 @@ describe('Identify', () => {
const remoteConnectionMock = { remoteAddr: observedAddr } const remoteConnectionMock = { remoteAddr: observedAddr }
const [local, remote] = duplexPair() const [local, remote] = duplexPair()
sinon.stub(localConnectionMock, 'newStream').returns({ stream: local, protocol: multicodecs.IDENTIFY_LEGACY }) sinon.stub(localConnectionMock, 'newStream').returns({ stream: local, protocol: multicodecs.IDENTIFY_1_0_0 })
sinon.spy(localIdentify.peerStore.addressBook, 'set') sinon.spy(localIdentify.peerStore.addressBook, 'set')
sinon.spy(localIdentify.peerStore.protoBook, 'set') sinon.spy(localIdentify.peerStore.protoBook, 'set')
@ -93,7 +93,7 @@ describe('Identify', () => {
remoteIdentify.handleMessage({ remoteIdentify.handleMessage({
connection: remoteConnectionMock, connection: remoteConnectionMock,
stream: remote, stream: remote,
protocol: multicodecs.IDENTIFY_LEGACY protocol: multicodecs.IDENTIFY_1_0_0
}) })
]) ])
@ -224,7 +224,7 @@ describe('Identify', () => {
}) })
describe('push', () => { describe('push', () => {
it('should be able to push identify updates to another peer with legacy protocol', async () => { it('should be able to push identify updates to another peer with 1.0.0 legacy protocols', async () => {
const connectionManager = new EventEmitter() const connectionManager = new EventEmitter()
connectionManager.getConnection = () => {} connectionManager.getConnection = () => {}
@ -235,8 +235,8 @@ describe('Identify', () => {
multiaddrs: listenMaddrs multiaddrs: listenMaddrs
}, },
protocols: new Map([ protocols: new Map([
[multicodecs.IDENTIFY_LEGACY], [multicodecs.IDENTIFY_1_0_0],
[multicodecs.IDENTIFY_PUSH_LEGACY], [multicodecs.IDENTIFY_PUSH_1_0_0],
['/echo/1.0.0'] ['/echo/1.0.0']
]) ])
}) })
@ -257,12 +257,12 @@ describe('Identify', () => {
}) })
// Setup peer protocols and multiaddrs // Setup peer protocols and multiaddrs
const localProtocols = new Set([multicodecs.IDENTIFY_LEGACY, multicodecs.IDENTIFY_PUSH_LEGACY, '/echo/1.0.0']) const localProtocols = new Set([multicodecs.IDENTIFY_1_0_0, multicodecs.IDENTIFY_PUSH_1_0_0, '/echo/1.0.0'])
const localConnectionMock = { newStream: () => {} } const localConnectionMock = { newStream: () => {} }
const remoteConnectionMock = { remotePeer: localPeer } const remoteConnectionMock = { remotePeer: localPeer }
const [local, remote] = duplexPair() const [local, remote] = duplexPair()
sinon.stub(localConnectionMock, 'newStream').returns({ stream: local, protocol: multicodecs.IDENTIFY_PUSH_LEGACY }) sinon.stub(localConnectionMock, 'newStream').returns({ stream: local, protocol: multicodecs.IDENTIFY_PUSH_1_0_0 })
sinon.spy(remoteIdentify.peerStore.addressBook, 'set') sinon.spy(remoteIdentify.peerStore.addressBook, 'set')
sinon.spy(remoteIdentify.peerStore.protoBook, 'set') sinon.spy(remoteIdentify.peerStore.protoBook, 'set')
@ -273,7 +273,7 @@ describe('Identify', () => {
remoteIdentify.handleMessage({ remoteIdentify.handleMessage({
connection: remoteConnectionMock, connection: remoteConnectionMock,
stream: remote, stream: remote,
protocol: multicodecs.IDENTIFY_PUSH_LEGACY protocol: multicodecs.IDENTIFY_PUSH_1_0_0
}) })
]) ])