better validation of room names

This commit is contained in:
stefan.tollkuehn committed 2026-09-30 14:32:51 +02:00
1 parent ad8cb2b819
commit 5b128f9d50
1 file changed
+80 -35
+80 -35
View File
@@ -423,11 +423,11 @@
<!-- FEHLER --> <!-- FEHLER -->
<div id="invalidRoom" class="hidden"> <div id="invalidRoom" class="hidden">
<h1 data-i18n="error.title"> <h1 id="missingRoomTitle" data-i18n="error.title">
No meeting specified No meeting specified
</h1> </h1>
<div class="error"> <div id="missingRoomError" class="error">
<span data-i18n="error.description"> <span data-i18n="error.description">
Please specify a meeting using the Please specify a meeting using the
</span> </span>
@@ -437,6 +437,20 @@
</span> </span>
</div> </div>
<h1 id="invalidNameTitle" class="hidden" data-i18n="error.invalidTitle">
Invalid meeting name
</h1>
<div id="invalidNameError" class="error hidden">
<span data-i18n="error.invalidDescription">
Only letters, numbers and hyphens are allowed:
</span>
<br>
<span class="room">
<strong id="invalidRoomName"></strong>
</span>
</div>
<div style="margin-top: 24px;"> <div style="margin-top: 24px;">
<button id="createNewMeetingButton" class="button primary hidden" type="button" data-i18n="creator.createNewButton"> <button id="createNewMeetingButton" class="button primary hidden" type="button" data-i18n="creator.createNewButton">
Create New Meeting Create New Meeting
@@ -592,7 +606,9 @@
error: { error: {
title: "No meeting specified", title: "No meeting specified",
description: "Please specify a meeting using the", description: "Please specify a meeting using the",
descriptionSuffix: "parameter." descriptionSuffix: "parameter.",
invalidTitle: "Invalid meeting name",
invalidDescription: "Only letters, numbers and hyphens are allowed:"
}, },
creator: { creator: {
@@ -608,6 +624,7 @@
downloadButton: "Download ICS File", downloadButton: "Download ICS File",
createNewButton: "Create New Meeting", createNewButton: "Create New Meeting",
meetingNameRequired: "Please enter a meeting name", meetingNameRequired: "Please enter a meeting name",
meetingNameInvalid: "Meeting name may only contain letters, numbers and hyphens",
startTimeRequired: "Please select a start time", startTimeRequired: "Please select a start time",
endTimeRequired: "Please select an end time", endTimeRequired: "Please select an end time",
endAfterStart: "End time must be after start time", endAfterStart: "End time must be after start time",
@@ -679,7 +696,9 @@
title: "Kein Meeting angegeben", title: "Kein Meeting angegeben",
description: description:
"Bitte gib ein Meeting über den Parameter", "Bitte gib ein Meeting über den Parameter",
descriptionSuffix: "an." descriptionSuffix: "an.",
invalidTitle: "Ungültiger Meeting-Name",
invalidDescription: "Erlaubt sind nur Buchstaben, Zahlen und Bindestriche:"
}, },
creator: { creator: {
@@ -695,6 +714,7 @@
downloadButton: "ICS-Datei herunterladen", downloadButton: "ICS-Datei herunterladen",
createNewButton: "Neues Meeting erstellen", createNewButton: "Neues Meeting erstellen",
meetingNameRequired: "Bitte gib einen Meeting-Namen ein", meetingNameRequired: "Bitte gib einen Meeting-Namen ein",
meetingNameInvalid: "Der Meeting-Name darf nur Buchstaben, Zahlen und Bindestriche enthalten",
startTimeRequired: "Bitte wähle eine Startzeit", startTimeRequired: "Bitte wähle eine Startzeit",
endTimeRequired: "Bitte wähle eine Endzeit", endTimeRequired: "Bitte wähle eine Endzeit",
endAfterStart: "Die Endzeit muss nach der Startzeit liegen", endAfterStart: "Die Endzeit muss nach der Startzeit liegen",
@@ -765,7 +785,9 @@
error: { error: {
title: "Aucune réunion spécifiée", title: "Aucune réunion spécifiée",
description: "Veuillez spécifier une réunion à l'aide du paramètre", description: "Veuillez spécifier une réunion à l'aide du paramètre",
descriptionSuffix: "." descriptionSuffix: ".",
invalidTitle: "Nom de réunion invalide",
invalidDescription: "Seuls les lettres, les chiffres et les tirets sont autorisés :"
}, },
creator: { creator: {
@@ -781,6 +803,7 @@
downloadButton: "Télécharger le fichier ICS", downloadButton: "Télécharger le fichier ICS",
createNewButton: "Créer une nouvelle réunion", createNewButton: "Créer une nouvelle réunion",
meetingNameRequired: "Veuillez entrer un nom de réunion", meetingNameRequired: "Veuillez entrer un nom de réunion",
meetingNameInvalid: "Le nom de la réunion ne peut contenir que des lettres, des chiffres et des tirets",
startTimeRequired: "Veuillez sélectionner une heure de début", startTimeRequired: "Veuillez sélectionner une heure de début",
endTimeRequired: "Veuillez sélectionner une heure de fin", endTimeRequired: "Veuillez sélectionner une heure de fin",
endAfterStart: "L'heure de fin doit être après l'heure de début", endAfterStart: "L'heure de fin doit être après l'heure de début",
@@ -1010,6 +1033,13 @@
const langFlag = document.getElementById("langFlag"); const langFlag = document.getElementById("langFlag");
const langLabel = document.getElementById("langLabel"); const langLabel = document.getElementById("langLabel");
/* Invalid room view DOM elements */
const missingRoomTitle = document.getElementById("missingRoomTitle");
const missingRoomError = document.getElementById("missingRoomError");
const invalidNameTitle = document.getElementById("invalidNameTitle");
const invalidNameError = document.getElementById("invalidNameError");
const invalidRoomName = document.getElementById("invalidRoomName");
/* ============================================================ /* ============================================================
* GET ROOM FROM QUERY-PARAMETER * GET ROOM FROM QUERY-PARAMETER
* ============================================================ * ============================================================
@@ -1030,22 +1060,19 @@
window.location.search window.location.search
); );
const room = params.get("room"); /*
* Parameter nicht vorhanden.
if (!room) { */
if (!params.has("room")) {
return null; return null;
} }
/* /*
* Leerzeichen etc. verhindern. * Leerzeichen etc. verhindern.
*
* "?room=" ohne Wert ergibt einen leeren String.
*/ */
const trimmed = room.trim(); return params.get("room").trim();
if (!trimmed) {
return null;
}
return trimmed;
} }
/* ============================================================ /* ============================================================
@@ -1061,29 +1088,17 @@
* ============================================================ * ============================================================
*/ */
const ROOM_PATTERN = /^[A-Za-z0-9-]+$/;
function isValidRoom(room) { function isValidRoom(room) {
if (!room) { if (!room) {
return false; return false;
} }
/* /*
* Keine Steuerzeichen. * Nur Buchstaben, Zahlen und Bindestriche.
*/ */
if (/[\u0000-\u001F\u007F]/.test(room)) { return ROOM_PATTERN.test(room);
return false;
}
/*
* Keine Slash-Zeichen.
*
* Falls deine Jitsi-Konfiguration Räume mit Slashes
* unterstützt, diese Prüfung entsprechend entfernen.
*/
if (room.includes("/")) {
return false;
}
return true;
} }
/* ============================================================ /* ============================================================
@@ -1510,6 +1525,11 @@ END:VCALENDAR`;
return; return;
} }
if (!ROOM_PATTERN.test(meetingName)) {
alert(getTranslation('creator.meetingNameInvalid') || 'Meeting name may only contain letters, numbers and hyphens');
return;
}
if (!meetingStartInput.value) { if (!meetingStartInput.value) {
alert(getTranslation('creator.startTimeRequired') || 'Please select a start time'); alert(getTranslation('creator.startTimeRequired') || 'Please select a start time');
return; return;
@@ -1578,20 +1598,45 @@ END:VCALENDAR`;
* Kein room-Parameter: Meldungen ausblenden, * Kein room-Parameter: Meldungen ausblenden,
* nur den Create-Button anzeigen. * nur den Create-Button anzeigen.
*/ */
/*
* Kein room-Parameter: keine Fehlermeldung,
* nur den Create-Button anzeigen.
*/
if (room === null) { if (room === null) {
invalidRoom.querySelector("h1").classList.add("hidden"); missingRoomTitle.classList.add("hidden");
invalidRoom.querySelector(".error").classList.add("hidden"); missingRoomError.classList.add("hidden");
invalidNameTitle.classList.add("hidden");
invalidNameError.classList.add("hidden");
invalidRoom.classList.remove("hidden"); invalidRoom.classList.remove("hidden");
createNewMeetingButton.classList.remove("hidden"); createNewMeetingButton.classList.remove("hidden");
return; return;
} }
/* /*
* Ungültiger room-Parameter. * Leerer room-Parameter ("?room="):
* "No meeting specified" anzeigen.
*/
if (room === "") {
missingRoomTitle.classList.remove("hidden");
missingRoomError.classList.remove("hidden");
invalidNameTitle.classList.add("hidden");
invalidNameError.classList.add("hidden");
invalidRoom.classList.remove("hidden");
createNewMeetingButton.classList.remove("hidden");
return;
}
/*
* Ungültiger room-Parameter: nur die
* Invalid-Name-Meldung anzeigen.
*/ */
if (!isValidRoom(room)) { if (!isValidRoom(room)) {
missingRoomTitle.classList.add("hidden");
missingRoomError.classList.add("hidden");
invalidNameTitle.classList.remove("hidden");
invalidNameError.classList.remove("hidden");
invalidRoomName.textContent = room;
invalidRoom.classList.remove("hidden"); invalidRoom.classList.remove("hidden");
/* Show the create new meeting button when no room is specified */
createNewMeetingButton.classList.remove("hidden"); createNewMeetingButton.classList.remove("hidden");
return; return;
} }