registerServiceAlias('SubadminMiddleware', SubadminMiddleware::class); $context->registerMiddleware(SubadminMiddleware::class); $context->registerSearchProvider(SectionSearch::class); $context->registerSearchProvider(UserSearch::class); $context->registerConfigLexicon(ConfigLexicon::class); // Register listeners $context->registerEventListener(AppPasswordCreatedEvent::class, AppPasswordCreatedActivityListener::class); $context->registerEventListener(UserAddedEvent::class, UserAddedToGroupActivityListener::class); $context->registerEventListener(UserRemovedEvent::class, UserRemovedFromGroupActivityListener::class); $context->registerEventListener(GroupDeletedEvent::class, GroupRemovedListener::class); $context->registerEventListener(PasswordUpdatedEvent::class, Hooks::class); $context->registerEventListener(UserChangedEvent::class, Hooks::class); // Register Mail Provider listeners $context->registerEventListener(DeclarativeSettingsGetValueEvent::class, MailProviderListener::class); $context->registerEventListener(DeclarativeSettingsSetValueEvent::class, MailProviderListener::class); // Register well-known handlers $context->registerWellKnownHandler(SecurityTxtHandler::class); $context->registerWellKnownHandler(ChangePasswordHandler::class); // Register Settings Form(s) $context->registerDeclarativeSettings(MailProvider::class); /** * Core class wrappers */ $context->registerService(IProvider::class, function (): IProvider { return Server::get(IProvider::class); }); $context->registerService(IManager::class, function (): Manager { return Server::get(Manager::class); }); $context->registerService(NewUserMailHelper::class, function (ContainerInterface $appContainer) { return new NewUserMailHelper( Server::get(Defaults::class), $appContainer->get(IURLGenerator::class), $appContainer->get(IFactory::class), $appContainer->get(IMailer::class), $appContainer->get(ISecureRandom::class), new TimeFactory(), $appContainer->get(IConfig::class), $appContainer->get(ICrypto::class), Util::getDefaultEmailAddress('no-reply') ); }); $context->registerSetupCheck(AllowedAdminRanges::class); $context->registerSetupCheck(AppDirsWithDifferentOwner::class); $context->registerSetupCheck(BruteForceThrottler::class); $context->registerSetupCheck(CheckUserCertificates::class); $context->registerSetupCheck(CodeIntegrity::class); $context->registerSetupCheck(CronErrors::class); $context->registerSetupCheck(CronInfo::class); $context->registerSetupCheck(DatabaseHasMissingColumns::class); $context->registerSetupCheck(DatabaseHasMissingIndices::class); $context->registerSetupCheck(DatabaseHasMissingPrimaryKeys::class); $context->registerSetupCheck(DatabasePendingBigIntConversions::class); $context->registerSetupCheck(DataDirectoryProtected::class); $context->registerSetupCheck(DebugMode::class); $context->registerSetupCheck(DefaultPhoneRegionSet::class); $context->registerSetupCheck(EmailTestSuccessful::class); $context->registerSetupCheck(FileLocking::class); $context->registerSetupCheck(ForwardedForHeaders::class); $context->registerSetupCheck(HttpsUrlGeneration::class); $context->registerSetupCheck(InternetConnectivity::class); $context->registerSetupCheck(JavaScriptSourceMaps::class); $context->registerSetupCheck(JavaScriptModules::class); $context->registerSetupCheck(LegacySSEKeyFormat::class); $context->registerSetupCheck(MaintenanceWindowStart::class); $context->registerSetupCheck(MemcacheConfigured::class); $context->registerSetupCheck(MimeTypeMigrationAvailable::class); $context->registerSetupCheck(MysqlRowFormat::class); $context->registerSetupCheck(MysqlUnicodeSupport::class); $context->registerSetupCheck(OcxProviders::class); $context->registerSetupCheck(OverwriteCliUrl::class); $context->registerSetupCheck(PhpDefaultCharset::class); $context->registerSetupCheck(PhpDisabledFunctions::class); $context->registerSetupCheck(PhpFreetypeSupport::class); $context->registerSetupCheck(PhpApcuConfig::class); $context->registerSetupCheck(PhpGetEnv::class); // Temporarily disabled $context->registerSetupCheck(PhpMaxFileSize::class); $context->registerSetupCheck(PhpMemoryLimit::class); $context->registerSetupCheck(PhpModules::class); $context->registerSetupCheck(PhpOpcacheSetup::class); $context->registerSetupCheck(PhpOutdated::class); $context->registerSetupCheck(PhpOutputBuffering::class); $context->registerSetupCheck(RandomnessSecure::class); $context->registerSetupCheck(ReadOnlyConfig::class); $context->registerSetupCheck(SecurityHeaders::class); $context->registerSetupCheck(ServerIdConfig::class); $context->registerSetupCheck(SchedulingTableSize::class); $context->registerSetupCheck(SupportedDatabase::class); $context->registerSetupCheck(SystemIs64bit::class); $context->registerSetupCheck(TaskProcessingPickupSpeed::class); $context->registerSetupCheck(TaskProcessingSuccessRate::class); $context->registerSetupCheck(TaskProcessingWorkerIsRunning::class); $context->registerSetupCheck(TempSpaceAvailable::class); $context->registerSetupCheck(TransactionIsolation::class); $context->registerSetupCheck(TwoFactorConfiguration::class); $context->registerSetupCheck(PushService::class); $context->registerSetupCheck(WellKnownUrls::class); $context->registerSetupCheck(Woff2Loading::class); $context->registerUserMigrator(AccountMigrator::class); } #[\Override] public function boot(IBootContext $context): void { $context->injectFn($this->registerNavigationEntries(...)); } /** * Registers the navigation entries for the user settings. * Needed as some entries are dynamic and thus we cannot use the appinfo/info.xml * * Registers the following entries: * - Appearance and accessibility * - Personal settings (named "Settings" for non-admins) * - Accounts (only for subadmins) * - Help & privacy (conditionally enabled based on config) */ public function registerNavigationEntries( INavigationManager $navigationManager, IURLGenerator $urlGenerator, IUserSession $userSession, IConfig $config, ): void { if ($userSession->getUser() === null) { return; } $l = Server::get(IFactory::class) ->get('settings'); $groupManager = Server::get(IGroupManager::class); $subAdmin = Server::get(ISubAdmin::class); $isAdmin = $groupManager->isAdmin($userSession->getUser()->getUID()); $isSubAdmin = $subAdmin->isSubAdmin($userSession->getUser()); // Accessibility settings - the URL is dynamic (route parameters) which is currently not supported by appinfo.xml $navigationManager->add([ 'type' => 'settings', 'id' => 'accessibility_settings', 'order' => 2, 'href' => $urlGenerator->linkToRoute('settings.PersonalSettings.index', ['section' => 'theming']), 'name' => $l->t('Appearance and accessibility'), 'icon' => $urlGenerator->imagePath('theming', 'accessibility-dark.svg'), ]); // Personal settings - this entry is dynamic so we cannot use appinfo $navigationManager->add([ 'type' => 'settings', 'id' => 'settings_personal', 'order' => 3, 'href' => $urlGenerator->linkToRoute('settings.PersonalSettings.index'), 'name' => $isAdmin ? $l->t('Personal settings') : $l->t('Settings'), 'icon' => $isAdmin ? $urlGenerator->imagePath('settings', 'personal.svg') : $urlGenerator->imagePath('settings', 'admin.svg'), ]); if ($isAdmin) { $navigationManager->add([ 'type' => 'settings', 'id' => 'settings_administration', 'order' => 4, 'href' => $urlGenerator->linkToRoute('settings.adminSettings.index'), 'name' => $l->t('Administration settings'), 'icon' => $urlGenerator->imagePath('settings', 'admin.svg'), ]); } // User management is conditionally enabled for subadmins, but appinfo currently only supports full admins if ($isSubAdmin) { $navigationManager->add([ 'type' => 'settings', 'id' => 'core_users', 'order' => 6, 'href' => $urlGenerator->linkToRoute('settings.Users.usersList'), 'name' => $l->t('Accounts'), 'icon' => $urlGenerator->imagePath('settings', 'users.svg'), ]); } // conditionally enabled navigation entry if ($config->getSystemValueBool('knowledgebaseenabled', true)) { $navigationManager->add([ 'type' => 'settings', 'id' => 'help', 'order' => 99998, 'href' => $urlGenerator->linkToRoute('settings.Help.help'), 'name' => $l->t('Help & privacy'), 'icon' => $urlGenerator->imagePath('settings', 'help.svg'), ]); } } }