From 447f5fd5c886c9a69401c40312f1ce1ace99f220 Mon Sep 17 00:00:00 2001 From: shortcutme Date: Wed, 23 Jan 2019 02:11:31 +0100 Subject: [PATCH] Store opened port status per IP version --- plugins/Sidebar/SidebarPlugin.py | 2 +- src/Connection/Connection.py | 2 +- src/Connection/ConnectionServer.py | 6 ++- src/File/FileServer.py | 64 ++++++++++++++++++++---------- src/Peer/PeerPortchecker.py | 6 +-- src/Site/SiteAnnouncer.py | 6 ++- src/Ui/UiWebsocket.py | 15 ++++--- 7 files changed, 65 insertions(+), 36 deletions(-) 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: