2024-01-12 10:57:58 +01:00
|
|
|
import datetime
|
2024-01-12 16:53:03 +01:00
|
|
|
import hashlib
|
2024-01-12 10:57:58 +01:00
|
|
|
|
|
|
|
|
from flask import Flask, render_template, redirect, url_for, request
|
2024-01-12 16:53:03 +01:00
|
|
|
from flask_login import login_required, LoginManager, login_user, logout_user, current_user
|
2024-01-12 10:57:58 +01:00
|
|
|
|
|
|
|
|
from models.User import User
|
2024-01-12 16:53:03 +01:00
|
|
|
from utils import anonymous_required
|
2024-01-12 10:57:58 +01:00
|
|
|
|
|
|
|
|
# Create a new Flask instance
|
|
|
|
|
app = Flask(__name__)
|
2024-01-12 16:53:03 +01:00
|
|
|
app.secret_key = 'PSSSSSHHHT!'
|
|
|
|
|
|
|
|
|
|
# Initialize the Flask-Login extension
|
|
|
|
|
login_manager = LoginManager()
|
|
|
|
|
login_manager.login_view = 'login'
|
|
|
|
|
login_manager.init_app(app)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_manager.user_loader
|
|
|
|
|
def load_user(user_id):
|
|
|
|
|
return User.get(user_id)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.context_processor
|
|
|
|
|
def inject_user():
|
|
|
|
|
return dict(user=current_user)
|
2024-01-12 10:57:58 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# Create a new route
|
|
|
|
|
@app.route('/')
|
|
|
|
|
def index():
|
|
|
|
|
# return 'Hello World'
|
|
|
|
|
return render_template('index.html', title='Home', utc_dt=datetime.datetime.now().strftime("%d.%m.%Y %H:%M:%S"))
|
|
|
|
|
|
2024-01-12 16:53:03 +01:00
|
|
|
|
2024-01-12 10:57:58 +01:00
|
|
|
@app.route('/test')
|
|
|
|
|
@login_required
|
|
|
|
|
def secret():
|
|
|
|
|
return 'Pssst!'
|
|
|
|
|
|
2024-01-12 16:53:03 +01:00
|
|
|
|
2024-01-12 10:57:58 +01:00
|
|
|
@app.route('/login')
|
2024-01-12 16:53:03 +01:00
|
|
|
@anonymous_required
|
2024-01-12 10:57:58 +01:00
|
|
|
def login():
|
2024-01-12 16:53:03 +01:00
|
|
|
return render_template('auth/login.html', errors={})
|
2024-01-12 10:57:58 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/signup')
|
2024-01-12 16:53:03 +01:00
|
|
|
@anonymous_required
|
2024-01-12 10:57:58 +01:00
|
|
|
def signup():
|
|
|
|
|
return render_template('auth/signup.html', errors={})
|
|
|
|
|
|
2024-01-12 16:53:03 +01:00
|
|
|
|
2024-01-12 10:57:58 +01:00
|
|
|
@app.route('/signup', methods=['POST'])
|
|
|
|
|
def signup_post():
|
|
|
|
|
email = request.form.get('email')
|
|
|
|
|
name = request.form.get('name')
|
|
|
|
|
password = request.form.get('password')
|
|
|
|
|
|
|
|
|
|
# Check for errors
|
|
|
|
|
errors = {}
|
|
|
|
|
if not email:
|
|
|
|
|
errors['email'] = 'Email is required.'
|
|
|
|
|
if not name:
|
|
|
|
|
errors['name'] = 'Name is required.'
|
|
|
|
|
if not password:
|
|
|
|
|
errors['password'] = 'Password is required.'
|
|
|
|
|
|
2024-01-12 16:53:03 +01:00
|
|
|
if errors:
|
|
|
|
|
return render_template(
|
|
|
|
|
'auth/signup.html',
|
|
|
|
|
email=email,
|
|
|
|
|
name=name,
|
|
|
|
|
password=password,
|
|
|
|
|
errors=errors
|
|
|
|
|
)
|
2024-01-12 10:57:58 +01:00
|
|
|
|
|
|
|
|
# Save user to database. Maybe log the user in directly.
|
2024-01-12 16:53:03 +01:00
|
|
|
user = User.create(name, email, password)
|
|
|
|
|
login_user(user)
|
|
|
|
|
|
|
|
|
|
# Redirect to login page
|
|
|
|
|
return redirect(url_for('secret'))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/login', methods=['POST'])
|
|
|
|
|
def login_post():
|
|
|
|
|
email = request.form.get('email')
|
|
|
|
|
password = request.form.get('password')
|
|
|
|
|
|
|
|
|
|
# Check for errors
|
|
|
|
|
errors = {}
|
|
|
|
|
if not email:
|
|
|
|
|
errors['email'] = 'Email is required.'
|
|
|
|
|
if not password:
|
|
|
|
|
errors['password'] = 'Password is required.'
|
|
|
|
|
|
|
|
|
|
# Check if user exists
|
|
|
|
|
user = User.get_by_email(email)
|
|
|
|
|
|
|
|
|
|
if not user:
|
|
|
|
|
errors['email'] = 'User does not exist.'
|
|
|
|
|
elif user.password is None or hashlib.sha256(password.encode()).hexdigest() != user.password:
|
|
|
|
|
errors['password'] = 'Password incorrect.'
|
|
|
|
|
|
|
|
|
|
if errors:
|
|
|
|
|
return render_template(
|
|
|
|
|
'auth/login.html',
|
|
|
|
|
email=email,
|
|
|
|
|
password=password,
|
|
|
|
|
errors=errors
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
login_user(user)
|
2024-01-12 10:57:58 +01:00
|
|
|
|
|
|
|
|
# Redirect to login page
|
2024-01-12 16:53:03 +01:00
|
|
|
return redirect(url_for('secret'))
|
2024-01-12 10:57:58 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/logout')
|
|
|
|
|
@login_required
|
|
|
|
|
def logout():
|
|
|
|
|
# Log out functionality
|
2024-01-12 16:53:03 +01:00
|
|
|
logout_user()
|
|
|
|
|
|
2024-01-12 10:57:58 +01:00
|
|
|
return redirect(url_for('index'))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Run the application
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
app.run(port=5000, debug=True)
|