Hinzugefügt
-
Updates des Kerns mit einem einzigen Klick (2026-09-23). Ab dieser Version meldet Verwaltung → Monitoring neue Versionen von NeoFrag Reborn und installiert sie: Sicherung der Website, Prüfung der Prüfsumme des Pakets, Anwenden des Pakets, Aktualisierung der Datenbank und Rückkehr zur Sicherung, wenn etwas fehlschlägt. Es ist die erste über diesen Weg veröffentlichte Version; sie wurde vor der Veröffentlichung von Anfang bis Ende auf einer frischen Website getestet. Eine Website auf 1.1.0 hat diese Schaltfläche noch nicht: Sie geht von Hand auf 1.2.0, indem sie ihre Dateien ersetzt. Für die Betreuer:
tools/build-release.phperzeugt die drei Dateien, die zusammen zu veröffentlichen sind (neofrag-reborn-update-<v>.zip,version.json,checksum.json); das Vorgehen steht indocs/guide/marketplace.md. -
Ankündigungen auf Discord (2026-09-23). Ein Webhook, der auf einen Discord-Kanal zeigt, erhält jetzt eine echte Nachricht, mit Titel, Link und Farbe: neue News, neuer Artikel, neues Mitglied, neuer Kommentar, neues Forenthema. Bisher lehnte Discord ab, was das Modul schickte, obwohl seine Beschreibung Discord versprach.
-
„Soundso ist live“ (2026-09-23). Wenn ein vom Widget „Live-Status“ verfolgter Twitch- oder YouTube-Kanal live geht, kündigen die Webhooks, die das Ereignis „Kanal ist live“ abonniert haben, es an, nur einmal pro Stream, mit dem Vorschaubild des Streams.
-
Die Demo spricht auch in ihren Inhalten Englisch (2026-09-23): Ihre News, Artikel, Seiten, Kategorien und Galerien haben eine englische Version, die die Mehrsprachigkeit zeigt.
-
Das ganze Produkt spricht alle sechs Sprachen (2026-09-23). Die Verwaltung, die Module, die Widgets, die Themes, die Einstellungen, die Schaltflächen, die Meldungen und die Skripte: Fast 800 Zeichenketten waren direkt auf Französisch geschrieben und blieben so auf einer englischen, deutschen, spanischen, italienischen oder portugiesischen Website. Sie gehen jetzt alle über die Übersetzungen, in allen sechs Sprachen. Insbesondere:
- Der Installationsassistent ist übersetzt, mit einer Sprachauswahl; er folgt anfangs der Sprache des Browsers.
Der Kommandozeilen-Installer nimmt
--lang=en, oder die Sprache des Terminals. - Der Marketplace zeigt Namen und Beschreibung jedes Addons in der Sprache der Website.
- Die Länder (Profil, Gegner) werden in der Sprache der Website angezeigt.
- Die mitgelieferten Rollen und E-Mail-Vorlagen werden übersetzt angezeigt; ein vom Administrator geänderter Name bleibt so, wie der Administrator ihn geschrieben hat.
- Die Moderation zeigt Status, Grund und Art einer Meldung und die Art einer Sanktion ausgeschrieben — sie zeigte
die Codes (
pending,forum_message,ban_temp). - Eine in einer Sprache angelegte Gruppe verschwindet nicht mehr, wenn die Website in einer anderen angezeigt wird — sie fiel aus der Liste, und ihre Berechtigungen mit ihr.
- Das Theme der Verwaltung gab sich als auf Englisch geschrieben aus: Auf einer englischen Website wurden seine französischen Zeichenketten nie übersetzt. Das ist behoben, ebenso die Skripte der Module, die ihre Übersetzungen an der falschen Stelle suchten.
- Die Bestätigung der Kontolöschung verlangt, das Wort in der Sprache der Website einzugeben („LÖSCHEN“ auf Deutsch), und nicht mehr überall „SUPPRIMER“.
Eine Prüfung,
check-textes-en-dur, lehnt jetzt in der CI jeden fest eingetragenen Text der Oberfläche ab. - Der Installationsassistent ist übersetzt, mit einer Sprachauswahl; er folgt anfangs der Sprache des Browsers.
Der Kommandozeilen-Installer nimmt
-
Die Browser der Besucher können die Dateien der Website behalten, wenn du es wünschst (2026-09-22). Das Manifest machte die Website bereits installierbar; die Website kann jetzt ihre Bilder, Stile und Skripte in den Browsern der Besucher behalten. Standardmäßig aus, einzuschalten unter Verwaltung → Einstellungen → Allgemeine Einstellungen („Installierbare App“).
Seiten dagegen werden nie behalten. Eine im Speicher gehaltene Seite würde eine neue Bereitstellung überleben: Wer schon einmal da war, bekäme eine Tage alte Website ausgeliefert, ohne dass etwas darauf hinwiese. Eine Änderung bleibt daher sofort sichtbar.
Das Abwählen deinstalliert wirklich. Das ist der heikle Teil dieser Technik: Eine Komponente dieser Art bleibt, einmal in einem Browser installiert, dort, auch wenn die Datei vom Server entfernt wird. Der Schalter entfernt daher nichts — er liefert eine Version aus, die sich beim nächsten Besuch selbst deinstalliert. Deshalb ist die Funktion standardmäßig aus, und deshalb schaltet ein Update des Kerns sie nie von selbst ein.
-
Die Website lässt sich als App installieren (2026-09-21).
/manifest.webmanifestwird von der Website selbst erzeugt — Name, Beschreibung, Themefarbe, Startadresse und Favicon kommen aus den Einstellungen —, statt als Datei abgelegt zu werden, die überall sonst falsch wäre. -
Die sensiblen Ordner sind auch unter Apache geschlossen (2026-09-21). Die
.htaccess-Dateien des Pakets schützten weniger als die mitgelieferte Konfiguration für Caddy: Unter Apache blieb der Installer erreichbar, sobald die Website installiert war (nur seine eigene Prüfung hinderte ihn am Laufen), und auf einer aus dem git-Repository installierten Website waren auchdocs/,tools/undtests/erreichbar — die Dokumentation ließ sich als reiner Text lesen.cache/,config/,install/,tools/,tests/unddocs/haben jetzt jeweils ihren eigenen Schutz, das Stammverzeichnis sperrt auch.neon- und.md-Dateien, undtools/check-htaccess.phpliest die Liste bei jedem Durchlauf neu, mit dem Grund für jede Zeile. -
Eine unbekannte Adresse schreibt keinen Fehler mehr ins Protokoll der Website (2026-09-21). Das Modul
pages, das als letzte Instanz die Adressen erhält, die nichts sonst erkennt, schrieb für jede eine Fehler-Zeile — jeder tastende Bot fügte welche hinzu. Für Addon-Entwickler: Ein Controller kann eine Ablehnung jetzt als gewöhnlich erklären (Module_Checker::refus_ordinaire()); die Diagnose wird im Debug-Modus weiterhin auf dem Bildschirm gezeigt. Die Prüfungcheck-journallehnt jetzt jede Zeile ab, die das Produkt selbst ins Fehlerprotokoll schreibt. -
Zwei Prüfungen setzen die Regeln des Repositorys durch (2026-09-21), für Mitwirkende.
tools/check-tools.phpprüft, dass jedes Werkzeug den gemeinsamen Regeln folgt: beschreibender Kopf, Rückgriff auf die gemeinsame Bibliothek statt kopierten Codes, Standardurteil und -rückgabecodes, reservierter Port, aktueller Katalog.tools/check-docs.phpprüft die Dokumentation: richtige Zahlen, gültige Links und Anker, kein verwaistes Dokument, keine Erwähnung eines Werkzeugs, das es nicht mehr gibt, keine von einem Dokument ins andere kopierte Passage, lesbar bleibende Dokumente. Beide laufen in der kontinuierlichen Integration. -
Acht neue Addons, alle optional (2026-09-20). Ein Update installiert sie nicht: Auf einer bestehenden Website werden sie über Verwaltung → Themes & Addons hinzugefügt und auf demselben Weg entfernt. Eine neue Installation enthält sie mit dem Profil Vollständig, das standardmäßig angeboten wird, aber nicht mit den anderen Profilen.
Addon Was es tut Saisonaler Effekt (Widget) Schnee, Konfetti oder Blätter über den ganzen Bildschirm, während eines Datumsbereichs. Die Daten werden MM-DDohne Jahr geschrieben — die Saison kommt von selbst wieder — und können über Neujahr reichen (von 12-15 bis 01-06). Außerhalb der Saison erhält die Seite gar nichts: kein Bild, kein Skript. Die Systemeinstellung, die um reduzierte Bewegung bittet (prefers-reduced-motion), wird respektiert, und die Animation pausiert, wenn der Reiter in den Hintergrund geht.Feed-Leser (Widget) Die neuesten Artikel eines externen RSS- oder Atom-Feeds. Eine Seite wartet fast nie auf eine fremde Website: Sie liest einen Cache und liefert sogar veraltete Inhalte aus, statt die Besucher warten zu lassen; die Aktualisierung geschieht in der geplanten Aufgabe. Nur die allererste Anzeige, mit leerem Cache, wartet auf den Feed, höchstens drei Sekunden. Ein ausgefallener Feed wird zehn Minuten beiseitegelegt, statt bei jedem Besuch erneut versucht zu werden. Zitate (Modul) Eine nach Kategorien geordnete Sammlung, mit Autor und Quelle. Rezepte (Modul) Zutaten und Schritte, eine pro Zeile eingegeben, Zeiten und Zahl der Portionen, Auszeichnung schema.org/Recipe, die Suchmaschinen lesen.Glossar (Modul) Ein nach Buchstaben sortiertes Lexikon. „Éclaireur“ kommt unter E, „Æther“ unter A, „1v1“ unter #. Der Buchstabe wird berechnet, nie eingegeben. Ortskarte (Modul) Orte auf einer OpenStreetMap-Karte, mit Adresse, Beschreibung und Link. Die Kartenbibliothek wird von der Website gehostet; nur die Kacheln der Hintergrundkarte kommen von OpenStreetMap. Die Seite bleibt ohne JavaScript nützlich — die Liste, die Adressen und die Links sind da. Webradio (Modul) Ein Player für einen Stream, was gerade läuft, und das Wochenprogramm. Eine Sendung kann über Mitternacht reichen: „Samstag 22:00 → 02:00“ bleibt die Sendung vom Samstag. Spielwiese (Modul) Nur für Mitglieder: Man probiert dort Formatierungen aus und sieht die genaue Darstellung der Website. Vor allem zeigt sie, was die Website entfernt hat — es ist die einzige Seite, die auf „Warum ist meine Tabelle verschwunden?“ antwortet. Die drei Inhaltsmodule (Zitate, Rezepte, Glossar) teilen das Muster der FAQ: Kategorien, Suche, Filter, Sortierung und Entwürfe.
-
Inhalte bei der Installation wählen. Der Web-Installer bietet jetzt zwischen den Voraussetzungen und der Datenbank ein Profil der Website an: Vollständig, Gaming / E-Sport, Community oder Nur Kern. Module lassen sich weiterhin einzeln abwählen, und die, die ein Modul benötigt, werden automatisch hinzugefügt (die Auszeichnungen brauchen die Teams), mit einer Meldung. Ohne JavaScript funktioniert das Formular weiterhin — der Server behält nur, was zum gewählten Profil gehört.
Keine Addon-Liste wird von Hand geschrieben: Die Profile werden aus den Angaben
presetsjedes Addons gebaut. Das ist der Unterschied zum Versuch vom Juni 2026, der aufgegeben wurde, weil eine schlanke Installation mit einem Serverfehler (500) endete: Module des Kerns fragten die Tabellen optionaler Module ab, ohne zu prüfen, ob sie existierten. Diese Prüfungen gibt es jetzt, und sie werden bei jedem Durchlauf der CI kontrolliert. -
Jedes mitgelieferte Modul, Widget und Theme gibt seine Rolle an: In seinem
__info()sagt es, ob es zum Kern gehört, zu welchen Installationsprofilen es gehört und welche Module es braucht. Die Zugehörigkeit zum Kern war bisher ein Nebeneffekt der Anwesenheit im Paket — so sindemojis,filesundwebhooksdort gelandet, ohne dass eine Entscheidung getroffen wurde. -
Drei neue Schutzvorrichtungen der kontinuierlichen Integration:
Prüfung Was sie ablehnt check-addon-declarations.phpein Addon, das nichts angibt, eine nicht existierende Abhängigkeit, ein Addon des Kerns, das von einem optionalen abhängt, ein im Katalog veröffentlichtes nicht verteilbares Addon, eine Angabe, die seed.sqlwidersprichtcheck-addon-coupling.phpeine fatale Kopplung (Tabelle, Klasse), weder angegeben noch annotiert; ein harter Zyklus. Aus dem Code mit dem PHP-Tokenizer gelesen, nicht mit regulären Ausdrücken — also keine Fehlalarme bei Kommentaren check-install-profiles.phpein Profil, das nicht startet. Es installiert wirklich auf einer Wegwerf-Datenbank, liefert die Website aus und schlägt beim kleinsten 5xx fehl — auch auf den Routen fehlender Module, die ein sauberes 404 zurückgeben müssen -
Ein Mitglied über die Suchleiste finden. Die Suche der Website fand nur Inhalte — Forum, News, Seiten. Wer jemanden suchte, musste das Mitgliederverzeichnis öffnen und durchblättern, obwohl es auf einer Community-Website zu den am häufigsten gesuchten Dingen gehört. Die Mitglieder erscheinen jetzt in der globalen Suche und in den Sofortvorschlägen, nach Benutzername, Vorname oder Nachname.
Dabei wird nichts Neues preisgegeben: Diese drei Felder werden bereits im öffentlichen Profil jedes Mitglieds angezeigt, und die Suche wendet genau denselben Filter an wie das Verzeichnis — ein gelöschtes Konto erscheint dort nicht.
-
Eine Serie von Terminen auf einmal verwalten. Das Anlegen eines wiederkehrenden Termins erzeugte bereits alle seine Vorkommen mit einem Klick — sie zu überarbeiten hieß dann, sie einzeln zu öffnen.
Jetzt hat ein Vorkommen einer Serie eine Schaltfläche „Die ganze Serie löschen“, deren Bestätigung angibt, wie viele Vorkommen verschwinden, und das Bearbeitungsformular bietet „Auf alle Termine der Serie anwenden“ an. Titel, Typ, Beschreibungen, Ort, Bild und Veröffentlichungsstatus werden auf jedes kopiert; die Daten nie — sie sind es, die eine Sitzung von der nächsten unterscheiden.
-
Ein Update zurückrollen und eine Sicherung wiederherstellen. Das CMS machte bereits eine vollständige Sicherung — Dateien und Datenbank — direkt vor jedem Update des Kerns. Es konnte sie nicht wieder verwenden: Das Sicherheitsnetz war da, aber niemand wusste, wie man hineinfällt.
Jetzt wird die Website, wenn das Platzieren der Dateien oder eine Migration fehlschlägt, automatisch in den Zustand zurückversetzt, in dem sie war; die Meldung sagt sowohl, was fehlgeschlagen ist, als auch, ob das Zurückrollen gelungen ist. Jede Sicherung der Liste hat außerdem eine Schaltfläche Wiederherstellen, für die Fälle, in denen der Schaden nicht von einem Update kommt — ein Modul eines Drittanbieters, eine bereute Aktion. Die Bestätigung gibt an, was verloren geht.
Was die Wiederherstellung nicht anrührt, mit Absicht: die Konfiguration der Website (veraltete Zugangsdaten zur Datenbank zurückzusetzen würde die Website von ihrer eigenen Datenbank abschneiden), die Protokolle (sie sind die Aufzeichnung des Vorfalls, der repariert wird) und der Cache (geleert, damit er neu aufgebaut wird, statt in den Zustand einer anderen Version zurückgesetzt zu werden).
Nebenbei enthält die Sicherung jetzt
vendor/, das das Update-Paket mitliefert und das sie nicht enthielt: Ohne es hätte ein Zurückrollen den alten Code über die neuen Abhängigkeiten gesetzt. -
Auf einen Kommentar antworten. Die im ursprünglichen Code deaktivierte Schaltfläche „Antworten“ funktioniert jetzt: Die Antwort wird eingerückt unter dem Kommentar angezeigt, auf den sie antwortet. Man kann nur auf einen nicht gelöschten Kommentar der obersten Ebene desselben Inhalts antworten (eine Ebene von Antworten); der Server prüft das.
-
Für Theme-Ersteller: Zonen beim Namen gerufen (von HiddenCMS übernommene Idee). Eine Vorlage ruft eine Zone jetzt bei ihrem Namen —
$this->output->region('content')— statt bei ihrer Nummer —zone(2). Das Theme gibt die Zuordnung zwischen Namen und Zonen in seinem__info()an (regions). Der alte Aufrufzone()funktioniert weiterhin, und ein Theme ohne diese Angabe bleibt unverändert. Die fünf öffentlichen Themes (Nebula, Forge, Granite, Blockcraft, Extend) verwenden die Namen. -
Installieren über die Kommandozeile (
install/cli.php, von HiddenCMS übernommene Idee): eine Alternative zum Web-Assistenten, praktisch, um einen Server reproduzierbar oder automatisiert zu installieren. Seine Optionen decken die Datenbank ab (--db-*,--create-db), das Administratorkonto (--admin-*), Namen und Adresse der Website (--site-name,--site-url), die Sprache (--lang), Demodaten (--demo) und die Ausführung (--force,--yes,--dry-run,--no-lock). Ohne Optionen stellt er die Fragen nacheinander und verbirgt das Passwort beim Eintippen;--admin-pass-envliest das Passwort aus einer Umgebungsvariable, damit es nicht in der Prozessliste erscheint. Er verwendet denselben Code wie der Web-Assistent und installiert jedes mitgelieferte Addon, wie das Profil Vollständig. -
Ein Starter für die ganze Batterie:
php tools/check-all.php. Die Prüfungen hatten keinen gemeinsamen Einstiegspunkt — die CI ruft sie einzeln auf, und lokal schrieb jeder seine eigene Schleife von Hand, nie dieselbe. Der Starter entdeckt die vorhandenen Prüfungen (eine neue Prüfung kommt hinzu, ohne dass jemand ihn anfasst), führt zuerstcomposer auditaus, begrenzt die Dauer jeder Prüfung und gibt am Ende an, was er nicht ausgeführt hat: die Browser-Tests (--navigateur) und die Prüfungen mit einem ausdrücklichen Ziel, daruntercheck-restauration, das die Website absichtlich beschädigt. -
Jedes Addon zeigt, wie es aussieht (2026-09-22). Die Seite „Themes & Addons“ der Verwaltung und der Marketplace zeigen ein Vorschaubild: ein echter Screenshot des Moduls, Widgets, Themes oder der Sprache, wie es auf der Demo läuft. Alle 61 Addons des Marketplace haben eines, in 960×600 für Module und Widgets. Dafür wurden sechs Module und zwei Widgets mit Beispielinhalten auf der Demo installiert — ein Glossar, Zitate, Rezepte, eine Ortskarte und ein Webradio-Programm —, und die Widgets, die ohne Einstellungen nichts anzeigen, wurden mit Beispieleinstellungen aufgenommen. Was nichts zu zeigen hat, behält sein Symbol, wie die Konnektoren Discord, GitHub und Google, deren Symbol ihr Logo ist. Die Demo trägt außerdem endlich die Identität ihrer Community — Name, Typ, Gründungsdatum und Beschreibung —, die leer geblieben war.
-
Zehn Addons haben endlich eine Beschreibung (2026-09-22): die sechs Sprachen und die vier Addons der externen Anmeldung (das Basis-Addon und seine Konnektoren Discord, GitHub und Google). Sie wird in der Sprache der Website angezeigt.
-
Vom Administrator definierte Profilfelder (2026-09-20). Das Profil eines Mitglieds hatte nur feste Felder. Verwaltung → Benutzer → Profilfelder lässt eigene hinzufügen — Name im Spiel, Plattform, Rang… —, aus acht Feldtypen. Die Mitglieder füllen sie im Panel „Weitere Angaben“ ihres Profils aus. Ein Feld ist standardmäßig privat; einmal öffentlich gemacht, wird es auf der Seite des Mitglieds angezeigt. Die Werte sind im Export der personenbezogenen Daten des Mitglieds enthalten und werden mit seinem Konto gelöscht.
-
Die Schrift der Website lässt sich in der Verwaltung wählen (2026-09-20). Verwaltung → Einstellungen → Allgemeine Einstellungen → Schriftart der Website bietet zwölf Schriften an, die die Schrift jedes Themes ersetzen. Standardmäßig behält „Schriftart des Themes“ die eigene Schrift jedes Themes und ruft keinen externen Dienst auf; die zwölf angebotenen Schriften werden von Google Fonts ausgeliefert.
-
Das Anmeldeprotokoll wird nicht mehr ewig aufbewahrt (2026-09-20). Es verzeichnet die IP-Adresse, den Browser und das Datum jeder Anmeldung, und nichts löschte es je. Es wird jetzt jenseits von 395 Tagen (dreizehn Monaten) bereinigt, eine Dauer, die unter Verwaltung → Einstellungen → Allgemeine Einstellungen eingestellt wird; 0 schaltet die Bereinigung aus.
-
Erinnerungen für verfolgte Kalendertermine (2026-09-20). Ein Mitglied, das einem Kalendertermin folgt, erhält vor seinem Beginn eine Erinnerung, wie die Teilnehmer eines Ereignisses im Modul Ereignisse. Die Frist wird in der Konfiguration des Kalenders eingestellt („Erinnerung vor einem verfolgten Termin“, standardmäßig 24 Stunden, 0 zum Deaktivieren).
-
Das Update-Paket gibt an, was es schützt und was es entfernt (2026-09-20). Es trägt eine Datei
nf-manifest.json: die Ordner der Website, die ein Update nie beschreibt (config/,install/,upload/,logs/,backups/,cache/), und die Dateien, die die Version entfernt. Bisher ermittelte das Update selbst, was zu löschen war; ein Paket ohne diese Datei wird weiterhin akzeptiert.
Geändert
-
Die ganze Oberfläche spricht Bootstrap 5 (2026-09-23). Rund 470 Verwendungen von Klassen aus Bootstrap 3 und 4 blieben, von einem Kompatibilitäts-Stylesheet am Leben gehalten: Formularfelder, farbige Abzeichen, Schließen-Schaltflächen, Schaltflächen in voller Breite, Blöcke „Avatar und Text“, Eingabegruppen, Kontrollkästchen, Formularraster. Das ganze Markup ist auf seine Entsprechungen in Bootstrap 5 umgestellt; was dem Produkt eigen ist, trägt jetzt einen eigenen Namen des Produkts. Eine Prüfung lehnt jeden zurückkehrenden alten Namen ab, selbst neu definiert. Was man sieht:
- die Auswahllisten haben ihren Pfeil zurück — etwa hundert, in der Verwaltung und auf der Website, sahen wie Textfelder aus;
- die farbigen Abzeichen (Status, Gruppen, Rollen, Sanktionen) sind in jedem Theme lesbar, hell wie dunkel: Ihr Text fiel durch die Kontrastprüfung;
- die Gruppen „Moderator“ und „Senior-Moderator“ werden angezeigt: Ihr Name stand weiß auf weißem Hintergrund;
- die Schließen-Schaltflächen der Dialoge haben auf Telefonen eine ausreichend große Klickfläche.
-
Das JavaScript wird von einem Linter geprüft (2026-09-22). Einundsiebzig Dateien des Projekts, über die Jahre geschrieben, ohne dass sie etwas außer ihrer Syntax und der Abwesenheit von jQuery prüfte. ESLint sieht, was die Syntax nicht sagt: eine durch ein vergessenes
varangelegte globale Variable, ein verkappteseval, Code nach einemreturn, ein mit einem berechneten Wert gespeistesinnerHTML. Kein npm-Paket wird bereitgestellt: Es ist Entwicklungswerkzeug, genau wie die statische Analyse von PHP.Die Regeln sind nach einem einzigen Kriterium gewählt — hier schon einmal zugebissen zu haben. Es ist die Familie von „
$is not defined“, die drei Monate lang die Tabellensortierung in der ganzen Verwaltung lahmgelegt hatte. Das vorhandene Durcheinander (zu bereinigendeinnerHTML-Verwendungen) wird so eingefroren, wie es ist, statt auf einmal neu geschrieben: Seine Zahl kann nicht mehr steigen. -
Die PHPStan-Baseline wird mit einem Befehl neu erzeugt, und die Klasse
Configdes Kerns ist annotiert (2026-09-21). Drei neue Fehler führten dazu,phpstan-baseline.neonwieder zu öffnen: Von Hand hinzugefügte Einträge waren anders geschrieben als die von PHPStan selbst, und fast dreihundert Blöcke passten auf nichts mehr — eine ganze Familie „Function NeoFrag not found“, tot, seit die Bootstrap-Datei die Funktion deklariert. Die Konfiguration lebt inphpstan-base.neon,phpstan.neonfügt nur die Baseline hinzu, undcomposer stan:baselineerzeugt sie vollständig neu.Configannotiert jetzt die aktuelle Sprache, die Liste der Sprachen und die Einstellungen des Kerns, die die Module lesen: Diese Zugriffe werden analysiert, statt eingefroren zu werden. -
Die Werkzeuge in
tools/auf einer gemeinsamen Bibliothek neu aufgebaut (2026-09-21). Rund sechzig Werkzeuge, jedes auf seine Art geschrieben, kopierten dieselben Leitungen: einen PHP-Server starten, eine Administratorsitzung öffnen, Chrome starten,config/db.phplesen. Eine in einem gelernte Lektion erreichte die anderen nicht.tools/lib/trägt jetzt dieses Fundament — Verbindung, Sitzung, Server, Browser, Durchlaufen des Repositorys, SQL, Optionen, Urteile —, und jedes Werkzeug beschränkt sich auf seine eigene Logik. Zweiundfünfzig bleiben, ohne Funktionsverlust:check-js-syntaxundcheck-js-jquerybildencheck-js-sources;check-docs-countsundcheck-docs-liensbildencheck-docs;check-lang-argsgeht incheck-langsauf;seed-wiki-docsunddump-wikibildenwiki-docs;smoke-testwird zucheck-smoke, wie jede Prüfung;addons-manifestundtable-map, die Daten sind, leben in der Bibliothek. Jedes Werkzeug hat jetzt seinen eigenen reservierten Port (mehrere teilten sich einen), drei Rückgabecodes, die „nichts zu melden“, „abgelehnt“ und „konnte nicht urteilen“ unterscheiden, und einen Kopf, aus dem der Katalog intools/README.mderzeugt wird.bs5-codemod, das Werkzeug der Umstellung von Bootstrap 4 auf 5 im Juni, ist entfernt:check-classes-bs4deckt alles ab, was es prüfte, einschließlich der Breakpoints der richtungsabhängigen Hilfsklassen. -
declare(strict_types=1)im ganzen nützlichen Bereich (2026-09-21): 1.365 Dateien gegenüber 78 am Vortag. Die Arbeit ging seit Juni in kleinen Paketen voran; sie ist abgeschlossen. Die 209 verbleibenden Dateien sind die Vorlagenviews/**.tpl.php, bei denen die Deklaration syntaktisch gültig wäre und nichts schützen würde.Die Umstellung erfolgte in der Reihenfolge abnehmenden Risikos — die Zahl der Aufrufe nativer Funktionen pro Datei —, mit der Testsuite zwischen jedem Paket.
Eine tiefere Folge, diesem Produkt eigen: PHP im strikten Modus verweigert
__toString()für interne Funktionen.lang()gibt aber ein verzögertes Übersetzungsobjekt zurück, das bei der Darstellung aufgelöst wird, sobald die Sprache endlich bekannt ist, und auch Daten sind Objekte. Die Leiste der Verwaltung, die Seite jeder News und mehrere Bildschirme stürzten daher mit einem schweren Fehler ab — Modul ausgeschaltet, Seite abgeschnitten, ohne ein Wort. Die Umwandlung geschieht jetzt an der Stelle der Maskierung (htmlspecialchars), also dort, wo der Wert per Definition zu einer Zeichenkette werden muss: fast 500 Stellen in 86 Dateien.Die Welle verlangte auch elf ausdrückliche Umwandlungen, drei davon auf Wegen, die bei jeder Seite genommen werden — die Anzeigereihenfolge der Sprachen und der Gruppen, gelesen beim Start jeder Sitzung, und die Berechnung des Tokens, das jedes Formular gegen gefälschte Anfragen schützt (CSRF): Ohne sie hätte eine Website mit zwei aktiven Sprachen auf allen ihren Seiten einen Fehler 500 zurückgegeben.
-
Das Protokoll sagt jetzt, WO, nicht nur was (2026-09-21). Wenn ein Modul eine Ausnahme wirft, wird seine Darstellung aufgegeben und die Seite abgeschnitten angezeigt — still. Die Protokollzeile gab die Meldung, ohne je eine Datei zu nennen. Sie nennt jetzt die erste Stelle im eigenen Code des Produkts im Aufrufstapel. Die Herkunft der obigen Fehler zu finden wurde von einer Untersuchung zu einem einfachen Lesen.
-
Der SCSS-Compiler geht auf 2.1 (2026-09-20). Unter PHP 8.5 schrieb jede Kompilierung der Stile zehn Veraltungswarnungen ins Protokoll; es ist keine mehr übrig. 2.x minimiert etwas mehr (
.25remstatt0.25rem,#cccstatt#CCCCCC), was drei Stylesheets ändert — die der Module Addons und Auszeichnungen und der Wartungsseite. Die Gleichwertigkeit wurde nicht aus dem Text abgeleitet: Beide CSS-Sätze wurden der Engine von Chrome vorgelegt, die darin genau dieselben Regeln, Eigenschaften und berechneten Werte sieht. -
Die Dokumentation wurde vollständig mit dem Code abgeglichen (2026-09-17). Die Leitfäden zur Installation, zu den Konzepten und zur Entwicklung (ein Modul, ein Widget, ein Theme erstellen, das Framework) stammten vom Juni und beschrieben das CMS, wie es früher war: eine Installation ohne Wahl des Profils, ein Theme, das jQuery lud, Raster von Bootstrap 4. Sie sagen jetzt, was das Produkt tut — Installationsprofile, Angaben der Addons, benannte Regionen, Front-End ohne jQuery unter einer strikten Sicherheitsrichtlinie, Widget-Einstellungen mit Rückfallwerten, gemeinsames Farbvokabular. Die README, der Leitfaden für Beiträge, die Sicherheitsrichtlinie und die technische Referenz sind ebenso abgeglichen.
-
Was ein Addon erlaubt, wird aus seiner Angabe gelesen, nicht mehr aus fest eingetragenen Namenslisten. Drei davon entschieden über das Schicksal der Addons, und alle drei waren falsch: Die Liste der Widgets schützte sieben Namen, die keine Widgets sind; die Liste der Themes schützte ein nicht existierendes Theme
defaultund ließnebula, das einzige öffentliche Theme des Kerns, löschbar, sobald es inaktiv war; die Liste der Module duplizierte, im Widerspruch, was__info()bereits sagte. Addon für Addon gegen die alte Logik geprüft: keine Änderung bei dem, was sich deaktivieren lässt, keine Änderung des aktiven Zustands, und 39 Addons werden nicht löschbar — was der Zweck der Korrektur ist. -
Der Papierkorb kennt die anderen Module nicht mehr. Er trug die Liste der Tabellen, Primärschlüssel und Wiederherstellungsmethoden von
news,articles,gallery,commentsundforumfest eingetragen: Er konnte daher nicht zum Kern gehören, ohne vier optionale Module mitzuziehen —commentsselbst gehört zum Kern. Jedes Modul gibt jetzt seine wiederherstellbaren Typen an; der Kern sammelt sie ein. Dieselbe Umkehrung für die Inhaltsbeschreibungen (Reaktionen, Abonnements, Revisionen). -
Die Liste der Addons des Kerns und der optionalen Addons wird nicht mehr von Hand gepflegt.
tools/lib/addons-manifest.php, eine von Hand geschriebene und im Juni eingefrorene Tabelle, wird jetzt aus den Angaben abgeleitet. Die beiden waren bereits auseinandergelaufen:emojisstand als Kern in der Liste, während es sich als à la carte erklärt — es ließ sich also bei der Installation abwählen, fehlte aber im Katalog und war daher unmöglich neu zu installieren. Katalog: 52 → 53 Addons an jenem Tag (61 beim Erscheinen der 1.2.0). -
Der Installer optisch überarbeitet: zweispaltiges Layout, Stil-Tokens aus
nebulaübernommen (Marineblau und Petrol, Akzent#2dd4bf), Verlauf hinter dem Text hervorgeholt, Logo in einem Abzeichen.
Behoben
-
Die Sicherung des Monitorings funktioniert wieder (2026-09-23). Seit dem 21. September hielt sie bei der allerersten Zeile der Datenbank an: Die Schaltfläche „Sicherung starten“ und das Update des Kerns, das mit einer Sicherung beginnt, schlugen auf jeder Website fehl. Gefunden beim Testen des Updates vor seiner Veröffentlichung.
-
Der Sprachwechsel bei einer übersetzten News führt nicht mehr zu einer nicht gefundenen Seite (2026-09-23). Die Sprachauswahl behält die Adresse, und mit ihr den Titel in der vorherigen Sprache: Die übersetzte Version lehnte ihn ab. Sie leitet jetzt auf ihre eigene Adresse um.
-
Eine übersetzte Seite wird in der richtigen Sprache angezeigt (2026-09-23). Die öffentlichen Seiten wurden in der Version ausgeliefert, die die Datenbank zuerst zurückgab, unabhängig von der Sprache des Besuchers.
-
Das von einem Besucher gewählte Theme schwappt nicht mehr auf eine andere Website derselben Domain über (2026-09-23). Die Wahl wurde für die ganze Domain gemerkt: Ein Besucher, der eine Website auf Forge umstellte, sah auch eine andere unter derselben Domain installierte Website in Forge. Die Wahl wird jetzt für jede Website getrennt gemerkt, und eine neue Einstellung, Allgemeine Einstellungen → Designauswahl, lässt sie abschalten: Das Menü verschwindet, und das Standard-Theme gilt für alle.
-
Die Demo setzt sich wieder zurück (2026-09-23). Ein Fehler in ihrem Datensatz ließ das Zurücksetzen alle fünfzehn Minuten seit dem Vortag fehlschlagen: Was die Besucher dort änderten, blieb. Eine Prüfung lehnt diesen Fehler jetzt ab, bevor etwas online geht, und ein fehlgeschlagenes Zurücksetzen wird ins Protokoll geschrieben, statt unbemerkt zu bleiben.
-
Das Notfallkonto der Demo erscheint nirgends mehr (2026-09-23): weder in der Mitgliederliste, noch in der Suche, noch unter den Online-Mitgliedern, noch in der Verwaltung; seine Seite antwortet „nicht gefunden“.
-
Die Website auf einem Telefon (2026-09-23), anhand von auf einem Telefon aufgenommenen Screenshots:
- Das Menü ist immer erreichbar. Im Theme Nebula verschwand es unter 860 Pixeln Breite, ohne Schaltfläche, um es wieder zu öffnen: Eine „Burger“-Schaltfläche öffnet es jetzt. In den anderen Themes klappt ein Menü, das zu lang für eine Zeile ist, hinter einer Schaltfläche „Menü“ zusammen, statt umzubrechen, bis es den Bildschirm füllt; ein kurzes Menü bleibt ausgeklappt.
- Gestapelte Blöcke berühren sich nicht mehr: Der Mitgliederbereich klebte am Block darüber.
- Text klebt nicht mehr an den Avataren der Mitglieder (Kommentare, Unterhaltungen, Autor einer News, Bewerbungen, Profil).
- Die Punkte der Diashow sind echte Schaltflächen, unter dem Bild zentriert, und bleiben auf dunklen Themes hell, wie die Pfeile und die Beschriftung: Bootstrap machte sie schwarz.
- Die Suche des Themes Extend behält ihre Schaltfläche neben dem Feld.
- Die Fotos eines Albums füllen ihre Karte.
- Der Kopf der Kommentare zeigt den Titel vor dem Zähler, der ihm vorausging.
- Abgekürzte Daten werden in der Sprache der Website geschrieben („30 août 2026“, „Sonntag“), und nicht mehr auf Englisch; die Autorenzeile einer News hat wieder eine normale Textgröße.
-
Die Fotoseite der Galerie existiert (2026-09-23). Das Widget „Zufallsbild“, die Diashow der Galerie und der Link eines zu einem Foto geschriebenen Kommentars führten alle zu einer nicht gefundenen Seite: Sie war nie angegeben worden. Sie zeigt das Foto, seine Beschreibung, den Rückweg zum Album und die Kommentare. Ein Foto folgt außerdem den Regeln seines Albums: kein Zugriff mehr über seine Adresse, wenn das Album im Papierkorb oder noch nicht veröffentlicht ist.
-
Letzte Reste von Bootstrap 3 und 4 (2026-09-23), die ihre Klassennamen nicht verrieten: die Struktur der Diashow, die Schließen-Kreuze, die ein „ד über das Symbol legten, zwei Akkordeons (FAQ, Navigationslinks), noch nach Art von Bootstrap 4 gebaut (das der FAQ öffnete sich, aber ohne das Aussehen und den Pfeil der Komponente), Felder, die sich in eine leere Gruppe hüllten, der weiß gebliebene Pfeil der Tooltips unter einem dunklen Tooltip, und zwei Regeln des Widgets der Partner.
check-classes-bs4liest jetzt auch die STRUKTUR der Komponenten und die in den Vorlagen geschriebenen Stile. -
Fehlerseiten, die keine waren (2026-09-23). In der Moderation und in der Verwaltung der Rollen, der E-Mail-Vorlagen, der Mitglieder und der Diashow sollte eine Adresse, die auf ein entferntes Element zeigt, „Seite nicht gefunden“ antworten: Sie rief eine Funktion auf, die nicht existiert, schrieb eine Warnung ins Protokoll, und die Seite der Moderation wurde leer angezeigt. Gefunden, indem der statischen Analyse die „magischen“ Funktionen des Frameworks beigebracht wurden — was 455 Vorkommen aus ihrer Ausnahmeliste strich.
-
Die Schaltfläche in den an Mitglieder geschickten E-Mails ist lesbar (2026-09-23): Kontobestätigung, verlorenes Passwort und die anderen Vorlagen hatten eine weiße Schaltfläche auf hellem Türkis (Kontrast 2,3:1). Die Korrektur gilt für die mitgelieferten Vorlagen und für die bereits installierten, außer denen, die ein Administrator angepasst hat.
-
Letzte Nachbesserungen der Anzeige (2026-09-23): Links im Wiki im lesbaren Farbton des Themes; Schaltflächen „Erfolg“ auf dunklen Themes; Status einer Bewerbung, deren Kasten keinen Hintergrund hatte (Klassen eines alten Verwaltungs-Themes); soziale Netzwerke auf den Mitgliederkarten; abgeschnittene Titel in der Verwaltung; ein Besucher, der dem Link zur Teilnahme an einem Ereignis folgt, erhält „Unbefugter Zugriff“ statt einer nicht gefundenen Seite.
-
Text ist überall lesbar, im hellen wie im dunklen Modus (2026-09-23). Links und Schaltflächen der Verwaltung, Hinweise, Daten und Tabellenköpfe der Themes, Kategorien der News, die Marketplace-Seite auf hellen Themes, die Schaltfläche „Alle akzeptieren“ des Cookie-Banners, Abzeichen der Reputation und der Ereignistypen: Alle erreichen jetzt den empfohlenen Mindestkontrast (4,5:1). Im Dunkelmodus hat die Verwaltung ihre eigenen Statusfarben, und das Panel „Site-Gesundheit“ und die Fläche zum Hochladen von Bildern der Galerie folgen dem Theme.
-
Die Verwaltung auf einem Telefon (2026-09-23). Die obere Leiste bricht auf zwei Zeilen um — der vollständige Brotkrumenpfad, dann die Schaltflächen —, statt den Titel der Seite abzuschneiden; die kleinen Ziele (Startsymbol, Zähler) sind groß genug für einen Finger; der Kopf der Forenkategorien rutscht nicht mehr unter seine Schaltflächen.
-
Das Forum auf einem Telefon (2026-09-23): In einem Thema rückt der Autor über die Nachricht, statt ihr nur 200 px Breite zu lassen, und die Schaltflächen einer Nachricht verdecken ihr Datum nicht mehr.
-
Übersetzte Pluralformen (2026-09-23). 47 Zeichenketten hatten bei der Übersetzung ihre Pluralform verloren: Eine Website auf Englisch zeigte „3 topic“, „5 image“, „2 year“. Der Zähler der Forenkategorien, in jeder Sprache auf Französisch geschrieben, ist jetzt übersetzt.
-
Die Dokumentation der Website ist aktuell (2026-09-23). Die zehn mit dem Produkt ausgelieferten Wiki-Seiten und die der Demo hinkten den Leitfäden eine Woche hinterher; „Ein Widget erstellen“ lehrte noch eine Klasse von Bootstrap 4. Eine Prüfung vergleicht sie jetzt mit den Leitfäden.
-
Das Antwortformular des Forums passt auf ein Telefon (2026-09-23): Die Liste der erlaubten Anhangstypen, ohne Leerzeichen geschrieben, bildete ein einziges Wort, zu breit für den Bildschirm.
-
Die ganze Website durchleuchtet, in jedem Theme, jedem Modus und jeder Breite (2026-09-23). Eine automatische Prüfung stellt jetzt jede Seite der Verwaltung in ihrem Theme und jede öffentliche Seite in jedem öffentlichen Theme dar, hell und dunkel, als Administrator und als Besucher angemeldet, in acht Breiten von 360 bis 2560 px, mit und ohne Inhalt. Dieser erste Durchgang hat behoben:
- kaputte Symbole in den Kategorielisten der Galerie, der Spiele, der Teams und der News, wenn eine Kategorie kein Symbol hatte;
- das Land auf den Profilen der Demo, ausgeschrieben: Das Profil zeigte kein Land an und suchte eine Flagge, die sich nicht finden ließ;
- die Betreffzeilen der E-Mail-Vorlagen, die
{{site_name}}wörtlich in der Liste zeigten; - für ein Telefon zu breite Tabellen (Bugtracker, Downloads, Wiki-Verlauf, Moderation, Sitzungen, Teilnehmer eines Ereignisses, Auszeichnungen): Sie scrollen jetzt in ihrem Rahmen, statt die ganze Seite zu verbreitern;
- die Listen des Forums auf einem Telefon: Vier Spalten teilten sich 360 px, und die letzte Nachricht wurde abgeschnitten; jeder Eintrag stapelt sich jetzt — Symbol und Titel, dann Statistiken und letzte Nachricht;
- die Leiste des Themes Nebula auf einem Telefon, die über den Bildschirm hinausragte;
- drei von Seiten angefragte Dateien, die nicht existierten, und zwei bei jeder Update-Prüfung ins Protokoll geschriebene Zeilen, solange keine Version veröffentlicht ist.
-
Die Schaltflächen „Bearbeiten“ und „Löschen“ sind nicht mehr versetzt (2026-09-22). In den zweispaltigen Listen der Verwaltung — Kategorien der News, Kategorien der Galerie… — brach die zweite Schaltfläche auf die nächste Zeile um, versetzt unter die erste. Sie bleiben jetzt nebeneinander.
-
Die Karte „Speicher“ des Monitorings wird richtig angezeigt (2026-09-22). Die Anzeige wurde als voller Kreis statt des vorgesehenen Halbkreises gezeichnet, mit einer rohen Zahl in der Mitte, und Wert und Prozentsatz, oben platziert, überlappten den Strich; sie sitzen jetzt in der Mulde der Anzeige. Der Titel „Serverinformationen“ auf derselben Seite bricht auf zwei Zeilen um, wenn die Spalte schmal ist, statt abgeschnitten zu werden. In der Gruppe „E-Mail-Versand“ zeigte die Zeile „E-Mail-Transport“
[object Object]statt der verwendeten Methode. -
Ein ohne Einstellungen platziertes Widget wird mit seinen Standardwerten angezeigt (2026-09-22). Wenn ein Theme bei der Installation ein Widget platziert oder ein älteres Layout es wiederherstellt, kommt es ohne Einstellungen an: Es schrieb dann auf jeder angezeigten Seite Warnungen ins Protokoll, und das Navigationsmenü verschwand einfach. Es erhält jetzt die Werte, die sein Formular standardmäßig gespeichert hätte. Bereits konfigurierte Widgets ändern sich nicht.
-
Die Seite der Ereignisse wird wieder angezeigt (2026-09-22). Sie zeigte eine Fehlerseite „nicht gefunden“, sobald sie Ereignisse auf mehrere Seiten zu verteilen hatte — unter einem ganz normalen Titel, was es schwer machte, es zu bemerken. Die Einstellung der Zahl der Ereignisse pro Seite wurde als Text gespeichert, und der am Vortag strenger gemachte Code lehnte sie ab. Alle Listen mit Seitennavigation akzeptieren diese Einstellung jetzt in beiden Formen.
-
Die Stimmen der Umfragen werden verzeichnet (2026-09-22). Der Abstimmende las „Danke für deine Stimme!“, und die Stimme wurde nie gezählt: Keine Option wurde als zur Umfrage gehörig erkannt. Eine Stimme, die auf keine Option der Umfrage zielt, wird jetzt mit einer entsprechenden Meldung abgelehnt, statt willkommen geheißen zu werden.
-
Das Widget „Forum“ zeigt endlich Themen und Beiträge (2026-09-22). Seine beiden Typen, „Neueste Themen“ und „Neueste Beiträge“, wählten überhaupt keine Forenkategorie und blieben daher auf jeder Website leer, wie viele Nachrichten es auch gab.
-
Drei weitere Funktionen tappten in dieselbe Falle wie die Umfragen (2026-09-22), gefunden von der für diesen Fehler geschriebenen Prüfung:
- das Öffnen einer Bewerbung mit eigenen Feldern ließ die Seite abstürzen, auf Seiten des Bewerbers wie in der Verwaltung;
- eine Benachrichtigung, die auf einen Kalendertermin verweist, stürzte beim Bau ihres Links ab;
- die maximale Tiefe der Antworten im Forum wurde nie angewendet: Die Berechnung hielt bei der ersten Ebene an.
-
Die Rückkehr auf Seite 1 einer Liste führt nicht mehr zu einer nicht gefundenen Seite (2026-09-22). In den Listen der Verwaltung, deren Zahl der Elemente pro Seite sich einstellen lässt, baute die Schaltfläche „1“ eine Adresse, die die Website nicht erkannte.
-
Der Bearbeitungsbildschirm eines eigenen Profilfelds öffnet sich (2026-09-22). Der Bildschirm stürzte bei jedem Öffnen ab: Er gab seiner Speichern-Schaltfläche keine Beschriftung.
-
Zwei Schaltflächen „Zurück“ führten zu einer nicht gefundenen Seite (2026-09-22): von der Seite eines Bildes zu seinem Album; von einem Spielmodus zu seinem Spiel.
-
„Bewerben“ erscheint nicht mehr dort, wo die Bewerbung abgelehnt würde (2026-09-22): bei einem geschlossenen oder vollen Angebot und für jeden, der sich nicht bewerben darf. Ebenso kann ein Administrator, der eine dem Team vorbehaltene Unterhaltung liest, jetzt dorthin einladen und eine Nachricht darin melden, statt nach dem Sehen der Schaltfläche abgewiesen zu werden.
-
Die Untermenüs des Navigations-Widgets öffnen sich (2026-09-22). Ein Link, der andere Links gruppiert, klappte beim Klick nichts auf: Er trug noch das Attribut der alten Version von Bootstrap, nach dem sein eigenes Skript nicht mehr suchte.
-
Die übrigen Hilfe-Tooltips der Formulare erscheinen beim Überfahren (2026-09-22). Die Korrektur vom Vortag deckte nur einen Teil der Formulare ab: Das Symbol (i) neben den Feldern der anderen Verwaltungsbildschirme und die Tooltips der Beschriftungen zeigten weiterhin nichts — derselbe Fehler des Attributs, in den beiden Bibliotheken, die sie bauen.
-
Menübeschriftungen mit Akzent werden übersetzt (2026-09-22). Ein aus der Verwaltung gespeicherter Menülink — „Actualités“, „Équipes“ — wird kodiert gespeichert, und seine Übersetzung ließ sich nicht mehr finden: Er blieb in den fünf anderen Sprachen auf Französisch, mit einer Warnung im Protokoll auf jeder angezeigten Seite.
-
Die Archive des Marketplace sind reproduzierbar (2026-09-22). Sie trugen die Source Maps
.map, die der Stil-Compiler bei jeder Installation neu erzeugt und die das Repository ignoriert: Zwei Archive desselben Addons, auf zwei Maschinen gebaut, unterschieden sich, obwohl sich der Code nicht geändert hatte. Die Archive tragen diese Dateien nicht mehr. -
Das Widget „Auszeichnungen“ lässt sich endlich durch Hochladen eines Archivs installieren (2026-09-22). Es war das einzige der 61 verteilbaren Addons, das seine Abhängigkeit vom Kern nicht angab; der Installer, der sie verlangt, um ein Addon zu erkennen, übersprang es OHNE EIN WORT — keine Meldung, keine Spur.
-
Die Wartungsseite ist nicht mehr leer (2026-09-22). Die beiden Felder „Titel“ und „Inhalt“ werden LEER ausgeliefert, sodass die Seite NICHTS außer dem Namen der Website zeigte — obwohl die Vorschau der Verwaltung einen Titel und einen Text versprach. Ein Standardtitel und eine Standardmeldung, in alle sechs Sprachen übersetzt, füllen die Lücke; sobald die Felder ausgefüllt sind, werden sie angezeigt.
-
Umriss-Schaltflächen haben ihren Rand zurück (2026-09-22). Die Themes definierten nur die Variante „primary“ der Umriss-Schaltfläche neu, und ihre eigene Regel löschte den Rand der anderen: Die sechs anderen vom Produkt verwendeten Varianten — 90 Verwendungen im Code — sahen wie einfache Links aus. Am sichtbarsten war „Webseite öffnen“ im Wartungsbanner, das nur beim Überfahren einen Rand hatte.
-
Technischer Code ist in der Verwaltung nicht mehr rosa (2026-09-22). Das Theme legte nur die Schrift der
<code>-Ausschnitte fest, die daher das Rosa von Bootstrap behielten — eine jeder Palette des Produkts fremde Farbe. Sehr sichtbar in der Liste der Rollen. -
Die Schaltfläche „Schließen“ der Fenster schließt endlich das Fenster (2026-09-22). In ALLEN Fenstern des Produkts tat die Schaltfläche „Schließen“ (oder „Abbrechen“) unten nichts: Man brauchte das Kreuz oben rechts. Die Ursache: Bootstrap 5 hat das Attribut umbenannt, das das Schließen auslöst, und der Kern setzte noch den alten Namen; ein Browser ignoriert ein unbekanntes Attribut still. Die Schaltfläche ist außerdem eine echte Schaltfläche geworden — sie wurde als
<span>dargestellt und war daher mit der Tastatur nicht erreichbar. Zwei Schutzvorrichtungen verhindern, dass das zurückkommt: Die Prüfung des Codes lehnt den alten Namen ab, und ein von Hand gestarteter Browserdurchlauf KLICKT die Schaltfläche. -
Das Theme Nebula zeigt sein Menü nicht mehr doppelt (2026-09-22). Jede neue Installation zeigte den Namen der Website zweimal und das Menü zweimal: Das Theme zeichnet seine eigene Leiste, und die Installation platzierte AUCH einen Titel und ein Menü direkt darunter. Das Menü lebt jetzt in der oberen Leiste, wo es nur einmal erscheint — und es ist aus der Verwaltung einstellbar, was vorher nicht der Fall war: Die Links der Leiste waren fest eingetragen, also fehlte „Kontakt“ und ein deaktiviertes Modul behielt seinen Link. Bereits installierte Websites werden durch eine Migration korrigiert, die den Kopfbereich nur anfasst, wenn er wie ausgeliefert geblieben ist.
-
Der Sprachwechsel landet nicht mehr auf einer Seite mit Code (2026-09-22). Die Sprachauswahl in der Fußzeile — die von fünf Themes, darunter das Standard-Theme — schickte den Besucher auf eine Seite, die
{"redirect":"/en/…"}als rohen Text zeigte, statt ihn zur übersetzten Seite zu bringen. Man musste zurückgehen, um herauszukommen.Die Ursache: Diese Auswahl ist ein echtes Formular, das nichts abfing, und sie zielte auf eine technische Adresse, die immer in JSON antwortet. Der Server unterscheidet jetzt einen Aufruf aus dem Fenster „Meine Sprache wählen“, das JSON erwartet, von einer gewöhnlichen Formularübermittlung, die erwartet, zur Seite gebracht zu werden. Gefunden, indem man der Geste in einem echten Browser folgte, was bis dahin keine Prüfung getan hatte.
-
In einer einzigen Sprache geschriebene Inhalte schicken die anderen Sprachen nicht mehr auf eine Fehlerseite (2026-09-21). Eine auf Französisch geschriebene News bot in ihrer Auswahl noch die fünf anderen Sprachen an, und alle fünf antworteten 404: auf der Demo gemessen, 60 tote Adressen von 72. Die natürlichste Geste eines ausländischen Besuchers landete auf einem Fehler. Die existierende Version wird jetzt ausgeliefert, mit einem Banner, das es in der Sprache des Besuchers sagt, und einem Link zum Original. Das gilt für News, Artikel und Alben (und ihre Kategorien) sowie für die Teams.
Zwei untrennbare Vorsichtsmaßnahmen, ohne die die Heilung teurer wäre als die Krankheit: Die Seite kündigt Suchmaschinen jetzt nur die Sprachen an, die wirklich existieren, und sie bestimmt das Original als kanonische Adresse — sonst würden sechs Adressen für einen einzigen Text indexiert. In der Verwaltung kein Rückfall: Eine leere Version muss leer erscheinen, man kommt ja, um sie auszufüllen.
tools/check-langues-contenu.phpsetzt alle drei Eigenschaften durch, in der kontinuierlichen Integration. -
Die kontinuierliche Integration ist wieder grün (2026-09-21); auf dem Hauptzweig war sie seit dem 10. Juni rot. Fast alle Ursachen lagen in den Testwerkzeugen und der Konfiguration der CI, nicht im Produkt. Die Ausnahme: Unter dem eingebauten Server von PHP 8.3 konnte die Website ihre Basisadresse falsch berechnen und Stylesheets und Skripte umleiten; sie leitet sie jetzt nur noch aus einem
SCRIPT_NAMEab, das aufindex.phpendet. Eine Testsuite, die nicht laufen kann, schlägt jetzt fehl, statt sich still zu überspringen, und die meisten Jobs der CI haben eine Zeitgrenze. -
Das Logo des Installers wurde bei einer neuen Installation nicht angezeigt (2026-09-21): Der Pfad war relativ zum Ordner
install/, den der Server nicht unter dieser Adresse ausliefert. Das Bild ist jetzt in die Seite eingebettet. -
Komponenten, die sich seit dem Wechsel zu Bootstrap 5 nicht mehr öffneten (2026-09-21). Bootstrap 5 hat all seinen Datenattributen das Präfix
bs-gegeben. Ein unter dem alten Namen gebliebenes Attribut verursacht keinen Fehler: Die Komponente tut einfach nichts. Diese hier waren still tot:Was nicht mehr funktionierte Wo Das Akkordeon der FAQ öffnete sich nicht modules/faqDie Teilnehmerliste eines Ereignisses klappte nicht auf modules/eventsDie Hilfe-Popovers eines Teils der Formulare waren leer Kern — neofrag/libraries/form.phpDas Popover des Forenprofils, das zum Löschen eines Navigationslinks modules/forum,widgets/navigationDie Platzierung der Tooltips im Live-Editor, die Verzögerung des Karussells modules/live_editor,widgets/slider -
Kaputte Layouts, auch stille (2026-09-21). Bootstrap 5 hat seine richtungsabhängigen Hilfsklassen umbenannt; eine umbenannte Klasse ist nirgends mehr definiert, und das Element behält sein Standardlayout, ohne dass etwas darauf hinweist.
- Die Fußzeilen von Panels und Modalfenstern richteten sich nicht rechts aus. Der Kern baute die Klasse durch
Verkettung (
'float-'.$align), also konnte keine Suche nachfloat-rightsie finden. Die einzige Kompatibilitätsbrücke des Produkts deckte nur die Tabellen des Verwaltungs-Themes ab: nichts für die öffentlichen Themes. Dieselbe Ursache bei der Ausrichtung der Tabellenzellen, in beiden Bibliotheken. - Kein abgelehntes Formularfeld wurde markiert, in keinem Theme. Beide Bibliotheken setzten einen veralteten Namen
—
has-error(Bootstrap 3) undhas-danger(eine Vorabversion von Bootstrap 4) —, den kein ausgeliefertes Stylesheet definiert. Die Meldung erschien zwar, aber nichts zeigte das betroffene Feld an. Sie sind durch eine eigene Markierung ersetzt, einmal definiert. - Die Fußzeile trug
<div class="float-right">: „Betrieben von NeoFrag Reborn“ rutschte auf eine neue Zeile, nach links. Der Wert reicht weit zurück — eine Migration von Alpha 0.2.2 hatte ihn zur Zeit von Bootstrap 4 vonpull-rightinfloat-rightgeändert, und der nächste Schritt wurde nie gemacht. Eine Migration (2026_09_20_bootstrap5_float) korrigiert die bestehenden Websites; das Seed liefert jetztfloat-end. - Und die letzten toten Klassen in den Vorlagen: die Debug-Leiste auf einem Telefon, der Abstand der Ereignislisten, die Beschriftungen des Menü-Editors, die beiden Balken der Abstimmung der Rekrutierung — die in derselben Farbe herauskamen, sodass die Grafik günstige von ungünstigen Meinungen nicht mehr unterschied.
- Die Fußzeilen von Panels und Modalfenstern richteten sich nicht rechts aus. Der Kern baute die Klasse durch
Verkettung (
-
Der Text eines Artikels konnte bei der Anzeige gelöscht werden (2026-09-21). Der Bau des Inhaltsverzeichnisses ersetzte den Text durch das Ergebnis eines Verarbeitungsschritts, der bei einem langen Artikel aufgeben kann: Die Seite antwortete dann normal, mit einem leeren Artikel, und nichts in den Protokollen.
-
Ein oben oder unten auf der Seite platziertes Widget verschwand. Das Theme Nebula bot im Layout-Editor die Plätze „Kopfbereich“ und „Fußzeile“ an, zeigte sie aber nicht an. Das Widget wurde zwar gespeichert, und nichts erschien — ohne Meldung. Die vier anderen öffentlichen Themes waren nicht betroffen.
-
Das Navigations-Widget bot zwei interne Module an (
live_editorundpages), die es hätte verbergen müssen. Derselbe Fehler ließ die Statistiken der Verwaltung ihren Modulnamen verlieren, ohne sichtbare Wirkung, solange nicht zwei Module denselben Statistiknamen verwenden. -
Das Debug-Protokoll wuchs unbegrenzt, wenn es eingeschaltet war. Es ist jetzt begrenzt: über 64 MB fängt es neu an und behält die vorherige Generation.
-
Auf einer englischen Website blieb „No“ auf Französisch („Non“).
-
Fünf Verwaltungsseiten boten keinen Rückweg (2026-09-20): die Detailseite eines Mitglieds, das Audit-Protokoll, das Hinzufügen einer Gruppe, die Sitzungsliste und die Dateien des Monitorings. Der Brotkrumenpfad macht den Modulnamen nur anklickbar, wenn das Modul angibt, eine Verwaltungsstartseite zu haben;
userundmonitoringgaben das Gegenteil an, obwohl sie eine haben. Einmal auf diesen Seiten, musste man über das Seitenmenü oder die Zurück-Schaltfläche des Browsers gehen. -
Suchmaschinen erhielten JSON statt der Sitemap. Im Stammverzeichnis angefragt, ohne Sprachpräfix — der einzige Weg, auf dem ein Robot sie anfragt —, antwortete
/sitemap.xml{"redirect":"/fr/sitemap.xml"}mit dem Statuscode 200, undrobots.txtundhumans.txttaten dasselbe. Die Umleitung, die das Sprachpräfix hinzufügt, antwortete in JSON, wann immer die Adresse auf.txt,.xmloder.jsonendete. Da diese Dateien keine Version pro Sprache haben, gehen sie nicht mehr über diese Umleitung: Sie werden direkt ausgeliefert, mit ihrem tatsächlichen Inhaltstyp. -
/favicon.icoantwortete 404. Browser fragen diese Adresse an, was auch immer die Seite angibt; sie führt jetzt zum in den Einstellungen konfigurierten Favicon, oder zu dem des CMS. -
Das Einschalten der Zwei-Faktor-Authentifizierung stürzte ab. Beim Speichern der Wiederherstellungscodes unterbrach ein Fehler die Seite: Das Konto stand am Ende als „geschützt“ da, ohne einen einzigen Notfallcode. Gefunden durch einen Test, der beim Verschärfen der Typisierung dieser Bibliothek geschrieben wurde; behoben, und der Test bleibt.
-
Eine Grenze „ein einziger Versuch“ blockierte nie. Die Schwelle wurde erst ab dem zweiten Versuch geprüft. Keine Wirkung bei den mitgelieferten Schwellen, aber die Meldegrenze der Moderation, die sich bis auf 1 einstellen lässt, blockierte dann nie. Die Schwelle gilt jetzt ab dem ersten Versuch.
-
Mancher Text blieb in den anderen Sprachen auf Französisch, und das Protokoll füllte sich weiter. Drei Ursachen, alle behoben: Der Titel einer Wiki-Seite, eines Ereignistyps oder einer Spendenkampagne ging durch die Übersetzung, als wäre er Text der Oberfläche (er hat keine Übersetzung: Er ist Inhalt); bereits übersetzter Text ging erneut durch die Übersetzung — „Espace membre“ wurde zu „Member area“, dann wurde „Member area“ als Schlüssel gesucht und bei jeder Anzeige als fehlend gemeldet; und dreißig Zeichenketten der Oberfläche (das Feld „Benutzername oder E-Mail-Adresse“ des Anmeldeformulars, Panel-Titel in der Verwaltung der Spiele und der Rekrutierung, die sozialen Netzwerke des Profils…) hatten in keiner Sprache eine Übersetzung, weil die Prüfung der sechs Sprachen nur die ausdrücklichen Übersetzungsaufrufe betrachtete, nicht die weiter hinten übersetzten Titel von Feldern und Köpfen. Die Prüfung sieht sie jetzt; die dreißig Zeichenketten sind ins Englische, Deutsche, Spanische, Italienische und Portugiesische übersetzt.
-
Google Analytics wartet jetzt auf deine Einwilligung. Wenn eine Analytics-ID konfiguriert ist, lädt das Skript von Google jetzt erst nach einem Klick auf „Alle akzeptieren“ im Cookie-Banner, nie vorher. Außerdem blockierte die Sicherheitsrichtlinie der Website dieses Skript in jedem Fall: Analytics funktionierte nicht, und nichts sagte es. Es funktioniert jetzt, und nur mit der Einwilligung des Besuchers.
-
Drei Funktionen der Verwaltung antworteten seit Juni nicht mehr. Das Sortieren der Tabellen durch Klick auf einen Spaltenkopf, das Umsortieren von Kategorien, Foren und Unterforen per Drag-and-Drop, und die Schaltflächen Offen/Geschlossen der Seiten Wartung und Registrierungen: Ihre Skripte setzten noch jQuery voraus, obwohl es im Juni 2026 aus dem CMS entfernt wurde, und blieben beim Laden der Seite stehen — ohne Meldung, die Schaltflächen blieben einfach reglos. Alle drei sind ohne jQuery neu geschrieben, durch Browser-Tests abgedeckt, und eine automatische Prüfung lehnt jetzt jedes Skript ab, das wieder jQuery aufrufen würde.
-
Eine fehlerhafte Adresse verursachte einen Serverfehler. Eine Anfrage wie
/fr/a:80oder/:80, wie Robots sie schicken, ließ die Berechnung der Endung der Adresse abstürzen und gab dem Besucher einen Fehler 500 zurück. Die Website antwortet jetzt mit einem gewöhnlichen 404. -
Das Kontaktformular schrieb „Von:“ mit der Adresse des Besuchers. Eine Nachricht von seinem Server im Namen von
visiteur@example.orgzu verschicken ist genau das, was die Schutzmechanismen der E-Mail-Anbieter gegen Fälschung (SPF, DMARC) ablehnen: Die Nachricht landete im Spam oder wurde abgelehnt. Der Absender ist jetzt die Kontaktadresse der Website, und die Adresse des Besuchers steht in „Antwort an“, was in der Praxis auf dasselbe hinausläuft. Dieselbe Korrektur für die Antworten auf eine Bewerbung, die mit der persönlichen Adresse des Administrators hinausgehen konnten. -
Der Installer konnte eine ungültige Kontaktadresse speichern. Wurde die Website installiert, indem man über ihre IP-Adresse auf sie zugriff, wurde die Kontaktadresse
noreply@<IP>, die E-Mail-Anbieter ablehnen — und keine E-Mail ging mehr hinaus, ohne sichtbare Fehlermeldung. Die Adresse wird jetzt nur noch aus einem echten Domainnamen abgeleitet. -
Ein leeres Banner erschien auf Seiten, bei denen eine Zone des Layouts leer ist. Im Theme Extend zeigte jede Seite außer der Startseite ein breites farbiges Band, das nichts enthielt, sowie einen leeren Bereich über dem Inhalt.
Die Ursache war nicht das Theme: Eine angegebene Zone ohne Widget gab Leerraum statt gar nichts zurück, sodass die Themes ihren Rahmen um nichts zeichneten. Einmal für alle Themes behoben. Wenn du ein Theme baust, kannst du
if ($zone = $this->output->region('banner'))(oderzone(n)) schreiben: Die Bedingung sagt jetzt die Wahrheit. -
Das Theme Extend zeigte seinen Hinweis „Betrieben von NeoFrag Reborn“ zweimal. Sein mitgeliefertes Layout setzte einen Block in die Fußzeile, der wiederholte, was das Theme bereits selbst schreibt. Bereits installierte Websites werden beim Update automatisch korrigiert; neue werden ihn nie haben.
-
Die Suche nach einem häufigen Wort gab eine Fehlerseite zurück. Eine Suche wie „le“ oder „de“ zeigte ihre Ergebnisse zwar auf dem Bildschirm an, aber der Server antwortete 404 — was Suchmaschinen, Überwachungswerkzeuge und Browser sehen, und was eine völlig gültige Seite wie eine verschwundene aussehen ließ.
Das Hervorheben der gefundenen Wörter setzte voraus, dass das gesuchte Wort zwangsläufig im angezeigten Text vorkam. Das ist doppelt falsch: Die Suche untersucht mehrere Felder und zeigt nur eines an — ein Forenthema mit dem Titel „Salut tout le monde !“ passt auf „le“ über seinen Titel, nicht über die darunter angezeigte Nachricht —, und die Datenbank vergleicht ohne Rücksicht auf Akzente, während der Code sie berücksichtigte: „éléphant“ kam bei der Suche „ele“ zwar heraus, ohne dass darin ein Wort hervorgehoben wurde.
Beide Fälle werden behandelt: Das Hervorheben erkennt jetzt die Varianten eines Buchstabens mit Akzent, wie es die Datenbank tut, und wenn das Wort wirklich nicht im angezeigten Text steht, beginnt der Auszug einfach an seinem Anfang.
-
Die automatischen Updates des Kerns konnten nicht funktionieren — fünf Fehler, jeder für sich allein ausreichend: Die Adresse zum Prüfen neuer Versionen war nirgends festgelegt, also erschien die Schaltfläche nie; ein globaler Schalter, in der Konfiguration zu setzen, blockierte den Vorgang; der Download zeigte auf die Versionen des ursprünglichen NeoFrag, was NeoFrag Reborn überschrieben hätte; das Paket legte seine Dateien in einem Unterordner ab, sodass ein Update nichts ersetzt hätte, ohne den geringsten Fehler; und das Archiv wurde über eine seit PHP 8.0 veraltete PHP-Schnittstelle entpackt.
Der Schalter ist durch vier Garantien ersetzt: Die Quelle der Versionen muss auf einer Positivliste von Adressen stehen (dieselbe wie für den Marketplace); die Versionsdatei gibt nur einen Dateinamen an, nie eine Adresse; die Prüfsumme SHA-256 des Pakets wird geprüft, bevor eine einzige Datei angefasst wird; jede Datei des Archivs wird geprüft (kein Pfad, der aus der Website hinausführt, keine symbolische Verknüpfung). Die Ordner
config/undinstall/werden nie neu geschrieben, wenn sie bereits existieren. -
Der Katalog des Marketplace war von keiner Website aus erreichbar. Der Server, der ihn verteilt, antwortete
{"redirect":"/fr/…"}mit dem Statuscode 200 statt der statischen Datei — ein als JSON völlig gültiger Inhalt, und völlig falsch, also ein stiller Fehlschlag, der jede Website auf ihren lokalen Katalog zurückfallen ließ. Die Ursache war die Konfiguration dieses Servers, inzwischen behoben: Auf den Websites ist nichts zu tun. Im Code prüft das Update des Kerns jetzt die Form seiner Manifeste, nicht mehr nur, ob sie sich als JSON lesen lassen. -
Die Schaltfläche „Löschen“ eines Themes in „Themes & Addons“ schützte nur das Theme der Verwaltung, bei seinem fest eingetragenen Namen. Sie folgt jetzt der Angabe des Themes und schützt daher auch Nebula.
-
Kopplungen vom Kern zu optionalen Modulen. Sieben Module fragten die Tabellen optionaler Module ab: fünf des Kerns (
admin,moderation,settings,statistics,user), dazugamesundteams. Zwei Abfragen waren ungeschützt: Inteamsstand die Existenzprüfung fürrecruitsnach der Abfrage, die sie schützen sollte, und ingamesfragte das Löschen eines Spiels die Tabelle der Teams ab, ohne zu prüfen, ob sie existiert. Die anderen waren geschützt, aber stumm: Sie tragen jetzt eine von der CI geprüfte Annotation. Der einzige harte Zyklus des Pakets (games↔teams) ist aufgebrochen. -
Live-Editor: Änderungen erscheinen, ohne die Seite neu zu laden. Das Löschen eines Widgets ließ es auf dem Bildschirm, und das Hinzufügen einer Reihe zeigte sie erst nach dem Neuladen der Seite, obwohl der Server die Änderung gespeichert hatte. Das Skript erwartete ein anderes Antwortformat als das, das der Server schickt; der Fehler stammte von der Entfernung von jQuery.
-
Live-Editor: Das Verschieben von Widgets per Drag-and-Drop funktioniert wieder. Mit eingeschaltetem Spaltenmodus blieb ein hinzugefügtes Widget am unteren Ende seiner Spalte hängen und ließ sich nicht über den Inhalt der Seite verschieben. Reihen und Spalten waren nicht betroffen.
-
Live-Editor: Widgets ohne Einstellungen lassen sich wieder hinzufügen. Zehn Widgets ohne Einstellungsbildschirm (
breadcrumb,copyright,downloads,forum,module,news,newsletter,slider,surveys,teams) ließen sich nicht hinzufügen: Das Hinzufügen schlug mit einem Fehler 404 ohne nützliche Meldung fehl. -
Ein Serverfehler wird nicht mehr als Inhalt angezeigt. Wenn eine ohne Neuladen der Seite ausgeführte Aktion vom Server einen Fehler erhielt (zum Beispiel eine 404-Seite), fügten manche Bildschirme diese Fehlerseite in die Oberfläche ein. Der Fehler wird jetzt als Fehlschlag behandelt.
-
Live-Editor: Das Einstellungsformular entspricht immer dem gewählten Widget. Bei schnellem Wechsel von Widget oder Typ konnte die langsamste Antwort das Formular eines anderen Widgets anzeigen. Die veraltete Anfrage wird jetzt abgebrochen, und das Formular wird nicht mehr neu geladen (und die laufende Eingabe geht nicht verloren), wenn sich die Auswahl nicht geändert hat.
-
Der Port der Datenbank wird jetzt berücksichtigt. Das CMS verband sich immer auf Port 3306, welcher Port auch immer im Installationsassistenten eingegeben wurde: Es ließ sich auf einem MySQL- oder MariaDB-Server, der anderswo lauscht, weder installieren noch betreiben. Der Port wird jetzt in
config/db.phpgespeichert (nur wenn er von 3306 abweicht) und für jede Verbindung verwendet. -
Ein aktiviertes Theme ist nicht mehr leer. Das Aktivieren von Forge, Granite, Blockcraft oder Extend wechselte das Theme, ohne sein Standardlayout anzuwenden, das nur über die Schaltfläche „Standard wiederherstellen“ angewendet wurde: Die Website zeigte überhaupt keine Widgets. Die Aktivierung wendet jetzt das Standardlayout des Themes an, wenn es noch keines hat, und überschreibt nie ein angepasstes Layout.
-
Das Ändern des Standard-Themes gilt jetzt auch für Besucher, die eines gewählt hatten. Die Theme-Auswahl der Fußzeile merkte sich die Wahl eines Besuchers ein Jahr lang, und diese Wahl hatte Vorrang vor dem Standard-Theme: Wenn der Administrator das Theme wechselte, blieben die Besucher, und auch der Administrator, auf dem alten, ohne Ausweg aus einem Theme ohne Auswahl. Eine vor dem letzten Wechsel des Standard-Themes getroffene Wahl wird jetzt vergessen; eine danach getroffene wird weiterhin respektiert.
-
Der Browser behält keine veralteten Kopien der Seiten mehr. Ohne jede Anweisung konnte er eine alte Version einer Seite erneut anzeigen: Ein Theme-Wechsel zum Beispiel erschien erst nach einem erzwungenen Neuladen (Strg+F5). Die Seiten und Antworten der Website verbieten jetzt dieses Zwischenspeichern (
Cache-Control: no-store); Bilder, Stile und Skripte, die direkt vom Webserver ausgeliefert werden, sind nicht betroffen.
Sicherheit
-
Ein gespeicherter Wert kann keine Tags mehr in ein Formular einschleusen (2026-09-23). Das Bearbeitungsformular setzte den Wert eines Felds in die Seite, indem es die Anführungszeichen maskierte, wie es eine PHP-Zeichenkette tun würde — was in HTML keine Wirkung hat. Ein Wert, der nicht durch das Formular selbst gegangen war (Import, Demodaten, ein anderes Modul), konnte daher aus seinem Feld ausbrechen und dem Verwaltungsbildschirm Code hinzufügen: Ein Zitat, dessen Quelle
"><img src=x>war, bewies es. Textfelder, Textbereiche, Listen, Kontrollkästchen und Optionsknöpfe kodieren jetzt ihren Wert; die Darstellung eines normal eingegebenen Werts ändert sich nicht. Die Benachrichtigungen („Zitat geändert“ usw.) werden außerdem in einer Form an das Skript der Seite übergeben, die es nicht mehr brechen kann. -
Die Sicherheitsrichtlinie gibt eine Regel für Medien an (
media-src). Sie hatte keine und fiel auf die allgemeine Regel zurück (default-src 'self'). Sie erlaubt jetzt Medien der Website selbst und in die Seite eingebettete Medien ('self' data:); die Adresse des Streams eines Webradios wird nur hinzugefügt, wenn ein Stream konfiguriert ist: Eine Website ohne Webradio erlaubt keine zusätzliche fremde Herkunft. -
Elf Sicherheitshinweise zu Abhängigkeiten geschlossen (2026-09-20):
league/commonmarkgeht von 2.8.2 auf 2.10.1 (zehn Hinweise, acht davon schwerwiegend) undphpseclibvon 3.0.52 auf 3.0.57 (ein Hinweis mittleren Schweregrads).Neun der zehn Hinweise zu commonmark sind Denials of Service über präpariertes Markdown — Verarbeitung in quadratischer Zeit, Überschriften mit kollidierenden Ankern, doppelte Fußnoten, benachbarte Attributblöcke, tief verschachtelte XML-Ausgabe —, und der zehnte ist eine XSS-Lücke: Der Filter für die Attribute
on*ließ sich mit einem Seitenvorschub U+000C umgehen. Die Bibliothek stellt das Markdown des Wikis, der Artikel und der FAQ dar, von Mitgliedern geschrieben. Mehrere dieser Hinweise zielen auf Erweiterungen, die das Produkt nicht einschaltet (Fußnoten, Attribute, Überschriften-Anker, XML-Ausgabe); das Update schließt sie alle.Die Darstellung ändert sich nicht, und das ist nicht nur ein Eindruck: zwölf repräsentative Fälle — Überschriften, Tabelle, Aufgabenliste, Codeblock, eingeschleustes HTML, Link
javascript:, Zitatblock, durchgestrichener Text, automatischer Link, verschachtelte Listen, Bild, Entitäten und Fußnote, tiefe Verschachtelung —, von beiden Versionen mit der tatsächlichen Konfiguration des Produkts dargestellt, ergeben dasselbe HTML Byte für Byte (1.568 Byte, derselbe Hash).Hinweis: Composer weigert sich jetzt, 2.8.2 zu installieren, genau wegen dieser zehn Hinweise. Die Richtlinie musste in einem Wegwerfordner abgeschaltet werden, um den Vergleich durchzuführen.