// Shared guard for the admin security-key routes (server/api/admin/users/[id]/webauthn/*). // Caller must have a session AND a tenant-administrator role (AD_Role.IsClientAdministrator, // resolved against iDempiere by isAdminRole — never trusted from the client-writable cookie). import { isAdminRole } from './changeLogHelper' import fetchHelper from './fetchHelper' export interface KeyAdminContext { adminId: number token: string targetUserId: number } export async function requireKeyAdmin(event: any): Promise { const adminId = Number(getCookie(event, 'logship_user_id')) const token = getCookie(event, 'logship_it') ?? '' if (!adminId || !token) { throw createError({ statusCode: 401, statusMessage: 'Not authenticated' }) } const targetUserId = Number(getRouterParam(event, 'id')) if (!targetUserId) { throw createError({ statusCode: 400, statusMessage: 'Missing user id' }) } if (!(await isAdminRole(event, token))) { throw createError({ statusCode: 403, statusMessage: 'Tenant administrator role required' }) } return { adminId, token, targetUserId } } /** Target user's login name + display name (admin token; falls back to the id). */ export async function fetchTargetUser(event: any, ctx: KeyAdminContext): Promise<{ userName: string; displayName: string }> { const rec: any = await fetchHelper(event, 'models/ad_user/' + ctx.targetUserId + '?$select=Name,Value', 'GET', ctx.token, null) .catch(() => null) if (!rec) throw createError({ statusCode: 404, statusMessage: 'User not found' }) const userName = String(rec.Name ?? rec.name ?? rec.Value ?? rec.value ?? ctx.targetUserId) return { userName, displayName: String(rec.Name ?? rec.name ?? userName) } }