]> source.dussan.org Git - nextcloud-server.git/commitdiff
Properly cleanup entries of WebAuthn on user deletion
authorMorris Jobke <hey@morrisjobke.de>
Wed, 16 Jun 2021 15:03:33 +0000 (17:03 +0200)
committerLukas Reschke <lukas@statuscode.ch>
Tue, 22 Jun 2021 11:46:28 +0000 (13:46 +0200)
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
core/Application.php
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/private/Authentication/Listeners/UserDeletedWebAuthnCleanupListener.php [new file with mode: 0644]
lib/private/Authentication/WebAuthn/Db/PublicKeyCredentialMapper.php

index 6aec7fd2305f60a641c9990bfb848f4a486b19eb..0a87e698597892e3a7f42e8bc8120cd728df724a 100644 (file)
@@ -38,6 +38,7 @@ use OC\Authentication\Listeners\RemoteWipeEmailListener;
 use OC\Authentication\Listeners\RemoteWipeNotificationsListener;
 use OC\Authentication\Listeners\UserDeletedStoreCleanupListener;
 use OC\Authentication\Listeners\UserDeletedTokenCleanupListener;
+use OC\Authentication\Listeners\UserDeletedWebAuthnCleanupListener;
 use OC\Authentication\Notifications\Notifier as AuthenticationNotifier;
 use OC\Core\Notification\CoreNotifier;
 use OC\DB\MissingColumnInformation;
@@ -264,5 +265,6 @@ class Application extends App {
                $eventDispatcher->addServiceListener(RemoteWipeFinished::class, RemoteWipeEmailListener::class);
                $eventDispatcher->addServiceListener(UserDeletedEvent::class, UserDeletedStoreCleanupListener::class);
                $eventDispatcher->addServiceListener(UserDeletedEvent::class, UserDeletedTokenCleanupListener::class);
+               $eventDispatcher->addServiceListener(UserDeletedEvent::class, UserDeletedWebAuthnCleanupListener::class);
        }
 }
index c829d4fde0e2bf6433683ebd70666c2775dce0d4..b2dbe7f9f22aaea1021ec1569b7d956c4a60e16e 100644 (file)
@@ -667,6 +667,7 @@ return array(
     'OC\\Authentication\\Listeners\\RemoteWipeNotificationsListener' => $baseDir . '/lib/private/Authentication/Listeners/RemoteWipeNotificationsListener.php',
     'OC\\Authentication\\Listeners\\UserDeletedStoreCleanupListener' => $baseDir . '/lib/private/Authentication/Listeners/UserDeletedStoreCleanupListener.php',
     'OC\\Authentication\\Listeners\\UserDeletedTokenCleanupListener' => $baseDir . '/lib/private/Authentication/Listeners/UserDeletedTokenCleanupListener.php',
+    'OC\\Authentication\\Listeners\\UserDeletedWebAuthnCleanupListener' => $baseDir . '/lib/private/Authentication/Listeners/UserDeletedWebAuthnCleanupListener.php',
     'OC\\Authentication\\Listeners\\UserLoggedInListener' => $baseDir . '/lib/private/Authentication/Listeners/UserLoggedInListener.php',
     'OC\\Authentication\\LoginCredentials\\Credentials' => $baseDir . '/lib/private/Authentication/LoginCredentials/Credentials.php',
     'OC\\Authentication\\LoginCredentials\\Store' => $baseDir . '/lib/private/Authentication/LoginCredentials/Store.php',
index 2f2d28c2503bcb110bcefc80fb94917fb792ca02..dffe16150e9e392e43c0b58907c98cd69bf4b7c1 100644 (file)
@@ -696,6 +696,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
         'OC\\Authentication\\Listeners\\RemoteWipeNotificationsListener' => __DIR__ . '/../../..' . '/lib/private/Authentication/Listeners/RemoteWipeNotificationsListener.php',
         'OC\\Authentication\\Listeners\\UserDeletedStoreCleanupListener' => __DIR__ . '/../../..' . '/lib/private/Authentication/Listeners/UserDeletedStoreCleanupListener.php',
         'OC\\Authentication\\Listeners\\UserDeletedTokenCleanupListener' => __DIR__ . '/../../..' . '/lib/private/Authentication/Listeners/UserDeletedTokenCleanupListener.php',
+        'OC\\Authentication\\Listeners\\UserDeletedWebAuthnCleanupListener' => __DIR__ . '/../../..' . '/lib/private/Authentication/Listeners/UserDeletedWebAuthnCleanupListener.php',
         'OC\\Authentication\\Listeners\\UserLoggedInListener' => __DIR__ . '/../../..' . '/lib/private/Authentication/Listeners/UserLoggedInListener.php',
         'OC\\Authentication\\LoginCredentials\\Credentials' => __DIR__ . '/../../..' . '/lib/private/Authentication/LoginCredentials/Credentials.php',
         'OC\\Authentication\\LoginCredentials\\Store' => __DIR__ . '/../../..' . '/lib/private/Authentication/LoginCredentials/Store.php',
diff --git a/lib/private/Authentication/Listeners/UserDeletedWebAuthnCleanupListener.php b/lib/private/Authentication/Listeners/UserDeletedWebAuthnCleanupListener.php
new file mode 100644 (file)
index 0000000..a56ac3b
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2021 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 OC\Authentication\Listeners;
+
+use OC\Authentication\WebAuthn\Db\PublicKeyCredentialMapper;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
+use OCP\User\Events\UserDeletedEvent;
+
+class UserDeletedWebAuthnCleanupListener implements IEventListener {
+
+       /** @var PublicKeyCredentialMapper */
+       private $credentialMapper;
+
+       public function __construct(PublicKeyCredentialMapper $credentialMapper) {
+               $this->credentialMapper = $credentialMapper;
+       }
+
+       public function handle(Event $event): void {
+               if (!($event instanceof UserDeletedEvent)) {
+                       return;
+               }
+
+               $this->credentialMapper->deleteByUid($event->getUser()->getUID());
+       }
+}
index 9c436b38b5d40072ee38ef6c87bfa2f1dfd20498..7ff60b08a24e8ac2ceb6cf903caa91f56a461e5b 100644 (file)
@@ -81,4 +81,17 @@ class PublicKeyCredentialMapper extends QBMapper {
 
                return $this->findEntity($qb);
        }
+
+       /**
+        * @throws \OCP\DB\Exception
+        */
+       public function deleteByUid(string $uid) {
+               $qb = $this->db->getQueryBuilder();
+
+               $qb->delete($this->getTableName())
+                       ->where(
+                               $qb->expr()->eq('uid', $qb->createNamedParameter($uid))
+                       );
+               $qb->executeStatement();
+       }
 }