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
|
# 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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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"])
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue