Store opened port status per IP version
This commit is contained in:
parent
ce78e330d3
commit
447f5fd5c8
7 changed files with 65 additions and 36 deletions
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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"])
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue