Skip to content

Commit 2046b91

Browse files
committed
Add I2P Support
Merge HelloZeroNet/ZeroNet#602 Signed-off-by: Marek Küthe <m.k@mk16.de>
1 parent 689d930 commit 2046b91

File tree

3 files changed

+44
-3
lines changed

3 files changed

+44
-3
lines changed

AnnounceZero/AnnounceZeroPlugin.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Sidebar/SidebarPlugin.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ def sidebarRenderPeerStats(self, body, site):
9191
connected = len([peer for peer in list(site.peers.values()) if peer.connection and peer.connection.connected])
9292
connectable = len([peer_id for peer_id in list(site.peers.keys()) if not peer_id.endswith(":0")])
9393
onion = len([peer_id for peer_id in list(site.peers.keys()) if ".onion" in peer_id])
94+
i2p = len([peer_id for peer_id in list(site.peers.keys()) if ".i2p" in peer_id])
9495
local = len([peer for peer in list(site.peers.values()) if helper.isPrivateIp(peer.ip)])
9596
peers_total = len(site.peers)
9697

@@ -101,21 +102,24 @@ def sidebarRenderPeerStats(self, body, site):
101102
connectable += 1
102103
if site.connection_server.tor_manager.start_onions:
103104
onion += 1
105+
if site.connection_server.i2p_manager.start_dests:
106+
i2p += 1
104107

105108
if peers_total:
106109
percent_connected = float(connected) / peers_total
107110
percent_connectable = float(connectable) / peers_total
108111
percent_onion = float(onion) / peers_total
112+
percent_i2p = float(i2p) / peers_total
109113
else:
110-
percent_connectable = percent_connected = percent_onion = 0
114+
percent_connectable = percent_connected = percent_onion = percent_i2p = 0
111115

112116
if local:
113117
local_html = _("<li class='color-yellow'><span>{_[Local]}:</span><b>{local}</b></li>")
114118
else:
115119
local_html = ""
116120

117121
peer_ips = [peer.key for peer in site.getConnectablePeers(20, allow_private=False)]
118-
peer_ips.sort(key=lambda peer_ip: ".onion:" in peer_ip)
122+
peer_ips.sort(key=lambda peer_ip: ".onion:" in peer_ip or ".i2p" in peer_ip)
119123
copy_link = "http://127.0.0.1:43110/%s/?zeronet_peers=%s" % (
120124
site.content_manager.contents.get("content.json", {}).get("domain", site.address),
121125
",".join(peer_ips)
@@ -131,12 +135,14 @@ def sidebarRenderPeerStats(self, body, site):
131135
<li style='width: 100%' class='total back-black' title="{_[Total peers]}"></li>
132136
<li style='width: {percent_connectable:.0%}' class='connectable back-blue' title='{_[Connectable peers]}'></li>
133137
<li style='width: {percent_onion:.0%}' class='connected back-purple' title='{_[Onion]}'></li>
138+
<li style='width: {percent_i2p:.0%}' class='connected back-purple' title='{_[I2P]}'></li>
134139
<li style='width: {percent_connected:.0%}' class='connected back-green' title='{_[Connected peers]}'></li>
135140
</ul>
136141
<ul class='graph-legend'>
137142
<li class='color-green'><span>{_[Connected]}:</span><b>{connected}</b></li>
138143
<li class='color-blue'><span>{_[Connectable]}:</span><b>{connectable}</b></li>
139144
<li class='color-purple'><span>{_[Onion]}:</span><b>{onion}</b></li>
145+
<li class='color-purple'><span>{_[I2P]}:</span><b>{i2p}</b></li>
140146
{local_html}
141147
<li class='color-black'><span>{_[Total]}:</span><b>{peers_total}</b></li>
142148
</ul>

Stats/StatsPlugin.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,12 @@ def renderTor(self):
152152
for site_address, onion in list(main.file_server.tor_manager.site_onions.items()):
153153
yield "- %-34s: %s<br>" % (site_address, onion)
154154

155+
def renderI2P(self):
156+
import main
157+
yield "<br><br><b>I2P Destinations (status: %s):</b><br>" % main.file_server.i2p_manager.status
158+
for site_address, dest in list(main.file_server.i2p_manager.site_dests.items()):
159+
yield "- %-34s: %s<br>" % (site_address, dest.base32())
160+
155161
def renderDbStats(self):
156162
yield "<br><br><b>Db</b>:<br>"
157163
for db in Db.opened_dbs:
@@ -406,6 +412,7 @@ def actionStats(self):
406412
self.renderConnectionsTable(),
407413
self.renderTrackers(),
408414
self.renderTor(),
415+
self.renderI2P(),
409416
self.renderDbStats(),
410417
self.renderSites(),
411418
self.renderBigfiles(),

0 commit comments

Comments
 (0)