Files
patrickandClaude Sonnet 5 e57b0d23b6
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) 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 / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (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
Core-Schnittstellen-Vertragstests / contract-tests (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
API-16: persistente modul-signaturschlüssel und rotation
Signaturschluessel der Modul-JWTs liegen verschluesselt in der Mandanten-Datenbank
(module_signing_keys), werden von mehreren Instanzen geteilt und rotieren mit
Ueberlappung; nicht lesbarer Speicher ergibt 503 statt Token/JWKS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 23:42:00 +02:00

42 lines
1.1 KiB
Go

package main
import (
"testing"
"time"
)
func envMap(m map[string]string) func(string) string {
return func(k string) string { return m[k] }
}
func TestParseModuleKeyConfig_DefaultsAndBounds(t *testing.T) {
c, err := parseModuleKeyConfig(envMap(nil))
if err != nil {
t.Fatal(err)
}
if c.ephemeral || c.rotationInterval != 30*24*time.Hour || c.activationDelay != 2*time.Minute || c.refreshInterval != 30*time.Second {
t.Fatalf("standardwerte: %+v", c)
}
bad := []map[string]string{
{envKeysEphemeral: "ja"},
{envKeyRotationDays: "-1"},
{envKeyRotationDays: "abc"},
{envKeyActivationSecs: "59"},
{envKeyActivationSecs: "3601"},
{envKeyRefreshSecs: "0"},
{envKeyRefreshSecs: "301"},
{envKeyActivationSecs: "60", envKeyRefreshSecs: "120"},
}
for _, m := range bad {
if _, err := parseModuleKeyConfig(envMap(m)); err == nil {
t.Errorf("konfiguration %v wurde akzeptiert", m)
}
}
c, err = parseModuleKeyConfig(envMap(map[string]string{envKeysEphemeral: "true", envKeyRotationDays: "0"}))
if err != nil || !c.ephemeral || c.rotationInterval != 0 {
t.Fatalf("ephemeral/rotation aus: %+v %v", c, err)
}
}