diff --git a/README.md b/README.md index 2bda8f25..0395b972 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ![DeskHub Kundenportal](DeskHub-Webseite/docs/images/customer-portal.png) -**Aktuelle Versionen:** Server **1.0.50** · Android-App **3.4.5** · Windows-Programm **2.11.1** · Minecraft-Plugin **1.1.0** +**Aktuelle Versionen:** Server **1.0.66** · Chrome-Erweiterung **2.0.0** · WordPress-Plugin **1.2.2** · Android-App **3.4.5** · Windows-Programm **2.11.1** · Minecraft-Plugin **1.1.0** > Diese Anleitung ist auch für Einsteiger geeignet. Über das Inhaltsverzeichnis kommt ihr direkt zum gewünschten Thema. Die Abschnitte [Plugins entwickeln](#plugins-entwickeln) und [API und Webhooks](#api-und-webhooks-für-entwickler) richten sich an Entwickler. @@ -26,7 +26,7 @@ - **Import aus osTicket** inklusive Abteilungen, Nachrichten und Anhängen - **Windows-Programm und Android-App** mit hellem und dunklem Design, Push-Benachrichtigungen, Verwaltung nach Rechten und Android-**Widget** in drei Größen, direkt aus dem Mitarbeiterbereich herunterladbar - **Minecraft-Plugin** (Paper, Spigot, BungeeCord in einer Datei) zum Melden von Spielern und Problemen als Ticket -- **Chrome-Erweiterung** (auch Edge und Brave; Windows, Mac, Linux) mit Zähler, Benachrichtigungen, Suche und Ticket anlegen; **Windows-Programm auch für Linux und Mac** (Mac nur selbst zu bauen) +- **Chrome-Erweiterung** (auch Edge und Brave; Windows, Mac, Linux) mit Ticket-Ansicht, Antworten, Aufgaben, Status, Zähler und Benachrichtigungen; **Windows-Programm auch für Linux und Mac** (Mac nur selbst zu bauen) ## Einblicke @@ -120,7 +120,7 @@ DeskHub hat drei Bereiche: |---|---|---| | **Kundenportal** | Eure Kunden | `eure-domain.de/` | | **Mitarbeiterbereich** | Support-Team und Admins | `eure-domain.de/staff/` | -| **Apps** | Support-Team und Admins am PC und unterwegs | Windows-App, Android-App | +| **Apps** | Support-Team und Admins am PC und unterwegs | Windows-App, Android-App, Chrome-Erweiterung (WordPress-Plugin und Minecraft-Plugin als Download) | Ein Admin-Konto ist ein Mitarbeiter-Konto mit der Rolle „Admin“. Beim Anmelden gibt es keinen Unterschied, nur bei dem, was man danach sieht. @@ -186,9 +186,10 @@ Ein Kunden-Konto hat keinen Zugang zum Mitarbeiterbereich und umgekehrt. Im Mitarbeiterbereich gibt es links im Menü: -- **Übersicht**: wie viele Tickets offen, euch zugewiesen oder überfällig sind -- **Tickets**: die komplette Liste mit Suche, Filtern und gespeicherten Ansichten +- **Übersicht**: in vier Reitern: **Überblick** (offene, euch zugewiesene, nicht zugewiesene und überfällige Tickets, euer Status und das Team, Gesamtzahlen), **Verlauf** (Ticketaktivität, SLA-Einhaltung, Status und Priorität), **Auswertung** (nach Abteilung, Thema und Mitarbeiter, mit CSV-Export) und **Zufriedenheit** (nur wenn die Abfrage genutzt wird). Der Berichtszeitraum gilt für die letzten drei Reiter +- **Tickets**: die komplette Liste mit Suche, Filtern und gespeicherten Ansichten; sortiert nach der **letzten Aktivität** (zuletzt bearbeitete Tickets oben), der Eingang steht beim Darüberfahren in der Spalte „Letzte Aktivität“ - **Aufgaben**: eigene To-dos, unabhängig von Tickets +- **Ticket-Ansicht**: links Verlauf und Antwortfeld, rechts die Karten in drei Reitern: **Details** (Eigenschaften, SLA-Fristen, Absender, Kundenbewertung), **Organisation** (zugehörige Probleme, Wiedervorlage und Beobachter, Kollaboratoren, Zeiterfassung) und **Mehr** (passende Artikel und Tickets, Zusammenführen und Löschen, Plugin-Karten). Der gewählte Reiter bleibt beim Neuladen erhalten - **Berichte**: Auswertungen zu Antwortzeiten und Ticketaufkommen - **Sperrliste**: einzelne E-Mail-Adressen oder ganze Mail-Anbieter blockieren - **Verzeichnis**: Kontaktliste aller Kollegen @@ -270,6 +271,21 @@ Unter **Einstellungen → Design** lassen sich mehrere Themes als ZIP-Datei hoch --- +**Im Urlaub keine Benachrichtigungen, die Vertretung bekommt sie stattdessen (ab Server 1.0.59):** Wer den Urlaubsmodus eingeschaltet hat (Profil oder Plugin „Urlaub und Vertretung“), bekommt keine Mails (neues Ticket, überfällig, Erwähnung, Team-Zuweisung, Eskalation an den Bearbeiter), keine Browser-Push-Meldungen und keine Android-Popups. Stattdessen bekommt die Vertretung (auch über Ketten, ohne Doppelte) diese Benachrichtigungen, damit sie die Tickets bearbeiten kann; ohne Vertretung bekommt niemand etwas. Nach dem Urlaub gilt wieder alles wie vorher. Ausgenommen sind Sicherheitsmails (Anmelde-Wächter, Passwort zurücksetzen) und Systemmeldungen an Administratoren (Postfach, Backup). Bei der SLA-Überschreitung geht die Mail an die Vertretung, ohne Vertretung an die Abteilung. + +## Anmelde-Wächter (ab Server 1.0.54) + +Der Wächter schützt die Anmeldung der Mitarbeiter (Web **und** Android-/Windows-App) und ist fest in DeskHub eingebaut. Adminportal → **Anmelde-Wächter**. + +- **Geräte und Orte merken:** Ein Gerät ist ein Browser (Kennung in einem Cookie `dh_device`) oder eine App (Gerätename). Ein Ort ist das Land (nur wenn Cloudflare es mitschickt) oder sonst das Netz der IP-Adresse. Die erste Anmeldung eines Kontos wird still gemerkt. +- **Warnung per Mail:** Bei einem neuen Gerät (und, abschaltbar, bei einem neuen Ort) bekommt der Mitarbeiter eine Mail mit Zeit, Gerät, Ort und IP-Adresse und dem Link **„Das war ich nicht“**. Der Link gilt 7 Tage und einmal. Er macht das Passwort ungültig, beendet alle App-Anmeldungen, vergisst die gemerkten Geräte, beendet laufende Browser-Sitzungen und informiert die Administratoren. Danach legt der Mitarbeiter über „Passwort vergessen?“ ein neues Passwort fest. +- **Sperre nach Fehlversuchen:** Standard 5 Fehlversuche, dann 15 Minuten gesperrt (einstellbar, 3 bis 20 Versuche, 5 bis 240 Minuten); gilt für Web und App. Auch falsche 2FA-Codes werden jetzt gebremst. Die Sperre wird einmal je Sperrzeit protokolliert und per Mail an den Kontoinhaber und die Administratoren gemeldet. +- **Protokoll:** Jede Anmeldung, jeder Fehlversuch, jede Sperre und jede „Konto gesichert“-Meldung mit Zeit, Konto, Gerät, Ort, IP und Kanal; mit Zählern der letzten 24 Stunden, Filter und Suche. Einträge werden nach 180 Tagen (einstellbar) gelöscht. +- **Für jeden Mitarbeiter:** Unter Profil → Sicherheit stehen „Meine Geräte und Anmeldungen“; unbekannte Geräte lassen sich dort entfernen. +- **Grenzen:** Ohne Fremddienst gibt es keinen genauen Standort; mobile Netze wechseln das Netz oft, darum lässt sich die Ort-Warnung abschalten. Wer Cookies löscht, gilt als neues Gerät. Die Warn-Mail braucht einen funktionierenden Mailversand (Fehlgeschlagenes landet in der Mail-Warteschlange). + +Test: `tests/login_guard.php`. + ## E-Mails versenden (SMTP) Das ist der wichtigste erste Schritt: Damit Kunden eine Bestätigung mit ihrer Ticketnummer bekommen, muss der E-Mail-Versand eingerichtet sein. @@ -402,7 +418,7 @@ Der Quelltext von DeskHub ist deutsch. Jede weitere Sprache ist ein Plugin („S ## Sprachen der Apps (Deutsch und English) -**Stand der Übersetzungen:** Das mitgelieferte English-Paket (`lang-en`, ab Version 1.1.0) enthält rund 2850 Einträge: Oberflächen, Meldungen und Fehlertexte. Fehlt noch etwas, zeigt euch der **Sammelmodus** (Adminportal → Sprachen) genau die deutschen Texte der besuchten Seiten ohne Übersetzung. Die Wörterbücher der Windows- und der Android-App (je rund 2050 Einträge) enthalten auch die Meldungen, die der Server an die Apps schickt. Texte, die ihr selbst in der Datenbank anlegt (Namen von Abteilungen, Status, Vorlagen), bleiben, wie ihr sie eingetragen habt. +**Stand der Übersetzungen:** Das mitgelieferte English-Paket (`lang-en`, ab Version 1.1.0) enthält rund 3400 Einträge: Oberflächen, Meldungen und Fehlertexte. Fehlt noch etwas, zeigt euch der **Sammelmodus** (Adminportal → Sprachen) genau die deutschen Texte der besuchten Seiten ohne Übersetzung. Die Wörterbücher der Windows- und der Android-App (je rund 2050 Einträge) enthalten auch die Meldungen, die der Server an die Apps schickt. Texte, die ihr selbst in der Datenbank anlegt (Namen von Abteilungen, Status, Vorlagen), bleiben, wie ihr sie eingetragen habt. Windows-Programm (ab 2.9.0) und Android-App (ab 3.3.0) gibt es auf **Deutsch und English**. Die Sprache wechselst du über die Flaggen (Windows: in der Kopfleiste und auf der Anmeldung; Android: unter „Mehr“ und auf der Anmeldeseite); ohne Wahl gilt die Sprache von Windows bzw. des Telefons. Die Apps nutzen dafür ein Wörterbuch (`desktop/src/lang-en.js`, `mobile/src/main/assets/lang_en.json`): Schlüssel = deutscher Text, `{}` = wechselnder Teil, `{#}` = Zahl. Was nicht im Wörterbuch steht, bleibt deutsch. Nicht übersetzt werden Daten vom Server (Tickets, Namen, Texte der E-Mails) und Benachrichtigungen, die der Server schickt. Die Beschriftungen des Android-Widgets folgen der Sprache des Telefons. @@ -410,7 +426,7 @@ Windows-Programm (ab 2.9.0) und Android-App (ab 3.3.0) gibt es auf **Deutsch und - **Zufriedenheitsabfrage (CSAT):** Einstellungen → Allgemein → „Zufriedenheitsabfrage“. Nach dem Schließen oder Lösen eines Tickets (Wartezeit einstellbar, Standard 30 Minuten) bekommt der Kunde eine Mail mit fünf Sternen; ein Klick öffnet `csat.php`, gespeichert wird erst mit dem Knopf (so zählen automatische Link-Prüfungen nicht). Pro Ticket genau eine Abfrage, nur für Tickets, die nach dem Einschalten geschlossen werden; kein Spam, kein Live-Chat. Der Versand läuft über den Hintergrunddienst (`cron/send_csat.php`, alle 5 Minuten). Die Bewertung steht im Ticket (Web, App, Windows-Programm); die Auswertung (Durchschnitt, Rücklaufquote, Verteilung, nach Mitarbeiter, letzte Kommentare) auf der Übersicht im Web, im Windows-Programm unter Berichte und im Dashboard der App. Schnittstelle: `GET api/staff/v1/csat.php?days=30`. - **Cc und Beobachter:** Beobachter (Mitarbeiter) und Cc-Empfänger (E-Mail, bekommen die öffentlichen Antworten in Kopie) gab es im Web; jetzt auch in App und Windows-Programm (Karte „Beobachter und Cc“ im Ticket). Schnittstelle: `POST api/staff/v1/ticket_collaborators.php` (`add`/`remove`), `ticket.php` liefert `collaborators`, `followers` und `csat`. -- **Statusseite:** Adminportal → Statusseite (Dienste mit Zustand In Betrieb/Wartung/Eingeschränkt/Ausfall, Störungsmeldungen mit Updates). Öffentlich unter `/status.php` (Link „Status“ im Kundenbereich, wenn eingeschaltet). Dienste können deaktiviert werden; dann werden sie ausgeblendet und nicht weiter geprüft. Der Minecraft-Java-Eintrag wird der Kategorie „Apps“ zugeordnet; als Prüfziel sind Domain oder IP mit Port möglich (z. B. `play.example.de:25565` oder `203.0.113.10:25565`). Danach den Dienst aktivieren. Eine Meldung kann den Dienst gleich umstellen; „Behoben“ setzt ihn zurück, solange keine andere Meldung offen ist. In App und Windows-Programm unter Verwaltung → Statusseite (Zustände ändern und Meldungen veröffentlichen nur als Administrator). Schnittstelle: `api/staff/v1/status.php`. +- **Statusseite:** Adminportal → Statusseite (Dienste mit Zustand In Betrieb/Wartung/Eingeschränkt/Ausfall, Störungsmeldungen mit Updates). Öffentlich unter `/status.php` (Link „Status“ im Kundenbereich, wenn eingeschaltet). Dienste können deaktiviert werden; dann werden sie ausgeblendet und nicht weiter geprüft. Der Minecraft-Java-Eintrag wird der Kategorie „Apps“ zugeordnet; als Prüfziel sind Domain oder IP mit Port möglich (z. B. `play.example.de:25565` oder `203.0.113.10:25565`). Danach den Dienst aktivieren. Die **Plugin-Webseite** (offizieller Katalog) lässt sich als Dienst „Plugin-Webseite“ überwachen: Mit „Fehlende Standarddienste wiederherstellen“ wird er angelegt (nur wenn in `includes/catalog_defaults.php` ein Katalog eingetragen ist), geprüft wird das `health.php` neben dem Katalog (Prüfart „Plugin-Webseite“, auch am Namen automatisch erkannt). Er ist **intern**: Er wird geprüft und ist für Mitarbeiter sichtbar (Kategorie „Server & Datenbank“), steht aber nicht auf der öffentlichen Statusseite und ändert deren Gesamtzustand nicht. Mit „Intern machen“ / „Öffentlich machen“ lässt sich das für jeden Dienst umstellen (braucht das Datenbank-Update, Migration `php_0069`). Eine Meldung kann den Dienst gleich umstellen; „Behoben“ setzt ihn zurück, solange keine andere Meldung offen ist. In App und Windows-Programm unter Verwaltung → Statusseite (Zustände ändern und Meldungen veröffentlichen nur als Administrator). Schnittstelle: `api/staff/v1/status.php`. - **Ticket-Vorlagen:** Adminportal → Ticket-Vorlagen (Name, Betreff, Text, Abteilung, Hilfethema, Priorität; „für Kunden sichtbar“ zeigt sie auf „Neues Ticket“). Mitarbeiter wählen sie beim Anlegen eines Tickets im Web, im Windows-Programm und in der App (`GET api/staff/v1/ticket_templates.php`). Gepflegt werden die Vorlagen nur im Web. ## Weboberfläche aus den Apps öffnen @@ -572,13 +588,24 @@ Beide Apps (ab Windows 2.10.0 und Android 3.4.0) fragen beim Start und danach al Auf der Seite „Apps“ kann zusätzlich das Minecraft-Plugin (`DeskHub-Minecraft.jar`, siehe `minecraft-plugin/README.md`) erscheinen: mit Version, Größe, Prüfsumme und Kurzanleitung (Jar in `plugins`, `config.yml` ausfüllen, API-Schlüssel mit dem Recht „Tickets anlegen“, `/deskhubmc test`). Die Karte lässt sich unter **Einstellungen → System** („Minecraft-Plugin auf der Apps-Seite anzeigen“) ein- und ausblenden; ausgeblendet ist auch der Download gesperrt. Standard: aus. Die Jar veröffentlicht ihr wie die Apps in der Plugin-Webseite unter **Apps** (Plattform „Minecraft-Plugin (JAR)“). +Außerdem zeigt die Seite „Apps“ immer die Karten **WordPress-Plugin** und **Chrome-Erweiterung**: aktuelle Version, Größe, Prüfsumme, Download und Kurzanleitung. Beide ZIPs veröffentlicht ihr in der Plugin-Webseite unter **Apps** (Plattform „WordPress-Plugin (ZIP)“ bzw. „Chrome-Erweiterung (ZIP)“); die Versionsnummer wird aus dem Paket gelesen. Ohne veröffentlichte Version steht auf der Karte ein Hinweis. + ### Chrome-Erweiterung -Im Ordner `chrome-erweiterung/` liegt eine Erweiterung für Chrome, Edge und Brave (Manifest V3), die auf Windows, Mac und Linux läuft; ausführlich in `chrome-erweiterung/README.md`. Sie zeigt am Symbol einen **Zähler** für neue Tickets (Abfrage jede Minute), meldet Neues per **Benachrichtigung**, hat eine **Übersicht** (meine offenen, überfällige, nicht zugewiesene und als Nächstes fällige Tickets), eine **Suche** und ein Formular zum **Anlegen von Tickets**, auch per Rechtsklick auf markierten Text („Als DeskHub-Ticket anlegen“). Ein Klick auf ein Ticket öffnet es in der Weboberfläche, ohne erneute Anmeldung (einmalige Adresse wie in den Apps). +Im Ordner `chrome-erweiterung/` liegt eine Erweiterung für Chrome, Edge und Brave (Manifest V3), die auf Windows, Mac und Linux läuft; ausführlich in `chrome-erweiterung/README.md`. Seit Version 2.0.0 ist sie ein kleiner Arbeitsplatz in der Browserleiste: **Start** mit eigenem Status und Kennzahlen, **Ticketliste** mit Filtern und Suche, **Ticket-Ansicht** zum Lesen und **Antworten** (Textbausteine, Signatur, Status danach), interne Notiz, Status, Zuweisung, Wiedervorlage und Beobachten, dazu **Aufgaben**, **Ticket anlegen** (auch per Rechtsklick auf markierten Text) und **Zähler mit Benachrichtigungen** (Abfrage jede Minute). Sie läuft als Popup, in Chromes **Seitenleiste** oder als eigenes Fenster; es gibt Tastenkürzel (Alt+Shift+N, Alt+Shift+D) und die Adressleisten-Suche „dh“. -- **Installieren:** `chrome://extensions` → Entwicklermodus → „Entpackte Erweiterung laden“ → Ordner `chrome-erweiterung`. Anmelden mit Server-Adresse, E-Mail und Passwort (bei Authenticator mit Code). Chrome fragt einmal nach der Erlaubnis für **genau diesen Server**; sie wird beim Abmelden zurückgegeben. -- **Sicherheit:** Nur HTTPS, keine Cookies, keine Weiterleitungen; das Token liegt nur im lokalen Speicher der Erweiterung, Abmelden sperrt es auf dem Server. -- **Grenzen:** Meldungen nur bei geöffnetem Browser; Antworten, Zuweisen und Status ändern gehen in der Weboberfläche. Nicht im Chrome Web Store; `node pack.mjs` erzeugt ein ZIP dafür. +- **Installieren:** `chrome://extensions` → Entwicklermodus → „Entpackte Erweiterung laden“ → Ordner `chrome-erweiterung` (eine ältere Version vorher entfernen). Anmelden mit Server-Adresse, E-Mail und Passwort (bei Authenticator mit Code). Es gibt **keine Rückfrage** und keinen zweiten Anmeldeschritt: Der Serverzugriff steht im Manifest. +- **Sicherheit:** Nur HTTPS, keine Cookies, keine Weiterleitungen; das Token liegt nur im lokalen Speicher der Erweiterung, Abmelden sperrt es auf dem Server und löscht lokale Entwürfe. Der Manifest-Zugriff gilt für alle HTTPS-Adressen, der Code verbindet sich aber nur mit dem angemeldeten Server. +- **Grenzen:** Meldungen nur bei geöffnetem Browser; Anhänge werden angezeigt, zum Herunterladen das Ticket im Browser öffnen. Ein Ticket zu öffnen sperrt es für andere (wie in der Weboberfläche). Nicht im Chrome Web Store; `node pack.mjs` erzeugt ein ZIP dafür. + +### WordPress-Plugin + +Im Ordner `wordpress-plugin/` liegt das Plugin **DeskHub Tickets** (ZIP: `release/deskhub-tickets-wordpress-.zip`). Besucher einer WordPress-Seite legen damit Tickets in DeskHub an (`[deskhub_ticket]`) und fragen den Stand ab (`[deskhub_status]`). Das Plugin nutzt die öffentliche Ticket-API (Formulare mit eigenen Feldern ab Server 1.0.64). Dort wird nur ein **API-Schlüssel** gebraucht (*Verwalten → API-Schlüssel*, Recht „Tickets anlegen“, für die Statusabfrage zusätzlich „Tickets lesen“). + +- **Funktionen:** Formular mit den **eigenen Feldern und Texten des Hilfethemas aus DeskHub** (auch das Formular der Abteilung), Einwilligungs-Kästchen, Statusabfrage mit Verlauf, Spamschutz (Falle-Feld, Mindestzeit, Mengenbegrenzung, optional Cloudflare Turnstile), Verbindungstest, Deutsch und Englisch. Die Farben (Schrift, Rahmen, Feldhintergrund, Knopf) übernimmt das Formular automatisch vom Theme; die Akzentfarbe lässt sich in den Einstellungen fest vorgeben. Ausführlich in `wordpress-plugin/README.md`. +- **Sicherheit:** Der Schlüssel liegt nur auf dem WordPress-Server (oder in der `wp-config.php`) und geht nie an den Browser. Abteilung, Thema und Priorität sind im Formular unterschrieben. DeskHub selbst lässt sich nicht in einen Rahmen (iframe) einbetten; das Plugin braucht das nicht. +- **Grenzen:** Keine Dateianhänge (die API nimmt nur Text). DeskHub sieht die IP-Adresse des WordPress-Servers, nicht die des Besuchers. +- **Stand der Prüfung:** Getestet mit einem Nachbau der WordPress-Funktionen und gegen einen echten DeskHub-Server, noch nicht in einer echten WordPress-Installation. ### Windows-Programm für Linux und Mac @@ -659,6 +686,8 @@ Adminportal → **Einstellungen → „📥 osTicket Import“**. Mit Plugins rüstet ihr zusätzliche Funktionen nach, ohne DeskHub selbst zu verändern. Alles läuft unter Adminportal → **Plugins** (nur für echte Admins). +**Aufbau der Seite (ab Server 1.0.53, wie bei WordPress):** Drei Reiter. **Installiert** zeigt jedes Plugin als Zeile mit Zustand (Aktiv, Inaktiv, Fehler, Update), Beschreibung, Version, Berechtigungen und den Aktionen Aktivieren/Deaktivieren, Öffnen, Aktualisieren und Entfernen; oben stehen Filter mit Zahlen (Alle, Aktiv, Inaktiv, Mit Fehler, Update verfügbar) und eine Suche. **Plugin hinzufügen** enthält den Katalog als Kacheln (mit Suche) und den ZIP-Upload. **Katalog & Schlüssel** enthält Katalog-Adresse und Herausgeber-Schlüssel. + **Geprüfter Modus (Standard, wenn euer DeskHub einen offiziellen Katalog mitbringt):** Der Herausgeber eurer DeskHub-Version trägt vor dem Release seinen eigenen Katalog und seinen Signierschlüssel ein (siehe [Plugin- und Theme-Webseite](#plugin--und-theme-webseite)). Dann zeigt die Plugin-Seite oben **„Geprüfte Plugins“** mit dem aktuellen Angebot, und es gilt: - Plugins **aus dem Katalog** müssen mit dem Schlüssel des Herausgebers **signiert** sein. Nicht signierte oder fremd signierte Katalog-Pakete werden abgelehnt. @@ -700,16 +729,38 @@ Diese Plugins liegen als Zip unter `Plugins/plugins/`. **Alle außer dem Discord | Plugin | Zip | Berechtigungen | Was es tut | |---|---|---|---| | **Anhänge-Virenscan** | `virenscan-1.2.1.zip` | hooks.tickets, hooks.cron, ui.menu, db.migrations | Prüft Anhänge neuer Tickets und Antworten und sperrt gefährliche Dateien (Quarantäne, interne Notiz, Tag „Virus-Verdacht“, Mail an den Administrator). **Braucht nichts auf dem Server:** Die eingebaute Dateianalyse erkennt Programme und Skripte, getarnte Dateien (zum Beispiel eine .exe als PDF), doppelte Endungen, Office-Makros, PDF-Tricks, Skripte in HTML/SVG und Archive mit solchen Dateien. Optional gleicht eine **Hash-Abfrage bei VirusTotal** (nur der SHA-256-Wert, kostenloser Schlüssel) Dateien mit bekannter Schadsoftware ab; ClamAV wird zusätzlich genutzt, falls es schon installiert ist. Erkennt keine ganz neuen Viren in normal aussehenden Dokumenten. Menüpunkt im Adminportal, nur für Administratoren. | +| **VirusTotal-Anhangsprüfung** | `virustotal-1.0.0.zip` | hooks.tickets, hooks.cron, ui.menu, db.migrations | Hält jeden Anhang zurück, bis VirusTotal ihn geprüft hat (nur Fingerabdruck, keine Datei); sauber = frei, Schadsoftware = gesperrt, unbekannt = zurückgehalten (oder auf Wunsch hochgeladen). Siehe unten. | | **Spam- und Missbrauchsfilter** | `spamfilter-1.0.2.zip` | hooks.tickets, ui.menu, ui.sidebar, db.migrations | Bewertet jedes neue Ticket mit Punkten (Phishing-Wendungen, Marken-Nachahmung im Absendernamen, Link-Verkürzer, Wegwerf-Adressen, Wiederholungen/Kampagnen; bekannte Absender bekommen Abzug). Ab 70 Punkten wird das Ticket automatisch als Spam abgelegt, ab 35 erhält es den Tag „Spam-Verdacht“. Freigabe- und Sperrliste, eigene Wörter, Protokoll mit Knöpfen „Kein Spam“ / „Doch Spam“ und eine Bewertung in der Seitenleiste des Tickets. | | **Discord- und Telegram-Bot** | `community-bot-1.0.2.zip` | **api.public**, hooks.tickets, ui.menu, db.migrations | Mitglieder legen mit `/ticket` im Discord oder in Telegram ein Ticket an, bekommen die Ticketnummer zurück und werden bei Antworten und bei Lösung benachrichtigt. Weitere Befehle: `/status`, `/antwort`. Der Server nimmt die Anfragen direkt entgegen (kein eigener Bot-Server); Anfragen werden per Signatur (Discord) bzw. Geheimtoken (Telegram) geprüft. Je Person gilt eine Obergrenze pro Stunde. Discord braucht die PHP-Erweiterung **sodium**. Einrichtung (Anwendungs-ID, Public Key, Bot-Token) auf der Plugin-Seite. | -| **Urlaub und Vertretung** | `vertretung-1.0.1.zip` | hooks.tickets, hooks.cron, ui.menu, db.migrations | Mitarbeiter tragen Abwesenheit mit Vertretung ein. Zum Beginn gehen ihre offenen Tickets an die Vertretung, neue Tickets ebenfalls (auch bei der automatischen Zuweisung der Abteilung), am Ende kommen die noch offenen Tickets zurück. Setzt dafür den Urlaubsstatus im Profil. Braucht den Cron-Aufruf bzw. den Pseudo-Cron. | +| **Urlaub und Vertretung** | `vertretung-1.1.0.zip` | hooks.tickets, hooks.cron, ui.menu, db.migrations | Mitarbeiter tragen Abwesenheit mit Vertretung ein. Zum Beginn gehen ihre offenen Tickets an die Vertretung, neue Tickets ebenfalls (auch bei der automatischen Zuweisung der Abteilung), am Ende kommen die noch offenen Tickets zurück. Setzt dafür den Urlaubsstatus im Profil. Ab Server 1.0.56 (Plugin ab 1.1.0 für Server 1.0.55) gibt auch die Abwesenheit im Profil (ohne Plugin) offene Tickets an die Vertretung weiter und nach dem Urlaub zurück. Ab 1.0.55 sieht und bearbeitet die Vertretung während der Abwesenheit auch die Abteilungen des Abwesenden, selbst wenn sie dort sonst keinen Zugang hat (Ketten bis drei Stufen; bei einem abwesenden Administrator die Abteilungen der zugewiesenen offenen Tickets). Braucht den Cron-Aufruf bzw. den Pseudo-Cron. | | **Schichtübergabe** | `schichtuebergabe-1.1.4.zip` | hooks.cron, ui.menu, ui.sidebar, db.migrations | Am Ende der Schicht schreibt ein Mitarbeiter eine kurze Notiz (für alle oder nur eine Abteilung). Die nächste Schicht sieht sie sofort nach der Anmeldung als deutlichen Hinweis oben auf jeder Seite (rot bei wichtigen Notizen, mit Text und Link), außerdem als „neu“-Zähler im Menü und, wenn wichtig, in der Seitenleiste jedes Tickets. Der Hinweis oben braucht die aktuellen DeskHub-Dateien (`staff/_header.php`, `includes/plugins.php`), sonst bleiben Zähler und Seitenleiste. Der Verfasser sieht, wer sie gelesen hat (auch als Bestätigung auf der Übersicht). Alte Notizen werden automatisch gelöscht (Frist nur für Administratoren). Für Mitarbeiter und Administratoren. | | **Störungsmitteilung und Rundmail** | `rundmail-1.0.1.zip` | hooks.cron, ui.menu, db.migrations | Eine Nachricht an viele Kunden gleichzeitig, zum Beispiel bei Wartung oder Ausfall. Empfänger: Kunden mit offenen Tickets, einer Abteilung oder einer Organisation. Mit Vorlagen, Empfängerprüfung, Probemail und Protokoll; jede Mail geht einzeln raus, der Versand läuft im Hintergrund. Mitarbeiter schreiben nur an Kunden ihrer eigenen Abteilungen (höchstens 200 Empfänger, 5 Rundmails pro Stunde). Für Mitarbeiter und Administratoren. | | **Website- und Server-Überwachung** | `ueberwachung-1.1.2.zip` | hooks.cron, ui.menu, db.migrations | Prüft Webseiten, Ports und Zertifikate. Bei Ausfall (nach 2 Fehlschlägen in Folge) oder einem Zertifikat, das in 14 Tagen abläuft, legt das Plugin ein Ticket an und schickt eine Mail; nach der Behebung kommt die Entwarnung und das Ticket wird gelöst. Der je Ziel eingestellte Prüfabstand (ab 1 Minute) wird eingehalten: Der Hintergrunddienst von DeskHub läuft jede Minute, mit dem echten Server-Cronjob (Einstellungen → Cron-Jobs → „Neu installieren / aktualisieren“) auch nachts ohne Besucher, sonst nur solange die Seite aufgerufen wird. Für ältere Dateien liegt ein eigener Cronjob bei (`plugins/ueberwachung/cron.php`). Menüpunkt im Adminportal, nur für Administratoren. | | **Datenschutz** | `datenschutz-1.2.1.zip` | hooks.cron, ui.menu, db.migrations | Kundendaten aus Tickets ohne Registrierung werden nach einer frei wählbaren Frist (Tage, Wochen, Monate oder Jahre; Standard 30 Tage nach dem Schließen) unwiderruflich anonymisiert. Welche Daten, bestimmen Sie selbst: nur Name, nur E-Mail-Adresse, beides oder komplett (auch IP, Mitleser, Zusatzfelder, Nachrichten und Anhänge). Daten registrierter Kunden bleiben bis zur Löschung auf Antrag, die der Administrator mit einem Klick ausführt. Die automatische Anonymisierung ist nach der Installation **aus** und muss bewusst eingeschaltet werden. Menüpunkt im Adminportal, nur für Administratoren. | +| **authentik-Anmeldung** | `authentik-1.2.4.zip` | ui.menu, **auth.login**, **auth.customer** | Mitarbeiter und Kunden melden sich mit authentik an (OpenID Connect mit PKCE). Mitarbeiter verknüpfen ihr Konto selbst, Kundenkonten werden bei Bedarf angelegt. Benötigt Server 1.0.52. Siehe unten. | **Hinweis zur Berechtigung `api.public`:** Sie erlaubt einem Plugin eine ohne Anmeldung erreichbare Adresse (`/api/public/v1/plugin_webhook.php?p=&e=`). Der Bot prüft jede Anfrage selbst; trotzdem solltet ihr diese Berechtigung nur Plugins geben, denen ihr vertraut. +### Mitgeliefertes Plugin: VirusTotal-Anhangsprüfung + +`Plugins/plugins/virustotal-1.0.0.zip` (Quelle: `Plugins/plugins/virustotal/`, ausführlich in dessen `README.md`) hält **jeden neuen Anhang zurück, bis VirusTotal ihn geprüft hat**. Anders als der Virenscan, der VirusTotal erst nachträglich fragt, sperrt dieses Plugin zuerst. + +- **Ablauf:** Anhang sofort gesperrt (`[IN PRÜFUNG]`, Datei im Ordner `uploads/vt-pruefung/`) → Abfrage des SHA-256-Fingerabdrucks → sauber: freigegeben; ab *Schwelle* Scanner (Standard 3) mit Schadsoftware: gesperrt, Tag „Virus-Verdacht“, Hinweis im Ticket, Mail an den Administrator; unbekannt: zurückgehalten, bis ein Administrator unter **VirusTotal** freigibt oder löscht (einstellbar: freigeben oder hochladen). +- **Datenschutz:** Standardmäßig verlässt **keine Datei** den Server. „Unbekannte Dateien hochladen“ (bis 32 MB, aus) sendet die Datei an VirusTotal, wo sie gespeichert und Dritten zugänglich wird: nur bewusst einschalten. +- **Einrichten:** Kostenlosen API Key bei virustotal.com holen, unter **VirusTotal** eintragen, **Schlüssel testen**. Ohne Schlüssel wird nichts zurückgehalten; Anhänge von vor dem Einschalten bleiben unberührt. +- **Limits:** Der kostenlose Schlüssel erlaubt 4 Abfragen pro Minute und 500 pro Tag; das Plugin hält sich daran (4 pro Lauf, 480 pro Tag), dann entsteht eine Warteschlange. Mit echtem Cronjob laufen die Abfragen jede Minute, sonst alle 5 Minuten. +- **Grenzen:** Unbekannt heißt nicht sauber (neue Schadsoftware kennt VirusTotal oft nicht), darum gilt „zurückhalten“ als Standard; kein Entpacken von Archiven (dafür der Virenscan). **Nicht gegen das echte VirusTotal ausprobiert:** geprüft ist der Ablauf gegen einen nachgebauten Dienst (`tests/plugin_virustotal.php`). Bitte nach dem Einrichten mit einem Testanhang ausprobieren (zum Beispiel einer harmlosen Textdatei). + +### Mitgeliefertes Plugin: authentik-Anmeldung (OpenID Connect) + +Mitarbeiter **und Kunden** melden sich mit **authentik** an; auf der Anmeldeseite des Mitarbeiterbereichs erscheint zusätzlich „Mit authentik anmelden“. Das Plugin liegt als `Plugins/plugins/authentik-1.2.4.zip` (Quelle: `Plugins/plugins/authentik/`, ausführlich in dessen `README.md`) und braucht **Server 1.0.52** (die Erweiterung für Anmelde-Plugins). + +- **Einrichten:** In authentik einen OAuth2/OpenID-Provider (vertraulich) anlegen, als Umleitungs-URI die Adresse von der Einstellungsseite eintragen (`https:///staff/plugin_login.php?p=authentik&e=callback`), Bereiche `openid email profile` (für Gruppen zusätzlich `groups`). In DeskHub das Plugin hochladen, aktivieren (Berechtigung **auth.login** bestätigen) und unter **authentik** Issuer-Adresse (`https://auth.example.de/application/o/`), Client-ID und Geheimnis eintragen, einschalten, **Verbindung testen**. +- **Mitarbeiter:** Nur wer in authentik bestätigt ist und in DeskHub ein **aktives, verknüpftes Mitarbeiterkonto** hat. Verknüpft wird selbst unter „Mein authentik-Konto“ (oder automatisch bei der ersten Anmeldung mit gleicher E-Mail-Adresse; abschaltbar mit „Nur verknüpfte Konten“); die Verknüpfung hängt an der festen authentik-Kennung, nicht an der E-Mail-Adresse. Optional nur Mitglieder einer authentik-Gruppe. Mitarbeiterkonten werden **nicht** automatisch angelegt. +- **Kunden (Ticketersteller):** In den Einstellungen einschaltbar. Es zählt die in authentik bestätigte E-Mail-Adresse; ein passendes Kundenkonto wird angemeldet, bei Bedarf **automatisch angelegt** (ohne Passwort, Name aus authentik, Sperrliste wird beachtet), optional nur für eine eigene authentik-Gruppe. Dieselbe Rückkehr-Adresse wie bei Mitarbeitern. Authenticator-Code von DeskHub entfällt dabei (authentik übernimmt das). E-Mail und Passwort funktionieren weiter, auch wenn authentik ausfällt. +- **Sicherheit:** PKCE, `state`, `nonce`, einmalig und höchstens 10 Minuten gültig; Aussteller, Zielgruppe und Ablauf werden geprüft; das Token kommt direkt von authentik über eine geprüfte HTTPS-Verbindung; das Geheimnis liegt verschlüsselt in der Datenbank; jede Anmeldung und Ablehnung steht im Admin-Protokoll. +- **Grenzen:** Keine Rollen aus Gruppen, kein Single Logout; Kunden werden nur über die E-Mail-Adresse zugeordnet. **Nicht an einem echten authentik ausprobiert:** geprüft ist der Ablauf gegen einen nachgebauten Anmeldedienst (`tests/plugin_authentik.php`, `tests/plugin_login.php`). Bitte nach dem Einrichten einmal mit einem Testkonto anmelden und im Admin-Protokoll nachsehen. + ### Mitgeliefertes Plugin: Synology NAS Backup (WebDAV) Unter `Plugins/plugins/nas-backup-2.6.5.zip` liegt ein Plugin, das die Backups eures Servers automatisch auf eine Synology NAS (oder einen anderen WebDAV-Server) kopiert. Es ist aufgebaut wie das Plugin „Tagesbericht“: Es braucht nur die Standard-Berechtigungen **hooks.cron** und **ui.menu** und verändert nichts am Kern von DeskHub. Installation: Adminportal → Plugins → Zip hochladen → Berechtigungen bestätigen → aktivieren. Danach gibt es auf der Seite **Backup** den Reiter **„Synology NAS Backup“** (kein eigener Menüpunkt in der Seitenleiste; nur Administratoren sehen ihn). Dafür braucht das Plugin keine zusätzliche Berechtigung. @@ -747,6 +798,8 @@ Gut zu wissen: ## Plugins entwickeln +**Anmelde-Plugins (ab Server 1.0.52):** Mit der Berechtigung `auth.login` kann ein Plugin über `plugin_register_login('name', fn($req) => …)` eine Adresse `/staff/plugin_login.php?p=&e=` anbieten und mit dem Filter `staff.login.buttons` Knöpfe auf die Anmeldeseite setzen (Link bauen mit `plugin_login_url($slug, $name)`). Der Handler gibt `['redirect' => 'https://…']` (nur https, oder http zu localhost), `['staff_id' => 12, 'via' => 'Dienst']` oder `['error' => 'Text']` zurück; DeskHub meldet nur **aktive** Mitarbeiter an, schreibt ins Admin-Protokoll und begrenzt die Aufrufe. Das Plugin trägt die Verantwortung, wer sich anmelden darf; die Berechtigung wird bei der Aktivierung deutlich als Warnung angezeigt. Für **Kunden** gibt es die Berechtigung `auth.customer`: `plugin_register_customer_login('name', fn() => …)` bietet `/plugin_login.php?p=&e=` an (Link mit `plugin_customer_login_url()`, Knöpfe über den Filter `customer.login.buttons`); der Handler gibt `['redirect' => …]`, `['error' => …]` oder `['customer' => ['email' => …, 'name' => …, 'create' => true|false, 'via' => …]]` zurück, DeskHub meldet dann das Konto mit dieser E-Mail-Adresse an und legt es bei `create` an (zufälliges Passwort, Sperrliste wird beachtet, Eintrag im Admin-Protokoll). Auch die Rückkehr über `/staff/plugin_login.php` darf ein `customer`-Ergebnis liefern. Mit `plugin_register_login(…, …, true)` laufen Adressen auch für schon angemeldete Mitarbeiter (zum Beispiel zum Verknüpfen). Beispiel: `Plugins/plugins/authentik/`. + **Übersetzungen:** Ein Plugin kann seine Texte in `lang/.json` (zum Beispiel `lang/en.json`) übersetzen, ohne dass dafür am Sprachpaket etwas geändert werden muss. Format und Wirkung stehen unter „Mehrsprachigkeit“ weiter oben; ein Beispiel liegt in `Plugins/plugin-beispiel/lang/en.json`. Tipp: Sammelmodus einschalten (Adminportal → Sprachen), die Plugin-Seiten durchklicken und über „Vorlage laden“ alle noch fehlenden Texte als fertige Vorlage herunterladen. Dieser Abschnitt richtet sich an Entwickler. Ein vollständiges, lauffähiges Beispiel liegt in `Plugins/plugin-beispiel/`, ein praxisnahes in `Plugins/plugins/tagesbericht/` (jeweils im Projektordner neben `DeskHub-Webseite/`). @@ -927,9 +980,11 @@ Im Projektordner `plugin-webseite/` (neben `DeskHub-Webseite/`, nicht Teil der D **Zugangsschutz des Katalogs:** `docker-build.sh` / `docker-build.ps1` erzeugen beim ersten Bauen einen Zugangsschlüssel (`schluessel/katalog-zugangsschluessel.txt`) und geben ihn am Ende aus. Tragt ihn in `includes/catalog_defaults.php` als `access_key` ein. Ohne diesen Schlüssel liefern Katalog, Downloads, Vorschaubilder und `publisher-key.php` nur `401`. `health.php` bleibt offen (Docker-Healthcheck). Nach dem Bauen: Image auf dem Server austauschen und ein DeskHub-Release mit dem eingetragenen Schlüssel veröffentlichen. -**Verwaltung (`admin.php`):** Geordnet in Reiter: **Übersicht** (Zahlen, Systemstatus, Warnung bei fehlendem Zugangsschlüssel), **Pakete** (Plugins links, Themes rechts), **Apps** (Windows, Android und Minecraft nebeneinander, mit der aktuellen Version), **Push-Dienst** und **Einstellungen** (Werte für DeskHub, Abmelden). Die Seite hat ein Favicon, passt sich hell und dunkel an und funktioniert auf dem Handy. +**Vorschaubilder:** Das Bild eines Plugins oder Themes ist nur beim ersten Veröffentlichen nötig (oder liegt als `vorschau.png` im ZIP). Es bleibt bei neuen Versionen erhalten, auch wenn die alte Version vorher entfernt wurde, und lässt sich in der Verwaltung beim Eintrag ersetzen oder entfernen. -**Apps und Minecraft-Plugin veröffentlichen:** Unter „Apps“ Plattform wählen (Windows-EXE, Android-APK, Minecraft-Plugin-JAR), Versionsnummer eintragen (zum Beispiel `3.4.4`), Datei hochladen, optional „Änderungen“ (erscheinen im Update-Hinweis der Apps). Die **höchste** Version gilt als aktuell. DeskHub bezieht sie über den geschützten Endpunkt `app-release.php` und zeigt sie auf der Seite „Apps“ an; die Apps zeigen daraus ihren Update-Hinweis. +**Verwaltung (`admin.php`):** Geordnet in Reiter: **Übersicht** (Zahlen, Systemstatus, Warnung bei fehlendem Zugangsschlüssel), **Pakete** (Plugins links, Themes rechts), **Apps** (Windows, Android, Minecraft, WordPress-Plugin und Chrome-Erweiterung mit der aktuellen Version), **Push-Dienst** und **Einstellungen** (Werte für DeskHub, Abmelden). Die Seite hat ein Favicon, passt sich hell und dunkel an und funktioniert auf dem Handy. + +**Apps, Plugins und Erweiterungen veröffentlichen:** Unter „Apps“ Plattform wählen (Windows-EXE, Android-APK, Minecraft-Plugin-JAR, WordPress-Plugin-ZIP, Chrome-Erweiterung-ZIP), Versionsnummer eintragen (zum Beispiel `3.4.4`; bei den beiden ZIPs darf das Feld leer bleiben, die Nummer steht dann im Plugin-Kopf bzw. in der `manifest.json`), Datei hochladen, optional „Änderungen“ (erscheinen im Update-Hinweis der Apps). Die **höchste** Version gilt als aktuell. DeskHub bezieht sie über den geschützten Endpunkt `app-release.php` und zeigt sie auf der Seite „Apps“ an; die Apps zeigen daraus ihren Update-Hinweis. **Upload-Grenzen:** Das Docker-Image erlaubt Uploads bis 310 MB (PHP) bzw. 320 MB (Caddy). Steht davor ein eigener Proxy, muss er es ebenfalls erlauben (nginx: `client_max_body_size 320m;`). Cloudflare im Gratis-Tarif lässt höchstens 100 MB je Upload zu. Ist eine Datei zu groß, meldet die Seite das mit den aktuellen Grenzen und meldet nicht mehr ab. @@ -945,6 +1000,8 @@ Basis-Adresse: `https://support.example.de/api/public/v1/tickets.php` **Authentifizierung:** Jeder Aufruf braucht einen API-Schlüssel (Format `dh_` plus 48 Hexzeichen), entweder im Header `X-API-Key: dh_…` oder als `Authorization: Bearer dh_…`. Der Schlüssel wird im Adminportal unter **API-Schlüssel** erzeugt und nur einmal angezeigt. Er hat die Rechte „Tickets anlegen“ und/oder „Tickets lesen“ und kann auf IP-Adressen beschränkt sein. Aufrufe von nicht erlaubten Adressen werden wie ein falscher Schlüssel behandelt (401). Verwendet die API nur über HTTPS und nur in serverseitigem Code, nie im Browser eurer Besucher. +Hat der Schlüssel eine **IP-Beschränkung** („Erlaubte IPs“) und kommt der Aufruf von einer anderen Adresse, antwortet die API mit `401` und dem Code `IP_NOT_ALLOWED`; die Meldung nennt die Adresse, die DeskHub sieht (hinter Proxy oder Cloudflare oft nicht die erwartete). Ein falscher, unbekannter oder abgeschalteter Schlüssel liefert weiter nur `UNAUTHENTICATED`. + Anfragen und Antworten sind JSON (UTF-8). Fehler haben immer diese Form: ```json @@ -965,6 +1022,8 @@ Anfragen und Antworten sind JSON (UTF-8). Fehler haben immer diese Form: | `departmentId` | nein | ID der Abteilung | | `priorityId` | nein | ID der Priorität | +| `fields` | nein | Die Angaben zum Kundenformular: `{ "": "Wert", … }`. Nur mit `fields` prüft DeskHub die Felder des Formulars (Pflichtfelder, Auswahlwerte, Zahl, Datum) und speichert die Werte im Ticket; ohne `fields` bleibt alles wie bisher. Hat die Abteilung ein eigenes Formular ohne Betreff oder Beschreibung, dürfen `subject` und `message` entfallen (Betreff „Anfrage “, Text aus den Feldern). Fehler heißen `INVALID_FIELD`, die Meldung ist für Besucher gedacht. | + Die IDs seht ihr im Adminportal in der Adresszeile beim Bearbeiten (`…?edit=`). Ohne Angaben gelten die Standardabteilung und die erste Priorität der Prioritätenliste. Ticket-Regeln, SLA-Pläne und Benachrichtigungen laufen wie bei jedem anderen Ticket. Der Kunde bekommt die übliche Bestätigungs-E-Mail. Das Ticket hat die Quelle `api`. ```bash @@ -980,6 +1039,13 @@ Antwort `201 Created`: { "number": "T-1042", "status": "open" } ``` +#### Hilfethemen und Kundenformular abfragen + +Website-Formulare (zum Beispiel das [WordPress-Plugin](#wordpress-plugin)) holen sich damit dasselbe Formular, das Kunden im Kundenportal sehen. Recht „Tickets anlegen“. + +- `GET /api/public/v1/tickets.php?topics=1` liefert die öffentlichen, aktiven Hilfethemen: `{ "topics": [{ "id", "name", "path", "depth", "parentId", "departmentId" }] }`. +- `GET /api/public/v1/tickets.php?form=1&helpTopicId=3` (oder `departmentId=2`) liefert das Formular des Hilfethemas: `{ "form": { "title", "intro", "ownForm", "subject": { "show", "label" }, "message": { "show", "label", "hint" }, "submitLabel", "fields": [{ "id", "label", "type", "required", "options", "helpHtml", "width", "section", "radioInline" }] } }`. Hat die Abteilung ein eigenes Formular, gelten dessen Texte und Felder, sonst die allgemeinen Felder und die des Hilfethemas. Feldtypen: `text`, `textarea`, `select`, `radio`, `checkbox`, `number`, `date`. `helpHtml` ist sicheres HTML (Links mit absoluter Adresse). + #### Ticketstatus abfragen `GET /api/public/v1/tickets.php?number=T-1042&email=erika@example.de`, Recht „Tickets lesen“.