diff --git a/app/routes.py b/app/routes.py index f1c9a0c..e0f7c5f 100644 --- a/app/routes.py +++ b/app/routes.py @@ -30,14 +30,29 @@ from .utils import ( get_token, get_unlocked_decks, is_deck_unlocked, + retrieve_token, serialize_token, update_token, ) + main = Blueprint('main', __name__) slidev_deck_pattern = re.compile(r"^\/slides\/[^\/]+\/\d*(?:\?.*)?$") slidev_all_pattern = re.compile(r"^\/slides\/[^\/]+(?:\/presenter)?\/\d+(?:\?.*)?$") + +@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: @@ -81,15 +96,15 @@ def inject_confused_button(response): response.set_data(body) return response - + @main.route('/') def index(): token = get_token() if not token: - token = generate_token() - resp = make_response(render_template('index.html', active_banner=get_active_banner(), decks=get_unlocked_decks(token), user_name=token.name)) - resp.set_cookie('access_token', serialize_token(token), httponly=True) - return resp + abort(500) + else: + return render_template('index.html', active_banner=get_active_banner(), decks=get_unlocked_decks(token), user_name=token.name) + @main.route('/login', methods=['POST', 'GET']) def login(): @@ -127,12 +142,34 @@ def access(): return redirect('/') return render_template('index.html', error="Invalid password.", decks=get_unlocked_decks(token)) -@main.route('/confused', methods=['POST']) +@main.route('/access/', methods=['GET']) +def access_link(access_code: str): + password = db.session.execute(db.select(Password).where(Password.value == access_code)).scalar() + assert isinstance(password, Password|None) + token = get_token() + if password is not None and not password.is_expired(): + update_token(password.decks) + return redirect('/') + return render_template('index.html', error="Invalid password.", decks=get_unlocked_decks(token)) + + + +@main.route('/confused', methods=['POST']) def confused(): resp = jsonify(success=True) return resp +@main.route('/retrieve-token', methods=['POST']) +def set_username_token(): + new_username : str = request.form.get("user_name", "").strip() + resp = make_response(redirect('/')) + if new_username: + token = retrieve_token(new_username) + if token: + resp.set_cookie('access_token', serialize_token(token), httponly=True) + return resp + @main.route('/slides//') @main.route('/slides//') diff --git a/app/templates/index.html b/app/templates/index.html index f5b6217..3889e33 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -36,7 +36,32 @@