Skip to content
This repository was archived by the owner on Jul 21, 2023. It is now read-only.

Commit 6da26b0

Browse files
dirkmcvasco-santos
authored andcommitted
fix: favour providers peerInfo over sender peerInfo in ADD_PROVIDER (#129)
1 parent 3439b07 commit 6da26b0

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

src/rpc/handlers/add-provider.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ module.exports = (dht) => {
3030
return callback(errcode(new Error(errMsg), 'ERR_INVALID_CID'))
3131
}
3232

33+
let foundProvider = false
3334
msg.providerPeers.forEach((pi) => {
3435
// Ignore providers not from the originator
3536
if (!pi.id.isEqual(peer.id)) {
@@ -45,10 +46,20 @@ module.exports = (dht) => {
4546
log('received provider %s for %s (addrs %s)', peer.id.toB58String(), cid.toBaseEncodedString(), pi.multiaddrs.toArray().map((m) => m.toString()))
4647

4748
if (!dht._isSelf(pi.id)) {
49+
foundProvider = true
4850
dht.peerBook.put(pi)
51+
dht.providers.addProvider(cid, pi.id, callback)
4952
}
5053
})
5154

52-
dht.providers.addProvider(cid, peer.id, callback)
55+
// Previous versions of the JS DHT sent erroneous providers in the
56+
// `providerPeers` field. In order to accommodate older clients that have
57+
// this bug, we fall back to assuming the originator is the provider if
58+
// we can't find any valid providers in the payload.
59+
// https://github.com/libp2p/js-libp2p-kad-dht/pull/127
60+
// https://github.com/libp2p/js-libp2p-kad-dht/issues/128
61+
if (!foundProvider) {
62+
dht.providers.addProvider(cid, peer.id, callback)
63+
}
5364
}
5465
}

test/rpc/handlers/add-provider.spec.js

+16-13
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,17 @@ describe('rpc - handlers - AddProvider', () => {
6666
}))
6767
})
6868

69-
it('ignore providers not from the originator', (done) => {
69+
it('ignore providers that do not match the sender', (done) => {
7070
const cid = values[0].cid
7171

7272
const msg = new Message(Message.TYPES.ADD_PROVIDER, cid.buffer, 0)
73-
const sender = peers[0]
74-
sender.multiaddrs.add('/ip4/127.0.0.1/tcp/1234')
75-
const other = peers[1]
73+
const sender = _.cloneDeep(peers[0])
74+
const provider = _.cloneDeep(peers[0])
75+
provider.multiaddrs.add('/ip4/127.0.0.1/tcp/1234')
76+
const other = _.cloneDeep(peers[1])
7677
other.multiaddrs.add('/ip4/127.0.0.1/tcp/2345')
7778
msg.providerPeers = [
78-
sender,
79+
provider,
7980
other
8081
]
8182

@@ -84,30 +85,32 @@ describe('rpc - handlers - AddProvider', () => {
8485
(cb) => dht.providers.getProviders(cid, cb),
8586
(provs, cb) => {
8687
expect(provs).to.have.length(1)
87-
expect(provs[0].id).to.eql(sender.id.id)
88-
const bookEntry = dht.peerBook.get(sender.id)
88+
expect(provs[0].id).to.eql(provider.id.id)
89+
const bookEntry = dht.peerBook.get(provider.id)
90+
// Favour peerInfo from payload over peerInfo from sender
8991
expect(bookEntry.multiaddrs.toArray()).to.eql(
90-
sender.multiaddrs.toArray()
92+
provider.multiaddrs.toArray()
9193
)
9294
cb()
9395
}
9496
], done)
9597
})
9698

97-
it('ignore providers with no multiaddrs', (done) => {
99+
it('fall back to sender if providers have no multiaddrs', (done) => {
98100
const cid = values[0].cid
99101
const msg = new Message(Message.TYPES.ADD_PROVIDER, cid.buffer, 0)
100102
const sender = _.cloneDeep(peers[0])
101-
sender.multiaddrs.clear()
102-
msg.providerPeers = [sender]
103+
const provider = _.cloneDeep(peers[0])
104+
provider.multiaddrs.clear()
105+
msg.providerPeers = [provider]
103106

104107
waterfall([
105108
(cb) => handler(dht)(sender, msg, cb),
106109
(cb) => dht.providers.getProviders(cid, cb),
107110
(provs, cb) => {
111+
expect(dht.peerBook.has(provider.id)).to.equal(false)
108112
expect(provs).to.have.length(1)
109-
expect(provs[0].id).to.eql(sender.id.id)
110-
expect(dht.peerBook.has(sender.id)).to.equal(false)
113+
expect(provs[0].id).to.eql(provider.id.id)
111114
cb()
112115
}
113116
], done)

0 commit comments

Comments
 (0)