Zu sehen gibt es fast nichts. Zu merken schon.
Behoben
- Eine Speichergrenze von 0 kippte bei jedem Neustart ins Gegenteil. Wer einem Konto 0 GB gab, meinte: Dieses Konto darf nichts anfragen. Beim nächsten Start machte Nexview daraus „unbegrenzt", also genau das Gegenteil, und sagte nichts dazu. Schuld war ein Umzugsschritt aus Fassung 0.19, als die 0 ihre Bedeutung wechselte, der seither bei jedem Start mitlief statt ein einziges Mal. Nexview führt jetzt Buch darüber, welcher Umzug in dieser Datenbank schon gelaufen ist. Bei einer bestehenden Installation werden die Einträge nicht geraten, sondern daraus abgeleitet, wie die Datenbank bei Ankunft aussieht, gelesen bevor das Schema angefasst wird: Die Schema-Anpassung selbst zerstört nämlich die Spuren, an denen man das Alter noch erkennt. Bricht ein Umzug mittendrin ab, bleibt ein offener Eintrag stehen und wird beim nächsten Start nachgeholt, statt eine Lücke zu hinterlassen, die der nächste Lauf falsch füllt. Was in der Vergangenheit bereits umgesprungen ist, lässt sich nicht zurückholen: Eine umgedeutete 0 sieht in der Datenbank aus wie ein absichtlich gesetztes „unbegrenzt". Betroffene Installationen bekommen beim Start eine einmalige Warnung im Protokoll, die sagt, wie viele Konten es sein könnten. Geändert wird nichts von selbst.
- Das Abzeichen im Verwaltungsmenü verschwindet wieder. Es zählte Befunde, und ein Befund bleibt wahr, solange er wahr ist. Also stand dieselbe Ziffer für immer da, auch nachdem längst jemand nachgesehen hatte. Es zählt jetzt Ungelesenes. Das bloße Abfragen gilt dabei nicht als gesehen, sonst wäre das Abzeichen weg, bevor jemand hingesehen hat.
Sicherheit
- Vier Bibliotheken gehoben, und eine Prüfung, die die nächste bemerkt. Die eingetragenen Fassungen waren am Tag ihrer Eintragung korrekt und sind seither still gealtert. Vier der elf trugen inzwischen veröffentlichte Meldungen, darunter die für Anmeldung und Verschlüsselung zuständigen. Alle vier sind gehoben, eine davon über vier Hauptversionen. Ab jetzt hält ein eigenes Werkzeug bei jedem Bau die eingetragenen Fassungen gegen die öffentliche Schwachstellen-Datenbank und bricht ab, statt bloß zu warnen. Die Ausnahmeliste wird bewusst leer ausgeliefert: Der erste Eintrag, den jemand hinzufügt, ist dann eine bewusste Handlung und kein geerbter Haufen.
- Ein Wächter, der die nächste ungeschützte Tür finden sollte, fand sie nicht. Um die Prüfungen zu testen, die die ganze Adressliste durchgehen, wurde absichtlich eine Hintertür gebaut: eine Adresse, die jedes beliebige Konto abschaltet. Sie lief durch alle 2.482 Tests, ohne dass einer anschlug. Vier Wächter hatten Löcher derselben Art, und einer hatte unbemerkt aufgehört, 90 Module überhaupt anzusehen. Alle vier sind repariert, ein fünfter deckt jetzt das ganze Backend ab statt nur die Adressen, und jeder trägt eine Bodenschwelle, die anschlägt, wenn er gar nichts geprüft hat. Das war der eigentliche Fehler: Ein Wächter, der nichts ansieht, ist für immer grün.
Unter der Haube
- Listen holen ihre Daten am Stück statt Zeile für Zeile. Die Freigabeliste fragte die Datenbank für jede Zeile einzeln nach der Bewertung: 157 Abfragen für 144 Zeilen, und es wurden mehr, je länger die Liste wurde. Jetzt sind es elf, die Benutzerliste fiel von 22 auf 9, das Dashboard von 42 auf 25. Angezeigt wird Zeichen für Zeichen dasselbe wie vorher, geprüft an 14 Adressvarianten gegen eine Kopie einer echten Datenbank. Eine Waage im Testlauf hält das fest. Sie fragt nicht, ob die Zahl klein ist, sondern ob sie mitwächst, wenn sich die Daten verdoppeln. Beim Scharfstellen fand sie sofort drei weitere Fälle derselben Art, die die gezielte Reparatur übersehen hatte.
- Die Datenbank gibt gelöschten Platz von selbst zurück. Abgelaufene Einträge im Zwischenspeicher wurden gelöscht, ihre Seiten blieben aber in der Datei, die dadurch nur wuchs: 172 MB Datei für 32 MB Inhalt. Sie stellt sich beim Start einmalig um und trägt danach nach und nach ab. Auf der gemessenen Datenbank waren das 180 MB vorher und 34 MB nachher. Der erste Start dauert dafür etwas länger, einmalig, und sagt es im Protokoll.
- Sicherungen und Einspielen gehen sich nicht mehr in die Quere. Der stündliche Sicherungstakt zog aus der Hauptschleife aus, und damit wurde es möglich, dass er einem Einspielen in die Quere kommt. Beide warten jetzt aufeinander, und das Einspielen hat die Hauptschleife ebenfalls verlassen: Bisher blockierte es jede andere Anfrage, solange es lief.
- Die Einstellungen werden je Anfrage einmal gelesen statt bis zu achtmal. Eine Seite wie das Dashboard holte sie achtmal hintereinander und leitete dabei jedes Mal den Schlüssel für jedes gespeicherte Geheimnis neu ab. Gemessen mit gesetztem
NEXVIEW_SECRET_KEYfällt eine solche Anfrage von 10,7 ms auf 1,3 ms. - Die Release-Texte reisen nicht mehr bei jedem Seitenaufruf mit. Die Texte hinter „Alles, was neu ist" waren der größte einzelne Posten im Sprachkatalog, gelesen von einem Betreiber und nur einmal nach einem Update. Sie kommen jetzt auf Abruf. Der erste Ladevorgang fällt von 822 auf 792 kB.
- Eine abgeschaltete Fremdschlüssel-Prüfung konnte im Verbindungsvorrat überleben. Verbindungen werden wiederverwendet, und die Einstellung, die Löschungen weiterreicht, wurde beim Aufbau einer Verbindung gesetzt, nicht beim Herausgeben. In der Testreihe zeigte sich das als gelöschtes Konto, dessen Tickets drei Dateien weiter stehen blieben, ohne erkennbaren Zusammenhang. Sie wird jetzt bei jeder Ausgabe gesetzt.
- Der Bau prüft den Python-Teil, und der Testlauf wartet nicht mehr auf bcrypt. Ruff läuft als eigener Schritt und bricht ab, statt zu warnen; ESLint kam mit Schwelle null dazu. Passwörter werden absichtlich langsam verrechnet, und der Testlauf zahlte diesen Preis 2.482 Mal. Tests rechnen jetzt mit niedrigem Aufwand, alles andere unverändert mit vollem. Der ganze Bau fiel von vierzig Minuten auf sieben.