File tree Expand file tree Collapse file tree
lib/private/DirectEditing 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 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