(self)
| 734 | |
| 735 | # On websocket connection |
| 736 | def actionWebsocket(self): |
| 737 | ws = self.env.get("wsgi.websocket") |
| 738 | |
| 739 | if ws: |
| 740 | # Allow only same-origin websocket requests |
| 741 | origin = self.env.get("HTTP_ORIGIN") |
| 742 | host = self.env.get("HTTP_HOST") |
| 743 | # Allow only same-origin websocket requests |
| 744 | if origin: |
| 745 | origin_host = origin.split("://", 1)[-1] |
| 746 | if origin_host != host and origin_host not in self.server.allowed_ws_origins: |
| 747 | ws.send(json.dumps({"error": "Invalid origin: %s" % origin})) |
| 748 | return self.error403("Invalid origin: %s" % origin) |
| 749 | |
| 750 | # Find site by wrapper_key |
| 751 | wrapper_key = self.get["wrapper_key"] |
| 752 | site = None |
| 753 | for site_check in list(self.server.sites.values()): |
| 754 | if site_check.settings["wrapper_key"] == wrapper_key: |
| 755 | site = site_check |
| 756 | |
| 757 | if site: # Correct wrapper key |
| 758 | try: |
| 759 | user = self.getCurrentUser() |
| 760 | except Exception as err: |
| 761 | ws.send(json.dumps({"error": "Error in data/user.json: %s" % err})) |
| 762 | return self.error500("Error in data/user.json: %s" % err) |
| 763 | if not user: |
| 764 | ws.send(json.dumps({"error": "No user found"})) |
| 765 | return self.error403("No user found") |
| 766 | ui_websocket = UiWebsocket(ws, site, self.server, user, self) |
| 767 | site.websockets.append(ui_websocket) # Add to site websockets to allow notify on events |
| 768 | self.server.websockets.append(ui_websocket) |
| 769 | ui_websocket.start() |
| 770 | self.server.websockets.remove(ui_websocket) |
| 771 | for site_check in list(self.server.sites.values()): |
| 772 | # Remove websocket from every site (admin sites allowed to join other sites event channels) |
| 773 | if ui_websocket in site_check.websockets: |
| 774 | site_check.websockets.remove(ui_websocket) |
| 775 | return "Bye." |
| 776 | else: # No site found by wrapper key |
| 777 | ws.send(json.dumps({"error": "Wrapper key not found: %s" % wrapper_key})) |
| 778 | return self.error403("Wrapper key not found: %s" % wrapper_key) |
| 779 | else: |
| 780 | self.start_response("400 Bad Request", []) |
| 781 | return [b"Not a websocket request!"] |
| 782 | |
| 783 | # Debug last error |
| 784 | def actionDebug(self): |
no test coverage detected