Skip to content

Commit 9b0fe64

Browse files
author
Roman Proskuryakov
authored
Merge pull request #391 from tox-rs/tcp_connection_key
Use correct key for tcp connection
2 parents 09946ab + 34d3424 commit 9b0fe64

File tree

1 file changed

+77
-4
lines changed
  • src/toxcore/onion/client

1 file changed

+77
-4
lines changed

src/toxcore/onion/client/mod.rs

Lines changed: 77 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -526,14 +526,15 @@ impl OnionClient {
526526

527527
let dht_pk_future = send_to(&state.dht_pk_tx, (friend_pk, dht_pk_announce.dht_pk));
528528

529+
let friend_dht_pk = dht_pk_announce.dht_pk;
529530
let futures = dht_pk_announce.nodes.into_iter().map(|node| match node.ip_port.protocol {
530531
ProtocolType::UDP => {
531532
let packed_node = PackedNode::new(node.ip_port.to_saddr(), &node.pk);
532533
Either::A(self.dht.ping_node(&packed_node)
533534
.map_err(|e| e.context(HandleDhtPkAnnounceErrorKind::PingNode).into()))
534535
},
535536
ProtocolType::TCP => {
536-
Either::B(self.tcp_connections.add_relay_connection(node.ip_port.to_saddr(), node.pk, friend_pk)
537+
Either::B(self.tcp_connections.add_relay_connection(node.ip_port.to_saddr(), node.pk, friend_dht_pk)
537538
.map_err(|e| e.context(HandleDhtPkAnnounceErrorKind::AddRelay).into()))
538539
}
539540
}).collect::<Vec<_>>();
@@ -1679,10 +1680,10 @@ mod tests {
16791680
}
16801681

16811682
#[test]
1682-
fn handle_data_response_dht_pk_announce() {
1683+
fn handle_data_response_dht_pk_announce_udp_node() {
16831684
let (dht_pk, dht_sk) = gen_keypair();
16841685
let (real_pk, real_sk) = gen_keypair();
1685-
let (udp_tx, _udp_rx) = mpsc::channel(1);
1686+
let (udp_tx, udp_rx) = mpsc::channel(1);
16861687
let (tcp_incoming_tx, _tcp_incoming_rx) = mpsc::unbounded();
16871688
let (dht_pk_tx, dht_pk_rx) = mpsc::unbounded();
16881689
let dht = DhtServer::new(udp_tx, dht_pk, dht_sk.clone());
@@ -1696,7 +1697,18 @@ mod tests {
16961697

16971698
onion_client.add_friend(friend_real_pk);
16981699

1699-
let dht_pk_announce_payload = DhtPkAnnouncePayload::new(friend_dht_pk, vec![]);
1700+
let saddr: SocketAddr = "127.0.0.1:12345".parse().unwrap();
1701+
let (node_pk, node_sk) = gen_keypair();
1702+
let dht_pk_announce_payload = DhtPkAnnouncePayload::new(friend_dht_pk, vec![
1703+
TcpUdpPackedNode {
1704+
ip_port: IpPort {
1705+
protocol: ProtocolType::UDP,
1706+
ip_addr: saddr.ip(),
1707+
port: saddr.port(),
1708+
},
1709+
pk: node_pk,
1710+
},
1711+
]);
17001712
let no_reply = dht_pk_announce_payload.no_reply;
17011713
let onion_data_response_inner_payload = OnionDataResponseInnerPayload::DhtPkAnnounce(dht_pk_announce_payload);
17021714
let nonce = gen_nonce();
@@ -1718,6 +1730,67 @@ mod tests {
17181730
let (received_real_pk, received_dht_pk) = received.unwrap();
17191731
assert_eq!(received_real_pk, friend_real_pk);
17201732
assert_eq!(received_dht_pk, friend_dht_pk);
1733+
1734+
// the node from announce packet should be pinged
1735+
let (received, _udp_rx) = udp_rx.into_future().wait().unwrap();
1736+
let (packet, addr_to_send) = received.unwrap();
1737+
1738+
assert_eq!(addr_to_send, saddr);
1739+
let packet = unpack!(packet, Packet::NodesRequest);
1740+
let payload = packet.get_payload(&precompute(&dht_pk, &node_sk)).unwrap();
1741+
1742+
assert_eq!(payload.pk, dht_pk);
1743+
}
1744+
1745+
#[test]
1746+
fn handle_data_response_dht_pk_announce_tcp_node() {
1747+
let (dht_pk, dht_sk) = gen_keypair();
1748+
let (real_pk, real_sk) = gen_keypair();
1749+
let (udp_tx, _udp_rx) = mpsc::channel(1);
1750+
let (tcp_incoming_tx, _tcp_incoming_rx) = mpsc::unbounded();
1751+
let (dht_pk_tx, _dht_pk_rx) = mpsc::unbounded();
1752+
let dht = DhtServer::new(udp_tx, dht_pk, dht_sk.clone());
1753+
let tcp_connections = TcpConnections::new(dht_pk, dht_sk, tcp_incoming_tx);
1754+
let onion_client = OnionClient::new(dht, tcp_connections, real_sk.clone(), real_pk);
1755+
1756+
onion_client.set_dht_pk_sink(dht_pk_tx);
1757+
1758+
let (friend_dht_pk, _friend_dht_sk) = gen_keypair();
1759+
let (friend_real_pk, friend_real_sk) = gen_keypair();
1760+
1761+
onion_client.add_friend(friend_real_pk);
1762+
1763+
let (node_pk, _node_sk) = gen_keypair();
1764+
let dht_pk_announce_payload = DhtPkAnnouncePayload::new(friend_dht_pk, vec![
1765+
TcpUdpPackedNode {
1766+
ip_port: IpPort {
1767+
protocol: ProtocolType::TCP,
1768+
ip_addr: "127.0.0.2".parse().unwrap(),
1769+
port: 12346,
1770+
},
1771+
pk: node_pk,
1772+
},
1773+
]);
1774+
let no_reply = dht_pk_announce_payload.no_reply;
1775+
let onion_data_response_inner_payload = OnionDataResponseInnerPayload::DhtPkAnnounce(dht_pk_announce_payload);
1776+
let nonce = gen_nonce();
1777+
let onion_data_response_payload = OnionDataResponsePayload::new(&precompute(&real_pk, &friend_real_sk), friend_real_pk, &nonce, &onion_data_response_inner_payload);
1778+
let (temporary_pk, temporary_sk) = gen_keypair();
1779+
let onion_data_response = OnionDataResponse::new(&precompute(&onion_client.data_pk, &temporary_sk), temporary_pk, nonce, &onion_data_response_payload);
1780+
1781+
// ignore result future since it spawns the connection which should be
1782+
// executed inside tokio context
1783+
let _ = onion_client.handle_data_response(&onion_data_response);
1784+
1785+
let state = onion_client.state.lock();
1786+
1787+
// friend should have updated data
1788+
let friend = &state.friends[&friend_real_pk];
1789+
assert_eq!(friend.last_no_reply, no_reply);
1790+
assert_eq!(friend.dht_pk, Some(friend_dht_pk));
1791+
1792+
assert!(onion_client.tcp_connections.has_relay(&node_pk));
1793+
assert!(onion_client.tcp_connections.has_connection(&friend_dht_pk));
17211794
}
17221795

17231796
#[test]

0 commit comments

Comments
 (0)