Merge pull request #24653 from nextcloud/backport/23044/stable20
[stable20] Handle owncloud migration to latest release
This commit is contained in:
commit
24fe3ee439
|
@ -5,7 +5,7 @@
|
||||||
<name>WebDAV</name>
|
<name>WebDAV</name>
|
||||||
<summary>WebDAV endpoint</summary>
|
<summary>WebDAV endpoint</summary>
|
||||||
<description>WebDAV endpoint</description>
|
<description>WebDAV endpoint</description>
|
||||||
<version>1.16.1</version>
|
<version>1.16.2</version>
|
||||||
<licence>agpl</licence>
|
<licence>agpl</licence>
|
||||||
<author>owncloud.org</author>
|
<author>owncloud.org</author>
|
||||||
<namespace>DAV</namespace>
|
<namespace>DAV</namespace>
|
||||||
|
|
|
@ -251,6 +251,12 @@ class Version1004Date20170825134824 extends SimpleMigrationStep {
|
||||||
]);
|
]);
|
||||||
$table->setPrimaryKey(['id']);
|
$table->setPrimaryKey(['id']);
|
||||||
$table->addUniqueIndex(['principaluri', 'uri'], 'calendars_index');
|
$table->addUniqueIndex(['principaluri', 'uri'], 'calendars_index');
|
||||||
|
} else {
|
||||||
|
$table = $schema->getTable('calendars');
|
||||||
|
$table->changeColumn('components', [
|
||||||
|
'notnull' => false,
|
||||||
|
'length' => 64,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$schema->hasTable('calendarchanges')) {
|
if (!$schema->hasTable('calendarchanges')) {
|
||||||
|
@ -335,6 +341,12 @@ class Version1004Date20170825134824 extends SimpleMigrationStep {
|
||||||
]);
|
]);
|
||||||
$table->setPrimaryKey(['id']);
|
$table->setPrimaryKey(['id']);
|
||||||
$table->addUniqueIndex(['principaluri', 'uri'], 'calsub_index');
|
$table->addUniqueIndex(['principaluri', 'uri'], 'calsub_index');
|
||||||
|
} else {
|
||||||
|
$table = $schema->getTable('calendarsubscriptions');
|
||||||
|
$table->changeColumn('lastmodified', [
|
||||||
|
'notnull' => false,
|
||||||
|
'unsigned' => true,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$schema->hasTable('schedulingobjects')) {
|
if (!$schema->hasTable('schedulingobjects')) {
|
||||||
|
|
|
@ -121,6 +121,12 @@ class Version1011Date20200630192246 extends SimpleMigrationStep {
|
||||||
$table->setPrimaryKey(['config_id']);
|
$table->setPrimaryKey(['config_id']);
|
||||||
$table->addIndex(['mount_id'], 'config_mount');
|
$table->addIndex(['mount_id'], 'config_mount');
|
||||||
$table->addUniqueIndex(['mount_id', 'key'], 'config_mount_key');
|
$table->addUniqueIndex(['mount_id', 'key'], 'config_mount_key');
|
||||||
|
} else {
|
||||||
|
$table = $schema->getTable('external_config');
|
||||||
|
$table->changeColumn('value', [
|
||||||
|
'notnull' => false,
|
||||||
|
'length' => 4096,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$schema->hasTable('external_options')) {
|
if (!$schema->hasTable('external_options')) {
|
||||||
|
|
|
@ -144,6 +144,10 @@ class Application extends App {
|
||||||
if (!$table->hasIndex('cards_abid')) {
|
if (!$table->hasIndex('cards_abid')) {
|
||||||
$subject->addHintForMissingSubject($table->getName(), 'cards_abid');
|
$subject->addHintForMissingSubject($table->getName(), 'cards_abid');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!$table->hasIndex('cards_abiduri')) {
|
||||||
|
$subject->addHintForMissingSubject($table->getName(), 'cards_abiduri');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($schema->hasTable('cards_properties')) {
|
if ($schema->hasTable('cards_properties')) {
|
||||||
|
|
|
@ -193,8 +193,23 @@ class AddMissingIndices extends Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
$output->writeln('<info>Check indices of the cards table.</info>');
|
$output->writeln('<info>Check indices of the cards table.</info>');
|
||||||
|
$cardsUpdated = false;
|
||||||
if ($schema->hasTable('cards')) {
|
if ($schema->hasTable('cards')) {
|
||||||
$table = $schema->getTable('cards');
|
$table = $schema->getTable('cards');
|
||||||
|
|
||||||
|
if ($table->hasIndex('addressbookid_uri_index')) {
|
||||||
|
$output->writeln('<info>Renaming addressbookid_uri_index index to to the cards table, this can take some time...</info>');
|
||||||
|
|
||||||
|
foreach ($table->getIndexes() as $index) {
|
||||||
|
if ($index->getColumns() === ['addressbookid', 'uri']) {
|
||||||
|
$table->renameIndex('addressbookid_uri_index', 'cards_abiduri');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->connection->migrateToSchema($schema->getWrappedSchema());
|
||||||
|
$cardsUpdated = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!$table->hasIndex('cards_abid')) {
|
if (!$table->hasIndex('cards_abid')) {
|
||||||
$output->writeln('<info>Adding cards_abid index to the cards table, this can take some time...</info>');
|
$output->writeln('<info>Adding cards_abid index to the cards table, this can take some time...</info>');
|
||||||
|
|
||||||
|
@ -206,6 +221,24 @@ class AddMissingIndices extends Command {
|
||||||
|
|
||||||
$table->addIndex(['addressbookid'], 'cards_abid');
|
$table->addIndex(['addressbookid'], 'cards_abid');
|
||||||
$this->connection->migrateToSchema($schema->getWrappedSchema());
|
$this->connection->migrateToSchema($schema->getWrappedSchema());
|
||||||
|
$cardsUpdated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$table->hasIndex('cards_abiduri')) {
|
||||||
|
$output->writeln('<info>Adding cards_abiduri index to the cards table, this can take some time...</info>');
|
||||||
|
|
||||||
|
foreach ($table->getIndexes() as $index) {
|
||||||
|
if ($index->getColumns() === ['addressbookid', 'uri']) {
|
||||||
|
$table->dropIndex($index->getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$table->addIndex(['addressbookid', 'uri'], 'cards_abiduri');
|
||||||
|
$this->connection->migrateToSchema($schema->getWrappedSchema());
|
||||||
|
$cardsUpdated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($cardsUpdated) {
|
||||||
$updated = true;
|
$updated = true;
|
||||||
$output->writeln('<info>cards table updated successfully.</info>');
|
$output->writeln('<info>cards table updated successfully.</info>');
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,11 +31,37 @@ namespace OC\Core\Migrations;
|
||||||
|
|
||||||
use Doctrine\DBAL\Types\Types;
|
use Doctrine\DBAL\Types\Types;
|
||||||
use OCP\DB\ISchemaWrapper;
|
use OCP\DB\ISchemaWrapper;
|
||||||
|
use OCP\IDBConnection;
|
||||||
use OCP\Migration\IOutput;
|
use OCP\Migration\IOutput;
|
||||||
use OCP\Migration\SimpleMigrationStep;
|
use OCP\Migration\SimpleMigrationStep;
|
||||||
|
|
||||||
class Version13000Date20170718121200 extends SimpleMigrationStep {
|
class Version13000Date20170718121200 extends SimpleMigrationStep {
|
||||||
|
|
||||||
|
/** @var IDBConnection */
|
||||||
|
private $connection;
|
||||||
|
|
||||||
|
public function __construct(IDBConnection $connection) {
|
||||||
|
$this->connection = $connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function preSchemaChange(IOutput $output, \Closure $schemaClosure, array $options) {
|
||||||
|
/** @var ISchemaWrapper $schema */
|
||||||
|
$schema = $schemaClosure();
|
||||||
|
|
||||||
|
if (!$schema->hasTable('properties')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// in case we have a properties table from oc we drop it since we will only migrate
|
||||||
|
// the dav_properties values in the postSchemaChange step
|
||||||
|
$table = $schema->getTable('properties');
|
||||||
|
if ($table->hasColumn('fileid')) {
|
||||||
|
$qb = $this->connection->getQueryBuilder();
|
||||||
|
$qb->delete('properties');
|
||||||
|
$qb->execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param IOutput $output
|
* @param IOutput $output
|
||||||
* @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
|
* @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
|
||||||
|
@ -122,6 +148,15 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
|
||||||
$table->addIndex(['root_id'], 'mounts_root_index');
|
$table->addIndex(['root_id'], 'mounts_root_index');
|
||||||
$table->addIndex(['mount_id'], 'mounts_mount_id_index');
|
$table->addIndex(['mount_id'], 'mounts_mount_id_index');
|
||||||
$table->addUniqueIndex(['user_id', 'root_id'], 'mounts_user_root_index');
|
$table->addUniqueIndex(['user_id', 'root_id'], 'mounts_user_root_index');
|
||||||
|
} else {
|
||||||
|
$table = $schema->getTable('mounts');
|
||||||
|
$table->addColumn('mount_id', Types::BIGINT, [
|
||||||
|
'notnull' => false,
|
||||||
|
'length' => 20,
|
||||||
|
]);
|
||||||
|
if (!$table->hasIndex('mounts_mount_id_index')) {
|
||||||
|
$table->addIndex(['mount_id'], 'mounts_mount_id_index');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$schema->hasTable('mimetypes')) {
|
if (!$schema->hasTable('mimetypes')) {
|
||||||
|
@ -320,6 +355,27 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
|
||||||
$table->setPrimaryKey(['id']);
|
$table->setPrimaryKey(['id']);
|
||||||
$table->addIndex(['userid'], 'property_index');
|
$table->addIndex(['userid'], 'property_index');
|
||||||
$table->addIndex(['userid', 'propertypath'], 'properties_path_index');
|
$table->addIndex(['userid', 'propertypath'], 'properties_path_index');
|
||||||
|
} else {
|
||||||
|
$table = $schema->getTable('properties');
|
||||||
|
if ($table->hasColumn('propertytype')) {
|
||||||
|
$table->dropColumn('propertytype');
|
||||||
|
}
|
||||||
|
if ($table->hasColumn('fileid')) {
|
||||||
|
$table->dropColumn('fileid');
|
||||||
|
}
|
||||||
|
if (!$table->hasColumn('propertypath')) {
|
||||||
|
$table->addColumn('propertypath', 'string', [
|
||||||
|
'notnull' => true,
|
||||||
|
'length' => 255,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
if (!$table->hasColumn('userid')) {
|
||||||
|
$table->addColumn('userid', 'string', [
|
||||||
|
'notnull' => false,
|
||||||
|
'length' => 64,
|
||||||
|
'default' => '',
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$schema->hasTable('share')) {
|
if (!$schema->hasTable('share')) {
|
||||||
|
@ -415,6 +471,14 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
|
||||||
$table->addIndex(['parent'], 'parent_index');
|
$table->addIndex(['parent'], 'parent_index');
|
||||||
$table->addIndex(['uid_owner'], 'owner_index');
|
$table->addIndex(['uid_owner'], 'owner_index');
|
||||||
$table->addIndex(['uid_initiator'], 'initiator_index');
|
$table->addIndex(['uid_initiator'], 'initiator_index');
|
||||||
|
} else {
|
||||||
|
$table = $schema->getTable('share');
|
||||||
|
if (!$table->hasColumn('password')) {
|
||||||
|
$table->addColumn('password', 'string', [
|
||||||
|
'notnull' => false,
|
||||||
|
'length' => 255,
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$schema->hasTable('jobs')) {
|
if (!$schema->hasTable('jobs')) {
|
||||||
|
@ -505,25 +569,25 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
|
||||||
'default' => '',
|
'default' => '',
|
||||||
]);
|
]);
|
||||||
$table->addColumn('type', 'smallint', [
|
$table->addColumn('type', 'smallint', [
|
||||||
'notnull' => true,
|
'notnull' => false,
|
||||||
'length' => 2,
|
'length' => 2,
|
||||||
'default' => 0,
|
'default' => 0,
|
||||||
'unsigned' => true,
|
'unsigned' => true,
|
||||||
]);
|
]);
|
||||||
$table->addColumn('remember', 'smallint', [
|
$table->addColumn('remember', 'smallint', [
|
||||||
'notnull' => true,
|
'notnull' => false,
|
||||||
'length' => 1,
|
'length' => 1,
|
||||||
'default' => 0,
|
'default' => 0,
|
||||||
'unsigned' => true,
|
'unsigned' => true,
|
||||||
]);
|
]);
|
||||||
$table->addColumn('last_activity', 'integer', [
|
$table->addColumn('last_activity', 'integer', [
|
||||||
'notnull' => true,
|
'notnull' => false,
|
||||||
'length' => 4,
|
'length' => 4,
|
||||||
'default' => 0,
|
'default' => 0,
|
||||||
'unsigned' => true,
|
'unsigned' => true,
|
||||||
]);
|
]);
|
||||||
$table->addColumn('last_check', 'integer', [
|
$table->addColumn('last_check', 'integer', [
|
||||||
'notnull' => true,
|
'notnull' => false,
|
||||||
'length' => 4,
|
'length' => 4,
|
||||||
'default' => 0,
|
'default' => 0,
|
||||||
'unsigned' => true,
|
'unsigned' => true,
|
||||||
|
@ -534,6 +598,11 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
|
||||||
$table->setPrimaryKey(['id']);
|
$table->setPrimaryKey(['id']);
|
||||||
$table->addUniqueIndex(['token'], 'authtoken_token_index');
|
$table->addUniqueIndex(['token'], 'authtoken_token_index');
|
||||||
$table->addIndex(['last_activity'], 'authtoken_last_activity_idx');
|
$table->addIndex(['last_activity'], 'authtoken_last_activity_idx');
|
||||||
|
} else {
|
||||||
|
$table = $schema->getTable('authtoken');
|
||||||
|
$table->addColumn('scope', 'text', [
|
||||||
|
'notnull' => false,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$schema->hasTable('bruteforce_attempts')) {
|
if (!$schema->hasTable('bruteforce_attempts')) {
|
||||||
|
@ -936,4 +1005,32 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
|
||||||
}
|
}
|
||||||
return $schema;
|
return $schema;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function postSchemaChange(IOutput $output, \Closure $schemaClosure, array $options) {
|
||||||
|
/** @var ISchemaWrapper $schema */
|
||||||
|
$schema = $schemaClosure();
|
||||||
|
if (!$schema->hasTable('dav_properties')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$query = $this->connection->getQueryBuilder();
|
||||||
|
$query->select('*')
|
||||||
|
->from('dav_properties');
|
||||||
|
|
||||||
|
$insert = $this->connection->getQueryBuilder();
|
||||||
|
$insert->insert('properties')
|
||||||
|
->setValue('propertypath', $insert->createParameter('propertypath'))
|
||||||
|
->setValue('propertyname', $insert->createParameter('propertyname'))
|
||||||
|
->setValue('propertyvalue', $insert->createParameter('propertyvalue'))
|
||||||
|
->setValue('userid', $insert->createParameter('userid'));
|
||||||
|
|
||||||
|
$result = $query->execute();
|
||||||
|
while ($row = $result->fetch()) {
|
||||||
|
preg_match('/(calendar)\/([A-z0-9-@_]+)\//', $row['propertypath'], $match);
|
||||||
|
$insert->setParameter('propertypath', (string) $row['propertypath'])
|
||||||
|
->setParameter('propertyname', (string) $row['propertyname'])
|
||||||
|
->setParameter('propertyvalue', (string) $row['propertyvalue'])
|
||||||
|
->setParameter('userid', (string) ($match[2] ?? ''));
|
||||||
|
$insert->execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,8 +63,17 @@ class Version13000Date20170919121250 extends SimpleMigrationStep {
|
||||||
$column->setUnsigned(true);
|
$column->setUnsigned(true);
|
||||||
$column = $table->getColumn('type');
|
$column = $table->getColumn('type');
|
||||||
$column->setUnsigned(true);
|
$column->setUnsigned(true);
|
||||||
$column = $table->getColumn('remember');
|
if ($table->hasColumn('remember')) {
|
||||||
$column->setUnsigned(true);
|
$column = $table->getColumn('remember');
|
||||||
|
$column->setUnsigned(true);
|
||||||
|
} else {
|
||||||
|
$table->addColumn('remember', 'smallint', [
|
||||||
|
'notnull' => false,
|
||||||
|
'length' => 1,
|
||||||
|
'default' => 0,
|
||||||
|
'unsigned' => true,
|
||||||
|
]);
|
||||||
|
}
|
||||||
$column = $table->getColumn('last_activity');
|
$column = $table->getColumn('last_activity');
|
||||||
$column->setUnsigned(true);
|
$column->setUnsigned(true);
|
||||||
$column = $table->getColumn('last_check');
|
$column = $table->getColumn('last_check');
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace OC\Core\Migrations;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use OCP\DB\ISchemaWrapper;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use OCP\Migration\SimpleMigrationStep;
|
||||||
|
|
||||||
|
class Version21000Date20201120141228 extends SimpleMigrationStep {
|
||||||
|
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
|
||||||
|
/** @var ISchemaWrapper $schema */
|
||||||
|
$schema = $schemaClosure();
|
||||||
|
|
||||||
|
if ($schema->hasTable('authtoken')) {
|
||||||
|
$table = $schema->getTable('authtoken');
|
||||||
|
$loginNameColumn = $table->getColumn('login_name');
|
||||||
|
if ($loginNameColumn->getLength() !== 255) {
|
||||||
|
$loginNameColumn->setLength(255);
|
||||||
|
}
|
||||||
|
$table->changeColumn('type', [
|
||||||
|
'notnull' => false,
|
||||||
|
]);
|
||||||
|
$table->changeColumn('remember', [
|
||||||
|
'notnull' => false,
|
||||||
|
]);
|
||||||
|
$table->changeColumn('last_activity', [
|
||||||
|
'notnull' => false,
|
||||||
|
]);
|
||||||
|
$table->changeColumn('last_check', [
|
||||||
|
'notnull' => false,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($schema->hasTable('dav_job_status')) {
|
||||||
|
$schema->dropTable('dav_job_status');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($schema->hasTable('systemtag')) {
|
||||||
|
$table = $schema->getTable('systemtag');
|
||||||
|
if ($table->hasColumn('systemtag')) {
|
||||||
|
$table->dropColumn('assignable');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($schema->hasTable('share')) {
|
||||||
|
$table = $schema->getTable('share');
|
||||||
|
if ($table->hasColumn('attributes')) {
|
||||||
|
$table->dropColumn('attributes');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($schema->hasTable('jobs')) {
|
||||||
|
$table = $schema->getTable('jobs');
|
||||||
|
$table->changeColumn('execution_duration', [
|
||||||
|
'notnull' => false,
|
||||||
|
'default' => 0,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $schema;
|
||||||
|
}
|
||||||
|
}
|
|
@ -924,6 +924,7 @@ return array(
|
||||||
'OC\\Core\\Migrations\\Version20000Date20201109081918' => $baseDir . '/core/Migrations/Version20000Date20201109081918.php',
|
'OC\\Core\\Migrations\\Version20000Date20201109081918' => $baseDir . '/core/Migrations/Version20000Date20201109081918.php',
|
||||||
'OC\\Core\\Migrations\\Version20000Date20201109081919' => $baseDir . '/core/Migrations/Version20000Date20201109081919.php',
|
'OC\\Core\\Migrations\\Version20000Date20201109081919' => $baseDir . '/core/Migrations/Version20000Date20201109081919.php',
|
||||||
'OC\\Core\\Migrations\\Version20000Date20201111081915' => $baseDir . '/core/Migrations/Version20000Date20201111081915.php',
|
'OC\\Core\\Migrations\\Version20000Date20201111081915' => $baseDir . '/core/Migrations/Version20000Date20201111081915.php',
|
||||||
|
'OC\\Core\\Migrations\\Version21000Date20201120141228' => $baseDir . '/core/Migrations/Version21000Date20201120141228.php',
|
||||||
'OC\\Core\\Notification\\CoreNotifier' => $baseDir . '/core/Notification/CoreNotifier.php',
|
'OC\\Core\\Notification\\CoreNotifier' => $baseDir . '/core/Notification/CoreNotifier.php',
|
||||||
'OC\\Core\\Service\\LoginFlowV2Service' => $baseDir . '/core/Service/LoginFlowV2Service.php',
|
'OC\\Core\\Service\\LoginFlowV2Service' => $baseDir . '/core/Service/LoginFlowV2Service.php',
|
||||||
'OC\\DB\\Adapter' => $baseDir . '/lib/private/DB/Adapter.php',
|
'OC\\DB\\Adapter' => $baseDir . '/lib/private/DB/Adapter.php',
|
||||||
|
@ -1261,8 +1262,14 @@ return array(
|
||||||
'OC\\Repair\\NC20\\EncryptionMigration' => $baseDir . '/lib/private/Repair/NC20/EncryptionMigration.php',
|
'OC\\Repair\\NC20\\EncryptionMigration' => $baseDir . '/lib/private/Repair/NC20/EncryptionMigration.php',
|
||||||
'OC\\Repair\\NC20\\ShippedDashboardEnable' => $baseDir . '/lib/private/Repair/NC20/ShippedDashboardEnable.php',
|
'OC\\Repair\\NC20\\ShippedDashboardEnable' => $baseDir . '/lib/private/Repair/NC20/ShippedDashboardEnable.php',
|
||||||
'OC\\Repair\\OldGroupMembershipShares' => $baseDir . '/lib/private/Repair/OldGroupMembershipShares.php',
|
'OC\\Repair\\OldGroupMembershipShares' => $baseDir . '/lib/private/Repair/OldGroupMembershipShares.php',
|
||||||
|
'OC\\Repair\\Owncloud\\CleanPreviews' => $baseDir . '/lib/private/Repair/Owncloud/CleanPreviews.php',
|
||||||
|
'OC\\Repair\\Owncloud\\CleanPreviewsBackgroundJob' => $baseDir . '/lib/private/Repair/Owncloud/CleanPreviewsBackgroundJob.php',
|
||||||
'OC\\Repair\\Owncloud\\DropAccountTermsTable' => $baseDir . '/lib/private/Repair/Owncloud/DropAccountTermsTable.php',
|
'OC\\Repair\\Owncloud\\DropAccountTermsTable' => $baseDir . '/lib/private/Repair/Owncloud/DropAccountTermsTable.php',
|
||||||
|
'OC\\Repair\\Owncloud\\InstallCoreBundle' => $baseDir . '/lib/private/Repair/Owncloud/InstallCoreBundle.php',
|
||||||
|
'OC\\Repair\\Owncloud\\MoveAvatars' => $baseDir . '/lib/private/Repair/Owncloud/MoveAvatars.php',
|
||||||
|
'OC\\Repair\\Owncloud\\MoveAvatarsBackgroundJob' => $baseDir . '/lib/private/Repair/Owncloud/MoveAvatarsBackgroundJob.php',
|
||||||
'OC\\Repair\\Owncloud\\SaveAccountsTableData' => $baseDir . '/lib/private/Repair/Owncloud/SaveAccountsTableData.php',
|
'OC\\Repair\\Owncloud\\SaveAccountsTableData' => $baseDir . '/lib/private/Repair/Owncloud/SaveAccountsTableData.php',
|
||||||
|
'OC\\Repair\\Owncloud\\UpdateLanguageCodes' => $baseDir . '/lib/private/Repair/Owncloud/UpdateLanguageCodes.php',
|
||||||
'OC\\Repair\\RemoveLinkShares' => $baseDir . '/lib/private/Repair/RemoveLinkShares.php',
|
'OC\\Repair\\RemoveLinkShares' => $baseDir . '/lib/private/Repair/RemoveLinkShares.php',
|
||||||
'OC\\Repair\\RepairInvalidShares' => $baseDir . '/lib/private/Repair/RepairInvalidShares.php',
|
'OC\\Repair\\RepairInvalidShares' => $baseDir . '/lib/private/Repair/RepairInvalidShares.php',
|
||||||
'OC\\Repair\\RepairMimeTypes' => $baseDir . '/lib/private/Repair/RepairMimeTypes.php',
|
'OC\\Repair\\RepairMimeTypes' => $baseDir . '/lib/private/Repair/RepairMimeTypes.php',
|
||||||
|
|
|
@ -953,6 +953,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
|
||||||
'OC\\Core\\Migrations\\Version20000Date20201109081918' => __DIR__ . '/../../..' . '/core/Migrations/Version20000Date20201109081918.php',
|
'OC\\Core\\Migrations\\Version20000Date20201109081918' => __DIR__ . '/../../..' . '/core/Migrations/Version20000Date20201109081918.php',
|
||||||
'OC\\Core\\Migrations\\Version20000Date20201109081919' => __DIR__ . '/../../..' . '/core/Migrations/Version20000Date20201109081919.php',
|
'OC\\Core\\Migrations\\Version20000Date20201109081919' => __DIR__ . '/../../..' . '/core/Migrations/Version20000Date20201109081919.php',
|
||||||
'OC\\Core\\Migrations\\Version20000Date20201111081915' => __DIR__ . '/../../..' . '/core/Migrations/Version20000Date20201111081915.php',
|
'OC\\Core\\Migrations\\Version20000Date20201111081915' => __DIR__ . '/../../..' . '/core/Migrations/Version20000Date20201111081915.php',
|
||||||
|
'OC\\Core\\Migrations\\Version21000Date20201120141228' => __DIR__ . '/../../..' . '/core/Migrations/Version21000Date20201120141228.php',
|
||||||
'OC\\Core\\Notification\\CoreNotifier' => __DIR__ . '/../../..' . '/core/Notification/CoreNotifier.php',
|
'OC\\Core\\Notification\\CoreNotifier' => __DIR__ . '/../../..' . '/core/Notification/CoreNotifier.php',
|
||||||
'OC\\Core\\Service\\LoginFlowV2Service' => __DIR__ . '/../../..' . '/core/Service/LoginFlowV2Service.php',
|
'OC\\Core\\Service\\LoginFlowV2Service' => __DIR__ . '/../../..' . '/core/Service/LoginFlowV2Service.php',
|
||||||
'OC\\DB\\Adapter' => __DIR__ . '/../../..' . '/lib/private/DB/Adapter.php',
|
'OC\\DB\\Adapter' => __DIR__ . '/../../..' . '/lib/private/DB/Adapter.php',
|
||||||
|
@ -1290,8 +1291,14 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
|
||||||
'OC\\Repair\\NC20\\EncryptionMigration' => __DIR__ . '/../../..' . '/lib/private/Repair/NC20/EncryptionMigration.php',
|
'OC\\Repair\\NC20\\EncryptionMigration' => __DIR__ . '/../../..' . '/lib/private/Repair/NC20/EncryptionMigration.php',
|
||||||
'OC\\Repair\\NC20\\ShippedDashboardEnable' => __DIR__ . '/../../..' . '/lib/private/Repair/NC20/ShippedDashboardEnable.php',
|
'OC\\Repair\\NC20\\ShippedDashboardEnable' => __DIR__ . '/../../..' . '/lib/private/Repair/NC20/ShippedDashboardEnable.php',
|
||||||
'OC\\Repair\\OldGroupMembershipShares' => __DIR__ . '/../../..' . '/lib/private/Repair/OldGroupMembershipShares.php',
|
'OC\\Repair\\OldGroupMembershipShares' => __DIR__ . '/../../..' . '/lib/private/Repair/OldGroupMembershipShares.php',
|
||||||
|
'OC\\Repair\\Owncloud\\CleanPreviews' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/CleanPreviews.php',
|
||||||
|
'OC\\Repair\\Owncloud\\CleanPreviewsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/CleanPreviewsBackgroundJob.php',
|
||||||
'OC\\Repair\\Owncloud\\DropAccountTermsTable' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/DropAccountTermsTable.php',
|
'OC\\Repair\\Owncloud\\DropAccountTermsTable' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/DropAccountTermsTable.php',
|
||||||
|
'OC\\Repair\\Owncloud\\InstallCoreBundle' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/InstallCoreBundle.php',
|
||||||
|
'OC\\Repair\\Owncloud\\MoveAvatars' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/MoveAvatars.php',
|
||||||
|
'OC\\Repair\\Owncloud\\MoveAvatarsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/MoveAvatarsBackgroundJob.php',
|
||||||
'OC\\Repair\\Owncloud\\SaveAccountsTableData' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/SaveAccountsTableData.php',
|
'OC\\Repair\\Owncloud\\SaveAccountsTableData' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/SaveAccountsTableData.php',
|
||||||
|
'OC\\Repair\\Owncloud\\UpdateLanguageCodes' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/UpdateLanguageCodes.php',
|
||||||
'OC\\Repair\\RemoveLinkShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RemoveLinkShares.php',
|
'OC\\Repair\\RemoveLinkShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RemoveLinkShares.php',
|
||||||
'OC\\Repair\\RepairInvalidShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairInvalidShares.php',
|
'OC\\Repair\\RepairInvalidShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairInvalidShares.php',
|
||||||
'OC\\Repair\\RepairMimeTypes' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairMimeTypes.php',
|
'OC\\Repair\\RepairMimeTypes' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairMimeTypes.php',
|
||||||
|
|
|
@ -124,6 +124,11 @@ class MigrationService {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($this->connection->tableExists('migrations') && \OC::$server->getConfig()->getAppValue('core', 'vendor', '') !== 'owncloud') {
|
||||||
|
$this->migrationTableCreated = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
$schema = new SchemaWrapper($this->connection);
|
$schema = new SchemaWrapper($this->connection);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
namespace OC;
|
namespace OC;
|
||||||
|
|
||||||
|
use OC\App\AppStore\Bundles\BundleFetcher;
|
||||||
use OC\Avatar\AvatarManager;
|
use OC\Avatar\AvatarManager;
|
||||||
use OC\Repair\AddCleanupUpdaterBackupsJob;
|
use OC\Repair\AddCleanupUpdaterBackupsJob;
|
||||||
use OC\Repair\CleanTags;
|
use OC\Repair\CleanTags;
|
||||||
|
@ -41,7 +42,11 @@ use OC\Repair\ClearFrontendCaches;
|
||||||
use OC\Repair\ClearGeneratedAvatarCache;
|
use OC\Repair\ClearGeneratedAvatarCache;
|
||||||
use OC\Repair\Collation;
|
use OC\Repair\Collation;
|
||||||
use OC\Repair\MoveUpdaterStepFile;
|
use OC\Repair\MoveUpdaterStepFile;
|
||||||
|
use OC\Repair\Owncloud\CleanPreviews;
|
||||||
use OC\Repair\NC11\FixMountStorages;
|
use OC\Repair\NC11\FixMountStorages;
|
||||||
|
use OC\Repair\Owncloud\MoveAvatars;
|
||||||
|
use OC\Repair\Owncloud\InstallCoreBundle;
|
||||||
|
use OC\Repair\Owncloud\UpdateLanguageCodes;
|
||||||
use OC\Repair\NC13\AddLogRotateJob;
|
use OC\Repair\NC13\AddLogRotateJob;
|
||||||
use OC\Repair\NC14\AddPreviewBackgroundCleanupJob;
|
use OC\Repair\NC14\AddPreviewBackgroundCleanupJob;
|
||||||
use OC\Repair\NC16\AddClenupLoginFlowV2BackgroundJob;
|
use OC\Repair\NC16\AddClenupLoginFlowV2BackgroundJob;
|
||||||
|
@ -148,7 +153,22 @@ class Repair implements IOutput {
|
||||||
new CleanTags(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager()),
|
new CleanTags(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager()),
|
||||||
new RepairInvalidShares(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()),
|
new RepairInvalidShares(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()),
|
||||||
new MoveUpdaterStepFile(\OC::$server->getConfig()),
|
new MoveUpdaterStepFile(\OC::$server->getConfig()),
|
||||||
|
new MoveAvatars(
|
||||||
|
\OC::$server->getJobList(),
|
||||||
|
\OC::$server->getConfig()
|
||||||
|
),
|
||||||
|
new CleanPreviews(
|
||||||
|
\OC::$server->getJobList(),
|
||||||
|
\OC::$server->getUserManager(),
|
||||||
|
\OC::$server->getConfig()
|
||||||
|
),
|
||||||
new FixMountStorages(\OC::$server->getDatabaseConnection()),
|
new FixMountStorages(\OC::$server->getDatabaseConnection()),
|
||||||
|
new UpdateLanguageCodes(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig()),
|
||||||
|
new InstallCoreBundle(
|
||||||
|
\OC::$server->query(BundleFetcher::class),
|
||||||
|
\OC::$server->getConfig(),
|
||||||
|
\OC::$server->query(Installer::class)
|
||||||
|
),
|
||||||
new AddLogRotateJob(\OC::$server->getJobList()),
|
new AddLogRotateJob(\OC::$server->getJobList()),
|
||||||
new ClearFrontendCaches(\OC::$server->getMemCacheFactory(), \OC::$server->query(SCSSCacher::class), \OC::$server->query(JSCombiner::class)),
|
new ClearFrontendCaches(\OC::$server->getMemCacheFactory(), \OC::$server->query(SCSSCacher::class), \OC::$server->query(JSCombiner::class)),
|
||||||
new ClearGeneratedAvatarCache(\OC::$server->getConfig(), \OC::$server->query(AvatarManager::class)),
|
new ClearGeneratedAvatarCache(\OC::$server->getConfig(), \OC::$server->query(AvatarManager::class)),
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright 2016 Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
namespace OC\Repair\Owncloud;
|
||||||
|
|
||||||
|
use OCP\BackgroundJob\IJobList;
|
||||||
|
use OCP\IConfig;
|
||||||
|
use OCP\IUser;
|
||||||
|
use OCP\IUserManager;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use OCP\Migration\IRepairStep;
|
||||||
|
|
||||||
|
class CleanPreviews implements IRepairStep {
|
||||||
|
|
||||||
|
/** @var IJobList */
|
||||||
|
private $jobList;
|
||||||
|
|
||||||
|
/** @var IUserManager */
|
||||||
|
private $userManager;
|
||||||
|
|
||||||
|
/** @var IConfig */
|
||||||
|
private $config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MoveAvatars constructor.
|
||||||
|
*
|
||||||
|
* @param IJobList $jobList
|
||||||
|
* @param IUserManager $userManager
|
||||||
|
* @param IConfig $config
|
||||||
|
*/
|
||||||
|
public function __construct(IJobList $jobList,
|
||||||
|
IUserManager $userManager,
|
||||||
|
IConfig $config) {
|
||||||
|
$this->jobList = $jobList;
|
||||||
|
$this->userManager = $userManager;
|
||||||
|
$this->config = $config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getName() {
|
||||||
|
return 'Add preview cleanup background jobs';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function run(IOutput $output) {
|
||||||
|
if (!$this->config->getAppValue('core', 'previewsCleanedUp', false)) {
|
||||||
|
$this->userManager->callForSeenUsers(function (IUser $user) {
|
||||||
|
$this->jobList->add(CleanPreviewsBackgroundJob::class, ['uid' => $user->getUID()]);
|
||||||
|
});
|
||||||
|
$this->config->setAppValue('core', 'previewsCleanedUp', '1');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,132 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright 2016 Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
namespace OC\Repair\Owncloud;
|
||||||
|
|
||||||
|
use OC\BackgroundJob\QueuedJob;
|
||||||
|
use OCP\AppFramework\Utility\ITimeFactory;
|
||||||
|
use OCP\BackgroundJob\IJobList;
|
||||||
|
use OCP\Files\Folder;
|
||||||
|
use OCP\Files\IRootFolder;
|
||||||
|
use OCP\Files\NotFoundException;
|
||||||
|
use OCP\Files\NotPermittedException;
|
||||||
|
use OCP\ILogger;
|
||||||
|
use OCP\IUserManager;
|
||||||
|
|
||||||
|
class CleanPreviewsBackgroundJob extends QueuedJob {
|
||||||
|
/** @var IRootFolder */
|
||||||
|
private $rootFolder;
|
||||||
|
|
||||||
|
/** @var ILogger */
|
||||||
|
private $logger;
|
||||||
|
|
||||||
|
/** @var IJobList */
|
||||||
|
private $jobList;
|
||||||
|
|
||||||
|
/** @var ITimeFactory */
|
||||||
|
private $timeFactory;
|
||||||
|
|
||||||
|
/** @var IUserManager */
|
||||||
|
private $userManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CleanPreviewsBackgroundJob constructor.
|
||||||
|
*
|
||||||
|
* @param IRootFolder $rootFolder
|
||||||
|
* @param ILogger $logger
|
||||||
|
* @param IJobList $jobList
|
||||||
|
* @param ITimeFactory $timeFactory
|
||||||
|
* @param IUserManager $userManager
|
||||||
|
*/
|
||||||
|
public function __construct(IRootFolder $rootFolder,
|
||||||
|
ILogger $logger,
|
||||||
|
IJobList $jobList,
|
||||||
|
ITimeFactory $timeFactory,
|
||||||
|
IUserManager $userManager) {
|
||||||
|
$this->rootFolder = $rootFolder;
|
||||||
|
$this->logger = $logger;
|
||||||
|
$this->jobList = $jobList;
|
||||||
|
$this->timeFactory = $timeFactory;
|
||||||
|
$this->userManager = $userManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function run($arguments) {
|
||||||
|
$uid = $arguments['uid'];
|
||||||
|
if (!$this->userManager->userExists($uid)) {
|
||||||
|
$this->logger->info('User no longer exists, skip user ' . $uid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$this->logger->info('Started preview cleanup for ' . $uid);
|
||||||
|
$empty = $this->cleanupPreviews($uid);
|
||||||
|
|
||||||
|
if (!$empty) {
|
||||||
|
$this->jobList->add(self::class, ['uid' => $uid]);
|
||||||
|
$this->logger->info('New preview cleanup scheduled for ' . $uid);
|
||||||
|
} else {
|
||||||
|
$this->logger->info('Preview cleanup done for ' . $uid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $uid
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function cleanupPreviews($uid) {
|
||||||
|
try {
|
||||||
|
$userFolder = $this->rootFolder->getUserFolder($uid);
|
||||||
|
} catch (NotFoundException $e) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$userRoot = $userFolder->getParent();
|
||||||
|
|
||||||
|
try {
|
||||||
|
/** @var Folder $thumbnailFolder */
|
||||||
|
$thumbnailFolder = $userRoot->get('thumbnails');
|
||||||
|
} catch (NotFoundException $e) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$thumbnails = $thumbnailFolder->getDirectoryListing();
|
||||||
|
|
||||||
|
$start = $this->timeFactory->getTime();
|
||||||
|
foreach ($thumbnails as $thumbnail) {
|
||||||
|
try {
|
||||||
|
$thumbnail->delete();
|
||||||
|
} catch (NotPermittedException $e) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($this->timeFactory->getTime() - $start) > 15) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$thumbnailFolder->delete();
|
||||||
|
} catch (NotPermittedException $e) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
|
||||||
|
*
|
||||||
|
* @author Lukas Reschke <lukas@statuscode.ch>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace OC\Repair\Owncloud;
|
||||||
|
|
||||||
|
use OC\App\AppStore\Bundles\BundleFetcher;
|
||||||
|
use OC\Installer;
|
||||||
|
use OCP\IConfig;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use OCP\Migration\IRepairStep;
|
||||||
|
|
||||||
|
class InstallCoreBundle implements IRepairStep {
|
||||||
|
/** @var BundleFetcher */
|
||||||
|
private $bundleFetcher;
|
||||||
|
/** @var IConfig */
|
||||||
|
private $config;
|
||||||
|
/** @var Installer */
|
||||||
|
private $installer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param BundleFetcher $bundleFetcher
|
||||||
|
* @param IConfig $config
|
||||||
|
* @param Installer $installer
|
||||||
|
*/
|
||||||
|
public function __construct(BundleFetcher $bundleFetcher,
|
||||||
|
IConfig $config,
|
||||||
|
Installer $installer) {
|
||||||
|
$this->bundleFetcher = $bundleFetcher;
|
||||||
|
$this->config = $config;
|
||||||
|
$this->installer = $installer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getName() {
|
||||||
|
return 'Install new core bundle components';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function run(IOutput $output) {
|
||||||
|
$versionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
|
||||||
|
|
||||||
|
if (version_compare($versionFromBeforeUpdate, '12.0.0.14', '>')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$defaultBundle = $this->bundleFetcher->getDefaultInstallationBundle();
|
||||||
|
foreach ($defaultBundle as $bundle) {
|
||||||
|
try {
|
||||||
|
$this->installer->installAppBundle($bundle);
|
||||||
|
$output->info('Successfully installed core app bundle.');
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$output->warning('Could not install core app bundle: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright 2016 Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @author Morris Jobke <hey@morrisjobke.de>
|
||||||
|
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
namespace OC\Repair\Owncloud;
|
||||||
|
|
||||||
|
use OCP\BackgroundJob\IJobList;
|
||||||
|
use OCP\IConfig;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use OCP\Migration\IRepairStep;
|
||||||
|
|
||||||
|
class MoveAvatars implements IRepairStep {
|
||||||
|
|
||||||
|
/** @var IJobList */
|
||||||
|
private $jobList;
|
||||||
|
|
||||||
|
/** @var IConfig */
|
||||||
|
private $config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MoveAvatars constructor.
|
||||||
|
*
|
||||||
|
* @param IJobList $jobList
|
||||||
|
* @param IConfig $config
|
||||||
|
*/
|
||||||
|
public function __construct(IJobList $jobList,
|
||||||
|
IConfig $config) {
|
||||||
|
$this->jobList = $jobList;
|
||||||
|
$this->config = $config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getName() {
|
||||||
|
return 'Add move avatar background job';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function run(IOutput $output) {
|
||||||
|
// only run once
|
||||||
|
if ($this->config->getAppValue('core', 'moveavatarsdone') === 'yes') {
|
||||||
|
$output->info('Repair step already executed');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ($this->config->getSystemValue('enable_avatars', true) === false) {
|
||||||
|
$output->info('Avatars are disabled');
|
||||||
|
} else {
|
||||||
|
$output->info('Add background job');
|
||||||
|
$this->jobList->add(MoveAvatarsBackgroundJob::class);
|
||||||
|
// if all were done, no need to redo the repair during next upgrade
|
||||||
|
$this->config->setAppValue('core', 'moveavatarsdone', 'yes');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,116 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright 2016 Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @author Joas Schilling <coding@schilljs.com>
|
||||||
|
* @author Morris Jobke <hey@morrisjobke.de>
|
||||||
|
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
namespace OC\Repair\Owncloud;
|
||||||
|
|
||||||
|
use OC\BackgroundJob\QueuedJob;
|
||||||
|
use OCP\Files\IRootFolder;
|
||||||
|
use OCP\Files\NotFoundException;
|
||||||
|
use OCP\Files\Storage;
|
||||||
|
use OCP\IAvatarManager;
|
||||||
|
use OCP\IUser;
|
||||||
|
use OCP\IUserManager;
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
|
|
||||||
|
class MoveAvatarsBackgroundJob extends QueuedJob {
|
||||||
|
|
||||||
|
/** @var IUserManager */
|
||||||
|
private $userManager;
|
||||||
|
|
||||||
|
/** @var LoggerInterface */
|
||||||
|
private $logger;
|
||||||
|
|
||||||
|
/** @var IAvatarManager */
|
||||||
|
private $avatarManager;
|
||||||
|
|
||||||
|
/** @var Storage */
|
||||||
|
private $owncloudAvatarStorage;
|
||||||
|
|
||||||
|
public function __construct(IUserManager $userManager, LoggerInterface $logger, IAvatarManager $avatarManager, IRootFolder $rootFolder) {
|
||||||
|
$this->userManager = $userManager;
|
||||||
|
$this->logger = $logger;
|
||||||
|
$this->avatarManager = $avatarManager;
|
||||||
|
try {
|
||||||
|
$this->owncloudAvatarStorage = $rootFolder->get('avatars')->getStorage();
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function run($arguments) {
|
||||||
|
$this->logger->info('Started migrating avatars to AppData folder');
|
||||||
|
$this->moveAvatars();
|
||||||
|
$this->logger->info('All avatars migrated to AppData folder');
|
||||||
|
}
|
||||||
|
|
||||||
|
private function moveAvatars(): void {
|
||||||
|
if (!$this->owncloudAvatarStorage) {
|
||||||
|
$this->logger->info('No legacy avatars available, skipping migration');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$counter = 0;
|
||||||
|
$this->userManager->callForSeenUsers(function (IUser $user) use ($counter) {
|
||||||
|
$uid = $user->getUID();
|
||||||
|
|
||||||
|
$path = 'avatars/' . $this->buildOwnCloudAvatarPath($uid);
|
||||||
|
$avatar = $this->avatarManager->getAvatar($uid);
|
||||||
|
try {
|
||||||
|
$avatarPath = $path . '/avatar.' . $this->getExtension($path);
|
||||||
|
$resource = $this->owncloudAvatarStorage->fopen($avatarPath, 'r');
|
||||||
|
if ($resource) {
|
||||||
|
$avatar->set($resource);
|
||||||
|
fclose($resource);
|
||||||
|
} else {
|
||||||
|
throw new \Exception('Failed to open old avatar file for reading');
|
||||||
|
}
|
||||||
|
} catch (NotFoundException $e) {
|
||||||
|
// In case there is no avatar we can just skip
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
$this->logger->error('Failed to migrate avatar for user ' . $uid, ['exception' => $e]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$counter++;
|
||||||
|
if ($counter % 100 === 0) {
|
||||||
|
$this->logger->info('{amount} avatars migrated', ['amount' => $counter]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
private function getExtension(string $path): string {
|
||||||
|
if ($this->owncloudAvatarStorage->file_exists("{$path}/avatar.jpg")) {
|
||||||
|
return 'jpg';
|
||||||
|
}
|
||||||
|
if ($this->owncloudAvatarStorage->file_exists("{$path}/avatar.png")) {
|
||||||
|
return 'png';
|
||||||
|
}
|
||||||
|
throw new NotFoundException("{$path}/avatar.jpg|png");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function buildOwnCloudAvatarPath(string $userId): string {
|
||||||
|
return substr_replace(substr_replace(md5($userId), '/', 4, 0), '/', 2, 0);
|
||||||
|
}
|
||||||
|
}
|
|
@ -78,6 +78,15 @@ class SaveAccountsTableData implements IRepairStep {
|
||||||
$numUsers = $this->runStep($offset);
|
$numUsers = $this->runStep($offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// oc_persistent_locks will be removed later on anyways so we can just drop and ignore any foreign key constraints here
|
||||||
|
$tableName = $this->config->getSystemValue('dbtableprefix', 'oc_') . 'persistent_locks';
|
||||||
|
$schema = $this->db->createSchema();
|
||||||
|
$table = $schema->getTable($tableName);
|
||||||
|
foreach ($table->getForeignKeys() as $foreignKey) {
|
||||||
|
$table->removeForeignKey($foreignKey->getName());
|
||||||
|
}
|
||||||
|
$this->db->migrateToSchema($schema);
|
||||||
|
|
||||||
// Remove the table
|
// Remove the table
|
||||||
if ($this->hasForeignKeyOnPersistentLocks) {
|
if ($this->hasForeignKeyOnPersistentLocks) {
|
||||||
$this->db->dropTable('persistent_locks');
|
$this->db->dropTable('persistent_locks');
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (c) 2016 Morris Jobke <hey@morrisjobke.de>
|
||||||
|
*
|
||||||
|
* @author Joas Schilling <coding@schilljs.com>
|
||||||
|
* @author Morris Jobke <hey@morrisjobke.de>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace OC\Repair\Owncloud;
|
||||||
|
|
||||||
|
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||||
|
use OCP\IConfig;
|
||||||
|
use OCP\IDBConnection;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use OCP\Migration\IRepairStep;
|
||||||
|
|
||||||
|
class UpdateLanguageCodes implements IRepairStep {
|
||||||
|
/** @var IDBConnection */
|
||||||
|
private $connection;
|
||||||
|
|
||||||
|
/** @var IConfig */
|
||||||
|
private $config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param IDBConnection $connection
|
||||||
|
* @param IConfig $config
|
||||||
|
*/
|
||||||
|
public function __construct(IDBConnection $connection,
|
||||||
|
IConfig $config) {
|
||||||
|
$this->connection = $connection;
|
||||||
|
$this->config = $config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getName() {
|
||||||
|
return 'Repair language codes';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function run(IOutput $output) {
|
||||||
|
$versionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
|
||||||
|
|
||||||
|
if (version_compare($versionFromBeforeUpdate, '12.0.0.13', '>')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$languages = [
|
||||||
|
'bg_BG' => 'bg',
|
||||||
|
'cs_CZ' => 'cs',
|
||||||
|
'fi_FI' => 'fi',
|
||||||
|
'hu_HU' => 'hu',
|
||||||
|
'nb_NO' => 'nb',
|
||||||
|
'sk_SK' => 'sk',
|
||||||
|
'th_TH' => 'th',
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($languages as $oldCode => $newCode) {
|
||||||
|
$qb = $this->connection->getQueryBuilder();
|
||||||
|
|
||||||
|
$affectedRows = $qb->update('preferences')
|
||||||
|
->set('configvalue', $qb->createNamedParameter($newCode))
|
||||||
|
->where($qb->expr()->eq('appid', $qb->createNamedParameter('core')))
|
||||||
|
->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang')))
|
||||||
|
->andWhere($qb->expr()->eq('configvalue', $qb->createNamedParameter($oldCode), IQueryBuilder::PARAM_STR))
|
||||||
|
->execute();
|
||||||
|
|
||||||
|
$output->info('Changed ' . $affectedRows . ' setting(s) from "' . $oldCode . '" to "' . $newCode . '" in preferences table.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -46,6 +46,10 @@ class Capabilities implements IPublicCapability {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getCapabilities() {
|
public function getCapabilities() {
|
||||||
|
if (version_compare(\OC::$server->getConfig()->getSystemValue('version', '0.0.0.0'), '12.0.0.0', '<')) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'bruteforce' => [
|
'bruteforce' => [
|
||||||
'delay' => $this->throttler->getDelay($this->request->getRemoteAddress())
|
'delay' => $this->throttler->getDelay($this->request->getRemoteAddress())
|
||||||
|
|
|
@ -192,8 +192,12 @@ class Updater extends BasicEmitter {
|
||||||
$currentVendor = $this->config->getAppValue('core', 'vendor', '');
|
$currentVendor = $this->config->getAppValue('core', 'vendor', '');
|
||||||
|
|
||||||
// Vendor was not set correctly on install, so we have to white-list known versions
|
// Vendor was not set correctly on install, so we have to white-list known versions
|
||||||
if ($currentVendor === '' && isset($allowedPreviousVersions['owncloud'][$oldVersion])) {
|
if ($currentVendor === '' && (
|
||||||
|
isset($allowedPreviousVersions['owncloud'][$oldVersion]) ||
|
||||||
|
isset($allowedPreviousVersions['owncloud'][$majorMinor])
|
||||||
|
)) {
|
||||||
$currentVendor = 'owncloud';
|
$currentVendor = 'owncloud';
|
||||||
|
$this->config->setAppValue('core', 'vendor', $currentVendor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($currentVendor === 'nextcloud') {
|
if ($currentVendor === 'nextcloud') {
|
||||||
|
|
|
@ -0,0 +1,245 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
namespace Test\Repair\Owncloud;
|
||||||
|
|
||||||
|
use OC\Repair\Owncloud\CleanPreviewsBackgroundJob;
|
||||||
|
use OCP\AppFramework\Utility\ITimeFactory;
|
||||||
|
use OCP\BackgroundJob\IJobList;
|
||||||
|
use OCP\Files\Folder;
|
||||||
|
use OCP\Files\IRootFolder;
|
||||||
|
use OCP\Files\NotFoundException;
|
||||||
|
use OCP\Files\NotPermittedException;
|
||||||
|
use OCP\ILogger;
|
||||||
|
use OCP\IUserManager;
|
||||||
|
use Test\TestCase;
|
||||||
|
|
||||||
|
class CleanPreviewsBackgroundJobTest extends TestCase {
|
||||||
|
/** @var IRootFolder|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $rootFolder;
|
||||||
|
|
||||||
|
/** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $logger;
|
||||||
|
|
||||||
|
/** @var IJobList|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $jobList;
|
||||||
|
|
||||||
|
/** @var ITimeFactory|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $timeFactory;
|
||||||
|
|
||||||
|
/** @var CleanPreviewsBackgroundJob */
|
||||||
|
private $job;
|
||||||
|
|
||||||
|
/** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $userManager;
|
||||||
|
|
||||||
|
public function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->rootFolder = $this->createMock(IRootFolder::class);
|
||||||
|
$this->logger = $this->createMock(ILogger::class);
|
||||||
|
$this->jobList = $this->createMock(IJobList::class);
|
||||||
|
$this->timeFactory = $this->createMock(ITimeFactory::class);
|
||||||
|
$this->userManager = $this->createMock(IUserManager::class);
|
||||||
|
|
||||||
|
$this->userManager->expects($this->any())->method('userExists')->willReturn(true);
|
||||||
|
|
||||||
|
$this->job = new CleanPreviewsBackgroundJob(
|
||||||
|
$this->rootFolder,
|
||||||
|
$this->logger,
|
||||||
|
$this->jobList,
|
||||||
|
$this->timeFactory,
|
||||||
|
$this->userManager
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCleanupPreviewsUnfinished() {
|
||||||
|
$userFolder = $this->createMock(Folder::class);
|
||||||
|
$userRoot = $this->createMock(Folder::class);
|
||||||
|
$thumbnailFolder = $this->createMock(Folder::class);
|
||||||
|
|
||||||
|
$this->rootFolder->method('getUserFolder')
|
||||||
|
->with($this->equalTo('myuid'))
|
||||||
|
->willReturn($userFolder);
|
||||||
|
|
||||||
|
$userFolder->method('getParent')->willReturn($userRoot);
|
||||||
|
|
||||||
|
$userRoot->method('get')
|
||||||
|
->with($this->equalTo('thumbnails'))
|
||||||
|
->willReturn($thumbnailFolder);
|
||||||
|
|
||||||
|
$previewFolder1 = $this->createMock(Folder::class);
|
||||||
|
|
||||||
|
$previewFolder1->expects($this->once())
|
||||||
|
->method('delete');
|
||||||
|
|
||||||
|
$thumbnailFolder->method('getDirectoryListing')
|
||||||
|
->willReturn([$previewFolder1]);
|
||||||
|
$thumbnailFolder->expects($this->never())
|
||||||
|
->method('delete');
|
||||||
|
|
||||||
|
$this->timeFactory->method('getTime')
|
||||||
|
->will($this->onConsecutiveCalls(100, 200));
|
||||||
|
|
||||||
|
$this->jobList->expects($this->once())
|
||||||
|
->method('add')
|
||||||
|
->with(
|
||||||
|
$this->equalTo(CleanPreviewsBackgroundJob::class),
|
||||||
|
$this->equalTo(['uid' => 'myuid'])
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->logger->expects($this->at(0))
|
||||||
|
->method('info')
|
||||||
|
->with($this->equalTo('Started preview cleanup for myuid'));
|
||||||
|
$this->logger->expects($this->at(1))
|
||||||
|
->method('info')
|
||||||
|
->with($this->equalTo('New preview cleanup scheduled for myuid'));
|
||||||
|
|
||||||
|
$this->job->run(['uid' => 'myuid']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCleanupPreviewsFinished() {
|
||||||
|
$userFolder = $this->createMock(Folder::class);
|
||||||
|
$userRoot = $this->createMock(Folder::class);
|
||||||
|
$thumbnailFolder = $this->createMock(Folder::class);
|
||||||
|
|
||||||
|
$this->rootFolder->method('getUserFolder')
|
||||||
|
->with($this->equalTo('myuid'))
|
||||||
|
->willReturn($userFolder);
|
||||||
|
|
||||||
|
$userFolder->method('getParent')->willReturn($userRoot);
|
||||||
|
|
||||||
|
$userRoot->method('get')
|
||||||
|
->with($this->equalTo('thumbnails'))
|
||||||
|
->willReturn($thumbnailFolder);
|
||||||
|
|
||||||
|
$previewFolder1 = $this->createMock(Folder::class);
|
||||||
|
|
||||||
|
$previewFolder1->expects($this->once())
|
||||||
|
->method('delete');
|
||||||
|
|
||||||
|
$thumbnailFolder->method('getDirectoryListing')
|
||||||
|
->willReturn([$previewFolder1]);
|
||||||
|
|
||||||
|
$this->timeFactory->method('getTime')
|
||||||
|
->will($this->onConsecutiveCalls(100, 101));
|
||||||
|
|
||||||
|
$this->jobList->expects($this->never())
|
||||||
|
->method('add');
|
||||||
|
|
||||||
|
$this->logger->expects($this->at(0))
|
||||||
|
->method('info')
|
||||||
|
->with($this->equalTo('Started preview cleanup for myuid'));
|
||||||
|
$this->logger->expects($this->at(1))
|
||||||
|
->method('info')
|
||||||
|
->with($this->equalTo('Preview cleanup done for myuid'));
|
||||||
|
|
||||||
|
$thumbnailFolder->expects($this->once())
|
||||||
|
->method('delete');
|
||||||
|
|
||||||
|
$this->job->run(['uid' => 'myuid']);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testNoUserFolder() {
|
||||||
|
$this->rootFolder->method('getUserFolder')
|
||||||
|
->with($this->equalTo('myuid'))
|
||||||
|
->willThrowException(new NotFoundException());
|
||||||
|
|
||||||
|
$this->logger->expects($this->at(0))
|
||||||
|
->method('info')
|
||||||
|
->with($this->equalTo('Started preview cleanup for myuid'));
|
||||||
|
$this->logger->expects($this->at(1))
|
||||||
|
->method('info')
|
||||||
|
->with($this->equalTo('Preview cleanup done for myuid'));
|
||||||
|
|
||||||
|
$this->job->run(['uid' => 'myuid']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testNoThumbnailFolder() {
|
||||||
|
$userFolder = $this->createMock(Folder::class);
|
||||||
|
$userRoot = $this->createMock(Folder::class);
|
||||||
|
|
||||||
|
$this->rootFolder->method('getUserFolder')
|
||||||
|
->with($this->equalTo('myuid'))
|
||||||
|
->willReturn($userFolder);
|
||||||
|
|
||||||
|
$userFolder->method('getParent')->willReturn($userRoot);
|
||||||
|
|
||||||
|
$userRoot->method('get')
|
||||||
|
->with($this->equalTo('thumbnails'))
|
||||||
|
->willThrowException(new NotFoundException());
|
||||||
|
|
||||||
|
$this->logger->expects($this->at(0))
|
||||||
|
->method('info')
|
||||||
|
->with($this->equalTo('Started preview cleanup for myuid'));
|
||||||
|
$this->logger->expects($this->at(1))
|
||||||
|
->method('info')
|
||||||
|
->with($this->equalTo('Preview cleanup done for myuid'));
|
||||||
|
|
||||||
|
$this->job->run(['uid' => 'myuid']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testNotPermittedToDelete() {
|
||||||
|
$userFolder = $this->createMock(Folder::class);
|
||||||
|
$userRoot = $this->createMock(Folder::class);
|
||||||
|
$thumbnailFolder = $this->createMock(Folder::class);
|
||||||
|
|
||||||
|
$this->rootFolder->method('getUserFolder')
|
||||||
|
->with($this->equalTo('myuid'))
|
||||||
|
->willReturn($userFolder);
|
||||||
|
|
||||||
|
$userFolder->method('getParent')->willReturn($userRoot);
|
||||||
|
|
||||||
|
$userRoot->method('get')
|
||||||
|
->with($this->equalTo('thumbnails'))
|
||||||
|
->willReturn($thumbnailFolder);
|
||||||
|
|
||||||
|
$previewFolder1 = $this->createMock(Folder::class);
|
||||||
|
|
||||||
|
$previewFolder1->expects($this->once())
|
||||||
|
->method('delete')
|
||||||
|
->willThrowException(new NotPermittedException());
|
||||||
|
|
||||||
|
$thumbnailFolder->method('getDirectoryListing')
|
||||||
|
->willReturn([$previewFolder1]);
|
||||||
|
|
||||||
|
$this->timeFactory->method('getTime')
|
||||||
|
->will($this->onConsecutiveCalls(100, 101));
|
||||||
|
|
||||||
|
$this->jobList->expects($this->never())
|
||||||
|
->method('add');
|
||||||
|
|
||||||
|
$this->logger->expects($this->at(0))
|
||||||
|
->method('info')
|
||||||
|
->with($this->equalTo('Started preview cleanup for myuid'));
|
||||||
|
$this->logger->expects($this->at(1))
|
||||||
|
->method('info')
|
||||||
|
->with($this->equalTo('Preview cleanup done for myuid'));
|
||||||
|
|
||||||
|
$thumbnailFolder->expects($this->once())
|
||||||
|
->method('delete')
|
||||||
|
->willThrowException(new NotPermittedException());
|
||||||
|
|
||||||
|
$this->job->run(['uid' => 'myuid']);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,134 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
namespace Test\Repair\Owncloud;
|
||||||
|
|
||||||
|
use OC\Repair\Owncloud\CleanPreviews;
|
||||||
|
use OC\Repair\Owncloud\CleanPreviewsBackgroundJob;
|
||||||
|
use OCP\BackgroundJob\IJobList;
|
||||||
|
use OCP\IConfig;
|
||||||
|
use OCP\IUser;
|
||||||
|
use OCP\IUserManager;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use Test\TestCase;
|
||||||
|
|
||||||
|
class CleanPreviewsTest extends TestCase {
|
||||||
|
|
||||||
|
|
||||||
|
/** @var IJobList|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $jobList;
|
||||||
|
|
||||||
|
/** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $userManager;
|
||||||
|
|
||||||
|
/** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $config;
|
||||||
|
|
||||||
|
/** @var CleanPreviews */
|
||||||
|
private $repair;
|
||||||
|
|
||||||
|
public function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->jobList = $this->createMock(IJobList::class);
|
||||||
|
$this->userManager = $this->createMock(IUserManager::class);
|
||||||
|
$this->config = $this->createMock(IConfig::class);
|
||||||
|
|
||||||
|
$this->repair = new CleanPreviews(
|
||||||
|
$this->jobList,
|
||||||
|
$this->userManager,
|
||||||
|
$this->config
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetName() {
|
||||||
|
$this->assertSame('Add preview cleanup background jobs', $this->repair->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRun() {
|
||||||
|
$user1 = $this->createMock(IUser::class);
|
||||||
|
$user1->method('getUID')
|
||||||
|
->willReturn('user1');
|
||||||
|
$user2 = $this->createMock(IUser::class);
|
||||||
|
$user2->method('getUID')
|
||||||
|
->willReturn('user2');
|
||||||
|
|
||||||
|
$this->userManager->expects($this->once())
|
||||||
|
->method('callForSeenUsers')
|
||||||
|
->will($this->returnCallback(function (\Closure $function) use ($user1, $user2) {
|
||||||
|
$function($user1);
|
||||||
|
$function($user2);
|
||||||
|
}));
|
||||||
|
|
||||||
|
$this->jobList->expects($this->at(0))
|
||||||
|
->method('add')
|
||||||
|
->with(
|
||||||
|
$this->equalTo(CleanPreviewsBackgroundJob::class),
|
||||||
|
$this->equalTo(['uid' => 'user1'])
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->jobList->expects($this->at(1))
|
||||||
|
->method('add')
|
||||||
|
->with(
|
||||||
|
$this->equalTo(CleanPreviewsBackgroundJob::class),
|
||||||
|
$this->equalTo(['uid' => 'user2'])
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->config->expects($this->once())
|
||||||
|
->method('getAppValue')
|
||||||
|
->with(
|
||||||
|
$this->equalTo('core'),
|
||||||
|
$this->equalTo('previewsCleanedUp'),
|
||||||
|
$this->equalTo(false)
|
||||||
|
)->willReturn(false);
|
||||||
|
$this->config->expects($this->once())
|
||||||
|
->method('setAppValue')
|
||||||
|
->with(
|
||||||
|
$this->equalTo('core'),
|
||||||
|
$this->equalTo('previewsCleanedUp'),
|
||||||
|
$this->equalTo(1)
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->repair->run($this->createMock(IOutput::class));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testRunAlreadyDoone() {
|
||||||
|
$this->userManager->expects($this->never())
|
||||||
|
->method($this->anything());
|
||||||
|
|
||||||
|
$this->jobList->expects($this->never())
|
||||||
|
->method($this->anything());
|
||||||
|
|
||||||
|
$this->config->expects($this->once())
|
||||||
|
->method('getAppValue')
|
||||||
|
->with(
|
||||||
|
$this->equalTo('core'),
|
||||||
|
$this->equalTo('previewsCleanedUp'),
|
||||||
|
$this->equalTo(false)
|
||||||
|
)->willReturn('1');
|
||||||
|
$this->config->expects($this->never())
|
||||||
|
->method('setAppValue');
|
||||||
|
|
||||||
|
$this->repair->run($this->createMock(IOutput::class));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,142 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
|
||||||
|
*
|
||||||
|
* @author Lukas Reschke <lukas@statuscode.ch>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Test\Repair\Owncloud;
|
||||||
|
|
||||||
|
use OC\App\AppStore\Bundles\Bundle;
|
||||||
|
use OC\App\AppStore\Bundles\BundleFetcher;
|
||||||
|
use OC\Installer;
|
||||||
|
use OC\Repair\Owncloud\InstallCoreBundle;
|
||||||
|
use OCP\IConfig;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use Test\TestCase;
|
||||||
|
|
||||||
|
class InstallCoreBundleTest extends TestCase {
|
||||||
|
/** @var BundleFetcher|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $bundleFetcher;
|
||||||
|
/** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $config;
|
||||||
|
/** @var Installer|\PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $installer;
|
||||||
|
/** @var InstallCoreBundle */
|
||||||
|
private $installCoreBundle;
|
||||||
|
|
||||||
|
public function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
$this->bundleFetcher = $this->createMock(BundleFetcher::class);
|
||||||
|
$this->config = $this->createMock(IConfig::class);
|
||||||
|
$this->installer = $this->createMock(Installer::class);
|
||||||
|
|
||||||
|
$this->installCoreBundle = new InstallCoreBundle(
|
||||||
|
$this->bundleFetcher,
|
||||||
|
$this->config,
|
||||||
|
$this->installer
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetName() {
|
||||||
|
$this->assertSame('Install new core bundle components', $this->installCoreBundle->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRunOlder() {
|
||||||
|
$this->config
|
||||||
|
->expects($this->once())
|
||||||
|
->method('getSystemValue')
|
||||||
|
->with('version', '0.0.0')
|
||||||
|
->willReturn('12.0.0.15');
|
||||||
|
$this->bundleFetcher
|
||||||
|
->expects($this->never())
|
||||||
|
->method('getDefaultInstallationBundle');
|
||||||
|
/** @var IOutput|\PHPUnit_Framework_MockObject_MockObject $output */
|
||||||
|
$output = $this->createMock(IOutput::class);
|
||||||
|
$output
|
||||||
|
->expects($this->never())
|
||||||
|
->method('info');
|
||||||
|
$output
|
||||||
|
->expects($this->never())
|
||||||
|
->method('warning');
|
||||||
|
|
||||||
|
$this->installCoreBundle->run($output);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRunWithException() {
|
||||||
|
$this->config
|
||||||
|
->expects($this->once())
|
||||||
|
->method('getSystemValue')
|
||||||
|
->with('version', '0.0.0')
|
||||||
|
->willReturn('12.0.0.14');
|
||||||
|
$bundle = $this->createMock(Bundle::class);
|
||||||
|
$this->bundleFetcher
|
||||||
|
->expects($this->once())
|
||||||
|
->method('getDefaultInstallationBundle')
|
||||||
|
->willReturn([
|
||||||
|
$bundle,
|
||||||
|
]);
|
||||||
|
$this->installer
|
||||||
|
->expects($this->once())
|
||||||
|
->method('installAppBundle')
|
||||||
|
->with($bundle)
|
||||||
|
->willThrowException(new \Exception('ExceptionText'));
|
||||||
|
/** @var IOutput|\PHPUnit_Framework_MockObject_MockObject $output */
|
||||||
|
$output = $this->createMock(IOutput::class);
|
||||||
|
$output
|
||||||
|
->expects($this->never())
|
||||||
|
->method('info');
|
||||||
|
$output
|
||||||
|
->expects($this->once())
|
||||||
|
->method('warning')
|
||||||
|
->with('Could not install core app bundle: ExceptionText');
|
||||||
|
|
||||||
|
$this->installCoreBundle->run($output);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRun() {
|
||||||
|
$this->config
|
||||||
|
->expects($this->once())
|
||||||
|
->method('getSystemValue')
|
||||||
|
->with('version', '0.0.0')
|
||||||
|
->willReturn('12.0.0.14');
|
||||||
|
$bundle = $this->createMock(Bundle::class);
|
||||||
|
$this->bundleFetcher
|
||||||
|
->expects($this->once())
|
||||||
|
->method('getDefaultInstallationBundle')
|
||||||
|
->willReturn([
|
||||||
|
$bundle,
|
||||||
|
]);
|
||||||
|
$this->installer
|
||||||
|
->expects($this->once())
|
||||||
|
->method('installAppBundle')
|
||||||
|
->with($bundle);
|
||||||
|
/** @var IOutput|\PHPUnit_Framework_MockObject_MockObject $output */
|
||||||
|
$output = $this->createMock(IOutput::class);
|
||||||
|
$output
|
||||||
|
->expects($this->once())
|
||||||
|
->method('info')
|
||||||
|
->with('Successfully installed core app bundle.');
|
||||||
|
$output
|
||||||
|
->expects($this->never())
|
||||||
|
->method('warning');
|
||||||
|
|
||||||
|
$this->installCoreBundle->run($output);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,175 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (c) 2016 Morris Jobke <hey@morrisjobke.de>
|
||||||
|
*
|
||||||
|
* @author Morris Jobke <hey@morrisjobke.de>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Test\Repair\Owncloud;
|
||||||
|
|
||||||
|
use OC\Repair\Owncloud\UpdateLanguageCodes;
|
||||||
|
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||||
|
use OCP\IConfig;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use Test\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class UpdateLanguageCodesTest
|
||||||
|
*
|
||||||
|
* @group DB
|
||||||
|
*
|
||||||
|
* @package Test\Repair
|
||||||
|
*/
|
||||||
|
class UpdateLanguageCodesTest extends TestCase {
|
||||||
|
/** @var \OCP\IDBConnection */
|
||||||
|
protected $connection;
|
||||||
|
|
||||||
|
/** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $config;
|
||||||
|
|
||||||
|
protected function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->connection = \OC::$server->getDatabaseConnection();
|
||||||
|
$this->config = $this->createMock(IConfig::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRun() {
|
||||||
|
$users = [
|
||||||
|
['userid' => 'user1', 'configvalue' => 'fi_FI'],
|
||||||
|
['userid' => 'user2', 'configvalue' => 'de'],
|
||||||
|
['userid' => 'user3', 'configvalue' => 'fi'],
|
||||||
|
['userid' => 'user4', 'configvalue' => 'ja'],
|
||||||
|
['userid' => 'user5', 'configvalue' => 'bg_BG'],
|
||||||
|
['userid' => 'user6', 'configvalue' => 'ja'],
|
||||||
|
['userid' => 'user7', 'configvalue' => 'th_TH'],
|
||||||
|
['userid' => 'user8', 'configvalue' => 'th_TH'],
|
||||||
|
];
|
||||||
|
|
||||||
|
// insert test data
|
||||||
|
$qb = $this->connection->getQueryBuilder();
|
||||||
|
$qb->insert('preferences')
|
||||||
|
->values([
|
||||||
|
'userid' => $qb->createParameter('userid'),
|
||||||
|
'appid' => $qb->createParameter('appid'),
|
||||||
|
'configkey' => $qb->createParameter('configkey'),
|
||||||
|
'configvalue' => $qb->createParameter('configvalue'),
|
||||||
|
]);
|
||||||
|
foreach ($users as $user) {
|
||||||
|
$qb->setParameters([
|
||||||
|
'userid' => $user['userid'],
|
||||||
|
'appid' => 'core',
|
||||||
|
'configkey' => 'lang',
|
||||||
|
'configvalue' => $user['configvalue'],
|
||||||
|
])->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if test data is written to DB
|
||||||
|
$qb = $this->connection->getQueryBuilder();
|
||||||
|
$result = $qb->select(['userid', 'configvalue'])
|
||||||
|
->from('preferences')
|
||||||
|
->where($qb->expr()->eq('appid', $qb->createNamedParameter('core')))
|
||||||
|
->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang')))
|
||||||
|
->execute();
|
||||||
|
|
||||||
|
$rows = $result->fetchAll();
|
||||||
|
$result->closeCursor();
|
||||||
|
|
||||||
|
$this->assertSame($users, $rows, 'Asserts that the entries are the ones from the test data set');
|
||||||
|
|
||||||
|
/** @var IOutput|\PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||||
|
$outputMock = $this->createMock(IOutput::class);
|
||||||
|
$outputMock->expects($this->at(0))
|
||||||
|
->method('info')
|
||||||
|
->with('Changed 1 setting(s) from "bg_BG" to "bg" in preferences table.');
|
||||||
|
$outputMock->expects($this->at(1))
|
||||||
|
->method('info')
|
||||||
|
->with('Changed 0 setting(s) from "cs_CZ" to "cs" in preferences table.');
|
||||||
|
$outputMock->expects($this->at(2))
|
||||||
|
->method('info')
|
||||||
|
->with('Changed 1 setting(s) from "fi_FI" to "fi" in preferences table.');
|
||||||
|
$outputMock->expects($this->at(3))
|
||||||
|
->method('info')
|
||||||
|
->with('Changed 0 setting(s) from "hu_HU" to "hu" in preferences table.');
|
||||||
|
$outputMock->expects($this->at(4))
|
||||||
|
->method('info')
|
||||||
|
->with('Changed 0 setting(s) from "nb_NO" to "nb" in preferences table.');
|
||||||
|
$outputMock->expects($this->at(5))
|
||||||
|
->method('info')
|
||||||
|
->with('Changed 0 setting(s) from "sk_SK" to "sk" in preferences table.');
|
||||||
|
$outputMock->expects($this->at(6))
|
||||||
|
->method('info')
|
||||||
|
->with('Changed 2 setting(s) from "th_TH" to "th" in preferences table.');
|
||||||
|
|
||||||
|
$this->config->expects($this->once())
|
||||||
|
->method('getSystemValue')
|
||||||
|
->with('version', '0.0.0')
|
||||||
|
->willReturn('12.0.0.13');
|
||||||
|
|
||||||
|
// run repair step
|
||||||
|
$repair = new UpdateLanguageCodes($this->connection, $this->config);
|
||||||
|
$repair->run($outputMock);
|
||||||
|
|
||||||
|
// check if test data is correctly modified in DB
|
||||||
|
$qb = $this->connection->getQueryBuilder();
|
||||||
|
$result = $qb->select(['userid', 'configvalue'])
|
||||||
|
->from('preferences')
|
||||||
|
->where($qb->expr()->eq('appid', $qb->createNamedParameter('core')))
|
||||||
|
->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang')))
|
||||||
|
->orderBy('userid')
|
||||||
|
->execute();
|
||||||
|
|
||||||
|
$rows = $result->fetchAll();
|
||||||
|
$result->closeCursor();
|
||||||
|
|
||||||
|
// value has changed for one user
|
||||||
|
$users[0]['configvalue'] = 'fi';
|
||||||
|
$users[4]['configvalue'] = 'bg';
|
||||||
|
$users[6]['configvalue'] = 'th';
|
||||||
|
$users[7]['configvalue'] = 'th';
|
||||||
|
$this->assertSame($users, $rows, 'Asserts that the entries are updated correctly.');
|
||||||
|
|
||||||
|
// remove test data
|
||||||
|
foreach ($users as $user) {
|
||||||
|
$qb = $this->connection->getQueryBuilder();
|
||||||
|
$qb->delete('preferences')
|
||||||
|
->where($qb->expr()->eq('userid', $qb->createNamedParameter($user['userid'])))
|
||||||
|
->andWhere($qb->expr()->eq('appid', $qb->createNamedParameter('core')))
|
||||||
|
->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang')))
|
||||||
|
->andWhere($qb->expr()->eq('configvalue', $qb->createNamedParameter($user['configvalue']), IQueryBuilder::PARAM_STR))
|
||||||
|
->execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSecondRun() {
|
||||||
|
/** @var IOutput|\PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||||
|
$outputMock = $this->createMock(IOutput::class);
|
||||||
|
$outputMock->expects($this->never())
|
||||||
|
->method('info');
|
||||||
|
|
||||||
|
$this->config->expects($this->once())
|
||||||
|
->method('getSystemValue')
|
||||||
|
->with('version', '0.0.0')
|
||||||
|
->willReturn('12.0.0.14');
|
||||||
|
|
||||||
|
// run repair step
|
||||||
|
$repair = new UpdateLanguageCodes($this->connection, $this->config);
|
||||||
|
$repair->run($outputMock);
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,6 +40,7 @@ $OC_VersionCanBeUpgradedFrom = [
|
||||||
'20.0' => true,
|
'20.0' => true,
|
||||||
],
|
],
|
||||||
'owncloud' => [
|
'owncloud' => [
|
||||||
|
'10.5' => true,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue