from base64 import urlsafe_b64encode from hashlib import sha3_512 from pathlib import Path from secrets import token_urlsafe from falcon.constants import MEDIA_JS from jinja2 import Environment, FileSystemLoader class CryptResource: @staticmethod def scramble(secret, value): h = sha3_512() h.update(f"{secret}{value}".encode()) return urlsafe_b64encode(h.digest()).rstrip(b'=').decode('ascii') def __init__(self, secret=None): self.current_hubapp = "first" self.secret = secret or token_urlsafe(64) self.master_uri = f"/{self.scramble(self.secret, 'index.html')}" self.master_js_uri = f"/{self.scramble(self.secret, 'master.js')}" hubapp_dir = Path(__file__).parents[1] / "hubapps" / self.current_hubapp self.env = Environment(loader=FileSystemLoader(hubapp_dir)) with open(hubapp_dir / "index.js", "rb") as fh: self._index_js = fh.read() with open(hubapp_dir / "master.js", "rb") as fh: self._master_js = fh.read() async def on_get(self, req, resp): resp.data = self.env.get_template("index.html.j2").render({}).encode() async def on_get_index_js(self, req, resp): resp.data = self.env.get_template("index.js").render({}).encode() async def on_get_master(self, req, resp): resp.data = self.env.get_template("master.html.j2").render({"master_js": self.master_js_uri}).encode() async def on_get_master_js(self, req, resp): resp.data = self._master_js resp.content_type = MEDIA_JS def register_on(self, app): app.add_route("/", self) app.add_route("/index.js", self, suffix="index_js") app.add_route(self.master_uri, self, suffix="master") app.add_route(self.master_js_uri, self, suffix="master_js")