WIP
This commit is contained in:
@@ -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():
|
||||
|
||||
54
app/templates/register.html
Normal file
54
app/templates/register.html
Normal file
@@ -0,0 +1,54 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Register for Tutortool</title>
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<style>
|
||||
body {
|
||||
@apply bg-background text-text font-sans;
|
||||
background-color: #1a202c;
|
||||
color: #a0aec0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body class="flex items-center justify-center min-h-screen">
|
||||
<div class="bg-gray-800 p-8 rounded-lg shadow-lg max-w-md w-full border border-gray-700">
|
||||
<div class="text-center mb-6">
|
||||
<h1 class="text-3xl font-bold text-white mb-2">Create an Account</h1>
|
||||
<p class="text-muted text-sm">Choose a username to get started.</p>
|
||||
</div>
|
||||
|
||||
<form action="/register" method="POST" class="space-y-6">
|
||||
<!-- Flask-WTF form fields will be injected here -->
|
||||
<div class="mb-4">
|
||||
<label for="username" class="block text-sm font-medium text-gray-400 mb-2">Username</label>
|
||||
<input type="text" id="username" name="username" placeholder="Your unique username" required class="w-full px-4 py-2 bg-gray-700 border border-gray-600 rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-blue-500">
|
||||
</div>
|
||||
|
||||
<div class="bg-gray-700 p-4 rounded-lg border border-gray-600 space-y-3">
|
||||
<h3 class="text-sm font-semibold text-gray-200">Important Information</h3>
|
||||
<p class="text-xs text-gray-400">
|
||||
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.
|
||||
</p>
|
||||
<div class="flex items-center">
|
||||
<input type="checkbox" id="acknowledge" name="acknowledge" required class="h-4 w-4 text-blue-500 rounded border-gray-300 focus:ring-blue-500">
|
||||
<label for="acknowledge" class="ml-2 block text-sm text-gray-400">
|
||||
I understand and agree
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="w-full bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-lg transition-colors">
|
||||
Register
|
||||
</button>
|
||||
</form>
|
||||
|
||||
<p class="text-center mt-4 text-sm">
|
||||
Already have an account? <a href="/login" class="text-blue-400 hover:underline">Log In</a>
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user