From 5591a7787003188387b999e714d70a72a6cb1618 Mon Sep 17 00:00:00 2001 From: cato447 Date: Sun, 14 Sep 2025 16:34:12 +0200 Subject: [PATCH] WIP --- app/routes.py | 53 +++++++++++++++++++++++++++--------- app/templates/register.html | 54 +++++++++++++++++++++++++++++++++++++ app/utils.py | 3 ++- 3 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 app/templates/register.html diff --git a/app/routes.py b/app/routes.py index ad5418f..f16d22b 100644 --- a/app/routes.py +++ b/app/routes.py @@ -27,6 +27,7 @@ from .auth import check_password, user_loader from .forms import DeckForm, InfoBannerForm, LoginForm, PasswordForm from .models import Deck, InfoBanner, Password, db from .utils import ( + create_token, generate_password, generate_token, get_active_banner, @@ -49,18 +50,6 @@ def on_connect(): if flask_login.current_user.is_authenticated: join_room("instructor") -@main.before_request -def ensure_cookie(): - token = get_token() - if token: - return - else: - token = generate_token() - - resp = make_response(redirect(request.url)) - resp.set_cookie('access_token', serialize_token(token), httponly=True) - return resp - @main.after_request def inject_confused_button(response): if True: @@ -109,10 +98,48 @@ def inject_confused_button(response): def index(): token = get_token() if not token: - abort(500) + return redirect(url_for("main.register")) else: return render_template('index.html', active_banner=get_active_banner(), decks=get_unlocked_decks(token), user_name=token.name) +@main.route('/register', methods=['POST', 'GET']) +def register(): + """ + Handles user registration. + GET: Renders the registration form. + POST: Processes the form submission. + """ + if request.method == 'POST': + # Get form data + user_name = request.form.get('username') + acknowledge = request.form.get('acknowledge') + + # Simple validation + if not user_name: + flash('Username is required.', 'error') + return render_template('register.html') + + if retrieve_token(user_name): + flash(f'The username "{user_name}" is already taken.', 'error') + return render_template('register.html') + + if not acknowledge: + flash('You must acknowledge the important information to proceed.', 'error') + return render_template('register.html') + + # If all validation passes, "register" the user + token = create_token(user_name) + print(f"User registered: {user_name}") + + + resp = make_response(redirect(url_for("main.index"))) + resp.set_cookie('access_token', serialize_token(token), httponly=True) + flash(f'Registration successful for {user_name}!', 'success') + # Redirect to the login page after successful registration + return resp + + # If GET request, render the form + return render_template('register.html') @main.route('/login', methods=['POST', 'GET']) def login(): diff --git a/app/templates/register.html b/app/templates/register.html new file mode 100644 index 0000000..cf7729d --- /dev/null +++ b/app/templates/register.html @@ -0,0 +1,54 @@ + + + + + + Register for Tutortool + + + + +
+
+

Create an Account

+

Choose a username to get started.

+
+ +
+ +
+ + +
+ +
+

Important Information

+

+ Your username is tied to the slides using a browser cookie. If you clear your cookies, you can regain access to your slides by logging in with the same username. +

+
+ + +
+
+ + +
+ +

+ Already have an account? Log In +

+
+ + + diff --git a/app/utils.py b/app/utils.py index cfedca7..2b00875 100644 --- a/app/utils.py +++ b/app/utils.py @@ -28,7 +28,6 @@ def get_available_decks(app: Flask): def generate_username() -> str: return cast(str, xkcd_password.generate_xkcdpassword(wordlist=words, numwords=3, delimiter="-")) - def generate_password() -> str: return cast(str, xkcd_password.generate_xkcdpassword(wordlist=words, numwords=2, delimiter="-")) @@ -41,7 +40,9 @@ def generate_token() -> Token: break else: raise RuntimeError(f"Unique username could not be generated after {max_tries} tries") + return create_token(user_name) +def create_token(user_name : str) -> Token: token = Token(user_name) db.session.add(token) db.session.commit()