Skip to content

Commit e16611f

Browse files
committed
Allow websocket connection originates from earlier accepted hostnames
1 parent 24b3651 commit e16611f

2 files changed

Lines changed: 21 additions & 9 deletions

File tree

src/Ui/UiRequest.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,16 @@ def getSiteUrl(self, address):
378378
else:
379379
return "/" + address
380380

381+
def getWsServerUrl(self):
382+
if self.isProxyRequest():
383+
if self.env["REMOTE_ADDR"] == "127.0.0.1": # Local client, the server address also should be 127.0.0.1
384+
server_url = "http://127.0.0.1:%s" % self.env["SERVER_PORT"]
385+
else: # Remote client, use SERVER_NAME as server's real address
386+
server_url = "http://%s:%s" % (self.env["SERVER_NAME"], self.env["SERVER_PORT"])
387+
else:
388+
server_url = ""
389+
return server_url
390+
381391
def processQueryString(self, site, query_string):
382392
match = re.search("zeronet_peers=(.*?)(&|$)", query_string)
383393
if match:
@@ -414,6 +424,9 @@ def renderWrapper(self, site, path, inner_path, title, extra_headers, show_loadi
414424
file_url = "/" + address + "/" + inner_path
415425
root_url = "/" + address + "/"
416426

427+
if self.isProxyRequest():
428+
self.server.allowed_ws_origins.add(self.env["HTTP_HOST"])
429+
417430
# Wrapper variable inits
418431
body_style = ""
419432
meta_tags = ""
@@ -430,15 +443,12 @@ def renderWrapper(self, site, path, inner_path, title, extra_headers, show_loadi
430443
inner_query_string = "?wrapper_nonce=%s" % wrapper_nonce
431444

432445
if self.isProxyRequest(): # Its a remote proxy request
433-
if self.env["REMOTE_ADDR"] == "127.0.0.1": # Local client, the server address also should be 127.0.0.1
434-
server_url = "http://127.0.0.1:%s" % self.env["SERVER_PORT"]
435-
else: # Remote client, use SERVER_NAME as server's real address
436-
server_url = "http://%s:%s" % (self.env["SERVER_NAME"], self.env["SERVER_PORT"])
437446
homepage = "http://zero/" + config.homepage
438447
else: # Use relative path
439-
server_url = ""
440448
homepage = "/" + config.homepage
441449

450+
server_url = self.getWsServerUrl() # Real server url for WS connections
451+
442452
user = self.getCurrentUser()
443453
if user:
444454
theme = user.settings.get("theme", "light")
@@ -717,11 +727,12 @@ def actionWebsocket(self):
717727
# Allow only same-origin websocket requests
718728
origin = self.env.get("HTTP_ORIGIN")
719729
host = self.env.get("HTTP_HOST")
720-
if origin and host:
730+
# Allow only same-origin websocket requests
731+
if origin:
721732
origin_host = origin.split("://", 1)[-1]
722-
if host != origin_host:
733+
if origin_host != host and origin_host not in self.server.allowed_ws_origins:
723734
ws.send(json.dumps({"error": "Invalid origin: %s" % origin}))
724-
return self.error403("Invalid origin: %s" % origin)
735+
return self.error403("Invalid origin: %s %s" % (origin, self.server.allowed_ws_origins))
725736

726737
# Find site by wrapper_key
727738
wrapper_key = self.get["wrapper_key"]

src/Ui/UiServer.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ def __init__(self):
7676
self.allowed_hosts.update(["localhost"])
7777
else:
7878
self.allowed_hosts = set([])
79+
self.allowed_ws_origins = set()
7980
self.allow_trans_proxy = config.ui_trans_proxy
8081

8182
self.wrapper_nonces = []
@@ -196,4 +197,4 @@ def stop(self):
196197

197198
def updateWebsocket(self, **kwargs):
198199
for ws in self.websockets:
199-
ws.event("serverChanged", kwargs)
200+
ws.event("serverChanged", kwargs)

0 commit comments

Comments
 (0)