modified: web/app.py
modified: web/config.py modified: web/templates/privacy_policy.html
This commit is contained in:
17
web/app.py
17
web/app.py
@@ -3,6 +3,7 @@ MCLogger – Flask Web-Panel
|
|||||||
Multi-Tenant mit Gruppen, Rollen & verschlüsselten DB-Zugangsdaten.
|
Multi-Tenant mit Gruppen, Rollen & verschlüsselten DB-Zugangsdaten.
|
||||||
Coolify-kompatibel: alle Einstellungen via ENV.
|
Coolify-kompatibel: alle Einstellungen via ENV.
|
||||||
"""
|
"""
|
||||||
|
import os
|
||||||
import secrets
|
import secrets
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from flask import Flask, abort, render_template, request, session, url_for
|
from flask import Flask, abort, render_template, request, session, url_for
|
||||||
@@ -20,6 +21,21 @@ from blueprints.panel import panel
|
|||||||
|
|
||||||
def create_app() -> Flask:
|
def create_app() -> Flask:
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
# ── Datenschutz-Version automatisch aus Template-Hash berechnen ──────────
|
||||||
|
# Wenn PRIVACY_POLICY_VERSION nicht per ENV gesetzt ist, wird der SHA-256
|
||||||
|
# des Template-Inhalts berechnet und die ersten 6 Zeichen als Version
|
||||||
|
# verwendet. Ändert sich der Seiteninhalt, ändert sich der Hash →
|
||||||
|
# alle Nutzer müssen beim nächsten Login erneut zustimmen.
|
||||||
|
if not os.getenv("PRIVACY_POLICY_VERSION"):
|
||||||
|
import hashlib
|
||||||
|
_policy_path = os.path.join(app.root_path, "templates", "privacy_policy.html")
|
||||||
|
try:
|
||||||
|
with open(_policy_path, "rb") as _f:
|
||||||
|
Config.PRIVACY_POLICY_VERSION = hashlib.sha256(_f.read()).hexdigest()[:6].upper()
|
||||||
|
except OSError:
|
||||||
|
pass # Fallback auf den Config-Default
|
||||||
|
|
||||||
app.secret_key = Config.SECRET_KEY
|
app.secret_key = Config.SECRET_KEY
|
||||||
app.config.update(
|
app.config.update(
|
||||||
SESSION_COOKIE_HTTPONLY=Config.SESSION_COOKIE_HTTPONLY,
|
SESSION_COOKIE_HTTPONLY=Config.SESSION_COOKIE_HTTPONLY,
|
||||||
@@ -129,6 +145,7 @@ def create_app() -> Flask:
|
|||||||
last_updated="April 15, 2026",
|
last_updated="April 15, 2026",
|
||||||
invite_expiry_hours=Config.INVITE_EXPIRY_HOURS,
|
invite_expiry_hours=Config.INVITE_EXPIRY_HOURS,
|
||||||
audit_retention_days=Config.AUDIT_LOG_RETENTION_DAYS,
|
audit_retention_days=Config.AUDIT_LOG_RETENTION_DAYS,
|
||||||
|
policy_version=Config.PRIVACY_POLICY_VERSION,
|
||||||
)
|
)
|
||||||
|
|
||||||
@app.errorhandler(400)
|
@app.errorhandler(400)
|
||||||
|
|||||||
@@ -60,10 +60,12 @@ class Config:
|
|||||||
PROXY_COUNT = int(os.getenv("PROXY_COUNT") or "1")
|
PROXY_COUNT = int(os.getenv("PROXY_COUNT") or "1")
|
||||||
|
|
||||||
# ── Datenschutz / DSGVO ───────────────────────────────────
|
# ── Datenschutz / DSGVO ───────────────────────────────────
|
||||||
# Version der Datenschutzerklärung (ISO-Datum + Revision). Wenn sich dieser
|
# Version der Datenschutzerklärung. Wird in create_app() automatisch als
|
||||||
# Wert ändert, werden alle Nutzer beim nächsten Login zur erneuten Zustimmung
|
# SHA-256-Hash der privacy_policy.html berechnet (erste 6 Zeichen, Großbuchstaben).
|
||||||
# aufgefordert. ENV-Variable PRIVACY_POLICY_VERSION überschreibt den Default.
|
# Ändert sich der Seiteninhalt, ändert sich der Hash → alle Nutzer müssen
|
||||||
PRIVACY_POLICY_VERSION = os.getenv("PRIVACY_POLICY_VERSION") or "2026-04-15-r2"
|
# beim nächsten Login erneut zustimmen.
|
||||||
|
# Kann über die ENV-Variable PRIVACY_POLICY_VERSION manuell überschrieben werden.
|
||||||
|
PRIVACY_POLICY_VERSION = os.getenv("PRIVACY_POLICY_VERSION") or "INIT00"
|
||||||
|
|
||||||
# ── Standard-Berechtigungen neuer Gruppenmitglieder ───────
|
# ── Standard-Berechtigungen neuer Gruppenmitglieder ───────
|
||||||
INVITE_EXPIRY_HOURS = int(os.getenv("INVITE_EXPIRY_HOURS") or "72")
|
INVITE_EXPIRY_HOURS = int(os.getenv("INVITE_EXPIRY_HOURS") or "72")
|
||||||
|
|||||||
@@ -20,6 +20,12 @@
|
|||||||
<i class="bi bi-database-fill-gear fs-1 text-success"></i>
|
<i class="bi bi-database-fill-gear fs-1 text-success"></i>
|
||||||
<h1 class="fw-bold mt-2 h3">MCLogger — Privacy Policy</h1>
|
<h1 class="fw-bold mt-2 h3">MCLogger — Privacy Policy</h1>
|
||||||
<p class="text-muted small">Last updated: {{ last_updated }}</p>
|
<p class="text-muted small">Last updated: {{ last_updated }}</p>
|
||||||
|
<p class="text-muted small">
|
||||||
|
<i class="bi bi-fingerprint me-1"></i>Document ID:
|
||||||
|
<span class="font-monospace fw-bold text-secondary">{{ policy_version }}</span>
|
||||||
|
<span class="text-muted"> — this ID changes automatically when the policy content changes.
|
||||||
|
Your consent is tied to this ID.</span>
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card border-secondary mb-4">
|
<div class="card border-secondary mb-4">
|
||||||
|
|||||||
Reference in New Issue
Block a user