1 from base64
import urlsafe_b64encode
2 from hashlib
import sha3_512
3 from pathlib
import Path
4 from secrets
import token_urlsafe
6 from falcon
.constants
import MEDIA_JS
7 from jinja2
import Environment
, FileSystemLoader
12 def scramble(secret
, value
):
14 h
.update(f
"{secret}{value}".encode())
15 return urlsafe_b64encode(h
.digest()).rstrip(b
'=').decode('ascii')
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()
29 async def on_get(self
, req
, resp
):
30 resp
.data
= self
.env
.get_template("index.html.j2").render({}).encode()
32 async def on_get_index_js(self
, req
, resp
):
33 resp
.data
= self
.env
.get_template("index.js").render({}).encode()
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()
38 async def on_get_master_js(self
, req
, resp
):
39 resp
.data
= self
._master
_js
40 resp
.content_type
= MEDIA_JS
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")