Alle wichtigen Änderungen am morpheus-link-bot werden hier dokumentiert. Das Format orientiert sich an Keep a Changelog und Semantic Versioning.
Bugfixes
!urlstatus-Priorität Exakt > Wildcard > Apex — Die Prüfreihenfolge in!urlstatuswich von der des Haupt-Filters ab. War z. B.sub.example.comexplizit in der Blacklist undexample.comin der Whitelist, meldete!urlstatus sub.example.comfälschlicherweisewhitelisted (Apex), weil der Apex-Whitelist-Check vor dem exakten Blacklist-Check stattfand. Die Reihenfolge ist jetzt identisch zum Haupt-Filter: Exakt (Whitelist/Blacklist) → Wildcard → Apex.
Bugfixes
- Priorität Exakt > Wildcard > Apex (Fix #22) — Domains werden jetzt in der korrekten Reihenfolge geprüft: Exakte Treffer haben Vorrang vor Wildcards, Wildcards vor Apex-Matches. Ein exakter Blacklist-Eintrag (
sub.example.com) wird nicht mehr von einem Apex-Whitelist-Eintrag (example.com) überschrieben. - Keine Mute-Operationen in Direct Messages (Fix #23) —
_get_mute_target_rooms()filtert jetzt Räume mit ≤2 Mitgliedern (DM-Räume) aus. Ebenso werden keine "entstummt"-Nachrichten in DMs gesendet. Verhindert verwirrende Benachrichtigungen und unnötige plübergreifende Raumbley-Änderungen.
Neues Feature: Globales Stummschalten
global_mute-Option (true/false, Standard: true) — Wenn aktiviert, wird ein Nutzer bei einem automatischen Verstoß oder einem manuellen!mute-Befehl in allen Räumen stummgeschaltet, in denen der Bot aktiv ist und ein höheres Powerlevel als der Zielnutzer hat. Beifalsegilt das bisherige Verhalten: nur der Raum des Verstoßes bzw. Befehls wird betroffen._get_mute_target_rooms()— Neue Hilfsfunktion, die alle beigetretenen Räume parallel viaasyncio.gatherprüft und nur jene zurückgibt, in denen der Bot PL > 0 und PL > Zielnutzer hat. Blockiert den Event-Loop nicht._mute_user_global()/_unmute_user_global()— Neue Orchestrierungsfunktionen, die den room-übergreifenden Mute-/Unmute-Vorgang verwalten und die Anzahl der betroffenen Räume zurückgeben.- Umstrukturiertes
_active_mutes— Das interne State-Dictionary wurde vonDict[Tuple[str, str], float]aufDict[str, List[Dict[str, Any]]]umgestellt, um mehrere Räume pro Nutzer zu verfolgen. _mute_user()/_do_unmute_user()als pure API-Wrapper — Diese Funktionen manipulieren_active_mutesnicht mehr selbst; die Zeiterfassung erfolgt ausschließlich in_mute_user_global().- Angepasste Rückmeldungen —
!mute,!unmuteund automatische Verstöße melden die Anzahl der betroffenen Räume (z. B. „in 4 Räumen stummgeschaltet"), wenn mehr als ein Raum betroffen ist.
Bugfixes & Verbesserungen
- Kein Netzwerkzugriff nach Redaktion (Fix #19) — Wenn eine Nachricht eine gesperrte Domain enthält, bricht der Bot die weitere Verarbeitung sofort nach der Redaktion ab (
return). Linkvorschauen und alle sonstigen nachgelagerten Operationen werden nicht mehr ausgeführt. Zusätzlich werden bekannte URL-Shortener, die selbst auf der Blacklist stehen, vor dem Auflösen geprüft — ein unnötiger HEAD-Request an gesperrte Domains entfällt dadurch. !hilfeist in Gruppenräumen vollständig stumm (Fix #20) — Bisher antwortete der Bot in öffentlichen Räumen mit einer Hinweismeldung („Nur per DM verfügbar"). Ab v2.5.0 reagiert er in Nicht-DM-Räumen gar nicht mehr auf den Befehl — kein Reply, kein Hinweis. Das verhindert, dass Moderationsinfos versehentlich in überwachten Räumen sichtbar werden.- URL-Normalisierung für
!urlstatus(Fix #21) —!urlstatus https://facebook.com/lieferte bisherunbekannt, obwohlfacebook.comwhitelisted ist. Protokollpräfixe (http://,https://) und Pfadanteile werden jetzt vor dem Lookup automatisch abgeschnitten.https://www.facebook.com/,www.facebook.comundfacebook.comwerden einheitlich behandelt.
Datenbankarchitektur — komplett neu (Privacy by Design / DSGVO)
- Vollständig neue DB-Schicht mit 4 Tabellen:
domain_rule,domain_stats,user_violation,pending_review— ersetzt die frühere dateibasierte und RAM-basierte Speicherung. - Alle Runtime-Moderationsentscheidungen (allow/block/ignore-preview) werden in
domain_rulepersistiert — bot-Neustarts sind jetzt stateful. - Offene Moderationsanfragen werden in
pending_reviewgespeichert und beim Start wiederhergestellt (_load_pending_reviews_from_db()). - Domain-Whitelist und Blacklist werden beim Start aus der DB in den RAM-Cache geladen (
_load_domain_rules_cache()).
DSGVO-Konformität
- Matrix-Nutzer-IDs werden ausschließlich als
SHA-256(secret_salt:user_id)gespeichert — niemals im Klartext. - Neues Pflichtfeld
secret_saltin der Konfiguration. - Neuer DSGVO-Retention-Loop (
_retention_loop): Verstoßdaten inuser_violationwerden automatisch nach 24 Stunden gelöscht. _record_violation()ist jetztasyncund schreibt direkt in die DB (Sliding-Window-Logik via SQL statt in-memory Deque).
Neue Hilfsfunktionen
_hash_user()— SHA-256-Hashing mit Salt für DSGVO-konforme Nutzer-ID-Speicherung._sanitize_domain_for_storage()— Bereinigung und Normalisierung von Domains vor DB-Speicherung.!botstatus— Neuer Health-Check-Befehl; zeigt DB-Verbindung, Listengröße und Bot-Status.
Entfernt
link_log-Tabelle und alle zugehörigen Funktionen (_log_link,_delete_logged_links_for_domain,_run_link_log_cleanup,_cleanup_loop) — ersetzt durch datenschutzkonforme DB-Strukturen.cmd_link_stats(!stats <@nutzer:homeserver>) — entfernt, da auf rohen Nutzerdaten basierend (nicht DSGVO-konform).- Config-Parameter
cleanup_enabledundcleanup_after_days— nicht mehr benötigt.
Sicherheit / Konfigurationsschutz
- Hard-Stop beim Start wenn
secret_saltnoch den Standardwert enthält: Der Bot verweigert den Start mit einemCRITICAL-Log-Eintrag. Verhindert, dass die Datenbank mit dem falschen Salt befüllt wird und ein späterer Salt-Wechsel den Mute-Verlauf korrumpiert.
Sonstiges
requirements.txtneu angelegt (maubot >= 0.4.0,mautrix >= 0.20.0).- CI-Workflow bereinigt (Pyright-Step entfernt, Ruff-Step vereinheitlicht).
- Code-Formatierung via Ruff (E702 u.a.) durchgehend angewendet.
Sicherheitshärtung
- NFKC-Unicode-Normalisierung + IDNA/Punycode-Konvertierung aller extrahierten Domains — Vollbreite-Zeichen und Unicode-Domains werden vor dem Listen-Vergleich normalisiert.
- Apex-Domain-Matching — ist
evil.comin der Blacklist, werden alle Subdomains automatisch mitgeblockt. Gilt spiegelbildlich für die Whitelist. - URL-Shortener-Auflösung — bekannte Kurzlink-Dienste werden via HEAD-Request aufgelöst; die finale Ziel-Domain wird geprüft.
TLD-Liste erweitert
.zip,.mov,.phd,.foo,.nexusund weitere Missbrauchs-gTLDs ergänzt.
Performance
- Wildcard-Prüfung auf Set-Split-Lookup optimiert — O(Domain-Tiefe) statt O(Anzahl Wildcards).
Sicherheitshärtung
_is_mod()prüft Powerlevel ausschließlich im konfiguriertenmod_room_id— DM-Eskalation nicht mehr möglich.on_messageüberspringt den URL-Filter vollständig bei bekannten Bot-Befehlsnamen.
Neue Befehle
!mute/!unmute— manuelles Stummschalten mit optionaler Zeitangabe.!sendpending— offene Überprüfungsalarme neu in den Mod-Raum senden.!ignore/!unignore— Domain zur/von der Vorschau-Ignore-Liste.
Neue Konfigurationsoptionen
command_rooms,mute_window_minutes,mute_duration_minutes,mute_commands_enabled.
Verbesserungen
!allow/!block/!unallow/!unblock/!urlstatusakzeptieren mehrere Domains gleichzeitig.- Automatisches Unmute im Hintergrund.
- Bearbeitete Nachrichten aktualisieren bestehende Vorschauen.
- Thread-Support und mehrere Whitelist-Links pro Nachricht.
Neues Feature
- Automatischer Hintergrund-Task zur Bereinigung der Link-Log-Datenbank (
cleanup_enabled,cleanup_after_days).
Link-Protokollierung & !stats-Befehl
- Automatische Speicherung unbekannter Links in
link_log. - Matrix-ID-Erkennung verbessert; statische SQL-Migrationen.
- Emoji-Reaktions-Workflow (✅/❌).
- Automatisches Stummschalten.
- Wildcard-Unterstützung (
*.domain.com).
- Nicht-blockierender Start.
- O(1)-Lookups mit Python-Sets.
- ReDoS-sichere Regex-Architektur.