@@ -31,6 +31,14 @@ def processPeerRes(tracker_address, site, peers):
31
31
if site .addPeer (peer_onion , peer_port , source = "tracker" ):
32
32
added += 1
33
33
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
+
34
42
# Ip4
35
43
found_ipv4 = 0
36
44
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):
62
70
need_types += self .site .connection_server .supported_ip_types
63
71
if self .site .connection_server .tor_manager .enabled :
64
72
need_types .append ("onion" )
73
+ if self .site .connection_server .i2p_manager .enabled :
74
+ need_types .append ("i2p" )
65
75
66
76
if mode == "start" or mode == "more" : # Single: Announce only this site
67
77
sites = [self .site ]
@@ -77,12 +87,15 @@ def announceTrackerZero(self, tracker_address, mode="start", num_want=10):
77
87
# Create request
78
88
add_types = self .getOpenedServiceTypes ()
79
89
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
81
91
}
82
92
for site in sites :
83
93
if "onion" in add_types :
84
94
onion = self .site .connection_server .tor_manager .getOnion (site .address )
85
95
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 ())
86
99
request ["hashes" ].append (site .address_hash )
87
100
88
101
# Tracker can remove sites that we don't announce
@@ -130,6 +143,21 @@ def announceTrackerZero(self, tracker_address, mode="start", num_want=10):
130
143
time_full_announced [tracker_address ] = 0
131
144
raise AnnounceError ("Announce onion address to failed: %s" % res )
132
145
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
+
133
161
if full_announce :
134
162
tracker_peer .remove () # Close connection, we don't need it in next 5 minute
135
163
0 commit comments