Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 30 additions & 2 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,37 @@
# Dependabot: Update-PRs gebündelt je Ökosystem, damit sie gemeinsam geprüft und gemergt werden.
# Sicherheitsupdates kommen unabhängig vom Zeitplan sofort (Repo-Einstellung "Dependabot security updates").
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
day: monday
time: "06:00"
timezone: Europe/Vienna
open-pull-requests-limit: 5
labels: [dependencies, javascript]
commit-message:
prefix: chore
include: scope
groups:
entwicklungswerkzeuge:
dependency-type: development
update-types: [minor, patch]
# Major-Versionen kommen als eigener PR (können Lint-Regeln oder Node-Anforderungen ändern)

- package-ecosystem: github-actions
directory: /
schedule:
interval: monthly
interval: weekly
day: monday
time: "06:00"
timezone: Europe/Vienna
open-pull-requests-limit: 5
labels: [dependencies, github-actions]
commit-message:
prefix: chore
include: scope
groups:
actions:
patterns: ['*']
patterns: ["*"]
5 changes: 3 additions & 2 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

- [ ] Änderungen nur in `src/`, `test/`, `scripts/` oder Doku — keine gebaute HTML eingecheckt
- [ ] **Keine echten Reportdaten** (ZIP/CSV, E-Mail-Adressen, Namen) im Diff
- [ ] `npm run gate:data`, `npm run check` und `npm test` lokal grün
- [ ] `npm run gate:data`, `npm run lint` und `npm test` lokal grün
- [ ] Im Browser mit `test/sample.zip` geprüft
- [ ] `CHANGELOG.md` ergänzt (Abschnitt `[Unreleased]`)
- [ ] `CHANGELOG.md` ergänzt (Abschnitt `[Unreleased]`) und betroffene Doku im selben PR angepasst
(`npm run gate:docs`; nur wenn wirklich keine Doku nötig ist: Label `keine-doku`)
72 changes: 72 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ on:
push:
branches: [main]
pull_request:
# labeled/unlabeled: Doku-Gate reagiert auf das Label "keine-doku"
types: [opened, synchronize, reopened, labeled, unlabeled]
workflow_dispatch:

permissions:
Expand Down Expand Up @@ -55,3 +57,73 @@ jobs:
name: Hornetsecurity-Report-Viewer
path: dist/Hornetsecurity-Report-Viewer.html
retention-days: 14

lint:
name: Lint (JS, Markdown, PowerShell)
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: 22
cache: npm

- name: Abhängigkeiten installieren (Lockfile, ohne Install-Skripte)
run: npm ci --ignore-scripts --no-fund --no-audit

- name: ESLint
run: npm run lint:js

- name: markdownlint
run: npm run lint:md

- name: PSScriptAnalyzer
shell: pwsh
run: |
if (-not (Get-Module -ListAvailable -Name PSScriptAnalyzer)) {
Install-Module PSScriptAnalyzer -Scope CurrentUser -Force -ErrorAction Stop
}
./scripts/lint-ps.ps1

docs:
name: Doku-Gate
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
persist-credentials: false

- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: 22

- name: Doku zum Code passend?
env:
DOCS_GATE_BASE: ${{ github.event.pull_request.base.sha }}
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
PR_LABELS: ${{ join(github.event.pull_request.labels.*.name, ',') }}
run: npm run gate:docs

dependencies:
name: Abhängigkeiten prüfen
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Neue Abhängigkeiten auf Sicherheitslücken und Lizenzen prüfen
uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
with:
fail-on-severity: low
deny-licenses: GPL-2.0-only, GPL-2.0-or-later, GPL-3.0-only, GPL-3.0-or-later, AGPL-3.0-only, AGPL-3.0-or-later
comment-summary-in-pr: never
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
!/docs/
!/build.ps1
!/package.json
!/package-lock.json
!/eslint.config.js
!/.markdownlint.json
!/README.md
!/CHANGELOG.md
!/LICENSE
Expand All @@ -21,6 +24,7 @@
/test/*
!/test/core.test.js
!/test/make-sample.js
!/test/gates.test.js
!/test/sample.zip

# Echte Report-Dateien nirgends, auch nicht in erlaubten Ordnern
Expand Down
8 changes: 8 additions & 0 deletions .markdownlint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"$schema": "https://raw.githubusercontent.com/DavidAnson/markdownlint/main/schema/markdownlint-config-schema.json",
"default": true,
"MD013": false,
"MD024": { "siblings_only": true },
"MD033": false,
"MD041": false
}
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,23 @@ Versionierung nach [Semantic Versioning](https://semver.org/lang/de/).

## [Unreleased]

### Hinzugefügt

- Linter als Pull-Request-Check: ESLint, markdownlint und PSScriptAnalyzer (`npm run lint`).
- Doku-Gate als Pull-Request-Check (`scripts/check-docs.js`): CHANGELOG-Eintrag bei
Produktänderungen, Entwickler-Doku bei Werkzeug-Änderungen, Konsistenz von npm-Skripten,
Links und CHANGELOG; Ausnahme per Label `keine-doku`.
- Abhängigkeitsprüfung (Dependency Review) als Pull-Request-Check; Dependabot zusätzlich für
npm, wöchentlich und gebündelt; Dependabot-Sicherheitsupdates aktiviert.

### Geändert

- Entwicklung benötigt Node.js ≥ 22.13 (Linter); die ausgelieferte HTML-Datei bleibt ohne Abhängigkeiten.
- `build.ps1` als UTF-8 mit BOM gespeichert, damit Windows PowerShell 5.1 Umlaute in
Meldungen korrekt anzeigt; Statusausgabe über `Write-Output`.

### Behoben

- Release-Workflow: Release-Notizen werden korrekt aus dem CHANGELOG übernommen;
bestehende Tags lassen sich manuell (erneut) veröffentlichen (`workflow_dispatch`).

Expand All @@ -15,6 +31,7 @@ Versionierung nach [Semantic Versioning](https://semver.org/lang/de/).
Erste öffentliche Version.

### Hinzugefügt

- Portable Einzeldatei `Hornetsecurity-Report-Viewer.html`: Report-ZIP des Hornetsecurity
Security Awareness Service per Drag & Drop laden, Auswertung komplett offline im Browser.
- KPI-Kacheln: ESI mit Vormonats-Delta, simulierte, erfolgreiche und gemeldete Angriffe,
Expand Down
62 changes: 53 additions & 9 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,29 @@ Danke für Ihr Interesse! Fehlermeldungen und Verbesserungen sind willkommen.
Die CI bricht ab, wenn sie fremde E-Mail-Domains oder nicht erlaubte Dateien findet.
2. **Nur `src/` ändern**, nie die gebaute HTML-Datei. Sie entsteht mit `build.ps1` in `dist/`
und wird nicht eingecheckt.
3. **Keine externen Abhängigkeiten** — die HTML-Datei muss offline über `file://` laufen
(kein CDN, kein `fetch`).
3. **Die HTML-Datei bleibt ohne Abhängigkeiten** — sie muss offline über `file://` laufen
(kein CDN, kein `fetch`). npm-Pakete gibt es nur als Entwicklungswerkzeuge (Linter).
4. **Report-Inhalte nur per `textContent`** in den DOM schreiben, nie per `innerHTML`.
5. **Doku gehört in denselben Pull Request** wie der Code (siehe [Doku-Gate](#doku-gate)).

## Entwicklungsumgebung

Benötigt: [Node.js](https://nodejs.org/) ≥ 20 und PowerShell (Windows PowerShell 5.1 oder
PowerShell 7). Es gibt keine npm-Abhängigkeiten, `npm install` ist nicht nötig.
Benötigt:

- [Node.js](https://nodejs.org/) ≥ 22.13
- PowerShell (Windows PowerShell 5.1 oder PowerShell 7) für den Build
- für `npm run lint:ps` das Modul PSScriptAnalyzer:
`Install-Module PSScriptAnalyzer -Scope CurrentUser`

```powershell
npm run gate:data # Daten-Gate: nur erlaubte Dateien, keine echten Reportdaten
npm run check # Syntax-Prüfung
npm test # Test-Suite gegen test/sample.zip
npm run build # → dist/Hornetsecurity-Report-Viewer.html
npm ci # Entwicklungswerkzeuge exakt nach package-lock.json installieren
npm run gate:data # Daten-Gate: nur erlaubte Dateien, keine echten Reportdaten
npm run gate:docs # Doku-Gate gegen origin/main
npm run check # Syntax-Prüfung
npm run lint # alle Linter: npm run lint:js (ESLint), npm run lint:md (markdownlint),
# npm run lint:ps (PSScriptAnalyzer)
npm test # Test-Suiten: Kernlogik gegen test/sample.zip und Doku-Gate-Regeln
npm run build # → dist/Hornetsecurity-Report-Viewer.html (oder .\build.ps1)
```

Danach `dist/Hornetsecurity-Report-Viewer.html` im Browser öffnen und `test/sample.zip`
Expand All @@ -33,11 +42,46 @@ hineinziehen. Sollwerte des Beispiel-Reports: ESI 85, 163 gesendet, 12 erfolgrei
Wird der Generator geändert, `npm run sample` ausführen und die Sollwerte in
`test/core.test.js` anpassen.

## Pull-Request-Checks

Jeder Pull Request gegen `main` muss alle Checks bestehen, bevor er gemergt werden kann:

| Check | Prüft |
| --- | --- |
| **Gates (Daten, Syntax, Tests, Build)** | Daten-Gate, Syntax, beide Test-Suiten, Build und Build-Ergebnis |
| **Lint (JS, Markdown, PowerShell)** | ESLint (`eslint.config.js`), markdownlint (`.markdownlint.json`), PSScriptAnalyzer |
| **Doku-Gate** | Doku passt zum Code (siehe unten) |
| **Abhängigkeiten prüfen** | Neue oder geänderte npm-Pakete und Actions: keine bekannten Sicherheitslücken, keine GPL/AGPL-Lizenzen |

### Doku-Gate

`scripts/check-docs.js` vergleicht den Pull Request mit `main`:

- **Produkt geändert** (`src/`, `build.ps1`) → Eintrag in `CHANGELOG.md` unter `[Unreleased]`
(bzw. im Abschnitt der neuen Version bei einem Release-PR).
- **Entwicklungs-Werkzeuge geändert** (Workflows, `scripts/`, Linter-Konfiguration, npm-Skripte,
`test/make-sample.js`, `.gitignore`, Dependabot) → `CONTRIBUTING.md`, `README.md` oder
`CHANGELOG.md` anpassen.
- **Version geändert** → `CHANGELOG.md` anpassen.
- **Immer:** Jedes npm-Skript ist hier oder im README dokumentiert, relative Links in
Markdown-Dateien funktionieren, jede Version im CHANGELOG hat Datum und Link-Referenz.

Ausnahmen: Dependabot-PRs, die nur Abhängigkeiten ändern, brauchen keine Doku. Ist in einem
anderen Fall wirklich keine Doku nötig (z. B. reiner Tippfehler im Code-Kommentar), das Label
**`keine-doku`** setzen — der Check meldet dann eine Warnung statt eines Fehlers.

### Abhängigkeiten und Dependabot

Dependabot prüft npm-Pakete und GitHub Actions jeden Montag und bündelt Minor- und
Patch-Updates je Ökosystem in einem PR (Labels `dependencies` + `javascript` bzw.
`github-actions`, Commit-Präfix `chore(deps)`). Sicherheitsupdates kommen sofort.
Update-PRs durchlaufen dieselben Checks und werden wie jeder andere PR gemergt.

## Ablauf

1. Fork bzw. Branch anlegen, Änderung mit Test.
2. Eintrag unter `[Unreleased]` in `CHANGELOG.md`.
3. Pull Request gegen `main` — die CI-Gates müssen grün sein.
3. Pull Request gegen `main` — alle Checks müssen grün sein.

Commit-Präfixe: `feat:`, `fix:`, `docs:`, `test:`, `refactor:`, `chore:`.

Expand Down
31 changes: 25 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ vollständig erfundener Beispiel-Report.
### Was das Dashboard zeigt

| Bereich | Inhalt |
|---|---|
| --- | --- |
| **KPI-Kacheln** | ESI (Employee Security Index) mit Vormonats-Delta, simulierte / erfolgreiche / gemeldete Angriffe, Meldequote, riskante Interaktionen (Klicks, Logins, geöffnete Dateien, Makros), E-Training-Fortschritt |
| **Diagramme** | Angriffe und Meldungen je Mitarbeiter-Level, Mitarbeiter-Verteilung, E-Training-Status |
| **Monats-Verlauf** | ESI, Melde- und Erfolgsquote über die Monate (ab dem zweiten geladenen Report) |
Expand All @@ -64,7 +64,7 @@ Ohne Internetverbindung, ohne Server, ohne Administratorrechte.
Der Statistik-Export des Security Awareness Service, z. B. `security_awareness_service_statistics.zip`:

| Datei | Inhalt |
|---|---|
| --- | --- |
| `company_statistics.csv` | Firmen-Gesamtwerte (ESI, Angriffe, Level 1–5, E-Trainings) |
| `group_statistics.csv` | Dieselben Werte je Gruppe |
| `user_statistics.csv` | Werte je Mitarbeiter |
Expand All @@ -80,33 +80,42 @@ Format-Eigenheiten, die der Viewer berücksichtigt: Listenfelder im Python-Stil

## Entwicklung

```
```text
src/
├── core.js ZIP-Leser, DEFLATE (puff-Port als Fallback), CSV-Parser, Datenmodell (in Node testbar)
├── ui.js Rendering: KPI, SVG-Diagramme, Tabellen, Tooltips, Verlauf, Drag & Drop
└── template.html Gerüst und CSS (Farbsystem hell/dunkel, Druck-Styles)
test/
├── core.test.js Tests: Inflate-Fuzz gegen zlib, ZIP-/CSV-Grenzfälle, Datenmodell-Sollwerte
├── gates.test.js Tests der Doku-Gate-Regeln
├── make-sample.js Generator für den synthetischen Beispiel-Report (deterministisch)
└── sample.zip Synthetischer Beispiel-Report (nur erfundene Daten)
scripts/
└── check-data.js Daten-Gate: nur erlaubte Pfade, keine echten Reportdaten
├── check-data.js Daten-Gate: nur erlaubte Pfade, keine echten Reportdaten
├── check-docs.js Doku-Gate: Doku passt zum Code (PR-Check)
├── lint-md.js markdownlint-Lauf über alle Markdown-Dateien
└── lint-ps.ps1 PSScriptAnalyzer-Lauf über alle PowerShell-Skripte
build.ps1 setzt core.js + ui.js + Version ins Template ein → dist/Hornetsecurity-Report-Viewer.html
```

```powershell
npm ci # Entwicklungswerkzeuge (Linter) installieren
npm run gate:data # Daten-Gate
npm run gate:docs # Doku-Gate
npm run check # Syntax-Prüfung
npm run lint # ESLint, markdownlint, PSScriptAnalyzer
npm test # Tests (müssen „0 fehlgeschlagen" melden)
.\build.ps1 # Build → dist/Hornetsecurity-Report-Viewer.html
```

Voraussetzungen: Node.js ≥ 20 und PowerShell. Es gibt keine npm-Abhängigkeiten.
Voraussetzungen: Node.js ≥ 22.13 und PowerShell. npm-Pakete gibt es nur als Entwicklungswerkzeuge;
die ausgelieferte HTML-Datei hat keine Abhängigkeiten.
Die Version steht ausschließlich in `package.json` und wird beim Build in die Fußzeile übernommen.

### Qualitäts-Gates

Jeder Push und jeder Pull Request durchläuft in der [CI](.github/workflows/ci.yml):
Jeder Pull Request muss in der [CI](.github/workflows/ci.yml) alle Checks bestehen, bevor er
nach `main` gemergt werden kann:

1. **Daten-Gate:** Die eingecheckte Beispiel-ZIP muss byte-gleich aus dem Generator stammen.
Alle Dateien, auch die Inhalte der ZIP, dürfen nur E-Mail-Adressen erlaubter Domains
Expand All @@ -116,6 +125,16 @@ Jeder Push und jeder Pull Request durchläuft in der [CI](.github/workflows/ci.y
3. **Test-Suite** (ZIP/DEFLATE-Fuzzing, CSV-Parser, Datenmodell, Robustheit).
4. **Build und Build-Prüfung:** Die HTML-Datei ist eigenständig (keine externen Skripte), und
Version sowie Lizenzhinweis sind enthalten.
5. **Lint:** ESLint für JavaScript, markdownlint für die Dokumentation, PSScriptAnalyzer für
die PowerShell-Skripte.
6. **Doku-Gate:** Produktänderungen brauchen einen CHANGELOG-Eintrag, Änderungen an
Werkzeugen und Abläufen eine angepasste Entwickler-Doku. npm-Skripte, Links und
CHANGELOG-Struktur werden auf Konsistenz geprüft.
7. **Abhängigkeiten prüfen:** Neue oder geänderte Pakete und Actions dürfen keine bekannten
Sicherheitslücken und keine GPL/AGPL-Lizenz mitbringen.

Dependabot hält npm-Pakete und Actions aktuell (wöchentlich, gebündelt, Sicherheitsupdates
sofort). Details zu allen Checks stehen in [CONTRIBUTING.md](CONTRIBUTING.md#pull-request-checks).

Releases baut der [Release-Workflow](.github/workflows/release.yml) aus einem Tag `vX.Y.Z`. Er
bricht ab, wenn Tag und `package.json` nicht übereinstimmen.
Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Sicherheitskorrekturen gibt es für die jeweils neueste Version (siehe [Releases
Bitte **nicht** als öffentliches Issue melden, sondern vertraulich:

- über [GitHub Security Advisories](https://github.com/Computerhof/Hornetsecurity-Report-Viewer/security/advisories/new) oder
- per E-Mail an **office@chrive-solutions.at** (Betreff „Security: Hornetsecurity Report Viewer").
- per E-Mail an [office@chrive-solutions.at](mailto:office@chrive-solutions.at) (Betreff „Security: Hornetsecurity Report Viewer").

Wir bestätigen den Eingang in der Regel innerhalb von 5 Werktagen und stimmen den
Veröffentlichungszeitpunkt einer Korrektur mit Ihnen ab.
Expand Down
4 changes: 2 additions & 2 deletions build.ps1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Baut die portable Einzeldatei dist/Hornetsecurity-Report-Viewer.html aus src/
# Baut die portable Einzeldatei dist/Hornetsecurity-Report-Viewer.html aus src/
# Die Version kommt ausschließlich aus package.json (Single Source of Truth).
# Läuft unter Windows PowerShell 5.1 und PowerShell 7 (Windows/Linux/macOS).
$ErrorActionPreference = 'Stop'
Expand All @@ -24,4 +24,4 @@ New-Item -ItemType Directory -Force $dist | Out-Null
$outPath = Join-Path $dist 'Hornetsecurity-Report-Viewer.html'
[System.IO.File]::WriteAllText($outPath, $out, [System.Text.UTF8Encoding]::new($false))

Write-Host "Gebaut: $outPath (v$version, $([math]::Round((Get-Item $outPath).Length / 1KB)) KB)"
Write-Output "Gebaut: $outPath (v$version, $([math]::Round((Get-Item $outPath).Length / 1KB)) KB)"
Loading
Loading