@@ -556,6 +556,15 @@ impl OnionClient {
556556 state. friends . insert ( real_pk, OnionFriend :: new ( real_pk) ) ;
557557 }
558558
559+ /// Set friend's DHT `PublicKey` when it gets known somewhere else.
560+ pub fn set_friend_dht_pk ( & self , real_pk : PublicKey , dht_pk : PublicKey ) {
561+ let mut state = self . state . lock ( ) ;
562+
563+ if let Some ( friend) = state. friends . get_mut ( & real_pk) {
564+ friend. dht_pk = Some ( dht_pk) ;
565+ }
566+ }
567+
559568 /// Generic function for sending search and announce requests to close nodes.
560569 fn ping_close_nodes (
561570 close_nodes : & mut Kbucket < OnionNode > ,
@@ -1087,6 +1096,26 @@ mod tests {
10871096 assert_eq ! ( state. friends[ & friend_pk] . real_pk, friend_pk) ;
10881097 }
10891098
1099+ #[ test]
1100+ fn set_friend_dht_pk ( ) {
1101+ let ( dht_pk, dht_sk) = gen_keypair ( ) ;
1102+ let ( real_pk, real_sk) = gen_keypair ( ) ;
1103+ let ( udp_tx, _udp_rx) = mpsc:: channel ( 1 ) ;
1104+ let ( tcp_incoming_tx, _tcp_incoming_rx) = mpsc:: unbounded ( ) ;
1105+ let dht = DhtServer :: new ( udp_tx, dht_pk, dht_sk. clone ( ) ) ;
1106+ let tcp_connections = TcpConnections :: new ( dht_pk, dht_sk, tcp_incoming_tx) ;
1107+ let onion_client = OnionClient :: new ( dht, tcp_connections, real_sk, real_pk) ;
1108+
1109+ let ( friend_pk, _friend_sk) = gen_keypair ( ) ;
1110+ onion_client. add_friend ( friend_pk) ;
1111+
1112+ let ( friend_dht_pk, _friend_dht_sk) = gen_keypair ( ) ;
1113+ onion_client. set_friend_dht_pk ( friend_pk, friend_dht_pk) ;
1114+
1115+ let state = onion_client. state . lock ( ) ;
1116+ assert_eq ! ( state. friends[ & friend_pk] . dht_pk, Some ( friend_dht_pk) ) ;
1117+ }
1118+
10901119 #[ test]
10911120 fn handle_announce_response_announced ( ) {
10921121 let ( dht_pk, dht_sk) = gen_keypair ( ) ;
0 commit comments