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 2222use OC \Core \Listener \BeforeTemplateRenderedListener ;
2323use OC \Core \Listener \PasswordUpdatedListener ;
2424use OC \Core \Notification \CoreNotifier ;
25+ use OC \DirectEditing \Listeners \UserDeletedTokenCleanupListener as UserDeletedDirectEditingTokenCleanupListener ;
26+ use OC \DirectEditing \Listeners \UserDisabledTokenCleanupListener as UserDisabledDirectEditingTokenCleanupListener ;
2527use OC \TagManager ;
2628use OCP \AppFramework \App ;
2729use OCP \AppFramework \Bootstrap \IBootContext ;
3335use OCP \DB \Events \AddMissingPrimaryKeyEvent ;
3436use OCP \User \Events \BeforeUserDeletedEvent ;
3537use OCP \User \Events \PasswordUpdatedEvent ;
38+ use OCP \User \Events \UserChangedEvent ;
3639use OCP \User \Events \UserDeletedEvent ;
3740use OCP \Util ;
3841
@@ -86,6 +89,10 @@ public function register(IRegistrationContext $context): void {
8689 $ context ->registerConfigLexicon (ConfigLexicon::class);
8790
8891 $ context ->registerCapability (Capabilities::class);
92+
93+ // Direct Editing
94+ $ context ->registerEventListener (UserDeletedEvent::class, UserDeletedDirectEditingTokenCleanupListener::class);
95+ $ context ->registerEventListener (UserChangedEvent::class, UserDisabledDirectEditingTokenCleanupListener::class);
8996 }
9097
9198 public function boot (IBootContext $ context ): void {
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 @@ -209,6 +209,13 @@ public function cleanup(): int {
209209 return $ query ->executeStatement ();
210210 }
211211
212+ public function invalidateTokensForUser (string $ uid ): int {
213+ $ query = $ this ->connection ->getQueryBuilder ();
214+ $ query ->delete (self ::TABLE_TOKENS )
215+ ->where ($ query ->expr ()->eq ('user_id ' , $ query ->createNamedParameter ($ uid )));
216+ return $ query ->executeStatement ();
217+ }
218+
212219 public function refreshToken (string $ token ): bool {
213220 $ query = $ this ->connection ->getQueryBuilder ();
214221 $ query ->update (self ::TABLE_TOKENS )
You can’t perform that action at this time.
0 commit comments