Store opened port status per IP version

This commit is contained in:
shortcutme 2019-01-23 02:11:31 +01:00
parent ce78e330d3
commit 447f5fd5c8
No known key found for this signature in database
GPG key ID: 5B63BAE6CB9613AE
7 changed files with 65 additions and 36 deletions

View file

@ -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

View file

@ -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,

View file

@ -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)

View file

@ -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:

View file

@ -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"])

View file

@ -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

View file

@ -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 <b>{0}</b> is opened.<br>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: