This commit is contained in:
2025-12-09 00:13:03 +01:00
parent 86d0da5ca7
commit daffc4f458
3 changed files with 149 additions and 30 deletions

View File

@@ -1,4 +1,5 @@
import os
import logging
from flask import Flask, request, session
from typing import cast
@@ -7,10 +8,14 @@ from xkcdpass import xkcd_password
from .models import Deck, InfoBanner, Token, db, Course
# Create a module-level logger per Flask/Python standards
logger = logging.getLogger(__name__)
def init_password_generator():
wordfile = xkcd_password.locate_wordfile()
global words
words = xkcd_password.generate_wordlist(wordfile=wordfile, min_length=3, max_length=6)
logger.info("Password generator initialized.")
def init_serializer(app: Flask):
global serializer
@@ -21,9 +26,14 @@ def get_active_banner() -> InfoBanner | None:
def get_available_decks(app: Flask, course: Course):
slides_dir = os.path.join(app.config['SLIDES_DIR'], course.folder)
deck_names = [name for name in os.listdir(slides_dir) if os.path.isdir(os.path.join(slides_dir, name))]
deck_names.sort()
return deck_names
try:
deck_names = [name for name in os.listdir(slides_dir) if os.path.isdir(os.path.join(slides_dir, name))]
deck_names.sort()
return deck_names
except FileNotFoundError:
# Log this error as it indicates a configuration or filesystem issue
logger.error(f"Slides directory not found for course {course.folder}: {slides_dir}")
return []
def generate_username() -> str:
return cast(str, xkcd_password.generate_xkcdpassword(wordlist=words, numwords=3, delimiter="-"))
@@ -42,6 +52,8 @@ def generate_token() -> Token:
if not db.session.execute(db.select(Token).where(Token.name == user_name)).scalar():
break
else:
# Critical error: Application cannot register new users
logger.critical(f"Failed to generate unique username after {max_tries} tries.")
raise RuntimeError(f"Unique username could not be generated after {max_tries} tries")
return create_token(user_name)
@@ -49,20 +61,23 @@ def create_token(user_name : str) -> Token:
token = Token(user_name)
db.session.add(token)
db.session.commit()
logger.info(f"Created new token for user: {user_name}")
return token
def serialize_token(token: Token) -> str:
return serializer.dumps(token.id)
def get_token() -> (Token | None):
token = request.cookies.get('access_token')
if not token:
token_cookie = request.cookies.get('access_token')
if not token_cookie:
return None
try:
id = serializer.loads(token)
id = serializer.loads(token_cookie)
token = db.session.get(Token, id)
return token
except BadSignature:
# Warning: Client sent a tampered or invalid cookie
logger.warning("Invalid signature for token cookie encountered.")
return None
def retrieve_token(username : str):
@@ -77,7 +92,6 @@ def get_unlocked_decks(token: (Token|None)):
def is_deck_unlocked(deck: str):
token = get_token()
print(token)
if token:
return token.is_unlocked(deck)
else:
@@ -89,8 +103,11 @@ def update_token(decks: list[Deck]):
"""
token = get_token()
if token is None:
logger.error("Attempted to update token decks, but token is None.")
raise ValueError("Invalid token is set")
else:
# Log the update action
logger.info(f"Updating decks for user {token.name}. Adding {len(decks)} decks.")
token.decks = list(set(decks + token.decks))
db.session.commit()