Spaces:
Sleeping
Sleeping
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(
|