diff --git a/src/snek/app.py b/src/snek/app.py index 09df0bd..177c38e 100644 --- a/src/snek/app.py +++ b/src/snek/app.py @@ -408,6 +408,11 @@ class Application(BaseApplication): self.jinja2_env.loader = await self.get_user_template_loader( request.session.get("uid") ) + + try: + context["nonce"] = request['csp_nonce'] + except: + context['nonce'] = '?' rendered = await super().render_template(template, request, context) diff --git a/src/snek/service/channel.py b/src/snek/service/channel.py index 0af0a4b..5d15683 100644 --- a/src/snek/service/channel.py +++ b/src/snek/service/channel.py @@ -113,6 +113,12 @@ class ChannelService(BaseService): channel = await self.get(uid=channel_member["channel_uid"]) yield channel + async def clear(self, channel_uid): + model = await self.get(uid=channel_uid) + model['history_from'] = datetime.now() + await self.save(model) + + async def ensure_public_channel(self, created_by_uid): model = await self.get(is_listed=True, tag="public") is_moderator = False diff --git a/src/snek/static/editor.js b/src/snek/static/editor.js index 87f2da8..8ee3bd3 100644 --- a/src/snek/static/editor.js +++ b/src/snek/static/editor.js @@ -1,4 +1,4 @@ -import { NjetComponent} from "/njext.ks" +import { NjetComponent} from "/njet.js" class NjetEditor extends NjetComponent { constructor() { diff --git a/src/snek/system/mapper.py b/src/snek/system/mapper.py index 22f958e..d7f1451 100644 --- a/src/snek/system/mapper.py +++ b/src/snek/system/mapper.py @@ -33,6 +33,7 @@ class BaseMapper: try: return func(*args, **kwargs) except Exception as ex: + await asyncio.sleep(0) database_exception = ex raise database_exception return await self.loop.run_in_executor(None, lambda: func(*args, **kwargs)) diff --git a/src/snek/system/middleware.py b/src/snek/system/middleware.py index 93e5eaf..a84e5cf 100644 --- a/src/snek/system/middleware.py +++ b/src/snek/system/middleware.py @@ -10,28 +10,25 @@ import secrets from aiohttp import web -csp_policy = ( - "default-src 'self'; " - "script-src 'self' https://*.cloudflare.com https://molodetz.nl 'nonce-{nonce}'; " - "style-src 'self' https://*.cloudflare.com https://molodetz.nl; " - "img-src 'self' https://*.cloudflare.com https://molodetz.nl data:; " - "connect-src 'self' https://*.cloudflare.com https://molodetz.nl;" -) - - -def generate_nonce(): - return secrets.token_hex(16) - - @web.middleware async def csp_middleware(request, handler): - + nonce = str(secrets.token_hex(16)) + print("Nonce:", nonce) + csp_policy = ( + "default-src 'self'; " + f"script-src 'self' https://umami.molodetz.nl 'nonce-{nonce}'; " + "style-src 'self'; " + "img-src *; " + "connect-src 'self'; https://umami.molodetz.nl; 'nonce-{nonce}';" + "font-src 'self'; " + "object-src 'none'; " + "base-uri 'self'; " + "form-action 'self';" + ) + request['csp_nonce'] = nonce response = await handler(request) - return response - nonce = generate_nonce() - response.headers["Content-Security-Policy"] = csp_policy.format(nonce=nonce) - return response - + response.headers['Content-Security-Policy'] = csp_policy + return response @web.middleware async def no_cors_middleware(request, handler): diff --git a/src/snek/templates/app.html b/src/snek/templates/app.html index eff9c2a..f5b0481 100644 --- a/src/snek/templates/app.html +++ b/src/snek/templates/app.html @@ -31,7 +31,7 @@ - +