asdasd
This commit is contained in:
@@ -92,9 +92,9 @@ final class AdminAppsService
|
||||
* @param array<int, string> $requiredGroups
|
||||
* @return array<string, array{required_groups: array<int, string>}>
|
||||
*/
|
||||
public function saveAppAccess(string $appId, array $requiredGroups): array
|
||||
public function saveAppAccess(string $appId, array $requiredGroups, bool $availableWithoutLogin = false): array
|
||||
{
|
||||
return AppAccessConfig::saveRequiredGroups($this->projectRoot, $appId, $requiredGroups);
|
||||
return AppAccessConfig::saveRequiredGroups($this->projectRoot, $appId, $requiredGroups, $availableWithoutLogin);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -118,6 +118,7 @@ final class AdminAppsService
|
||||
'supports_widget' => !empty($app['supports_widget']),
|
||||
'supports_tray' => !empty($app['supports_tray']),
|
||||
'enabled_by_default' => !empty($app['enabled_by_default']),
|
||||
'available_without_login' => !empty($app['available_without_login']),
|
||||
'required_groups' => $requiredGroups,
|
||||
'required_groups_display' => $requiredGroups === [] ? 'Alle sichtbaren Benutzer' : implode(', ', $requiredGroups),
|
||||
'admin_only' => in_array('administrators', array_map(
|
||||
|
||||
@@ -49,7 +49,10 @@ final class App
|
||||
array_map('strval', (array) ($authUser['groups'] ?? []))
|
||||
));
|
||||
$isAdmin = in_array('administrators', $authGroups, true);
|
||||
$visibleApps = AppVisibility::filterByGroups($registry->all(), $authGroups);
|
||||
$publicDesktopMode = !$isAuthenticated;
|
||||
$visibleApps = $publicDesktopMode
|
||||
? AppVisibility::filterForPublicDesktop($registry->all())
|
||||
: AppVisibility::filterByGroups($registry->all(), $authGroups);
|
||||
$userSelfManagement = new UserSelfManagementService($this->projectRoot);
|
||||
$resolvedSkin = $userSelfManagement->resolveActiveSkin(
|
||||
isset($_GET['skin']) ? (string) $_GET['skin'] : null,
|
||||
@@ -60,16 +63,27 @@ final class App
|
||||
);
|
||||
$userSettings = $resolvedSkin['settings'];
|
||||
$activeSkin = (string) $resolvedSkin['skin'];
|
||||
$menuAppIds = array_values(array_map('strval', (array) ($userSettings['apps']['enabled_ids'] ?? [])));
|
||||
$desktopIconIds = array_values(array_map('strval', (array) ($userSettings['apps']['desktop_icon_ids'] ?? [])));
|
||||
$trayAppIds = array_values(array_map('strval', (array) ($userSettings['tray']['active_ids'] ?? [])));
|
||||
$menuAppIds = $publicDesktopMode
|
||||
? []
|
||||
: array_values(array_map('strval', (array) ($userSettings['apps']['enabled_ids'] ?? [])));
|
||||
$desktopIconIds = $publicDesktopMode
|
||||
? array_values(array_filter(array_map(
|
||||
static fn (array $app): ?string => (($app['show_on_desktop'] ?? false) !== false) ? (string) ($app['app_id'] ?? '') : null,
|
||||
$visibleApps
|
||||
)))
|
||||
: array_values(array_map('strval', (array) ($userSettings['apps']['desktop_icon_ids'] ?? [])));
|
||||
$trayAppIds = $publicDesktopMode
|
||||
? []
|
||||
: array_values(array_map('strval', (array) ($userSettings['tray']['active_ids'] ?? [])));
|
||||
$visibleAppIds = array_values(array_filter(array_map(
|
||||
static fn (array $app): string => (string) ($app['app_id'] ?? ''),
|
||||
$visibleApps
|
||||
)));
|
||||
$availableWidgets = $widgetRegistry->availableForApps($visibleAppIds);
|
||||
$activeWidgetIds = array_values(array_map('strval', (array) ($userSettings['widgets']['active_ids'] ?? DesktopState::defaultWidgetIds())));
|
||||
$activeWidgets = $widgetRegistry->active($activeWidgetIds, $visibleAppIds);
|
||||
$availableWidgets = $publicDesktopMode ? [] : $widgetRegistry->availableForApps($visibleAppIds);
|
||||
$activeWidgetIds = $publicDesktopMode
|
||||
? []
|
||||
: array_values(array_map('strval', (array) ($userSettings['widgets']['active_ids'] ?? DesktopState::defaultWidgetIds())));
|
||||
$activeWidgets = $publicDesktopMode ? [] : $widgetRegistry->active($activeWidgetIds, $visibleAppIds);
|
||||
$widgetLaunchAppIds = array_values(array_filter(array_unique(array_map(
|
||||
static fn (array $widget): string => (string) (($widget['launch_app_id'] ?? '') ?: ($widget['source_app_id'] ?? '')),
|
||||
$activeWidgets
|
||||
@@ -79,44 +93,50 @@ final class App
|
||||
$desktopIconIds,
|
||||
$trayAppIds,
|
||||
$widgetLaunchAppIds,
|
||||
[UserSelfManagementService::APP_ID]
|
||||
$publicDesktopMode ? [] : [UserSelfManagementService::APP_ID]
|
||||
))));
|
||||
$payloadApps = AppVisibility::filterByEnabledIds(
|
||||
$visibleApps,
|
||||
$payloadAppIds,
|
||||
[UserSelfManagementService::APP_ID]
|
||||
);
|
||||
$apps = AppIconResolver::decorate(array_map(static function (array $app) use ($menuAppIds, $desktopIconIds, $trayAppIds): array {
|
||||
$payloadApps = $publicDesktopMode
|
||||
? array_values(array_filter($visibleApps, static fn (array $app): bool => in_array((string) ($app['app_id'] ?? ''), $payloadAppIds, true)))
|
||||
: AppVisibility::filterByEnabledIds(
|
||||
$visibleApps,
|
||||
$payloadAppIds,
|
||||
[UserSelfManagementService::APP_ID]
|
||||
);
|
||||
$apps = AppIconResolver::decorate(array_map(static function (array $app) use ($menuAppIds, $desktopIconIds, $trayAppIds, $publicDesktopMode): array {
|
||||
$appId = (string) ($app['app_id'] ?? '');
|
||||
$installable = !array_key_exists('installable', $app) || (bool) $app['installable'];
|
||||
$app['user_show_in_start_menu'] = $installable
|
||||
$app['user_show_in_start_menu'] = $publicDesktopMode
|
||||
? false
|
||||
: ($installable
|
||||
? in_array($appId, $menuAppIds, true)
|
||||
: (($app['show_in_start_menu'] ?? true) !== false);
|
||||
: (($app['show_in_start_menu'] ?? true) !== false));
|
||||
$app['user_show_on_desktop'] = in_array($appId, $desktopIconIds, true);
|
||||
$app['user_show_in_tray'] = in_array($appId, $trayAppIds, true);
|
||||
|
||||
return $app;
|
||||
}, $payloadApps), $activeSkin);
|
||||
$windows = (new WindowManager($registry))->defaultWindows();
|
||||
$trayItems = DesktopState::trayItems();
|
||||
foreach ($apps as $app) {
|
||||
if (empty($app['supports_tray']) || empty($app['user_show_in_tray'])) {
|
||||
continue;
|
||||
}
|
||||
$trayItems = $publicDesktopMode ? [] : DesktopState::trayItems();
|
||||
if (!$publicDesktopMode) {
|
||||
foreach ($apps as $app) {
|
||||
if (empty($app['supports_tray']) || empty($app['user_show_in_tray'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$trayItems[] = [
|
||||
'id' => 'app-' . (string) $app['app_id'],
|
||||
'label' => (string) ($app['icon'] ?? 'FX'),
|
||||
'app_id' => (string) ($app['app_id'] ?? ''),
|
||||
'title' => (string) ($app['title'] ?? ''),
|
||||
];
|
||||
}
|
||||
if ($giteaStatus->shouldShowInTray($isAdmin)) {
|
||||
$trayItems[] = [
|
||||
'id' => 'gitea-deploy-status',
|
||||
'label' => '●',
|
||||
'title' => 'Gitea-Deploy-Status',
|
||||
];
|
||||
$trayItems[] = [
|
||||
'id' => 'app-' . (string) $app['app_id'],
|
||||
'label' => (string) ($app['icon'] ?? 'FX'),
|
||||
'app_id' => (string) ($app['app_id'] ?? ''),
|
||||
'title' => (string) ($app['title'] ?? ''),
|
||||
];
|
||||
}
|
||||
if ($giteaStatus->shouldShowInTray($isAdmin)) {
|
||||
$trayItems[] = [
|
||||
'id' => 'gitea-deploy-status',
|
||||
'label' => '●',
|
||||
'title' => 'Gitea-Deploy-Status',
|
||||
];
|
||||
}
|
||||
}
|
||||
$displayName = (string) ($authUser['name'] ?? $authUser['username'] ?? 'Gast');
|
||||
$storageScope = $isAuthenticated
|
||||
@@ -140,7 +160,9 @@ final class App
|
||||
'user_preferences' => $userSettings,
|
||||
'login' => [
|
||||
'authenticated' => $isAuthenticated,
|
||||
'mode' => $isAuthenticated ? 'authenticated' : 'login-required',
|
||||
'mode' => $isAuthenticated ? 'authenticated' : 'public-desktop',
|
||||
'login_url' => $auth->isConfigured() ? '/auth/keycloak' : null,
|
||||
'login_available' => $auth->isConfigured(),
|
||||
'keycloak_theme_handoff' => '/docs/keycloak-theme-handoff.md',
|
||||
'user' => [
|
||||
'name' => (string) ($authUser['name'] ?? ''),
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace App;
|
||||
final class AppAccessConfig
|
||||
{
|
||||
/**
|
||||
* @return array<string, array{required_groups: array<int, string>}>
|
||||
* @return array<string, array{required_groups: array<int, string>, available_without_login: bool}>
|
||||
*/
|
||||
public static function load(string $projectRoot): array
|
||||
{
|
||||
@@ -22,6 +22,7 @@ final class AppAccessConfig
|
||||
|
||||
$normalized[$appId] = [
|
||||
'required_groups' => self::sanitizeGroups($definition['required_groups'] ?? []),
|
||||
'available_without_login' => (bool) ($definition['available_without_login'] ?? false),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -63,9 +64,9 @@ final class AppAccessConfig
|
||||
|
||||
/**
|
||||
* @param array<int, string> $requiredGroups
|
||||
* @return array<string, array{required_groups: array<int, string>}>
|
||||
* @return array<string, array{required_groups: array<int, string>, available_without_login: bool}>
|
||||
*/
|
||||
public static function saveRequiredGroups(string $projectRoot, string $appId, array $requiredGroups): array
|
||||
public static function saveRequiredGroups(string $projectRoot, string $appId, array $requiredGroups, bool $availableWithoutLogin = false): array
|
||||
{
|
||||
$appId = trim($appId);
|
||||
if ($appId === '') {
|
||||
@@ -75,6 +76,7 @@ final class AppAccessConfig
|
||||
$current = self::load($projectRoot);
|
||||
$current[$appId] = [
|
||||
'required_groups' => self::sanitizeGroups($requiredGroups),
|
||||
'available_without_login' => $availableWithoutLogin,
|
||||
];
|
||||
|
||||
self::writeEnvironmentConfig($projectRoot, 'app_access', ConfigLoader::currentEnvironment(), $current);
|
||||
|
||||
@@ -29,6 +29,9 @@ final class AppRegistry
|
||||
if (is_array($override) && array_key_exists('required_groups', $override)) {
|
||||
$app['required_groups'] = array_values(array_map('strval', (array) ($override['required_groups'] ?? [])));
|
||||
}
|
||||
if (is_array($override) && array_key_exists('available_without_login', $override)) {
|
||||
$app['available_without_login'] = (bool) ($override['available_without_login'] ?? false);
|
||||
}
|
||||
|
||||
return $app;
|
||||
}, $mergedApps);
|
||||
|
||||
@@ -61,4 +61,15 @@ final class AppVisibility
|
||||
return isset($lookup[$appId]) || isset($mandatoryLookup[$appId]);
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<int, array<string, mixed>> $apps
|
||||
* @return array<int, array<string, mixed>>
|
||||
*/
|
||||
public static function filterForPublicDesktop(array $apps): array
|
||||
{
|
||||
return array_values(array_filter($apps, static function (array $app): bool {
|
||||
return !empty($app['available_without_login']);
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user