diff --git a/plugin-webseite/README.md b/plugin-webseite/README.md index c5f34fdf..822debdb 100644 --- a/plugin-webseite/README.md +++ b/plugin-webseite/README.md @@ -7,6 +7,7 @@ Eigenständige Webseite, von der DeskHub-Installationen Plugins und Kundenportal - Verwaltung mit allen Paketen, Versionen, Signaturstatus und Download-Zähler (keine öffentliche Übersichtsseite: Die Startseite führt zur Verwaltung) - Katalog für DeskHub: `catalog.php?type=plugins` und `catalog.php?type=themes` - Verwaltung (`admin.php`): Pakete hochladen, Versionen entfernen, Vorschaubilder +- **Sprache:** Die Verwaltung gibt es auf Deutsch und English. Oben rechts wechselst du die Sprache (sie wird in einem Cookie gemerkt, auch `?lang=en` bzw. `?lang=de` geht). Die Übersetzung steht in `lang/en.json` (Schlüssel = deutscher Text, `{}` für wechselnde Teile, `{#}` für Zahlen, `{1}`, `{2}` für die Reihenfolge in der Übersetzung); eine weitere Sprache ist eine weitere Datei `lang/.json` plus ein Eintrag in `SITE_LANGS` in `inc/i18n.php`. Was nicht übersetzt ist, bleibt deutsch. Die Schnittstellen für DeskHub und die Apps (Katalog, Downloads, Push) sind davon nicht betroffen. - **Vorschaubild nur einmal:** Das Bild eines Plugins oder Themes bleibt bei jeder neuen Version erhalten, auch wenn du die alte Version vorher entfernst. Beim Eintrag in der Verwaltung lässt es sich ersetzen oder entfernen. Liegt im ZIP eine Datei `vorschau.png`, wird sie beim ersten Veröffentlichen automatisch verwendet. - **WordPress-Plugin und Chrome-Erweiterung** (Tab „Apps“): ZIP hochladen, die Versionsnummer wird aus dem Plugin-Kopf (`Version:`) bzw. der `manifest.json` gelesen (eine eingetippte Nummer hat Vorrang). Abruf der neuesten Version: `app-release.php?platform=wordpress` oder `platform=chrome` (mit `&download=1` als Datei). - Prüft jedes Paket beim Hochladen (Dateitypen, Pfade, `plugin.json`, Berechtigungen) und **signiert es automatisch** mit eurem privaten Schlüssel diff --git a/plugin-webseite/admin.php b/plugin-webseite/admin.php index 9e071585..ea67d710 100644 --- a/plugin-webseite/admin.php +++ b/plugin-webseite/admin.php @@ -168,6 +168,7 @@ site_header($loggedIn ? $tabs[$tab][0] . ' · Verwaltung' : 'Anmelden', $tab, $l
Themes
veröffentlicht
Windows
aktuelle App-Version
Android
aktuelle App-Version
+
DeskHub-Server
aktuelles System-Update
Push-Geräte
angemeldete Installationen
@@ -254,7 +255,7 @@ site_header($loggedIn ? $tabs[$tab][0] . ' · Verwaltung' : 'Anmelden', $tab, $l
- +
@@ -263,7 +264,7 @@ site_header($loggedIn ? $tabs[$tab][0] . ' · Verwaltung' : 'Anmelden', $tab, $l
- $p['label'], site_app_platforms()) as $pf => $pl): $mine = array_values(array_filter($appReleases, fn($r) => $r['platform'] === $pf)); $cur = $latestApp[$pf]; ?> + $p['label'], array_diff_key(site_app_platforms(), ['server' => 1])) as $pf => $pl): $mine = array_values(array_filter($appReleases, fn($r) => $r['platform'] === $pf)); $cur = $latestApp[$pf]; ?>

aktuell ' . site_h($cur['version']) . '' : 'noch nichts veröffentlicht' ?>
@@ -282,6 +283,37 @@ site_header($loggedIn ? $tabs[$tab][0] . ' · Verwaltung' : 'Anmelden', $tab, $l
+ $r['platform'] === 'server')); $serverCur = $latestApp['server']; ?> +

DeskHub-Update

Das ZIP des DeskHub-Servers für das System-Update. Alle DeskHub-Installationen holen neue Versionen von hier (Adminportal → System-Update). Die Version wird aus version.php im Paket gelesen, das Paket wird mit dem Schlüssel dieser Seite automatisch signiert.

+
Kein Signierschlüssel eingerichtet: Die Pakete werden nicht signiert, DeskHub mit eingebautem Herausgeber-Schlüssel lehnt sie ab. Siehe Einstellungen.
+
+

Neue Version hochladen

ZIP des Projekts (ohne config/, Datenbank, Backups, Uploads; diese Ordner werden beim Update ohnehin nie überschrieben).

+ aktuell ' . site_h($serverCur['version']) . '' : 'noch nichts veröffentlicht' ?>
+
+ + +
+ + +
+
+
+
+
+

Veröffentlichte Versionen

DeskHub zeigt die neuesten 20 unter „Bestimmte Version installieren“.

+
Noch keine Version veröffentlicht. Bis dahin nutzt DeskHub die Ausweichquelle (Gitea).
+
+ + + + + + + +
VersionDatumGrößeÄnderungen
aktuell' : '' ?> MB (int) $release['id']], 'Entfernen', 'link danger', 'Diese Version wirklich entfernen?') ?>
+ +
+

Push-Dienst

Zentraler Push-Dienst der Android-App. Hier siehst du die angemeldeten DeskHub-Installationen.

diff --git a/plugin-webseite/app-release.php b/plugin-webseite/app-release.php index 9dbf18b2..279ef8ee 100644 --- a/plugin-webseite/app-release.php +++ b/plugin-webseite/app-release.php @@ -4,7 +4,38 @@ require_once __DIR__ . '/inc/lib.php'; site_require_access(); $platform = (string) ($_GET['platform'] ?? ''); -$release = site_app_release($platform); +$wanted = (string) ($_GET['version'] ?? ''); +$json = static function (array $data): void { + header('Content-Type: application/json; charset=utf-8'); + header('Cache-Control: no-store'); + echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + exit; +}; +/** Angaben zu einer Version; für das System-Update (server) mit Signatur des Herausgebers. */ +$describe = static function (string $platform, array $r): array { + $d = [ + 'platform' => $platform, + 'version' => $r['version'], + 'sha256' => $r['sha256'], + 'size' => (int) $r['size'], + 'notes' => $r['notes'], + 'created_at' => $r['created_at'], + ]; + if ($platform === 'server') $d['signature'] = site_sign_update((string) $r['version'], (string) $r['sha256']); + return $d; +}; + +// Liste aller Versionen (System-Update: „Bestimmte Version installieren“) +if (($_GET['list'] ?? '') === '1' && isset(site_app_platforms()[$platform])) { + $json(['platform' => $platform, 'releases' => array_map(fn($r) => $describe($platform, $r), array_slice(site_app_versions($platform), 0, 20))]); +} + +$release = null; +if ($wanted !== '' && isset(site_app_platforms()[$platform]) && preg_match('/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/', ltrim($wanted, 'vV'))) { + foreach (site_app_versions($platform) as $r) if ($r['version'] === ltrim($wanted, 'vV')) { $release = $r; break; } +} elseif ($wanted === '') { + $release = site_app_release($platform); +} if (!$release) { http_response_code(404); header('Content-Type: application/json; charset=utf-8'); @@ -15,19 +46,7 @@ if (!is_file($path)) { http_response_code(404); exit; } -if (($_GET['download'] ?? '') !== '1') { - header('Content-Type: application/json; charset=utf-8'); - header('Cache-Control: no-store'); - echo json_encode([ - 'platform' => $platform, - 'version' => $release['version'], - 'sha256' => $release['sha256'], - 'size' => (int) $release['size'], - 'notes' => $release['notes'], - 'created_at' => $release['created_at'], - ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); - exit; -} +if (($_GET['download'] ?? '') !== '1') $json($describe($platform, $release)); $kind = site_app_platforms()[$platform]; $filename = $kind['file']; diff --git a/plugin-webseite/assets/style.css b/plugin-webseite/assets/style.css index 75fea89e..313b331c 100644 --- a/plugin-webseite/assets/style.css +++ b/plugin-webseite/assets/style.css @@ -137,3 +137,8 @@ details.card p { overflow-wrap: anywhere; } .thumb-sm { width: 96px; height: 60px; object-fit: cover; border-radius: 8px; background: var(--line); } .thumb-sm.none { display: inline-flex; align-items: center; justify-content: center; font-size: 12px; border: 1px dashed var(--line); opacity: .7; } .previewrow input[type=file] { max-width: 230px; } + +.langs { margin-left: auto; display: inline-flex; gap: 6px; font-size: 12px; } +.langs .lang { padding: 3px 8px; border-radius: 6px; border: 1px solid var(--line); text-decoration: none; color: inherit; opacity: .75; } +.langs .lang.on { opacity: 1; font-weight: 700; background: var(--card-2); } +.langs a.lang:hover { opacity: 1; } diff --git a/plugin-webseite/inc/i18n.php b/plugin-webseite/inc/i18n.php new file mode 100644 index 00000000..fc076183 --- /dev/null +++ b/plugin-webseite/inc/i18n.php @@ -0,0 +1,148 @@ +,
,