Kopfdaten und Grenzen
- Release
- 7.0.11 → 7.0.12
- Commits
- 36
- Geänderte Dateien
- 170
- Analyse
- 2026-09-01
- Schwerpunkt
- Barrierefreiheit und Sicherheit
Nicht untersucht
Verglichen wurden die Tags 7.0.11+260821 vom 20. August 2026 und 7.0.12+260833 vom 31. August 2026 mit git log --oneline und git diff --stat. Nicht ausgewertet wurden die Übersetzungsdateien unter locale/, die Inhalte des Verzeichnisses vendor/ über die Versionszeilen der Sperrdatei hinaus sowie die minifizierten Build-Artefakte unter assets/packages/; Aussagen darüber, ob die ausgelieferten Build-Stände deckungsgleich mit den geänderten Quelldateien sind, bleiben deshalb offen. Indirekte Effekte über transitive Drittabhängigkeiten sind durch reine Diff-Analyse nicht vollständig erfassbar, weil die Sperrdatei nur die unmittelbar gebundenen Stände nennt. Die Kurzliste musste einen Eintrag geringerer Relevanz auslassen: die Umstellung der Gruppen- und Fragenkennungen auf Ganzzahlen in der JSON-Antwort des Fragenbaums.
Executive Summary
7.0.12 ist ein Wartungsrelease mit zwei klar erkennbaren Schwerpunkten: fünfzehn der sechsunddreißig Commits arbeiten an der Barrierefreiheit von Administrationsoberfläche und Umfragefrontend, vier weitere schließen Sicherheitslücken im Administrationsbereich. Die Änderungen an der Barrierefreiheit sind keine reinen Attributergänzungen, sondern greifen in die ausgelieferte DOM-Struktur ein: Tabellen werden zu Elementbäumen aus div, Antwortzeilen zu Listenelementen, Überschriftenebenen verschieben sich. Die eine Sache, die am ehesten unbemerkt kaputtgeht, ist die Gruppenüberschrift im Standardtheme: sie hängt jetzt von einer Variablen ab, die eine andere Vorlage setzt, und verschwindet ersatzlos, wenn ein abgeleitetes Theme nur eine der beiden Vorlagen überschreibt. Die zweite stille Wirkung betrifft Erweiterungen, die sich darauf verlassen haben, dass CKEditor auf jeder Administrationsseite global verfügbar ist. Datenbankseitig verändert das Release nichts.
- CKEditor wird nur noch auf Editorseiten registriert
- Gruppenüberschrift im Standardtheme hängt an einer neuen Vorlagenvariablen
- Umfragemenü-Einträge mit Berechtigungsprüfung und Ausgabekodierung
- Pflichtfragen tragen einen sichtbaren Hinweistext
- Assessment-Ausgabe nicht mehr als Tabelle
- Gespeichertes XSS im Dialog für Platzhalterfelder
- Quota-Nachricht wird vor dem Speichern validiert
- Themes der vorherigen Hauptversion werden nicht mehr deinstalliert
Upgrade-Empfehlung
🧪 Vorher testen
Die vier Sicherheitskorrekturen sprechen für ein zügiges Update, und das Release enthält keine Datenbankmigration mit Strukturwirkung. Die Änderungen an der ausgelieferten DOM-Struktur von Umfrage- und Administrationsansichten sind jedoch umfangreich genug, dass eigene Themes und eigenes Administrations-JavaScript vorher in einer Testumgebung geprüft werden sollten.
Lesepfad
| Zielgruppe | Relevante Kennungen und Kapitel |
|---|---|
| Administratoren | A1, A3, A4, A6, A7, A8, Weitere relevante Änderungen, Empfehlung |
| Plugin-Entwickler | A1, A3, A7, Weitere relevante Änderungen, Empfehlung |
| Theme-Entwickler | A1, A2, A4, A5, A8, Weitere relevante Änderungen, Empfehlung |
| Integratoren | A2, A5, Weitere relevante Änderungen, Empfehlung |
| API-Nutzer | keine Kennung, Nicht betroffene Bereiche, Empfehlung |
Die wichtigsten Änderungen
A1: CKEditor wird nur noch auf Editorseiten registriert
Hintergrund — Bis 7.0.11 registrierte AdminTheme die Pakete ckeditor, ckeditoradditions und modaleditor pauschal für jede Seite des Administrationsbereichs. Der Editor und seine Zusatzskripte wurden damit auch auf Seiten geladen, die gar kein Eingabefeld mit Editor enthalten. Die Registrierung wandert nun in die Teilansicht, die den Editor tatsächlich vorbereitet, und beide Editorpakete werden in der Paketdefinition zusätzlich auf eine feste Ladeposition gesetzt. Weil CKEditor unter PJAX asynchron nachgeladen wird, kapselt die Teilansicht die zuvor unbedingt ausgeführten Ereignisregistrierungen in eine Funktion und ruft sie entweder sofort oder beim Ereignis pjax:scriptcomplete auf.
Konsequenz — Administrationsseiten ohne Editorfeld laden spürbar weniger JavaScript. Erweiterungen und eigene Administrationsansichten, die bisher davon ausgingen, dass das globale Objekt CKEDITOR auf jeder Administrationsseite vorhanden ist, finden es dort nicht mehr vor: der Editor erscheint nicht, und im Browser bleibt ein Referenzfehler zurück. Betroffen sind ausschließlich eigene Seiten und Plugin-Ausgaben, die den Editor nicht über die Kernvorbereitung einbinden; wer die Teilansicht zur Editorvorbereitung oder die Modal-Editor-Hilfsfunktionen verwendet, erhält die Pakete weiterhin. Die zeitliche Verschiebung der Ereignisregistrierung wirkt nur dort, wo Seiten per PJAX nachgeladen werden — bei einem vollständigen Seitenaufruf verhält sich der Editor wie zuvor.
Vorher / Nachher
// Vorher (application/models/AdminTheme.php)
App()->getClientScript()->registerPackage('ckeditor'); //
App()->getClientScript()->registerPackage('ckeditoradditions'); // CKEDITOR in a global scope
App()->getClientScript()->registerPackage('modaleditor');
// Nachher
// CKEditor (and the modaleditor, which depends on it) is only registered on pages
// that actually use an editor, via PrepareEditorScript(). See bug #19391.
// Neu (application/views/admin/survey/prepareEditorScript_view.php)
Yii::app()->getClientScript()->registerPackage('ckeditor');
Yii::app()->getClientScript()->registerPackage('ckeditoradditions'); // CKEDITOR in a global scope
Yii::app()->getClientScript()->registerPackage('modaleditor');
Konfiguration — Die Paketdefinition in application/config/packages.php wird mit dem Release ausgeliefert und muss nicht von Hand angepasst werden; sie ergänzt für beide Editorpakete einen Positionsschlüssel.
// Neu (application/config/packages.php)
'ckeditor' => [
'devBaseUrl' => 'assets/packages/ckeditor',
'basePath' => 'core.ckeditor',
'position' => CClientScript::POS_BEGIN,
Wird diese Datei durch eine eigene Fassung ohne den neuen Schlüssel ersetzt, greift wieder die Standardposition von Yii für Paketskripte; welche Position das im Einzelfall ist, geht aus dem Diff nicht hervor und ist damit nicht bestimmbar.
Neuer Bezugswert — Wer den Editor auf einer eigenen Seite benötigt, registriert die Pakete künftig selbst über den oben zitierten Aufruf von registerPackage, so wie es die neue Teilansicht vormacht. Ob darüber hinaus ein eigener Einstiegspunkt für Erweiterungen vorgesehen ist, ist aus dem Diff nicht ersichtlich und bleibt offen.
Nach dem Update testen — Eine Administrationsseite ohne Editorfeld öffnen und in den Entwicklerwerkzeugen prüfen, dass ckeditor.js nicht mehr angefordert wird. Anschließend Fragetext, Quota-Nachricht und Label-Set-Titel bearbeiten und dabei den Modal-Editor öffnen. Zuletzt jede eigene Administrationsansicht aufrufen, die einen Editor einbindet, und die Browserkonsole auf Referenzfehler zu CKEDITOR prüfen.
Betroffene Dateien — application/models/AdminTheme.php, application/views/admin/survey/prepareEditorScript_view.php, application/config/packages.php
Relevante Commits — 336cd61124
A2: Gruppenüberschrift im Standardtheme hängt an einer neuen Vorlagenvariablen
Hintergrund — Im Theme fruity_twentythree entschied group_name.twig bisher allein anhand von aGroup.showgroupinfo und dem Umfrageformat, ob und mit welcher Ebene die Gruppenüberschrift ausgegeben wird; bei nicht-tabellarischem Format war das ein h1. Diese Entscheidung wandert nun nach group_container.twig, das den aufbereiteten Gruppennamen und ein Wahrheitsflag in die Variablen sGroupName und bShowGroupTitle legt. group_name.twig gibt nur noch aus, wenn das Flag gesetzt ist, und verwendet dabei durchgehend h2. Ergänzend leitet question_text_container.twig die ARIA-Ebene der Fragenüberschrift aus demselben Flag ab: mit Gruppenüberschrift Ebene drei, ohne Gruppenüberschrift Ebene zwei.
Konsequenz — Auf ausgelieferten Themes ändert sich die Überschriftenstruktur der Umfrageseite: die Gruppenüberschrift ist nicht mehr h1, und Gruppen mit leerem oder nur aus Markup bestehendem Namen erzeugen gar keine Überschrift mehr. Wer ein Theme von fruity_twentythree ableitet und darin nur group_name.twig oder nur group_container.twig überschreibt, bekommt keinen Fehler: die Abfrage auf das definierte Flag ist dann falsch, und die Gruppenüberschrift verschwindet stillschweigend aus allen Umfragen dieses Themes. Ebenso fällt die Ebenenlogik der Fragenüberschrift auf den festen Wert zwei zurück, wenn der eigene Container die Variable nicht setzt. Das Theme vanilla ist von dieser Umstellung nicht berührt — dort gibt group_name.twig weiterhin einen div mit Überschriftenklasse aus.
Vorher / Nachher
{# Vorher (themes/survey/fruity_twentythree/views/subviews/survey/group_subviews/group_name.twig) #}
{% if aGroup.showgroupinfo == 'N' or aGroup.showgroupinfo == 'B' %}
{% if aSurveyInfo.format != 'A' %}
<h1 class="{{ aSurveyInfo.class.grouptitle }}" {{ aSurveyInfo.attr.grouptitle }}>
{{ processString(aGroup.name) }}
</h1>
{% else %}
...
{% endif %}
{% endif %}
{# Nachher #}
{% if bShowGroupTitle is defined and bShowGroupTitle %}
<h2 class="{{ aSurveyInfo.class.grouptitle }}" {{ aSurveyInfo.attr.grouptitle }}>
{{ sGroupName }}
</h2>
{% endif %}
{# Neu (themes/survey/fruity_twentythree/views/subviews/survey/group_subviews/group_container.twig) #}
{% set sGroupName = processString(aGroup.name) %}
{% set bShowGroupTitle = (aGroup.showgroupinfo == 'N' or aGroup.showgroupinfo == 'B')
and sGroupName|striptags|replace({' ': ' '})|trim != '' %}
Nach dem Update testen — Eine Umfrage mit gesetztem Gruppennamen in jedem eigenen Theme aufrufen und prüfen, dass die Überschrift erscheint. Danach eine Gruppe mit leerem Namen anlegen und bestätigen, dass keine leere Überschrift ausgegeben wird. Zuletzt im erzeugten HTML prüfen, ob das Attribut aria-level der Fragenüberschrift den Wert drei trägt, sobald eine Gruppenüberschrift sichtbar ist.
Betroffene Dateien — themes/survey/fruity_twentythree/views/subviews/survey/group_subviews/group_name.twig, themes/survey/fruity_twentythree/views/subviews/survey/group_subviews/group_container.twig, themes/survey/fruity_twentythree/views/subviews/survey/question_subviews/question_text_container.twig
Relevante Commits — 0ca9477ba0
A3: Umfragemenü-Einträge mit Berechtigungsprüfung und Ausgabekodierung
Hintergrund — Die Aktion zum Anlegen eines Umfragemenü-Eintrags prüfte bisher keine Berechtigung. Sie erhält nun eine Eingangsprüfung auf die globale Berechtigung für Einstellungen und auf den Demomodus sowie eine zusätzliche Prüfung für die beiden Kernmenüs mit den Kennungen eins und zwei, die nur noch Superadministratoren bearbeiten dürfen; dieselbe Prüfung greift in der Speicheraktion. Unabhängig davon wurde das Feld data in der Übersichtsliste bisher als roher Zeichenkettenausdruck zusammengesetzt und ungefiltert in ein title-Attribut geschrieben. Es wird jetzt über CHtml::tag erzeugt, das die Attributwerte kodiert. Ergänzend gibt die überschriebene Methode save des Modells das Ergebnis des Elternaufrufs zurück, statt es zu verwerfen.
Konsequenz — Ein Konto ohne die globale Einstellungsberechtigung wird beim Aufruf der Anlegemaske mit einer Fehlermeldung auf die Administrationsstartseite umgeleitet. Wer zuvor Umfragemenü-Einträge ohne diese Berechtigung anlegen konnte, kann es nicht mehr; das ist die beabsichtigte Wirkung, fällt aber in Installationen mit fein aufgeteilten Rollen als Funktionsverlust auf. Im Demomodus ist die Aktion vollständig gesperrt. Ein zuvor eingeschleustes Skript im Feld data wird in der Übersicht nicht mehr ausgeführt, weil der Wert kodiert im Attribut landet — bereits gespeicherte Werte bleiben jedoch unverändert in der Datenbank und sollten gesichtet werden. Plugins, die die Speichermethode des Modells aufrufen und deren Ergebnis auswerten, erhalten jetzt einen belastbaren Wahrheitswert statt null.
Vorher / Nachher
// Vorher (application/models/SurveymenuEntries.php)
'value' => '$data->data ? "<i class=\'ri-information-fill bigIcons\' title=\'".$data->data."\'></i>"
: ( $data->getdatamethod ? gT("GET data method:")."<br/>".CHtml::encode($data->getdatamethod) : "")',
// Nachher
'value' => '$data->data ? CHtml::tag("i", array("class" => "ri-information-fill bigIcons", "title" => $data->data), "")
: ( $data->getdatamethod ? gT("GET data method:")."<br/>".CHtml::encode($data->getdatamethod) : "")',
// Neu (application/controllers/admin/SurveymenuEntryController.php)
if (!Permission::model()->hasGlobalPermission('settings', 'update') || Yii::app()->getConfig('demoMode')) {
Yii::app()->user->setFlash('error', gT("Access denied!"));
$this->getController()->redirect(Yii::app()->createUrl('/admin'));
}
Nach dem Update testen — Mit einem Konto ohne globale Einstellungsberechtigung die Anlegemaske für Umfragemenü-Einträge aufrufen und die Umleitung bestätigen. Mit einem Administrator ohne Superadministratorrechte versuchen, einen Eintrag für das Kernmenü mit der Kennung eins zu speichern. Anschließend die Übersichtsliste der Menü-Einträge öffnen und im Seitenquelltext prüfen, dass der Inhalt des Feldes data kodiert im title-Attribut steht.
Betroffene Dateien — application/controllers/admin/SurveymenuEntryController.php, application/models/SurveymenuEntries.php
Relevante Commits — 8facffc7b1, d589fe0a6a
CVE / Advisory — Eine CVE-Kennung oder ein Advisory-Link ist im Repository nicht auffindbar; beide Commits tragen in ihrer Nachricht und in docs/release_notes.txt ausdrücklich das Präfix [security].
A4: Pflichtfragen tragen einen sichtbaren Hinweistext
Hintergrund — Die Pflichtfeldmarkierung bestand aus einem Sternchensymbol und einem nur für Screenreader sichtbaren Text beziehungsweise einem title-Attribut. Beides trägt die Information ausschließlich über ein Symbol. Die Vorlage asterisk.twig gibt in beiden ausgelieferten Umfragethemes nun zusätzlich einen sichtbaren Hinweistext aus, markiert das Symbol mit aria-hidden und verzichtet im Theme vanilla auf die Klasse float-start. Zur selben Umstellung gehören Anpassungen an den Überschriftenebenen und an der Werkzeugleiste der Themeeditor-Vorschau.
Konsequenz — In jeder Umfrage erscheint neben dem Sternchen sichtbar das Wort für „erforderlich", übersetzt in der jeweiligen Umfragesprache. Das verändert Breite und Zeilenumbruch der Fragenkopfzeile und kann in engen Layouts zu einem zusätzlichen Umbruch führen. Eigenes CSS, das die Klasse asterisk bisher über die Bootstrap-Float-Klasse positioniert hat, findet diese im Theme vanilla nicht mehr vor. Im Theme fruity_twentythree kommt der neue Text in einem span mit der Klasse ls-question-mandatory daher, für das in bestehenden Themes noch keine eigenen Regeln existieren dürften. Die Wirkung tritt in jeder Umfrage mit mindestens einer Pflichtfrage auf, unabhängig von Fragetyp und Umfrageformat.
Vorher / Nachher
{# Vorher (themes/survey/vanilla/views/subviews/survey/question_subviews/asterisk.twig) #}
<!-- Add a visual information + just Mandatory string for aria : can be improved -->
<div class="asterisk float-start">
<sup class="text-danger fa fa-asterisk small" aria-hidden='true'></sup>
<span class="visually-hidden text-danger">{{ gT("(This question is mandatory)") }}</span>
</div>
{# Nachher #}
<!-- The asterisk alone would convey "mandatory" by symbol only, so the word is shown too -->
<div class="asterisk">
<sup class="text-danger fa fa-asterisk small" aria-hidden='true'></sup>
<span class="text-danger small">{{ gT("Required") }}</span>
</div>
Nach dem Update testen — Eine Umfrage mit Pflichtfragen in jedem verwendeten Theme und in jeder Umfragesprache aufrufen und prüfen, ob der Hinweistext lesbar steht und das Layout hält. Zusätzlich eine Frage mit langem Fragetext auf schmalem Viewport prüfen. Zuletzt die Vorschau im Themeeditor öffnen und die Darstellung dort abgleichen.
Betroffene Dateien — themes/survey/vanilla/views/subviews/survey/question_subviews/asterisk.twig, themes/survey/fruity_twentythree/views/subviews/survey/question_subviews/asterisk.twig, application/views/admin/themes/templateeditor_preview.php
Relevante Commits — aeae04dfa5
A5: Assessment-Ausgabe nicht mehr als Tabelle
Hintergrund — Die Auswertungsanzeige am Ende einer Umfrage war als verschachtelte Tabelle aufgebaut, obwohl sie keine tabellarischen Daten enthält. Sie wird in beiden ausgelieferten Umfragethemes vollständig auf Elemente vom Typ div umgestellt und erhält stattdessen role="region" mit aria-labelledby sowie eine Überschrift über role="heading" und aria-level="2". Die Bootstrap-Klasse table entfällt und wird durch Rahmen- und Abstandsklassen ersetzt. Zum selben Commit gehören Anpassungen an den Ansichten für Speichern, Laden, Zurücksetzen, Absenden und Registrierung.
Konsequenz — Wer eigenes CSS oder eigenes JavaScript auf die bisherige Tabellenstruktur der Auswertungsanzeige gestützt hat, verliert dessen Wirkung, ohne dass ein Fehler entsteht: Selektoren auf table, th oder td innerhalb der Auswertung greifen ins Leere, und die Anzeige erscheint unformatiert statt fehlend. Dasselbe gilt für Integrationen, die die abgeschlossene Umfrageseite auslesen und die Auswertung über Tabellenzellen adressieren. Die konfigurierbaren Klassennamen aus aSurveyInfo.class bleiben erhalten und werden weiterhin auf die äußeren Elemente gesetzt, sodass Anpassungen über diesen Weg wirksam bleiben. Die zusätzlichen Attribute aus aSurveyInfo.attr werden ebenfalls unverändert weitergereicht.
Vorher / Nachher
{# Vorher (themes/survey/vanilla/views/subviews/messages/assessments.twig) #}
<table class="{{ aSurveyInfo.class.assessmenttable }} table" {{ aSurveyInfo.attr.assessmenttable }}>
<!-- Heading -->
<tr>
<td class="{{ aSurveyInfo.class.assessmentheading }} border-bottom-0 border-top" {{ aSurveyInfo.attr.assessmentheading }}>
{{ gT("Your assessment") }}
</td>
</tr>
{# Nachher #}
<div class="{{ aSurveyInfo.class.assessmenttable }} border" {{ aSurveyInfo.attr.assessmenttable }} role="region" aria-labelledby="ls-assessment-heading">
<!-- Heading -->
<div class="{{ aSurveyInfo.class.assessmentheading }} border-bottom-0 border-top p-2" {{ aSurveyInfo.attr.assessmentheading }} id="ls-assessment-heading" role="heading" aria-level="2">
{{ gT("Your assessment") }}
</div>
Nach dem Update testen — Eine Umfrage mit aktivierter Auswertung bis zum Ende ausfüllen und die Anzeige in jedem eigenen Theme mit Gruppen- und Gesamtauswertung prüfen. Danach das erzeugte HTML gegen eigene Selektoren abgleichen, insbesondere gegen Regeln, die auf Tabellenelemente innerhalb der Auswertung zielen. Zusätzlich die Ansichten für Speichern, Laden und Registrierung aufrufen und deren Überschriften kontrollieren.
Betroffene Dateien — themes/survey/vanilla/views/subviews/messages/assessments.twig, themes/survey/fruity_twentythree/views/subviews/messages/assessments.twig, themes/survey/vanilla/views/subviews/registration/register_message.twig
Relevante Commits — 1e8989defe
A6: Gespeichertes XSS im Dialog für Platzhalterfelder
Hintergrund — Der Dialog, mit dem im Editor ein Platzhalterfeld eingefügt wird, baut zwei Auswahllisten auf: eine mit den Standardfeldern, eine mit den Fragen der Umfrage. Beide Listen schrieben Wert, Titel und sichtbaren Text der option-Elemente ungefiltert in die Ausgabe. Fragetitel stammen aus dem Umfrageinhalt und lassen sich von jedem Konto mit Bearbeitungsrecht an der Umfrage setzen. Alle sechs Ausgabestellen werden nun durch htmlspecialchars mit ENT_QUOTES und dem Zeichensatz UTF-8 geführt.
Konsequenz — Ein Fragetitel mit HTML- oder Skriptanteilen kann den Dialog nicht mehr verlassen und wird als Text angezeigt. Da die einfachen Anführungszeichen der Vorlage über ENT_QUOTES mit abgedeckt sind, lässt sich das Attribut nicht mehr durch ein eingebettetes Anführungszeichen verlassen. Fragetitel, die legitim Sonderzeichen wie das kaufmännische Und, spitze Klammern oder Anführungszeichen enthalten, erscheinen im Dialog künftig als Klartext statt interpretiert; das ist die beabsichtigte Wirkung. Bereits in der Datenbank gespeicherte Fragetitel werden durch das Update nicht verändert, sondern nur bei der Ausgabe entschärft.
Vorher / Nachher
// Vorher (application/views/limereplacementfields/limeReplacementFields_view.php)
<option value='<?php echo $cqn[6];?>' title='<?php echo $cqn[0];?>' <?php echo $isDisabled;?>><?php echo $cqn[0];?></option>
// Nachher
<option value='<?php echo htmlspecialchars($cqn[6], ENT_QUOTES, 'UTF-8');?>' title='<?php echo htmlspecialchars($cqn[0], ENT_QUOTES, 'UTF-8');?>' <?php echo $isDisabled;?>><?php echo htmlspecialchars($cqn[0], ENT_QUOTES, 'UTF-8');?></option>
Nach dem Update testen — Eine Frage mit einem Titel anlegen, der spitze Klammern und einfache Anführungszeichen enthält, danach im Editor einer anderen Frage derselben Umfrage den Dialog für Platzhalterfelder öffnen und prüfen, dass der Titel als Text erscheint. Zusätzlich einen Fragetitel mit einem kaufmännischen Und prüfen, um die korrekte Anzeige legitimer Sonderzeichen zu bestätigen.
Betroffene Dateien — application/views/limereplacementfields/limeReplacementFields_view.php
Relevante Commits — 1772a68915
CVE / Advisory — Eine CVE-Kennung oder ein Advisory-Link ist im Repository nicht auffindbar; der Commit trägt in seiner Nachricht und in docs/release_notes.txt das Präfix [security].
A7: Quota-Nachricht wird vor dem Speichern validiert
Hintergrund — Beim Anlegen einer Quota wurden die sprachabhängigen Einstellungen unter ausdrücklicher Abschaltung der Validierung gespeichert. Erst danach rief der Dienst die Validierung auf und trug etwaige Fehler nach — zu einem Zeitpunkt, an dem der Datensatz bereits in der Datenbank stand. Damit lief auch die im Modell hinterlegte Filterung der Quota-Nachricht ins Leere. Beide Aufrufe werden zu einem einzigen Speichervorgang mit aktiver Validierung zusammengezogen. Ein neuer Test in der Testsuite legt eine Quota mit einem img-Element samt onerror-Attribut an und prüft, dass beides nach dem Speichern nicht mehr in der Nachricht enthalten ist.
Konsequenz — Skriptanteile in einer Quota-Nachricht werden nicht mehr unverändert gespeichert und damit später auch nicht mehr an Teilnehmende ausgeliefert. Der zugehörige Test benennt die Bedingungen, unter denen der Filter überhaupt greift: die Einstellung filterxsshtml muss aktiv sein, filterxsshtml_forcedall abgeschaltet, und das speichernde Konto darf kein Superadministrator sein. Für eine Installation mit abgeschalteter XSS-Filterung oder für Nachrichten, die ein Superadministrator speichert, greift die Filterung damit nicht — dort bleibt die Nachricht so erhalten, wie sie eingegeben wurde. Unabhängig davon ändert sich das Speicherverhalten für alle Konstellationen: eine sprachabhängige Quota-Einstellung, die die Modellvalidierung nicht besteht, wird nun gar nicht mehr geschrieben, statt geschrieben und nachträglich als fehlerhaft markiert zu werden. Wer Quotas über den Dienst aus eigenem Code anlegt, muss deshalb die Fehlerliste der Quota auswerten, um zu erkennen, dass eine Sprachfassung fehlt.
Vorher / Nachher
// Vorher (application/models/services/Quotas.php)
$oQuotaLanguageSetting->save(false);
if (!$oQuotaLanguageSetting->validate()) {
$oQuota->addErrors($oQuotaLanguageSetting->getErrors());
}
// Nachher
if (!$oQuotaLanguageSetting->save()) {
$oQuota->addErrors($oQuotaLanguageSetting->getErrors());
}
// Neu (tests/unit/models/QuotasServiceTest.php)
// Log in as the non-superadmin and enable XSS filtering.
\Yii::app()->session['loginID'] = $regularUser->uid;
\Yii::app()->setConfig('filterxsshtml_forcedall', false);
\Yii::app()->setConfig('filterxsshtml', true);
Nach dem Update testen — Eine Quota mit einer Nachricht anlegen, die ein img-Element mit onerror-Attribut enthält, danach den gespeicherten Text in der Bearbeitungsmaske prüfen; dabei ein Konto ohne Superadministratorrechte verwenden und die XSS-Filterung aktiviert lassen. Anschließend eine mehrsprachige Umfrage verwenden und kontrollieren, dass für jede Sprache eine Quota-Nachricht gespeichert wurde. Zuletzt eine Quota im Umfragefrontend erreichen und die ausgelieferte Nachricht ansehen.
Betroffene Dateien — application/models/services/Quotas.php, tests/unit/models/QuotasServiceTest.php
Relevante Commits — 6d2f05316d, ea7af534d6
CVE / Advisory — Eine CVE-Kennung oder ein Advisory-Link ist im Repository nicht auffindbar; der Commit trägt in seiner Nachricht und in docs/release_notes.txt das Präfix [security].
A8: Themes der vorherigen Hauptversion werden nicht mehr deinstalliert
Hintergrund — Stellte die Kompatibilitätsprüfung fest, dass ein Umfragetheme nicht zur laufenden LimeSurvey-Version passt, wurde es bisher unmittelbar deinstalliert. Das traf auch Themes, die lediglich noch die vorherige Hauptversion in ihrer Konfiguration deklarieren. Neu ist eine Hilfsmethode, die die Konfigurationsdatei des Themes einliest und alle deklarierten Kompatibilitätsversionen gegen die aktuelle Hauptversion minus eins prüft. Nur wenn sämtliche deklarierten Versionen darunter liegen, wird deinstalliert; andernfalls kehrt die Prüfung zurück und lässt das Theme installiert. Zugleich wird die bisher fehlerhafte Bedingung im Zweig für nicht gefundene Themes auf einen expliziten Vergleich mit null korrigiert.
Konsequenz — Unter LimeSurvey 7 bleiben Themes installiert, die in ihrer Konfiguration mindestens die Hauptversion 6 nennen; nur Themes, die ausschließlich ältere Hauptversionen deklarieren, werden weiterhin entfernt. Das verhindert, dass ein Update stillschweigend Themes aus der Installation nimmt, auf die aktive Umfragen verweisen. Die Codestelle trägt einen ausdrücklichen Hinweis darauf, dass es sich um eine vorläufige Lösung handelt. Fehlt in der Konfiguration eines Themes der Kompatibilitätsblock oder lässt sich die Datei nicht laden, gilt das Theme als nicht zu alt und bleibt ebenfalls erhalten. Ob ein so erhaltenes Theme fehlerfrei rendert, prüft die Änderung nicht — sie unterdrückt lediglich die Deinstallation.
Vorher / Nachher
// Vorher (application/models/TemplateConfig.php)
if (self::uninstallThemesRecursive($themeName)) {
if ($redirect) {
// Nachher
// If the theme was written for a version lower than 6 it should be uninstalled.
// Themes targeting version 6 or higher are kept for now (temporary workaround).
$extensionConfig = ExtensionConfig::loadFromFile($themePath);
if (self::isThemeTooOldToKeep($extensionConfig)) {
if (self::uninstallThemesRecursive($themeName)) {
if ($redirect) {
// Neu (application/models/TemplateConfig.php)
$lsVersion = require App()->getBasePath() . '/config/version.php';
$currentMajor = (int) substr((string) $lsVersion['versionnumber'], 0, 1);
$minimumAllowedMajor = $currentMajor - 1;
foreach ($extensionConfig->xml->compatibility->version as $version) {
if ((int) substr((string) $version, 0, 1) >= $minimumAllowedMajor) {
// At least one declared compatibility version is recent enough to keep
return false;
}
}
return true;
Nach dem Update testen — Ein Theme mit einer Kompatibilitätsangabe für die vorherige Hauptversion installieren, die Themeübersicht aufrufen und prüfen, dass es installiert bleibt. Anschließend ein Theme mit einer Angabe für eine ältere Hauptversion prüfen und die Deinstallationsmeldung bestätigen. Zuletzt eine Umfrage öffnen, die ein solches älteres Theme verwendet, und die Darstellung im Frontend kontrollieren.
Betroffene Dateien — application/models/TemplateConfig.php
Relevante Commits — fe6fbc10c3
Weitere relevante Änderungen
Antwortoptionen der Button-Themes als Listen
Themes und Rendering · Stiller Fehler · Theme-Entwickler
Die Antwortzeilen der Button-Fragethemes sind jetzt Listenelemente in einer ungeordneten Liste, sodass CSS-Regeln auf die bisherigen Container wirkungslos werden. (fde2114472)
Bildauswahl im Themeeditor nach Upload aktualisiert
Themes und Rendering · Kein Bruch · Theme-Entwickler, Integratoren
Die JSON-Antwort des Uploads enthält jetzt das zusätzliche Feld file, und hochgeladene Bilder erscheinen ohne Neuladen in den Bildauswahlfeldern. (c87b221fb0)
Tabulatorreihenfolge in Array nach Spalte korrigiert
Survey Runtime · Kein Bruch · Theme-Entwickler
Jedes Optionsfeld erhält tabindex="0", wodurch alle Spalten mit der Tabulatortaste erreichbar bleiben, auch wenn bereits eine Auswahl getroffen wurde. (305f08145b)
Tastaturbedienung der Dropdown-Antwort ergänzt
Survey Runtime · Kein Bruch · Theme-Entwickler
Das Fragethema für Auswahllisten registriert einen eigenen Tastaturhandler, sodass sich die Liste mit Pfeiltasten, Eingabe- und Escape-Taste bedienen lässt. (b6cfab644a)
Meldungstext bei weichen Pflichtfragen korrigiert
Survey Runtime · Kein Bruch · Administratoren
Nur als pflichtig markierte Fragen setzen den Hinweistext, sodass bei ausschließlich weichen Pflichtfragen nicht mehr die Meldung für harte Pflichtfragen erscheint. (2c56f42b6d)
Weiche Pflichtfragen übernehmen die Bestätigung wieder
Survey Runtime · Kein Bruch · Administratoren, Theme-Entwickler
Die Bestätigung setzt jetzt das im Theme vorhandene Kontrollkästchen, statt ein zusätzliches verstecktes Formularfeld anzuhängen. (9f0f2ea31b)
Längenprüfung für Zugangscodes aus dem Request
Survey Runtime · Kein Bruch · Administratoren, Integratoren
Zugangscodes oberhalb der Spaltenlänge werden verworfen, statt beim Speichern der Antwort einen Datenbankfehler auszulösen. (0ab3f47cfd)
Bounce-Dialog in eigene Teilansicht ausgelagert
Themes und Rendering · Kein Bruch · Administratoren, Theme-Entwickler
Der Dialog wird nun aus einer eigenen Teilansicht in beiden Teilnehmeransichten eingebunden, statt in der Kopfleiste zu stehen. (780a6d05f9)
Druckansicht zeigt Sonstiges-Felder wieder
Survey Runtime · Kein Bruch · Administratoren
Das Sonstiges-Feld wird auch dann gedruckt, wenn für die jeweilige Sprache kein Druckhilfetext hinterlegt ist. (922c5e206f)
Neues Modal-Widget für Erweiterungen
Plugin-Kompatibilität · Kein Bruch · Plugin-Entwickler, Theme-Entwickler
Erweiterungen können über das neue Widget einen leeren Bootstrap-Dialog erzeugen und dessen HTML wahlweise zurückgeben lassen, statt es auszugeben. (2d1341815b)
Aktualisierte Composer-Abhängigkeiten
Plugin-Kompatibilität · Kein Bruch · Administratoren, Plugin-Entwickler
Siebzehn Pakete in der Composer-Sperrdatei wurden auf neuere Stände gehoben, darunter der HTTP-Client, die SSH-Bibliothek, der PDF-Erzeuger und mehrere Symfony-Komponenten. (11fad7a5af)
Barrierefreiheit in Administration und Umfragefrontend verbessert
Themes und Rendering · Kein Bruch · Administratoren, Theme-Entwickler
Neun weitere Commits ergänzen Rollen, Beschriftungen und Fokusführung in Seitenleiste, Schnellübersetzung, Themeeditor, Benachrichtigungen, Sprachauswahl und Zugangscodeseite. (f57b456ecb)
Zuordnung nach Bereich
| Bereich | Vollständig beschrieben | Weitere Einträge |
|---|---|---|
| Sicherheit | A3, A6, A7 | – |
| Datenbank | keine | – |
| RemoteControl API | keine | – |
| Survey Runtime | A2, A4, A5, A7 | ja |
| Themes und Rendering | A2, A4, A5, A8 | ja |
| Plugin-Kompatibilität | A1, A3, A8 | ja |
| Performance | A1 | – |
Nicht betroffene Bereiche
Die folgenden Beobachtungen stützen sich darauf, dass die genannten Dateien und Verzeichnisse in der Ausgabe von git diff --name-only 7.0.11+260821..7.0.12+260833 nicht vorkommen.
Die Datei application/helpers/remotecontrol/remotecontrol_handle.php ist im Diff nicht enthalten; Methodennamen, Parameter und Rückgabestrukturen der RemoteControl-Schnittstelle sind damit unverändert.
Das Verzeichnis application/libraries/PluginManager/ ist im Diff nicht enthalten; die Registrierung von Plugins, die Definition der PluginEvents und deren Parameterübergabe sind damit unverändert.
Das Verzeichnis plugins/ ist im Diff nicht enthalten; die mitgelieferten Kernplugins einschließlich der Authentifizierungs- und Exportplugins sind damit unverändert.
Die Datei application/helpers/expressions/em_manager_helper.php ist im Diff nicht enthalten; die Auswertung von Bedingungen, Gleichungen und Platzhaltern durch den ExpressionScript ist damit unverändert.
Das Release enthält keine Migration mit Strukturwirkung: die interne Datenbank-Versionsnummer steigt von 710 auf 711, und die zugehörige Aktualisierungsklasse ist ausdrücklich leer.
// Vorher (application/config/version.php)
$config['versionnumber'] = '7.0.11';
$config['dbversionnumber'] = 710;
// Nachher
$config['versionnumber'] = '7.0.12';
$config['dbversionnumber'] = 711;
// Neu (application/helpers/update/updates/Update_711.php)
/**
* Compatibility update for cloud, intentionally empty
*/
class Update_711 extends DatabaseUpdateBase
{
/**
* @inheritDoc
*/
public function up()
{
}
}
Aus diesen beiden Zitaten folgt: das Update von 7.0.11 auf 7.0.12 verändert weder Tabellen noch Spalten, Indizes oder Constraints, sondern hebt ausschließlich den Versionszähler an.
Empfehlung
Administratoren
Vor dem Update — Prüfen, welche Konten die globale Einstellungsberechtigung besitzen, denn ohne sie ist das Anlegen von Umfragemenü-Einträgen künftig gesperrt (A3). Bestehende Umfragemenü-Einträge auf HTML- oder Skriptanteile im Feld data sichten, da das Update nur die Ausgabe entschärft und gespeicherte Werte unverändert lässt (A3). Eine Liste der installierten Umfragethemes samt der in ihrer Konfiguration deklarierten Kompatibilitätsversionen anlegen, um die geänderte Deinstallationslogik nachvollziehen zu können (A8). Wer seine Installation selbst aus den Paketquellen baut, sollte die aktualisierte Composer-Sperrdatei einspielen und den Build vorher in einer Testumgebung durchlaufen lassen.
Unmittelbar nach dem Update — Die Themeübersicht öffnen und prüfen, dass keine benötigten Themes entfernt wurden (A8). Eine Umfrage mit Pflichtfragen und aktivierter Auswertung vollständig durchlaufen und Darstellung sowie Layout kontrollieren (A4, A5). Eine Quota mit mehrsprachigen Nachrichten anlegen und bestätigen, dass für jede Sprache eine Nachricht gespeichert wurde (A7). Anschließend die Editorseiten des Administrationsbereichs aufrufen und prüfen, dass der Editor überall erscheint, wo er erwartet wird (A1).
Rollback — Ein Rollback auf 7.0.11 erfordert keine Rücknahme von Schemaänderungen, weil die zugehörige Aktualisierungsklasse belegt leer ist und ausschließlich der Versionszähler von 710 auf 711 steigt; siehe die Zitate unter Nicht betroffene Bereiche. Ob die ältere Installation eine Datenbank mit dem Zählerstand 711 ohne Weiteres annimmt oder den Zähler zurückgesetzt haben will, ist aus dem Diff nicht ablesbar und damit nicht bestimmbar — das ist vor einem Rollback in einer Testumgebung zu prüfen. Neue Konfigurationsdateien legt das Update nicht an; die Änderung an application/config/packages.php gehört zum Auslieferungsstand und wird mit dem Rollback der Dateien zurückgenommen (A1). Themes, die vor dem Update durch die alte Logik bereits deinstalliert wurden, kommen durch ein Rollback nicht zurück und müssen erneut installiert werden (A8).
Plugin-Entwickler
Jedes Plugin, das im Administrationsbereich eigene Seiten oder Modalfenster mit CKEditor ausgibt, muss die Editorpakete künftig selbst registrieren oder die Kernvorbereitung nutzen (A1). Aufrufe der Speichermethode des Umfragemenü-Modells können deren Rückgabewert nun auswerten, und Code, der Umfragemenü-Einträge programmgesteuert anlegt, sollte gegen die neue Berechtigungslage getestet werden (A3). Wer den Quota-Dienst aus eigenem Code verwendet, muss damit rechnen, dass eine sprachabhängige Einstellung bei fehlgeschlagener Validierung gar nicht mehr geschrieben wird, und die Fehlerliste der Quota auswerten (A7). Für neue Dialoge steht das im Kapitel Weitere relevante Änderungen beschriebene Modal-Widget bereit.
Theme-Entwickler
Zuerst prüfen, ob ein eigenes Theme vom Standardtheme ableitet und dabei nur eine der beiden Vorlagen für Gruppencontainer und Gruppenname überschreibt; in diesem Fall verschwindet die Gruppenüberschrift ohne Fehlermeldung (A2). Danach eigenes CSS gegen die neue Struktur der Auswertungsanzeige abgleichen, die keine Tabelle mehr ist (A5), sowie gegen die zu Listenelementen gewordenen Antwortzeilen der Button-Fragethemes, beschrieben im Kapitel Weitere relevante Änderungen. Die Pflichtfeldmarkierung trägt jetzt sichtbaren Text und im Theme vanilla keine Float-Klasse mehr; Layouts mit knappem Platz in der Fragenkopfzeile sind erneut zu prüfen (A4). Eigene Administrationsansichten mit Editorfeld benötigen die ausdrückliche Registrierung der Editorpakete (A1).
Integratoren
Integrationen, die das HTML abgeschlossener Umfrageseiten auslesen, müssen ihre Selektoren für die Auswertungsanzeige von Tabellenzellen auf die neue Struktur umstellen (A5). Wer Überschriftenebenen der Umfrageseite auswertet, findet die Gruppenüberschrift im Standardtheme nicht mehr als h1, und sie kann bei leerem Gruppennamen ganz entfallen (A2). Die JSON-Antwort des Bilduploads im Themeeditor trägt ein zusätzliches Feld, und überlange Zugangscodes im Request werden künftig verworfen, statt in einen Datenbankfehler zu laufen; beides ist im Kapitel Weitere relevante Änderungen beschrieben.
API-Nutzer
Für Nutzer der RemoteControl-Schnittstelle ergibt sich aus diesem Release kein Handlungsbedarf: die Handler-Datei der Schnittstelle ist im Diff nicht enthalten, wie unter Nicht betroffene Bereiche belegt.