]> git.mar77i.info Git - hublib/blob - hub/cryptresource.py
initial commit
[hublib] / hub / cryptresource.py
1 from base64 import urlsafe_b64encode
2 from hashlib import sha3_512
3 from pathlib import Path
4 from secrets import token_urlsafe
5
6 from falcon.constants import MEDIA_JS
7 from jinja2 import Environment, FileSystemLoader
8
9
10 class CryptResource:
11 @staticmethod
12 def scramble(secret, value):
13 h = sha3_512()
14 h.update(f"{secret}{value}".encode())
15 return urlsafe_b64encode(h.digest()).rstrip(b'=').decode('ascii')
16
17 def __init__(self, secret=None):
18 self.current_hubapp = "first"
19 self.secret = secret or token_urlsafe(64)
20 self.master_uri = f"/{self.scramble(self.secret, 'index.html')}"
21 self.master_js_uri = f"/{self.scramble(self.secret, 'master.js')}"
22 hubapp_dir = Path(__file__).parents[1] / "hubapps" / self.current_hubapp
23 self.env = Environment(loader=FileSystemLoader(hubapp_dir))
24 with open(hubapp_dir / "index.js", "rb") as fh:
25 self._index_js = fh.read()
26 with open(hubapp_dir / "master.js", "rb") as fh:
27 self._master_js = fh.read()
28
29 async def on_get(self, req, resp):
30 resp.data = self.env.get_template("index.html.j2").render({}).encode()
31
32 async def on_get_index_js(self, req, resp):
33 resp.data = self.env.get_template("index.js").render({}).encode()
34
35 async def on_get_master(self, req, resp):
36 resp.data = self.env.get_template("master.html.j2").render({"master_js": self.master_js_uri}).encode()
37
38 async def on_get_master_js(self, req, resp):
39 resp.data = self._master_js
40 resp.content_type = MEDIA_JS
41
42 def register_on(self, app):
43 app.add_route("/", self)
44 app.add_route("/index.js", self, suffix="index_js")
45 app.add_route(self.master_uri, self, suffix="master")
46 app.add_route(self.master_js_uri, self, suffix="master_js")