diff --git a/plugins/Sidebar/SidebarPlugin.py b/plugins/Sidebar/SidebarPlugin.py
index da14e920..4aa8f4b3 100644
--- a/plugins/Sidebar/SidebarPlugin.py
+++ b/plugins/Sidebar/SidebarPlugin.py
@@ -98,7 +98,7 @@ class UiWebsocketPlugin(object):
# Add myself
if site.settings["serving"]:
peers_total += 1
- if site.connection_server.port_opened:
+ if any(site.connection_server.port_opened.values()):
connectable += 1
if site.connection_server.tor_manager.start_onions:
onion += 1
diff --git a/src/Connection/Connection.py b/src/Connection/Connection.py
index 25956698..494de85a 100644
--- a/src/Connection/Connection.py
+++ b/src/Connection/Connection.py
@@ -347,7 +347,7 @@ class Connection(object):
"protocol": "v2",
"peer_id": peer_id,
"fileserver_port": self.server.port,
- "port_opened": self.server.port_opened,
+ "port_opened": self.server.port_opened.get(self.ip_type, None),
"target_ip": self.ip,
"rev": config.rev,
"crypt_supported": crypt_supported,
diff --git a/src/Connection/ConnectionServer.py b/src/Connection/ConnectionServer.py
index 308cde2b..60752029 100644
--- a/src/Connection/ConnectionServer.py
+++ b/src/Connection/ConnectionServer.py
@@ -164,7 +164,9 @@ class ConnectionServer(object):
pass
def getConnection(self, ip=None, port=None, peer_id=None, create=True, site=None, is_tracker_connection=False):
- if (ip.endswith(".onion") or self.port_opened == False) and self.tor_manager.start_onions and site: # Site-unique connection for Tor
+ ip_type = helper.getIpType(ip)
+ has_per_site_onion = (ip.endswith(".onion") or self.port_opened.get(ip_type, None) == False) and self.tor_manager.start_onions and site
+ if has_per_site_onion: # Site-unique connection for Tor
if ip.endswith(".onion"):
site_onion = self.tor_manager.getOnion(site.address)
else:
@@ -206,7 +208,7 @@ class ConnectionServer(object):
raise Exception("This peer is blacklisted")
try:
- if (ip.endswith(".onion") or self.port_opened == False) and self.tor_manager.start_onions and site: # Lock connection to site
+ if has_per_site_onion: # Lock connection to site
connection = Connection(self, ip, port, target_onion=site_onion, is_tracker_connection=is_tracker_connection)
else:
connection = Connection(self, ip, port, is_tracker_connection=is_tracker_connection)
diff --git a/src/File/FileServer.py b/src/File/FileServer.py
index 76b10953..a6fe51e8 100644
--- a/src/File/FileServer.py
+++ b/src/File/FileServer.py
@@ -42,8 +42,11 @@ class FileServer(ConnectionServer):
ConnectionServer.__init__(self, ip, port, self.handleRequest)
+
+ self.port_opened = {}
+
if config.ip_external: # Ip external defined in arguments
- self.port_opened = True
+ self.port_opened[helper.getIpType(config.ip_external)] = True
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
else:
self.port_opened = None # Check it later
@@ -108,23 +111,47 @@ class FileServer(ConnectionServer):
self.port_opened = True
def portCheck(self):
- res = self.portchecker.portCheck(self.port, helper.getIpType(self.ip))
- if not res["opened"]:
- if self.portchecker.portOpen(self.port):
- res = self.portchecker.portCheck(self.port, helper.getIpType(self.ip))
+ self.port_opened = {}
+ if self.ui_server:
+ self.ui_server.updateWebsocket()
- if res["ip"]:
- config.ip_external = res["ip"]
- SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
+ if "ipv6" in self.supported_ip_types:
+ res_ipv6_thread = gevent.spawn(self.portchecker.portCheck, self.port, "ipv6")
+ else:
+ res_ipv6_thread = None
+
+ res_ipv4 = self.portchecker.portCheck(self.port, "ipv4")
+ if not res_ipv4["opened"]:
+ if self.portchecker.portOpen(self.port):
+ res_ipv4 = self.portchecker.portCheck(self.port, "ipv4")
+
+ if res_ipv6_thread == None:
+ res_ipv6 = {"ip": None, "opened": None}
+ else:
+ res_ipv6 = res_ipv6_thread.get()
+ if res_ipv6["opened"] and not helper.getIpType(res_ipv6["ip"]) == "ipv6":
+ self.log.info("Invalid IPv6 address from port check: %s" % res_ipv6["ip"])
+ res_ipv6["opened"] = False
+
+ if res_ipv4["ip"]:
+ config.ip_external = res_ipv4["ip"]
+ SiteManager.peer_blacklist.append((res_ipv4["ip"], self.port))
else:
config.ip_external = False
- if res["opened"]:
- self.log.info("Server port on %s:%s: Open" % (self.ip, self.port))
- return True
- else:
- self.log.info("Server port on %s:%s: Closed" % (self.ip, self.port))
- return False
+ if res_ipv6["ip"]:
+ SiteManager.peer_blacklist.append((res_ipv6["ip"], self.port))
+
+ self.log.info("Server port opened ipv4: %s, ipv6: %s" % (res_ipv4["opened"], res_ipv6["opened"]))
+
+
+ res = {"ipv4": res_ipv4["opened"], "ipv6": res_ipv6["opened"]}
+ self.port_opened.update(res)
+
+ if self.ui_server:
+ self.ui_server.updateWebsocket()
+
+ return res
# Check site file integrity
def checkSite(self, site, check_files=False):
@@ -140,18 +167,15 @@ class FileServer(ConnectionServer):
self.log.debug("Checking sites...")
s = time.time()
sites_checking = False
- if self.port_opened is None or force_port_check: # Test and open port if not tested yet
+ if not self.port_opened or force_port_check: # Test and open port if not tested yet
if len(self.sites) <= 2: # Don't wait port opening on first startup
sites_checking = True
for address, site in self.sites.items():
gevent.spawn(self.checkSite, site, check_files)
- if force_port_check:
- self.port_opened = None
+ self.portCheck()
- self.port_opened = self.portCheck()
-
- if self.port_opened is False:
+ if not self.port_opened["ipv4"]:
self.tor_manager.startOnions()
if not sites_checking:
diff --git a/src/Peer/PeerPortchecker.py b/src/Peer/PeerPortchecker.py
index dacab209..232b2523 100644
--- a/src/Peer/PeerPortchecker.py
+++ b/src/Peer/PeerPortchecker.py
@@ -31,11 +31,7 @@ class PeerPortchecker(object):
self.log.warning("UpnpPunch run error: %s" % Debug.formatException(err))
return False
- if self.portCheck(port)["opened"]:
- return True
- else:
- self.log.info("Upnp mapping failed, please forward port %s on your router to your ipaddress" % port)
- return False
+ return True
def portClose(self, port):
return UpnpPunch.ask_to_close_port(port, protos=["TCP"])
diff --git a/src/Site/SiteAnnouncer.py b/src/Site/SiteAnnouncer.py
index caf9f2e5..89a7314d 100644
--- a/src/Site/SiteAnnouncer.py
+++ b/src/Site/SiteAnnouncer.py
@@ -68,8 +68,10 @@ class SiteAnnouncer(object):
def getOpenedServiceTypes(self):
back = []
# Type of addresses they can reach me
- if self.site.connection_server.port_opened and config.trackers_proxy == "disable":
- back.append(helper.getIpType(self.site.connection_server.ip))
+ if config.trackers_proxy == "disable":
+ for ip_type, opened in self.site.connection_server.port_opened.items():
+ if opened:
+ back.append(ip_type)
if self.site.connection_server.tor_manager.start_onions:
back.append("onion")
return back
diff --git a/src/Ui/UiWebsocket.py b/src/Ui/UiWebsocket.py
index 6cc5f0c3..7fde790a 100644
--- a/src/Ui/UiWebsocket.py
+++ b/src/Ui/UiWebsocket.py
@@ -50,7 +50,7 @@ class UiWebsocket(object):
# Add open fileserver port message or closed port error to homepage at first request after start
self.site.page_requested = True # Dont add connection notification anymore
file_server = sys.modules["main"].file_server
- if file_server.port_opened is None or file_server.tor_manager.start_onions is None:
+ if not file_server.port_opened or file_server.tor_manager.start_onions is None:
self.site.page_requested = False # Not ready yet, check next time
else:
try:
@@ -105,7 +105,7 @@ class UiWebsocket(object):
])
file_server = sys.modules["main"].file_server
- if file_server.port_opened is True:
+ if any(file_server.port_opened.values()):
self.site.notifications.append([
"done",
_["Congratulations, your port {0} is opened.
You are a full member of the ZeroNet network!"].format(config.fileserver_port),
@@ -129,7 +129,7 @@ class UiWebsocket(object):
"""),
0
])
- elif file_server.port_opened is False and file_server.tor_manager.start_onions:
+ elif file_server.tor_manager.start_onions:
self.site.notifications.append([
"done",
_(u"""
@@ -318,8 +318,13 @@ class UiWebsocket(object):
def formatServerInfo(self):
file_server = sys.modules["main"].file_server
+ if file_server.port_opened == {}:
+ ip_external = None
+ else:
+ ip_external = any(file_server.port_opened.values())
return {
- "ip_external": file_server.port_opened,
+ "ip_external": ip_external,
+ "port_opened": file_server.port_opened,
"platform": sys.platform,
"fileserver_ip": config.fileserver_ip,
"fileserver_port": config.fileserver_port,
@@ -534,7 +539,7 @@ class UiWebsocket(object):
self.response(to, "ok")
else:
if len(site.peers) == 0:
- if sys.modules["main"].file_server.port_opened or sys.modules["main"].file_server.tor_manager.start_onions:
+ if any(sys.modules["main"].file_server.port_opened.values()) or sys.modules["main"].file_server.tor_manager.start_onions:
if notification:
self.cmd("notification", ["info", _["No peers found, but your content is ready to access."]])
if callback: