@@ -31,6 +31,14 @@ def processPeerRes(tracker_address, site, peers):
3131 if site .addPeer (peer_onion , peer_port , source = "tracker" ):
3232 added += 1
3333
34+ # I2P Destinations
35+ found_dest = 0
36+ for packed_address in peers ["i2p" ]:
37+ found_dest += 1
38+ peer_dest , peer_port = helper .unpackI2PAddress (packed_address )
39+ if site .addPeer (peer_dest , peer_port ):
40+ added += 1
41+
3442 # Ip4
3543 found_ipv4 = 0
3644 peers_normal = itertools .chain (peers .get ("ip4" , []), peers .get ("ipv4" , []), peers .get ("ipv6" , []))
@@ -62,6 +70,8 @@ def announceTrackerZero(self, tracker_address, mode="start", num_want=10):
6270 need_types += self .site .connection_server .supported_ip_types
6371 if self .site .connection_server .tor_manager .enabled :
6472 need_types .append ("onion" )
73+ if self .site .connection_server .i2p_manager .enabled :
74+ need_types .append ("i2p" )
6575
6676 if mode == "start" or mode == "more" : # Single: Announce only this site
6777 sites = [self .site ]
@@ -77,12 +87,15 @@ def announceTrackerZero(self, tracker_address, mode="start", num_want=10):
7787 # Create request
7888 add_types = self .getOpenedServiceTypes ()
7989 request = {
80- "hashes" : [], "onions" : [], "port" : self .fileserver_port , "need_types" : need_types , "need_num" : 20 , "add" : add_types
90+ "hashes" : [], "onions" : [], "i2pdests" : [], " port" : self .fileserver_port , "need_types" : need_types , "need_num" : 20 , "add" : add_types
8191 }
8292 for site in sites :
8393 if "onion" in add_types :
8494 onion = self .site .connection_server .tor_manager .getOnion (site .address )
8595 request ["onions" ].append (onion )
96+ if "i2p" in add_types :
97+ dest = self .site .connection_server .i2p_manager .getDest (site .address )
98+ request ["i2pdests" ].append (dest .base64 ())
8699 request ["hashes" ].append (site .address_hash )
87100
88101 # Tracker can remove sites that we don't announce
@@ -130,6 +143,21 @@ def announceTrackerZero(self, tracker_address, mode="start", num_want=10):
130143 time_full_announced [tracker_address ] = 0
131144 raise AnnounceError ("Announce onion address to failed: %s" % res )
132145
146+ if "i2p_sign_this" in res :
147+ self .site .log .debug ("Signing %s for %s to add %s I2P dests" % (res ["i2p_sign_this" ], tracker_address , len (sites )))
148+ request ["i2p_signs" ] = {}
149+ request ["i2p_sign_this" ] = res ["i2p_sign_this" ]
150+ request ["need_num" ] = 0
151+ for site in sites :
152+ dest = self .connection_server .i2p_manager .getPrivateDest (site .address )
153+ sign = dest .sign (res ["i2p_sign_this" ])
154+ request ["i2p_signs" ][dest .base64 ()] = sign
155+ res = tracker .request ("announce" , request )
156+ if not res or "i2p_sign_this" in res :
157+ if full_announce :
158+ time_full_announced [tracker_address ] = 0
159+ raise AnnounceError ("Announce I2P Destination to %s failed: %s" % (tracker_address , res ))
160+
133161 if full_announce :
134162 tracker_peer .remove () # Close connection, we don't need it in next 5 minute
135163
0 commit comments