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 # Add myself
if site.settings["serving"]: if site.settings["serving"]:
peers_total += 1 peers_total += 1
if site.connection_server.port_opened: if any(site.connection_server.port_opened.values()):
connectable += 1 connectable += 1
if site.connection_server.tor_manager.start_onions: if site.connection_server.tor_manager.start_onions:
onion += 1 onion += 1

View file

@ -347,7 +347,7 @@ class Connection(object):
"protocol": "v2", "protocol": "v2",
"peer_id": peer_id, "peer_id": peer_id,
"fileserver_port": self.server.port, "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, "target_ip": self.ip,
"rev": config.rev, "rev": config.rev,
"crypt_supported": crypt_supported, "crypt_supported": crypt_supported,

View file

@ -164,7 +164,9 @@ class ConnectionServer(object):
pass pass
def getConnection(self, ip=None, port=None, peer_id=None, create=True, site=None, is_tracker_connection=False): 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"): if ip.endswith(".onion"):
site_onion = self.tor_manager.getOnion(site.address) site_onion = self.tor_manager.getOnion(site.address)
else: else:
@ -206,7 +208,7 @@ class ConnectionServer(object):
raise Exception("This peer is blacklisted") raise Exception("This peer is blacklisted")
try: 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) connection = Connection(self, ip, port, target_onion=site_onion, is_tracker_connection=is_tracker_connection)
else: else:
connection = Connection(self, ip, port, is_tracker_connection=is_tracker_connection) 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) ConnectionServer.__init__(self, ip, port, self.handleRequest)
self.port_opened = {}
if config.ip_external: # Ip external defined in arguments 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 SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
else: else:
self.port_opened = None # Check it later self.port_opened = None # Check it later
@ -108,23 +111,47 @@ class FileServer(ConnectionServer):
self.port_opened = True self.port_opened = True
def portCheck(self): def portCheck(self):
res = self.portchecker.portCheck(self.port, helper.getIpType(self.ip)) self.port_opened = {}
if not res["opened"]: if self.ui_server:
if self.portchecker.portOpen(self.port): self.ui_server.updateWebsocket()
res = self.portchecker.portCheck(self.port, helper.getIpType(self.ip))
if res["ip"]: if "ipv6" in self.supported_ip_types:
config.ip_external = res["ip"] res_ipv6_thread = gevent.spawn(self.portchecker.portCheck, self.port, "ipv6")
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist 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: else:
config.ip_external = False config.ip_external = False
if res["opened"]: if res_ipv6["ip"]:
self.log.info("Server port on %s:%s: Open" % (self.ip, self.port)) SiteManager.peer_blacklist.append((res_ipv6["ip"], self.port))
return True
else: self.log.info("Server port opened ipv4: %s, ipv6: %s" % (res_ipv4["opened"], res_ipv6["opened"]))
self.log.info("Server port on %s:%s: Closed" % (self.ip, self.port))
return False
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 # Check site file integrity
def checkSite(self, site, check_files=False): def checkSite(self, site, check_files=False):
@ -140,18 +167,15 @@ class FileServer(ConnectionServer):
self.log.debug("Checking sites...") self.log.debug("Checking sites...")
s = time.time() s = time.time()
sites_checking = False 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 if len(self.sites) <= 2: # Don't wait port opening on first startup
sites_checking = True sites_checking = True
for address, site in self.sites.items(): for address, site in self.sites.items():
gevent.spawn(self.checkSite, site, check_files) gevent.spawn(self.checkSite, site, check_files)
if force_port_check: self.portCheck()
self.port_opened = None
self.port_opened = self.portCheck() if not self.port_opened["ipv4"]:
if self.port_opened is False:
self.tor_manager.startOnions() self.tor_manager.startOnions()
if not sites_checking: if not sites_checking:

View file

@ -31,11 +31,7 @@ class PeerPortchecker(object):
self.log.warning("UpnpPunch run error: %s" % Debug.formatException(err)) self.log.warning("UpnpPunch run error: %s" % Debug.formatException(err))
return False return False
if self.portCheck(port)["opened"]:
return True return True
else:
self.log.info("Upnp mapping failed, please forward port %s on your router to your ipaddress" % port)
return False
def portClose(self, port): def portClose(self, port):
return UpnpPunch.ask_to_close_port(port, protos=["TCP"]) return UpnpPunch.ask_to_close_port(port, protos=["TCP"])

View file

@ -68,8 +68,10 @@ class SiteAnnouncer(object):
def getOpenedServiceTypes(self): def getOpenedServiceTypes(self):
back = [] back = []
# Type of addresses they can reach me # Type of addresses they can reach me
if self.site.connection_server.port_opened and config.trackers_proxy == "disable": if config.trackers_proxy == "disable":
back.append(helper.getIpType(self.site.connection_server.ip)) 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: if self.site.connection_server.tor_manager.start_onions:
back.append("onion") back.append("onion")
return back 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 # 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 self.site.page_requested = True # Dont add connection notification anymore
file_server = sys.modules["main"].file_server 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 self.site.page_requested = False # Not ready yet, check next time
else: else:
try: try:
@ -105,7 +105,7 @@ class UiWebsocket(object):
]) ])
file_server = sys.modules["main"].file_server 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([ self.site.notifications.append([
"done", "done",
_["Congratulations, your port <b>{0}</b> is opened.<br>You are a full member of the ZeroNet network!"].format(config.fileserver_port), _["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 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([ self.site.notifications.append([
"done", "done",
_(u""" _(u"""
@ -318,8 +318,13 @@ class UiWebsocket(object):
def formatServerInfo(self): def formatServerInfo(self):
file_server = sys.modules["main"].file_server 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 { return {
"ip_external": file_server.port_opened, "ip_external": ip_external,
"port_opened": file_server.port_opened,
"platform": sys.platform, "platform": sys.platform,
"fileserver_ip": config.fileserver_ip, "fileserver_ip": config.fileserver_ip,
"fileserver_port": config.fileserver_port, "fileserver_port": config.fileserver_port,
@ -534,7 +539,7 @@ class UiWebsocket(object):
self.response(to, "ok") self.response(to, "ok")
else: else:
if len(site.peers) == 0: 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: if notification:
self.cmd("notification", ["info", _["No peers found, but your content is ready to access."]]) self.cmd("notification", ["info", _["No peers found, but your content is ready to access."]])
if callback: if callback: