File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 2323use OC \Core \Listener \PasswordUpdatedListener ;
2424use OC \Core \Listener \RestrictInteractionListener ;
2525use OC \Core \Notification \CoreNotifier ;
26+ use OC \DirectEditing \Listeners \UserDeletedTokenCleanupListener as UserDeletedDirectEditingTokenCleanupListener ;
27+ use OC \DirectEditing \Listeners \UserDisabledTokenCleanupListener as UserDisabledDirectEditingTokenCleanupListener ;
2628use OC \OCM \OCMDiscoveryHandler ;
2729use OC \TagManager ;
2830use OCP \AppFramework \App ;
3638use OCP \Interaction \RestrictInteractionEvent ;
3739use OCP \User \Events \BeforeUserDeletedEvent ;
3840use OCP \User \Events \PasswordUpdatedEvent ;
41+ use OCP \User \Events \UserChangedEvent ;
3942use OCP \User \Events \UserDeletedEvent ;
4043use OCP \Util ;
4144
@@ -93,6 +96,10 @@ public function register(IRegistrationContext $context): void {
9396 $ context ->registerCapability (Capabilities::class);
9497
9598 $ context ->registerEventListener (RestrictInteractionEvent::class, RestrictInteractionListener::class);
99+
100+ // Direct Editing
101+ $ context ->registerEventListener (UserDeletedEvent::class, UserDeletedDirectEditingTokenCleanupListener::class);
102+ $ context ->registerEventListener (UserChangedEvent::class, UserDisabledDirectEditingTokenCleanupListener::class);
96103 }
97104
98105 #[\Override]
Original file line number Diff line number Diff line change 17241724 'OC \\Diagnostics \\Query ' => $ baseDir . '/lib/private/Diagnostics/Query.php ' ,
17251725 'OC \\Diagnostics \\QueryLogger ' => $ baseDir . '/lib/private/Diagnostics/QueryLogger.php ' ,
17261726 'OC \\Diagnostics \\TLogSlowOperation ' => $ baseDir . '/lib/private/Diagnostics/TLogSlowOperation.php ' ,
1727+ 'OC \\DirectEditing \\Listeners \\UserDeletedTokenCleanupListener ' => $ baseDir . '/lib/private/DirectEditing/Listeners/UserDeletedTokenCleanupListener.php ' ,
1728+ 'OC \\DirectEditing \\Listeners \\UserDisabledTokenCleanupListener ' => $ baseDir . '/lib/private/DirectEditing/Listeners/UserDisabledTokenCleanupListener.php ' ,
17271729 'OC \\DirectEditing \\Manager ' => $ baseDir . '/lib/private/DirectEditing/Manager.php ' ,
17281730 'OC \\DirectEditing \\Token ' => $ baseDir . '/lib/private/DirectEditing/Token.php ' ,
17291731 'OC \\EmojiHelper ' => $ baseDir . '/lib/private/EmojiHelper.php ' ,
Original file line number Diff line number Diff line change @@ -1765,6 +1765,8 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
17651765 'OC \\Diagnostics \\Query ' => __DIR__ . '/../../.. ' . '/lib/private/Diagnostics/Query.php ' ,
17661766 'OC \\Diagnostics \\QueryLogger ' => __DIR__ . '/../../.. ' . '/lib/private/Diagnostics/QueryLogger.php ' ,
17671767 'OC \\Diagnostics \\TLogSlowOperation ' => __DIR__ . '/../../.. ' . '/lib/private/Diagnostics/TLogSlowOperation.php ' ,
1768+ 'OC \\DirectEditing \\Listeners \\UserDeletedTokenCleanupListener ' => __DIR__ . '/../../.. ' . '/lib/private/DirectEditing/Listeners/UserDeletedTokenCleanupListener.php ' ,
1769+ 'OC \\DirectEditing \\Listeners \\UserDisabledTokenCleanupListener ' => __DIR__ . '/../../.. ' . '/lib/private/DirectEditing/Listeners/UserDisabledTokenCleanupListener.php ' ,
17681770 'OC \\DirectEditing \\Manager ' => __DIR__ . '/../../.. ' . '/lib/private/DirectEditing/Manager.php ' ,
17691771 'OC \\DirectEditing \\Token ' => __DIR__ . '/../../.. ' . '/lib/private/DirectEditing/Token.php ' ,
17701772 '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 @@ -217,6 +217,13 @@ public function cleanup(): int {
217217 return $ query ->executeStatement ();
218218 }
219219
220+ public function invalidateTokensForUser (string $ uid ): int {
221+ $ query = $ this ->connection ->getQueryBuilder ();
222+ $ query ->delete (self ::TABLE_TOKENS )
223+ ->where ($ query ->expr ()->eq ('user_id ' , $ query ->createNamedParameter ($ uid )));
224+ return $ query ->executeStatement ();
225+ }
226+
220227 public function refreshToken (string $ token ): bool {
221228 $ query = $ this ->connection ->getQueryBuilder ();
222229 $ query ->update (self ::TABLE_TOKENS )
You can’t perform that action at this time.
0 commit comments