desktopApps(), AppAccessConfig::load($projectRoot) ); $widgetRegistry = new WidgetRegistry($projectRoot . '/config/widgets.php', $moduleRegistry->widgets()); $service = new UserSelfManagementService($projectRoot); $registrationConfig = ConfigLoader::load($projectRoot, 'registration'); $ldap = new LdapProvisioner($registrationConfig); $isAuthenticated = $auth->isAuthenticated(); $authUser = $isAuthenticated && is_array($_SESSION['desktop_auth']['user'] ?? null) ? $_SESSION['desktop_auth']['user'] : []; $authGroups = array_values(array_map('strval', (array) ($authUser['groups'] ?? []))); $visibleApps = AppVisibility::filterByGroups($registry->all(), $authGroups); $widgets = $widgetRegistry->all(); $skins = SkinResolver::all(); if ($method === 'GET') { respond($service->buildBootstrapPayload($authUser, $visibleApps, $widgets, $skins)); } if ($method !== 'PUT') { respond(['error' => 'Method not allowed.'], 405); } $rawBody = file_get_contents('php://input'); $decoded = json_decode($rawBody !== false ? $rawBody : '', true); if (!is_array($decoded)) { respond(['error' => 'Invalid JSON payload.'], 400); } $before = $service->load($authUser, $visibleApps, $widgets, $skins); $after = $service->save($decoded, $authUser, $visibleApps, $widgets, $skins); $payload = $service->buildBootstrapPayload($authUser, $visibleApps, $widgets, $skins); $payload['preferences'] = $after; $payload['meta']['requires_reload'] = requiresReload($before, $after); $payload['meta']['ldap_profile_sync'] = [ 'attempted' => false, 'success' => false, 'message' => 'LDAP-Sync nicht ausgefuehrt.', ]; $username = trim((string) ($authUser['username'] ?? '')); if ($username !== '' && $ldap->isEnabled()) { $payload['meta']['ldap_profile_sync']['attempted'] = true; $ldapResult = $ldap->updateUserProfile($username, is_array($after['profile'] ?? null) ? $after['profile'] : []); $payload['meta']['ldap_profile_sync']['success'] = (bool) ($ldapResult['success'] ?? false); $payload['meta']['ldap_profile_sync']['message'] = (string) ($ldapResult['message'] ?? 'LDAP-Sync ohne Rueckmeldung.'); if (isset($ldapResult['updated_fields']) && is_array($ldapResult['updated_fields'])) { $payload['meta']['ldap_profile_sync']['updated_fields'] = array_values(array_map('strval', $ldapResult['updated_fields'])); } } respond($payload); /** * @param array $payload */ function respond(array $payload, int $statusCode = 200): never { http_response_code($statusCode); echo json_encode($payload, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR); exit; } /** * @param array $before * @param array $after */ function requiresReload(array $before, array $after): bool { $beforeSkin = (string) ($before['desktop']['active_skin'] ?? ''); $afterSkin = (string) ($after['desktop']['active_skin'] ?? ''); $beforeApps = array_values(array_map('strval', (array) ($before['apps']['enabled_ids'] ?? []))); $afterApps = array_values(array_map('strval', (array) ($after['apps']['enabled_ids'] ?? []))); $beforeDesktopIcons = array_values(array_map('strval', (array) ($before['apps']['desktop_icon_ids'] ?? []))); $afterDesktopIcons = array_values(array_map('strval', (array) ($after['apps']['desktop_icon_ids'] ?? []))); $beforeTray = array_values(array_map('strval', (array) ($before['tray']['active_ids'] ?? []))); $afterTray = array_values(array_map('strval', (array) ($after['tray']['active_ids'] ?? []))); $beforeWidgets = array_values(array_map('strval', (array) ($before['widgets']['active_ids'] ?? []))); $afterWidgets = array_values(array_map('strval', (array) ($after['widgets']['active_ids'] ?? []))); sort($beforeApps); sort($afterApps); sort($beforeDesktopIcons); sort($afterDesktopIcons); sort($beforeTray); sort($afterTray); sort($beforeWidgets); sort($afterWidgets); return $beforeSkin !== $afterSkin || $beforeApps !== $afterApps || $beforeDesktopIcons !== $afterDesktopIcons || $beforeTray !== $afterTray || $beforeWidgets !== $afterWidgets; }