From 58ebbf601b09bd1f0f3e8e4e80e2e202f28b2bb4 Mon Sep 17 00:00:00 2001
From: Paul Brinkmeier <hallo@pbrinkmeier.de>
Date: Sun, 20 Aug 2023 11:51:51 +0200
Subject: [PATCH] Add template for unauthenticated response

---
 jon/auth.py                    | 21 +++++------
 jon/static/jon.css             | 65 ++++++++++++++++++++++++++++++++
 jon/templates/auth/denied.html | 36 ++++++++++++++++++
 jon/templates/base.html        | 68 +---------------------------------
 4 files changed, 112 insertions(+), 78 deletions(-)
 create mode 100644 jon/static/jon.css
 create mode 100644 jon/templates/auth/denied.html

diff --git a/jon/auth.py b/jon/auth.py
index 7bf3885..cfe8916 100644
--- a/jon/auth.py
+++ b/jon/auth.py
@@ -1,7 +1,7 @@
 import random
 import string
 
-from flask import Blueprint, make_response, request, redirect, session
+from flask import Blueprint, request, redirect, render_template, session
 
 bp = Blueprint("auth", __name__, url_prefix="/auth")
 
@@ -9,15 +9,10 @@ bp = Blueprint("auth", __name__, url_prefix="/auth")
 ACCESS_TOKEN = "".join(random.choice(string.ascii_lowercase) for i in range(64))
 
 
-ERROR_TEXT =  """
-              For security-reasons we must make sure you are the person who executed jon :D <br />
-              <form action="" method="get">
-                  <input type="password" name="token" placeholder="Token" />
-                  <input type="submit" value="login" />
-              </form>
-              <hr />
-
-              """
+ALLOWED_PATHS = [
+    "/favicon.ico",
+    "/static/jon.css"
+]
 
 
 def before_request():
@@ -32,8 +27,12 @@ def before_request():
         # Reload the page without query parameters
         return redirect(request.path)
 
+    # Don't deny any paths in `ALLOWED_PATHS`
+    if request.path in ALLOWED_PATHS:
+        return
+
     if not "authenticated" in session:
-        return ERROR_TEXT, 403
+        return render_template("auth/denied.html"), 403
 
 
 @bp.get("/logout")
diff --git a/jon/static/jon.css b/jon/static/jon.css
new file mode 100644
index 0000000..9897996
--- /dev/null
+++ b/jon/static/jon.css
@@ -0,0 +1,65 @@
+html {
+  font-family: Helvetica, sans-serif;
+}
+h1 {
+  margin: 0;
+}
+nav > ul {
+  padding-left: 0;
+}
+nav > ul > li {
+  display: inline-block;
+  list-style: none;
+}
+nav > ul > li + li:before {
+  content: ' · ';
+}
+.current-page > a {
+  position: relative;
+}
+.current-page > a:after {
+  content: '↓';
+  font-size: 0.8em;
+  box-sizing: border-box;
+  position: absolute;
+  display: block;
+  right: 50%;
+  top: -1em;
+  width: 1em;
+  text-align: center;
+  margin-right: -0.5em;
+  animation: wiggle 0.8s ease-in-out 0s infinite;
+  /* animation-direction: alternate; */
+}
+.--align-left {
+  text-align: left;
+}
+.--align-right {
+  text-align: right;
+}
+.--centered {
+  text-align: center;
+}
+@keyframes wiggle {
+  0%, 100% { margin-top: 0; }
+  50% { margin-top: -0.5em; }
+  /* 100% { transform: rotate(1turn); } */
+}
+table {
+  border-spacing: .5em 0;
+}
+th {
+  font-size: .8em;
+}
+@media print {
+  body {
+    font-size: 8px;
+  }
+}
+.form-input > label {
+  font-size: .8em;
+}
+.form-input > input:not([type=radio]),
+.form-input > select {
+  display: block;
+}
diff --git a/jon/templates/auth/denied.html b/jon/templates/auth/denied.html
new file mode 100644
index 0000000..1122b1b
--- /dev/null
+++ b/jon/templates/auth/denied.html
@@ -0,0 +1,36 @@
+
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="UTF-8">
+    <title>jon · not authenticated</title>
+    <link rel="stylesheet" href="/static/jon.css">
+  </head>
+  <body>
+    <header>
+      <h1>jon</h1>
+
+      {% if config.DEBUG %}
+      <details>
+        <summary><code>config</code></summary>
+        <pre>{% for key, value in config.items() %}{{ key }} = {{ value }}
+{% endfor %}</pre>
+      </details>
+      {% endif %}
+    </header>
+
+    <main>
+      <p>
+        Damit kein Schabernack getrieben wird müssen wir sicherstellen, dass du die Person bist die jon ausgeführt hat.
+        Gib unten das Token ein, welches jon beim Starten ausgegeben hat.
+      </p>
+      <form method="GET">
+        <div class="form-input">
+          <label for="token">Token</label>
+          <input type="password" name="token" placeholder="Token" id="token">
+        </div>
+        <button type="submit">Authentifizieren</button>
+      </form>
+    </main>
+  </body>
+</html>
diff --git a/jon/templates/base.html b/jon/templates/base.html
index 07b30b8..c4af7be 100644
--- a/jon/templates/base.html
+++ b/jon/templates/base.html
@@ -3,73 +3,7 @@
   <head>
     <meta charset="UTF-8">
     <title>jon</title>
-    <style>
-      html {
-        font-family: Helvetica, sans-serif;
-      }
-      h1 {
-        margin: 0;
-      }
-      nav > ul {
-        padding-left: 0;
-      }
-      nav > ul > li {
-        display: inline-block;
-        list-style: none;
-      }
-      nav > ul > li + li:before {
-        content: ' · ';
-      }
-      .current-page > a {
-        position: relative;
-      }
-      .current-page > a:after {
-        content: '↓';
-        font-size: 0.8em;
-        box-sizing: border-box;
-        position: absolute;
-        display: block;
-        right: 50%;
-        top: -1em;
-        width: 1em;
-        text-align: center;
-        margin-right: -0.5em;
-        animation: wiggle 0.8s ease-in-out 0s infinite;
-        /* animation-direction: alternate; */
-      }
-      .--align-left {
-        text-align: left;
-      }
-      .--align-right {
-        text-align: right;
-      }
-      .--centered {
-        text-align: center;
-      }
-      @keyframes wiggle {
-        0%, 100% { margin-top: 0; }
-        50% { margin-top: -0.5em; }
-        /* 100% { transform: rotate(1turn); } */
-      }
-      table {
-        border-spacing: .5em 0;
-      }
-      th {
-        font-size: .8em;
-      }
-      @media print {
-        body {
-          font-size: 8px;
-        }
-      }
-      .form-input > label {
-        font-size: .8em;
-      }
-      .form-input > input:not([type=radio]),
-      .form-input > select {
-        display: block;
-      }
-    </style>
+    <link rel="stylesheet" href="/static/jon.css">
   </head>
   <body>
     <header>