appConfig->getValueInt('core', 'lastupdatedat'); $lastUpdateCheck = $this->dateTimeFormatter->formatDateTime($lastUpdateCheckTimestamp); $channels = [ 'daily', 'beta', 'stable', 'production', ]; $currentChannel = $this->serverVersion->getChannel(); if ($currentChannel === 'git') { $channels[] = 'git'; } $updateState = $this->updateChecker->getUpdateState(); $notifyGroups = $this->appConfig->getValueArray(Application::APP_NAME, 'notify_groups', ['admin']); $defaultUpdateServerURL = 'https://updates.nextcloud.com/updater_server/'; $updateServerURL = $this->config->getSystemValue('updater.server.url', $defaultUpdateServerURL); $defaultCustomerUpdateServerURLPrefix = 'https://updates.nextcloud.com/customers/'; $isDefaultUpdateServerURL = $updateServerURL === $defaultUpdateServerURL || strpos($updateServerURL, $defaultCustomerUpdateServerURLPrefix) === 0; $hasValidSubscription = $this->subscriptionRegistry->delegateHasValidSubscription(); $params = [ 'isNewVersionAvailable' => !empty($updateState['updateAvailable']), 'isUpdateChecked' => $lastUpdateCheckTimestamp > 0, 'lastChecked' => $lastUpdateCheck, 'currentChannel' => $currentChannel, 'channels' => $channels, 'newVersion' => empty($updateState['updateVersion']) ? '' : $updateState['updateVersion'], 'newVersionString' => empty($updateState['updateVersionString']) ? '' : $updateState['updateVersionString'], 'downloadLink' => empty($updateState['downloadLink']) ? '' : $updateState['downloadLink'], 'changes' => $this->filterChanges($updateState['changes'] ?? []), 'webUpdaterEnabled' => !$this->config->getSystemValue('upgrade.disable-web', false), 'isWebUpdaterRecommended' => $this->isWebUpdaterRecommended(), 'updaterEnabled' => empty($updateState['updaterEnabled']) ? false : $updateState['updaterEnabled'], 'versionIsEol' => empty($updateState['versionIsEol']) ? false : $updateState['versionIsEol'], 'isDefaultUpdateServerURL' => $isDefaultUpdateServerURL, 'updateServerURL' => $updateServerURL, 'notifyGroups' => $this->getSelectedGroups($notifyGroups), 'hasValidSubscription' => $hasValidSubscription, ]; $this->initialState->provideInitialState('data', $params); return new TemplateResponse('updatenotification', 'admin', [], ''); } protected function filterChanges(array $changes): array { $filtered = []; if (isset($changes['changelogURL'])) { $filtered['changelogURL'] = $changes['changelogURL']; } if (!isset($changes['whatsNew'])) { return $filtered; } $iterator = $this->l10nFactory->getLanguageIterator(); do { $lang = $iterator->current(); if (isset($changes['whatsNew'][$lang])) { $filtered['whatsNew'] = $changes['whatsNew'][$lang]; return $filtered; } $iterator->next(); } while ($lang !== 'en' && $iterator->valid()); return $filtered; } /** * @param string[] $groupIds * @return list */ protected function getSelectedGroups(array $groupIds): array { $result = []; foreach ($groupIds as $groupId) { $group = $this->groupManager->get($groupId); if ($group === null) { continue; } $result[] = ['id' => $group->getGID(), 'displayname' => $group->getDisplayName()]; } return $result; } public function getSection(): ?string { if (!$this->config->getSystemValueBool('updatechecker', true)) { // update checker is disabled so we do not show the section at all return null; } return 'overview'; } public function getPriority(): int { return 11; } private function isWebUpdaterRecommended(): bool { return (int)$this->userManager->countUsersTotal(100) < 100; } }