Merge pull request #38398 from nextcloud/fix/noid/oauth2-encrypt-client-secret
Store encrypted OAuth2 client secretspull/38688/head
commit
5bf1fc6535
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* @copyright Copyright 2023, Julien Veyssier <julien-nc@posteo.net>
|
||||
*
|
||||
* @author Julien Veyssier <julien-nc@posteo.net>
|
||||
*
|
||||
* @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 OCA\OAuth2\Migration;
|
||||
|
||||
use Closure;
|
||||
use OCP\DB\ISchemaWrapper;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\SimpleMigrationStep;
|
||||
use OCP\Security\ICrypto;
|
||||
|
||||
class Version011601Date20230522143227 extends SimpleMigrationStep {
|
||||
|
||||
public function __construct(
|
||||
private IDBConnection $connection,
|
||||
private ICrypto $crypto,
|
||||
) {
|
||||
}
|
||||
|
||||
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options) {
|
||||
/** @var ISchemaWrapper $schema */
|
||||
$schema = $schemaClosure();
|
||||
|
||||
if ($schema->hasTable('oauth2_clients')) {
|
||||
$table = $schema->getTable('oauth2_clients');
|
||||
if ($table->hasColumn('secret')) {
|
||||
$column = $table->getColumn('secret');
|
||||
$column->setLength(256);
|
||||
return $schema;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
|
||||
$qbUpdate = $this->connection->getQueryBuilder();
|
||||
$qbUpdate->update('oauth2_clients')
|
||||
->set('secret', $qbUpdate->createParameter('updateSecret'))
|
||||
->where(
|
||||
$qbUpdate->expr()->eq('id', $qbUpdate->createParameter('updateId'))
|
||||
);
|
||||
|
||||
$qbSelect = $this->connection->getQueryBuilder();
|
||||
$qbSelect->select('id', 'secret')
|
||||
->from('oauth2_clients');
|
||||
$req = $qbSelect->executeQuery();
|
||||
while ($row = $req->fetch()) {
|
||||
$id = $row['id'];
|
||||
$secret = $row['secret'];
|
||||
$encryptedSecret = $this->crypto->encrypt($secret);
|
||||
$qbUpdate->setParameter('updateSecret', $encryptedSecret, IQueryBuilder::PARAM_STR);
|
||||
$qbUpdate->setParameter('updateId', $id, IQueryBuilder::PARAM_INT);
|
||||
$qbUpdate->executeStatement();
|
||||
}
|
||||
$req->closeCursor();
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue