From 2cff4e769e888c0aaee1f151793dfce8344dad07 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 1 Aug 2016 17:22:47 +1200 Subject: [PATCH] Provisional support for announcing I2P Destinations to zero:// trackers Requires support in the zero:// tracker software --- plugins/AnnounceZero/AnnounceZeroPlugin.py | 33 ++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/plugins/AnnounceZero/AnnounceZeroPlugin.py b/plugins/AnnounceZero/AnnounceZeroPlugin.py index 14dba61e..1b4737a7 100644 --- a/plugins/AnnounceZero/AnnounceZeroPlugin.py +++ b/plugins/AnnounceZero/AnnounceZeroPlugin.py @@ -28,11 +28,18 @@ def processPeerRes(site, peers): peer_onion, peer_port = helper.unpackOnionAddress(packed_address) if site.addPeer(peer_onion, peer_port): added += 1 + # I2P Destinations + found_dest = 0 + for packed_address in peers["i2p"]: + found_dest += 1 + peer_dest, peer_port = helper.unpackI2PAddress(packed_address) + if site.addPeer(peer_dest, peer_port): + added += 1 if added: site.worker_manager.onPeers() site.updateWebsocket(peers_added=added) - site.log.debug("Found %s ip4, %s onion peers, new: %s" % (found_ip4, found_onion, added)) + site.log.debug("Found %s ip4, %s onion, %s I2P peers, new: %s" % (found_ip4, found_onion, found_dest, added)) @PluginManager.registerTo("Site") @@ -48,6 +55,8 @@ class SitePlugin(object): need_types = ["ip4"] if self.connection_server and self.connection_server.tor_manager and self.connection_server.tor_manager.enabled: need_types.append("onion") + if self.connection_server and self.connection_server.i2p_manager and self.connection_server.i2p_manager.enabled: + need_types.append("i2p") if mode == "start" or mode == "more": # Single: Announce only this site sites = [self] @@ -62,12 +71,15 @@ class SitePlugin(object): # Create request request = { - "hashes": [], "onions": [], "port": fileserver_port, "need_types": need_types, "need_num": 20, "add": add_types + "hashes": [], "onions": [], "i2pdests": [], "port": fileserver_port, "need_types": need_types, "need_num": 20, "add": add_types } for site in sites: if "onion" in add_types: onion = self.connection_server.tor_manager.getOnion(site.address) request["onions"].append(onion) + if "i2p" in add_types: + dest = self.connection_server.i2p_manager.getDest(site.address) + request["i2pdests"].append(dest.base64()) request["hashes"].append(hashlib.sha256(site.address).digest()) # Tracker can remove sites that we don't announce @@ -112,6 +124,23 @@ class SitePlugin(object): time_full_announced[tracker_address] = 0 return False + # Check if we need to sign prove the I2P Destinations + if "i2p_sign_this" in res: + self.log.debug("Signing %s for %s to add %s I2P dests" % (res["i2p_sign_this"], tracker_address, len(sites))) + request["i2p_signs"] = {} + request["i2p_sign_this"] = res["i2p_sign_this"] + request["need_num"] = 0 + for site in sites: + dest = self.connection_server.i2p_manager.getPrivateDest(site.address) + sign = dest.sign(res["i2p_sign_this"]) + request["i2p_signs"][dest.base64()] = sign + res = tracker.request("announce", request) + if not res or "i2p_sign_this" in res: + self.log.debug("Announce I2P Destination to %s failed: %s" % (tracker_address, res)) + if full_announce: + time_full_announced[tracker_address] = 0 + return False + if full_announce: tracker.remove() # Close connection, we don't need it in next 5 minute