Umsetzung von #567. Entscheidung Richard, 13.09.2026: Geheimnisse verwalten wir ausschliesslich im Desktop, und selbst dort erst nach zusaetzlicher Passwortabfrage. Bisher sah und aenderte jeder, der die Desktop-Oberflaeche offen vor sich hatte: - Polymarket-Konten mit ApiKey, ApiSecret, ApiPassphrase und PrivateKey - Master-Key, OpenRouter-Key, Watchdog-Token und Lizenzschluessel - Mullvad-Account und Polygon-RPC-URL mit Alchemy-Key, offen im Editor - das WebUI-Token, per "Anzeigen" lesbar Jetzt gesperrt, bis entsperrt: - Tab "Polymarket Accounts": Gesperrt stehen die Konten gar nicht im visuellen Baum. Das Raster bleibt leer, der Editor mit den Private Keys ebenfalls; nichts ist nur verdeckt. - Master-Key erzeugen, OpenRouter-, Watchdog- und Lizenzschluessel setzen. - Mullvad-Account und Polygon-RPC-URL: mit [SensitiveSetting] markiert und im Editor ausgeblendet. - WebUI-Zugang: Gesperrt steht das Token nicht einmal maskiert im Feld. Speichern ist mitgesperrt, weil es den Feldinhalt als Token schreibt; gesperrt und leer haette es das Token geloescht. - Frei bleiben Lizenzpruefung und Test-Heartbeat, weil sie keinen Schluessel zeigen. Kern im Core (PolyTrader.Core.Security), weil nur dort testbar: - SettingsPasswordStore: PBKDF2-HMAC-SHA256, 600 000 Iterationen, Salt, eigene Datei settings-password.json neben master.key, atomar geschrieben und nur fuer den Besitzer lesbar. Nicht in server_settings.xml, die seit #561 das WebUI mitschreibt. Ein vorhandenes Passwort wird nie ueberschrieben. - SettingsLock: - erstes Festlegen mit Wiederholung und mindestens 10 Zeichen - zwei freie Fehlversuche, danach 5 s bis 5 min Wartezeit, in der auch das richtige Passwort nicht geprueft wird - Sperre nach 5 Minuten ohne geschuetzte Aktion und beim Verlassen der Einstellungen - eine unlesbare Passwortdatei entsperrt nie und gilt auch nicht still als "kein Passwort" - Protokoll ohne eingegebene Werte Oberflaeche: PasswordDialog deklarativ in .axaml, Sperr-Leiste ueber den Tabs. Die PBKDF2-Pruefung dauert etwa eine halbe Sekunde und laeuft nicht im UI-Thread. Grenzen: - Die Sperre schuetzt gegen jemanden an einer entsperrten Desktop-Sitzung. Wer Dateizugriff hat, liest master.key selbst. Deshalb gibt es kein "Passwort vergessen": Wer settings-password.json loeschen kann, braucht keins. - Die Wartezeit nach Fehlversuchen beginnt nach einem Neustart von vorn. - "Datenbankeinstellungen": Eine Ansicht dafuer gibt es im Desktop nicht; die Verbindungszeichenfolge steht nur in appsettings.Local.json. Entsteht eine, gehoert sie hinter dieselbe Sperre. Tests: 20 fuer Passwortdatei und Sperre (Festlegen, Fehlversuche, Wartezeit, Leerlauf, unlesbare Datei, Aendern, Iterationszahl aus der Datei, Dateirechte) und 5 fuer die Markierung der Geheimnisfelder. Die Oberflaeche selbst wird auf der VM abgenommen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
58 lines
1.6 KiB
Plaintext
58 lines
1.6 KiB
Plaintext
# ── Build-Artefakte ──────────────────────────────
|
||
[Bb]in/
|
||
[Oo]bj/
|
||
[Dd]ebug/
|
||
[Rr]elease/
|
||
*.dll
|
||
*.exe
|
||
*.pdb
|
||
|
||
# ── Visual Studio / IDE ──────────────────────────
|
||
.vs/
|
||
# JetBrains Rider (wird auf der Linux-Testmaschine benutzt). Enthaelt
|
||
# maschinenspezifische Pfade und Index-Layouts - gehoert nicht ins Repo.
|
||
.idea/
|
||
.claude/settings.local.json
|
||
*.user
|
||
*.suo
|
||
*.userosscache
|
||
*.sln.docstates
|
||
*.code-workspace
|
||
|
||
# ── Lokale Daten & Secrets (NICHT versionieren!) ─
|
||
data.db
|
||
*.db
|
||
*.db-shm
|
||
*.db-wal
|
||
server_settings.xml
|
||
appsettings.*.json
|
||
!appsettings.json
|
||
|
||
# Mongo-Exporte (enthalten Secrets: PrivateKey, ApiSecret) – niemals committen.
|
||
# Die Migration nach MySQL ist abgeschlossen und der Ordner am 22.08.2026 entfernt;
|
||
# der Eintrag bleibt als Schutz, falls noch einmal ein Export angelegt wird.
|
||
MongoDB/
|
||
|
||
# Gitea Personal Access Token für Pushes – niemals committen
|
||
.gitea-token
|
||
master.key
|
||
openrouter.key
|
||
# #567: Hash des Einstellungs-Passworts (PBKDF2) - gehoert zur Installation, nicht ins Repository
|
||
settings-password.json
|
||
|
||
# Packager-Zugangsdaten (FTP, updateservice:publish-Token) – Vorlage in deploy/packager.config.example.json
|
||
deploy/packager.config.json
|
||
|
||
# ── Logs & temporäre Dateien ─────────────────────
|
||
*.log
|
||
*.tmp
|
||
|
||
# ── Backups ──────────────────────────────────────
|
||
*.bak
|
||
*.bak[0-9]
|
||
*.bak_*
|
||
|
||
# Deploymentcenter-Adapter: enthaelt das Werkbank-Token im Klartext.
|
||
# Vorlage ist .mcp.example.json
|
||
.mcp.json
|