WIP
This commit is contained in:
31
app/utils.py
31
app/utils.py
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user