commit 7f2ed9e5e7519afdf27834a688df0ec8362f97a1
parent 1ae25b10ed89d25dad9abd2deee59e33a64d6db9
Author: William Lindholm <william_lindholm@outlook.com>
Date: Wed, 1 Nov 2023 00:10:22 +0100
Added user authentication.
Diffstat:
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