mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-04-03 22:37:20 +02:00
* feat: add admin user management endpoints
Add /api/admin/users with list, search, and delete handlers gated by
ACCESS_ADMIN + READ_USERS/MANAGE_USERS system grants. Handler factory
in packages/api uses findUsers, countUsers, and deleteUserById from
data-schemas.
* fix: address convention violations in admin users handlers
* fix: add pagination, self-deletion guard, and DB-level search limit
- listUsers now uses parsePagination + countUsers for proper pagination
matching the roles/groups pattern
- findUsers extended with optional limit/offset options
- deleteUser returns 403 when caller tries to delete own account
- searchUsers passes limit to DB query instead of fetching all and
slicing in JS
- Fix import ordering per CLAUDE.md, complete logger mock
- Replace fabricated date fallback with undefined
* fix: deterministic sort, null-safe pagination, consistent search filter
- Add sort option to findUsers; listUsers sorts by createdAt desc for
deterministic pagination
- Use != null guards for offset/limit to handle zero values correctly
- Remove username from search filter since it is not in the projection
or AdminUserSearchResult response type
* fix: last-admin deletion guard and search query max-length
- Prevent deleting the last admin user (look up target role, count
admins, reject with 400 if count <= 1)
- Cap search query at 200 characters to prevent regex DoS
- Add tests for both guards
* fix: include missing capability name in 403 Forbidden response
* fix: cascade user deletion cleanup, search username, parallel capability checks
- Cascade Config, AclEntry, and SystemGrant cleanup on user deletion
(matching the pattern in roles/groups handlers)
- Add username to admin search $or filter for parity with searchUsers
- Parallelize READ_* capability checks in listAllGrants with Promise.all
* fix: TOCTOU safety net, capability info leak, DRY/style cleanup, data-layer tests
- Add post-delete admin recount with CRITICAL log if race leaves 0 admins
- Revert capability name from 403 response to server-side log only
- Document thin deleteUserById limitation (full cascade is a future task)
- DRY: extract query.trim() to local variable in searchUsersHandler
- Add username to search projection, response type, and AdminUserSearchResult
- Functional filter/map in grants.ts parallel capability check
- Consistent null guards and limit>0 guard in findUsers options
- Fallback for empty result.message on delete response
- Fix mockUser() to generate unique _id per call
- Break long destructuring across multiple lines
- Assert countUsers filter and non-admin skip in delete tests
- Add data-layer tests for findUsers limit, offset, sort, and pagination
* chore: comment out admin delete user endpoint (out of scope)
* fix: cast USER principalId to ObjectId for ACL entry cleanup
ACL entries store USER principalId as ObjectId (via grantPermission casting),
but deleteAclEntries is a raw deleteMany that passes the filter through.
Passing a string won't match stored ObjectIds, leaving orphaned entries.
* chore: comment out unused requireManageUsers alongside disabled delete route
* fix: add missing logger.warn mock in capabilities test
* fix: harden admin users handlers — type safety, response consistency, test coverage
- Unify response shape: AdminUserSearchResult.userId → id, add AdminUserListItem type
- Fix unsafe req.query type assertion in searchUsersHandler (typeof guards)
- Anchor search regex with ^ for prefix matching (enables index usage)
- Add total/capped to search response for truncation signaling
- Add parseInt radix, remove redundant new Date() wrap
- Add tests: countUsers throw, countUsers call args, array query param, capped flag
* fix: scope deleteGrantsForPrincipal to tenant, deterministic search sort, align test mocks
- Add tenantId option to AdminUsersDeps.deleteGrantsForPrincipal and
pass req.user.tenantId at the call site, matching the pattern already
used by the roles and groups handlers
- Add sort: { name: 1 } to searchUsersHandler for deterministic results
- Align test mock deleteUserById messages with production output
('User was deleted successfully.')
- Make capped-results test explicitly set limit: '20' instead of
relying on the implicit default
* test: add tenantId propagation test for deleteGrantsForPrincipal
Add tenantId to createReqRes user type and test that a non-undefined
tenantId is threaded through to deleteGrantsForPrincipal.
* test: remove redundant deleteUserById override in tenantId test
---------
Co-authored-by: Danny Avila <danny@librechat.ai>
69 lines
1.6 KiB
JavaScript
69 lines
1.6 KiB
JavaScript
const accessPermissions = require('./accessPermissions');
|
|
const assistants = require('./assistants');
|
|
const categories = require('./categories');
|
|
const adminAuth = require('./admin/auth');
|
|
const adminConfig = require('./admin/config');
|
|
const adminGrants = require('./admin/grants');
|
|
const adminGroups = require('./admin/groups');
|
|
const adminRoles = require('./admin/roles');
|
|
const adminUsers = require('./admin/users');
|
|
const endpoints = require('./endpoints');
|
|
const staticRoute = require('./static');
|
|
const messages = require('./messages');
|
|
const memories = require('./memories');
|
|
const presets = require('./presets');
|
|
const prompts = require('./prompts');
|
|
const balance = require('./balance');
|
|
const actions = require('./actions');
|
|
const apiKeys = require('./apiKeys');
|
|
const banner = require('./banner');
|
|
const search = require('./search');
|
|
const models = require('./models');
|
|
const convos = require('./convos');
|
|
const config = require('./config');
|
|
const agents = require('./agents');
|
|
const roles = require('./roles');
|
|
const oauth = require('./oauth');
|
|
const files = require('./files');
|
|
const share = require('./share');
|
|
const tags = require('./tags');
|
|
const auth = require('./auth');
|
|
const keys = require('./keys');
|
|
const user = require('./user');
|
|
const mcp = require('./mcp');
|
|
|
|
module.exports = {
|
|
mcp,
|
|
auth,
|
|
adminAuth,
|
|
adminConfig,
|
|
adminGrants,
|
|
adminGroups,
|
|
adminRoles,
|
|
adminUsers,
|
|
keys,
|
|
apiKeys,
|
|
user,
|
|
tags,
|
|
roles,
|
|
oauth,
|
|
files,
|
|
share,
|
|
banner,
|
|
agents,
|
|
convos,
|
|
search,
|
|
config,
|
|
models,
|
|
prompts,
|
|
actions,
|
|
presets,
|
|
balance,
|
|
messages,
|
|
memories,
|
|
endpoints,
|
|
assistants,
|
|
categories,
|
|
staticRoute,
|
|
accessPermissions,
|
|
};
|