Skip to content

fix(core,openapi): Behebung von vier kritischen Fehlern#519

Open
timpara wants to merge 1 commit intoSVWS-NRW:devfrom
timpara:timpara/fix-critical-ts-core-bugs
Open

fix(core,openapi): Behebung von vier kritischen Fehlern#519
timpara wants to merge 1 commit intoSVWS-NRW:devfrom
timpara:timpara/fix-critical-ts-core-bugs

Conversation

@timpara
Copy link
Copy Markdown
Contributor

@timpara timpara commented Apr 21, 2026

Zusammenfassung

Dieser PR behebt vier kritische Fehler, die bei einer Triage des Repositories aufgefallen sind. Betroffen sind drei hand-gepflegte Java-Stdlib-Polyfills im TypeScript-Core (svws-webclient/core/src/java/**) sowie der CORS-Filter der OpenAPI-Schicht. Alle Änderungen sind mit deutschsprachigen Kommentaren versehen.

Änderungen

1. svws-webclient/core/src/java/util/Random.ts

Die bisherige Implementierung hat den Konstruktor-Parameter seed ignoriert und intern Math.random() verwendet, sodass new Random(seed) nicht reproduzierbar war. Für die aus Java transpilierten Algorithmen (z.B. Kursblockung, Stundenplanung) ist ein deterministischer PRNG aber zwingend erforderlich.

  • Implementierung eines seed-basierten Mulberry32-PRNG (32-Bit-Zustand).
  • nextInt(bound) und nextLong(bound) werfen nun IllegalArgumentException, wenn bound nicht positiv ist - analog zu java.util.Random.
  • nextDouble() und nextBoolean() nutzen den neuen Generator.
  • Der bisherige TODO-Kommentar zum Seed wurde aufgelöst.

2. svws-webclient/core/src/java/util/Arrays.ts

Arrays.copyOf(original, newLength) hat newLength bisher komplett ignoriert und das Eingabe-Array unverändert kopiert. Das Verhalten weicht damit von java.util.Arrays.copyOf ab und führt bei Aufrufern, die auf eine bestimmte Ziellänge angewiesen sind, zu falschen Ergebnissen.

  • Das Ergebnis hat nun exakt newLength Elemente.
  • Überschüssige Elemente werden beim Kürzen verworfen, fehlende Elemente mit null aufgefüllt (Java-Default für Objekt-Arrays).
  • Negative newLength-Werte werden abgelehnt.

3. svws-webclient/core/src/java/lang/JavaString.ts

JavaString.matches(s, regex) hat intern RegExp.test verwendet und damit bereits bei Teil-Treffern true geliefert. String.matches in Java erfordert dagegen einen vollständigen Match.

  • Das Muster wird nun mit ^(?:...)$ verankert, sodass die Java-Semantik eingehalten wird und Alternativen (a|b) korrekt geklammert sind.

4. svws-openapi/.../OpenAPICorsFilter.java

Der Filter sendet bisher gleichzeitig Access-Control-Allow-Origin: * und Access-Control-Allow-Credentials: true. Diese Kombination ist laut CORS-Spezifikation unzulässig und wird von aktuellen Browsern (Chrome, Firefox, Safari) abgelehnt, wodurch credential-basierte Cross-Origin-Anfragen fehlschlagen.

  • Ist ein Origin-Header in der Anfrage vorhanden, wird dieser zurückgespiegelt und zusätzlich Vary: Origin gesetzt, damit Caches zwischen unterschiedlichen Ursprüngen unterscheiden.
  • Access-Control-Allow-Credentials: true wird nur gesendet, wenn ein Origin zurückgegeben wird.
  • Access-Control-Max-Age wird jetzt als String übergeben (statt als int), was dem erwarteten Header-Format entspricht.

Testplan

  • Die Änderungen sind lokal syntaktisch geprüft; ein vollständiger Build/Testlauf konnte in der Entwicklungsumgebung nicht ausgeführt werden (kein installierter Dependency-Cache).
  • Für die Maintainer bitte mit ./gradlew build und npm run -w @svws-nrw/svws-core build test verifizieren.
  • Manuelle Prüfung des CORS-Filters mittels curl -H "Origin: https://example.test" -I <svws-endpoint> - im Response darf Access-Control-Allow-Origin nicht * sein, solange ein Origin gesendet wurde.

Hinweise für Reviewer

  • Der Branch ist auf dev rebased und enthält einen einzelnen Commit, sodass er sich für den üblichen Squash-Merge eignet.
  • Weitere, nicht-kritische Fehler (u.a. HashMap.putAll-Kurzschluss, Pfad-Typo @Path("/guppe/remove"), JavaString.compareTo Locale-Verhalten) sind in einem separaten Triage-Bericht dokumentiert und können bei Interesse in Folge-PRs adressiert werden.

- java/util/Random: Implementierung eines deterministischen Mulberry32-PRNG,
  damit Random(seed) reproduzierbare Folgen liefert. nextInt/nextLong werfen
  nun IllegalArgumentException bei nicht-positivem bound (Java-Kontrakt).
- java/util/Arrays.copyOf: Berücksichtigt jetzt den Parameter newLength
  (Kürzen bzw. Auffüllen mit null) statt stets das Original zu kopieren.
- java/lang/JavaString.matches: Muster wird mit ^(?:...)$ verankert, damit
  die Java-Semantik (vollständiger Match) eingehalten wird.
- OpenAPICorsFilter: Spiegelt den Origin-Header zurück und setzt Vary:Origin;
  Access-Control-Allow-Credentials nur bei vorhandenem Origin. Max-Age wird
  als String gesendet. Behebt die Browser-Ablehnung der Kombination
  'Allow-Origin: *' mit 'Allow-Credentials: true'.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant