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.
-+ MCLogger maintains an internal audit log in the panel database that records + security-relevant and data-access events. Each entry contains: +
++ 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). +
+ +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 @@
+ 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