diff options
Diffstat (limited to 'apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php')
-rw-r--r-- | apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php | 108 |
1 files changed, 26 insertions, 82 deletions
diff --git a/apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php b/apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php index 84bf54d3379..7dd6b3949e2 100644 --- a/apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php +++ b/apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php @@ -1,76 +1,38 @@ <?php +declare(strict_types=1); + /** - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @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/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ - namespace OCA\TwoFactorBackupCodes\Service; -use BadMethodCallException; use OCA\TwoFactorBackupCodes\Db\BackupCode; use OCA\TwoFactorBackupCodes\Db\BackupCodeMapper; -use OCP\Activity\IManager; -use OCP\ILogger; +use OCA\TwoFactorBackupCodes\Event\CodesGenerated; +use OCP\EventDispatcher\IEventDispatcher; use OCP\IUser; use OCP\Security\IHasher; use OCP\Security\ISecureRandom; class BackupCodeStorage { - private static $CODE_LENGTH = 16; - /** @var BackupCodeMapper */ - private $mapper; - - /** @var IHasher */ - private $hasher; - - /** @var ISecureRandom */ - private $random; - - /** @var IManager */ - private $activityManager; - - /** @var ILogger */ - private $logger; - - /** - * @param BackupCodeMapper $mapper - * @param ISecureRandom $random - * @param IHasher $hasher - * @param IManager $activityManager - * @param ILogger $logger - */ - public function __construct(BackupCodeMapper $mapper, ISecureRandom $random, IHasher $hasher, - IManager $activityManager, ILogger $logger) { - $this->mapper = $mapper; - $this->hasher = $hasher; - $this->random = $random; - $this->activityManager = $activityManager; - $this->logger = $logger; + public function __construct( + private BackupCodeMapper $mapper, + private ISecureRandom $random, + private IHasher $hasher, + private IEventDispatcher $eventDispatcher, + ) { } /** * @param IUser $user + * @param int $number * @return string[] */ - public function createCodes(IUser $user, $number = 10) { + public function createCodes(IUser $user, int $number = 10): array { $result = []; // Delete existing ones @@ -78,7 +40,7 @@ class BackupCodeStorage { $uid = $user->getUID(); foreach (range(1, min([$number, 20])) as $i) { - $code = $this->random->generate(self::$CODE_LENGTH, ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS); + $code = $this->random->generate(self::$CODE_LENGTH, ISecureRandom::CHAR_HUMAN_READABLE); $dbCode = new BackupCode(); $dbCode->setUserId($uid); @@ -86,40 +48,19 @@ class BackupCodeStorage { $dbCode->setUsed(0); $this->mapper->insert($dbCode); - array_push($result, $code); + $result[] = $code; } - $this->publishEvent($user, 'codes_generated'); + $this->eventDispatcher->dispatchTyped(new CodesGenerated($user)); return $result; } /** - * Push an event the user's activity stream - * - * @param IUser $user - * @param string $event - */ - private function publishEvent(IUser $user, $event) { - $activity = $this->activityManager->generateEvent(); - $activity->setApp('twofactor_backupcodes') - ->setType('security') - ->setAuthor($user->getUID()) - ->setAffectedUser($user->getUID()) - ->setSubject($event); - try { - $this->activityManager->publish($activity); - } catch (BadMethodCallException $e) { - $this->logger->warning('could not publish backup code creation activity', ['app' => 'twofactor_backupcodes']); - $this->logger->logException($e, ['app' => 'twofactor_backupcodes']); - } - } - - /** * @param IUser $user * @return bool */ - public function hasBackupCodes(IUser $user) { + public function hasBackupCodes(IUser $user): bool { $codes = $this->mapper->getBackupCodes($user); return count($codes) > 0; } @@ -128,12 +69,12 @@ class BackupCodeStorage { * @param IUser $user * @return array */ - public function getBackupCodesState(IUser $user) { + public function getBackupCodesState(IUser $user): array { $codes = $this->mapper->getBackupCodes($user); $total = count($codes); $used = 0; - array_walk($codes, function (BackupCode $code) use (&$used) { - if (1 === (int) $code->getUsed()) { + array_walk($codes, function (BackupCode $code) use (&$used): void { + if ((int)$code->getUsed() === 1) { $used++; } }); @@ -149,11 +90,11 @@ class BackupCodeStorage { * @param string $code * @return bool */ - public function validateCode(IUser $user, $code) { + public function validateCode(IUser $user, string $code): bool { $dbCodes = $this->mapper->getBackupCodes($user); foreach ($dbCodes as $dbCode) { - if (0 === (int) $dbCode->getUsed() && $this->hasher->verify($code, $dbCode->getCode())) { + if ((int)$dbCode->getUsed() === 0 && $this->hasher->verify($code, $dbCode->getCode())) { $dbCode->setUsed(1); $this->mapper->update($dbCode); return true; @@ -162,4 +103,7 @@ class BackupCodeStorage { return false; } + public function deleteCodes(IUser $user): void { + $this->mapper->deleteCodes($user); + } } |