@@ -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" ]
0 commit comments