ContactBridge

Log | Files | Refs | README

commit 7f2ed9e5e7519afdf27834a688df0ec8362f97a1
parent 1ae25b10ed89d25dad9abd2deee59e33a64d6db9
Author: William Lindholm <william_lindholm@outlook.com>
Date:   Wed,  1 Nov 2023 00:10:22 +0100

Added user authentication.

Diffstat:
MWebInterface/routes.py | 37++++++++++++++++++++++++++++++++++---
Mmain.py | 2++
Mtemplates/home.html | 16++++++++++++++--
Atemplates/login.html | 34++++++++++++++++++++++++++++++++++
4 files changed, 84 insertions(+), 5 deletions(-)

diff --git a/WebInterface/routes.py b/WebInterface/routes.py @@ -1,12 +1,18 @@ -from flask import render_template +import json +from pathlib import Path +from flask import Flask, request, redirect, url_for, render_template, session from dbrepository import DatabaseRepository from . import web_interface db = DatabaseRepository() + @web_interface.route('/home') def home(): + if not session.get('logged_in'): + return redirect(url_for('web_interface.login')) + messages = db.fetch_messages() formatted_messages = [ @@ -21,4 +27,29 @@ def home(): for message in messages ] - return render_template('home.html', messages=formatted_messages) -\ No newline at end of file + return render_template('home.html', messages=formatted_messages) + + +@web_interface.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + username = request.form['username'] + password = request.form['password'] + + current_dir = Path(__file__).parent + settings_path = current_dir / '..' / 'settings.json' + with open(settings_path, 'r') as f: + settings = json.load(f) + + if username == settings['username'] and password == settings['password']: + session['logged_in'] = True + return redirect(url_for('web_interface.home')) + else: + return "Invalid credentials", 401 + + return render_template('login.html') + +@web_interface.route('/logout') +def logout(): + session.pop('logged_in', None) + return redirect(url_for('web_interface.login')) +\ No newline at end of file diff --git a/main.py b/main.py @@ -1,10 +1,12 @@ from flask import Flask from WebAPI import blueprint as api_blueprint from WebInterface import web_interface +import os app = Flask(__name__) app.register_blueprint(api_blueprint, url_prefix='/api') app.register_blueprint(web_interface) +app.secret_key = os.urandom(24) if __name__ == '__main__': app.run(debug=True) \ No newline at end of file diff --git a/templates/home.html b/templates/home.html @@ -3,13 +3,25 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"> - <title>Messages</title> </head> <body> +<nav class="navbar navbar-expand-lg navbar-light bg-light"> + <a class="navbar-brand" href="#">Messages App</a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="navbarNav"> + <ul class="navbar-nav ml-auto"> + <li class="nav-item"> + <a class="nav-link" href="/logout">Logout</a> + </li> + </ul> + </div> +</nav> + <div class="container"> <h1 class="mt-5">Messages</h1> <ul class="list-group mt-3"> diff --git a/templates/login.html b/templates/login.html @@ -0,0 +1,33 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"> + <title>Login</title> +</head> +<body> + +<div class="container"> + <div class="row justify-content-center"> + <div class="col-md-4"> + <h1 class="mt-5">Login</h1> + <form method="post" class="mt-3"> + <div class="form-group"> + <label for="username">Username:</label> + <input type="text" class="form-control" id="username" name="username" required> + </div> + <div class="form-group"> + <label for="password">Password:</label> + <input type="password" class="form-control" id="password" name="password" required> + </div> + <button type="submit" class="btn btn-primary">Submit</button> + </form> + </div> + </div> +</div> + +<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script> + +</body> +</html> +\ No newline at end of file