From 2f13b0a5c6b89ab7e5636d699a4e20d694ab7b13 Mon Sep 17 00:00:00 2001
From: simon
Date: Wed, 15 Apr 2026 11:55:22 +0200
Subject: [PATCH] modified: web/app.py modified:
web/templates/privacy_policy.html
---
web/app.py | 5 +++--
web/templates/privacy_policy.html | 35 ++++++++++++++++++++++++++++++-
2 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/web/app.py b/web/app.py
index b4ce931..ed2e217 100644
--- a/web/app.py
+++ b/web/app.py
@@ -118,7 +118,7 @@ def create_app() -> Flask:
resp.headers.setdefault("X-Content-Type-Options", "nosniff")
resp.headers.setdefault("X-Frame-Options", "DENY")
resp.headers.setdefault("Referrer-Policy", "strict-origin-when-cross-origin")
- resp.headers.setdefault("Content-Security-Policy", "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; img-src 'self' data:; font-src 'self' https://cdn.jsdelivr.net; connect-src 'self'; frame-ancestors 'none';")
+ resp.headers.setdefault("Content-Security-Policy", "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; img-src 'self' data: https://minotar.net; font-src 'self' https://cdn.jsdelivr.net; connect-src 'self'; frame-ancestors 'none';")
return resp
@app.route("/privacy-policy")
@@ -126,8 +126,9 @@ def create_app() -> Flask:
from config import Config
return render_template(
"privacy_policy.html",
- last_updated="April 14, 2026",
+ last_updated="April 15, 2026",
invite_expiry_hours=Config.INVITE_EXPIRY_HOURS,
+ audit_retention_days=Config.AUDIT_LOG_RETENTION_DAYS,
)
@app.errorhandler(400)
diff --git a/web/templates/privacy_policy.html b/web/templates/privacy_policy.html
index b1e3209..87dbf13 100644
--- a/web/templates/privacy_policy.html
+++ b/web/templates/privacy_policy.html
@@ -91,7 +91,28 @@
session ends.
- 3.5 Server Log Files
+ 3.5 Panel Audit Log
+
+ MCLogger maintains an internal audit log in the panel database that records
+ security-relevant and data-access events. Each entry contains:
+
+
+ - The panel user who performed the action (username and internal ID)
+ - The action taken (e.g. login, logout, member role change, viewing player data)
+ - The affected entity (e.g. a Minecraft player's UUID when player profile pages are accessed)
+ - The IP address of the panel user at the time of the action
+ - A UTC timestamp
+
+
+ This includes access to pages that display Minecraft player data (player list, player detail,
+ chat history, commands, deaths, block events, sessions, proxy events). The log therefore
+ records who in the panel team accessed which player's data and when,
+ providing an accountable audit trail as required by Art. 32 GDPR.
+ Audit log entries are automatically deleted after {{ audit_retention_days }} days
+ (configurable by the operator).
+
+
+ 3.6 Server Log Files
The web server (gunicorn) may write standard HTTP access logs containing IP
addresses, request paths, and timestamps. These logs are used for operational
@@ -128,6 +149,11 @@
Security monitoring and error diagnosis |
Art. 6(1)(f) — legitimate interest |
+
+ | Panel audit log (incl. IP addresses of panel users) |
+ Accountability for access to personal data; security incident traceability |
+ Art. 6(1)(c) — legal obligation / Art. 32 GDPR (security of processing) |
+
@@ -136,6 +162,7 @@
Minecraft logs are retained as long as the server operator deems necessary for moderation purposes.
Panel accounts are retained until manually deleted by a site administrator.
Invite tokens expire after {{ invite_expiry_hours }} hours and are never sent to third parties beyond the intended recipient.
+ Panel audit log entries are automatically deleted after {{ audit_retention_days }} days. This includes IP address data logged on data-access events.
Server access logs are typically rotated within 30 days.
@@ -145,6 +172,12 @@
parties. All data remains within the infrastructure controlled by the server operator.
No third-party analytics services, advertising networks, or tracking pixels are used.
+
+ Player head images are loaded from minotar.net, a public Minecraft avatar service.
+ Minotar may process the Minecraft username and your IP address as part of serving the image.
+ Please consult minotar.net
+ for their privacy practices. If the image cannot be loaded, a local fallback placeholder is displayed.
+
External resources loaded by the web interface (Bootstrap CSS/JS and Bootstrap Icons)
are served from the jsDelivr CDN (cdn.jsdelivr.net). jsDelivr may process