feat: Add back searching in disabled user list

When disabled users where moved to their own endpoint we overlooked
 search, so adding it back.
The search is done case-insensitive in uid and display name.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
pull/45370/head
Côme Chilliet 6 months ago
parent 474cbda59a
commit 6d56f3557d
No known key found for this signature in database
GPG Key ID: A3E2F658B28C760A
  1. 7
      apps/provisioning_api/lib/Controller/UsersController.php
  2. 1
      apps/settings/src/components/UserList.vue
  3. 4
      apps/settings/src/store/users.js
  4. 2
      apps/user_ldap/lib/User_LDAP.php
  5. 14
      apps/user_ldap/lib/User_Proxy.php
  6. 12
      lib/private/User/Manager.php
  7. 3
      lib/public/IUserManager.php
  8. 3
      lib/public/User/Backend/IProvideEnabledStateBackend.php

@ -225,13 +225,14 @@ class UsersController extends AUserData {
* *
* Get the list of disabled users and their details * Get the list of disabled users and their details
* *
* @param string $search Text to search for
* @param ?int $limit Limit the amount of users returned * @param ?int $limit Limit the amount of users returned
* @param int $offset Offset * @param int $offset Offset
* @return DataResponse<Http::STATUS_OK, array{users: array<string, Provisioning_APIUserDetails|array{id: string}>}, array{}> * @return DataResponse<Http::STATUS_OK, array{users: array<string, Provisioning_APIUserDetails|array{id: string}>}, array{}>
* *
* 200: Disabled users details returned * 200: Disabled users details returned
*/ */
public function getDisabledUsersDetails(?int $limit = null, int $offset = 0): DataResponse { public function getDisabledUsersDetails(string $search = '', ?int $limit = null, int $offset = 0): DataResponse {
$currentUser = $this->userSession->getUser(); $currentUser = $this->userSession->getUser();
if ($currentUser === null) { if ($currentUser === null) {
return new DataResponse(['users' => []]); return new DataResponse(['users' => []]);
@ -249,7 +250,7 @@ class UsersController extends AUserData {
$uid = $currentUser->getUID(); $uid = $currentUser->getUID();
$subAdminManager = $this->groupManager->getSubAdmin(); $subAdminManager = $this->groupManager->getSubAdmin();
if ($this->groupManager->isAdmin($uid)) { if ($this->groupManager->isAdmin($uid)) {
$users = $this->userManager->getDisabledUsers($limit, $offset); $users = $this->userManager->getDisabledUsers($limit, $offset, $search);
$users = array_map(fn (IUser $user): string => $user->getUID(), $users); $users = array_map(fn (IUser $user): string => $user->getUID(), $users);
} elseif ($subAdminManager->isSubAdmin($currentUser)) { } elseif ($subAdminManager->isSubAdmin($currentUser)) {
$subAdminOfGroups = $subAdminManager->getSubAdminsGroups($currentUser); $subAdminOfGroups = $subAdminManager->getSubAdminsGroups($currentUser);
@ -263,7 +264,7 @@ class UsersController extends AUserData {
array_map( array_map(
fn (IUser $user): string => $user->getUID(), fn (IUser $user): string => $user->getUID(),
array_filter( array_filter(
$group->searchUsers('', ($tempLimit === null ? null : $tempLimit - count($users))), $group->searchUsers($search, ($tempLimit === null ? null : $tempLimit - count($users))),
fn (IUser $user): bool => !$user->isEnabled() fn (IUser $user): bool => !$user->isEnabled()
) )
) )

@ -313,6 +313,7 @@ export default {
await this.$store.dispatch('getDisabledUsers', { await this.$store.dispatch('getDisabledUsers', {
offset: this.disabledUsersOffset, offset: this.disabledUsersOffset,
limit: this.disabledUsersLimit, limit: this.disabledUsersLimit,
search: this.searchQuery,
}) })
} else { } else {
await this.$store.dispatch('getUsers', { await this.$store.dispatch('getUsers', {

@ -416,8 +416,8 @@ const actions = {
* @param {number} options.limit List number to return from offset * @param {number} options.limit List number to return from offset
* @return {Promise<number>} * @return {Promise<number>}
*/ */
async getDisabledUsers(context, { offset, limit }) { async getDisabledUsers(context, { offset, limit, search }) {
const url = generateOcsUrl('cloud/users/disabled?offset={offset}&limit={limit}', { offset, limit }) const url = generateOcsUrl('cloud/users/disabled?offset={offset}&limit={limit}&search={search}', { offset, limit, search })
try { try {
const response = await api.get(url) const response = await api.get(url)
const usersCount = Object.keys(response.data.ocs.data.users).length const usersCount = Object.keys(response.data.ocs.data.users).length

@ -682,7 +682,7 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I
return $enabled; return $enabled;
} }
public function getDisabledUserList(?int $limit = null, int $offset = 0): array { public function getDisabledUserList(?int $limit = null, int $offset = 0, string $search = ''): array {
throw new \Exception('This is implemented directly in User_Proxy'); throw new \Exception('This is implemented directly in User_Proxy');
} }
} }

@ -463,11 +463,21 @@ class User_Proxy extends Proxy implements IUserBackend, UserInterface, IUserLDAP
return $this->handleRequest($uid, 'setUserEnabled', [$uid, $enabled, $queryDatabaseValue, $setDatabaseValue]); return $this->handleRequest($uid, 'setUserEnabled', [$uid, $enabled, $queryDatabaseValue, $setDatabaseValue]);
} }
public function getDisabledUserList(?int $limit = null, int $offset = 0): array { public function getDisabledUserList(?int $limit = null, int $offset = 0, string $search = ''): array {
$disabledUsers = $this->deletedUsersIndex->getUsers();
if ($search !== '') {
$disabledUsers = array_filter(
$disabledUsers,
fn (OfflineUser $user): bool =>
mb_stripos($user->getOCName(), $search) !== false ||
mb_stripos($user->getUID(), $search) !== false ||
mb_stripos($user->getDisplayName(), $search) !== false,
);
}
return array_map( return array_map(
fn (OfflineUser $user) => $user->getOCName(), fn (OfflineUser $user) => $user->getOCName(),
array_slice( array_slice(
$this->deletedUsersIndex->getUsers(), $disabledUsers,
$offset, $offset,
$limit $limit
) )

@ -333,7 +333,7 @@ class Manager extends PublicEmitter implements IUserManager {
/** /**
* @return IUser[] * @return IUser[]
*/ */
public function getDisabledUsers(?int $limit = null, int $offset = 0): array { public function getDisabledUsers(?int $limit = null, int $offset = 0, string $search = ''): array {
$users = $this->config->getUsersForUserValue('core', 'enabled', 'false'); $users = $this->config->getUsersForUserValue('core', 'enabled', 'false');
$users = array_combine( $users = array_combine(
$users, $users,
@ -342,6 +342,14 @@ class Manager extends PublicEmitter implements IUserManager {
$users $users
) )
); );
if ($search !== '') {
$users = array_filter(
$users,
fn (IUser $user): bool =>
mb_stripos($user->getUID(), $search) !== false ||
mb_stripos($user->getDisplayName(), $search) !== false,
);
}
$tempLimit = ($limit === null ? null : $limit + $offset); $tempLimit = ($limit === null ? null : $limit + $offset);
foreach ($this->backends as $backend) { foreach ($this->backends as $backend) {
@ -349,7 +357,7 @@ class Manager extends PublicEmitter implements IUserManager {
break; break;
} }
if ($backend instanceof IProvideEnabledStateBackend) { if ($backend instanceof IProvideEnabledStateBackend) {
$backendUsers = $backend->getDisabledUserList(($tempLimit === null ? null : $tempLimit - count($users))); $backendUsers = $backend->getDisabledUserList(($tempLimit === null ? null : $tempLimit - count($users)), 0, $search);
foreach ($backendUsers as $uid) { foreach ($backendUsers as $uid) {
$users[$uid] = new LazyUser($uid, $this, null, $backend); $users[$uid] = new LazyUser($uid, $this, null, $backend);
} }

@ -142,8 +142,9 @@ interface IUserManager {
/** /**
* @return IUser[] * @return IUser[]
* @since 28.0.0 * @since 28.0.0
* @since 30.0.0 $search parameter added
*/ */
public function getDisabledUsers(?int $limit = null, int $offset = 0): array; public function getDisabledUsers(?int $limit = null, int $offset = 0, string $search = ''): array;
/** /**
* Search known users (from phonebook sync) by displayName * Search known users (from phonebook sync) by displayName

@ -49,8 +49,9 @@ interface IProvideEnabledStateBackend {
* Get the list of disabled users, to merge with the ones disabled in database * Get the list of disabled users, to merge with the ones disabled in database
* *
* @since 28.0.0 * @since 28.0.0
* @since 30.0.0 $search parameter added
* *
* @return string[] * @return string[]
*/ */
public function getDisabledUserList(?int $limit = null, int $offset = 0): array; public function getDisabledUserList(?int $limit = null, int $offset = 0, string $search = ''): array;
} }

Loading…
Cancel
Save