Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions core/Command/Maintenance/Install.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ protected function configure(): void {
->addOption('database-user', null, InputOption::VALUE_REQUIRED, 'Login to connect to the database')
->addOption('database-pass', null, InputOption::VALUE_OPTIONAL, 'Password of the database user', null)
->addOption('database-table-space', null, InputOption::VALUE_OPTIONAL, 'Table space of the database (oci only)', null)
->addOption('disable-admin-user', null, InputOption::VALUE_NONE, 'Disable the creation of an admin user')
->addOption('admin-user', null, InputOption::VALUE_REQUIRED, 'Login of the admin account', 'admin')
->addOption('admin-pass', null, InputOption::VALUE_REQUIRED, 'Password of the admin account')
->addOption('admin-email', null, InputOption::VALUE_OPTIONAL, 'E-Mail of the admin account')
Expand Down Expand Up @@ -120,6 +121,7 @@ protected function validateInput(InputInterface $input, OutputInterface $output,
if ($input->hasParameterOption('--database-pass')) {
$dbPass = (string)$input->getOption('database-pass');
}
$disableAdminUser = (bool)$input->getOption('disable-admin-user');
$adminLogin = $input->getOption('admin-user');
$adminPassword = $input->getOption('admin-pass');
$adminEmail = $input->getOption('admin-email');
Expand All @@ -142,7 +144,7 @@ protected function validateInput(InputInterface $input, OutputInterface $output,
}
}

if (is_null($adminPassword)) {
if (!$disableAdminUser && $adminPassword === null) {
/** @var QuestionHelper $helper */
$helper = $this->getHelper('question');
$question = new Question('What is the password you like to use for the admin account <' . $adminLogin . '>?');
Expand All @@ -151,7 +153,7 @@ protected function validateInput(InputInterface $input, OutputInterface $output,
$adminPassword = $helper->ask($input, $output, $question);
}

if ($adminEmail !== null && !filter_var($adminEmail, FILTER_VALIDATE_EMAIL)) {
if (!$disableAdminUser && $adminEmail !== null && !filter_var($adminEmail, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Invalid e-mail-address <' . $adminEmail . '> for <' . $adminLogin . '>.');
}

Expand All @@ -161,6 +163,7 @@ protected function validateInput(InputInterface $input, OutputInterface $output,
'dbpass' => $dbPass,
'dbname' => $dbName,
'dbhost' => $dbHost,
'admindisable' => $disableAdminUser,
'adminlogin' => $adminLogin,
'adminpass' => $adminPassword,
'adminemail' => $adminEmail,
Expand Down
81 changes: 44 additions & 37 deletions lib/private/Setup.php
Original file line number Diff line number Diff line change
Expand Up @@ -304,11 +304,15 @@ public function install(array $options, ?IOutput $output = null): array {
$error = [];
$dbType = $options['dbtype'];

if (empty($options['adminlogin'])) {
$error[] = $l->t('Set an admin Login.');
}
if (empty($options['adminpass'])) {
$error[] = $l->t('Set an admin password.');
$disableAdminUser = (bool)($options['admindisable'] ?? false);

if (!$disableAdminUser) {
if (empty($options['adminlogin'])) {
$error[] = $l->t('Set an admin Login.');
}
if (empty($options['adminpass'])) {
$error[] = $l->t('Set an admin password.');
}
}
if (empty($options['directory'])) {
$options['directory'] = \OC::$SERVERROOT . '/data';
Expand All @@ -318,8 +322,6 @@ public function install(array $options, ?IOutput $output = null): array {
$dbType = 'sqlite';
}

$username = htmlspecialchars_decode($options['adminlogin']);
$password = htmlspecialchars_decode($options['adminpass']);
$dataDir = htmlspecialchars_decode($options['directory']);

$class = self::$dbSetupClasses[$dbType];
Expand Down Expand Up @@ -375,7 +377,7 @@ public function install(array $options, ?IOutput $output = null): array {
$this->outputDebug($output, 'Configuring database');
$dbSetup->initialize($options);
try {
$dbSetup->setupDatabase($username);
$dbSetup->setupDatabase();
} catch (\OC\DatabaseSetupException $e) {
$error[] = [
'error' => $e->getMessage(),
Expand Down Expand Up @@ -405,19 +407,22 @@ public function install(array $options, ?IOutput $output = null): array {
return $error;
}

$this->outputDebug($output, 'Create admin account');

// create the admin account and group
$user = null;
try {
$user = Server::get(IUserManager::class)->createUser($username, $password);
if (!$user) {
$error[] = "Account <$username> could not be created.";
if (!$disableAdminUser) {
$username = htmlspecialchars_decode($options['adminlogin']);
$password = htmlspecialchars_decode($options['adminpass']);
$this->outputDebug($output, 'Create admin account');

try {
$user = Server::get(IUserManager::class)->createUser($username, $password);
if (!$user) {
$error[] = "Account <$username> could not be created.";
return $error;
}
} catch (Exception $exception) {
$error[] = $exception->getMessage();
return $error;
}
} catch (Exception $exception) {
$error[] = $exception->getMessage();
return $error;
}

$config = Server::get(IConfig::class);
Expand All @@ -432,7 +437,7 @@ public function install(array $options, ?IOutput $output = null): array {
}

$group = Server::get(IGroupManager::class)->createGroup('admin');
if ($group instanceof IGroup) {
if ($user !== null && $group instanceof IGroup) {
$group->addUser($user);
}

Expand Down Expand Up @@ -464,26 +469,28 @@ public function install(array $options, ?IOutput $output = null): array {
$bootstrapCoordinator = Server::get(\OC\AppFramework\Bootstrap\Coordinator::class);
$bootstrapCoordinator->runInitialRegistration();

// Create a session token for the newly created user
// The token provider requires a working db, so it's not injected on setup
/** @var \OC\User\Session $userSession */
$userSession = Server::get(IUserSession::class);
$provider = Server::get(PublicKeyTokenProvider::class);
$userSession->setTokenProvider($provider);
$userSession->login($username, $password);
$user = $userSession->getUser();
if (!$user) {
$error[] = 'No account found in session.';
return $error;
}
$userSession->createSessionToken($request, $user->getUID(), $username, $password);
if (!$disableAdminUser) {
// Create a session token for the newly created user
// The token provider requires a working db, so it's not injected on setup
/** @var \OC\User\Session $userSession */
$userSession = Server::get(IUserSession::class);
$provider = Server::get(PublicKeyTokenProvider::class);
$userSession->setTokenProvider($provider);
$userSession->login($username, $password);
$user = $userSession->getUser();
if (!$user) {
$error[] = 'No account found in session.';
return $error;
}
$userSession->createSessionToken($request, $user->getUID(), $username, $password);

$session = $userSession->getSession();
$session->set('last-password-confirm', Server::get(ITimeFactory::class)->getTime());
$session = $userSession->getSession();
$session->set('last-password-confirm', Server::get(ITimeFactory::class)->getTime());

// Set email for admin
if (!empty($options['adminemail'])) {
$user->setSystemEMailAddress($options['adminemail']);
// Set email for admin
if (!empty($options['adminemail'])) {
$user->setSystemEMailAddress($options['adminemail']);
}
}

return $error;
Expand Down
5 changes: 1 addition & 4 deletions lib/private/Setup/AbstractDatabase.php
Original file line number Diff line number Diff line change
Expand Up @@ -127,10 +127,7 @@ protected function connect(array $configOverwrite = []): Connection {
return $connection;
}

/**
* @param string $username
*/
abstract public function setupDatabase($username);
abstract public function setupDatabase();

public function runMigrations(?IOutput $output = null) {
if (!is_dir(\OC::$SERVERROOT . '/core/Migrations')) {
Expand Down
4 changes: 2 additions & 2 deletions lib/private/Setup/MySQL.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
class MySQL extends AbstractDatabase {
public $dbprettyname = 'MySQL/MariaDB';

public function setupDatabase($username) {
public function setupDatabase() {
//check if the database user has admin right
$connection = $this->connect(['dbname' => null]);

Expand All @@ -28,7 +28,7 @@ public function setupDatabase($username) {
}

if ($this->tryCreateDbUser) {
$this->createSpecificUser($username, new ConnectionAdapter($connection));
$this->createSpecificUser('oc_admin', new ConnectionAdapter($connection));
}

$this->config->setValues([
Expand Down
2 changes: 1 addition & 1 deletion lib/private/Setup/OCI.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public function validate($config) {
return $errors;
}

public function setupDatabase($username) {
public function setupDatabase() {
try {
$this->connect();
} catch (\Exception $e) {
Expand Down
5 changes: 2 additions & 3 deletions lib/private/Setup/PostgreSQL.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,9 @@ class PostgreSQL extends AbstractDatabase {
public $dbprettyname = 'PostgreSQL';

/**
* @param string $username
* @throws \OC\DatabaseSetupException
*/
public function setupDatabase($username) {
public function setupDatabase() {
try {
$connection = $this->connect([
'dbname' => 'postgres'
Expand All @@ -46,7 +45,7 @@ public function setupDatabase($username) {
//use the admin login data for the new database user

//add prefix to the postgresql user name to prevent collisions
$this->dbUser = 'oc_' . strtolower($username);
$this->dbUser = 'oc_admin';
//create a new password so we don't need to store the admin config in the config file
$this->dbPassword = \OC::$server->get(ISecureRandom::class)->generate(30, ISecureRandom::CHAR_ALPHANUMERIC);

Expand Down
2 changes: 1 addition & 1 deletion lib/private/Setup/Sqlite.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public function initialize($config) {
}
}

public function setupDatabase($username) {
public function setupDatabase() {
$datadir = $this->config->getValue(
'datadirectory',
\OC::$SERVERROOT . '/data'
Expand Down
Loading