thomasht86 commited on
Commit
ca1e31f
·
verified ·
1 Parent(s): 1e0c0d5

deploy at 2024-08-24 20:17:44.188098

Browse files
Files changed (1) hide show
  1. main.py +37 -37
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 = False
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
- print(f"Auth: {auth}")
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
- SessionMiddleware,
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 post(login: Login, sess):
440
- if not compare_digest(ADMIN_PWD.encode("utf-8"), login.pwd.encode("utf-8")):
441
- # Incorrect password - add error message
442
- return RedirectResponse("/login?error=True", status_code=303)
443
 
444
- sess["auth"] = True
445
- response = RedirectResponse("/admin", status_code=303)
446
- print(sess)
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 response
457
 
458
 
459
- @app.get("/logout")
460
- def logout(sess):
461
- sess["auth"] = False
462
  return RedirectResponse("/")
463
 
464
 
@@ -656,12 +656,12 @@ def download_csv(auth):
656
  )
657
 
658
 
659
- @app.get("/admin")
660
- def get_admin(auth, sess, page: int = 1):
661
- # Check if the user is authenticated
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(auth),
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(