Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
08d54715d4 |
@@ -1,38 +0,0 @@
|
|||||||
name: Supply-Chain-Scan (Go)
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- "**/*.go"
|
|
||||||
- "go.mod"
|
|
||||||
- "go.sum"
|
|
||||||
pull_request: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
govulncheck:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: "1.22"
|
|
||||||
- name: govulncheck installieren
|
|
||||||
# @latest kann eine govulncheck-Version verlangen, die neuer ist als
|
|
||||||
# die hier verwendete Go-Toolchain (z.B. "requires go >= 1.25.0") —
|
|
||||||
# feste, bekannt kompatible Version statt @latest (siehe
|
|
||||||
# scripts/verify-supply-chain-gate.sh, Fund vom 2026-08-28 auf dem Testhost).
|
|
||||||
run: go install golang.org/x/vuln/cmd/govulncheck@v1.1.3
|
|
||||||
- name: Go-Module auf bekannte Schwachstellen pruefen
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
# pipefail ist Pflicht: sonst liefert "govulncheck | tee" den Exit-Code
|
|
||||||
# von tee (immer 0) statt den von govulncheck zurueck — der Gate-Zweck
|
|
||||||
# (Akzeptanzkriterium 3: Fund blockiert den Merge) waere sonst wirkungslos.
|
|
||||||
set -o pipefail
|
|
||||||
govulncheck ./... | tee govulncheck-report.txt
|
|
||||||
- name: Scan-Bericht als Artefakt ablegen
|
|
||||||
if: always()
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: govulncheck-report
|
|
||||||
path: govulncheck-report.txt
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
name: Supply-Chain-Scan (npm)
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- "web/**/package.json"
|
|
||||||
- "web/**/package-lock.json"
|
|
||||||
pull_request: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
npm-audit:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: "22"
|
|
||||||
- name: Alle Next.js-Frontends auf bekannte Schwachstellen pruefen
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
set -o pipefail
|
|
||||||
status=0
|
|
||||||
for pkg in $(find web -maxdepth 2 -name package.json); do
|
|
||||||
dir=$(dirname "$pkg")
|
|
||||||
echo "=== npm audit: $dir ==="
|
|
||||||
(cd "$dir" && npm install --package-lock-only --no-audit --no-fund \
|
|
||||||
&& npm audit --audit-level=high) || status=1
|
|
||||||
done
|
|
||||||
# Erst nach Durchlauf ALLER Frontends fehlschlagen (Akzeptanzkriterium 2/3):
|
|
||||||
# ein einzelner Fund darf nicht verhindern, dass die uebrigen Frontends
|
|
||||||
# ebenfalls geprueft und im Bericht sichtbar werden.
|
|
||||||
exit $status
|
|
||||||
@@ -44,53 +44,3 @@ Keine Commits in dieser Session.
|
|||||||
Keine Änderungen ermittelbar.
|
Keine Änderungen ermittelbar.
|
||||||
|
|
||||||
---
|
---
|
||||||
## 2026-08-28 23:00 – 23:01 (0m)
|
|
||||||
**Beschreibung:** Claude Code Session
|
|
||||||
**Projekt:** nexarch
|
|
||||||
|
|
||||||
### Commits
|
|
||||||
- ab7a033 OPS-06: fix — fixture ruft tatsaechlich verwundbaren symbolpfad auf (ParseAcceptLanguage statt Parse, GO-2022-1059 statt falscher advisory-id)
|
|
||||||
|
|
||||||
### Geänderte Dateien
|
|
||||||
- testdata/vulnfixture-go/go.mod | 8 +++++---
|
|
||||||
- testdata/vulnfixture-go/main.go | 7 +++++--
|
|
||||||
|
|
||||||
---
|
|
||||||
## 2026-08-28 23:02 – 23:03 (0m)
|
|
||||||
**Beschreibung:** Claude Code Session
|
|
||||||
**Projekt:** code
|
|
||||||
|
|
||||||
### Commits
|
|
||||||
- 77ecf42 OPS-06: fix — verify-supply-chain-gate.sh unterscheidet jetzt echten Fund von Werkzeugfehler (pruefte vorher nur exit-code, 'command not found' galt faelschlich als bestanden)
|
|
||||||
|
|
||||||
### Geänderte Dateien
|
|
||||||
- DEVLOG.md | 12 ++++++++++++
|
|
||||||
- scripts/verify-supply-chain-gate.sh | 52 +++++++++++++++++++++++++++++++++++++---------------
|
|
||||||
|
|
||||||
---
|
|
||||||
## 2026-08-28 23:04 – 23:05 (0m)
|
|
||||||
**Beschreibung:** Claude Code Session
|
|
||||||
**Projekt:** code
|
|
||||||
|
|
||||||
### Commits
|
|
||||||
- 9de84f6 OPS-06: fix — fehlendes fail=1 im govulncheck-unavailable-zweig, govulncheck-version gepinnt statt @latest (Go-Versionskonflikt auf 131 gefunden)
|
|
||||||
|
|
||||||
### Geänderte Dateien
|
|
||||||
- .gitea/workflows/govulncheck.yml | 6 +++++-
|
|
||||||
- DEVLOG.md | 12 ++++++++++++
|
|
||||||
- scripts/verify-supply-chain-gate.sh | 13 +++++++++++--
|
|
||||||
|
|
||||||
---
|
|
||||||
## 2026-08-28 23:05 – 23:05 (0m)
|
|
||||||
**Beschreibung:** Claude Code Session
|
|
||||||
**Projekt:** code
|
|
||||||
|
|
||||||
### Commits
|
|
||||||
Keine Commits in dieser Session.
|
|
||||||
|
|
||||||
### Geänderte Dateien
|
|
||||||
- .gitea/workflows/govulncheck.yml | 6 +++++-
|
|
||||||
- DEVLOG.md | 12 ++++++++++++
|
|
||||||
- scripts/verify-supply-chain-gate.sh | 13 +++++++++++--
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
run:
|
||||||
|
timeout: 3m
|
||||||
|
|
||||||
|
linters:
|
||||||
|
disable-all: true
|
||||||
|
enable:
|
||||||
|
- govet
|
||||||
|
- staticcheck
|
||||||
|
- errcheck
|
||||||
|
- unused
|
||||||
|
- ineffassign
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
.PHONY: install run run-app run-worker lint fmt test build
|
||||||
|
|
||||||
|
# Akzeptanzkriterium 1: ein Befehl installiert+startet App und Worker.
|
||||||
|
install: build
|
||||||
|
|
||||||
|
build:
|
||||||
|
go build ./...
|
||||||
|
|
||||||
|
run: build
|
||||||
|
@echo "Starte dms-app und dms-worker (Strg+C zum Beenden beider)"
|
||||||
|
@trap 'kill 0' EXIT; \
|
||||||
|
go run ./cmd/app & \
|
||||||
|
go run ./cmd/worker & \
|
||||||
|
wait
|
||||||
|
|
||||||
|
run-app:
|
||||||
|
go run ./cmd/app
|
||||||
|
|
||||||
|
run-worker:
|
||||||
|
go run ./cmd/worker
|
||||||
|
|
||||||
|
# Akzeptanzkriterium 2: Lint-/Format-Checks laufen lokal durch.
|
||||||
|
lint:
|
||||||
|
golangci-lint run ./...
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
gofmt -l .
|
||||||
|
@test -z "$$(gofmt -l .)" || (echo "gofmt-Verstoesse gefunden, siehe oben" && exit 1)
|
||||||
|
|
||||||
|
test:
|
||||||
|
go test ./... -count=1
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# NEXARCH DMS
|
||||||
|
|
||||||
|
Dokumentenmanagement-Modul von NEXARCH. Vereint die Stärken von
|
||||||
|
paperless-ngx, Alfresco, Docspell und ecoDMS, vermeidet deren bekannte
|
||||||
|
Schwächen (siehe `known-issues-archivdms.md` im `dms-kanban/`-Ordner).
|
||||||
|
|
||||||
|
Identität, Rechte, Mandantenverwaltung, Authentifizierung, UI-Shell,
|
||||||
|
API-Grundgerüst und Benachrichtigungen kommen aus NEXARCH Core (siehe
|
||||||
|
`../` bzw. `../../core-kanban/`) — dieses Modul implementiert nur die
|
||||||
|
DMS-eigene Logik.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Voraussetzung: Go 1.22+.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd dms
|
||||||
|
make install # baut App und Worker
|
||||||
|
make run # startet beide (Strg+C beendet beide)
|
||||||
|
```
|
||||||
|
|
||||||
|
App läuft danach auf `:8090` (überschreibbar über
|
||||||
|
`NEXARCH_DMS_APP_LISTEN_ADDR`), `GET /healthz` liefert den Status.
|
||||||
|
|
||||||
|
## Struktur
|
||||||
|
|
||||||
|
- `cmd/app` — Anfrage-Dienst (HTTP), blockiert nie durch lange Aufgaben
|
||||||
|
- `cmd/worker` — Hintergrund-Dienst für lange laufende Aufgaben (Indexierung,
|
||||||
|
OCR, Storage-Vorgänge — folgen in FDN-02 ff.)
|
||||||
|
- `internal/shared` — von App und Worker gemeinsam genutzter Code
|
||||||
|
|
||||||
|
## Prüfungen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make fmt # gofmt-Verstöße brechen ab
|
||||||
|
make lint # golangci-lint
|
||||||
|
make test # go test ./...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Branch- und Commit-Konvention
|
||||||
|
|
||||||
|
Gleiche Konvention wie NEXARCH Core:
|
||||||
|
|
||||||
|
- Branch je Ticket: `feature/<ticket-code>-<kurzbeschreibung>`, z. B.
|
||||||
|
`feature/fdn-02-datenmodell-migrationen`
|
||||||
|
- Commit-Nachricht beginnt mit dem Ticket-Code, z. B.
|
||||||
|
`FDN-02: datenmodell & migrationen`
|
||||||
|
- Ein Ticket = ein Branch. Schrittweise committen, Branch pushen, dann
|
||||||
|
anhalten (kein Merge, kein Deploy durch die bearbeitende Person selbst).
|
||||||
|
- Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
|
||||||
|
- Keine Zugangsdaten/Schlüssel/Verbindungszeichenfolgen im Code —
|
||||||
|
ausschließlich über Umgebungsvariablen.
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// app ist der Anfrage-Dienst (Request-Path) des DMS — getrennt vom Worker,
|
||||||
|
// damit lange Hintergrundaufgaben nie eine HTTP-Anfrage blockieren
|
||||||
|
// (Akzeptanzkriterium/Produkt-DNA: paperless-ngx-Trennung Dienst/Worker).
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"gitea.perlbach24.de/scripte/nexarch/dms/internal/shared"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
addr := os.Getenv("NEXARCH_DMS_APP_LISTEN_ADDR")
|
||||||
|
if addr == "" {
|
||||||
|
addr = ":8090"
|
||||||
|
}
|
||||||
|
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
_, _ = w.Write([]byte(`{"status":"ok","service":"dms-app","version":"` + shared.Version + `"}`))
|
||||||
|
})
|
||||||
|
|
||||||
|
log.Printf("dms-app hoert auf %s (version %s)", addr, shared.Version)
|
||||||
|
if err := http.ListenAndServe(addr, mux); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestHealthz ist der Nachweis, dass der App-Dienst tatsaechlich startet und
|
||||||
|
// antwortet (Akzeptanzkriterium 1: "mit einem Befehl installieren und
|
||||||
|
// starten") — geprueft ueber den Handler direkt statt einen echten Port zu
|
||||||
|
// binden, damit der Test parallel und ohne Portkonflikte laufen kann.
|
||||||
|
func TestHealthz(t *testing.T) {
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
_, _ = w.Write([]byte(`{"status":"ok","service":"dms-app","version":"test"}`))
|
||||||
|
})
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodGet, "/healthz", nil)
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
mux.ServeHTTP(rec, req)
|
||||||
|
|
||||||
|
if rec.Code != http.StatusOK {
|
||||||
|
t.Fatalf("status = %d, want %d", rec.Code, http.StatusOK)
|
||||||
|
}
|
||||||
|
if !strings.Contains(rec.Body.String(), `"status":"ok"`) {
|
||||||
|
t.Fatalf("unerwarteter body: %s", rec.Body.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// worker ist der Hintergrund-Dienst des DMS — verarbeitet lange laufende
|
||||||
|
// Aufgaben (Indexierung, OCR, Storage-Vorgaenge in spaeteren Kacheln),
|
||||||
|
// getrennt vom App-Prozess (siehe cmd/app).
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"gitea.perlbach24.de/scripte/nexarch/dms/internal/shared"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log.Printf("dms-worker gestartet (version %s)", shared.Version)
|
||||||
|
|
||||||
|
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
||||||
|
defer stop()
|
||||||
|
|
||||||
|
ticker := time.NewTicker(30 * time.Second)
|
||||||
|
defer ticker.Stop()
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
log.Println("dms-worker beendet")
|
||||||
|
return
|
||||||
|
case <-ticker.C:
|
||||||
|
// Platzhalter fuer Job-Verarbeitung (FDN-02 ff.) — Poll-Intervall
|
||||||
|
// folgt der projektweiten Postgres-Jobqueue-Konvention.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# FDN-01 – Prüfprotokoll: Repository & Projektgerüst
|
||||||
|
|
||||||
|
Welle 1, keine Vorbedingungen. Verzeichnis `code/dms/` im bestehenden
|
||||||
|
NEXARCH-Repository (Monorepo-Entscheidung, siehe Rückfrage im
|
||||||
|
Session-Verlauf: DMS als Unterordner statt eigenes Gitea-Repo).
|
||||||
|
|
||||||
|
## Struktur
|
||||||
|
|
||||||
|
- `cmd/app` — Anfrage-Dienst (HTTP, Port 8090 per Default)
|
||||||
|
- `cmd/worker` — Hintergrund-Dienst (getrennter Prozess)
|
||||||
|
- `internal/shared` — gemeinsam genutzter Code
|
||||||
|
- `go.mod` — eigenes Modul `gitea.perlbach24.de/scripte/nexarch/dms`,
|
||||||
|
unabhängig vom Core-Modul (kein gemeinsames `go.mod`, um Abhängigkeits-
|
||||||
|
versionen beider Module unabhängig weiterzuentwickeln)
|
||||||
|
|
||||||
|
## Prüfungen
|
||||||
|
|
||||||
|
| # | Prüfung | Zielwert | Ergebnis |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 1 | Frischer Clone baut ohne manuelle Nacharbeit | `make install` läuft ohne Fehler | **bestanden** — `go build ./...` clean auf 192.168.1.131 |
|
||||||
|
| 2 | Lint-Fehler brechen den Build ab | `make lint` liefert Exit-Code ≠ 0 bei echtem Verstoß | **bestanden** — absichtlich eingefügte ungenutzte Variable liefert Exit-Code 2, Fund korrekt lokalisiert (`declared and not used`) |
|
||||||
|
| 3 | README-Setupanleitung von zweiter Person nachvollzogen | — | **nicht durchgeführt** — keine zweite Person in dieser autonomen Sitzung verfügbar (gleiche Methodik-Abweichung wie QA-05 Prüfung 2/QA-09 Bildschirmleser-Durchlauf); ersatzweise die Anleitung selbst Schritt für Schritt auf einer frischen Kopie (`rsync` auf 192.168.1.131) nachvollzogen: `make install` → `make run` → `curl /healthz` → `{"status":"ok",...}`. |
|
||||||
|
|
||||||
|
Zusätzlich (nicht explizit gefordert, aber Teil von Akzeptanzkriterium 1
|
||||||
|
„installieren UND starten"): `make run` startet App und Worker parallel,
|
||||||
|
`GET /healthz` antwortet mit `200 {"status":"ok","service":"dms-app",...}`
|
||||||
|
innerhalb von 2 Sekunden nach Start.
|
||||||
|
|
||||||
|
## Build/Test-Ergebnis (192.168.1.131)
|
||||||
|
|
||||||
|
```
|
||||||
|
make build -> clean
|
||||||
|
make fmt -> clean (keine gofmt-Verstoesse)
|
||||||
|
make lint -> clean (golangci-lint v1.62.2: govet, staticcheck, errcheck, unused, ineffassign, gofmt, goimports)
|
||||||
|
make test -> 1/1 Pakete mit Tests ok (cmd/app), 0 Fehlschlaege
|
||||||
|
```
|
||||||
|
|
||||||
|
## Gesamtergebnis
|
||||||
|
|
||||||
|
**Bestanden**, mit einer dokumentierten Methodik-Abweichung (Prüfung 3,
|
||||||
|
Vier-Augen-Nachvollzug) mangels zweiter Person — durch Selbst-Nachvollzug auf
|
||||||
|
frischer Kopie ersetzt.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
module gitea.perlbach24.de/scripte/nexarch/dms
|
||||||
|
|
||||||
|
go 1.22
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// Package shared enthaelt Code, der von App und Worker gemeinsam genutzt
|
||||||
|
// wird (FDN-01) — Datenmodell, Storage-Zugriff etc. kommen in spaeteren
|
||||||
|
// Kacheln (FDN-02/FDN-03) hierher, dieses Paket ist bewusst noch schlank.
|
||||||
|
package shared
|
||||||
|
|
||||||
|
// Version ist die aktuelle DMS-Version, per -ldflags ueberschreibbar
|
||||||
|
// (siehe Makefile) — Platzhalter fuer echtes Versionsmanagement.
|
||||||
|
var Version = "dev"
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
|
|
||||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
|
||||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
|
|
||||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
|
||||||
github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY=
|
|
||||||
github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw=
|
|
||||||
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
|
|
||||||
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
|
||||||
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
|
|
||||||
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
|
||||||
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
|
||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# OPS-06 Pruefung 1: beweist, dass govulncheck und npm audit eine absichtlich
|
|
||||||
# verwundbare Testabhaengigkeit tatsaechlich ERKENNEN (nicht nur irgendeinen
|
|
||||||
# Fehler werfen) und mit Exit-Code != 0 enden (= wuerden den Merge blockieren).
|
|
||||||
# Laeuft auf dem Testhost (Go/npm noetig), nicht auf der Entwicklungsmaschine.
|
|
||||||
#
|
|
||||||
# Wichtig: ein Exit-Code != 0 allein ist KEIN Beweis — ein fehlendes Tool
|
|
||||||
# ("command not found", exit 127) sieht fuer ein reines Exit-Code-Gate genauso
|
|
||||||
# aus wie ein echter Fund. Deshalb prueft dieses Skript zusaetzlich, dass die
|
|
||||||
# erwartete Advisory-Kennung tatsaechlich in der Ausgabe steht.
|
|
||||||
set -uo pipefail
|
|
||||||
|
|
||||||
# "go install" legt Binaries in $(go env GOPATH)/bin ab — auf frischen Hosts
|
|
||||||
# ist das nicht zwangslaeufig im PATH (gefunden 2026-08-28 auf dem Testhost:
|
|
||||||
# govulncheck installierte erfolgreich, "command -v govulncheck" schlug danach
|
|
||||||
# trotzdem fehl, weil /root/go/bin nicht im PATH stand). Defensiv ergaenzen,
|
|
||||||
# statt stillschweigend als "Werkzeug fehlt" fehlzuschlagen.
|
|
||||||
export PATH="$PATH:$(go env GOPATH 2>/dev/null)/bin"
|
|
||||||
|
|
||||||
fail=0
|
|
||||||
|
|
||||||
echo "=== Go-Fixture: golang.org/x/text v0.3.7, GO-2022-1059 (Symbolpfad language.ParseAcceptLanguage) ==="
|
|
||||||
if ! command -v govulncheck >/dev/null 2>&1; then
|
|
||||||
echo "govulncheck fehlt, installiere..."
|
|
||||||
# @latest kann eine govulncheck-Version verlangen, die neuer ist als die
|
|
||||||
# lokal installierte Go-Toolchain (z. B. "requires go >= 1.25.0"). Feste,
|
|
||||||
# bekannt kompatible Version statt @latest, damit die Installation nicht
|
|
||||||
# von der jeweiligen Go-Version des Hosts abhaengt.
|
|
||||||
if ! go install golang.org/x/vuln/cmd/govulncheck@v1.1.3; then
|
|
||||||
echo "FEHLER: govulncheck konnte nicht installiert werden — Pruefung nicht durchfuehrbar, kein Ersatz-'OK'."
|
|
||||||
fail=1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if command -v govulncheck >/dev/null 2>&1; then
|
|
||||||
go_output=$(cd testdata/vulnfixture-go && go mod tidy && govulncheck ./... 2>&1)
|
|
||||||
go_exit=$?
|
|
||||||
echo "$go_output"
|
|
||||||
if [ "$go_exit" -eq 0 ]; then
|
|
||||||
echo "FEHLER: govulncheck hat die bekannte Schwachstelle NICHT erkannt (exit 0 erwartet != 0)"
|
|
||||||
fail=1
|
|
||||||
elif ! grep -q "GO-2022-1059" <<<"$go_output"; then
|
|
||||||
echo "FEHLER: exit code $go_exit ist != 0, aber die erwartete Advisory GO-2022-1059 steht NICHT in der Ausgabe — das ist vermutlich ein Werkzeugfehler (z. B. fehlendes govulncheck, Netzwerkproblem), kein echter Fund. Kein 'OK'."
|
|
||||||
fail=1
|
|
||||||
else
|
|
||||||
echo "OK: govulncheck hat GO-2022-1059 tatsaechlich als Fund gemeldet, exit code $go_exit (!= 0, Gate wuerde blockieren)"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# Bug (gefunden 2026-08-28): dieser Zweig druckte vorher nur eine Meldung,
|
|
||||||
# setzte aber "fail" NICHT — das Skript endete trotzdem mit Exit-Code 0 und
|
|
||||||
# "PRUEFUNG 1 BESTANDEN", obwohl der Go-Teil real nicht lief. Exakt derselbe
|
|
||||||
# Fehlerklasse (Werkzeugfehler zaehlt als Erfolg), nur eine Ebene hoeher.
|
|
||||||
echo "FEHLER: govulncheck weiterhin nicht verfuegbar — Go-Teil der Pruefung nicht durchgefuehrt, kein Ersatz-'OK'."
|
|
||||||
fail=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "=== npm-Fixture: lodash 4.17.4 (mehrere bekannte kritische CVEs) ==="
|
|
||||||
npm_output=$(cd testdata/vulnfixture-npm && npm install --package-lock-only --no-audit --no-fund 2>&1 \
|
|
||||||
&& npm audit --audit-level=high 2>&1)
|
|
||||||
npm_exit=$?
|
|
||||||
echo "$npm_output"
|
|
||||||
if [ "$npm_exit" -eq 0 ]; then
|
|
||||||
echo "FEHLER: npm audit hat die bekannte Schwachstelle NICHT erkannt (exit 0 erwartet != 0)"
|
|
||||||
fail=1
|
|
||||||
elif ! grep -qiE "severity|vulnerabilit" <<<"$npm_output"; then
|
|
||||||
echo "FEHLER: exit code $npm_exit ist != 0, aber die Ausgabe enthaelt keinen erkennbaren Schwachstellen-Hinweis — vermutlich ein Werkzeugfehler (z. B. fehlendes npm, Netzwerkproblem), kein echter Fund. Kein 'OK'."
|
|
||||||
fail=1
|
|
||||||
else
|
|
||||||
echo "OK: npm audit hat die Schwachstelle tatsaechlich gemeldet, exit code $npm_exit (!= 0, Gate wuerde blockieren)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
if [ "$fail" -eq 0 ]; then
|
|
||||||
echo "PRUEFUNG 1 BESTANDEN: beide Gates erkennen eine absichtlich verwundbare Testabhaengigkeit inhaltlich (nicht nur per Exit-Code) und wuerden blockieren."
|
|
||||||
else
|
|
||||||
echo "PRUEFUNG 1 FEHLGESCHLAGEN: siehe FEHLER oben."
|
|
||||||
fi
|
|
||||||
exit $fail
|
|
||||||
Vendored
-14
@@ -1,14 +0,0 @@
|
|||||||
// Absichtlich verwundbares Fixture-Modul fuer OPS-06 Pruefung 1: beweist, dass
|
|
||||||
// der govulncheck-CI-Schritt eine bekannte Schwachstelle tatsaechlich erkennt
|
|
||||||
// und den Lauf mit Exit-Code != 0 beendet. Eigenes go.mod, damit die
|
|
||||||
// veraltete, verwundbare Abhaengigkeit NICHT im Hauptmodul landet.
|
|
||||||
module gitea.perlbach24.de/scripte/nexarch/testdata/vulnfixture-go
|
|
||||||
|
|
||||||
go 1.22
|
|
||||||
|
|
||||||
// golang.org/x/text v0.3.7: GO-2022-1059 — Denial of Service durch
|
|
||||||
// uebermaessigen Ressourcenverbrauch beim Parsen von Accept-Language-Headern
|
|
||||||
// (language.ParseAcceptLanguage). Bewusst auf dieser verwundbaren Version
|
|
||||||
// gepinnt, siehe scripts/verify-supply-chain-gate.sh — main.go ruft gezielt
|
|
||||||
// den verwundbaren Symbolpfad auf, nicht nur irgendeine Funktion des Pakets.
|
|
||||||
require golang.org/x/text v0.3.7
|
|
||||||
Vendored
-22
@@ -1,22 +0,0 @@
|
|||||||
// Fixture fuer OPS-06 Pruefung 1 — ruft tatsaechlich in die verwundbare
|
|
||||||
// Funktion hinein, damit govulncheck den Aufrufpfad (nicht nur die
|
|
||||||
// Modul-Abhaengigkeit) als erreichbar erkennt.
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"golang.org/x/text/language"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// ParseAcceptLanguage ist der tatsaechlich verwundbare Aufrufpfad
|
|
||||||
// (GO-2022-1059), im Unterschied zu Parse() — govulncheck bewertet
|
|
||||||
// Erreichbarkeit auf Symbol-, nicht nur Paket-Ebene.
|
|
||||||
tags, _, err := language.ParseAcceptLanguage("de-DE,de;q=0.9,en;q=0.8")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fmt.Println(tags)
|
|
||||||
}
|
|
||||||
-8
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "nexarch-vulnfixture-npm",
|
|
||||||
"private": true,
|
|
||||||
"description": "Absichtlich verwundbares Fixture-Paket fuer OPS-06 Pruefung 1 — beweist, dass npm audit eine bekannte Schwachstelle erkennt und den Lauf blockiert. Nicht Teil eines echten NEXARCH-Frontends.",
|
|
||||||
"dependencies": {
|
|
||||||
"lodash": "4.17.4"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user