CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (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
Supply-Chain-Scan (Go) / govulncheck (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
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (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 / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
4.4 KiB
4.4 KiB
API-22 – Modul-Endpunkt-Discovery – Prüfprotokoll
Geprüft auf Entwicklungshost 204, Build/Vet/Test lokal im Arbeitsverzeichnis der Ticket-Session. archivdms unberührt, Host 131 nicht angefasst.
Umsetzung
- Neues Paket
internal/moduledirectory(Core):LoadFile(path)liest und validiert eine JSON-Konfigurationsdatei (Liste aus{"key", "base_url"}),Handler(modules)liefert sie unauthentifiziert als JSON aus. - Response-Feldliste ist auf
key/base_urlbeschränkt (Akzeptanzkriterium 3) — keine Zugangsdaten, keine internen Pfade, kein Bezug zumodule_credentials/Provision/Authenticate. cmd/core/routes.go:registerModuleDirectoryRoutebindetGET /.well-known/nexarch-modulesein, bewusst außerhalb vonsvcauth.Require(unauthentifiziert, Ticket-Vorgabe für Clients, die nur die Server-Grundadresse kennen, z.B. INT-21).cmd/core/main.go: lädt die Konfigurationsdatei über neuenconfig.ModuleDirectoryPath(EnvNEXARCH_MODULE_DIRECTORY_PATH), optional — fehlt der Pfad, liefert der Endpunkt eine leere Liste statt den Dienststart zu verhindern (keine bestehende Deployment-Konfiguration wird durch diese Kachel gebrochen).- Keine Änderung an
internal/moduleregistry(Credentials/Aktivierung bleiben unverändert), keine Änderung anweb/portaloder INT-21 (Android-App) — beides laut Ticket explizit nicht Bestandteil.
Prüfungen
Prüfung 1 — Discovery-Aufruf liefert für ein bekanntes Modul die korrekte, tatsächlich erreichbare Adresse:
TestHandler_ReturnsReachableAddress(internal/moduledirectory/directory_test.go): startet einen echtenhttptest.Server, trägt dessen URL als Modul ein, ruft den Discovery-Handler auf, parst die Antwort und führt anschließend einen echtenhttp.Getgegen die zurückgegebenebase_urlaus — Roundtrip bestätigt Erreichbarkeit. Bestanden.
Prüfung 2 — neues Test-Modul nur über Konfiguration ergänzt, erscheint korrekt im Discovery-Ergebnis:
TestLoadFile_ParsesModules: JSON-Datei mit einem bestehenden (dms) und einem neuen Test-Modul (neues_testmodul), rein über die Konfigurationsdatei ergänzt, kein Code geändert. Beide erscheinen korrekt im geladenen Ergebnis. Bestanden.TestModuleDirectoryRoute_IsUnauthenticated(cmd/core/routes_test.go): Route ohne jeden Token erreichbar, Handler wird aufgerufen. Bestanden.
Prüfung 3 — kein sicherheitsrelevanter Wert im Antwort-Payload (Positivliste erlaubter Felder):
TestHandler_OnlyAllowlistedFieldsInPayload: parst die Antwort generisch (map[string]interface{}), prüft jedes Feld jedes Moduleintrags gegen die Positivliste{key, base_url}und durchsucht den rohen Payload zusätzlich nach den Begriffensecret,client_id,client_secret,password,token,internal_path,dsn. Bestanden.- Zusätzlich:
TestLoadFile_RejectsMissingFields/TestLoadFile_RejectsMissingFile(Robustheit der Konfigurationsquelle).
Build/Vet/Test
go build ./...— grün.go vet ./internal/moduledirectory/... ./cmd/core/...— grün.go test ./internal/moduledirectory/... ./cmd/core/... -v— alle 7 Tests bestanden (5 inmoduledirectory, 2 incmd/core).
QA und Entscheidungen
- Entscheidung — Konfigurationsquelle: neue, kleine JSON-Datei server-seitig (Pfad über Env), analog zu
web/portal/config/modules.jsonaus SHL-02, aber serverseitig gepflegt statt clientseitig — wie in der Ausgangslage des Tickets vorgeschlagen.internal/moduleregistry/modules-Tabelle hält keine Adressinformationen und wurde bewusst nicht erweitert, um den Datenbank-Registrierungspfad (API-02) von der reinen Adress-Konfiguration zu trennen. - Entscheidung — Pfad optional statt Pflichtfeld: anders als die übrigen
config.Load()-Felder istNEXARCH_MODULE_DIRECTORY_PATHoptional (leere Liste statt Fatal), damit bestehende Deployments ohne diese neue Datei weiterlaufen, bis eine echte Konfiguration gepflegt ist. - 0 blockierende Iterationen.
Offen
web/portal(SHL-02) migriert seine statische Konfiguration nicht auf diesen Endpunkt — laut Ticket ausdrücklich ein späteres, nicht ticketiertes Follow-up.- INT-21 (Android-App) bleibt beim Zwei-Felder-Workaround — laut Ticket ausdrücklich nicht Bestandteil.
- Es existiert noch keine gepflegte Produktions-
modules-directory.jsonauf den Zielhosts; das Anlegen/Pflegen dieser Datei ist Deployment-/Betriebsaufgabe, nicht Teil dieser Codeänderung.