Skip to content

Commit 2707887

Browse files
fix: propagate disabled state to lookup server
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
1 parent c84f25f commit 2707887

6 files changed

Lines changed: 82 additions & 2 deletions

File tree

‎lib/AppInfo/Application.php‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use OCA\GlobalSiteSelector\GlobalSiteSelector;
1616
use OCA\GlobalSiteSelector\Listeners\AddContentSecurityPolicyListener;
1717
use OCA\GlobalSiteSelector\Listeners\DeletingUser;
18+
use OCA\GlobalSiteSelector\Listeners\UserChanged;
1819
use OCA\GlobalSiteSelector\Listeners\UserCreated;
1920
use OCA\GlobalSiteSelector\Listeners\UserDeleted;
2021
use OCA\GlobalSiteSelector\Listeners\UserLoggedOut;
@@ -36,6 +37,7 @@
3637
use OCP\Server;
3738
use OCP\User\Events\BeforeUserDeletedEvent;
3839
use OCP\User\Events\BeforeUserLoggedInEvent;
40+
use OCP\User\Events\UserChangedEvent;
3941
use OCP\User\Events\UserCreatedEvent;
4042
use OCP\User\Events\UserDeletedEvent;
4143
use OCP\User\Events\UserLoggedOutEvent;
@@ -80,6 +82,7 @@ public function register(IRegistrationContext $context): void {
8082
$context->registerEventListener(BeforeUserDeletedEvent::class, DeletingUser::class);
8183
$context->registerEventListener(UserDeletedEvent::class, UserDeleted::class);
8284
$context->registerEventListener(UserLoggedOutEvent::class, UserLoggedOut::class);
85+
$context->registerEventListener(UserChangedEvent::class, UserChanged::class);
8386

8487
$context->registerSetupCheck(LongJwtKeySetupCheck::class);
8588

‎lib/Controller/SlaveController.php‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
namespace OCA\GlobalSiteSelector\Controller;
1010

1111
use OC\Authentication\Token\IProvider;
12+
use OC\User\DisabledUserException;
1213
use OCA\GlobalSiteSelector\AppInfo\Application;
1314
use OCA\GlobalSiteSelector\Exceptions\LocalFederatedShareException;
1415
use OCA\GlobalSiteSelector\Exceptions\MasterUrlException;
@@ -63,6 +64,7 @@ public function __construct(
6364
private readonly IUserManager $userManager,
6465
private readonly UserBackend $userBackend,
6566
private readonly ISession $session,
67+
private readonly Slave $slave,
6668
private readonly SlaveService $slaveService,
6769
private readonly GlobalScaleService $globalScaleService,
6870
private readonly GlobalShareService $globalShareService,
@@ -159,6 +161,9 @@ public function autoLogin(string $jwt): RedirectResponse {
159161
if (!($user instanceof IUser)) {
160162
throw new \InvalidArgumentException('User is not valid');
161163
}
164+
if (!$user->isEnabled()) {
165+
throw new DisabledUserException('Account disabled');
166+
}
162167
$user->updateLastLoginTimestamp();
163168

164169
$this->session->set('globalScale.userData', $options);
@@ -191,6 +196,12 @@ public function autoLogin(string $jwt): RedirectResponse {
191196
$response = new RedirectResponse($masterUrl);
192197
$response->throttle();
193198
return $response;
199+
} catch (DisabledUserException $e) {
200+
// user is disabled, remove from lookup server
201+
$params = ['uid' => $uid];
202+
$this->slave->preDeleteUser($params);
203+
$this->slave->deleteUser($params);
204+
return new RedirectResponse($masterUrl);
194205
} catch (\Exception $e) {
195206
$this->logger->warning('issue during login process', ['exception' => $e]);
196207
$response = new RedirectResponse($masterUrl);

‎lib/Listeners/UserChanged.php‎

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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 OCA\GlobalSiteSelector\Listeners;
11+
12+
use OCA\GlobalSiteSelector\GlobalSiteSelector;
13+
use OCA\GlobalSiteSelector\Slave;
14+
use OCP\EventDispatcher\Event;
15+
use OCP\EventDispatcher\IEventListener;
16+
use OCP\User\Events\UserChangedEvent;
17+
18+
/**
19+
* @template-implements IEventListener<UserChangedEvent>
20+
*/
21+
class UserChanged implements IEventListener {
22+
23+
public function __construct(
24+
private GlobalSiteSelector $globalSiteSelector,
25+
private Slave $slave,
26+
) {
27+
}
28+
29+
public function handle(Event $event): void {
30+
if (!$event instanceof UserChangedEvent) {
31+
return;
32+
}
33+
34+
if (!$this->globalSiteSelector->isSlave()) {
35+
return;
36+
}
37+
38+
if ($event->getFeature() !== 'enabled') {
39+
return;
40+
}
41+
42+
$params = ['uid' => $event->getUser()->getUID()];
43+
44+
if ($event->getValue() === false) {
45+
// user was disabled, remove from lookup server
46+
$this->slave->preDeleteUser($params);
47+
$this->slave->deleteUser($params);
48+
} else {
49+
// user was enabled, add to lookup server
50+
$this->slave->createUser($params);
51+
}
52+
}
53+
}

‎lib/Slave.php‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,10 @@ public function batchUpdate(): void {
160160
$offset = 0;
161161
$usersData = [];
162162
do {
163-
164163
$users = $backend->getUsers('', $limit, $offset);
165164
foreach ($users as $uid) {
166165
$user = $this->userManager->get($uid);
167-
if ($user !== null) {
166+
if ($user !== null && $user->isEnabled()) {
168167
$usersData[$user->getCloudId()] = $this->slaveService->getAccountData($user);
169168
}
170169
}

‎psalm.xml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
<file name="tests/stubs/oc_server.php" />
5959
<file name="tests/stubs/oc_servercontainer.php" />
6060
<file name="tests/stubs/oc_settings_authorizedgroupmapper.php" />
61+
<file name="tests/stubs/oc_user_disableduserexception.php" />
6162
<file name="tests/stubs/oc_user_user.php" />
6263
<file name="tests/stubs/oca_circles_circlesmanager.php" />
6364
<file name="tests/stubs/oca_circles_circlesqueryhelper.php" />
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
7+
* SPDX-License-Identifier: AGPL-3.0-only
8+
*/
9+
10+
namespace OC\User;
11+
12+
class DisabledUserException extends LoginException {
13+
}

0 commit comments

Comments
 (0)