mirror of
https://github.com/nextcloud/server.git
synced 2026-11-03 21:12:20 +01:00
The main bundle, which defines the OC, OCA and OCP globals and mounts the header menus, is built by the Vue 3 toolchain from here on, together with the scripts that have no Vue code at all. It is loaded as a module after `core-common.js` as before, so the globals are still defined before any app script runs. Every place that loads it now also loads its stylesheet. moment only picked up its locales through webpack's handling of require(), so they are imported explicitly now, and `basename` comes from `@nextcloud/paths` instead of the Node polyfill. The unsupported browser redirect is loaded before the main bundle, so it reads the OC config once the page is loaded instead of on evaluation. Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de> Assisted-by: ClaudeCode:claude-opus-5-5
156 lines
4.3 KiB
PHP
156 lines
4.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
|
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
namespace OC\Core\Controller;
|
|
|
|
use OC\IntegrityCheck\Checker;
|
|
use OC\Setup;
|
|
use OCP\IInitialStateService;
|
|
use OCP\IURLGenerator;
|
|
use OCP\Server;
|
|
use OCP\ServerVersion;
|
|
use OCP\Template\ITemplateManager;
|
|
use OCP\Util;
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
class SetupController {
|
|
private string $autoConfigFile;
|
|
|
|
public function __construct(
|
|
protected Setup $setupHelper,
|
|
protected LoggerInterface $logger,
|
|
protected ITemplateManager $templateManager,
|
|
protected IInitialStateService $initialStateService,
|
|
protected IURLGenerator $urlGenerator,
|
|
protected ServerVersion $serverVersion,
|
|
) {
|
|
$this->autoConfigFile = \OC::$configDir . 'autoconfig.php';
|
|
}
|
|
|
|
public function run(array $post): void {
|
|
// Check for autosetup:
|
|
$post = $this->loadAutoConfig($post);
|
|
$opts = $this->setupHelper->getSystemInfo();
|
|
|
|
// convert 'abcpassword' to 'abcpass'
|
|
if (isset($post['adminpassword'])) {
|
|
$post['adminpass'] = $post['adminpassword'];
|
|
}
|
|
if (isset($post['dbpassword'])) {
|
|
$post['dbpass'] = $post['dbpassword'];
|
|
}
|
|
|
|
if (!$this->setupHelper->canInstallFileExists()) {
|
|
$this->displaySetupForbidden();
|
|
return;
|
|
}
|
|
|
|
if (isset($post['install']) && $post['install'] === 'true') {
|
|
// We have to launch the installation process :
|
|
$e = $this->setupHelper->install($post);
|
|
$errors = ['errors' => $e];
|
|
|
|
if (count($e) > 0) {
|
|
$options = array_merge($opts, $post, $errors);
|
|
$this->display($options);
|
|
} else {
|
|
$this->finishSetup();
|
|
}
|
|
} else {
|
|
$options = array_merge($opts, $post);
|
|
$this->display($options);
|
|
}
|
|
}
|
|
|
|
private function displaySetupForbidden(): void {
|
|
$this->templateManager->printGuestPage('', 'installation_forbidden');
|
|
}
|
|
|
|
public function display(array $post): void {
|
|
$defaults = [
|
|
'adminlogin' => '',
|
|
'adminpass' => '',
|
|
'dbuser' => '',
|
|
'dbpass' => '',
|
|
'dbname' => '',
|
|
'dbtablespace' => '',
|
|
'dbhost' => 'localhost',
|
|
'dbtype' => '',
|
|
'dbsslmode' => '',
|
|
'dbsslca' => '',
|
|
'dbsslcert' => '',
|
|
'dbsslkey' => '',
|
|
'dbsslcrl' => '',
|
|
'dbsslnoverify' => false,
|
|
'hasAutoconfig' => false,
|
|
'serverRoot' => \OC::$SERVERROOT,
|
|
'version' => implode('.', $this->serverVersion->getVersion()),
|
|
'versionstring' => $this->serverVersion->getVersionString(),
|
|
];
|
|
$parameters = array_merge($defaults, $post);
|
|
|
|
Util::addStyle('server', null);
|
|
|
|
// include common nextcloud webpack bundle
|
|
Util::addScript('core', 'common');
|
|
Util::addScript('core', 'main');
|
|
Util::addStyle('core', 'main');
|
|
Util::addScript('core', 'install');
|
|
Util::addStyle('core', 'install');
|
|
Util::addTranslations('core');
|
|
|
|
$this->initialStateService->provideInitialState('core', 'config', $parameters);
|
|
$this->initialStateService->provideInitialState('core', 'data', false);
|
|
$this->initialStateService->provideInitialState('core', 'links', [
|
|
'adminInstall' => $this->urlGenerator->linkToDocs('admin-install'),
|
|
'adminSourceInstall' => $this->urlGenerator->linkToDocs('admin-source_install'),
|
|
'adminDBConfiguration' => $this->urlGenerator->linkToDocs('admin-db-configuration'),
|
|
]);
|
|
|
|
$this->templateManager->printGuestPage('', 'installation');
|
|
}
|
|
|
|
private function finishSetup(): void {
|
|
if (file_exists($this->autoConfigFile)) {
|
|
unlink($this->autoConfigFile);
|
|
}
|
|
Server::get(Checker::class)->runInstanceVerification();
|
|
|
|
if ($this->setupHelper->shouldRemoveCanInstallFile()) {
|
|
$this->templateManager->printGuestPage('', 'installation_incomplete');
|
|
return;
|
|
}
|
|
|
|
header('Location: ' . Server::get(IURLGenerator::class)->getAbsoluteURL('index.php/core/apps/recommended'));
|
|
exit();
|
|
}
|
|
|
|
/**
|
|
* @psalm-taint-escape file we trust file path given in POST for setup
|
|
*/
|
|
public function loadAutoConfig(array $post): array {
|
|
if (file_exists($this->autoConfigFile)) {
|
|
$this->logger->info('Autoconfig file found, setting up Nextcloud…');
|
|
$AUTOCONFIG = [];
|
|
include $this->autoConfigFile;
|
|
$post['hasAutoconfig'] = count($AUTOCONFIG) > 0;
|
|
$post = array_merge($post, $AUTOCONFIG);
|
|
}
|
|
|
|
$dbIsSet = isset($post['dbtype']);
|
|
$directoryIsSet = isset($post['directory']);
|
|
$adminAccountIsSet = isset($post['adminlogin']);
|
|
|
|
if ($dbIsSet && $directoryIsSet && $adminAccountIsSet) {
|
|
$post['install'] = 'true';
|
|
}
|
|
|
|
return $post;
|
|
}
|
|
}
|