RSS Git Download  Clone
Raw Blame History 1kB 37 lines
import { ensureReadonlyConnection } from '../../shared.mjs'

export default async (options) => {
    const { socket, payload } = options
    try {
        ensureReadonlyConnection({ socket })
        const redis = socket.p3xrs.ioredis
        if (!redis) {
            socket.emit(options.responseEvent, { status: 'error', error: 'Not connected to Redis' })
            return
        }
        if (!payload.username) {
            socket.emit(options.responseEvent, { status: 'error', error: 'Username is required' })
            return
        }
        if (payload.username === 'default') {
            socket.emit(options.responseEvent, { status: 'error', error: 'Cannot delete the default user' })
            return
        }
        const whoami = await redis.call('ACL', 'WHOAMI')
        if (payload.username === whoami) {
            socket.emit(options.responseEvent, { status: 'error', error: 'Cannot delete the currently connected user' })
            return
        }
        // Use cluster-aware method if available, otherwise direct call
        if (typeof redis.aclDeluser === 'function') {
            await redis.aclDeluser(payload.username)
        } else {
            await redis.call('ACL', 'DELUSER', payload.username)
        }
        socket.emit(options.responseEvent, { status: 'ok' })
    } catch (e) {
        console.error('acl/del-user failed', e)
        socket.emit(options.responseEvent, { status: 'error', error: e.message })
    }
}