File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 2020use OC \Core \Listener \BeforeTemplateRenderedListener ;
2121use OC \Core \Listener \PasswordUpdatedListener ;
2222use OC \Core \Notification \CoreNotifier ;
23+ use OC \DirectEditing \Listeners \UserDeletedTokenCleanupListener as UserDeletedDirectEditingTokenCleanupListener ;
24+ use OC \DirectEditing \Listeners \UserDisabledTokenCleanupListener as UserDisabledDirectEditingTokenCleanupListener ;
2325use OC \TagManager ;
2426use OCP \AppFramework \App ;
2527use OCP \AppFramework \Http \Events \BeforeLoginTemplateRenderedEvent ;
3032use OCP \Notification \IManager as INotificationManager ;
3133use OCP \User \Events \BeforeUserDeletedEvent ;
3234use OCP \User \Events \PasswordUpdatedEvent ;
35+ use OCP \User \Events \UserChangedEvent ;
3336use OCP \User \Events \UserDeletedEvent ;
3437use OCP \Util ;
3538
@@ -302,5 +305,9 @@ public function __construct() {
302305
303306 // Tags
304307 $ eventDispatcher ->addServiceListener (UserDeletedEvent::class, TagManager::class);
308+
309+ // Direct Editing
310+ $ eventDispatcher ->addServiceListener (UserDeletedEvent::class, UserDeletedDirectEditingTokenCleanupListener::class);
311+ $ eventDispatcher ->addServiceListener (UserChangedEvent::class, UserDisabledDirectEditingTokenCleanupListener::class);
305312 }
306313}
Original file line number Diff line number Diff line change 14641464 'OC \\Diagnostics \\EventLogger ' => $ baseDir . '/lib/private/Diagnostics/EventLogger.php ' ,
14651465 'OC \\Diagnostics \\Query ' => $ baseDir . '/lib/private/Diagnostics/Query.php ' ,
14661466 'OC \\Diagnostics \\QueryLogger ' => $ baseDir . '/lib/private/Diagnostics/QueryLogger.php ' ,
1467+ 'OC \\DirectEditing \\Listeners \\UserDeletedTokenCleanupListener ' => $ baseDir . '/lib/private/DirectEditing/Listeners/UserDeletedTokenCleanupListener.php ' ,
1468+ 'OC \\DirectEditing \\Listeners \\UserDisabledTokenCleanupListener ' => $ baseDir . '/lib/private/DirectEditing/Listeners/UserDisabledTokenCleanupListener.php ' ,
14671469 'OC \\DirectEditing \\Manager ' => $ baseDir . '/lib/private/DirectEditing/Manager.php ' ,
14681470 'OC \\DirectEditing \\Token ' => $ baseDir . '/lib/private/DirectEditing/Token.php ' ,
14691471 'OC \\EmojiHelper ' => $ baseDir . '/lib/private/EmojiHelper.php ' ,
Original file line number Diff line number Diff line change @@ -1497,6 +1497,8 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
14971497 'OC \\Diagnostics \\EventLogger ' => __DIR__ . '/../../.. ' . '/lib/private/Diagnostics/EventLogger.php ' ,
14981498 'OC \\Diagnostics \\Query ' => __DIR__ . '/../../.. ' . '/lib/private/Diagnostics/Query.php ' ,
14991499 'OC \\Diagnostics \\QueryLogger ' => __DIR__ . '/../../.. ' . '/lib/private/Diagnostics/QueryLogger.php ' ,
1500+ 'OC \\DirectEditing \\Listeners \\UserDeletedTokenCleanupListener ' => __DIR__ . '/../../.. ' . '/lib/private/DirectEditing/Listeners/UserDeletedTokenCleanupListener.php ' ,
1501+ 'OC \\DirectEditing \\Listeners \\UserDisabledTokenCleanupListener ' => __DIR__ . '/../../.. ' . '/lib/private/DirectEditing/Listeners/UserDisabledTokenCleanupListener.php ' ,
15001502 'OC \\DirectEditing \\Manager ' => __DIR__ . '/../../.. ' . '/lib/private/DirectEditing/Manager.php ' ,
15011503 'OC \\DirectEditing \\Token ' => __DIR__ . '/../../.. ' . '/lib/private/DirectEditing/Token.php ' ,
15021504 'OC \\EmojiHelper ' => __DIR__ . '/../../.. ' . '/lib/private/EmojiHelper.php ' ,
Original file line number Diff line number Diff line change 1+ <?php
2+
3+ declare (strict_types=1 );
4+
5+ /**
6+ * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
7+ * SPDX-License-Identifier: AGPL-3.0-or-later
8+ */
9+
10+ namespace OC \DirectEditing \Listeners ;
11+
12+ use OC \DirectEditing \Manager ;
13+ use OCP \EventDispatcher \Event ;
14+ use OCP \EventDispatcher \IEventListener ;
15+ use OCP \User \Events \UserDeletedEvent ;
16+ use Psr \Log \LoggerInterface ;
17+ use Throwable ;
18+
19+ /**
20+ * @template-implements IEventListener<UserDeletedEvent>
21+ */
22+ class UserDeletedTokenCleanupListener implements IEventListener {
23+ public function __construct (
24+ private Manager $ manager ,
25+ private LoggerInterface $ logger ,
26+ ) {
27+ }
28+
29+ #[\Override]
30+ public function handle (Event $ event ): void {
31+ if (!($ event instanceof UserDeletedEvent)) {
32+ // Unrelated
33+ return ;
34+ }
35+
36+ /**
37+ * Catch any exception during this process as any failure here shouldn't block the
38+ * user deletion.
39+ */
40+ try {
41+ $ uid = $ event ->getUser ()->getUID ();
42+ $ this ->manager ->invalidateTokensForUser ($ uid );
43+ } catch (Throwable $ e ) {
44+ $ this ->logger ->error ('Could not clean up direct editing tokens after user deletion: ' . $ e ->getMessage (), [
45+ 'exception ' => $ e ,
46+ ]);
47+ }
48+ }
49+ }
Original file line number Diff line number Diff line change 1+ <?php
2+
3+ declare (strict_types=1 );
4+
5+ /**
6+ * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
7+ * SPDX-License-Identifier: AGPL-3.0-or-later
8+ */
9+
10+ namespace OC \DirectEditing \Listeners ;
11+
12+ use OC \DirectEditing \Manager ;
13+ use OCP \EventDispatcher \Event ;
14+ use OCP \EventDispatcher \IEventListener ;
15+ use OCP \User \Events \UserChangedEvent ;
16+ use Psr \Log \LoggerInterface ;
17+ use Throwable ;
18+
19+ /**
20+ * @template-implements IEventListener<UserChangedEvent>
21+ */
22+ class UserDisabledTokenCleanupListener implements IEventListener {
23+ public function __construct (
24+ private Manager $ manager ,
25+ private LoggerInterface $ logger ,
26+ ) {
27+ }
28+
29+ #[\Override]
30+ public function handle (Event $ event ): void {
31+ if (!($ event instanceof UserChangedEvent)) {
32+ // Unrelated
33+ return ;
34+ }
35+
36+ if ($ event ->getFeature () !== 'enabled ' || $ event ->getValue ()) {
37+ // not disabled
38+ return ;
39+ }
40+
41+ /**
42+ * Catch any exception during this process
43+ * as any failure here shouldn't block the disabling the user.
44+ */
45+ try {
46+ $ uid = $ event ->getUser ()->getUID ();
47+ $ this ->manager ->invalidateTokensForUser ($ uid );
48+ } catch (Throwable $ e ) {
49+ $ this ->logger ->error ('Could not clean up direct editing tokens when disabling user: ' . $ e ->getMessage (), [
50+ 'exception ' => $ e ,
51+ ]);
52+ }
53+ }
54+ }
Original file line number Diff line number Diff line change @@ -224,6 +224,13 @@ public function cleanup(): int {
224224 return $ query ->execute ();
225225 }
226226
227+ public function invalidateTokensForUser (string $ uid ): int {
228+ $ query = $ this ->connection ->getQueryBuilder ();
229+ $ query ->delete (self ::TABLE_TOKENS )
230+ ->where ($ query ->expr ()->eq ('user_id ' , $ query ->createNamedParameter ($ uid )));
231+ return $ query ->executeStatement ();
232+ }
233+
227234 public function refreshToken (string $ token ): bool {
228235 $ query = $ this ->connection ->getQueryBuilder ();
229236 $ query ->update (self ::TABLE_TOKENS )
You can’t perform that action at this time.
0 commit comments