@@ -66,6 +66,24 @@ const HOECHSTENS = 2;
//: jedes Ereignis, und die Seite stuende stumm bis zum Seitenwechsel.
const AUFBAU _GRENZE = 12000 ;
//: Verfahren, die im Browser keinen Schluesseltausch kosten.
//:
//: Der Grund steht in der Bibliothek, `core/ra2.js`: fuer RA2ne erzeugt der
//: **Browser** bei jeder Sitzung ein eigenes 2048-Bit-RSA-Schluesselpaar, in
//: JavaScript. Die Primzahlsuche dafuer dauert ein bis drei Minuten -- genau
//: die Zeit, die zwischen Klick und Bild lag. "Ohne Authentifizierung" (1)
//: kostet davon nichts.
//:
//: Deshalb kommt es zuerst, **wenn der Server es anbietet** und wir nicht
//: ohnehin schon wissen, was hier traegt. Das ist nicht dieselbe Vorauswahl
//: wie in 2.8.14: die war geraten, diese steht auf einer Messung. Traegt sie
//: nicht, nimmt der zweite Anlauf die Reihenfolge des Servers -- dann dauert
//: es eben.
const OHNE _SCHLUESSELTAUSCH = new Set ( [ 1 ] ) ;
//: RA2ne. Wird es ausgehandelt, ist die Wartezeit erklaerbar und kein Fehler.
const RA2NE = 6 ;
//: Tastenkombinationen, die der Arbeitsplatz selbst abfaengt und die deshalb
//: einen Knopf brauchen. X11-Keysyms.
const ALT _LINKS = 0xffe9 ;
@@ -196,6 +214,17 @@ export function starteSitzung(wurzel, quelle) {
versuche += 1 ;
window . clearTimeout ( aufbauUhr ) ;
aufbauUhr = window . setTimeout ( ( ) => {
// Ein ausgehandeltes RA2ne ist kein Fehler, sondern Rechenzeit: der
// Browser erzeugt dafuer gerade einen 2048-Bit-Schluessel. Das zu
// melden ist das Gegenteil einer Warnung -- es nimmt die Sorge.
if ( rfb && rfb . _rfbAuthScheme === RA2NE ) {
melden (
"Der Server verlangt RA2ne (RSA-AES). Dafür erzeugt der Browser ein " +
"2048-Bit-Schlüsselpaar – das dauert ein bis drei Minuten. Bitte warten." ,
"warnung" ,
) ;
return ;
}
melden ( "Es kommt keine Antwort. Wird geprüft, woran es liegt …" , "warnung" ) ;
streckeTesten ( ) . then ( ( steht ) => {
melden (
@@ -212,18 +241,28 @@ export function starteSitzung(wurzel, quelle) {
} ) ;
} , AUFBAU _GRENZE ) ;
// Zw ei Regeln, beid e aus Erfahr ung und keine aus Vermutung:
// Dr ei Regeln, all e aus Mess ung und keine aus Vermutung:
//
// 1. Was schon einmal getragen hat, kommt zuerst -- aber nur beim ersten
// Anlauf. Ohne das faengt jede Sitzung wieder mit der ersten Wahl des
// Servers an, die hier schon abgerissen ist, und ein sperrender
// RealVNC Server laesst sich mit der Absage Minuten Zeit.
// 2. Was abgerissen ist, wird nicht noch einmal gewaehlt .
// 1. Was schon einmal getragen hat, kommt zuerst.
// 2. Sonst das Verfahren ohne Schluesseltausch -- aber nur, wenn der
// Server es nachweislich anbietet (sonst faende noVNC gar keines und
// scheiterte sofort). RA2ne kostet sonst ein bis drei Minuten
// Rechenzeit im Browser, jedes Mal .
// 3. Was abgerissen ist, wird nicht noch einmal gewaehlt.
//
// Beides gilt nur fuer den **ersten** Anlauf; danach zaehlt die
// Reihenfolge des Servers, abzueglich dessen, was schon abgerissen ist.
const bewaehrt = daten . bewaehrt || 0 ;
const zuerst = versuche === 1 && bewaehrt > 0 && ! gescheitert . has ( bewaehrt ) ;
const angeboten = daten . verfahren || [ ] ;
const schnell = angeboten . filter ( ( typ ) => OHNE _SCHLUESSELTAUSCH . has ( typ ) ) ;
let bevorzugt = 0 ;
if ( versuche === 1 ) {
if ( bewaehrt > 0 && ! gescheitert . has ( bewaehrt ) ) bevorzugt = bewaehrt ;
else if ( schnell . length && ! gescheitert . has ( schnell [ 0 ] ) ) bevorzugt = schnell [ 0 ] ;
}
RFB . prototype . _isSupportedSecurityType = function ( typ ) {
if ( gescheitert . has ( typ ) ) return false ;
if ( zuerst ) return typ === bewaehrt ;
if ( bevorzugt ) return typ === bevorzugt ;
return istUnterstuetzt . call ( this , typ ) ;
} ;