Kurzbeschreibung
Question Hub (qbank_questionhub) ist ein Plugin für die Moodle-Fragensammlung. Damit suchen Sie Fragenpakete im Question Hub, importieren sie mit einer Vorschau in Ihren Kurs und veröffentlichen eigene Kategorien als Pakete, die andere Lehrpersonen in ihr Moodle übernehmen können.
Der Question Hub unter hub.cblum.ch ist ein eigenständiger Dienst, der ebenfalls von Cyril Blum betrieben wird. Das Plugin richtet sich an Lehrpersonen an Schweizer Gymnasien und verlangt Moodle 4.5 oder neuer. Geprüft ist es mit Moodle 4.5 und 5.0.
Screenshots
Die beiden Bilder sind dieselben wie im Moodle-Plugin-Verzeichnis. Cyril Blum hat sie am 14.10.2026 auf einer Moodle-Testinstallation aufgenommen, im Testkurs DEMO101 mit dem Testkonto «Admin User». Die gezeigten Fragen stammen aus seiner eigenen Fragensammlung. Daten von Schülerinnen und Schülern sind keine zu sehen.
Die Aufnahmen zeigen eine ältere Plugin-Version mit englischer Oberfläche. Einzelne Beschriftungen haben sich seither geändert, zum Beispiel heisst der Status «Synchronised» heute «Linked». Wählen Sie ein Bild für die Vorschau auf dieser Seite. Mit den Pfeilen wechseln Sie zwischen den Aufnahmen.
Ausführliche Beschreibung
In der Fragensammlung eingebaut
Das Plugin ergänzt die Fragensammlung um einen Reiter «Question Hub» mit den Bereichen «Durchsuchen», «Meine Bibliothek» und «Meine Pakete». In der Fragenliste kommen eine Aktion zum Exportieren einzelner Fragen, eine Sammelaktion zum Veröffentlichen ausgewählter Fragen und die Spalte «Hub» dazu. Diese zeigt, ob eine Frage der verknüpften Version auf dem Hub entspricht, seither geändert wurde oder neu ist.
Pakete suchen und importieren
Pakete lassen sich nach Stichwort, Fach, Kursniveau (GF, SF, EF, FF) und Kanton filtern. Sofern die Autorin oder der Autor es erlaubt, zeigt der Hub eine Vorschau der Fragen, ohne Musterlösungen und Feedback. Vor jedem Import sehen Sie, welche Fragen neu dazukommen, welche aktualisiert und welche übersprungen werden. Fragen, die auf dem Hub und in Ihrem Moodle geändert wurden, erscheinen als Konflikt, und Sie entscheiden pro Frage, welche Version gilt oder ob beide bleiben. Übernehmen Sie die Version vom Hub, bleibt Ihre bisherige Version im Versionsverlauf der Frage erhalten. Ohne verknüpftes Hub-Konto können Sie öffentliche Pakete suchen und importieren.
Eigene Kategorien veröffentlichen
Eine Kategorie der Fragensammlung wird mit ihren Unterkategorien als Paket im Format Moodle-XML veröffentlicht. Sie geben Titel, Zusammenfassung, Versionshinweis, Tags, Fach, Niveau und Kanton an und wählen eine Lizenz (CC BY 4.0, CC BY-SA 4.0 oder CC0) sowie die Sichtbarkeit. Öffentliche Pakete sind offene Bildungsressourcen, private sind nur für Personen sichtbar, deren Zugriffsanfrage Sie annehmen. Optional überträgt der Hub jede Version zusätzlich in ein GitHub-Repository.
Versionen, Push und Pull
Versionsnummern folgen dem Schema 1.2.3 und sind unveränderlich. Mit «Push» veröffentlichen Sie lokale Änderungen als neue Version, mit «Pull» übernehmen Sie eine neuere Version vom Hub. Vor einem Push zeigt das Plugin die geänderten Fragen Zeile für Zeile. Unter «Änderungen prüfen» behalten oder verwerfen Sie lokale Änderungen einzeln. Ältere Versionen lassen sich mit Vorschau wiederherstellen, und Sie können einzelne Versionen oder ein ganzes Paket vom Hub zurückziehen. Bereits importierte Fragen bleiben in den anderen Moodle-Installationen bestehen.
Varianten und Änderungsvorschläge
Aus einem importierten Paket können Sie eine eigene Variante auf dem Hub erstellen. Ihre Kategorie ist danach mit der Variante verknüpft, und Ihre Änderungen schlagen Sie dem Original über den Hub vor. Eine Variante behält die Lizenz des Originals und nennt es als Quelle. Mit «Variante wechseln» verknüpfen Sie eine Kategorie nach einer Vorschau mit dem Original oder einer anderen Variante.
Aufräumen
Das Plugin findet identische Duplikate und behält jeweils die älteste Frage. Gleichnamige Fragen mit unterschiedlichem Inhalt in derselben Kategorie zeigt es zum Vergleich an. Fragen, die in einem Test verwendet werden, löscht es nie.
Rechte und Sicherung
Suchen und Exportieren dürfen standardmässig Lehrpersonen, Importieren und Veröffentlichen Lehrpersonen mit Bearbeitungsrecht und Manager. Eine Moodle-Sicherung mit Fragen enthält auch die Verknüpfungen zum Hub, sodass sie nach einer Wiederherstellung erhalten bleiben. Wie Konten verknüpft und Inhalte beim Import geprüft werden, zeigen die Abschnitte Datenflüsse und Sicherheit.
Architektur
Question Hub besteht aus dem Plugin und dem Hub. Das Plugin ist die einzige Komponente, die in einem Schul-Moodle installiert wird. Der Hub unter hub.cblum.ch ist eine eigene Webplattform mit API, die Konten und Fragenpakete in Versionen speichert. Jedes Moodle mit Plugin kann Pakete veröffentlichen und importieren.
Plugin qbank_questionhub
Reiter «Question Hub» in der Fragensammlung, Spalte «Hub» in der Fragenliste, Import mit Vorschau und Veröffentlichen. In eigenen Tabellen speichert es Tokens, ein Protokoll und die Zuordnung von Fragen zu Paketversionen.
Question Hub
Webseite und API für Konten, Pakete, Versionen, Varianten und Änderungsvorschläge. Öffentliche Pakete lassen sich ohne Konto durchsuchen und importieren. Ein Hub-Konto braucht, wer veröffentlicht oder private Pakete nutzt.
GitHub-Spiegel
Wer ein Paket verwaltet, kann es mit einem eigenen GitHub-Repository verknüpfen. Der Hub legt dann jede neue Version dort als XML-Datei ab und setzt ein Versions-Tag. Das Plugin selbst verbindet sich nie mit GitHub.
Datenflüsse
Veröffentlichen und Push
- Sie wählen eine Kategorie oder einzelne Fragen und geben die Paketangaben ein.
- Das Plugin exportiert die Fragen als Moodle-XML und prüft das Paket vorab.Prüfung im Plugin
- Das Moodle sendet das Paket mit Ihrem Token an den Hub.HTTPSToken
- Der Hub prüft XML, Grösse, Fragetypen und Medien und speichert eine neue, unveränderliche Version.SHA-256
- Ist das Paket mit GitHub verknüpft, überträgt der Hub die Version zusätzlich ins Repository.optional
Importieren und Pull
- Sie suchen ein Paket. Öffentliche Pakete finden Sie auch ohne verknüpftes Konto.
- Das Moodle lädt die gewählte Version vom Hub.HTTPS
- Das Plugin prüft das Paket und entfernt aktive Inhalte, wenn die Einstellung eingeschaltet ist.Prüfung im Plugin
- Die Vorschau zeigt neue, aktualisierte und übersprungene Fragen sowie Konflikte.
- Nach Ihrer Bestätigung kommen die Fragen in die Fragensammlung. Die bisherige Version einer aktualisierten Frage bleibt im Versionsverlauf.
Die beiden Abläufe zeigen, wohin die Fragen gehen. Die Verbindung baut auch beim Import das Moodle auf.
Anmeldung: Moodle-Konto mit Hub-Konto verknüpfen
Zum Veröffentlichen, für Push und für private Pakete verknüpft jede Lehrperson ihr Moodle-Konto mit ihrem Hub-Konto. Dafür gibt es zwei Wege. Das Moodle-Passwort geht dabei nie an den Hub, und das Hub-Passwort wird nie im Moodle eingegeben.
OAuth 2.0 mit PKCE
Sie wählen im Plugin «Mit Question Hub verbinden» und melden sich direkt auf hub.cblum.ch an. Das Moodle erhält ein Token, das 30 Tage gilt. Die Adresse Ihres Moodle muss dafür auf dem Hub freigegeben sein. Beim Trennen widerruft der Hub das Token.
Persönliches Zugriffstoken
Sie erstellen im Hub ein Token mit wählbarer Laufzeit und fügen es im Plugin ein. Das geht auch ohne Freigabe Ihres Moodle. Der Hub speichert nur einen SHA-256-Hash des Tokens. Beim Trennen löscht das Plugin das Token in Moodle, auf dem Hub löschen Sie es selbst.
Mit der Einstellung «Individuelle Lehrpersonen-Kontoverknüpfung erlauben» kann die Administration die Verknüpfung abschalten. Lehrpersonen können dann nur öffentliche Pakete suchen und importieren.
Sicherheit und Verschlüsselung
Die Karten zeigen, wie Plugin und Hub Verbindungen, Zugangsdaten und Pakete schützen. Die gelbe Karte nennt, was bewusst nicht eingesetzt wird.
Transport
Plugin und Browser sprechen mit dem Hub über HTTPS, die voreingestellte Hub-Adresse ist https://hub.cblum.ch. Der Hub nimmt nur TLS 1.2 und 1.3 an, leitet HTTP auf HTTPS um und sendet HSTS (geprüft am 12.11.2026).
Tokens
OAuth-Tokens gelten 30 Tage und werden beim Trennen auf dem Hub widerrufen. Persönliche Zugriffstokens speichert der Hub nur als SHA-256-Hash. In der Moodle-Datenbank liegt das Token ohne zusätzliche Verschlüsselung und ist so gut geschützt wie die Datenbank selbst.
Hub-Konten
Passwörter speichert der Hub als scrypt-Hash mit eigenem Salt. Anmeldung und Registrierung verlangen ein Captcha und sind pro Client begrenzt. Ein Link zum Zurücksetzen des Passworts gilt eine Stunde und nur einmal, gespeichert ist nur sein SHA-256-Hash.
GitHub-Token
Wer den GitHub-Spiegel nutzt, hinterlegt auf dem Hub ein GitHub-Token. Der Hub speichert es mit AES-256-GCM verschlüsselt und braucht es nur für Commits über die GitHub-API per HTTPS.
Paketversionen
Veröffentlichte Versionen sind unveränderlich, eine Korrektur ergibt eine neue Versionsnummer. Der Hub berechnet für jede Version eine SHA-256-Prüfsumme und gibt sie beim Herunterladen mit. Geänderte Fragen erkennt das Plugin über eigene SHA-256-Werte des Frageninhalts.
XML-Prüfung
Plugin und Hub lehnen XML mit DOCTYPE-, ENTITY- oder XInclude-Angaben ab. Geprüft werden unter anderem Multiple Choice, Wahr/Falsch, Kurzantwort, Numerisch, Zuordnung, Lückentext (Cloze) und Freitext, eingebettete Bilder und Dateien, Grössengrenzen (50 MB pro Paket, 10 MB pro Datei) sowie Skripte in SVG-Dateien.
Aktive Inhalte
Weil auf dem Hub alle veröffentlichen können, entfernt das Plugin aktive Inhalte wie Skripte und eingebettete Frames standardmässig mit der HTML-Bereinigung von Moodle. Für CodeRunner-Fragen kann die Administration eine Ausnahme einschalten. Bleiben aktive Inhalte erhalten, muss die Lehrperson den Import ausdrücklich bestätigen. Skripte, die erst zur Laufzeit entstehen, erkennt die Prüfung nicht.
Prüfung des Codes
Eine Eigenprüfung vom 26.10.2026 mit KI-Unterstützung und Standardwerkzeugen fand sieben Befunde, behoben in Version 1.0.33. Jede Änderung durchläuft auf GitHub Tests mit Moodle 4.5 und 5.0, die Prüfung des Moodle-Codestils und Semgrep. Ein unabhängiges Audit oder einen Penetrationstest gab es nicht.
Nicht eingesetzt
Die Pakete tragen keine digitale Signatur. Die Prüfsumme zeigt, ob eine Datei verändert wurde, schützt aber nicht vor einem manipulierten Hub. E-Mails des Hubs sind nur auf dem Weg zum Mailserver verschlüsselt (STARTTLS), nicht Ende-zu-Ende.
Installation und Konfiguration
Installieren Sie das Plugin über das Moodle-Plugin-Verzeichnis oder legen Sie den Quellcode von GitHub im Ordner question/bank/questionhub Ihrer Moodle-Installation ab:
git clone https://github.com/CyrilBlum/moodle-qbank_questionhub.git question/bank/questionhub
php admin/cli/upgrade.php --non-interactive
php admin/cli/purge_caches.php
Die Einstellungen finden Sie in der Website-Administration bei den Plugins der Fragensammlung unter «Question Hub»:
- Hub-Adresse, voreingestellt
https://hub.cblum.ch. - OAuth-2.0-Client-ID, voreingestellt
moodle-plugin-client. Ändern Sie sie nur auf Anweisung des Hub-Betreibers. - Kontoverknüpfung für Lehrpersonen erlauben (eingeschaltet). Ist sie aus, können Lehrpersonen nur öffentliche Pakete suchen und importieren.
- Aktive Inhalte beim Import entfernen (eingeschaltet).
- Aktive Inhalte in CodeRunner-Fragen behalten (ausgeschaltet), eine Ausnahme zur vorherigen Einstellung.
Mit «Verbindung testen» prüfen Sie, ob der Hub erreichbar und Ihr eigenes verknüpftes Konto gültig ist. Damit Lehrpersonen ihr Konto per OAuth verknüpfen können, muss die Adresse Ihres Moodle auf dem Hub freigegeben sein. Schreiben Sie dazu an apps@cblum.ch. Ein Konto auf dem Hub legen Sie unter hub.cblum.ch an.
Dateien
Das Plugin folgt dem üblichen Aufbau eines Moodle-Plugins:
Grundgerüst
version.php: Name, Version und benötigte Moodle-Version.settings.php: Einstellungen in der Website-Administration.
Seiten
view.php: Hub-Ansicht mit Suche, Import, Bibliothek und eigenen Paketen.publish.php: Kategorien und Fragen exportieren und veröffentlichen.review.php: lokale Änderungen seit der verknüpften Version prüfen.variants.php: gleichnamige Fragen mit unterschiedlichem Inhalt vergleichen.oauth_callback.phpunddisconnect.php: Hub-Konto verknüpfen und trennen.testconnection.php: Verbindungstest aus den Einstellungen.
Programmlogik
classes/: Programmlogik, darunter der Hub-Client (api_client.php), Anmeldung und Tokens (auth_manager.php), Export (package_exporter.php), Import (package_importer.php,qformat_xml_importer.php), die Importprüfung (preflight_validator.php), Versionsvergleich und Verknüpfungen (release_diff.php,local_changes.php,publication_tracker.php), Duplikate (duplicate_manager.php), die Einbindung in die Fragensammlung (plugin_feature.php,navigation.php,question_action.php,bulk_publish_action.php,question_sync_column.php) und die Datenschutz-Schnittstelle (privacy/provider.php).
Datenbank und Sicherung
db/: Rechte (access.php), Datenbanktabellen (install.xml) und Aktualisierungsschritte (upgrade.php).backup/moodle2/: Sicherung und Wiederherstellung der Hub-Verknüpfungen.
Oberfläche
templates/: Mustache-Vorlagen der Oberfläche.amd/src/undamd/build/: JavaScript-Module und ihre minimierten Fassungen.lang/en/undlang/de/: englische und deutsche Texte.pix/,styles.css: Symbol und Darstellung.
Werkzeuge und Tests
cli/: Export, Import und Selbsttest über die Kommandozeile.tests/und.github/workflows/: automatische Tests, die auf GitHub mit Moodle 4.5 und 5.0 laufen.
Datenschutz
Plugin-Tabellen
- Hub-Zugriffstoken pro verknüpfter Person, mit Hub-Benutzerkennung, E-Mail-Adresse und Anzeigename des Hub-Kontos
- Protokoll der Importe und Veröffentlichungen mit Moodle-Benutzer-ID, Paketkennung, Version, Aktion und Zeitpunkt
- Zuordnung importierter Fragen zu Paketversionen
Die Datenschutz-Schnittstelle von Moodle kann diese Angaben exportieren und löschen.
Was das Plugin sendet
- das Zugriffstoken, aber nicht Moodle-Benutzername, Name oder E-Mail-Adresse aus Moodle
- Fragen und Paketangaben nur, wenn jemand ein Paket veröffentlicht, pusht, als Variante kopiert oder bearbeitet
- bei der Verknüpfung per OAuth die Adresse des Moodle als Rücksprungadresse
Eigener Dienst
- Hub-Konto mit E-Mail-Adresse, Name, Schule, Kanton und Passwort-Hash
- Pakete mit allen Versionen, Mitwirkende und Zugriffsanfragen
Der Hub ist ein eigener Dienst mit eigener Datenbearbeitung.
Keine Personendaten in Fragen
Fragen dürfen keine Personendaten enthalten, also keine Namen oder Noten von Schülerinnen und Schülern, auch nicht in Bildern oder Feedback. Das Plugin weist darauf hin, technisch verhindern kann es das nicht. Quizversuche, Antworten, Noten und Teilnehmerlisten überträgt das Plugin nie.
Nutzung und Haftung
Der Hub kann zeitweise nicht erreichbar sein, und Pakete können von ihren Autorinnen und Autoren zurückgezogen werden. Bereits importierte Fragen bleiben in Ihrem Moodle. Für Inhalte, die Sie veröffentlichen, sind Sie selbst verantwortlich, auch für Urheberrechte und die gewählte Lizenz. Machen Sie vor grösseren Importen eine Sicherung Ihres Kurses oder Ihrer Fragensammlung.
Die Nutzung erfolgt in eigener Verantwortung. Das Plugin wird im gesetzlich zulässigen Umfang ohne Gewähr für Richtigkeit, Vollständigkeit, Verfügbarkeit oder Eignung für einen bestimmten Zweck bereitgestellt. Soweit gesetzlich zulässig, wird die Haftung für Schäden aus der Nutzung oder Nichtverfügbarkeit ausgeschlossen, insbesondere für Datenverlust, entgangenen Gewinn und Folgeschäden. Zwingende gesetzliche Rechte und Haftung bleiben unberührt, insbesondere bei Absicht oder grober Fahrlässigkeit sowie soweit die Haftung für Personenschäden nicht ausgeschlossen werden darf. Für den Quellcode gilt die GNU General Public License v3 oder später.
Feedback und Entwicklung
Haben Sie einen Fehler gefunden oder eine Idee für Question Hub? Erfassen Sie einen Eintrag in den GitHub Issues des Plugins oder schreiben Sie an apps@cblum.ch.
Die Issues sind öffentlich und ohne Anmeldung lesbar, für einen neuen Eintrag brauchen Sie ein GitHub-Konto. Schreiben Sie dort keine Personendaten.
Quellcode und Links
Repository: öffentlich. Der Quellcode steht unter der GNU General Public License v3 oder später.
Der Quellcode des Hubs liegt in einem eigenen, ebenfalls öffentlichen Repository: Moodle-Question-Hub-Marketplace.
Repository-Status und Links geprüft am 12.11.2026. Im Moodle-Plugin-Verzeichnis veröffentlicht am 11.11.2026. Zur Projektübersicht