From e9e48ff314aacb8bf6c85bbb4d5cb917ee22f762 Mon Sep 17 00:00:00 2001 From: Kevin Feiler Date: Thu, 16 Oct 2025 03:42:47 +0200 Subject: [PATCH] Dokumentation --- CHANGELOG.md | 15 + KEYHELP_API_REFERENCE.md | 455 ++++++++++++++++++ modules/servers/keyhelpmanager.zip | Bin 9506 -> 0 bytes .../servers/keyhelpmanager/keyhelpmanager.php | 23 +- 4 files changed, 480 insertions(+), 13 deletions(-) create mode 100644 KEYHELP_API_REFERENCE.md delete mode 100644 modules/servers/keyhelpmanager.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index abef9ca..e802a2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). ## [Unreleased] +### Behoben +- **API-Endpunkte korrigiert:** + - ✅ Alle `/users` Endpunkte auf korrekte `/clients` Endpunkte umgestellt + - ✅ Parameter `user_id` auf `id_client` korrigiert + - ✅ Parameter `plan_id` auf `id_hosting_plan` korrigiert + - ✅ Behebt "Endpoint not found" Fehler beim Server hinzufügen + - KeyHelp API verwendet `/clients`, nicht `/users` + ### Hinzugefügt - **Automatische SSL-Verifizierung bei IP-Adressen:** - SSL-Verifizierung wird automatisch deaktiviert wenn eine IP-Adresse als Hostname verwendet wird @@ -14,10 +22,17 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). - Manuelle Deaktivierung möglich über HTTP Prefix "no-verify" - Logging-Hinweis wenn SSL-Verifizierung deaktiviert wird +- **Template-System mit Fallback:** + - Automatischer Fallback auf "Manual Configuration" wenn `/plans` Endpunkt nicht verfügbar + - Kompatibel mit KeyHelp Free (ohne Hosting-Pläne) + - Optional: Hosting-Pläne wenn verfügbar (KeyHelp Pro) + ### Dokumentation +- Neue Datei `KEYHELP_API_REFERENCE.md` mit vollständiger API-Dokumentation - Neue Datei `SSL_TROUBLESHOOTING.md` mit umfassender SSL-Fehlerbehandlung - README.md erweitert um SSL-Konfigurationshinweise - QUICKSTART.md aktualisiert mit SSL-Best-Practices +- Korrekte API-Endpunkte und Parameter dokumentiert ### Geplant - Multi-Language Support (Deutsch/Englisch) diff --git a/KEYHELP_API_REFERENCE.md b/KEYHELP_API_REFERENCE.md new file mode 100644 index 0000000..016e15d --- /dev/null +++ b/KEYHELP_API_REFERENCE.md @@ -0,0 +1,455 @@ +# KeyHelp API v2 Referenz + +Diese Datei dokumentiert die tatsächlich verwendeten KeyHelp API v2 Endpunkte und Parameter. + +## Offizielle Dokumentation + +- **Swagger API Docs:** https://app.swaggerhub.com/apis-docs/keyhelp/api/2.12 +- **KeyHelp Wiki:** https://wiki.keyhelp.de/books/api + +## Wichtige Unterschiede + +⚠️ **ACHTUNG:** KeyHelp verwendet `/clients` statt `/users`! + +## Verwendete Endpunkte + +### 1. Client (Benutzer) erstellen + +**Endpunkt:** `POST /api/v2/clients` + +**Request Body:** +```json +{ + "login_name": "example_com", + "password": "SecurePassword123!", + "email": "user@example.com", + "display_name": "Max Mustermann", + "id_hosting_plan": 5 // Optional: Hosting-Plan ID +} +``` + +**Response:** +```json +{ + "id": 42, + "login_name": "example_com", + "email": "user@example.com", + "display_name": "Max Mustermann", + "is_locked": false, + "created_at": "2024-01-20 10:30:00" +} +``` + +**Verwendung im Modul:** `keyhelpmanager_CreateAccount()` + +--- + +### 2. Client-Details abrufen + +**Endpunkt:** `GET /api/v2/clients/{id}` + +**Response:** +```json +{ + "id": 42, + "login_name": "example_com", + "email": "user@example.com", + "display_name": "Max Mustermann", + "is_locked": false, + "id_hosting_plan": 5, + "created_at": "2024-01-20 10:30:00", + "updated_at": "2024-01-20 10:30:00" +} +``` + +**Verwendung im Modul:** Integriert in verschiedenen Funktionen + +--- + +### 3. Client aktualisieren + +**Endpunkt:** `PUT /api/v2/clients/{id}` + +**Request Body (Beispiele):** + +**Passwort ändern:** +```json +{ + "password": "NewSecurePassword456!" +} +``` + +**Client sperren:** +```json +{ + "is_locked": true +} +``` + +**Client entsperren:** +```json +{ + "is_locked": false +} +``` + +**Verwendung im Modul:** +- `keyhelpmanager_SuspendAccount()` - Client sperren +- `keyhelpmanager_UnsuspendAccount()` - Client entsperren +- `keyhelpmanager_ChangePassword()` - Passwort ändern + +--- + +### 4. Client löschen + +**Endpunkt:** `DELETE /api/v2/clients/{id}` + +**Response:** `204 No Content` bei Erfolg + +**Verwendung im Modul:** `keyhelpmanager_TerminateAccount()` + +--- + +### 5. Domain erstellen + +**Endpunkt:** `POST /api/v2/domains` + +**Request Body:** +```json +{ + "domain_name": "example.com", + "id_client": 42 +} +``` + +**Response:** +```json +{ + "id": 123, + "domain_name": "example.com", + "id_client": 42, + "document_root": "/home/example_com/www", + "created_at": "2024-01-20 10:30:00" +} +``` + +**Hinweis:** Template/Hosting-Plan wird über den Client angewendet, nicht über die Domain! + +**Verwendung im Modul:** `keyhelpmanager_CreateAccount()` + +--- + +### 6. Domain-Details abrufen + +**Endpunkt:** `GET /api/v2/domains/{id}` + +**Response:** +```json +{ + "id": 123, + "domain_name": "example.com", + "id_client": 42, + "document_root": "/home/example_com/www", + "php_version": "8.2", + "is_enabled": true, + "created_at": "2024-01-20 10:30:00", + "updated_at": "2024-01-20 10:30:00" +} +``` + +**Verwendung im Modul:** Integriert in verschiedenen Funktionen + +--- + +### 7. Client-Statistiken abrufen + +**Endpunkt:** `GET /api/v2/clients/{id}/statistics` + +**Response:** +```json +{ + "disk_usage": 2415919104, + "disk_quota": 5368709120, + "traffic_usage": 16106127360, + "traffic_quota": 107374182400, + "domain_count": 3, + "database_count": 2, + "email_count": 5 +} +``` + +**Hinweis:** Werte sind in Bytes + +**Verwendung im Modul:** `keyhelpmanager_ClientArea()` + +--- + +### 8. Session erstellen (SSO) + +**Endpunkt:** `POST /api/v2/sessions` + +**Request Body:** +```json +{ + "id_client": 42 +} +``` + +**Response:** +```json +{ + "token": "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz", + "expires_at": "2024-01-20 10:35:00" +} +``` + +**Login-URL Format:** +``` +https://your-keyhelp-server.com/login?token={token} +``` + +**Verwendung im Modul:** `keyhelpmanager_LoginLink()` + +--- + +### 9. Server-Version prüfen (Connection Test) + +**Endpunkt:** `GET /api/v2/server/version` + +**Response:** +```json +{ + "version": "24.3.1", + "build": "3456" +} +``` + +**Verwendung im Modul:** `keyhelpmanager_TestConnection()` + +--- + +### 10. Hosting-Pläne abrufen (Optional - KeyHelp Pro) + +**Endpunkt:** `GET /api/v2/hosting-plans` + +**Response:** +```json +[ + { + "id": 1, + "name": "Basic Plan", + "disk_quota": 5368709120, + "traffic_quota": 107374182400, + "max_domains": 3, + "max_databases": 5, + "max_email_accounts": 10 + }, + { + "id": 2, + "name": "Pro Plan", + "disk_quota": 21474836480, + "traffic_quota": 429496729600, + "max_domains": 10, + "max_databases": 20, + "max_email_accounts": 50 + } +] +``` + +**Hinweis:** Dieser Endpunkt ist möglicherweise nur in KeyHelp Pro verfügbar! + +**Verwendung im Modul:** `_keyhelpmanager_GetTemplates()` - mit Fallback auf manuelle Konfiguration + +--- + +## API-Authentifizierung + +Alle Requests benötigen einen API-Key im Header: + +``` +X-API-Key: your-api-key-here +Content-Type: application/json +Accept: application/json +``` + +## Fehlerbehandlung + +### Typische Fehler-Responses + +**404 Not Found:** +```json +{ + "error": "Endpoint not found" +} +``` + +**401 Unauthorized:** +```json +{ + "error": "Invalid API key" +} +``` + +**400 Bad Request:** +```json +{ + "error": "Validation failed", + "details": { + "login_name": "This field is required", + "email": "Invalid email format" + } +} +``` + +**500 Internal Server Error:** +```json +{ + "error": "Internal server error" +} +``` + +--- + +## SSL/TLS-Konfiguration + +### Empfohlene Einstellungen + +**Produktion:** +``` +https://your-domain.com +SSL-Verifizierung: ON +``` + +**Entwicklung/Test mit IP:** +``` +https://5.83.148.129 +SSL-Verifizierung: Automatisch deaktiviert (IP-Erkennung) +``` + +**Selbstsigniertes Zertifikat:** +``` +https://your-domain.com +HTTP Prefix: no-verify +``` + +--- + +## Häufige Probleme + +### 1. "Endpoint not found" bei `/users` + +**Problem:** KeyHelp verwendet `/clients`, nicht `/users` + +**Lösung:** Alle Endpunkte verwenden `/clients` + +### 2. "Endpoint not found" bei `/plans` oder `/hosting-plans` + +**Problem:** Endpunkt existiert nur in KeyHelp Pro oder älteren Versionen + +**Lösung:** Modul nutzt automatisch "Manual Configuration" als Fallback + +### 3. SSL-Zertifikat-Fehler bei IP-Adressen + +**Problem:** SSL-Zertifikat ist für Domain ausgestellt, nicht für IP + +**Lösung:** Modul erkennt IP-Adressen automatisch und deaktiviert SSL-Verifizierung + +### 4. Parameter-Namen falsch + +**Häufige Fehler:** +- ❌ `user_id` → ✅ `id_client` +- ❌ `plan_id` → ✅ `id_hosting_plan` +- ❌ `template_id` → ✅ Nicht bei Domains verwenden + +--- + +## Code-Beispiele + +### cURL-Beispiel: Client erstellen + +```bash +curl -X POST https://your-keyhelp-server.com/api/v2/clients \ + -H "X-API-Key: your-api-key" \ + -H "Content-Type: application/json" \ + -d '{ + "login_name": "testuser", + "password": "SecurePass123!", + "email": "test@example.com", + "display_name": "Test User" + }' +``` + +### cURL-Beispiel: Domain erstellen + +```bash +curl -X POST https://your-keyhelp-server.com/api/v2/domains \ + -H "X-API-Key: your-api-key" \ + -H "Content-Type: application/json" \ + -d '{ + "domain_name": "example.com", + "id_client": 42 + }' +``` + +### cURL-Beispiel: Statistiken abrufen + +```bash +curl -X GET https://your-keyhelp-server.com/api/v2/clients/42/statistics \ + -H "X-API-Key: your-api-key" \ + -H "Accept: application/json" +``` + +### PHP-Beispiel mit Guzzle + +```php +use GuzzleHttp\Client; + +$client = new Client([ + 'base_uri' => 'https://your-keyhelp-server.com', + 'verify' => true, // oder false bei selbstsigniertem Zert + 'timeout' => 30, +]); + +$response = $client->post('/api/v2/clients', [ + 'headers' => [ + 'X-API-Key' => 'your-api-key', + 'Content-Type' => 'application/json', + 'Accept' => 'application/json', + ], + 'json' => [ + 'login_name' => 'testuser', + 'password' => 'SecurePass123!', + 'email' => 'test@example.com', + 'display_name' => 'Test User', + ], +]); + +$data = json_decode($response->getBody(), true); +$clientId = $data['id']; +``` + +--- + +## Versionsinformationen + +- **KeyHelp API Version:** 2.12+ +- **Modul Version:** 2.0.0 +- **Letzte Aktualisierung:** 2024 + +--- + +## Support & Feedback + +Bei Fragen zur KeyHelp API: +- **KeyHelp Forum:** https://community.keyhelp.de/ +- **KeyHelp Wiki:** https://wiki.keyhelp.de/ +- **KeyHelp Support:** support@keyhelp.de + +Bei Fragen zum WHMCS-Modul: +- **E-Mail:** info@avvgo.de +- **Website:** https://avvgo.de + +--- + +**Entwickelt von:** Kevin Feiler / AVVGO +**Lizenz:** MIT \ No newline at end of file diff --git a/modules/servers/keyhelpmanager.zip b/modules/servers/keyhelpmanager.zip deleted file mode 100644 index 6f7bae5deed2015cff2135b7dcbf3a4067a82cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9506 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 diff --git a/modules/servers/keyhelpmanager/keyhelpmanager.php b/modules/servers/keyhelpmanager/keyhelpmanager.php index 02fdde0..d7d0744 100644 --- a/modules/servers/keyhelpmanager/keyhelpmanager.php +++ b/modules/servers/keyhelpmanager/keyhelpmanager.php @@ -179,12 +179,12 @@ function keyhelpmanager_CreateAccount(array $params) // Use template if selected (skip if manual or empty) if (!empty($templateId) && $templateId !== "manual") { - $accountData["plan_id"] = $templateId; + $accountData["id_hosting_plan"] = $templateId; } $result = _keyhelpmanager_APIRequest( $params, - "/users", + "/clients", "POST", $accountData, ); @@ -200,12 +200,9 @@ function keyhelpmanager_CreateAccount(array $params) } // Create domain with template settings - $domainData = ["domain_name" => $domain, "user_id" => $userId]; + $domainData = ["domain_name" => $domain, "id_client" => $userId]; - // Only add template_id if it's set and not manual mode - if (!empty($templateId) && $templateId !== "manual") { - $domainData["template_id"] = $templateId; - } + // KeyHelp API doesn't use template_id for domains, template is applied via user $domainResult = _keyhelpmanager_APIRequest( $params, @@ -215,7 +212,7 @@ function keyhelpmanager_CreateAccount(array $params) ); if (!$domainResult["success"]) { - _keyhelpmanager_APIRequest($params, "/users/" . $userId, "DELETE"); + _keyhelpmanager_APIRequest($params, "/clients/" . $userId, "DELETE"); return "Domain creation failed: " . $domainResult["error"]; } @@ -247,7 +244,7 @@ function keyhelpmanager_SuspendAccount(array $params) $result = _keyhelpmanager_APIRequest( $params, - "/users/" . $userId, + "/clients/" . $userId, "PUT", ["is_locked" => true], ); @@ -269,7 +266,7 @@ function keyhelpmanager_UnsuspendAccount(array $params) $result = _keyhelpmanager_APIRequest( $params, - "/users/" . $userId, + "/clients/" . $userId, "PUT", ["is_locked" => false], ); @@ -291,7 +288,7 @@ function keyhelpmanager_TerminateAccount(array $params) $result = _keyhelpmanager_APIRequest( $params, - "/users/" . $userId, + "/clients/" . $userId, "DELETE", ); @@ -366,7 +363,7 @@ function keyhelpmanager_ClientArea(array $params) if (!empty($userId)) { $statsResult = _keyhelpmanager_APIRequest( $params, - "/users/" . $userId . "/statistics", + "/clients/" . $userId . "/statistics", "GET", ); @@ -489,7 +486,7 @@ function keyhelpmanager_ChangePassword(array $params) $result = _keyhelpmanager_APIRequest( $params, - "/users/" . $userId, + "/clients/" . $userId, "PUT", ["password" => $newPassword], );