Spaces:
Running
Running
deploy at 2024-08-24 20:17:44.188098
Browse files
main.py
CHANGED
@@ -46,6 +46,9 @@ from starlette.middleware import Middleware
|
|
46 |
from starlette.middleware.base import BaseHTTPMiddleware
|
47 |
from starlette.middleware.sessions import SessionMiddleware
|
48 |
from starlette.middleware.cors import CORSMiddleware
|
|
|
|
|
|
|
49 |
from vespa.application import Vespa
|
50 |
import json
|
51 |
import os
|
@@ -59,8 +62,9 @@ from enum import Enum
|
|
59 |
from typing import Tuple as T
|
60 |
from urllib.parse import quote
|
61 |
import uuid
|
|
|
62 |
|
63 |
-
DEV_MODE =
|
64 |
|
65 |
if DEV_MODE:
|
66 |
print("Running in DEV_MODE - Hot reload enabled")
|
@@ -123,9 +127,7 @@ def user_auth_before(req, sess):
|
|
123 |
# be secure to use.
|
124 |
print(f"Session Data before route: {sess}")
|
125 |
auth = req.scope["auth"] = sess.get("auth", None)
|
126 |
-
|
127 |
-
if not auth:
|
128 |
-
return login_redir
|
129 |
|
130 |
|
131 |
spinner_css = Style("""
|
@@ -179,16 +181,22 @@ class DebugSessionMiddleware(SessionMiddleware):
|
|
179 |
await super().__call__(scope, receive, send)
|
180 |
print(f"DebugSessionMiddleware: After processing - Scope: {scope}")
|
181 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
182 |
middlewares = [
|
183 |
-
Middleware(
|
184 |
-
|
185 |
-
secret_key=get_key(fname=sess_key_path),
|
186 |
-
max_age=3600,
|
187 |
-
),
|
188 |
-
Middleware(XFrameOptionsMiddleware),
|
189 |
-
#Middleware(SessionLoggingMiddleware),
|
190 |
-
#Middleware(DebugSessionMiddleware, secret_key=get_key(fname=sess_key_path)),
|
191 |
]
|
|
|
192 |
bware = Beforeware(
|
193 |
user_auth_before,
|
194 |
skip=[
|
@@ -208,7 +216,7 @@ bware = Beforeware(
|
|
208 |
)
|
209 |
|
210 |
app, rt = fast_app(
|
211 |
-
before=bware,
|
212 |
live=DEV_MODE,
|
213 |
hdrs=headers,
|
214 |
middleware=middlewares,
|
@@ -436,29 +444,21 @@ def get_login_form(sess, error: bool = False):
|
|
436 |
|
437 |
|
438 |
@app.post("/login")
|
439 |
-
def
|
440 |
-
|
441 |
-
|
442 |
-
|
443 |
|
444 |
-
|
445 |
-
|
446 |
-
|
447 |
-
# Explicitly set the session cookie
|
448 |
-
response.set_cookie(
|
449 |
-
key="session",
|
450 |
-
value=sess,
|
451 |
-
httponly=True,
|
452 |
-
secure=True,
|
453 |
-
samesite="Lax"
|
454 |
-
)
|
455 |
|
456 |
-
return
|
457 |
|
458 |
|
459 |
-
@app.
|
460 |
-
def logout(
|
461 |
-
|
462 |
return RedirectResponse("/")
|
463 |
|
464 |
|
@@ -656,12 +656,12 @@ def download_csv(auth):
|
|
656 |
)
|
657 |
|
658 |
|
659 |
-
@app.
|
660 |
-
def
|
661 |
-
|
662 |
-
if not sess.get("auth"):
|
663 |
return RedirectResponse("/login", status_code=303)
|
664 |
|
|
|
665 |
limit = 15
|
666 |
offset = (page - 1) * limit
|
667 |
total_queries_result = list(
|
@@ -737,7 +737,7 @@ def get_admin(auth, sess, page: int = 1):
|
|
737 |
|
738 |
return (
|
739 |
Title("Admin"),
|
740 |
-
get_navbar(
|
741 |
Main(
|
742 |
Div(
|
743 |
A(
|
|
|
46 |
from starlette.middleware.base import BaseHTTPMiddleware
|
47 |
from starlette.middleware.sessions import SessionMiddleware
|
48 |
from starlette.middleware.cors import CORSMiddleware
|
49 |
+
from starlette.middleware.authentication import AuthenticationMiddleware
|
50 |
+
from starlette.authentication import AuthenticationBackend, AuthenticationError, SimpleUser, AuthCredentials
|
51 |
+
from starlette.responses import RedirectResponse
|
52 |
from vespa.application import Vespa
|
53 |
import json
|
54 |
import os
|
|
|
62 |
from typing import Tuple as T
|
63 |
from urllib.parse import quote
|
64 |
import uuid
|
65 |
+
import secrets
|
66 |
|
67 |
+
DEV_MODE = True
|
68 |
|
69 |
if DEV_MODE:
|
70 |
print("Running in DEV_MODE - Hot reload enabled")
|
|
|
127 |
# be secure to use.
|
128 |
print(f"Session Data before route: {sess}")
|
129 |
auth = req.scope["auth"] = sess.get("auth", None)
|
130 |
+
|
|
|
|
|
131 |
|
132 |
|
133 |
spinner_css = Style("""
|
|
|
181 |
await super().__call__(scope, receive, send)
|
182 |
print(f"DebugSessionMiddleware: After processing - Scope: {scope}")
|
183 |
|
184 |
+
# Generate a secure secret key
|
185 |
+
SECRET_KEY = secrets.token_urlsafe(32)
|
186 |
+
|
187 |
+
# Custom authentication backend
|
188 |
+
class SimpleAuthBackend(AuthenticationBackend):
|
189 |
+
async def authenticate(self, request):
|
190 |
+
if "auth" not in request.session:
|
191 |
+
return None
|
192 |
+
return AuthCredentials(["authenticated"]), SimpleUser("admin")
|
193 |
+
|
194 |
+
# Simplified middleware setup
|
195 |
middlewares = [
|
196 |
+
Middleware(SessionMiddleware, secret_key=SECRET_KEY, max_age=3600),
|
197 |
+
Middleware(AuthenticationMiddleware, backend=SimpleAuthBackend()),
|
|
|
|
|
|
|
|
|
|
|
|
|
198 |
]
|
199 |
+
|
200 |
bware = Beforeware(
|
201 |
user_auth_before,
|
202 |
skip=[
|
|
|
216 |
)
|
217 |
|
218 |
app, rt = fast_app(
|
219 |
+
#before=bware,
|
220 |
live=DEV_MODE,
|
221 |
hdrs=headers,
|
222 |
middleware=middlewares,
|
|
|
444 |
|
445 |
|
446 |
@app.post("/login")
|
447 |
+
async def login(request):
|
448 |
+
form = await request.form()
|
449 |
+
username = form.get("name")
|
450 |
+
password = form.get("pwd")
|
451 |
|
452 |
+
if username == ADMIN_NAME and compare_digest(ADMIN_PWD.encode("utf-8"), password.encode("utf-8")):
|
453 |
+
request.session["auth"] = True
|
454 |
+
return RedirectResponse("/admin", status_code=303)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
455 |
|
456 |
+
return RedirectResponse("/login?error=True", status_code=303)
|
457 |
|
458 |
|
459 |
+
@app.route("/logout")
|
460 |
+
async def logout(request):
|
461 |
+
request.session.pop("auth", None)
|
462 |
return RedirectResponse("/")
|
463 |
|
464 |
|
|
|
656 |
)
|
657 |
|
658 |
|
659 |
+
@app.route("/admin")
|
660 |
+
async def admin(request):
|
661 |
+
if not request.user.is_authenticated:
|
|
|
662 |
return RedirectResponse("/login", status_code=303)
|
663 |
|
664 |
+
page = int(request.query_params.get("page", 1))
|
665 |
limit = 15
|
666 |
offset = (page - 1) * limit
|
667 |
total_queries_result = list(
|
|
|
737 |
|
738 |
return (
|
739 |
Title("Admin"),
|
740 |
+
get_navbar(request.user.is_authenticated),
|
741 |
Main(
|
742 |
Div(
|
743 |
A(
|