patrickandClaude Sonnet 5 f4ff11a80e
Security Audit / Python Dependency Audit (push) Canceled after 0s
Security Audit / Node.js Dependency Audit (push) Canceled after 0s
Security Audit / Frontend Build (tsc + vite) (push) Canceled after 0s
feat(kiosk): Bearer-Token-Auth für Android-Tablets hinter VPN
Neuer, einfacherer Geräte-Auth-Modus (key_algorithm="bearer_vpn") als
Alternative zum bestehenden Ed25519-Request-Signing. Bestehende PC-Terminals
(key_algorithm="ed25519") bleiben unverändert – verify_kiosk_request()
verzweigt jetzt am Authorization-Header: "Bearer <token>" → einfacher Pfad
(nur Token-Hash + Status + IP-Whitelist, kein Timestamp/Nonce/Signatur),
sonst weiterhin die 4 X-Kiosk-*-Header wie bisher.

Hintergrund: Terminals+Tablets laufen jetzt hinter WireGuard-VPN, die
ursprüngliche MITM-Härtung (Ed25519-Signing) ist für Tablets keine
Kernanforderung mehr. Ermöglicht ein deutlich einfacheres Flutter-Kiosk-App-
Projekt ohne Client-seitige Krypto.

- Migration 0045: kiosk_devices.device_token_hash
- backend/cli.py: `kiosk add --auth-mode bearer` generiert Token, gibt es
  einmalig aus (analog Enrollment-Setup-URL bisher)
- 4 neue Tests in test_kiosk_security.py (gültig/ungültig/IP-Whitelist/revoked)

Vollständiger Plan: /home/sysops/.claude/plans/staged-marinating-dove.md

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-10 02:13:16 +02:00
2026-05-23 21:16:24 +02:00

TimeMaster

Zeiterfassung & HR-Tool (Zeiterfassung, Abwesenheiten, Kiosk-Terminals, Reports) – DSGVO-konform, EU-Server. Multimandantenfähig mit strikter Company-Isolation über PostgreSQL Row-Level-Security.

Tech-Stack

  • Backend: Python 3.12 · FastAPI · SQLAlchemy (async) · PostgreSQL 16 · Redis 7 · Alembic
  • Frontend: React 18 · TypeScript · Tailwind CSS · Vite
  • Deployment: nativ auf Ubuntu (systemd + nginx), kein Docker
  • Tests: pytest + pytest-asyncio + pytest-cov

Features (Auszug)

  • Zeiterfassung mit ArbZG-Prüfung (Pausen, Höchstarbeitszeit, Ruhezeiten)
  • Abwesenheiten: Urlaub (mit Pro-rata/Teilzeit-Anspruch), Krankmeldung (Bradford-Faktor), Zwei-Stufen-Genehmigung
  • Kiosk-Terminals: Ed25519-signierte PC-Terminals, NFC+PIN, QR-Code-BYOD-Stempeln
  • 2FA (TOTP), LDAP-Sync, CalDAV-Export, iCal-Abo-Feed
  • Reports & Exports: CSV/XLSX/PDF, DATEV-Monatsblatt für Steuerberater
  • Reseller/Mandantenverwaltung, Audit-Log, DSGVO-Datenexport (Art. 15) + Löschkonzept

API-Dokumentation

Vollständige Endpunkt-Referenz: docs/api.md. Interaktive Swagger-UI (/docs) und ReDoc (/redoc) sind nur im Development-Modus aktiv, nicht in Production.

Setup

Migrationen und Tests laufen nicht lokal, sondern auf dem Zielserver (kein lokales Postgres/Redis vorausgesetzt).

Server-Neueinrichtung (Debian 13, als root):

bash setup_server.sh

Installiert Postgres, Redis, nginx, Python-venv, führt Alembic-Migrationen aus und schreibt die nginx-Konfiguration. Danach .env mit echten Secrets befüllen.

Frontend deployen (von einem Rechner mit Node.js, nach dem Server-Setup):

./push-frontend.sh <server-host>

Baut das Frontend (npm run build) und synct dist/ zum Server.

Deployment-Workflow (bestehender Server)

Server pullen git-basiert aus dem eigenen Remote, kein direktes Hochladen von Code:

git push origin main                  # lokal
ssh root@<server> 'cd /opt/timemaster && ./server-update.sh'   # git pull → alembic → restart → health-check

Tests

cd backend
pytest -q

Läuft gegen eine echte PostgreSQL-Testdatenbank (RLS-Policies werden in conftest.py repliziert), kein SQLite. Coverage-Gate: --cov-fail-under=50 in pytest.ini.

S
Description
No description provided
Readme
2 MiB
0 Stars 1 Watchers 0 Forks
Languages
JavaScript 59.2%
Python 23.5%
TypeScript 16.3%
Shell 1%