Vermittlungsserver: coturn mit Zugangsdaten, die verfallen
Damit Anrufe auch in Netzen zustande kommen, die keine direkte Verbindung zulassen (15-25 % der Faelle). coturn ist installiert, steht aber still, bis die Konfiguration liegt -- ein coturn mit Werkseinstellung ist ein offenes Relais. KEIN FESTES PASSWORT. Es laege dauerhaft im Browser jedes Team-Mitglieds und liesse sich nie entziehen. Der Server rechnet stattdessen bei jeder Abfrage Zugangsdaten, die nach zwoelf Stunden verfallen (server/workspace-turn.js, coturns `use-auth-secret`). Das Geheimnis liegt in einer Datei, nicht in der Datenbank: einstellung- Setzen() schreibt Werte ins Protokoll, und coturn braucht denselben Wert ohnehin in /etc. Die Oberflaeche frischt die Daten vor jedem Anruf auf. Der Chat ist eine App, die tagelang offen bleibt -- wer nur beim Laden holt, telefoniert am zweiten Tag ohne Vermittlung, und es faellt nicht auf: Es scheitern nur die, die sie gebraucht haetten. DIE WICHTIGSTE ZEILE DER KONFIGURATION ist die Sperrliste. Gemessen: dreizehn Dienste lauschen auf diesem Server nur oertlich, darunter Caddys Verwaltung auf 127.0.0.1:2019 -- wer sie erreicht, kann jede Website umleiten. Ohne Sperrliste waere der Vermittlungsserver die Tuer dorthin, und die Anfrage saehe fuer Caddy aus wie von localhost. Geprueft: pruef-anruf.mjs 51 -> 73 Pruefungen. Gegenprobe (Geheimnis als Passwort ausliefern + fremde Zugangsdaten ueberschreiben) macht genau 5 rot, darunter "das Geheimnis steht NIRGENDS in der Antwort". tools/turn-probelauf.sh beweist am echten coturn, was ein fester Vergleichswert nicht kann: dass coturn unsere Rechnung akzeptiert. Beide Seiten koennten sonst konsequent falsch rechnen und jede Pruefung waere gruen. Seine eigene Gegenprobe war zweimal zu Recht rot -- der erste Aufbau mass wegen `-y` gar nicht das Ziel, das er zu messen behauptete, sondern coturns eingebauten Loopback-Schutz. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -72,6 +72,7 @@ import {
|
||||
istDogFather,
|
||||
} from "./workspace.js";
|
||||
import { chatEreignis, istDrinFuerAnruf, teilnehmerFuerAnruf } from "./workspace-chat.js";
|
||||
import { mitZugangsdaten } from "./workspace-turn.js";
|
||||
|
||||
export const anrufRouter = express.Router();
|
||||
|
||||
@@ -161,13 +162,38 @@ anrufRouter.get("/workspace/api/anruf/adressen", (req, res) => {
|
||||
try {
|
||||
let liste = [];
|
||||
try { liste = JSON.parse(einstellung("anruf_adressen") || "[]"); } catch { liste = []; }
|
||||
|
||||
/* ZUGANGSDATEN WERDEN GERECHNET, NICHT GESPEICHERT.
|
||||
Warum das so ist, steht ausfuehrlich in workspace-turn.js. Kurz:
|
||||
Ein festes TURN-Passwort laege dauerhaft im Browser jedes
|
||||
Teilnehmers und liesse sich nie wieder entziehen. Die hier
|
||||
erzeugten verfallen von selbst.
|
||||
|
||||
Als Kennung die PERSONENNUMMER, nicht der Name -- sie landet im
|
||||
Protokoll von coturn, und das ist kein Ort fuer Klarnamen. */
|
||||
const { adressen, turn_gesamt, turn_bereit, grund } =
|
||||
mitZugangsdaten(liste, `w${req.person.id}`);
|
||||
|
||||
if (grund) {
|
||||
/* DER DRITTE AUSGANG. „Kann nicht nachsehen" ist etwas anderes
|
||||
als „ist nicht eingerichtet" -- und wer das verschweigt, sucht
|
||||
den Fehler spaeter beim Anrufer. */
|
||||
console.warn(`[anruf] TURN-Geheimnis nicht verwendbar: ${grund}`);
|
||||
}
|
||||
|
||||
res.json({
|
||||
adressen: Array.isArray(liste) ? liste : [],
|
||||
adressen,
|
||||
gruppe_max: GRUPPE_MAX,
|
||||
/* WAS DIE OBERFLAECHE WISSEN MUSS, um ehrlich zu sein: Ohne
|
||||
Adressen klappt der Anruf nur im selben Netz. Das gehoert
|
||||
DAVOR gesagt, nicht als Fehlermeldung danach. */
|
||||
nur_gleiches_netz: !Array.isArray(liste) || liste.length === 0,
|
||||
/* Zahlen statt Ja/Nein: Wer zaehlen kann, kann pruefen. Ein
|
||||
eingetragener TURN-Server, der mangels Geheimnis niemanden
|
||||
durchlaesst, sieht sonst genauso aus wie ein funktionierender. */
|
||||
turn_gesamt,
|
||||
turn_bereit,
|
||||
...(grund ? { turn_grund: grund } : {}),
|
||||
});
|
||||
} catch (f) {
|
||||
console.error("[anruf] Adressen:", f?.message);
|
||||
|
||||
Reference in New Issue
Block a user