Skip to content

Commit 22267da

Browse files
basic flask login implemented
1 parent 555d768 commit 22267da

File tree

14 files changed

+333
-34
lines changed

14 files changed

+333
-34
lines changed

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ Flask==2.3.3
22
psutil==5.9.5
33
gunicorn
44
speetest-cli
5-
flask-sqlalchemy
5+
flask-sqlalchemy
6+
flask-login

src/models.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import datetime
2+
from flask_login import UserMixin
3+
from werkzeug.security import generate_password_hash, check_password_hash
24

35
from src.config import db, app
46

@@ -17,7 +19,7 @@ def __repr__(self):
1719
)
1820

1921

20-
class DashoardSettings(db.Model):
22+
class DashboardSettings(db.Model):
2123
__tablename__ = "DashboardSettings"
2224
id = db.Column(db.Integer, primary_key=True)
2325
speedtest_cooldown = db.Column(db.Integer, default=1)
@@ -50,12 +52,26 @@ class SystemInfo(db.Model):
5052
def __repr__(self):
5153
return f"<SystemInfo {self.username}, {self.cpu_percent}, {self.memory_percent}, {self.disk_usage}, {self.battery_percent}, {self.cpu_core}, {self.boot_time}, {self.network_sent}, {self.network_received}, {self.process_count}, {self.swap_memory}, {self.uptime}, {self.ipv4_connections}, {self.ipv6_connections}, {self.dashboard_memory_usage}>"
5254

55+
class User(db.Model, UserMixin):
56+
id = db.Column(db.Integer, primary_key=True)
57+
username = db.Column(db.String(150), unique=True, nullable=False)
58+
password = db.Column(db.String(150), nullable=False)
59+
user_level = db.Column(db.String(50), nullable=False, default='user')
60+
5361

54-
# initialize the database
5562
with app.app_context():
5663
print("Creating tables")
5764
db.create_all()
58-
settings = DashoardSettings.query.first()
65+
66+
# Initialize default settings
67+
settings = DashboardSettings.query.first()
5968
if not settings:
60-
db.session.add(DashoardSettings())
69+
db.session.add(DashboardSettings())
6170
db.session.commit()
71+
72+
# Create admin user if not exists
73+
if not User.query.filter_by(username='admin').first():
74+
hashed_password = generate_password_hash('adminpassword')
75+
admin_user = User(username='admin', password=hashed_password, user_level='admin')
76+
db.session.add(admin_user)
77+
db.session.commit()

src/routes/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@
77
from src.routes.speedtest import speedtest_bp
88
from src.routes.system_health import system_health_bp
99
from src.routes.process import process_bp
10+
from src.routes.auth import auth_bp

src/routes/auth.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
from flask import Flask, render_template, redirect, url_for, request, blueprints, flash
2+
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
3+
from flask_sqlalchemy import SQLAlchemy
4+
from werkzeug.security import generate_password_hash, check_password_hash
5+
6+
from src.config import app, db
7+
from src.models import User
8+
9+
auth_bp = blueprints.Blueprint('auth', __name__)
10+
11+
# Configure Flask-Login
12+
login_manager = LoginManager()
13+
login_manager.init_app(app)
14+
login_manager.login_view = 'login'
15+
16+
# Define the User model
17+
18+
@login_manager.user_loader
19+
def load_user(user_id):
20+
return User.query.get(int(user_id))
21+
22+
@app.route('/login', methods=['GET', 'POST'])
23+
def login():
24+
if request.method == 'POST':
25+
username = request.form['username']
26+
password = request.form['password']
27+
user = User.query.filter_by(username=username).first()
28+
if user and check_password_hash(user.password, password):
29+
login_user(user)
30+
return redirect(url_for('dashboard'))
31+
flash('Invalid username or password')
32+
return render_template('login.html')
33+
34+
@app.route('/signup', methods=['GET', 'POST'])
35+
def signup():
36+
if request.method == 'POST':
37+
username = request.form['username']
38+
password = request.form['password']
39+
confirm_password = request.form['confirm_password']
40+
41+
if password != confirm_password:
42+
flash('Passwords do not match')
43+
return redirect(url_for('signup'))
44+
45+
existing_user = User.query.filter_by(username=username).first()
46+
if existing_user:
47+
flash('Username already exists')
48+
return redirect(url_for('signup'))
49+
50+
hashed_password = generate_password_hash(password)
51+
new_user = User(username=username, password=hashed_password)
52+
db.session.add(new_user)
53+
db.session.commit()
54+
flash('Account created successfully, please log in.')
55+
return redirect(url_for('login'))
56+
57+
return render_template('signup.html')
58+
59+
@app.route('/protected')
60+
@login_required
61+
def protected():
62+
if current_user.user_level == 'admin':
63+
return f'Hello, Admin {current_user.username}! This is a protected page.'
64+
return f'Hello, {current_user.username}! This is a protected page.'
65+
66+
@app.route('/logout')
67+
def logout():
68+
logout_user()
69+
return redirect(url_for('login'))
70+
71+
72+
# def admin_required(f):
73+
# """Decorator to ensure the current user is an admin."""
74+
# @wraps(f)
75+
# def decorated_function(*args, **kwargs):
76+
# if not current_user.is_authenticated or current_user.user_level != 'admin':
77+
# flash('Access denied. Admins only.')
78+
# return redirect(url_for('login'))
79+
# return f(*args, **kwargs)
80+
# return decorated_function
81+
82+
# def user_required(f):
83+
# """Decorator to ensure the current user is a regular user."""
84+
# @wraps(f)
85+
# def decorated_function(*args, **kwargs):
86+
# if not current_user.is_authenticated or current_user.user_level != 'user':
87+
# flash('Access denied. Users only.')
88+
# return redirect(url_for('login'))
89+
# return f(*args, **kwargs)
90+
# return decorated_function

src/routes/homepage.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
from flask import render_template, blueprints
33

44
from src.config import app
5-
from src.models import SpeedTestResult, DashoardSettings
5+
from src.models import SpeedTestResult, DashboardSettings
66
from src.utils import datetimeformat, get_system_info
77

88
homepage_bp = blueprints.Blueprint("homepage", __name__)
99

1010
@app.route("/")
1111
def dashboard():
12-
settings = DashoardSettings.query.first()
12+
settings = DashboardSettings.query.first()
1313
SPEEDTEST_COOLDOWN_IN_HOURS = settings.speedtest_cooldown
1414
system_info = get_system_info()
1515

src/routes/process.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
import os
22
from flask import request, render_template, blueprints, redirect, url_for, flash
3+
from flask_login import login_required, current_user
34

45
from src.config import app
56
from src.utils import get_top_processes
67

78
process_bp = blueprints.Blueprint("process", __name__)
89

910
@app.route("/process", methods=["GET", "POST"])
11+
@login_required
1012
def process():
13+
if current_user.user_level != "admin":
14+
flash("You do not have permission to view this page.", "danger")
15+
return redirect(url_for("dashboard"))
16+
1117
number_of_processes = 5 # Default number
1218

1319
if request.method == "POST":

src/routes/settings.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from flask import render_template, request, flash, blueprints
22

33
from src.config import app, db
4-
from src.models import DashoardSettings
4+
from src.models import DashboardSettings
55

66
settings_bp = blueprints.Blueprint("settings", __name__)
77

88
@app.route("/settings", methods=["GET", "POST"])
99
def settings():
1010
# Fetch the settings from the database and update them
11-
settings = DashoardSettings.query.first()
11+
settings = DashboardSettings.query.first()
1212
if settings:
1313
if request.method == "POST":
1414
settings.speedtest_cooldown = int(request.form["speedtest_cooldown"])

src/routes/speedtest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
from flask import render_template, blueprints
33

44
from src.config import app, db
5-
from src.models import DashoardSettings, SpeedTestResult
5+
from src.models import DashboardSettings, SpeedTestResult
66
from src.utils import run_speedtest
77

88
speedtest_bp = blueprints.Blueprint("speedtest", __name__)
99

1010
@app.route("/speedtest")
1111
def speedtest():
12-
settings = DashoardSettings.query.first()
12+
settings = DashboardSettings.query.first()
1313
SPEEDTEST_COOLDOWN_IN_HOURS = settings.speedtest_cooldown
1414
NUMBER_OF_SPEEDTESTS = settings.number_of_speedtests
1515
n_hour_ago = datetime.datetime.now() - datetime.timedelta(

src/static/css/login.css

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/* static/css/login.css */
2+
3+
4+
h2 {
5+
color: #333;
6+
}
7+
8+
form {
9+
background: #fff;
10+
padding: 20px;
11+
border-radius: 8px;
12+
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
13+
max-width: 400px;
14+
width: 100%;
15+
}
16+
17+
label {
18+
display: block;
19+
margin: 10px 0 5px;
20+
}
21+
22+
input[type="text"],
23+
input[type="password"] {
24+
width: 100%;
25+
padding: 10px;
26+
margin-bottom: 10px;
27+
border: 1px solid #ddd;
28+
border-radius: 4px;
29+
}
30+
31+
input[type="submit"] {
32+
background-color: #28a745;
33+
color: #fff;
34+
border: none;
35+
padding: 10px;
36+
border-radius: 4px;
37+
cursor: pointer;
38+
font-size: 16px;
39+
}
40+
41+
input[type="submit"]:hover {
42+
background-color: #218838;
43+
}

src/static/css/signup.css

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/* static/css/signup.css */
2+
3+
4+
5+
h2 {
6+
color: #333;
7+
}
8+
9+
form {
10+
background: #fff;
11+
padding: 20px;
12+
border-radius: 8px;
13+
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
14+
max-width: 400px;
15+
width: 100%;
16+
}
17+
18+
label {
19+
display: block;
20+
margin: 10px 0 5px;
21+
}
22+
23+
input[type="text"],
24+
input[type="password"] {
25+
width: 100%;
26+
padding: 10px;
27+
margin-bottom: 10px;
28+
border: 1px solid #ddd;
29+
border-radius: 4px;
30+
}
31+
32+
input[type="submit"] {
33+
background-color: #007bff;
34+
color: #fff;
35+
border: none;
36+
padding: 10px;
37+
border-radius: 4px;
38+
cursor: pointer;
39+
font-size: 16px;
40+
}
41+
42+
input[type="submit"]:hover {
43+
background-color: #0056b3;
44+
}
45+
46+
p {
47+
margin-top: 10px;
48+
}

src/templates/dashboard.html

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1-
{% extends 'base.html' %}{% block title %}Server Dashboard{% endblock %}{% block content %}<div class="container mt-4"><div class="row">{% include 'dasbhboard_comp/other/username.html' %} {% include 'dasbhboard_comp/other/boot_time.html' %} {% include 'dasbhboard_comp/battery/percentage.html' %} {% include 'dasbhboard_comp/cpu/core.html' %} {% include 'dasbhboard_comp/cpu/usages.html' %} {% include 'dasbhboard_comp/cpu/current_temp.html' %} {% include 'dasbhboard_comp/memory/dashboard_memory.html' %} {% include 'dasbhboard_comp/memory/usage.html' %} {% include 'dasbhboard_comp/disk/usage.html' %} {% include 'dasbhboard_comp/other/uptime.html' %} {% include 'dasbhboard_comp/network/stats.html' %} {% include 'dasbhboard_comp/other/speedtest.html' %} </div></div>{% endblock %}
1+
{% extends 'base.html' %}{% block title %}Server Dashboard{% endblock %}{% block content %}<div class="container mt-4">
2+
<div class="row">{% include 'dasbhboard_comp/other/username.html' %}{% include
3+
'dasbhboard_comp/other/boot_time.html' %}{% include 'dasbhboard_comp/battery/percentage.html' %}{% include
4+
'dasbhboard_comp/cpu/core.html' %}{% include 'dasbhboard_comp/cpu/usages.html' %}{% include
5+
'dasbhboard_comp/cpu/current_temp.html' %}{% include 'dasbhboard_comp/memory/dashboard_memory.html' %}{% include
6+
'dasbhboard_comp/memory/usage.html' %}{% include 'dasbhboard_comp/disk/usage.html' %}{% include
7+
'dasbhboard_comp/other/uptime.html' %}{% include 'dasbhboard_comp/network/stats.html' %}{% include
8+
'dasbhboard_comp/other/speedtest.html' %} </div>
9+
</div>{% endblock %}

0 commit comments

Comments
 (0)