CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
8.8 KiB
8.8 KiB
API-01 – Connect-Konfigurationsoberfläche: Prüfprotokoll
Stand: 2026-10-16, Branch feature/api-01-01-connect-konfigurationsoberflaeche-connectoren-einrichten, geprüft auf Entwicklungshost 204 (eigene Wegwerf-DBs api01_connect/api01_connect_a11y, Rolle api01_connect_test; archivdms unberührt).
Umsetzung
- Backend:
connect/internal/connectorcatalog(neu) ist der statische Katalog der Connector-Typen (erp,crm,m365,backup,datev), je mit Zugangsdaten-Art (API-Key/OAuth2) und NEXARCH-Feld-Schema fürfieldmapping.connect/internal/credentialbekommtListForTenantund die reine FunktionMask(feste Maske••••+ letzte 4 Zeichen, ab 8 Zeichen Länge vollständig verdeckt) — Erweiterung von ENG-02, kein Eingriff in dessen bestehende Methoden.connect/internal/connectorsetupapi(neu) bindet beides an HTTP: Katalog lesen, Verbindungen anlegen/maskiert auflisten (ENG-02), Feld-Mapping lesen/speichern (ENG-04). Identität übergangsweise überX-User-Id/X-Tenant-Slug, gleiches Muster wiestatusapi/dms2importapi. - Schlüsselverwaltung:
connect-appbraucht fürcredential.Storeeinen KEK-Provider. Da API-10/API-12 (Core-KMS-Client) noch nicht existieren, liestconnect-appeinen einzigen, operatorseitig vorgegebenen Schlüssel ausNEXARCH_CONNECT_APP_KEK(base64, 32 Byte) — übergangsweise, bis der echte KMS-Client existiert, nie im Code. - Oberfläche:
web/connect-setup(Next.js/React,@nexarch/shl-Design-System, gleiches Turbopack-Symlink→Kopie-Muster wieweb/connect-status). Eine Seite/setup: Formular „Neue Verbindung" (Connector-Typ, Instanz-Kennung, Zugangsdaten je nach Art), Tabelle „Eingerichtete Verbindungen" mit maskierten Zugangsdaten, Feld-Mapping-Editor je Verbindung (ein Textfeld je Schema-Feld, Pflichtfelder markiert). - Test-Fixture:
connect/cmd/setup-a11y-fixture— CORS-Kopie vonconnect-app, analogstatus-a11y-fixture. Der Produktionsdienst bleibt ohne CORS.
Akzeptanzkriterien
- Connector lässt sich vollständig über die Oberfläche einrichten, ohne Konfigurationsdatei — erfüllt. Connector-Typ, Instanz-Kennung, Zugangsdaten und Feld-Mapping werden ausschließlich über Formulare erfasst und per HTTP an
connectorsetupapigesendet; keine YAML-/Env-Datei pro Connector-Instanz nötig. - Zugangsdaten werden nur maskiert angezeigt, nie im Klartext — erfüllt.
credential.Maskliefert serverseitig nur••••+ höchstens 4 Zeichen; die Oberfläche zeigt ausschließlich diesen Wert, Eingabefelder für neue Zugangsdaten werden nach dem Speichern geleert statt den Wert zurückzuspiegeln. - Feld-Mapping ist über die Oberfläche bearbeitbar — erfüllt. Mapping-Editor liest den aktiven Stand (
fieldmapping.Store.GetActive) und speichert Änderungen als neue Version (Save), inklusive Ablehnung bei ungültigem Mapping (ENG-04 AC2).
Prüfungen
Alle drei Prüfungen wurden sowohl als automatisierter Test (Go-Integrationstest gegen echte Postgres-Wegwerf-DB, Vitest mit echtem Komponenten-Rendering) als auch in einem echten Browserlauf durchgeführt.
- Vollständige Einrichtung eines Testconnectors über die Oberfläche erfolgreich — bestanden.
- Go:
TestFullConnectorSetup_WithoutConfigFile(connect/internal/connectorsetupapi) — Katalog abrufen, Verbindungerp/acme-erp-1perPUTanlegen, Mapping speichern, Verbindung in der Liste wiederfinden. - Vitest:
richtet einen Testconnector vollstaendig ueber das Formular ein— Formular ausgefüllt, abgesendet, neue Zeile in der Tabelle sichtbar. - Echter Browserlauf (
web/a11y-audit/connect-setup-run.sh, Chrome stable via puppeteer-core, echtersetup-a11y-fixture-Dienst gegen echte Postgres-Daten): Connector-Typ „ERP-System" gewählt, Instanz-Kennungbrowser-test-erp-1und ein synthetischer API-Schlüssel eingegeben, Formular abgesendet — ErgebnisOK: Pruefung 1.
- Go:
- Zugangsdaten in der Oberfläche im Test nachweislich maskiert — bestanden.
- Go:
TestListConnections_CredentialsAreMasked— Antwortkörper der Verbindungsliste enthält das eingegebene Geheimnis an keiner Stelle (strings.Contains-Prüfung), maskierter Wert beginnt mit••••. - Vitest:
zeigt Zugangsdaten in der Verbindungsliste nur maskiert. - Echter Browserlauf: nach dem Anlegen der Verbindung enthält das gerenderte DOM (
page.content()) das eingegebene Geheimnistestconnector-geheimnis-7788991100nachweislich nicht; die Tabelle zeigt••••1100— ErgebnisOK: Pruefung 2.
- Go:
- Mapping-Änderung über die Oberfläche im Test korrekt übernommen — bestanden.
- Go:
TestMapping_ChangeIsPickedUpOnNextRead— Mapping speichern (Version 1), ändern (Version 2), erneut lesen liefert den geänderten Wert. - Vitest:
uebernimmt eine Mapping-Aenderung korrekt— Feld geändert, gespeichert,saveMappingmit den erwarteten Einträgen aufgerufen, neue Version angezeigt. - Echter Browserlauf: Feld
kundennummeraufdebitorennummergesetzt, gespeichert, Seite neu geladen (nicht nur lokaler React-State) und Mapping-Editor erneut geöffnet — der Wertdebitorennummerist weiterhin im Eingabefeld sichtbar — ErgebnisOK: Pruefung 3.
- Go:
Läufe auf 204
go build ./...,go vet ./...,gofmt -l .(für die neu/ geänderten Dateien): sauber.go test -count=1 -p 1 ./...(echte Postgres-Wegwerf-DBapi01_connect, Rolleapi01_connect_test): alle 30 Paketeok, inkl.connectorcatalog,connectorsetupapi(neu) undcredential(erweitert).web/connect-setup:tsc --noEmitsauber,vitest run4/4,next builderfolgreich (Routen/,/setup).- Echter Browserlauf (
web/a11y-audit/connect-setup-run.sh, DBapi01_connect_a11y): alle drei Formular-InteraktionsprüfungenOK, anschließender axe-Audit 0 Verstöße, 0 offene Befunde in hell und dunkel, kein horizontaler Überlauf, Tastaturerreichbarkeit 5/5 interaktive Elemente, sichtbarer Fokusring,lang="de". - Rückbau: Ports 9591/4191 (Testlauf) sind nach Skriptende frei (
ss -ltnpleer), kein Prozess- oder Verzeichnisrest auf 204.
QA und Entscheidungen
- Connector-Katalog als statische Liste im neuen Backend-Paket statt Erweiterung von
registry.Connector:ENG-01s Registrierungsschnittstelle kennt pro Instanz nurMetadata()(Name/Version/Operationen), kein Feld-Schema. Eine Erweiterung dieser Schnittstelle oder der bestehenden Connector-Pakete (erpconnector,crmconnector, …) hätte deren Scope verlassen (kein Teil von API-01). Der Katalog ist reine Beschreibungsdaten für die Oberfläche, ohne Datenbanktabelle — kleinste Lösung. - Übergangsweiser env-basierter KEK statt echtem KMS-Client:
credential.Storewar seit ENG-02 nur in Tests verdrahtet, nie in einem laufenden Dienst — ohne einen KEKProvider lässt sich die Oberfläche nicht real betreiben. API-10/API-12 (echter Core-KMS-Client) sind eigene, noch nicht gemergte Tickets; ein einzelner, ausNEXARCH_CONNECT_APP_KEKgelesener Schlüssel schließt genau diese Lücke, ohne deren Scope vorzugreifen. - Maskierung als feste Zeichenkette (
••••+ max. 4 Zeichen, ab 8 Zeichen Länge volle Verdeckung) statt reiner Längenangabe: verhindert, dass die maskierte Anzeige selbst die Geheimnislänge verrät, und bleibt trotzdem erkennbar genug, um mehrere Verbindungen gleichen Typs zu unterscheiden. - Eigener Browser-Interaktions-Lauf (
connect-setup-interaction-check.js) zusätzlich zum bestehendenaudit.js:audit.jslädt nur Seiten und prüft sie statisch; API-01 verlangt aber reale Dateneingabe (Formular ausfüllen, Connector anlegen, Mapping ändern). Das neue Skript nutzt dieselbe puppeteer-core-Infrastruktur, führt aber echte Klick-/Eingabeinteraktionen aus und prüft danach das gerenderte DOM — stärkerer Nachweis als ein reiner Vitest-Mock-Test. - 2 Fix-Iterationen (von bis zu 20 erlaubten):
aria-labelauf einem<span>ohne passende Rolle löste eine axe-incomplete-Meldung aus (behoben durchdata-masked="true"stattaria-label);A11Y_NODE_MODULES-Pfad auf 204 liegt unter/usr/lib/..., nicht dem im bestehendenaudit.js-Kommentar vermuteten/usr/local/lib/...(per Env-Variable korrigiert, kein Code-Eingriff inaudit.jsnötig).
Fazit
Alle drei Akzeptanzkriterien und alle drei geforderten Prüfungen sind erfüllt und belegt (automatisierter Test plus echter Browserlauf je Kriterium). API-01 gilt als vollständig umgesetzt.
Nicht Teil dieser Kachel
API-02Verbindungsstatus-Übersicht & Diagnose (bereits fertig, nicht hier dupliziert).- Verbindungs-Widerruf über die Oberfläche:
ENG-02sStore.Revokeexistiert bereits, ist aber kein Akzeptanzkriterium dieser Kachel und wurde daher nicht an die Oberfläche angebunden. - Bildschirmleser-Stichprobe: nicht durchgeführt, gleiche organisatorische Lücke wie bei UX-06/UX-07/API-02 (kein NVDA/VoiceOver auf dem Testhost).