diff --git a/gateway.py b/gateway.py
index a13816f..ffafc6a 100644
--- a/gateway.py
+++ b/gateway.py
@@ -123,6 +123,14 @@ class GatewayHandler(BaseHTTPRequestHandler):
self.send_response(resp["status"])
self.send_header("Content-Type", resp.get("content_type", "text/html; charset=utf-8"))
+ self.send_header("Referrer-Policy", "no-referrer")
+ self.send_header("X-Content-Type-Options", "nosniff")
+ self.send_header("X-Frame-Options", "DENY")
+ self.send_header("Content-Security-Policy",
+ "default-src 'self'; "
+ "style-src 'self' 'unsafe-inline'; "
+ "script-src 'self' 'unsafe-inline'; "
+ "img-src 'self' data:")
for k, v in resp.get("headers", {}).items():
self.send_header(k, v)
self.end_headers()
diff --git a/handlers.py b/handlers.py
index ae7f484..6a03142 100644
--- a/handlers.py
+++ b/handlers.py
@@ -245,7 +245,7 @@ def handle_search(query):
snip_html = f' {esc(r["summary"])}' if r["summary"] else ""
result_html += (
f'
'
- f'
{esc(r["title"])} '
+ f'
{esc(r["title"])} '
f'
{esc(r["url"])} '
f'{snip_html}'
f'{note_html}{tags_html}'
@@ -276,7 +276,7 @@ def handle_search(query):
items = ""
for l in trusted:
items += (
- f'
{esc(l["label"])} '
+ f'{esc(l["label"])} '
f'— from {esc(l["source_title"])} '
)
trusted_html = (
@@ -311,8 +311,8 @@ def handle_search(query):
for r in items:
note_html = f' —
{esc(r["note"])} ' if r["note"] else ""
source_items += (
- f'
{esc(r["title"])} '
- f'{note_html} ({esc(r["url"])}) '
+ f'
{esc(r["title"])} '
+ f'{note_html} ({esc(clean_url(r["url"]))}) '
)
remote_html += (
f'
'
@@ -473,7 +473,7 @@ def handle_add_manual_submit(body):
# Log error but don't fail the whole operation
print(f"Error generating embeddings: {e}")
- return handle_add_form(f'Added manually: {esc(manual_title)} ')
+ return handle_add_form(f'Added manually: {esc(manual_title)} ')
finally:
return_db(db)
@@ -500,7 +500,7 @@ def handle_pages(query=None):
tags_html = f' {tag_links}'
items += (
f'{esc(r["title"])}{note_html}{tags_html} '
- f'({esc(r["url"])} ) '
+ f'({esc(r["url"])} ) '
f'edit '
f'remove '
)
@@ -700,7 +700,7 @@ def handle_style_form(msg=""):
f"Default: reticulum.derickphan.com:4242 "
f' '
f' '
- f'discover more nodes
'
+ f'discover more nodes
'
f"search "
f"ai "
f' [{esc(t)}]' for t in tags)
items += (
f'{esc(r["title"])}{note_html} {tag_links} '
- f'({esc(r["url"])} ) '
+ f'({esc(r["url"])} ) '
)
finally:
return_db(db)
@@ -1397,8 +1397,7 @@ def dispatch_request(data):
resp["headers"]["Content-Security-Policy"] = (
"default-src 'self'; "
"script-src 'self' 'unsafe-inline'; "
- "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; "
- "font-src 'self' https://fonts.gstatic.com; "
+ "style-src 'self' 'unsafe-inline'; "
"img-src * data:; "
"frame-ancestors 'none'; "
"form-action 'self'; "
diff --git a/templates.py b/templates.py
index 48beace..0dd9975 100644
--- a/templates.py
+++ b/templates.py
@@ -7,13 +7,13 @@ def esc(s):
-DEFAULT_TEMPLATE = "\n\n\n\n{{content}}\n\n"
+DEFAULT_TEMPLATE = "\n\n \n \n\n\n{{content}}\n\n"
def _default_template():
name = esc(get_setting("site_name", "tinyweb"))
return (
- "\n\n\n\n"
+ '\n\n \n \n\n\n'
f'{name} '
' | search | browse '
' | tags | subscriptions '
diff --git a/themes/junimo.html b/themes/junimo.html
index 25688b7..f85e315 100644
--- a/themes/junimo.html
+++ b/themes/junimo.html
@@ -3,15 +3,16 @@
+
+