From 60754ec23b4bd3f4aeae35e418fec9edf8928cc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 26 Mar 2025 00:11:10 +0100 Subject: [PATCH] acl do /login --- alters.txt | 1 + app.py | 47 +++++++++++++++++++++++++++++++++-- emergency_access | 3 +++ templates/admin/settings.html | 4 +++ 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 alters.txt create mode 100644 emergency_access diff --git a/alters.txt b/alters.txt new file mode 100644 index 0000000..48d61f5 --- /dev/null +++ b/alters.txt @@ -0,0 +1 @@ +ALTER TABLE global_settings ADD COLUMN allowed_login_hosts TEXT; diff --git a/app.py b/app.py index f2b788f..6aedea2 100644 --- a/app.py +++ b/app.py @@ -5,7 +5,10 @@ from werkzeug.security import generate_password_hash, check_password_hash from datetime import datetime from markupsafe import Markup import markdown as md -from flask import abort +from flask import request, flash, abort +import os +import re +import socket app = Flask(__name__) # Ładujemy konfigurację z pliku config.py @@ -52,11 +55,32 @@ class GlobalSettings(db.Model): id = db.Column(db.Integer, primary_key=True) numer_konta = db.Column(db.String(50), nullable=False) numer_telefonu_blik = db.Column(db.String(50), nullable=False) + allowed_login_hosts = db.Column(db.Text, nullable=True) @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) +def is_allowed_ip(remote_ip, allowed_hosts_str): + # Jeśli istnieje plik awaryjny, zawsze zezwalamy na dostęp + if os.path.exists("emergency_access.txt"): + return True + + # Rozdzielamy wpisy – mogą być oddzielone przecinkami lub znakami nowej linii + allowed_hosts = re.split(r'[\n,]+', allowed_hosts_str.strip()) + allowed_ips = set() + for host in allowed_hosts: + host = host.strip() + if not host: + continue + try: + # Rozwiązywanie nazwy domeny do adresu IP. + resolved_ip = socket.gethostbyname(host) + allowed_ips.add(resolved_ip) + except Exception: + # Jeśli rozwiązywanie nazwy nie powiedzie się, pomijamy ten wpis. + continue + return remote_ip in allowed_ips # Dodaj filtr Markdown – pozwala na zagnieżdżanie linków i obrazków w opisie @app.template_filter('markdown') @@ -86,6 +110,17 @@ def zbiorka(zbiorka_id): @app.route('/login', methods=['GET', 'POST']) def login(): + # Pobierz ustawienia globalne, w tym dozwolone hosty + settings = GlobalSettings.query.first() + allowed_hosts_str = "" + if settings and settings.allowed_login_hosts: + allowed_hosts_str = settings.allowed_login_hosts + + # Sprawdzenie, czy adres IP klienta jest dozwolony + if not is_allowed_ip(request.remote_addr, allowed_hosts_str): + flash('Dostęp do endpointu /login jest zablokowany dla Twojego adresu IP', 'danger') + return redirect(url_for('index')) + if request.method == 'POST': username = request.form['username'] password = request.form['password'] @@ -99,6 +134,7 @@ def login(): flash('Nieprawidłowe dane logowania', 'danger') return render_template('login.html') + @app.route('/logout') @login_required def logout(): @@ -290,13 +326,19 @@ def admin_settings(): if request.method == 'POST': numer_konta = request.form.get('numer_konta') numer_telefonu_blik = request.form.get('numer_telefonu_blik') + allowed_login_hosts = request.form.get('allowed_login_hosts') if settings is None: - settings = GlobalSettings(numer_konta=numer_konta, numer_telefonu_blik=numer_telefonu_blik) + settings = GlobalSettings( + numer_konta=numer_konta, + numer_telefonu_blik=numer_telefonu_blik, + allowed_login_hosts=allowed_login_hosts + ) db.session.add(settings) else: settings.numer_konta = numer_konta settings.numer_telefonu_blik = numer_telefonu_blik + settings.allowed_login_hosts = allowed_login_hosts db.session.commit() flash('Ustawienia globalne zostały zaktualizowane', 'success') @@ -304,6 +346,7 @@ def admin_settings(): return render_template('admin/settings.html', settings=settings) + @app.route('/robots.txt') def robots(): if app.config.get("BLOCK_BOTS", False): diff --git a/emergency_access b/emergency_access new file mode 100644 index 0000000..8788ada --- /dev/null +++ b/emergency_access @@ -0,0 +1,3 @@ +Jeśli ten plik istwnieje w katalogu apliakcji, to wylacza zebzpieczenie logowania do panelu admina z ograniczeniem IP. + +Musi miec rozszerzenie .txt \ No newline at end of file diff --git a/templates/admin/settings.html b/templates/admin/settings.html index e01eb6e..5c0c561 100644 --- a/templates/admin/settings.html +++ b/templates/admin/settings.html @@ -16,6 +16,10 @@ +
+ + +
Powrót