No description
  • PHP 81.7%
  • Twig 18.1%
  • TypeScript 0.2%
Find a file
DiamantTh 9948a220cb refactor(hibp): PSR-18/17 statt Guzzle-Typen im Checker
HibpRangePasswordChecker kennt jetzt nur noch PSR-Interfaces:
- Psr\Http\Client\ClientInterface (PSR-18) statt GuzzleHttp\ClientInterface
- Psr\Http\Message\RequestFactoryInterface (PSR-17) fuer Request-Bau

Timeout gehoert zur Client-Konfiguration, nicht zum Checker -> aus
dem Konstruktor entfernt; Guzzle wird mit Timeout + HTTP_ERRORS=true
in ContainerFactory und PasswordResetCommand als Konkrete eingesetzt.
Laminas\Diactoros\RequestFactory als PSR-17-Implementierung (bereits
transitiv im Vendor via laminas/laminas-diactoros).
2026-05-02 19:01:45 +02:00
docs docs: README, Architektur, RBAC, Migration 2026-04-23 23:13:13 +02:00
httpdocs refactor(wiring): move app bootstrap from configs/ into src/Application/ 2026-04-25 04:21:12 +02:00
install refactor(settings): Runtime-Settings (Passwort/HIBP) in DB-Tabelle 2026-05-02 18:40:03 +02:00
src refactor(hibp): PSR-18/17 statt Guzzle-Typen im Checker 2026-05-02 19:01:45 +02:00
templates feat: AuditLog-Verdrahtung, ZoneMembers, Passwort-Reset-Flow, InputFilter-Tests 2026-04-30 17:38:44 +02:00
tests feat: AuditLog-Verdrahtung, ZoneMembers, Passwort-Reset-Flow, InputFilter-Tests 2026-04-30 17:38:44 +02:00
themes/default/src fix(assets): outDir httpdocs/assets/, source entry stubs - vite.config.ts: outDir themes/default/js -> httpdocs/assets/ (war außerhalb des DocumentRoot, Assets per HTTP nicht erreichbar) - .gitignore: themes/default/js/ -> httpdocs/assets/ - themes/default/src/records/main.ts: leerer Stub für Record-UI - themes/default/src/pwtools/main.ts: zxcvbn-Passwort-Stärken-Meter 2026-04-25 21:50:50 +02:00
.gitignore fix: weitere Layer-Konsistenz + .gitignore 2026-04-27 00:45:19 +02:00
.php-cs-fixer.dist.php chore: PHP-CS-Fixer + Rector als QA-Tools eingerichtet 2026-04-26 13:57:44 +02:00
composer.json chore: PHP-CS-Fixer + Rector als QA-Tools eingerichtet 2026-04-26 13:57:44 +02:00
LICENSE chore: Projekt-Grundgeruest mit vollem Stack aus desec-manager 2026-04-23 23:11:51 +02:00
package-lock.json feat(auth): CSRF-Schutz, TOTP-MFA-Flow, Clock/PasswordPolicy/TotpService - Pipeline: AuthenticationMiddleware + CsrfMiddleware eingefügt - ContainerFactory: ClockInterface, CsrfMiddleware, TotpService, PasswordPolicy registriert; $twigCacheActive-Fix - AuthorizationService: vereinfacht auf User::hasPermission() direkt - DnsManagementService: ZONE_LIST-Permission in listZones/listProviders korrigiert - UserRepositoryInterface: saveTotpSecret() + updateLastLoginAt() ergänzt - DbalUserRepository: ClockInterface injiziert, saveTotpSecret/updateLastLoginAt implementiert - LoginHandler: CSRF-Prüfung + TOTP-Pending-Flow (mfa_pending Session) - TotpHandler: neuer GET/POST /login/totp Handler - Routes: GET+POST /login/totp registriert - CSRF in allen POST-Handlern validiert (Logout, ZoneCreate/Delete, RecordCreate/Delete) - CSRF-Token in allen GET-Handlern generiert (Dashboard, ZoneList, RecordList) - Templates: csrf_token Hidden-Input in alle POST-Forms, navbar mit csrfToken - Neu: SystemClock (PSR-20), TotpService (otphp v11), PasswordPolicy (zxcvbn) - Neu: templates/app/mfa_totp.html.twig 2026-04-25 22:22:46 +02:00
package.json chore: Projekt-Grundgeruest mit vollem Stack aus desec-manager 2026-04-23 23:11:51 +02:00
phpstan.neon feat(install): Web-Installer für TowerDNS + devium/toml TOML-Update 2026-04-23 23:35:47 +02:00
phpunit.xml.dist chore: Projekt-Grundgeruest mit vollem Stack aus desec-manager 2026-04-23 23:11:51 +02:00
README.md docs: README, Architektur, RBAC, Migration 2026-04-23 23:13:13 +02:00
rector.php chore: PHP-CS-Fixer + Rector als QA-Tools eingerichtet 2026-04-26 13:57:44 +02:00
tsconfig.json chore: Projekt-Grundgeruest mit vollem Stack aus desec-manager 2026-04-23 23:11:51 +02:00
vite.config.ts fix(assets): outDir httpdocs/assets/, source entry stubs - vite.config.ts: outDir themes/default/js -> httpdocs/assets/ (war außerhalb des DocumentRoot, Assets per HTTP nicht erreichbar) - .gitignore: themes/default/js/ -> httpdocs/assets/ - themes/default/src/records/main.ts: leerer Stub für Record-UI - themes/default/src/pwtools/main.ts: zxcvbn-Passwort-Stärken-Meter 2026-04-25 21:50:50 +02:00

TowerDNS

TowerDNS ist ein providerunabhaengiges, DNS-zentriertes Management-Panel und der offizielle technische Nachfolger von desec-manager.

Vorgaenger und Migration

Vorgaengerprojekt:

Das bisherige Projekt desec-manager dient als Migrationsbasis. Die Weiterentwicklung erfolgt ausschliesslich in diesem Repository.

Zielbild

TowerDNS ist kein reiner Wrapper fuer einen einzelnen Anbieter. Das Projekt stellt eine gemeinsame Kernlogik fuer DNS-Verwaltung bereit und bindet Provider ueber eine abstrahierte, capability-orientierte Schnittstelle an.

Schwerpunkte:

  • Verwaltung von Zonen, Records, TTL, Kommentaren, Tags und Metadaten
  • Striktes Rollen- und Rechtesystem mit zentraler Pruefung in der Application-Schicht
  • DNSSEC als eigener fachlicher Bereich, nicht als Sonderbehandlung am Rand
  • Provideradapter fuer deSEC, PowerDNS, Cloudflare und INWX

Architektur

Layer:

  • UI: einheitliche Oberflaeche ohne direkte Anbieterlogik
  • Application/Core: providerneutrale Workflows, Validierung, Normalisierung und Rechtepruefung
  • Provider-Abstraktion: gemeinsamer Vertrag und capability-orientiertes Modell
  • Provider-Implementierungen: deSEC, PDNS, Cloudflare, INWX als getrennte Adapter
  • Domain-Modell: kanonische Darstellung von DNS-Objekten inklusive DNSSEC

DNSSEC-Grundsatz

DNSSEC wird fachlich vollstaendig modelliert:

  • Provider mit einfacher/automatischer DNSSEC-Abwicklung werden korrekt abgebildet
  • Provider mit direkter DNSSEC-Steuerung bleiben detailliert steuerbar
  • PowerDNS DNSSEC-Funktionen werden direkt an die PDNS-API angebunden

Rollen und Rechte

TowerDNS fuehrt ein feingranulares Berechtigungssystem ein:

  • getrennte Rechte fuer Lesen, Anlegen, Aendern, Loeschen
  • getrennte Rechte fuer DNSSEC-Aktionen
  • getrennte Rechte fuer Provider-Credentials, Rollen/User und globale Admin-Funktionen

Rechtepruefungen sind zentral im Core und nicht nur in der UI.

Technische Basis

TowerDNS uebernimmt den Stack des Vorgaengerprojekts desec-manager und entwickelt ihn provider-neutral weiter:

  • PHP >= 8.4, Composer (PSR-4 unter TowerDNS\)
  • HTTP-Schicht: Mezzio (PSR-15) + FastRoute + PHP-DI
  • Templates/Renderer: Twig via mezzio-twigrenderer
  • Sessions/CSRF: mezzio-session, mezzio-session-ext, mezzio-csrf
  • Validierung/Filter/Inputs: Laminas (laminas-filter, laminas-validator, laminas-inputfilter, laminas-i18n)
  • RBAC-Bibliothek: laminas/laminas-permissions-rbac (eigene Permission/Role-Domain dazu)
  • Persistenz: Doctrine DBAL (^3.7) wie in desec-manager
  • HTTP-Clients: Guzzle 7
  • Logging/Telemetrie: Monolog 3, Sentry 4
  • Caching: Symfony Cache, PSR Simple Cache
  • CLI/Mailer/Konfig: Symfony Console, Symfony Mailer, yosymfony/toml
  • Authentifizierung: WebAuthn (web-auth/webauthn-lib), TOTP (spomky-labs/otphp), Passwortpruefung (bjeavons/zxcvbn-php)
  • Frontend: Svelte 5 + Vite 6 + TypeScript (uebernommen aus desec-manager)
  • Tests/Statisch: PHPUnit 11, PHPStan 2 (Level 8)
  • Saubere Layer-Struktur unter src/Domain, src/Application, src/Infrastructure, src/UI

Aktueller Stand

  • providerneutrales Vertragsmodell mit ProviderRegistry und Capability-Konstanten
  • kanonisches DNS- und DNSSEC-Modell (Zone, Record, DnssecProfile, DnssecState)
  • RBAC mit zentraler Durchsetzung im DnsManagementService (Permission + Capability)
  • Eingabevalidierung mit IDN-Normalisierung (DnsNameValidator) und Record-Pruefung (RecordValidator)
  • deSEC-Adapter funktional aus desec-manager portiert (DeSECApiClient, DeSECProvider)
  • PowerDNS-Adapter inkl. nativer DNSSEC-Steuerung (cryptokeys-API)
  • Cloudflare- und INWX-Adapter als Skelette mit korrekt deklarierten Capabilities
  • PHPUnit- und PHPStan-Konfiguration (Level 8), erste Tests fuer Validierung und Service
  • AGPL-3.0-or-later, durchgaengig SPDX-Header in allen PHP-Dateien

Entwicklung

composer install
composer check       # lint + phpstan + phpunit
npm install
npm run build        # Svelte/Vite-Bundles -> themes/default/js/

Weiterfuehrende Dokumentation:

Naechste Schritte

  • Cloudflare- und INWX-Adapter ausimplementieren
  • Persistenz fuer Provider-Konfigurationen, User und Rollen anbinden
  • HTTP-/UI-Layer auf den Application-Services aufsetzen
  • Importpfad aus desec-manager-Datenbestaenden bereitstellen

Lizenz

GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later), siehe LICENSE.

SPDX-Identifier: AGPL-3.0-or-later.

TowerDNS ist der technische Nachfolger von desec-manager und uebernimmt dessen Copyleft-Charakter konsequent: Wer eine modifizierte Version als Netzwerkdienst betreibt, muss den entsprechenden Quellcode den Nutzern zugaenglich machen (AGPL §13).