Commit Graph

15 Commits

Author SHA1 Message Date
81b1c326fc Security: WS-Rollenprüfung, JWT-Cookie statt localStorage, XSS/SSRF-Fixes, RDP-Consent-Secret
Some checks failed
IT Nexus Deploy / Build Frontend (push) Has been cancelled
IT Nexus Deploy / Deploy to Production (push) Has been cancelled
- WebSocket Shell/RDP: Rollenprüfung statt nur JWT-Gültigkeit (war: jeder eingeloggte User konnte fremde Agents per Shell/RDP übernehmen)
- JWT_SECRET: Server bricht ab statt mit unsicherem Default weiterzulaufen
- Auth: Token läuft jetzt über httpOnly-Cookie statt localStorage (XSS-Schutz gegen Session-Diebstahl)
- WS-Auth: Token nicht mehr als URL-Query-Param (landete in nginx-Logs), sondern als erste Message bzw. automatisch via Cookie
- Frontend: toter Rollen-Check (isSuperAdmin/isAdmin ohne Funktionsaufruf) in AgentDetailPage gefixt
- XSS: DOMPurify-Sanitizing für alle marked.parse()-Renderstellen (KI-Antworten, Kommentare, Knowledge Base)
- E-Mail: HTML-Escaping für alle ticket-gesteuerten Felder (auch über öffentliche Ticket-Route erreichbar)
- SSRF-Schutz beim Knowledge-Base-URL-Import (blockt private/Loopback-Adressen)
- TV-Dashboard: Shared-Key statt komplett offenem Endpoint
- Striktes Rate-Limit auf /login, must_change_password serverseitig erzwungen
- Agent (C#) v2.7.0: RDP-Consent/Disconnect/Capture verlangen jetzt ein Pro-Session-Secret (war: jeder lokale Prozess konnte Consent vortäuschen), DataDir-ACL für agent.log/status.json
- FIDO-PINs AES-256-GCM-verschlüsselt statt Klartext, Retention-Job für alte patch_commands/audit_log

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 13:27:17 +02:00
3ea28def4c Add: Dauerhaftes Bildschirm-Übertragung-Overlay während RDP-Session (v2.6.0)
- RdpActiveIndicatorWindow: TeamViewer-Style Overlay unten rechts, solange
  RDP-Capture läuft. Zeigt Dauer der Sitzung + pulsierenden roten Punkt
- User kann per "Trennen"-Button selbst die Sitzung beenden (TCP-Signal
  an Service, cancelt Capture-Loop sofort — auch nach Screen-Wechsel)
- Overlay läuft als separater User-Prozess via SessionSpawner, wird vom
  Service direkt gekillt wenn Sitzung endet (rdp_stop oder Disconnect)
- Version: 2.5.0 → 2.6.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 12:06:50 +02:00
cb59cfe9cf Fix: Installer self-contained Publish + Selbstbereinigung vor Install (v2.5.0)
- dotnet publish lief zuvor mit --self-contained false → Installer nur 2MB
  ohne .NET-Runtime, schlägt auf Rechnern ohne .NET 8 fehl. Jetzt wieder
  self-contained Single-File wie historische Versionen (~53MB)
- setup.iss: Vor Installation werden jetzt automatisch verwaiste
  IT-Nexus-Agent.exe Prozesse gekillt und Reste eines laufenden
  Self-Update-Zyklus (update.cmd, heruntergeladener Installer) entfernt
- Behebt Installations-Instabilität durch File-Locks bei Upgrades

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 11:02:00 +02:00
e2521f405d Fix: Agent-Rollout downloadete immer globale AGENT_VERSION statt Gruppen-Ziel (v2.5.0)
- downloadSetup() nutzte process.env.AGENT_VERSION statt der Patch-Gruppen-
  Zielversion → Staged Rollout (Test/Pilot/Produktion) hatte nie funktioniert,
  jeder Agent bekam beim Auto-Update immer dieselbe globale Version
- Fix: downloadSetup() löst jetzt per ?hostname=X die Gruppen-Zielversion auf,
  exakt wie checkin() es bereits tat
- ApiService.DownloadSetupAsync() schickt jetzt den Hostnamen mit
- Version: 2.4.0 → 2.5.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 09:35:01 +02:00
7449b64398 Fix: RDP Consent-Dialog via WTSQueryUserToken+CreateProcessAsUser (v2.4.0)
- SessionSpawner.cs: Neuer Helper — WTSQueryUserToken + CreateProcessAsUser
  ersetzt fragilen schtasks-Ansatz für UI-Spawn aus SYSTEM-Service
- RtcService: SpawnConsentHelper + SpawnCaptureHelper nutzen jetzt SessionSpawner
- Findet aktive Console-Session automatisch, Fallback auf alle Sessions
- Version: 2.3.0 → 2.4.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 09:51:40 +02:00
99830e25f4 Fix: Remote Desktop — 60fps, Screen-Wechsel live, Consent-Dialog sichtbar (v2.3.0)
- CaptureModeRunner: Thread.Sleep(150) → 16ms (~60fps) + Skip-if-unchanged via Pixel-Hash
- RtcService: rdp_switch_screen Handler — Screen wechseln ohne Consent-Dialog
- RtcService: Fallback bei Consent-Fehler → rdp_denied statt silent capture
- RdpConsentWindow: WindowStyle=ToolWindow + ShowInTaskbar=True (jetzt in Taskleiste sichtbar)
- RemoteDesktopPanel: Screen-Dropdown auch während aktiver Verbindung nutzbar
- Version: 2.2.0 → 2.3.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 09:23:36 +02:00
383bbff7a6 Show consent pending state in browser during RDP approval
- Agent sends rdp_consent_pending after spawning consent dialog
- Browser shows 'Warte auf Zustimmung...' with yellow indicator
- First frame switches to 'connected', denial shows red error message
- Fixed stale closure bug in onmessage with connectedRef

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 10:25:37 +02:00
d42dc562a3 Add RDP user consent popup before screen sharing
When rdp_start arrives, agent first spawns a WPF consent dialog in the
user session (via schtasks). User has 30s to accept or deny. On deny,
agent sends rdp_denied to browser which shows "Zugriff abgelehnt".
On accept, screen capture starts as before.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 10:19:43 +02:00
058f968af1 Add Remote Desktop screen selector + new-tab button (v2.2.0)
- CaptureModeRunner: screen index param (0=all, 1-N=specific monitor)
- RtcService: reads screen from rdp_start JSON, passes to capture helper
- Program.cs: parses optional screen index arg for --rdp-capture
- RemoteDesktopPanel: screen dropdown (Alle/1-4), new-tab button
- RdpPage: fullscreen standalone page at /rdp/:agentId
- AgentDetailPage: removed dead _RemoteDesktopOld_unused code

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 10:15:00 +02:00
d3bc68d6a5 Fix SpawnHelper: rename pipeName param to portStr, fix taskName
pipeName[^8..] crashed for 5-char port strings (e.g. "54321").
Now uses port number directly as task name suffix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 10:05:12 +02:00
0b76ef3bfd Fix pipe ACL: switch from named pipe to TCP loopback
Named pipe created by SYSTEM service denied connection from user process.
TCP loopback socket (127.0.0.1:random) has no cross-session ACL issues.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 09:56:49 +02:00
45f4c7846e Fix Session 0 issue: spawn screen capture helper in user session
- CaptureModeRunner: captures desktop in user session via schtasks,
  sends JPEG frames over named pipe to service
- RtcService: creates named pipe server, spawns helper via schtasks
  (same pattern as NotificationService), reads frames and forwards to WS
- Program.cs: added --rdp-capture <pipeName> mode
- Multi-monitor: captures all screens combined

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 09:49:26 +02:00
0a8b186585 Add Remote Desktop (JPEG-over-WebSocket), Agent v2.2.0
- RtcService.cs: Screen capture via Graphics.CopyFromScreen, ~8fps JPEG stream over WebSocket
- shellServer.js: Separate rdp-agent/rdp types with independent socket maps (no shell collision)
- AgentDetailPage: WebSocket-based RemoteDesktop component replaces WebRTC attempt
- setup.iss: Fixed filename to include 'v' prefix (IT-Nexus-Agent-Setup-v2.2.0.exe)
- Removed SIPSorcery dependencies, added System.Drawing.Common

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 14:13:18 +02:00
c23091fa6e Add: Agent v2.1.2, WebSocket Live Shell, WebRTC Remote Desktop (Beta), Announcement Push
- Agent v2.1.2: WebSocket ShellService, ACK nach WS-Ankündigungen, shown_announcements Fix
- Backend: shellServer.js mit WebSocket-Server (Shell + Announcement Push + RTC Signaling)
- Backend: patch.controller.js Fix (command_id=0 Falsy-Bug beim Auto-Update)
- Frontend: Remote Desktop Tab (WebRTC Beta) in AgentDetailPage für super_admin/admin
- Frontend: PatchManagementPage auf v2.1.2 aktualisiert
- WPF Notification: AllowsTransparency=False + kein DropShadowEffect (Dispatcher-Crash Fix)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 13:31:11 +02:00
8023765e6c Initial commit: IT Nexus Web-App 2026-06-01 20:49:07 +02:00