Skip to content

Commit eca0e17

Browse files
committed
Add oauth2_clients migration for Owncloud
Signed-off-by: Louis Chemineau <louis@chmn.me>
1 parent 5613ff3 commit eca0e17

File tree

5 files changed

+134
-8
lines changed

5 files changed

+134
-8
lines changed

apps/oauth2/lib/Migration/Version010402Date20190107124745.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,16 @@ public function changeSchema(IOutput $output, Closure $schemaClosure, array $opt
4242
/** @var ISchemaWrapper $schema */
4343
$schema = $schemaClosure();
4444

45-
$table = $schema->getTable('oauth2_clients');
46-
$table->dropIndex('oauth2_client_id_idx');
47-
$table->addUniqueIndex(['client_identifier'], 'oauth2_client_id_idx');
48-
return $schema;
45+
// Skip this migration if the 'identifier' column from ownCLoud is present, as the 'client_identifier' column would not exists.
46+
if ($schema->getTable('oauth2_clients')->hasColumn('identifier')) {
47+
return;
48+
}
49+
50+
if (!$schema->getTable('oauth2_clients')->hasIndex('oauth2_client_id_idx')) {
51+
$table = $schema->getTable('oauth2_clients');
52+
$table->dropIndex('oauth2_client_id_idx');
53+
$table->addUniqueIndex(['client_identifier'], 'oauth2_client_id_idx');
54+
return $schema;
55+
}
4956
}
5057
}

lib/composer/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,6 +1353,7 @@
13531353
'OC\\Repair\\Owncloud\\CleanPreviewsBackgroundJob' => $baseDir . '/lib/private/Repair/Owncloud/CleanPreviewsBackgroundJob.php',
13541354
'OC\\Repair\\Owncloud\\DropAccountTermsTable' => $baseDir . '/lib/private/Repair/Owncloud/DropAccountTermsTable.php',
13551355
'OC\\Repair\\Owncloud\\InstallCoreBundle' => $baseDir . '/lib/private/Repair/Owncloud/InstallCoreBundle.php',
1356+
'OC\\Repair\\Owncloud\\MigrateOauthTables' => $baseDir . '/lib/private/Repair/Owncloud/MigrateOauthTables.php',
13561357
'OC\\Repair\\Owncloud\\MoveAvatars' => $baseDir . '/lib/private/Repair/Owncloud/MoveAvatars.php',
13571358
'OC\\Repair\\Owncloud\\MoveAvatarsBackgroundJob' => $baseDir . '/lib/private/Repair/Owncloud/MoveAvatarsBackgroundJob.php',
13581359
'OC\\Repair\\Owncloud\\SaveAccountsTableData' => $baseDir . '/lib/private/Repair/Owncloud/SaveAccountsTableData.php',

lib/composer/composer/autoload_static.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
88
{
99
public static $prefixLengthsPsr4 = array (
10-
'O' =>
10+
'O' =>
1111
array (
1212
'OC\\Core\\' => 8,
1313
'OC\\' => 3,
@@ -16,15 +16,15 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
1616
);
1717

1818
public static $prefixDirsPsr4 = array (
19-
'OC\\Core\\' =>
19+
'OC\\Core\\' =>
2020
array (
2121
0 => __DIR__ . '/../../..' . '/core',
2222
),
23-
'OC\\' =>
23+
'OC\\' =>
2424
array (
2525
0 => __DIR__ . '/../../..' . '/lib/private',
2626
),
27-
'OCP\\' =>
27+
'OCP\\' =>
2828
array (
2929
0 => __DIR__ . '/../../..' . '/lib/public',
3030
),
@@ -1382,6 +1382,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
13821382
'OC\\Repair\\Owncloud\\CleanPreviewsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/CleanPreviewsBackgroundJob.php',
13831383
'OC\\Repair\\Owncloud\\DropAccountTermsTable' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/DropAccountTermsTable.php',
13841384
'OC\\Repair\\Owncloud\\InstallCoreBundle' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/InstallCoreBundle.php',
1385+
'OC\\Repair\\Owncloud\\MigrateOauthTables' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/MigrateOauthTables.php',
13851386
'OC\\Repair\\Owncloud\\MoveAvatars' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/MoveAvatars.php',
13861387
'OC\\Repair\\Owncloud\\MoveAvatarsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/MoveAvatarsBackgroundJob.php',
13871388
'OC\\Repair\\Owncloud\\SaveAccountsTableData' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/SaveAccountsTableData.php',

lib/private/Repair.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
use OC\Repair\MoveUpdaterStepFile;
4848
use OC\Repair\NC22\LookupServerSendCheck;
4949
use OC\Repair\Owncloud\CleanPreviews;
50+
use OC\Repair\Owncloud\MigrateOauthTables;
5051
use OC\Repair\NC11\FixMountStorages;
5152
use OC\Repair\Owncloud\MoveAvatars;
5253
use OC\Repair\Owncloud\InstallCoreBundle;
@@ -185,6 +186,7 @@ public static function getRepairSteps() {
185186
\OC::$server->getUserManager(),
186187
\OC::$server->getConfig()
187188
),
189+
new MigrateOauthTables(\OC::$server->get(Connection::class)),
188190
new FixMountStorages(\OC::$server->getDatabaseConnection()),
189191
new UpdateLanguageCodes(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig()),
190192
new InstallCoreBundle(
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<?php
2+
/**
3+
* @copyright 2021 Louis Chemineau <louis@chmn.me>
4+
*
5+
* @license GNU AGPL version 3 or any later version
6+
*
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU Affero General Public License as
9+
* published by the Free Software Foundation, either version 3 of the
10+
* License, or (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU Affero General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU Affero General Public License
18+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
*
20+
*/
21+
namespace OC\Repair\Owncloud;
22+
23+
use OCP\BackgroundJob\IJobList;
24+
use OCP\IConfig;
25+
use OCP\IUserManager;
26+
use OCP\Migration\IOutput;
27+
use OCP\Migration\IRepairStep;
28+
use OC\DB\Connection;
29+
use OC\DB\SchemaWrapper;
30+
31+
class MigrateOauthTables implements IRepairStep {
32+
33+
/** @var Connection */
34+
protected $db;
35+
36+
/**
37+
* @param Connection $db
38+
*/
39+
public function __construct(Connection $db) {
40+
$this->db = $db;
41+
}
42+
43+
/**
44+
* @return string
45+
*/
46+
public function getName() {
47+
return 'Migrate oauth2_clients table to nextcloud schema';
48+
}
49+
50+
public function run(IOutput $output) {
51+
$schema = new SchemaWrapper($this->db);
52+
if (!$schema->hasTable('oauth2_clients')) {
53+
$output->info("oauth2_clients table does not exist.");
54+
return;
55+
}
56+
57+
$output->info("Update the oauth2_access_tokens table schema.");
58+
$schema = new SchemaWrapper($this->db);
59+
$table = $schema->getTable('oauth2_access_tokens');
60+
$table->addColumn('hashed_code', 'string', [
61+
'notnull' => true,
62+
'length' => 128,
63+
]);
64+
$table->addColumn('encrypted_token', 'string', [
65+
'notnull' => true,
66+
'length' => 786,
67+
]);
68+
$table->addUniqueIndex(['hashed_code'], 'oauth2_access_hash_idx');
69+
$table->addIndex(['client_id'], 'oauth2_access_client_id_idx');
70+
71+
72+
$output->info("Update the oauth2_clients table schema.");
73+
$schema = new SchemaWrapper($this->db);
74+
$table = $schema->getTable('oauth2_clients');
75+
$table->getColumn('name')->setLength(64);
76+
$table->dropColumn('allow_subdomains');
77+
78+
if (!$schema->getTable('oauth2_clients')->hasColumn('client_identifier')) {
79+
$table->addColumn('client_identifier', 'string', [
80+
'notnull' => true,
81+
'length' => 64,
82+
'default' => ''
83+
]);
84+
$table->addIndex(['client_identifier'], 'oauth2_client_id_idx');
85+
}
86+
87+
$this->db->migrateToSchema($schema->getWrappedSchema());
88+
89+
90+
if ($schema->getTable('oauth2_clients')->hasColumn('identifier')) {
91+
$output->info("Move identifier column's data to the new client_identifier column.");
92+
// 1. Fetch all [id, identifier] couple.
93+
$qb = $this->db->getQueryBuilder();
94+
$qb->select('id', 'identifier')->from('oauth2_clients');
95+
$result = $qb->executeQuery();
96+
$identifiers = $result->fetchAll();
97+
$result->closeCursor();
98+
99+
// 2. Insert them into the client_identifier column.
100+
foreach ($identifiers as ["id" => $id, "identifier" => $clientIdentifier]) {
101+
$this->db->getQueryBuilder()
102+
->update('oauth2_clients')
103+
->set('client_identifier', $clientIdentifier)
104+
->where($qb->expr()->eq('id', $id))
105+
->executeStatement();
106+
}
107+
108+
$output->info("Drop the identifier column.");
109+
$schema = new SchemaWrapper($this->db);
110+
$table = $schema->getTable('oauth2_clients');
111+
$table->dropColumn('identifier');
112+
$this->db->migrateToSchema($schema->getWrappedSchema());
113+
}
114+
}
115+
}

0 commit comments

Comments
 (0)