From 932eb9ead7afb16c27fcbf923e52bbed5daa17e2 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Wed, 5 Aug 2026 23:43:42 +0200 Subject: [PATCH 1/5] feat(setup): properly support encryption options for databases Signed-off-by: Ferdinand Thiessen --- lib/private/DB/ConnectionFactory.php | 2 +- lib/private/Setup/AbstractDatabase.php | 54 +++++++- lib/private/Setup/MySQL.php | 47 +++++++ lib/private/Setup/OCI.php | 3 +- lib/private/Setup/PostgreSQL.php | 27 ++++ lib/private/Setup/Sqlite.php | 3 +- tests/lib/Setup/AbstractDatabaseTest.php | 35 +++++ tests/lib/Setup/MySQLTest.php | 163 +++++++++++++++++++++++ tests/lib/Setup/PostgreSQLTest.php | 73 ++++++++++ 9 files changed, 402 insertions(+), 5 deletions(-) create mode 100644 tests/lib/Setup/MySQLTest.php diff --git a/lib/private/DB/ConnectionFactory.php b/lib/private/DB/ConnectionFactory.php index 71bd57188e28c..91ed009f4d45d 100644 --- a/lib/private/DB/ConnectionFactory.php +++ b/lib/private/DB/ConnectionFactory.php @@ -210,7 +210,7 @@ public function createConnectionParams(string $configPrefix = '', array $additio //additional driver options, eg. for mysql ssl $driverOptions = $this->config->getValue($configPrefix . 'dbdriveroptions', $this->config->getValue('dbdriveroptions', null)); if ($driverOptions) { - $connectionParams['driverOptions'] = $driverOptions; + $connectionParams['driverOptions'] = array_merge($connectionParams['driverOptions'], $driverOptions); } // set default table creation options diff --git a/lib/private/Setup/AbstractDatabase.php b/lib/private/Setup/AbstractDatabase.php index feffcc0cab985..826699c564f2c 100644 --- a/lib/private/Setup/AbstractDatabase.php +++ b/lib/private/Setup/AbstractDatabase.php @@ -25,6 +25,19 @@ abstract class AbstractDatabase { */ protected const array CONNECTION_ENCRYPTION_OPTIONS = ['dbdriveroptions']; + /** + * Installer options describing an encrypted database connection independently of the + * database in use, as provided by the web installer and `occ maintenance:install`. + * @var string[] + */ + protected const array ENCRYPTION_OPTIONS = ['dbsslmode', 'dbsslca', 'dbsslcert', 'dbsslkey', 'dbsslcrl', 'dbsslnoverify']; + + /** + * The subset of {@see static::ENCRYPTION_OPTIONS} this database supports. + * @var string[] + */ + protected const array SUPPORTED_ENCRYPTION_OPTIONS = []; + protected string $dbprettyname = 'abstract'; protected string $dbUser; @@ -55,16 +68,46 @@ public function validate(array $config): array { if (substr_count($config['dbname'], '.') >= 1) { $errors[] = $this->trans->t('You cannot use dots in the database name %s', [$this->dbprettyname]); } + return array_merge($errors, $this->validateEncryptionOptions($config)); + } + + /** + * Validate the installer options configuring an encrypted database connection. + * + * @param array $config The options passed to the installer + * @return string[] + */ + protected function validateEncryptionOptions(array $config): array { + $errors = []; foreach (static::CONNECTION_ENCRYPTION_OPTIONS as $option) { if (isset($config[$option]) && !is_array($config[$option])) { - // Fail instead of ignoring the option, otherwise the instance would be - // installed with an unencrypted connection without the admin noticing. $errors[] = $this->trans->t('The database option "%1$s" for %2$s has to be a list of values', [$option, $this->dbprettyname]); } } + foreach (static::ENCRYPTION_OPTIONS as $option) { + if (!empty($config[$option]) && !in_array($option, static::SUPPORTED_ENCRYPTION_OPTIONS, true)) { + $errors[] = $this->trans->t('The database option "%1$s" is not supported by %2$s', [$option, $this->dbprettyname]); + } + } + // A client certificate is useless without its private key and vice versa + if (in_array('dbsslcert', static::SUPPORTED_ENCRYPTION_OPTIONS, true) + && empty($config['dbsslcert']) !== empty($config['dbsslkey'])) { + $errors[] = $this->trans->t('The database options "dbsslcert" and "dbsslkey" have to be provided together'); + } return $errors; } + /** + * Translate the `ENCRYPTION_OPTIONS` into the system config values that + * configure an encrypted connection for this database. + * + * @param array $config The options passed to the installer + * @return array System config values, empty if no option was provided + */ + protected function getEncryptionConfig(array $config): array { + return []; + } + public function initialize(array $config): void { $dbUser = $config['dbuser']; $dbPass = $config['dbpass']; @@ -97,6 +140,13 @@ public function initialize(array $config): void { $configValues[$option] = $config[$option]; } + // The database independent options end up in the same config values, so they are + // applied on top of any raw value provided, e.g. through an autoconfig file. + // array_replace() instead of array_merge() to keep the numeric PDO attribute keys. + foreach ($this->getEncryptionConfig($config) as $option => $value) { + $configValues[$option] = array_replace($configValues[$option] ?? [], $value); + } + $this->config->setValues($configValues); $this->dbUser = $dbUser; diff --git a/lib/private/Setup/MySQL.php b/lib/private/Setup/MySQL.php index 8a08a0c09ba15..866d4ac0fa99d 100644 --- a/lib/private/Setup/MySQL.php +++ b/lib/private/Setup/MySQL.php @@ -17,6 +17,12 @@ class MySQL extends AbstractDatabase { public string $dbprettyname = 'MySQL/MariaDB'; + /** + * There is no equivalent to the PostgreSQL `sslmode`, the connection is encrypted by + * providing a CA certificate. A revocation list cannot be passed through PDO either. + */ + protected const array SUPPORTED_ENCRYPTION_OPTIONS = ['dbsslca', 'dbsslcert', 'dbsslkey', 'dbsslnoverify']; + #[\Override] public function setupDatabase(): void { //check if the database user has admin right @@ -80,6 +86,47 @@ public function setupDatabase(): void { } } + #[\Override] + protected function getEncryptionConfig(array $config): array { + $attributes = $this->getSslAttributes(); + + $driverOptions = []; + foreach (['dbsslca' => 'ca', 'dbsslcert' => 'cert', 'dbsslkey' => 'key'] as $option => $attribute) { + if (!empty($config[$option])) { + $driverOptions[$attributes[$attribute]] = (string)$config[$option]; + } + } + if (!empty($config['dbsslnoverify'])) { + $driverOptions[$attributes['verify']] = false; + } + + return $driverOptions === [] ? [] : ['dbdriveroptions' => $driverOptions]; + } + + /** + * PDO attributes configuring an encrypted connection. + * + * @return array{ca: int, cert: int, key: int, verify: int} + */ + private function getSslAttributes(): array { + // TODO: simplify once we only support PHP 8.5+. + if (PHP_VERSION_ID >= 80500 && class_exists(\Pdo\Mysql::class)) { + /** @psalm-suppress UndefinedClass */ + return [ + 'ca' => \Pdo\Mysql::ATTR_SSL_CA, + 'cert' => \Pdo\Mysql::ATTR_SSL_CERT, + 'key' => \Pdo\Mysql::ATTR_SSL_KEY, + 'verify' => \Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERT, + ]; + } + return [ + 'ca' => \PDO::MYSQL_ATTR_SSL_CA, + 'cert' => \PDO::MYSQL_ATTR_SSL_CERT, + 'key' => \PDO::MYSQL_ATTR_SSL_KEY, + 'verify' => \PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT, + ]; + } + private function createDatabase(\OC\DB\Connection $connection): void { try { $name = $this->dbName; diff --git a/lib/private/Setup/OCI.php b/lib/private/Setup/OCI.php index 0fb13abac7179..159981e2e0cb5 100644 --- a/lib/private/Setup/OCI.php +++ b/lib/private/Setup/OCI.php @@ -42,7 +42,8 @@ public function validate(array $config): array { } elseif (empty($config['dbname'])) { $errors[] = $this->trans->t('Enter the database name for %s', [$this->dbprettyname]); } - return $errors; + // Oracle is configured through the connect string and `sqlnet.ora`, not by the installer + return array_merge($errors, $this->validateEncryptionOptions($config)); } #[\Override] diff --git a/lib/private/Setup/PostgreSQL.php b/lib/private/Setup/PostgreSQL.php index cae86abdd503d..edcbc22a8a786 100644 --- a/lib/private/Setup/PostgreSQL.php +++ b/lib/private/Setup/PostgreSQL.php @@ -19,6 +19,33 @@ class PostgreSQL extends AbstractDatabase { // #[\Override] TODO: Uncomment this when we only support PHP 8.5+ support protected const array CONNECTION_ENCRYPTION_OPTIONS = [...parent::CONNECTION_ENCRYPTION_OPTIONS, 'pgsql_ssl']; + // #[\Override] TODO: Uncomment this when we only support PHP 8.5+ support + protected const array SUPPORTED_ENCRYPTION_OPTIONS = ['dbsslmode', 'dbsslca', 'dbsslcert', 'dbsslkey', 'dbsslcrl']; + + /** + * Installer options mapped onto the `pgsql_ssl` connection parameters, as read by + * {@see \OC\DB\ConnectionFactory::createConnectionParams()}. + */ + private const array SSL_PARAMETERS = [ + 'dbsslmode' => 'mode', + 'dbsslca' => 'rootcert', + 'dbsslcert' => 'cert', + 'dbsslkey' => 'key', + 'dbsslcrl' => 'crl', + ]; + + #[\Override] + protected function getEncryptionConfig(array $config): array { + $pgsqlSsl = []; + foreach (self::SSL_PARAMETERS as $option => $parameter) { + if (!empty($config[$option])) { + $pgsqlSsl[$parameter] = (string)$config[$option]; + } + } + + return $pgsqlSsl === [] ? [] : ['pgsql_ssl' => $pgsqlSsl]; + } + /** * @throws DatabaseSetupException */ diff --git a/lib/private/Setup/Sqlite.php b/lib/private/Setup/Sqlite.php index 96eb60a1bf01f..88ce72bfaa12c 100644 --- a/lib/private/Setup/Sqlite.php +++ b/lib/private/Setup/Sqlite.php @@ -15,7 +15,8 @@ class Sqlite extends AbstractDatabase { #[\Override] public function validate(array $config): array { - return []; + // SQLite needs no credentials, but an encrypted connection is not a thing either + return $this->validateEncryptionOptions($config); } #[\Override] diff --git a/tests/lib/Setup/AbstractDatabaseTest.php b/tests/lib/Setup/AbstractDatabaseTest.php index 70ccfd45f62c6..9b6a777ede31b 100644 --- a/tests/lib/Setup/AbstractDatabaseTest.php +++ b/tests/lib/Setup/AbstractDatabaseTest.php @@ -171,6 +171,41 @@ public function testValidateRejectsMalformedEncryptionOptions(): void { ], $errors); } + public static function encryptionOptions(): array { + return [ + 'dbsslmode' => ['dbsslmode', 'verify-full'], + 'dbsslca' => ['dbsslca', '/ca.pem'], + 'dbsslcert' => ['dbsslcert', '/client.crt'], + 'dbsslkey' => ['dbsslkey', '/client.key'], + 'dbsslcrl' => ['dbsslcrl', '/crl.pem'], + 'dbsslnoverify' => ['dbsslnoverify', true], + ]; + } + + /** + * A database that cannot be configured to use an encrypted connection has to reject + * every such option instead of installing an unencrypted instance silently. + */ + #[\PHPUnit\Framework\Attributes\DataProvider('encryptionOptions')] + public function testValidateRejectsUnsupportedEncryptionOptions(string $option, string|bool $value): void { + $errors = $this->database->validate($this->options([$option => $value])); + + $this->assertContains("The database option \"$option\" is not supported by Test", $errors); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('encryptionOptions')] + public function testInitializeSkipsUnsupportedEncryptionOptions(string $option, string|bool $value): void { + $this->config->expects($this->once()) + ->method('setValues') + ->with([ + 'dbname' => 'nextcloud', + 'dbhost' => 'db.example.org', + 'dbtableprefix' => 'oc_', + ]); + + $this->database->initialize($this->options([$option => $value])); + } + public function testValidateAcceptsEncryptionOptions(): void { $errors = $this->database->validate($this->options([ 'dbdriveroptions' => [self::MYSQL_ATTR_SSL_CA => '/ca.pem'], diff --git a/tests/lib/Setup/MySQLTest.php b/tests/lib/Setup/MySQLTest.php new file mode 100644 index 0000000000000..4ef008cb3a040 --- /dev/null +++ b/tests/lib/Setup/MySQLTest.php @@ -0,0 +1,163 @@ +config = $this->createMock(SystemConfig::class); + + $l10n = $this->createMock(IL10N::class); + $l10n->method('t') + ->willReturnCallback(fn (string $text, array $parameters = []) => vsprintf($text, $parameters)); + + $this->database = new MySQL( + $l10n, + $this->config, + $this->createMock(LoggerInterface::class), + $this->createMock(ISecureRandom::class), + ); + } + + /** + * MySQL/MariaDB is configured through PDO driver options, keyed by the numeric PDO + * attributes - which is why the web installer and CLI cannot pass them directly. + */ + public function testInitializeMapsEncryptionOptions(): void { + $this->config->expects($this->once()) + ->method('setValues') + ->with([ + 'dbname' => 'nextcloud', + 'dbhost' => 'db.example.org', + 'dbtableprefix' => 'oc_', + 'dbdriveroptions' => [ + self::ATTR_SSL_CA => '/ca.pem', + self::ATTR_SSL_CERT => '/client.crt', + self::ATTR_SSL_KEY => '/client.key', + self::ATTR_SSL_VERIFY_SERVER_CERT => false, + ], + ]); + + $this->database->initialize($this->options([ + 'dbsslca' => '/ca.pem', + 'dbsslcert' => '/client.crt', + 'dbsslkey' => '/client.key', + 'dbsslnoverify' => true, + ])); + } + + /** + * Driver options provided as raw config value, e.g. through an autoconfig file, must + * survive - and their numeric keys must not be renumbered. + */ + public function testInitializeMergesWithRawDriverOptions(): void { + $this->config->expects($this->once()) + ->method('setValues') + ->with([ + 'dbname' => 'nextcloud', + 'dbhost' => 'db.example.org', + 'dbtableprefix' => 'oc_', + 'dbdriveroptions' => [ + self::ATTR_INIT_COMMAND => 'SET wait_timeout = 28800', + self::ATTR_SSL_CA => '/ca.pem', + ], + ]); + + $this->database->initialize($this->options([ + 'dbdriveroptions' => [self::ATTR_INIT_COMMAND => 'SET wait_timeout = 28800'], + 'dbsslca' => '/ca.pem', + ])); + } + + public function testInitializeSkipsEmptyEncryptionOptions(): void { + $this->config->expects($this->once()) + ->method('setValues') + ->with([ + 'dbname' => 'nextcloud', + 'dbhost' => 'db.example.org', + 'dbtableprefix' => 'oc_', + ]); + + $this->database->initialize($this->options([ + 'dbsslca' => '', + 'dbsslcert' => '', + 'dbsslkey' => '', + 'dbsslnoverify' => false, + ])); + } + + public static function unsupportedEncryptionOptions(): array { + return [ + // There is no PDO equivalent of the PostgreSQL sslmode + 'dbsslmode' => ['dbsslmode', 'require'], + // A revocation list cannot be passed through PDO + 'dbsslcrl' => ['dbsslcrl', '/crl.pem'], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('unsupportedEncryptionOptions')] + public function testValidateRejectsUnsupportedEncryptionOptions(string $option, string $value): void { + $errors = $this->database->validate($this->options([$option => $value])); + + $this->assertEquals([ + "The database option \"$option\" is not supported by MySQL/MariaDB", + ], $errors); + } + + public function testValidateRejectsIncompleteClientCertificate(): void { + $errors = $this->database->validate($this->options(['dbsslcert' => '/client.crt'])); + + $this->assertEquals([ + 'The database options "dbsslcert" and "dbsslkey" have to be provided together', + ], $errors); + } + + public function testValidateAcceptsEncryptionOptions(): void { + $errors = $this->database->validate($this->options([ + 'dbsslca' => '/ca.pem', + 'dbsslcert' => '/client.crt', + 'dbsslkey' => '/client.key', + 'dbsslnoverify' => true, + ])); + + $this->assertEquals([], $errors); + } + + private function options(array $additional = []): array { + return array_merge([ + 'dbuser' => 'admin', + 'dbpass' => 'admin-password', + 'dbname' => 'nextcloud', + 'dbhost' => 'db.example.org', + ], $additional); + } +} diff --git a/tests/lib/Setup/PostgreSQLTest.php b/tests/lib/Setup/PostgreSQLTest.php index 335e7014b82e8..abad8891e3cbb 100644 --- a/tests/lib/Setup/PostgreSQLTest.php +++ b/tests/lib/Setup/PostgreSQLTest.php @@ -65,6 +65,79 @@ public function testInitializePersistsPgsqlSsl(): void { $this->database->initialize($this->options(['pgsql_ssl' => self::PGSQL_SSL])); } + /** + * The database independent options provided by the web installer and the CLI have to + * end up in the `pgsql_ssl` connection parameters. + */ + public function testInitializeMapsEncryptionOptions(): void { + $this->config->expects($this->once()) + ->method('setValues') + ->with([ + 'dbname' => 'nextcloud', + 'dbhost' => 'db.example.org', + 'dbtableprefix' => 'oc_', + 'pgsql_ssl' => self::PGSQL_SSL + ['crl' => '/client.crl'], + ]); + + $this->database->initialize($this->options([ + 'dbsslmode' => 'verify-full', + 'dbsslca' => '/rootCA.crt', + 'dbsslcert' => '/client.crt', + 'dbsslkey' => '/client.key', + 'dbsslcrl' => '/client.crl', + ])); + } + + /** + * A `pgsql_ssl` value provided as raw config value, e.g. through an autoconfig file, + * must survive the mapped options. + */ + public function testInitializeMergesWithRawPgsqlSsl(): void { + $this->config->expects($this->once()) + ->method('setValues') + ->with([ + 'dbname' => 'nextcloud', + 'dbhost' => 'db.example.org', + 'dbtableprefix' => 'oc_', + 'pgsql_ssl' => ['rootcert' => '/rootCA.crt', 'mode' => 'verify-full'], + ]); + + $this->database->initialize($this->options([ + 'pgsql_ssl' => ['rootcert' => '/rootCA.crt'], + 'dbsslmode' => 'verify-full', + ])); + } + + public function testValidateRejectsUnsupportedEncryptionOptions(): void { + // There is no PDO attribute to skip the host verification for PostgreSQL, + // the sslmode covers it + $errors = $this->database->validate($this->options(['dbsslnoverify' => true])); + + $this->assertEquals([ + 'The database option "dbsslnoverify" is not supported by PostgreSQL', + ], $errors); + } + + public function testValidateRejectsIncompleteClientCertificate(): void { + $errors = $this->database->validate($this->options(['dbsslkey' => '/client.key'])); + + $this->assertEquals([ + 'The database options "dbsslcert" and "dbsslkey" have to be provided together', + ], $errors); + } + + public function testValidateAcceptsEncryptionOptions(): void { + $errors = $this->database->validate($this->options([ + 'dbsslmode' => 'verify-full', + 'dbsslca' => '/rootCA.crt', + 'dbsslcert' => '/client.crt', + 'dbsslkey' => '/client.key', + 'dbsslcrl' => '/client.crl', + ])); + + $this->assertEquals([], $errors); + } + public static function emptyPgsqlSsl(): array { return [ 'not provided' => [[]], From 379035b95ad729f9f3869fc5610147bb4e25fe8a Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Wed, 5 Aug 2026 23:44:09 +0200 Subject: [PATCH 2/5] feat(core): add support for encrypted db connection in `maintenance:install` Signed-off-by: Ferdinand Thiessen --- core/Command/Maintenance/Install.php | 32 +++++++ lib/private/Setup/MySQL.php | 2 +- .../Core/Command/Maintenance/InstallTest.php | 91 +++++++++++++++++++ tests/lib/Setup/MySQLTest.php | 41 +++++---- 4 files changed, 148 insertions(+), 18 deletions(-) create mode 100644 tests/Core/Command/Maintenance/InstallTest.php diff --git a/core/Command/Maintenance/Install.php b/core/Command/Maintenance/Install.php index 8dc551b97b102..41f7c2ae6aa59 100644 --- a/core/Command/Maintenance/Install.php +++ b/core/Command/Maintenance/Install.php @@ -27,6 +27,19 @@ use function get_class; class Install extends Command { + /** + * SSL/TLS command line options and the installer options they provide. The database + * setup translates those, see \OC\Setup\AbstractDatabase::ENCRYPTION_OPTIONS. + * `--database-ssl-no-verify` is handled separately as it takes no value. + */ + private const array SSL_OPTIONS = [ + 'database-ssl-mode' => 'dbsslmode', + 'database-ssl-ca' => 'dbsslca', + 'database-ssl-cert' => 'dbsslcert', + 'database-ssl-key' => 'dbsslkey', + 'database-ssl-crl' => 'dbsslcrl', + ]; + public function __construct( private SystemConfig $config, private IniGetWrapper $iniGetWrapper, @@ -46,6 +59,12 @@ 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('database-ssl-mode', null, InputOption::VALUE_REQUIRED, 'Encryption mode for the database connection, e.g. "require" or "verify-full" (pgsql only)') + ->addOption('database-ssl-ca', null, InputOption::VALUE_REQUIRED, 'Path to the CA certificate the database server is verified against (mysql and pgsql only)') + ->addOption('database-ssl-cert', null, InputOption::VALUE_REQUIRED, 'Path to the client certificate used to authenticate against the database (mysql and pgsql only)') + ->addOption('database-ssl-key', null, InputOption::VALUE_REQUIRED, 'Path to the private key of the client certificate (mysql and pgsql only)') + ->addOption('database-ssl-crl', null, InputOption::VALUE_REQUIRED, 'Path to the certificate revocation list (pgsql only)') + ->addOption('database-ssl-no-verify', null, InputOption::VALUE_NONE, 'Do not verify that the database server certificate matches the hostname used to connect (mysql only)') ->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') @@ -184,6 +203,19 @@ protected function validateInput(InputInterface $input, OutputInterface $output, if ($db === 'oci') { $options['dbtablespace'] = $input->getParameterOption('--database-table-space', ''); } + // The database setup translates these into the system config values that configure + // an encrypted connection, and rejects the ones it does not support, + // see \OC\Setup\AbstractDatabase::getEncryptionConfig() + foreach (self::SSL_OPTIONS as $option => $installerOption) { + $value = $input->getOption($option); + if ($value !== null) { + $options[$installerOption] = (string)$value; + } + } + if ($input->getOption('database-ssl-no-verify')) { + $options['dbsslnoverify'] = true; + } + return $options; } diff --git a/lib/private/Setup/MySQL.php b/lib/private/Setup/MySQL.php index 866d4ac0fa99d..781317d38a497 100644 --- a/lib/private/Setup/MySQL.php +++ b/lib/private/Setup/MySQL.php @@ -111,7 +111,7 @@ protected function getEncryptionConfig(array $config): array { private function getSslAttributes(): array { // TODO: simplify once we only support PHP 8.5+. if (PHP_VERSION_ID >= 80500 && class_exists(\Pdo\Mysql::class)) { - /** @psalm-suppress UndefinedClass */ + /** @psalm-suppress UndefinedConstant Psalm resolves the non-mysqlnd variant of the symfony polyfill class, which lacks this constant */ return [ 'ca' => \Pdo\Mysql::ATTR_SSL_CA, 'cert' => \Pdo\Mysql::ATTR_SSL_CERT, diff --git a/tests/Core/Command/Maintenance/InstallTest.php b/tests/Core/Command/Maintenance/InstallTest.php new file mode 100644 index 0000000000000..6619996378551 --- /dev/null +++ b/tests/Core/Command/Maintenance/InstallTest.php @@ -0,0 +1,91 @@ +command = new Install( + $this->createMock(SystemConfig::class), + $this->createMock(IniGetWrapper::class), + ); + } + + /** + * @param array $parameters + * @return array The installer options built from the command line input + */ + private function validateInput(array $parameters): array { + $input = new ArrayInput(array_merge([ + '--database-name' => 'nextcloud', + '--database-user' => 'admin', + '--database-pass' => 'admin-password', + '--admin-pass' => 'admin-password', + ], $parameters), $this->command->getDefinition()); + + return self::invokePrivate($this->command, 'validateInput', [$input, new NullOutput(), ['sqlite', 'mysql', 'pgsql', 'oci']]); + } + + public static function encryptionOptions(): array { + return [ + '--database-ssl-mode' => ['--database-ssl-mode', 'verify-full', 'dbsslmode', 'verify-full'], + '--database-ssl-ca' => ['--database-ssl-ca', '/ca.pem', 'dbsslca', '/ca.pem'], + '--database-ssl-cert' => ['--database-ssl-cert', '/client.crt', 'dbsslcert', '/client.crt'], + '--database-ssl-key' => ['--database-ssl-key', '/client.key', 'dbsslkey', '/client.key'], + '--database-ssl-crl' => ['--database-ssl-crl', '/crl.pem', 'dbsslcrl', '/crl.pem'], + '--database-ssl-no-verify' => ['--database-ssl-no-verify', true, 'dbsslnoverify', true], + ]; + } + + /** + * The command only forwards the options, the database setup translates them into the + * system config values and rejects the ones it does not support. + */ + #[\PHPUnit\Framework\Attributes\DataProvider('encryptionOptions')] + public function testForwardsEncryptionOptions(string $parameter, string|bool $value, string $option, string|bool $expected): void { + $options = $this->validateInput([ + '--database' => 'pgsql', + $parameter => $value, + ]); + + $this->assertSame($expected, $options[$option]); + } + + public function testNoEncryptionOptions(): void { + $options = $this->validateInput(['--database' => 'mysql']); + + foreach (['dbsslmode', 'dbsslca', 'dbsslcert', 'dbsslkey', 'dbsslcrl', 'dbsslnoverify'] as $option) { + $this->assertArrayNotHasKey($option, $options); + } + } + + /** + * An option that does not apply to the chosen database is not filtered out here, it + * has to be reported by the database setup instead of being silently dropped. + */ + public function testForwardsEncryptionOptionsRegardlessOfDatabase(): void { + $options = $this->validateInput([ + '--database' => 'sqlite', + '--database-ssl-ca' => '/ca.pem', + ]); + + $this->assertSame('/ca.pem', $options['dbsslca']); + } +} diff --git a/tests/lib/Setup/MySQLTest.php b/tests/lib/Setup/MySQLTest.php index 4ef008cb3a040..395c45fd99459 100644 --- a/tests/lib/Setup/MySQLTest.php +++ b/tests/lib/Setup/MySQLTest.php @@ -17,16 +17,6 @@ use Test\TestCase; class MySQLTest extends TestCase { - /** - * Numeric literals instead of the PDO::MYSQL_ATTR_* constants: those are deprecated - * since PHP 8.5 and only defined when the MySQL driver is available. - */ - private const ATTR_SSL_KEY = 1006; - private const ATTR_SSL_CERT = 1007; - private const ATTR_SSL_CA = 1008; - private const ATTR_SSL_VERIFY_SERVER_CERT = 1013; - private const ATTR_INIT_COMMAND = 1002; - private SystemConfig&MockObject $config; private MySQL $database; @@ -48,6 +38,23 @@ protected function setUp(): void { ); } + /** + * The numeric value of a PDO MySQL attribute, e.g. `SSL_CA`. + * + * The values are not stable across PHP versions, so they must never be hardcoded. + * Since PHP 8.5 the `PDO::MYSQL_ATTR_*` constants are deprecated in favor of + * `Pdo\Mysql::ATTR_*`, and either only exists with the MySQL driver installed. + */ + private function attribute(string $name): int { + if (!extension_loaded('pdo_mysql')) { + $this->markTestSkipped('The pdo_mysql extension is required to resolve the PDO attribute values'); + } + if (PHP_VERSION_ID >= 80500 && class_exists(\Pdo\Mysql::class)) { + return (int)constant('Pdo\Mysql::ATTR_' . $name); + } + return (int)constant('PDO::MYSQL_ATTR_' . $name); + } + /** * MySQL/MariaDB is configured through PDO driver options, keyed by the numeric PDO * attributes - which is why the web installer and CLI cannot pass them directly. @@ -60,10 +67,10 @@ public function testInitializeMapsEncryptionOptions(): void { 'dbhost' => 'db.example.org', 'dbtableprefix' => 'oc_', 'dbdriveroptions' => [ - self::ATTR_SSL_CA => '/ca.pem', - self::ATTR_SSL_CERT => '/client.crt', - self::ATTR_SSL_KEY => '/client.key', - self::ATTR_SSL_VERIFY_SERVER_CERT => false, + $this->attribute('SSL_CA') => '/ca.pem', + $this->attribute('SSL_CERT') => '/client.crt', + $this->attribute('SSL_KEY') => '/client.key', + $this->attribute('SSL_VERIFY_SERVER_CERT') => false, ], ]); @@ -87,13 +94,13 @@ public function testInitializeMergesWithRawDriverOptions(): void { 'dbhost' => 'db.example.org', 'dbtableprefix' => 'oc_', 'dbdriveroptions' => [ - self::ATTR_INIT_COMMAND => 'SET wait_timeout = 28800', - self::ATTR_SSL_CA => '/ca.pem', + $this->attribute('INIT_COMMAND') => 'SET wait_timeout = 28800', + $this->attribute('SSL_CA') => '/ca.pem', ], ]); $this->database->initialize($this->options([ - 'dbdriveroptions' => [self::ATTR_INIT_COMMAND => 'SET wait_timeout = 28800'], + 'dbdriveroptions' => [$this->attribute('INIT_COMMAND') => 'SET wait_timeout = 28800'], 'dbsslca' => '/ca.pem', ])); } From 8b21dd77e1e2c4efcbccad28141af214a81ca576 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Wed, 5 Aug 2026 23:44:38 +0200 Subject: [PATCH 3/5] feat(core): add support for encrypted db connection in webinstaller Signed-off-by: Ferdinand Thiessen --- core/Controller/SetupController.php | 6 ++ core/src/install.ts | 16 +++++ core/src/views/Setup.spec.ts | 93 +++++++++++++++++++++++++++++ core/src/views/Setup.vue | 87 +++++++++++++++++++++++++++ 4 files changed, 202 insertions(+) diff --git a/core/Controller/SetupController.php b/core/Controller/SetupController.php index 1ae5849a13a43..a1e0ef55b3baf 100644 --- a/core/Controller/SetupController.php +++ b/core/Controller/SetupController.php @@ -81,6 +81,12 @@ public function display(array $post): void { 'dbtablespace' => '', 'dbhost' => 'localhost', 'dbtype' => '', + 'dbsslmode' => '', + 'dbsslca' => '', + 'dbsslcert' => '', + 'dbsslkey' => '', + 'dbsslcrl' => '', + 'dbsslnoverify' => false, 'hasAutoconfig' => false, 'serverRoot' => \OC::$SERVERROOT, 'version' => implode('.', $this->serverVersion->getVersion()), diff --git a/core/src/install.ts b/core/src/install.ts index 166a13d6df22f..79202a394c736 100644 --- a/core/src/install.ts +++ b/core/src/install.ts @@ -24,6 +24,22 @@ export type SetupConfig = { dbhost: string dbtype: DbType | '' + /** Encryption mode of the connection, pgsql only */ + dbsslmode: string + /** Path to the CA certificate the database server is verified against */ + dbsslca: string + /** Path to the client certificate used to authenticate against the database */ + dbsslcert: string + /** Path to the private key of the client certificate */ + dbsslkey: string + /** Path to the certificate revocation list, pgsql only */ + dbsslcrl: string + /** + * Skip verifying that the server certificate matches the host, mysql only. + * A string when reflected back from a submitted form, as checkboxes are submitted by value. + */ + dbsslnoverify: boolean | string + databases: Partial> hasAutoconfig: boolean diff --git a/core/src/views/Setup.spec.ts b/core/src/views/Setup.spec.ts index 2db6607a51b66..30a3e1628ccf0 100644 --- a/core/src/views/Setup.spec.ts +++ b/core/src/views/Setup.spec.ts @@ -20,6 +20,12 @@ const defaultConfig = Object.freeze({ dbtablespace: '', dbhost: '', dbtype: '', + dbsslmode: '', + dbsslca: '', + dbsslcert: '', + dbsslkey: '', + dbsslcrl: '', + dbsslnoverify: false, databases: { sqlite: 'SQLite', mysql: 'MySQL/MariaDB', @@ -155,6 +161,93 @@ describe('Default setup page', () => { }) }) +describe('Encrypted database connection', () => { + beforeEach(cleanup) + beforeEach(() => { + removeInitialState() + mockInitialState('core', 'links', links) + }) + + it.each(['sqlite', 'oci'])('Is not offered for %s', async (dbtype) => { + mockInitialState('core', 'config', { + ...defaultConfig, + dbtype, + databases: { sqlite: 'SQLite', mysql: 'MySQL/MariaDB', pgsql: 'PostgreSQL', oci: 'Oracle' }, + } as SetupConfig) + const component = render(SetupView) + + await expect(component.findByText('Encrypted database connection', { selector: 'summary' })).rejects.toThrow() + }) + + it('Offers the PDO options for mysql', async () => { + mockInitialState('core', 'config', { ...defaultConfig, dbtype: 'mysql' } as SetupConfig) + const component = render(SetupView) + + await expect(component.findByText('Encrypted database connection', { selector: 'summary' })).resolves.not.toThrow() + await expect(component.findByRole('textbox', { name: /CA certificate path/ })).resolves.not.toThrow() + await expect(component.findByRole('textbox', { name: /Client certificate path/ })).resolves.not.toThrow() + await expect(component.findByRole('textbox', { name: /Client certificate key path/ })).resolves.not.toThrow() + await expect(component.findByRole('checkbox', { name: /Do not verify that the server certificate/ })).resolves.not.toThrow() + + // Both are PostgreSQL specific + await expect(component.findByRole('textbox', { name: /Encryption mode/ })).rejects.toThrow() + await expect(component.findByRole('textbox', { name: /Certificate revocation list path/ })).rejects.toThrow() + }) + + it('Submits the no-verify checkbox by value', async () => { + mockInitialState('core', 'config', { ...defaultConfig, dbtype: 'mysql' } as SetupConfig) + const component = render(SetupView) + + // The form is submitted natively, so the checkbox needs a name and a value + const checkbox = await component.findByRole('checkbox', { name: /Do not verify that the server certificate/ }) as HTMLInputElement + expect(checkbox.name).toBe('dbsslnoverify') + expect(checkbox.value).toBe('1') + expect(checkbox.checked).toBe(false) + + await fireEvent.click(checkbox) + expect((component.getByRole('checkbox', { name: /Do not verify that the server certificate/ }) as HTMLInputElement).checked).toBe(true) + }) + + it('Offers the libpq parameters for pgsql', async () => { + mockInitialState('core', 'config', { ...defaultConfig, dbtype: 'pgsql' } as SetupConfig) + const component = render(SetupView) + + await expect(component.findByRole('textbox', { name: /Encryption mode/ })).resolves.not.toThrow() + await expect(component.findByRole('textbox', { name: /CA certificate path/ })).resolves.not.toThrow() + await expect(component.findByRole('textbox', { name: /Client certificate path/ })).resolves.not.toThrow() + await expect(component.findByRole('textbox', { name: /Client certificate key path/ })).resolves.not.toThrow() + await expect(component.findByRole('textbox', { name: /Certificate revocation list path/ })).resolves.not.toThrow() + + // MySQL specific + await expect(component.findByRole('checkbox', { name: /Do not verify that the server certificate/ })).rejects.toThrow() + }) + + it('Renders the submitted values on error', async () => { + mockInitialState('core', 'config', { + ...defaultConfig, + dbtype: 'pgsql', + dbsslmode: 'verify-full', + dbsslca: '/ca.pem', + } as SetupConfig) + const component = render(SetupView) + + expect((await component.findByRole('textbox', { name: /Encryption mode/ }) as HTMLInputElement).value).toBe('verify-full') + expect((await component.findByRole('textbox', { name: /CA certificate path/ }) as HTMLInputElement).value).toBe('/ca.pem') + }) + + it('Renders the submitted checkbox value on error', async () => { + mockInitialState('core', 'config', { + ...defaultConfig, + dbtype: 'mysql', + // Checkboxes are submitted by value, so the reflected value is a string + dbsslnoverify: '1', + } as SetupConfig) + const component = render(SetupView) + + expect((await component.findByRole('checkbox', { name: /Do not verify that the server certificate/ }) as HTMLInputElement).checked).toBe(true) + }) +}) + describe('Setup page with errors and warning', () => { beforeEach(cleanup) beforeEach(() => { diff --git a/core/src/views/Setup.vue b/core/src/views/Setup.vue index 61034cb9919db..185ae1e25ff63 100644 --- a/core/src/views/Setup.vue +++ b/core/src/views/Setup.vue @@ -186,6 +186,70 @@ name="dbhost" spellcheck="false" /> + + +
+ {{ t('core', 'Encrypted database connection') }} + +
+ + {{ t('core', 'Encrypted database connection') }} + + + + + + + + + + + + + + {{ t('core', 'Do not verify that the server certificate matches the database host') }} + +
+
@@ -324,6 +388,29 @@ export default defineComponent({ return 'success' }, + /** + * Only MySQL/MariaDB and PostgreSQL can be configured to use an encrypted + * connection through the installer, see OC\Setup\AbstractDatabase. + */ + supportsEncryptedConnection(): boolean { + return this.config?.dbtype === 'mysql' || this.config?.dbtype === 'pgsql' + }, + + /** + * The form is submitted natively, so the checkbox needs a `name` to be part of + * the request - which NcCheckboxRadioSwitch only supports for groups of + * checkboxes, meaning the model has to be the list of the checked values. + * The value is submitted as a string and reflected back on validation errors. + */ + dbsslnoverify: { + get(): string[] { + return this.config?.dbsslnoverify ? ['1'] : [] + }, + set(checked: string[]) { + this.config.dbsslnoverify = checked.includes('1') + }, + }, + firstAndOnlyDatabase(): string | null { const dbNames = Object.values(this.config?.databases || {}) if (dbNames.length === 1) { From 12e04992bee9c7b0f8123015cefa0af889efe837 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Thu, 20 Aug 2026 14:46:58 +0200 Subject: [PATCH 4/5] chore: align code style with ESLint rules Signed-off-by: Ferdinand Thiessen --- core/src/install.ts | 4 ++-- core/src/views/{Setup.spec.ts => WebInstaller.spec.ts} | 2 +- core/src/views/{Setup.vue => WebInstaller.vue} | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) rename core/src/views/{Setup.spec.ts => WebInstaller.spec.ts} (99%) rename core/src/views/{Setup.vue => WebInstaller.vue} (99%) diff --git a/core/src/install.ts b/core/src/install.ts index 79202a394c736..50dfc22368a1d 100644 --- a/core/src/install.ts +++ b/core/src/install.ts @@ -4,7 +4,7 @@ */ import Vue from 'vue' -import Setup from './views/Setup.vue' +import WebInstaller from './views/WebInstaller.vue' type Error = { error: string @@ -55,5 +55,5 @@ export type SetupLinks = { adminDBConfiguration: string } -const SetupVue = Vue.extend(Setup) +const SetupVue = Vue.extend(WebInstaller) new SetupVue().$mount('#content') diff --git a/core/src/views/Setup.spec.ts b/core/src/views/WebInstaller.spec.ts similarity index 99% rename from core/src/views/Setup.spec.ts rename to core/src/views/WebInstaller.spec.ts index 30a3e1628ccf0..5efe00af2fd67 100644 --- a/core/src/views/Setup.spec.ts +++ b/core/src/views/WebInstaller.spec.ts @@ -7,7 +7,7 @@ import type { SetupConfig, SetupLinks } from '../install.ts' import { cleanup, findByRole, fireEvent, getAllByRole, getByRole, render } from '@testing-library/vue' import { beforeEach, describe, expect, it } from 'vitest' -import SetupView from './Setup.vue' +import SetupView from './WebInstaller.vue' import '../../css/guest.css' diff --git a/core/src/views/Setup.vue b/core/src/views/WebInstaller.vue similarity index 99% rename from core/src/views/Setup.vue rename to core/src/views/WebInstaller.vue index 185ae1e25ff63..70bc0e20a4cd1 100644 --- a/core/src/views/Setup.vue +++ b/core/src/views/WebInstaller.vue @@ -326,7 +326,7 @@ function checkPasswordEntropy(password: string = ''): PasswordStrength { } export default defineComponent({ - name: 'Setup', + name: 'WebInstaller', components: { IconArrowRight, @@ -406,6 +406,7 @@ export default defineComponent({ get(): string[] { return this.config?.dbsslnoverify ? ['1'] : [] }, + set(checked: string[]) { this.config.dbsslnoverify = checked.includes('1') }, From 2a9fdf1d751ba6c404e8a3b5eb02ad460184e920 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Thu, 20 Aug 2026 14:48:28 +0200 Subject: [PATCH 5/5] chore: compile assets Signed-off-by: Ferdinand Thiessen --- dist/core-install.js | 4 ++-- dist/core-install.js.map | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/core-install.js b/dist/core-install.js index 306ace6714a64..8e9f9fadcf1c4 100644 --- a/dist/core-install.js +++ b/dist/core-install.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e={85973(e,t,a){var n,o=a(85471),r=a(81222),s=a(53334),i=a(99418),c=a(74095),l=a(32073),d=a(88289),u=a(48240),f=a(16044),p=a(82182),m=a(71164);function b(e=""){const t=new Set(e),a=parseInt(Math.log2(Math.pow(parseInt(t.size.toString()),e.length)).toFixed(2));return a<16?n.VeryWeak:a<31?n.Weak:a<46?n.Moderate:a<61?n.Strong:a<76?n.VeryStrong:n.ExtremelyStrong}!function(e){e[e.VeryWeak=0]="VeryWeak",e[e.Weak=1]="Weak",e[e.Moderate=2]="Moderate",e[e.Strong=3]="Strong",e[e.VeryStrong=4]="VeryStrong",e[e.ExtremelyStrong=5]="ExtremelyStrong"}(n||(n={}));const g=(0,o.pM)({name:"Setup",components:{IconArrowRight:m.A,NcButton:c.A,NcCheckboxRadioSwitch:l.A,NcLoadingIcon:d.A,NcNoteCard:u.A,NcPasswordField:f.A,NcTextField:p.A},setup:()=>({t:s.t}),data:()=>({config:{},links:{},isValidAutoconfig:!1,loading:!1}),computed:{passwordHelperText(){if(""===this.config?.adminpass)return"";switch(b(this.config?.adminpass)){case n.VeryWeak:return(0,s.t)("core","Password is too weak");case n.Weak:return(0,s.t)("core","Password is weak");case n.Moderate:return(0,s.t)("core","Password is average");case n.Strong:return(0,s.t)("core","Password is strong");case n.VeryStrong:return(0,s.t)("core","Password is very strong");case n.ExtremelyStrong:return(0,s.t)("core","Password is extremely strong")}return(0,s.t)("core","Unknown password strength")},passwordHelperType(){return b(this.config?.adminpass)3?"vertical":"horizontal"},htaccessWarning(){const e=[(0,s.t)("core","Your data directory and files are probably accessible from the internet because the .htaccess file does not work."),(0,s.t)("core","For information how to properly configure your server, please {linkStart}see the documentation{linkEnd}",{linkStart:'',linkEnd:""},{escape:!1})].join("
");return i.A.sanitize(e)},errors(){return(this.config?.errors||[]).map(e=>"string"==typeof e?{heading:"",message:e}:""===e.hint?{heading:"",message:e.error}:{heading:e.error,message:e.hint})}},beforeMount(){this.config=(0,r.C)("core","config"),this.links=(0,r.C)("core","links")},mounted(){if(""===this.config.dbtype&&(this.config.dbtype=Object.keys(this.config.databases).at(0)),this.config.hasAutoconfig){const e=this.$refs.form;e.querySelectorAll('input[name="adminlogin"], input[name="adminpass"]').forEach(e=>{e.removeAttribute("required")}),e.checkValidity()&&0===this.config.errors.length?this.isValidAutoconfig=!0:this.isValidAutoconfig=!1,e.querySelectorAll('input[name="adminlogin"], input[name="adminpass"]').forEach(e=>{e.setAttribute("required","true")})}},methods:{async onSubmit(){this.loading=!0}}});var A=a(85072),h=a.n(A),v=a(97825),y=a.n(v),_=a(77659),C=a.n(_),k=a(55056),x=a.n(k),w=a(10540),S=a.n(w),N=a(41113),D=a.n(N),O=a(85325),P={};P.styleTagTransform=D(),P.setAttributes=x(),P.insert=C().bind(null,"head"),P.domAPI=y(),P.insertStyleElement=S(),h()(O.A,P),O.A&&O.A.locals&&O.A.locals;const T=(0,a(14486).A)(g,function(){var e=this,t=e._self._c;return e._self._setupProxy,t("form",{ref:"form",staticClass:"setup-form",class:{"setup-form--loading":e.loading},attrs:{action:"","data-cy-setup-form":"",method:"POST"},on:{submit:e.onSubmit}},[e.config.hasAutoconfig?t("NcNoteCard",{attrs:{heading:e.t("core","Autoconfig file detected"),"data-cy-setup-form-note":"autoconfig",type:"success"}},[e._v("\n\t\t"+e._s(e.t("core","The setup form below is pre-filled with the values from the config file."))+"\n\t")]):e._e(),e._v(" "),!1===e.config.htaccessWorking?t("NcNoteCard",{attrs:{heading:e.t("core","Security warning"),"data-cy-setup-form-note":"htaccess",type:"warning"}},[t("p",{domProps:{innerHTML:e._s(e.htaccessWarning)}})]):e._e(),e._v(" "),e._l(e.errors,function(a,n){return t("NcNoteCard",{key:n,attrs:{heading:a.heading,"data-cy-setup-form-note":"error",type:"error"}},[e._v("\n\t\t"+e._s(a.message)+"\n\t")])}),e._v(" "),t("fieldset",{staticClass:"setup-form__administration"},[t("legend",[e._v(e._s(e.t("core","Create administration account")))]),e._v(" "),t("NcTextField",{attrs:{label:e.t("core","Administration account name"),"data-cy-setup-form-field":"adminlogin",name:"adminlogin",required:""},model:{value:e.config.adminlogin,callback:function(t){e.$set(e.config,"adminlogin",t)},expression:"config.adminlogin"}}),e._v(" "),t("NcPasswordField",{attrs:{label:e.t("core","Administration account password"),"data-cy-setup-form-field":"adminpass",name:"adminpass",required:""},model:{value:e.config.adminpass,callback:function(t){e.$set(e.config,"adminpass",t)},expression:"config.adminpass"}}),e._v(" "),t("NcNoteCard",{directives:[{name:"show",rawName:"v-show",value:""!==e.config.adminpass,expression:"config.adminpass !== ''"}],attrs:{type:e.passwordHelperType}},[e._v("\n\t\t\t"+e._s(e.passwordHelperText)+"\n\t\t")])],1),e._v(" "),t("details",{attrs:{open:!e.isValidAutoconfig,"data-cy-setup-form-advanced-config":""}},[t("summary",[e._v(e._s(e.t("core","Storage & database")))]),e._v(" "),t("fieldset",{staticClass:"setup-form__data-folder"},[t("NcTextField",{attrs:{label:e.t("core","Data folder"),placeholder:e.config.serverRoot+"/data",required:"",autocomplete:"off",autocapitalize:"none","data-cy-setup-form-field":"directory",name:"directory",spellcheck:"false"},model:{value:e.config.directory,callback:function(t){e.$set(e.config,"directory",t)},expression:"config.directory"}})],1),e._v(" "),t("fieldset",{staticClass:"setup-form__database"},[t("legend",[e._v(e._s(e.t("core","Database configuration")))]),e._v(" "),t("fieldset",{staticClass:"setup-form__database-type"},[t("legend",{staticClass:"hidden-visually"},[e._v("\n\t\t\t\t\t"+e._s(e.t("core","Database type"))+"\n\t\t\t\t")]),e._v(" "),t("p",{directives:[{name:"show",rawName:"v-show",value:!e.firstAndOnlyDatabase,expression:"!firstAndOnlyDatabase"}],staticClass:"setup-form__database-type-select",class:`setup-form__database-type-select--${e.DBTypeGroupDirection}`},e._l(e.config.databases,function(a,n){return t("NcCheckboxRadioSwitch",{key:n,attrs:{"button-variant":!0,"data-cy-setup-form-field":`dbtype-${n}`,value:n,"button-variant-grouped":e.DBTypeGroupDirection,name:"dbtype",type:"radio"},model:{value:e.config.dbtype,callback:function(t){e.$set(e.config,"dbtype",t)},expression:"config.dbtype"}},[e._v("\n\t\t\t\t\t\t"+e._s(a)+"\n\t\t\t\t\t")])}),1),e._v(" "),e.firstAndOnlyDatabase?t("NcNoteCard",{attrs:{"data-cy-setup-form-db-note":"single-db",type:"warning"}},[e._v("\n\t\t\t\t\t"+e._s(e.t("core","Only {firstAndOnlyDatabase} is available.",{firstAndOnlyDatabase:e.firstAndOnlyDatabase}))),t("br"),e._v("\n\t\t\t\t\t"+e._s(e.t("core","Install and activate additional PHP modules to choose other database types."))),t("br"),e._v(" "),t("a",{attrs:{href:e.links.adminSourceInstall,target:"_blank",rel:"noreferrer noopener"}},[e._v("\n\t\t\t\t\t\t"+e._s(e.t("core","For more details check out the documentation."))+" ↗\n\t\t\t\t\t")])]):e._e(),e._v(" "),"sqlite"===e.config.dbtype?t("NcNoteCard",{attrs:{heading:e.t("core","Performance warning"),"data-cy-setup-form-db-note":"sqlite",type:"warning"}},[e._v("\n\t\t\t\t\t"+e._s(e.t("core","You chose SQLite as database."))),t("br"),e._v("\n\t\t\t\t\t"+e._s(e.t("core","SQLite should only be used for minimal and development instances. For production we recommend a different database backend."))),t("br"),e._v("\n\t\t\t\t\t"+e._s(e.t("core","If you use clients for file syncing, the use of SQLite is highly discouraged."))+"\n\t\t\t\t")]):e._e()],1),e._v(" "),"sqlite"!==e.config.dbtype?t("fieldset",[t("legend",{staticClass:"hidden-visually"},[e._v("\n\t\t\t\t\t"+e._s(e.t("core","Database connection"))+"\n\t\t\t\t")]),e._v(" "),t("NcTextField",{attrs:{label:e.t("core","Database user"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbuser",name:"dbuser",spellcheck:"false",required:""},model:{value:e.config.dbuser,callback:function(t){e.$set(e.config,"dbuser",t)},expression:"config.dbuser"}}),e._v(" "),t("NcPasswordField",{attrs:{label:e.t("core","Database password"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbpass",name:"dbpass",spellcheck:"false",required:""},model:{value:e.config.dbpass,callback:function(t){e.$set(e.config,"dbpass",t)},expression:"config.dbpass"}}),e._v(" "),t("NcTextField",{attrs:{label:e.t("core","Database name"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbname",name:"dbname",pattern:"[0-9a-zA-Z\\$_\\-]+",spellcheck:"false",required:""},model:{value:e.config.dbname,callback:function(t){e.$set(e.config,"dbname",t)},expression:"config.dbname"}}),e._v(" "),"oci"===e.config.dbtype?t("NcTextField",{attrs:{label:e.t("core","Database tablespace"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbtablespace",name:"dbtablespace",spellcheck:"false"},model:{value:e.config.dbtablespace,callback:function(t){e.$set(e.config,"dbtablespace",t)},expression:"config.dbtablespace"}}):e._e(),e._v(" "),t("NcTextField",{attrs:{"helper-text":e.t("core","Please specify the port number along with the host name (e.g., localhost:5432)."),label:e.t("core","Database host"),placeholder:e.t("core","localhost"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbhost",name:"dbhost",spellcheck:"false"},model:{value:e.config.dbhost,callback:function(t){e.$set(e.config,"dbhost",t)},expression:"config.dbhost"}})],1):e._e()])]),e._v(" "),t("NcButton",{staticClass:"setup-form__button",class:{"setup-form__button--loading":e.loading},attrs:{disabled:e.loading,loading:e.loading,wide:!0,alignment:"center-reverse","data-cy-setup-form-submit":"",type:"submit",variant:"primary"},scopedSlots:e._u([{key:"icon",fn:function(){return[e.loading?t("NcLoadingIcon"):t("IconArrowRight")]},proxy:!0}])},[e._v("\n\t\t"+e._s(e.loading?e.t("core","Installing …"):e.t("core","Install"))+"\n\t")]),e._v(" "),t("NcNoteCard",{attrs:{"data-cy-setup-form-note":"help",type:"info"}},[e._v("\n\t\t"+e._s(e.t("core","Need help?"))+"\n\t\t"),t("a",{attrs:{target:"_blank",rel:"noreferrer noopener",href:e.links.adminInstall}},[e._v(e._s(e.t("core","See the documentation"))+" ↗")])])],2)},[],!1,null,null,null).exports;(new(o.Ay.extend(T))).$mount("#content")},85325(e,t,a){var n=a(71354),o=a.n(n),r=a(76314),s=a.n(r)()(o());s.push([e.id,"form{padding:calc(3*var(--default-grid-baseline));color:var(--color-main-text);border-radius:var(--border-radius-container);background-color:var(--color-main-background-blur);box-shadow:0 0 10px var(--color-box-shadow);-webkit-backdrop-filter:var(--filter-background-blur);backdrop-filter:var(--filter-background-blur);max-width:300px;margin-bottom:30px}form>fieldset:first-child,form>.notecard:first-child{margin-top:0}form>.notecard:last-child{margin-bottom:0}form fieldset,form details{margin-block:1rem}form .setup-form__button:not(.setup-form__button--loading) .material-design-icon{transition:all linear var(--animation-quick)}form .setup-form__button:not(.setup-form__button--loading):hover .material-design-icon{transform:translateX(0.2em)}form .setup-form__database-type-select{display:flex}form .setup-form__database-type-select--vertical{flex-direction:column}code{background-color:var(--color-background-dark);margin-top:1rem;padding:0 .3em;border-radius:var(--border-radius)}.input-field{margin-block-start:1rem !important}.notecard__heading{font-size:inherit !important}","",{version:3,sources:["webpack://./core/src/views/Setup.vue"],names:[],mappings:"AACA,KACC,4CAAA,CACA,4BAAA,CACA,4CAAA,CACA,kDAAA,CACA,2CAAA,CACA,qDAAA,CACA,6CAAA,CAEA,eAAA,CACA,kBAAA,CAEA,qDAEC,YAAA,CAGD,0BACC,eAAA,CAGD,2BAEC,iBAAA,CAIA,iFACC,4CAAA,CAGD,uFACC,2BAAA,CAKF,uCACC,YAAA,CACA,iDACC,qBAAA,CAMH,KACC,6CAAA,CACA,eAAA,CACA,cAAA,CACA,kCAAA,CAID,aACC,kCAAA,CAGD,mBACC,4BAAA",sourcesContent:["\nform {\n\tpadding: calc(3 * var(--default-grid-baseline));\n\tcolor: var(--color-main-text);\n\tborder-radius: var(--border-radius-container);\n\tbackground-color: var(--color-main-background-blur);\n\tbox-shadow: 0 0 10px var(--color-box-shadow);\n\t-webkit-backdrop-filter: var(--filter-background-blur);\n\tbackdrop-filter: var(--filter-background-blur);\n\n\tmax-width: 300px;\n\tmargin-bottom: 30px;\n\n\t> fieldset:first-child,\n\t> .notecard:first-child {\n\t\tmargin-top: 0;\n\t}\n\n\t> .notecard:last-child {\n\t\tmargin-bottom: 0;\n\t}\n\n\tfieldset,\n\tdetails {\n\t\tmargin-block: 1rem;\n\t}\n\n\t.setup-form__button:not(.setup-form__button--loading) {\n\t\t.material-design-icon {\n\t\t\ttransition: all linear var(--animation-quick);\n\t\t}\n\n\t\t&:hover .material-design-icon {\n\t\t\ttransform: translateX(0.2em);\n\t\t}\n\t}\n\n\t// Db select required styling\n\t.setup-form__database-type-select {\n\t\tdisplay: flex;\n\t\t&--vertical {\n\t\t\tflex-direction: column;\n\t\t}\n\t}\n\n}\n\ncode {\n\tbackground-color: var(--color-background-dark);\n\tmargin-top: 1rem;\n\tpadding: 0 0.3em;\n\tborder-radius: var(--border-radius);\n}\n\n// Various overrides\n.input-field {\n\tmargin-block-start: 1rem !important;\n}\n\n.notecard__heading {\n\tfont-size: inherit !important;\n}\n"],sourceRoot:""}]);const i=s;a.d(t,["A",0,i])}};const t={};function a(n){const o=t[n];if(void 0!==o)return o.exports;const r=t[n]={id:n,loaded:!1,exports:{}};return e[n].call(r.exports,r,r.exports,a),r.loaded=!0,r.exports}a.m=e,(()=>{const e=[];a.O=(t,n,o,r)=>{if(n){r=r||0;for(var s=e.length;s>0&&e[s-1][2]>r;s--)e[s]=e[s-1];return void(e[s]=[n,o,r])}let i=1/0;for(s=0;s=r)&&Object.keys(a.O).every(e=>a.O[e](n[c]))?n.splice(c--,1):(l=!1,r{const t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{if(Array.isArray(t))for(var n=0;nPromise.resolve(),a.o=(e,t)=>Object.hasOwn(e,t),a.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),a.j=820,a.dn=e=>{var t=Object.getOwnPropertyDescriptor(e,"name");(!t||!t.writable&&t.configurable)&&Object.defineProperty(e,"name",{value:"default",configurable:!0})},a.cjs=e=>{const t={exports:{}};return e.call(t.exports,t,t.exports),t.exports},(()=>{a.b="undefined"!=typeof document&&document.baseURI||self.location.href;const e={820:0};a.O.j=t=>0===e[t];const t=(t,n)=>{let[o,r,s]=n;var i,c,l=0;if(o.some(t=>0!==e[t])){for(i in r)a.o(r,i)&&(a.m[i]=r[i]);if(s)var d=s(a)}for(t&&t(n);la(85973));n=a.O(n)})(); -//# sourceMappingURL=core-install.js.map?v=7390047fee1f54946ae1 \ No newline at end of file +(()=>{"use strict";var e={42051(e,t,a){var o,n=a(85471),r=a(81222),s=a(53334),i=a(99418),c=a(74095),l=a(32073),d=a(88289),f=a(48240),u=a(16044),p=a(82182),b=a(71164);function m(e=""){const t=new Set(e),a=parseInt(Math.log2(Math.pow(parseInt(t.size.toString()),e.length)).toFixed(2));return a<16?o.VeryWeak:a<31?o.Weak:a<46?o.Moderate:a<61?o.Strong:a<76?o.VeryStrong:o.ExtremelyStrong}!function(e){e[e.VeryWeak=0]="VeryWeak",e[e.Weak=1]="Weak",e[e.Moderate=2]="Moderate",e[e.Strong=3]="Strong",e[e.VeryStrong=4]="VeryStrong",e[e.ExtremelyStrong=5]="ExtremelyStrong"}(o||(o={}));const g=(0,n.pM)({name:"WebInstaller",components:{IconArrowRight:b.A,NcButton:c.A,NcCheckboxRadioSwitch:l.A,NcLoadingIcon:d.A,NcNoteCard:f.A,NcPasswordField:u.A,NcTextField:p.A},setup:()=>({t:s.t}),data:()=>({config:{},links:{},isValidAutoconfig:!1,loading:!1}),computed:{passwordHelperText(){if(""===this.config?.adminpass)return"";switch(m(this.config?.adminpass)){case o.VeryWeak:return(0,s.t)("core","Password is too weak");case o.Weak:return(0,s.t)("core","Password is weak");case o.Moderate:return(0,s.t)("core","Password is average");case o.Strong:return(0,s.t)("core","Password is strong");case o.VeryStrong:return(0,s.t)("core","Password is very strong");case o.ExtremelyStrong:return(0,s.t)("core","Password is extremely strong")}return(0,s.t)("core","Unknown password strength")},passwordHelperType(){return m(this.config?.adminpass)3?"vertical":"horizontal"},htaccessWarning(){const e=[(0,s.t)("core","Your data directory and files are probably accessible from the internet because the .htaccess file does not work."),(0,s.t)("core","For information how to properly configure your server, please {linkStart}see the documentation{linkEnd}",{linkStart:'',linkEnd:""},{escape:!1})].join("
");return i.A.sanitize(e)},errors(){return(this.config?.errors||[]).map(e=>"string"==typeof e?{heading:"",message:e}:""===e.hint?{heading:"",message:e.error}:{heading:e.error,message:e.hint})}},beforeMount(){this.config=(0,r.C)("core","config"),this.links=(0,r.C)("core","links")},mounted(){if(""===this.config.dbtype&&(this.config.dbtype=Object.keys(this.config.databases).at(0)),this.config.hasAutoconfig){const e=this.$refs.form;e.querySelectorAll('input[name="adminlogin"], input[name="adminpass"]').forEach(e=>{e.removeAttribute("required")}),e.checkValidity()&&0===this.config.errors.length?this.isValidAutoconfig=!0:this.isValidAutoconfig=!1,e.querySelectorAll('input[name="adminlogin"], input[name="adminpass"]').forEach(e=>{e.setAttribute("required","true")})}},methods:{async onSubmit(){this.loading=!0}}});var h=a(85072),v=a.n(h),A=a(97825),y=a.n(A),_=a(77659),k=a.n(_),C=a(55056),x=a.n(C),w=a(10540),N=a.n(w),S=a(41113),D=a.n(S),O=a(7725),T={};T.styleTagTransform=D(),T.setAttributes=x(),T.insert=k().bind(null,"head"),T.domAPI=y(),T.insertStyleElement=N(),v()(O.A,T),O.A&&O.A.locals&&O.A.locals;const q=(0,a(14486).A)(g,function(){var e=this,t=e._self._c;return e._self._setupProxy,t("form",{ref:"form",staticClass:"setup-form",class:{"setup-form--loading":e.loading},attrs:{action:"","data-cy-setup-form":"",method:"POST"},on:{submit:e.onSubmit}},[e.config.hasAutoconfig?t("NcNoteCard",{attrs:{heading:e.t("core","Autoconfig file detected"),"data-cy-setup-form-note":"autoconfig",type:"success"}},[e._v("\n\t\t"+e._s(e.t("core","The setup form below is pre-filled with the values from the config file."))+"\n\t")]):e._e(),e._v(" "),!1===e.config.htaccessWorking?t("NcNoteCard",{attrs:{heading:e.t("core","Security warning"),"data-cy-setup-form-note":"htaccess",type:"warning"}},[t("p",{domProps:{innerHTML:e._s(e.htaccessWarning)}})]):e._e(),e._v(" "),e._l(e.errors,function(a,o){return t("NcNoteCard",{key:o,attrs:{heading:a.heading,"data-cy-setup-form-note":"error",type:"error"}},[e._v("\n\t\t"+e._s(a.message)+"\n\t")])}),e._v(" "),t("fieldset",{staticClass:"setup-form__administration"},[t("legend",[e._v(e._s(e.t("core","Create administration account")))]),e._v(" "),t("NcTextField",{attrs:{label:e.t("core","Administration account name"),"data-cy-setup-form-field":"adminlogin",name:"adminlogin",required:""},model:{value:e.config.adminlogin,callback:function(t){e.$set(e.config,"adminlogin",t)},expression:"config.adminlogin"}}),e._v(" "),t("NcPasswordField",{attrs:{label:e.t("core","Administration account password"),"data-cy-setup-form-field":"adminpass",name:"adminpass",required:""},model:{value:e.config.adminpass,callback:function(t){e.$set(e.config,"adminpass",t)},expression:"config.adminpass"}}),e._v(" "),t("NcNoteCard",{directives:[{name:"show",rawName:"v-show",value:""!==e.config.adminpass,expression:"config.adminpass !== ''"}],attrs:{type:e.passwordHelperType}},[e._v("\n\t\t\t"+e._s(e.passwordHelperText)+"\n\t\t")])],1),e._v(" "),t("details",{attrs:{open:!e.isValidAutoconfig,"data-cy-setup-form-advanced-config":""}},[t("summary",[e._v(e._s(e.t("core","Storage & database")))]),e._v(" "),t("fieldset",{staticClass:"setup-form__data-folder"},[t("NcTextField",{attrs:{label:e.t("core","Data folder"),placeholder:e.config.serverRoot+"/data",required:"",autocomplete:"off",autocapitalize:"none","data-cy-setup-form-field":"directory",name:"directory",spellcheck:"false"},model:{value:e.config.directory,callback:function(t){e.$set(e.config,"directory",t)},expression:"config.directory"}})],1),e._v(" "),t("fieldset",{staticClass:"setup-form__database"},[t("legend",[e._v(e._s(e.t("core","Database configuration")))]),e._v(" "),t("fieldset",{staticClass:"setup-form__database-type"},[t("legend",{staticClass:"hidden-visually"},[e._v("\n\t\t\t\t\t"+e._s(e.t("core","Database type"))+"\n\t\t\t\t")]),e._v(" "),t("p",{directives:[{name:"show",rawName:"v-show",value:!e.firstAndOnlyDatabase,expression:"!firstAndOnlyDatabase"}],staticClass:"setup-form__database-type-select",class:`setup-form__database-type-select--${e.DBTypeGroupDirection}`},e._l(e.config.databases,function(a,o){return t("NcCheckboxRadioSwitch",{key:o,attrs:{"button-variant":!0,"data-cy-setup-form-field":`dbtype-${o}`,value:o,"button-variant-grouped":e.DBTypeGroupDirection,name:"dbtype",type:"radio"},model:{value:e.config.dbtype,callback:function(t){e.$set(e.config,"dbtype",t)},expression:"config.dbtype"}},[e._v("\n\t\t\t\t\t\t"+e._s(a)+"\n\t\t\t\t\t")])}),1),e._v(" "),e.firstAndOnlyDatabase?t("NcNoteCard",{attrs:{"data-cy-setup-form-db-note":"single-db",type:"warning"}},[e._v("\n\t\t\t\t\t"+e._s(e.t("core","Only {firstAndOnlyDatabase} is available.",{firstAndOnlyDatabase:e.firstAndOnlyDatabase}))),t("br"),e._v("\n\t\t\t\t\t"+e._s(e.t("core","Install and activate additional PHP modules to choose other database types."))),t("br"),e._v(" "),t("a",{attrs:{href:e.links.adminSourceInstall,target:"_blank",rel:"noreferrer noopener"}},[e._v("\n\t\t\t\t\t\t"+e._s(e.t("core","For more details check out the documentation."))+" ↗\n\t\t\t\t\t")])]):e._e(),e._v(" "),"sqlite"===e.config.dbtype?t("NcNoteCard",{attrs:{heading:e.t("core","Performance warning"),"data-cy-setup-form-db-note":"sqlite",type:"warning"}},[e._v("\n\t\t\t\t\t"+e._s(e.t("core","You chose SQLite as database."))),t("br"),e._v("\n\t\t\t\t\t"+e._s(e.t("core","SQLite should only be used for minimal and development instances. For production we recommend a different database backend."))),t("br"),e._v("\n\t\t\t\t\t"+e._s(e.t("core","If you use clients for file syncing, the use of SQLite is highly discouraged."))+"\n\t\t\t\t")]):e._e()],1),e._v(" "),"sqlite"!==e.config.dbtype?t("fieldset",[t("legend",{staticClass:"hidden-visually"},[e._v("\n\t\t\t\t\t"+e._s(e.t("core","Database connection"))+"\n\t\t\t\t")]),e._v(" "),t("NcTextField",{attrs:{label:e.t("core","Database user"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbuser",name:"dbuser",spellcheck:"false",required:""},model:{value:e.config.dbuser,callback:function(t){e.$set(e.config,"dbuser",t)},expression:"config.dbuser"}}),e._v(" "),t("NcPasswordField",{attrs:{label:e.t("core","Database password"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbpass",name:"dbpass",spellcheck:"false",required:""},model:{value:e.config.dbpass,callback:function(t){e.$set(e.config,"dbpass",t)},expression:"config.dbpass"}}),e._v(" "),t("NcTextField",{attrs:{label:e.t("core","Database name"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbname",name:"dbname",pattern:"[0-9a-zA-Z\\$_\\-]+",spellcheck:"false",required:""},model:{value:e.config.dbname,callback:function(t){e.$set(e.config,"dbname",t)},expression:"config.dbname"}}),e._v(" "),"oci"===e.config.dbtype?t("NcTextField",{attrs:{label:e.t("core","Database tablespace"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbtablespace",name:"dbtablespace",spellcheck:"false"},model:{value:e.config.dbtablespace,callback:function(t){e.$set(e.config,"dbtablespace",t)},expression:"config.dbtablespace"}}):e._e(),e._v(" "),t("NcTextField",{attrs:{"helper-text":e.t("core","Please specify the port number along with the host name (e.g., localhost:5432)."),label:e.t("core","Database host"),placeholder:e.t("core","localhost"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbhost",name:"dbhost",spellcheck:"false"},model:{value:e.config.dbhost,callback:function(t){e.$set(e.config,"dbhost",t)},expression:"config.dbhost"}})],1):e._e(),e._v(" "),e.supportsEncryptedConnection?t("details",{attrs:{"data-cy-setup-form-database-encryption":""}},[t("summary",[e._v(e._s(e.t("core","Encrypted database connection")))]),e._v(" "),t("fieldset",[t("legend",{staticClass:"hidden-visually"},[e._v("\n\t\t\t\t\t\t"+e._s(e.t("core","Encrypted database connection"))+"\n\t\t\t\t\t")]),e._v(" "),"pgsql"===e.config.dbtype?t("NcTextField",{attrs:{"helper-text":e.t("core","Supported modes: disable, allow, prefer, require, verify-ca, verify-full."),label:e.t("core","Encryption mode"),autocapitalize:"none",autocomplete:"off",name:"dbsslmode",spellcheck:"false"},model:{value:e.config.dbsslmode,callback:function(t){e.$set(e.config,"dbsslmode",t)},expression:"config.dbsslmode"}}):e._e(),e._v(" "),t("NcTextField",{attrs:{"helper-text":e.t("core","Has to be readable by the web server."),label:e.t("core","CA certificate path"),autocapitalize:"none",autocomplete:"off",name:"dbsslca",spellcheck:"false"},model:{value:e.config.dbsslca,callback:function(t){e.$set(e.config,"dbsslca",t)},expression:"config.dbsslca"}}),e._v(" "),t("NcTextField",{attrs:{label:e.t("core","Client certificate path"),autocapitalize:"none",autocomplete:"off",name:"dbsslcert",spellcheck:"false"},model:{value:e.config.dbsslcert,callback:function(t){e.$set(e.config,"dbsslcert",t)},expression:"config.dbsslcert"}}),e._v(" "),t("NcTextField",{attrs:{label:e.t("core","Client certificate key path"),autocapitalize:"none",autocomplete:"off",name:"dbsslkey",spellcheck:"false"},model:{value:e.config.dbsslkey,callback:function(t){e.$set(e.config,"dbsslkey",t)},expression:"config.dbsslkey"}}),e._v(" "),"pgsql"===e.config.dbtype?t("NcTextField",{attrs:{label:e.t("core","Certificate revocation list path"),autocapitalize:"none",autocomplete:"off",name:"dbsslcrl",spellcheck:"false"},model:{value:e.config.dbsslcrl,callback:function(t){e.$set(e.config,"dbsslcrl",t)},expression:"config.dbsslcrl"}}):e._e(),e._v(" "),"mysql"===e.config.dbtype?t("NcCheckboxRadioSwitch",{attrs:{name:"dbsslnoverify",type:"checkbox",value:"1"},model:{value:e.dbsslnoverify,callback:function(t){e.dbsslnoverify=t},expression:"dbsslnoverify"}},[e._v("\n\t\t\t\t\t\t"+e._s(e.t("core","Do not verify that the server certificate matches the database host"))+"\n\t\t\t\t\t")]):e._e()],1)]):e._e()])]),e._v(" "),t("NcButton",{staticClass:"setup-form__button",class:{"setup-form__button--loading":e.loading},attrs:{disabled:e.loading,loading:e.loading,wide:!0,alignment:"center-reverse","data-cy-setup-form-submit":"",type:"submit",variant:"primary"},scopedSlots:e._u([{key:"icon",fn:function(){return[e.loading?t("NcLoadingIcon"):t("IconArrowRight")]},proxy:!0}])},[e._v("\n\t\t"+e._s(e.loading?e.t("core","Installing …"):e.t("core","Install"))+"\n\t")]),e._v(" "),t("NcNoteCard",{attrs:{"data-cy-setup-form-note":"help",type:"info"}},[e._v("\n\t\t"+e._s(e.t("core","Need help?"))+"\n\t\t"),t("a",{attrs:{target:"_blank",rel:"noreferrer noopener",href:e.links.adminInstall}},[e._v(e._s(e.t("core","See the documentation"))+" ↗")])])],2)},[],!1,null,null,null).exports;(new(n.Ay.extend(q))).$mount("#content")},7725(e,t,a){var o=a(71354),n=a.n(o),r=a(76314),s=a.n(r)()(n());s.push([e.id,"form{padding:calc(3*var(--default-grid-baseline));color:var(--color-main-text);border-radius:var(--border-radius-container);background-color:var(--color-main-background-blur);box-shadow:0 0 10px var(--color-box-shadow);-webkit-backdrop-filter:var(--filter-background-blur);backdrop-filter:var(--filter-background-blur);max-width:300px;margin-bottom:30px}form>fieldset:first-child,form>.notecard:first-child{margin-top:0}form>.notecard:last-child{margin-bottom:0}form fieldset,form details{margin-block:1rem}form .setup-form__button:not(.setup-form__button--loading) .material-design-icon{transition:all linear var(--animation-quick)}form .setup-form__button:not(.setup-form__button--loading):hover .material-design-icon{transform:translateX(0.2em)}form .setup-form__database-type-select{display:flex}form .setup-form__database-type-select--vertical{flex-direction:column}code{background-color:var(--color-background-dark);margin-top:1rem;padding:0 .3em;border-radius:var(--border-radius)}.input-field{margin-block-start:1rem !important}.notecard__heading{font-size:inherit !important}","",{version:3,sources:["webpack://./core/src/views/WebInstaller.vue"],names:[],mappings:"AACA,KACC,4CAAA,CACA,4BAAA,CACA,4CAAA,CACA,kDAAA,CACA,2CAAA,CACA,qDAAA,CACA,6CAAA,CAEA,eAAA,CACA,kBAAA,CAEA,qDAEC,YAAA,CAGD,0BACC,eAAA,CAGD,2BAEC,iBAAA,CAIA,iFACC,4CAAA,CAGD,uFACC,2BAAA,CAKF,uCACC,YAAA,CACA,iDACC,qBAAA,CAMH,KACC,6CAAA,CACA,eAAA,CACA,cAAA,CACA,kCAAA,CAID,aACC,kCAAA,CAGD,mBACC,4BAAA",sourcesContent:["\nform {\n\tpadding: calc(3 * var(--default-grid-baseline));\n\tcolor: var(--color-main-text);\n\tborder-radius: var(--border-radius-container);\n\tbackground-color: var(--color-main-background-blur);\n\tbox-shadow: 0 0 10px var(--color-box-shadow);\n\t-webkit-backdrop-filter: var(--filter-background-blur);\n\tbackdrop-filter: var(--filter-background-blur);\n\n\tmax-width: 300px;\n\tmargin-bottom: 30px;\n\n\t> fieldset:first-child,\n\t> .notecard:first-child {\n\t\tmargin-top: 0;\n\t}\n\n\t> .notecard:last-child {\n\t\tmargin-bottom: 0;\n\t}\n\n\tfieldset,\n\tdetails {\n\t\tmargin-block: 1rem;\n\t}\n\n\t.setup-form__button:not(.setup-form__button--loading) {\n\t\t.material-design-icon {\n\t\t\ttransition: all linear var(--animation-quick);\n\t\t}\n\n\t\t&:hover .material-design-icon {\n\t\t\ttransform: translateX(0.2em);\n\t\t}\n\t}\n\n\t// Db select required styling\n\t.setup-form__database-type-select {\n\t\tdisplay: flex;\n\t\t&--vertical {\n\t\t\tflex-direction: column;\n\t\t}\n\t}\n\n}\n\ncode {\n\tbackground-color: var(--color-background-dark);\n\tmargin-top: 1rem;\n\tpadding: 0 0.3em;\n\tborder-radius: var(--border-radius);\n}\n\n// Various overrides\n.input-field {\n\tmargin-block-start: 1rem !important;\n}\n\n.notecard__heading {\n\tfont-size: inherit !important;\n}\n"],sourceRoot:""}]);const i=s;a.d(t,["A",0,i])}};const t={};function a(o){const n=t[o];if(void 0!==n)return n.exports;const r=t[o]={id:o,loaded:!1,exports:{}};return e[o].call(r.exports,r,r.exports,a),r.loaded=!0,r.exports}a.m=e,(()=>{const e=[];a.O=(t,o,n,r)=>{if(o){r=r||0;for(var s=e.length;s>0&&e[s-1][2]>r;s--)e[s]=e[s-1];return void(e[s]=[o,n,r])}let i=1/0;for(s=0;s=r)&&Object.keys(a.O).every(e=>a.O[e](o[c]))?o.splice(c--,1):(l=!1,r{const t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{if(Array.isArray(t))for(var o=0;oPromise.resolve(),a.o=(e,t)=>Object.hasOwn(e,t),a.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),a.j=820,a.dn=e=>{var t=Object.getOwnPropertyDescriptor(e,"name");(!t||!t.writable&&t.configurable)&&Object.defineProperty(e,"name",{value:"default",configurable:!0})},a.cjs=e=>{const t={exports:{}};return e.call(t.exports,t,t.exports),t.exports},(()=>{a.b="undefined"!=typeof document&&document.baseURI||self.location.href;const e={820:0};a.O.j=t=>0===e[t];const t=(t,o)=>{let[n,r,s]=o;var i,c,l=0;if(n.some(t=>0!==e[t])){for(i in r)a.o(r,i)&&(a.m[i]=r[i]);if(s)var d=s(a)}for(t&&t(o);la(42051));o=a.O(o)})(); +//# sourceMappingURL=core-install.js.map?v=c64a6f8cd235e9ccd7ed \ No newline at end of file diff --git a/dist/core-install.js.map b/dist/core-install.js.map index 3d566bbd76e48..153fd90212bd9 100644 --- a/dist/core-install.js.map +++ b/dist/core-install.js.map @@ -1 +1 @@ -{"version":3,"file":"core-install.js?v=f0f94bab09a913f24074","mappings":"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","sources":["webpack:///nextcloud/core/src/views/Setup.vue","webpack:///nextcloud/core/src/views/Setup.vue?vue&type=script&lang=ts","webpack://nextcloud/./core/src/views/Setup.vue?b4e6","webpack://nextcloud/./core/src/views/Setup.vue?1b4a","webpack:///nextcloud/core/src/install.ts","webpack:///nextcloud/core/src/views/Setup.vue?vue&type=style&index=0&id=ae023172&prod&lang=scss","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/set anonymous default export name","webpack:///nextcloud/webpack/runtime/wrap commonjs module","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('form',{ref:\"form\",staticClass:\"setup-form\",class:{ 'setup-form--loading': _vm.loading },attrs:{\"action\":\"\",\"data-cy-setup-form\":\"\",\"method\":\"POST\"},on:{\"submit\":_vm.onSubmit}},[(_vm.config.hasAutoconfig)?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Autoconfig file detected'),\"data-cy-setup-form-note\":\"autoconfig\",\"type\":\"success\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'The setup form below is pre-filled with the values from the config file.'))+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.config.htaccessWorking === false)?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Security warning'),\"data-cy-setup-form-note\":\"htaccess\",\"type\":\"warning\"}},[_c('p',{domProps:{\"innerHTML\":_vm._s(_vm.htaccessWarning)}})]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.errors),function(error,index){return _c('NcNoteCard',{key:index,attrs:{\"heading\":error.heading,\"data-cy-setup-form-note\":\"error\",\"type\":\"error\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(error.message)+\"\\n\\t\")])}),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__administration\"},[_c('legend',[_vm._v(_vm._s(_vm.t('core', 'Create administration account')))]),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Administration account name'),\"data-cy-setup-form-field\":\"adminlogin\",\"name\":\"adminlogin\",\"required\":\"\"},model:{value:(_vm.config.adminlogin),callback:function ($$v) {_vm.$set(_vm.config, \"adminlogin\", $$v)},expression:\"config.adminlogin\"}}),_vm._v(\" \"),_c('NcPasswordField',{attrs:{\"label\":_vm.t('core', 'Administration account password'),\"data-cy-setup-form-field\":\"adminpass\",\"name\":\"adminpass\",\"required\":\"\"},model:{value:(_vm.config.adminpass),callback:function ($$v) {_vm.$set(_vm.config, \"adminpass\", $$v)},expression:\"config.adminpass\"}}),_vm._v(\" \"),_c('NcNoteCard',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.config.adminpass !== ''),expression:\"config.adminpass !== ''\"}],attrs:{\"type\":_vm.passwordHelperType}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.passwordHelperText)+\"\\n\\t\\t\")])],1),_vm._v(\" \"),_c('details',{attrs:{\"open\":!_vm.isValidAutoconfig,\"data-cy-setup-form-advanced-config\":\"\"}},[_c('summary',[_vm._v(_vm._s(_vm.t('core', 'Storage & database')))]),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__data-folder\"},[_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Data folder'),\"placeholder\":_vm.config.serverRoot + '/data',\"required\":\"\",\"autocomplete\":\"off\",\"autocapitalize\":\"none\",\"data-cy-setup-form-field\":\"directory\",\"name\":\"directory\",\"spellcheck\":\"false\"},model:{value:(_vm.config.directory),callback:function ($$v) {_vm.$set(_vm.config, \"directory\", $$v)},expression:\"config.directory\"}})],1),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__database\"},[_c('legend',[_vm._v(_vm._s(_vm.t('core', 'Database configuration')))]),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__database-type\"},[_c('legend',{staticClass:\"hidden-visually\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Database type'))+\"\\n\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('p',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.firstAndOnlyDatabase),expression:\"!firstAndOnlyDatabase\"}],staticClass:\"setup-form__database-type-select\",class:`setup-form__database-type-select--${_vm.DBTypeGroupDirection}`},_vm._l((_vm.config.databases),function(name,db){return _c('NcCheckboxRadioSwitch',{key:db,attrs:{\"button-variant\":true,\"data-cy-setup-form-field\":`dbtype-${db}`,\"value\":db,\"button-variant-grouped\":_vm.DBTypeGroupDirection,\"name\":\"dbtype\",\"type\":\"radio\"},model:{value:(_vm.config.dbtype),callback:function ($$v) {_vm.$set(_vm.config, \"dbtype\", $$v)},expression:\"config.dbtype\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(name)+\"\\n\\t\\t\\t\\t\\t\")])}),1),_vm._v(\" \"),(_vm.firstAndOnlyDatabase)?_c('NcNoteCard',{attrs:{\"data-cy-setup-form-db-note\":\"single-db\",\"type\":\"warning\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Only {firstAndOnlyDatabase} is available.', { firstAndOnlyDatabase: _vm.firstAndOnlyDatabase }))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Install and activate additional PHP modules to choose other database types.'))),_c('br'),_vm._v(\" \"),_c('a',{attrs:{\"href\":_vm.links.adminSourceInstall,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'For more details check out the documentation.'))+\" ↗\\n\\t\\t\\t\\t\\t\")])]):_vm._e(),_vm._v(\" \"),(_vm.config.dbtype === 'sqlite')?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Performance warning'),\"data-cy-setup-form-db-note\":\"sqlite\",\"type\":\"warning\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'You chose SQLite as database.'))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'SQLite should only be used for minimal and development instances. For production we recommend a different database backend.'))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'If you use clients for file syncing, the use of SQLite is highly discouraged.'))+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1),_vm._v(\" \"),(_vm.config.dbtype !== 'sqlite')?_c('fieldset',[_c('legend',{staticClass:\"hidden-visually\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Database connection'))+\"\\n\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database user'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbuser\",\"name\":\"dbuser\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbuser),callback:function ($$v) {_vm.$set(_vm.config, \"dbuser\", $$v)},expression:\"config.dbuser\"}}),_vm._v(\" \"),_c('NcPasswordField',{attrs:{\"label\":_vm.t('core', 'Database password'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbpass\",\"name\":\"dbpass\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbpass),callback:function ($$v) {_vm.$set(_vm.config, \"dbpass\", $$v)},expression:\"config.dbpass\"}}),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database name'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbname\",\"name\":\"dbname\",\"pattern\":\"[0-9a-zA-Z\\\\$_\\\\-]+\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbname),callback:function ($$v) {_vm.$set(_vm.config, \"dbname\", $$v)},expression:\"config.dbname\"}}),_vm._v(\" \"),(_vm.config.dbtype === 'oci')?_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database tablespace'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbtablespace\",\"name\":\"dbtablespace\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbtablespace),callback:function ($$v) {_vm.$set(_vm.config, \"dbtablespace\", $$v)},expression:\"config.dbtablespace\"}}):_vm._e(),_vm._v(\" \"),_c('NcTextField',{attrs:{\"helper-text\":_vm.t('core', 'Please specify the port number along with the host name (e.g., localhost:5432).'),\"label\":_vm.t('core', 'Database host'),\"placeholder\":_vm.t('core', 'localhost'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbhost\",\"name\":\"dbhost\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbhost),callback:function ($$v) {_vm.$set(_vm.config, \"dbhost\", $$v)},expression:\"config.dbhost\"}})],1):_vm._e()])]),_vm._v(\" \"),_c('NcButton',{staticClass:\"setup-form__button\",class:{ 'setup-form__button--loading': _vm.loading },attrs:{\"disabled\":_vm.loading,\"loading\":_vm.loading,\"wide\":true,\"alignment\":\"center-reverse\",\"data-cy-setup-form-submit\":\"\",\"type\":\"submit\",\"variant\":\"primary\"},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(_vm.loading)?_c('NcLoadingIcon'):_c('IconArrowRight')]},proxy:true}])},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.loading ? _vm.t('core', 'Installing …') : _vm.t('core', 'Install'))+\"\\n\\t\")]),_vm._v(\" \"),_c('NcNoteCard',{attrs:{\"data-cy-setup-form-note\":\"help\",\"type\":\"info\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'Need help?'))+\"\\n\\t\\t\"),_c('a',{attrs:{\"target\":\"_blank\",\"rel\":\"noreferrer noopener\",\"href\":_vm.links.adminInstall}},[_vm._v(_vm._s(_vm.t('core', 'See the documentation'))+\" ↗\")])])],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-6.use[1]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=script&lang=ts\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-6.use[1]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=script&lang=ts\"","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=style&index=0&id=ae023172&prod&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=style&index=0&id=ae023172&prod&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Setup.vue?vue&type=template&id=ae023172\"\nimport script from \"./Setup.vue?vue&type=script&lang=ts\"\nexport * from \"./Setup.vue?vue&type=script&lang=ts\"\nimport style0 from \"./Setup.vue?vue&type=style&index=0&id=ae023172&prod&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/**\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport Vue from 'vue';\nimport Setup from './views/Setup.vue';\nconst SetupVue = Vue.extend(Setup);\nnew SetupVue().$mount('#content');\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `form{padding:calc(3*var(--default-grid-baseline));color:var(--color-main-text);border-radius:var(--border-radius-container);background-color:var(--color-main-background-blur);box-shadow:0 0 10px var(--color-box-shadow);-webkit-backdrop-filter:var(--filter-background-blur);backdrop-filter:var(--filter-background-blur);max-width:300px;margin-bottom:30px}form>fieldset:first-child,form>.notecard:first-child{margin-top:0}form>.notecard:last-child{margin-bottom:0}form fieldset,form details{margin-block:1rem}form .setup-form__button:not(.setup-form__button--loading) .material-design-icon{transition:all linear var(--animation-quick)}form .setup-form__button:not(.setup-form__button--loading):hover .material-design-icon{transform:translateX(0.2em)}form .setup-form__database-type-select{display:flex}form .setup-form__database-type-select--vertical{flex-direction:column}code{background-color:var(--color-background-dark);margin-top:1rem;padding:0 .3em;border-radius:var(--border-radius)}.input-field{margin-block-start:1rem !important}.notecard__heading{font-size:inherit !important}`, \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/views/Setup.vue\"],\"names\":[],\"mappings\":\"AACA,KACC,4CAAA,CACA,4BAAA,CACA,4CAAA,CACA,kDAAA,CACA,2CAAA,CACA,qDAAA,CACA,6CAAA,CAEA,eAAA,CACA,kBAAA,CAEA,qDAEC,YAAA,CAGD,0BACC,eAAA,CAGD,2BAEC,iBAAA,CAIA,iFACC,4CAAA,CAGD,uFACC,2BAAA,CAKF,uCACC,YAAA,CACA,iDACC,qBAAA,CAMH,KACC,6CAAA,CACA,eAAA,CACA,cAAA,CACA,kCAAA,CAID,aACC,kCAAA,CAGD,mBACC,4BAAA\",\"sourcesContent\":[\"\\nform {\\n\\tpadding: calc(3 * var(--default-grid-baseline));\\n\\tcolor: var(--color-main-text);\\n\\tborder-radius: var(--border-radius-container);\\n\\tbackground-color: var(--color-main-background-blur);\\n\\tbox-shadow: 0 0 10px var(--color-box-shadow);\\n\\t-webkit-backdrop-filter: var(--filter-background-blur);\\n\\tbackdrop-filter: var(--filter-background-blur);\\n\\n\\tmax-width: 300px;\\n\\tmargin-bottom: 30px;\\n\\n\\t> fieldset:first-child,\\n\\t> .notecard:first-child {\\n\\t\\tmargin-top: 0;\\n\\t}\\n\\n\\t> .notecard:last-child {\\n\\t\\tmargin-bottom: 0;\\n\\t}\\n\\n\\tfieldset,\\n\\tdetails {\\n\\t\\tmargin-block: 1rem;\\n\\t}\\n\\n\\t.setup-form__button:not(.setup-form__button--loading) {\\n\\t\\t.material-design-icon {\\n\\t\\t\\ttransition: all linear var(--animation-quick);\\n\\t\\t}\\n\\n\\t\\t&:hover .material-design-icon {\\n\\t\\t\\ttransform: translateX(0.2em);\\n\\t\\t}\\n\\t}\\n\\n\\t// Db select required styling\\n\\t.setup-form__database-type-select {\\n\\t\\tdisplay: flex;\\n\\t\\t&--vertical {\\n\\t\\t\\tflex-direction: column;\\n\\t\\t}\\n\\t}\\n\\n}\\n\\ncode {\\n\\tbackground-color: var(--color-background-dark);\\n\\tmargin-top: 1rem;\\n\\tpadding: 0 0.3em;\\n\\tborder-radius: var(--border-radius);\\n}\\n\\n// Various overrides\\n.input-field {\\n\\tmargin-block-start: 1rem !important;\\n}\\n\\n.notecard__heading {\\n\\tfont-size: inherit !important;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nconst __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tconst cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tconst module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","const deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tlet notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tlet [chunkIds, fn, priority] = deferred[i];\n\t\tlet fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tconst r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tconst getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tif(!__webpack_require__.o(exports, key)) {\n\t\t\t\tif(binding === 0) {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, value: definition[i++] });\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: binding });\n\t\t\t\t}\n\t\t\t} else if(binding === 0) { i++; }\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","// The chunk loading function for additional chunks\n// Since all referenced chunks are already included\n// in this file, this function is empty here.\n__webpack_require__.e = () => (Promise.resolve());","__webpack_require__.o = (obj, prop) => (Object.hasOwn(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 820;","// set .name for anonymous default exports per ES spec\n// skipped when the property is non-configurable (pre-ES2015 engines),\n// where Object.defineProperty would throw\n__webpack_require__.dn = (x) => {\n\tvar descriptor = Object.getOwnPropertyDescriptor(x, \"name\");\n\tif (!descriptor || (!descriptor.writable && descriptor.configurable)) Object.defineProperty(x, \"name\", { value: \"default\", configurable: true });\n};","// execute a CommonJS module body with real module/exports objects, returning the final exports\n__webpack_require__.cjs = (body) => {\n\tconst mod = { exports: {} };\n\tbody.call(mod.exports, mod, mod.exports);\n\treturn mod.exports;\n};","__webpack_require__.b = (typeof document !== 'undefined' && document.baseURI) || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nconst installedChunks = {\n\t820: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nconst webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tlet [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nconst chunkLoadingGlobal = globalThis[\"webpackChunknextcloud_ui_legacy\"] ||= [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nlet __webpack_exports__ = __webpack_require__.O(undefined, [4208], () => (__webpack_require__(85973)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["PasswordStrength","checkPasswordEntropy","password","uniqueCharacters","Set","entropy","parseInt","Math","log2","pow","size","toString","length","toFixed","VeryWeak","Weak","Moderate","Strong","VeryStrong","ExtremelyStrong","views_Setupvue_type_script_lang_ts","defineComponent","name","components","IconArrowRight","ArrowRight","A","NcButton","NcCheckboxRadioSwitch","NcLoadingIcon","NcNoteCard","NcPasswordField","NcTextField","setup","t","data","config","links","isValidAutoconfig","loading","computed","passwordHelperText","this","adminpass","passwordHelperType","firstAndOnlyDatabase","dbNames","Object","values","databases","DBTypeGroupDirection","keys","htaccessWarning","message","linkStart","adminInstall","linkEnd","escape","join","DomPurify","sanitize","errors","map","error","heading","hint","beforeMount","loadState","mounted","dbtype","at","hasAutoconfig","form","$refs","querySelectorAll","forEach","input","removeAttribute","checkValidity","setAttribute","methods","onSubmit","options","styleTagTransform","styleTagTransform_default","setAttributes","setAttributesWithoutAttributes_default","insert","insertBySelector_default","bind","domAPI","styleDomAPI_default","insertStyleElement","insertStyleElement_default","injectStylesIntoStyleTag_default","Setupvue_type_style_index_0_id_ae023172_prod_lang_scss","locals","Setup","_vm","_c","_self","_setupProxy","ref","staticClass","class","attrs","action","method","on","submit","type","_v","_s","_e","htaccessWorking","domProps","innerHTML","_l","index","key","label","required","model","value","adminlogin","callback","$$v","$set","expression","directives","rawName","open","placeholder","serverRoot","autocomplete","autocapitalize","spellcheck","directory","db","href","adminSourceInstall","target","rel","dbuser","dbpass","pattern","dbname","dbtablespace","dbhost","disabled","wide","alignment","variant","scopedSlots","_u","fn","proxy","Vue","extend","$mount","___CSS_LOADER_EXPORT___","_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default","_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default","push","module","id","version","sources","names","mappings","sourcesContent","sourceRoot","__WEBPACK_DEFAULT_EXPORT__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","deferred","O","result","chunkIds","priority","i","notFulfilled","Infinity","fulfilled","j","every","splice","r","n","getter","__esModule","d","a","definition","Array","isArray","binding","o","defineProperty","enumerable","get","e","Promise","resolve","obj","prop","hasOwn","Symbol","toStringTag","nmd","paths","children","dn","x","descriptor","getOwnPropertyDescriptor","writable","configurable","cjs","body","mod","b","document","baseURI","self","location","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","globalThis","nc","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"core-install.js?v=a3fd40b6af28486c1a3b","mappings":"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","sources":["webpack:///nextcloud/core/src/views/WebInstaller.vue","webpack:///nextcloud/core/src/views/WebInstaller.vue?vue&type=script&lang=ts","webpack://nextcloud/./core/src/views/WebInstaller.vue?6e09","webpack://nextcloud/./core/src/views/WebInstaller.vue?a9c4","webpack:///nextcloud/core/src/install.ts","webpack:///nextcloud/core/src/views/WebInstaller.vue?vue&type=style&index=0&id=7f44c589&prod&lang=scss","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/set anonymous default export name","webpack:///nextcloud/webpack/runtime/wrap commonjs module","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('form',{ref:\"form\",staticClass:\"setup-form\",class:{ 'setup-form--loading': _vm.loading },attrs:{\"action\":\"\",\"data-cy-setup-form\":\"\",\"method\":\"POST\"},on:{\"submit\":_vm.onSubmit}},[(_vm.config.hasAutoconfig)?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Autoconfig file detected'),\"data-cy-setup-form-note\":\"autoconfig\",\"type\":\"success\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'The setup form below is pre-filled with the values from the config file.'))+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.config.htaccessWorking === false)?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Security warning'),\"data-cy-setup-form-note\":\"htaccess\",\"type\":\"warning\"}},[_c('p',{domProps:{\"innerHTML\":_vm._s(_vm.htaccessWarning)}})]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.errors),function(error,index){return _c('NcNoteCard',{key:index,attrs:{\"heading\":error.heading,\"data-cy-setup-form-note\":\"error\",\"type\":\"error\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(error.message)+\"\\n\\t\")])}),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__administration\"},[_c('legend',[_vm._v(_vm._s(_vm.t('core', 'Create administration account')))]),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Administration account name'),\"data-cy-setup-form-field\":\"adminlogin\",\"name\":\"adminlogin\",\"required\":\"\"},model:{value:(_vm.config.adminlogin),callback:function ($$v) {_vm.$set(_vm.config, \"adminlogin\", $$v)},expression:\"config.adminlogin\"}}),_vm._v(\" \"),_c('NcPasswordField',{attrs:{\"label\":_vm.t('core', 'Administration account password'),\"data-cy-setup-form-field\":\"adminpass\",\"name\":\"adminpass\",\"required\":\"\"},model:{value:(_vm.config.adminpass),callback:function ($$v) {_vm.$set(_vm.config, \"adminpass\", $$v)},expression:\"config.adminpass\"}}),_vm._v(\" \"),_c('NcNoteCard',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.config.adminpass !== ''),expression:\"config.adminpass !== ''\"}],attrs:{\"type\":_vm.passwordHelperType}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.passwordHelperText)+\"\\n\\t\\t\")])],1),_vm._v(\" \"),_c('details',{attrs:{\"open\":!_vm.isValidAutoconfig,\"data-cy-setup-form-advanced-config\":\"\"}},[_c('summary',[_vm._v(_vm._s(_vm.t('core', 'Storage & database')))]),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__data-folder\"},[_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Data folder'),\"placeholder\":_vm.config.serverRoot + '/data',\"required\":\"\",\"autocomplete\":\"off\",\"autocapitalize\":\"none\",\"data-cy-setup-form-field\":\"directory\",\"name\":\"directory\",\"spellcheck\":\"false\"},model:{value:(_vm.config.directory),callback:function ($$v) {_vm.$set(_vm.config, \"directory\", $$v)},expression:\"config.directory\"}})],1),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__database\"},[_c('legend',[_vm._v(_vm._s(_vm.t('core', 'Database configuration')))]),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__database-type\"},[_c('legend',{staticClass:\"hidden-visually\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Database type'))+\"\\n\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('p',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.firstAndOnlyDatabase),expression:\"!firstAndOnlyDatabase\"}],staticClass:\"setup-form__database-type-select\",class:`setup-form__database-type-select--${_vm.DBTypeGroupDirection}`},_vm._l((_vm.config.databases),function(name,db){return _c('NcCheckboxRadioSwitch',{key:db,attrs:{\"button-variant\":true,\"data-cy-setup-form-field\":`dbtype-${db}`,\"value\":db,\"button-variant-grouped\":_vm.DBTypeGroupDirection,\"name\":\"dbtype\",\"type\":\"radio\"},model:{value:(_vm.config.dbtype),callback:function ($$v) {_vm.$set(_vm.config, \"dbtype\", $$v)},expression:\"config.dbtype\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(name)+\"\\n\\t\\t\\t\\t\\t\")])}),1),_vm._v(\" \"),(_vm.firstAndOnlyDatabase)?_c('NcNoteCard',{attrs:{\"data-cy-setup-form-db-note\":\"single-db\",\"type\":\"warning\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Only {firstAndOnlyDatabase} is available.', { firstAndOnlyDatabase: _vm.firstAndOnlyDatabase }))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Install and activate additional PHP modules to choose other database types.'))),_c('br'),_vm._v(\" \"),_c('a',{attrs:{\"href\":_vm.links.adminSourceInstall,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'For more details check out the documentation.'))+\" ↗\\n\\t\\t\\t\\t\\t\")])]):_vm._e(),_vm._v(\" \"),(_vm.config.dbtype === 'sqlite')?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Performance warning'),\"data-cy-setup-form-db-note\":\"sqlite\",\"type\":\"warning\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'You chose SQLite as database.'))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'SQLite should only be used for minimal and development instances. For production we recommend a different database backend.'))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'If you use clients for file syncing, the use of SQLite is highly discouraged.'))+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1),_vm._v(\" \"),(_vm.config.dbtype !== 'sqlite')?_c('fieldset',[_c('legend',{staticClass:\"hidden-visually\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Database connection'))+\"\\n\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database user'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbuser\",\"name\":\"dbuser\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbuser),callback:function ($$v) {_vm.$set(_vm.config, \"dbuser\", $$v)},expression:\"config.dbuser\"}}),_vm._v(\" \"),_c('NcPasswordField',{attrs:{\"label\":_vm.t('core', 'Database password'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbpass\",\"name\":\"dbpass\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbpass),callback:function ($$v) {_vm.$set(_vm.config, \"dbpass\", $$v)},expression:\"config.dbpass\"}}),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database name'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbname\",\"name\":\"dbname\",\"pattern\":\"[0-9a-zA-Z\\\\$_\\\\-]+\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbname),callback:function ($$v) {_vm.$set(_vm.config, \"dbname\", $$v)},expression:\"config.dbname\"}}),_vm._v(\" \"),(_vm.config.dbtype === 'oci')?_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database tablespace'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbtablespace\",\"name\":\"dbtablespace\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbtablespace),callback:function ($$v) {_vm.$set(_vm.config, \"dbtablespace\", $$v)},expression:\"config.dbtablespace\"}}):_vm._e(),_vm._v(\" \"),_c('NcTextField',{attrs:{\"helper-text\":_vm.t('core', 'Please specify the port number along with the host name (e.g., localhost:5432).'),\"label\":_vm.t('core', 'Database host'),\"placeholder\":_vm.t('core', 'localhost'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbhost\",\"name\":\"dbhost\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbhost),callback:function ($$v) {_vm.$set(_vm.config, \"dbhost\", $$v)},expression:\"config.dbhost\"}})],1):_vm._e(),_vm._v(\" \"),(_vm.supportsEncryptedConnection)?_c('details',{attrs:{\"data-cy-setup-form-database-encryption\":\"\"}},[_c('summary',[_vm._v(_vm._s(_vm.t('core', 'Encrypted database connection')))]),_vm._v(\" \"),_c('fieldset',[_c('legend',{staticClass:\"hidden-visually\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Encrypted database connection'))+\"\\n\\t\\t\\t\\t\\t\")]),_vm._v(\" \"),(_vm.config.dbtype === 'pgsql')?_c('NcTextField',{attrs:{\"helper-text\":_vm.t('core', 'Supported modes: disable, allow, prefer, require, verify-ca, verify-full.'),\"label\":_vm.t('core', 'Encryption mode'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"name\":\"dbsslmode\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbsslmode),callback:function ($$v) {_vm.$set(_vm.config, \"dbsslmode\", $$v)},expression:\"config.dbsslmode\"}}):_vm._e(),_vm._v(\" \"),_c('NcTextField',{attrs:{\"helper-text\":_vm.t('core', 'Has to be readable by the web server.'),\"label\":_vm.t('core', 'CA certificate path'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"name\":\"dbsslca\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbsslca),callback:function ($$v) {_vm.$set(_vm.config, \"dbsslca\", $$v)},expression:\"config.dbsslca\"}}),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Client certificate path'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"name\":\"dbsslcert\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbsslcert),callback:function ($$v) {_vm.$set(_vm.config, \"dbsslcert\", $$v)},expression:\"config.dbsslcert\"}}),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Client certificate key path'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"name\":\"dbsslkey\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbsslkey),callback:function ($$v) {_vm.$set(_vm.config, \"dbsslkey\", $$v)},expression:\"config.dbsslkey\"}}),_vm._v(\" \"),(_vm.config.dbtype === 'pgsql')?_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Certificate revocation list path'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"name\":\"dbsslcrl\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbsslcrl),callback:function ($$v) {_vm.$set(_vm.config, \"dbsslcrl\", $$v)},expression:\"config.dbsslcrl\"}}):_vm._e(),_vm._v(\" \"),(_vm.config.dbtype === 'mysql')?_c('NcCheckboxRadioSwitch',{attrs:{\"name\":\"dbsslnoverify\",\"type\":\"checkbox\",\"value\":\"1\"},model:{value:(_vm.dbsslnoverify),callback:function ($$v) {_vm.dbsslnoverify=$$v},expression:\"dbsslnoverify\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Do not verify that the server certificate matches the database host'))+\"\\n\\t\\t\\t\\t\\t\")]):_vm._e()],1)]):_vm._e()])]),_vm._v(\" \"),_c('NcButton',{staticClass:\"setup-form__button\",class:{ 'setup-form__button--loading': _vm.loading },attrs:{\"disabled\":_vm.loading,\"loading\":_vm.loading,\"wide\":true,\"alignment\":\"center-reverse\",\"data-cy-setup-form-submit\":\"\",\"type\":\"submit\",\"variant\":\"primary\"},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(_vm.loading)?_c('NcLoadingIcon'):_c('IconArrowRight')]},proxy:true}])},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.loading ? _vm.t('core', 'Installing …') : _vm.t('core', 'Install'))+\"\\n\\t\")]),_vm._v(\" \"),_c('NcNoteCard',{attrs:{\"data-cy-setup-form-note\":\"help\",\"type\":\"info\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'Need help?'))+\"\\n\\t\\t\"),_c('a',{attrs:{\"target\":\"_blank\",\"rel\":\"noreferrer noopener\",\"href\":_vm.links.adminInstall}},[_vm._v(_vm._s(_vm.t('core', 'See the documentation'))+\" ↗\")])])],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-6.use[1]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebInstaller.vue?vue&type=script&lang=ts\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-6.use[1]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebInstaller.vue?vue&type=script&lang=ts\"","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebInstaller.vue?vue&type=style&index=0&id=7f44c589&prod&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebInstaller.vue?vue&type=style&index=0&id=7f44c589&prod&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./WebInstaller.vue?vue&type=template&id=7f44c589\"\nimport script from \"./WebInstaller.vue?vue&type=script&lang=ts\"\nexport * from \"./WebInstaller.vue?vue&type=script&lang=ts\"\nimport style0 from \"./WebInstaller.vue?vue&type=style&index=0&id=7f44c589&prod&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/**\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport Vue from 'vue';\nimport WebInstaller from './views/WebInstaller.vue';\nconst SetupVue = Vue.extend(WebInstaller);\nnew SetupVue().$mount('#content');\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `form{padding:calc(3*var(--default-grid-baseline));color:var(--color-main-text);border-radius:var(--border-radius-container);background-color:var(--color-main-background-blur);box-shadow:0 0 10px var(--color-box-shadow);-webkit-backdrop-filter:var(--filter-background-blur);backdrop-filter:var(--filter-background-blur);max-width:300px;margin-bottom:30px}form>fieldset:first-child,form>.notecard:first-child{margin-top:0}form>.notecard:last-child{margin-bottom:0}form fieldset,form details{margin-block:1rem}form .setup-form__button:not(.setup-form__button--loading) .material-design-icon{transition:all linear var(--animation-quick)}form .setup-form__button:not(.setup-form__button--loading):hover .material-design-icon{transform:translateX(0.2em)}form .setup-form__database-type-select{display:flex}form .setup-form__database-type-select--vertical{flex-direction:column}code{background-color:var(--color-background-dark);margin-top:1rem;padding:0 .3em;border-radius:var(--border-radius)}.input-field{margin-block-start:1rem !important}.notecard__heading{font-size:inherit !important}`, \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/views/WebInstaller.vue\"],\"names\":[],\"mappings\":\"AACA,KACC,4CAAA,CACA,4BAAA,CACA,4CAAA,CACA,kDAAA,CACA,2CAAA,CACA,qDAAA,CACA,6CAAA,CAEA,eAAA,CACA,kBAAA,CAEA,qDAEC,YAAA,CAGD,0BACC,eAAA,CAGD,2BAEC,iBAAA,CAIA,iFACC,4CAAA,CAGD,uFACC,2BAAA,CAKF,uCACC,YAAA,CACA,iDACC,qBAAA,CAMH,KACC,6CAAA,CACA,eAAA,CACA,cAAA,CACA,kCAAA,CAID,aACC,kCAAA,CAGD,mBACC,4BAAA\",\"sourcesContent\":[\"\\nform {\\n\\tpadding: calc(3 * var(--default-grid-baseline));\\n\\tcolor: var(--color-main-text);\\n\\tborder-radius: var(--border-radius-container);\\n\\tbackground-color: var(--color-main-background-blur);\\n\\tbox-shadow: 0 0 10px var(--color-box-shadow);\\n\\t-webkit-backdrop-filter: var(--filter-background-blur);\\n\\tbackdrop-filter: var(--filter-background-blur);\\n\\n\\tmax-width: 300px;\\n\\tmargin-bottom: 30px;\\n\\n\\t> fieldset:first-child,\\n\\t> .notecard:first-child {\\n\\t\\tmargin-top: 0;\\n\\t}\\n\\n\\t> .notecard:last-child {\\n\\t\\tmargin-bottom: 0;\\n\\t}\\n\\n\\tfieldset,\\n\\tdetails {\\n\\t\\tmargin-block: 1rem;\\n\\t}\\n\\n\\t.setup-form__button:not(.setup-form__button--loading) {\\n\\t\\t.material-design-icon {\\n\\t\\t\\ttransition: all linear var(--animation-quick);\\n\\t\\t}\\n\\n\\t\\t&:hover .material-design-icon {\\n\\t\\t\\ttransform: translateX(0.2em);\\n\\t\\t}\\n\\t}\\n\\n\\t// Db select required styling\\n\\t.setup-form__database-type-select {\\n\\t\\tdisplay: flex;\\n\\t\\t&--vertical {\\n\\t\\t\\tflex-direction: column;\\n\\t\\t}\\n\\t}\\n\\n}\\n\\ncode {\\n\\tbackground-color: var(--color-background-dark);\\n\\tmargin-top: 1rem;\\n\\tpadding: 0 0.3em;\\n\\tborder-radius: var(--border-radius);\\n}\\n\\n// Various overrides\\n.input-field {\\n\\tmargin-block-start: 1rem !important;\\n}\\n\\n.notecard__heading {\\n\\tfont-size: inherit !important;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nconst __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tconst cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tconst module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","const deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tlet notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tlet [chunkIds, fn, priority] = deferred[i];\n\t\tlet fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tconst r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tconst getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tif(!__webpack_require__.o(exports, key)) {\n\t\t\t\tif(binding === 0) {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, value: definition[i++] });\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: binding });\n\t\t\t\t}\n\t\t\t} else if(binding === 0) { i++; }\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","// The chunk loading function for additional chunks\n// Since all referenced chunks are already included\n// in this file, this function is empty here.\n__webpack_require__.e = () => (Promise.resolve());","__webpack_require__.o = (obj, prop) => (Object.hasOwn(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 820;","// set .name for anonymous default exports per ES spec\n// skipped when the property is non-configurable (pre-ES2015 engines),\n// where Object.defineProperty would throw\n__webpack_require__.dn = (x) => {\n\tvar descriptor = Object.getOwnPropertyDescriptor(x, \"name\");\n\tif (!descriptor || (!descriptor.writable && descriptor.configurable)) Object.defineProperty(x, \"name\", { value: \"default\", configurable: true });\n};","// execute a CommonJS module body with real module/exports objects, returning the final exports\n__webpack_require__.cjs = (body) => {\n\tconst mod = { exports: {} };\n\tbody.call(mod.exports, mod, mod.exports);\n\treturn mod.exports;\n};","__webpack_require__.b = (typeof document !== 'undefined' && document.baseURI) || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nconst installedChunks = {\n\t820: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nconst webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tlet [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nconst chunkLoadingGlobal = globalThis[\"webpackChunknextcloud_ui_legacy\"] ||= [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nlet __webpack_exports__ = __webpack_require__.O(undefined, [4208], () => (__webpack_require__(42051)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["PasswordStrength","checkPasswordEntropy","password","uniqueCharacters","Set","entropy","parseInt","Math","log2","pow","size","toString","length","toFixed","VeryWeak","Weak","Moderate","Strong","VeryStrong","ExtremelyStrong","views_WebInstallervue_type_script_lang_ts","defineComponent","name","components","IconArrowRight","ArrowRight","A","NcButton","NcCheckboxRadioSwitch","NcLoadingIcon","NcNoteCard","NcPasswordField","NcTextField","setup","t","data","config","links","isValidAutoconfig","loading","computed","passwordHelperText","this","adminpass","passwordHelperType","supportsEncryptedConnection","dbtype","dbsslnoverify","get","set","checked","includes","firstAndOnlyDatabase","dbNames","Object","values","databases","DBTypeGroupDirection","keys","htaccessWarning","message","linkStart","adminInstall","linkEnd","escape","join","DomPurify","sanitize","errors","map","error","heading","hint","beforeMount","loadState","mounted","at","hasAutoconfig","form","$refs","querySelectorAll","forEach","input","removeAttribute","checkValidity","setAttribute","methods","onSubmit","options","styleTagTransform","styleTagTransform_default","setAttributes","setAttributesWithoutAttributes_default","insert","insertBySelector_default","bind","domAPI","styleDomAPI_default","insertStyleElement","insertStyleElement_default","injectStylesIntoStyleTag_default","WebInstallervue_type_style_index_0_id_7f44c589_prod_lang_scss","locals","WebInstaller","_vm","_c","_self","_setupProxy","ref","staticClass","class","attrs","action","method","on","submit","type","_v","_s","_e","htaccessWorking","domProps","innerHTML","_l","index","key","label","required","model","value","adminlogin","callback","$$v","$set","expression","directives","rawName","open","placeholder","serverRoot","autocomplete","autocapitalize","spellcheck","directory","db","href","adminSourceInstall","target","rel","dbuser","dbpass","pattern","dbname","dbtablespace","dbhost","dbsslmode","dbsslca","dbsslcert","dbsslkey","dbsslcrl","disabled","wide","alignment","variant","scopedSlots","_u","fn","proxy","Vue","extend","$mount","___CSS_LOADER_EXPORT___","_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default","_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default","push","module","id","version","sources","names","mappings","sourcesContent","sourceRoot","__WEBPACK_DEFAULT_EXPORT__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","deferred","O","result","chunkIds","priority","i","notFulfilled","Infinity","fulfilled","j","every","splice","r","n","getter","__esModule","d","a","definition","Array","isArray","binding","o","defineProperty","enumerable","e","Promise","resolve","obj","prop","hasOwn","Symbol","toStringTag","nmd","paths","children","dn","x","descriptor","getOwnPropertyDescriptor","writable","configurable","cjs","body","mod","b","document","baseURI","self","location","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","globalThis","nc","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file