From 0b0cc48c8830b71e9ed237c1866163bb85c5d379 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 30 Jul 2020 11:53:09 +0200 Subject: [PATCH] Move event listener to dedicated class Signed-off-by: Morris Jobke --- .../Lib/Auth/Password/LoginCredentials.php | 25 +------- .../lib/Listener/StorePasswordListener.php | 64 +++++++++++++++++++ 2 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 apps/files_external/lib/Listener/StorePasswordListener.php diff --git a/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php b/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php index 5ea4a69820..982ef57f3e 100644 --- a/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php +++ b/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php @@ -27,6 +27,7 @@ namespace OCA\Files_External\Lib\Auth\Password; use OCA\Files_External\Lib\Auth\AuthMechanism; use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException; use OCA\Files_External\Lib\StorageConfig; +use OCA\Files_External\Listener\StorePasswordListener; use OCP\Authentication\Exceptions\CredentialsUnavailableException; use OCP\Authentication\LoginCredentials\IStore as CredentialsStore; use OCP\EventDispatcher\IEventDispatcher; @@ -64,28 +65,8 @@ class LoginCredentials extends AuthMechanism { ->addParameters([ ]); - $eventDispatcher->addListener(UserLoggedInEvent::class, [$this, 'updateCredentials']); - $eventDispatcher->addListener(PasswordUpdatedEvent::class, [$this, 'updateCredentials']); - } - - /** - * @param UserLoggedInEvent | PasswordUpdatedEvent $event - */ - public function updateCredentials($event) { - if ($event instanceof UserLoggedInEvent && $event->isTokenLogin()) { - return; - } - - $stored = $this->credentialsManager->retrieve($event->getUser()->getUID(), self::CREDENTIALS_IDENTIFIER); - - if ($stored && $stored['password'] != $event->getPassword()) { - $credentials = [ - 'user' => $stored['user'], - 'password' => $event->getPassword() - ]; - - $this->credentialsManager->store($event->getUser()->getUID(), self::CREDENTIALS_IDENTIFIER, $credentials); - } + $eventDispatcher->addServiceListener(UserLoggedInEvent::class, StorePasswordListener::class); + $eventDispatcher->addServiceListener(PasswordUpdatedEvent::class, StorePasswordListener::class); } private function getCredentials(IUser $user): array { diff --git a/apps/files_external/lib/Listener/StorePasswordListener.php b/apps/files_external/lib/Listener/StorePasswordListener.php new file mode 100644 index 0000000000..3212f2a48c --- /dev/null +++ b/apps/files_external/lib/Listener/StorePasswordListener.php @@ -0,0 +1,64 @@ + + * + * @author Morris Jobke + * + * @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 . + * + */ + +namespace OCA\Files_External\Listener; + +use OCA\Files_External\Lib\Auth\Password\LoginCredentials; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\Security\ICredentialsManager; +use OCP\User\Events\PasswordUpdatedEvent; +use OCP\User\Events\UserLoggedInEvent; + +class StorePasswordListener implements IEventListener { + /** @var ICredentialsManager */ + private $credentialsManager; + + public function __construct(ICredentialsManager $credentialsManager) { + $this->credentialsManager = $credentialsManager; + } + + public function handle(Event $event): void { + if (!$event instanceof UserLoggedInEvent && !$event instanceof PasswordUpdatedEvent) { + return; + } + + if ($event instanceof UserLoggedInEvent && $event->isTokenLogin()) { + return; + } + + $stored = $this->credentialsManager->retrieve($event->getUser()->getUID(), LoginCredentials::CREDENTIALS_IDENTIFIER); + + if ($stored && $stored['password'] !== $event->getPassword()) { + $credentials = [ + 'user' => $stored['user'], + 'password' => $event->getPassword() + ]; + + $this->credentialsManager->store($event->getUser()->getUID(), LoginCredentials::CREDENTIALS_IDENTIFIER, $credentials); + } + } +}