diff --git a/backend/cmd/aether/main.go b/backend/cmd/aether/main.go index ad6d7e6..bbbc98a 100644 --- a/backend/cmd/aether/main.go +++ b/backend/cmd/aether/main.go @@ -374,6 +374,12 @@ func main() { faviconURL = admin.AppIconURL(s["app_icon_storage_key"], "64") appleTouchURL = admin.AppIconURL(s["app_icon_storage_key"], "192") } + // Ohne Ursprung gibt es keine Leiste — dann hat auch der Schluessel + // nichts auf der Seite zu suchen. + honeybarKey := "" + if cfg.HoneybarOrigin != "" { + honeybarKey = cfg.HoneybarKey + } apps := cfg.ExternalApps if apps == nil { apps = []config.ExternalApp{} // nie null – das Frontend erwartet eine Liste @@ -398,6 +404,12 @@ func main() { // ist – sonst gibt der Endpunkt eine Einstellung preis, die // niemanden etwas angeht. "oidc_button_label": oidcLabel, + // Die HoneyOS-Leiste laedt die Oberflaeche selbst nach. Zur + // Laufzeit statt beim Bauen, damit ein fertiges Abbild ueber die + // .env umgezogen werden kann — und damit derselbe Ursprung + // gilt, den die CSP erlaubt. + "honeybar_origin": cfg.HoneybarOrigin, + "honeybar_key": honeybarKey, }) }) diff --git a/backend/pkg/config/config.go b/backend/pkg/config/config.go index ceea9c4..ce6a83b 100644 --- a/backend/pkg/config/config.go +++ b/backend/pkg/config/config.go @@ -83,9 +83,21 @@ type Config struct { // (z. B. https://os.example.com). Er wird in die CSP aufgenommen — ohne das // blockt der Browser das Skript und dessen Anfragen. // - // Muss zur Adresse im - - diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index e3950de..34b64be 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -231,6 +231,11 @@ export interface PublicConfig { oidc_button_label?: string primary_color?: string accent_color?: string + /** Ursprung der HoneyOS-Leiste (HONEYBAR_ORIGIN). Leer = keine Leiste. */ + honeybar_origin?: string + /** Ausweis fuer deren App-Liste (HONEYBAR_KEY). Nur gesetzt, wenn es einen + * Ursprung gibt. */ + honeybar_key?: string external_apps: ExternalApp[] } diff --git a/frontend/src/honeybar.ts b/frontend/src/honeybar.ts new file mode 100644 index 0000000..9b4c44f --- /dev/null +++ b/frontend/src/honeybar.ts @@ -0,0 +1,28 @@ +/** + * Die HoneyOS-Leiste nachladen. + * + * Zur Laufzeit statt beim Bauen: Der Ursprung steht in der .env des Servers, + * ein fertiges Abbild laesst sich damit umziehen, ohne es neu zu bauen. Frueher + * stand die Adresse fest in der index.html — wer die Leiste woanders betrieb, + * bekam einen CSP-Verstoss, weil der erlaubte und der geladene Ursprung + * auseinanderliefen. Beides kommt jetzt aus HONEYBAR_ORIGIN. + * + * Faellt der Server aus oder ist kein Ursprung gesetzt, passiert schlicht + * nichts: Aether ist nicht auf die Leiste angewiesen. + */ +export function mountHoneybar(origin?: string, key?: string) { + if (!origin) return + // Der Aufruf haengt an der Konfiguration, und die wird auch neu geladen, + // wenn der Admin etwas aendert. Zweimal einbinden hiesse zwei Leisten. + if (document.querySelector('script[data-honeybar]')) return + + const el = document.createElement('script') + el.dataset.honeybar = '' + el.defer = true + el.src = origin.replace(/\/+$/, '') + '/honeybar/honeybar.js' + // honeybar.js liest seine Einstellungen ueber document.currentScript – + // das gilt auch fuer ein nachtraeglich eingehaengtes Skript. + el.dataset.app = 'aether' + if (key) el.dataset.key = key + document.head.appendChild(el) +} diff --git a/frontend/src/hooks/useAppSettings.tsx b/frontend/src/hooks/useAppSettings.tsx index 45837d5..512075b 100644 --- a/frontend/src/hooks/useAppSettings.tsx +++ b/frontend/src/hooks/useAppSettings.tsx @@ -1,3 +1,4 @@ +import { mountHoneybar } from '../honeybar' import { createContext, useCallback, useContext, useEffect, useState, type ReactNode } from 'react' import { publicApi } from '../api/client' import { applyTheme } from '../theme' @@ -103,6 +104,7 @@ export function AppSettingsProvider({ children }: { children: ReactNode }) { if (typeof cfg.max_versions_kept === 'number' && cfg.max_versions_kept > 0) { setMaxVersionsKept(cfg.max_versions_kept) } + mountHoneybar(cfg.honeybar_origin, cfg.honeybar_key) applyTheme(cfg.primary_color, cfg.accent_color) applyThemeColor(cfg.primary_color) document.title = cfg.cloud_name || 'Aether' diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo new file mode 100644 index 0000000..fb5ea97 --- /dev/null +++ b/frontend/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/App.tsx","./src/honeybar.ts","./src/main.tsx","./src/test-setup.ts","./src/theme.ts","./src/api/client.ts","./src/components/AppPasswords.tsx","./src/components/AppSwitcher.tsx","./src/components/Breadcrumb.tsx","./src/components/ConfirmDialog.tsx","./src/components/ContextMenu.tsx","./src/components/Dialog.tsx","./src/components/FileCover.tsx","./src/components/FileInfoDialog.tsx","./src/components/FilePreview.tsx","./src/components/FileViews.tsx","./src/components/MoveTo.tsx","./src/components/OfficeEditor.tsx","./src/components/PageHeader.tsx","./src/components/PdfViewer.tsx","./src/components/SearchBox.tsx","./src/components/ShareDialog.tsx","./src/components/ShareWithDialog.tsx","./src/components/Shell.tsx","./src/components/Sidebar.tsx","./src/components/Tabs.tsx","./src/components/TagChip.tsx","./src/components/TagDialog.tsx","./src/components/TagEditDialog.tsx","./src/components/UploadQueue.tsx","./src/components/UserMenu.tsx","./src/components/VersionsDialog.tsx","./src/components/WebDavGuide.tsx","./src/components/filetypes.ts","./src/components/icons.tsx","./src/hooks/useAppSettings.tsx","./src/hooks/useAuth.ts","./src/hooks/useInternalDrag.ts","./src/hooks/useNavHistory.ts","./src/hooks/useOverlayDismiss.ts","./src/pages/AdminPage.tsx","./src/pages/FileBrowser.tsx","./src/pages/LoginPage.tsx","./src/pages/ProfilePage.tsx","./src/pages/SharePage.tsx","./src/pages/SharedPage.tsx","./src/pages/SharedWithMePage.tsx","./src/pages/TagsPage.tsx","./src/pages/TrashPage.tsx","./src/pages/admin/AuditTab.tsx","./src/pages/admin/GroupsTab.tsx","./src/pages/admin/ThemingTab.tsx","./src/pages/admin/UsersTab.tsx","./src/pages/admin/ui.tsx"],"version":"6.0.3"} \ No newline at end of file diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index cd0ab3e..9baceb7 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -32,30 +32,9 @@ function pdfjsStandardFonts(): Plugin { } } -/** - * Den