Don't unwrap in Kademlia protocol (#252)

* Don't unwrap in Kademlia protocol

* Debug assert that the alloc is correct

* Ignore non-peer CIDs

* Fix concerns
This commit is contained in:
Pierre Krieger 2018-06-14 16:34:07 +02:00 committed by GitHub
parent 51471fe2e4
commit f74cf9f126
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -82,20 +82,30 @@ pub struct Peer {
pub connection_ty: ConnectionType, pub connection_ty: ConnectionType,
} }
impl<'a> From<&'a mut protobuf_structs::dht::Message_Peer> for Peer { impl Peer {
fn from(peer: &'a mut protobuf_structs::dht::Message_Peer) -> Peer { // Builds a `Peer` from its raw protobuf equivalent.
let node_id = PeerId::from_bytes(peer.get_id().to_vec()).unwrap(); // TODO: don't unwrap // TODO: use TryFrom once stable
let addrs = peer.take_addrs() fn from_peer(peer: &mut protobuf_structs::dht::Message_Peer) -> Result<Peer, IoError> {
.into_iter() // TODO: this is in fact a CID ; not sure if this should be handled in `from_bytes` or
.map(|a| Multiaddr::from_bytes(a).unwrap()) // TODO: don't unwrap // as a special case here
.collect(); let node_id = PeerId::from_bytes(peer.get_id().to_vec())
.map_err(|_| IoError::new(IoErrorKind::InvalidData, "invalid peer id"))?;
let mut addrs = Vec::with_capacity(peer.get_addrs().len());
for addr in peer.take_addrs().into_iter() {
let as_ma = Multiaddr::from_bytes(addr)
.map_err(|err| IoError::new(IoErrorKind::InvalidData, err))?;
addrs.push(as_ma);
}
debug_assert_eq!(addrs.len(), addrs.capacity());
let connection_ty = peer.get_connection().into(); let connection_ty = peer.get_connection().into();
Peer { Ok(Peer {
node_id: node_id, node_id: node_id,
multiaddrs: addrs, multiaddrs: addrs,
connection_ty: connection_ty, connection_ty: connection_ty,
} })
} }
} }
@ -262,13 +272,18 @@ fn proto_to_msg(mut message: protobuf_structs::dht::Message) -> Result<KadMsg, I
Ok(KadMsg::FindNodeReq { Ok(KadMsg::FindNodeReq {
key: message.take_key(), key: message.take_key(),
}) })
} else { } else {
// TODO: for now we don't parse the peer properly, so it is possible that we get
// parsing errors for peers even when they are valid ; we ignore these
// errors for now, but ultimately we should just error altogether
let closer_peers = message.mut_closerPeers()
.iter_mut()
.filter_map(|peer| Peer::from_peer(peer).ok())
.collect::<Vec<_>>();
Ok(KadMsg::FindNodeRes { Ok(KadMsg::FindNodeRes {
closer_peers: message closer_peers,
.mut_closerPeers()
.iter_mut()
.map(|peer| peer.into())
.collect(),
}) })
} }
} }