- Allowed guest accounts to be evaluated in `forward-auth`
- Validated `guest` account's `customScopes` and rejected ungranted access
- Added Array parameterization and `UNION` query in `getDashboardApps`
- Mapped `customScopes` to `getDashboardApps` in the UI route `/dashboard`
- Wired web and CLI joins in `events.ts` to `auditWrapper.auditLog` using correct schema (`event.id`, `{slug, method}`)
- Added `auditWrapper.auditLog` unit test validations in `events.test.ts`
- Added guest session scope unit tests in `forward_auth.test.ts`
- Moved Markdown tasks logic from `tasks/new/` to `tasks/complete/`
Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
160 lines
4.2 KiB
TypeScript
160 lines
4.2 KiB
TypeScript
import { sql } from "../server/db.ts";
|
|
|
|
export async function getDashboardApps(
|
|
userId: string,
|
|
isAdmin: boolean,
|
|
customScopes?: string[],
|
|
) {
|
|
if (isAdmin) {
|
|
return await sql`
|
|
SELECT id, name, description, domain, 'Admin' as role
|
|
FROM apps
|
|
WHERE domain IS NOT NULL
|
|
ORDER BY name ASC
|
|
` as any[];
|
|
} else {
|
|
const appNames = (customScopes || [])
|
|
.filter((s) => s.startsWith("app:"))
|
|
.map((s) => s.split(":")[1]);
|
|
|
|
if (appNames.length > 0) {
|
|
return await sql`
|
|
SELECT a.id, a.name, a.description, a.domain, g.role
|
|
FROM apps a
|
|
JOIN grants g ON a.id = g.app_id
|
|
WHERE g.user_id = ${userId} AND a.domain IS NOT NULL
|
|
UNION
|
|
SELECT id, name, description, domain, 'Guest (Viewer)' as role
|
|
FROM apps
|
|
WHERE domain IS NOT NULL AND name = ANY(${appNames}::text[])
|
|
ORDER BY name ASC
|
|
` as any[];
|
|
} else {
|
|
return await sql`
|
|
SELECT a.id, a.name, a.description, a.domain, g.role
|
|
FROM apps a
|
|
JOIN grants g ON a.id = g.app_id
|
|
WHERE g.user_id = ${userId} AND a.domain IS NOT NULL
|
|
ORDER BY a.name ASC
|
|
` as any[];
|
|
}
|
|
}
|
|
}
|
|
|
|
export async function getSessionApps() {
|
|
return await sql`
|
|
SELECT id, name, domain, spiffe_id
|
|
FROM apps
|
|
ORDER BY name ASC
|
|
`;
|
|
}
|
|
|
|
export async function getUserSessions(userId: string) {
|
|
return await sql`
|
|
SELECT id, label, is_agent, custom_scopes, last_activity_at, last_activity_action, created_at, expires_at
|
|
FROM sessions
|
|
WHERE user_id = ${userId} AND expires_at > NOW()
|
|
ORDER BY created_at DESC
|
|
`;
|
|
}
|
|
|
|
export async function getUserEventPasses(userId: string) {
|
|
return await sql`
|
|
SELECT id, slug, pin_code, name, max_seats, seats_claimed, is_active, expires_at
|
|
FROM event_passes
|
|
WHERE created_by = ${userId} AND is_active = TRUE
|
|
ORDER BY created_at DESC
|
|
`;
|
|
}
|
|
|
|
export async function getUserPasskeys(userId: string) {
|
|
return await sql`
|
|
SELECT id, credential_id, counter
|
|
FROM passkeys
|
|
WHERE user_id = ${userId}
|
|
`;
|
|
}
|
|
|
|
export async function getAdminUsers() {
|
|
return await sql`
|
|
SELECT id, username, display_name, account_status
|
|
FROM users
|
|
ORDER BY username ASC
|
|
`;
|
|
}
|
|
|
|
export async function getAdminApps() {
|
|
return await sql`
|
|
SELECT a.id, a.name, a.spiffe_id, a.description, a.created_at,
|
|
COUNT(g.id) AS active_grants_count
|
|
FROM apps a
|
|
LEFT JOIN grants g ON a.id = g.app_id
|
|
GROUP BY a.id, a.name, a.spiffe_id, a.description, a.created_at
|
|
ORDER BY a.created_at ASC
|
|
`;
|
|
}
|
|
|
|
export async function getAdminRoles() {
|
|
return await sql`
|
|
SELECT r.id, r.name, r.description, r.app_id, r.created_at,
|
|
a.name AS app_name
|
|
FROM roles r
|
|
LEFT JOIN apps a ON r.app_id = a.id
|
|
ORDER BY r.app_id NULLS FIRST, r.name ASC
|
|
`;
|
|
}
|
|
|
|
export async function getAdminInvites() {
|
|
return await sql`
|
|
SELECT i.id, i.code, i.role, i.max_uses, i.uses_count, i.auto_activate, i.expires_at, i.created_at, i.used_at,
|
|
a.name AS app_name, a.id AS app_id,
|
|
u.username AS used_by_username
|
|
FROM invites i
|
|
LEFT JOIN apps a ON i.app_id = a.id
|
|
LEFT JOIN users u ON i.used_by = u.id
|
|
ORDER BY i.created_at DESC
|
|
`;
|
|
}
|
|
|
|
export async function getAllRoles() {
|
|
return await sql`
|
|
SELECT id, name, description, app_id FROM roles ORDER BY name ASC
|
|
`;
|
|
}
|
|
|
|
export async function getAaguidAllowlist() {
|
|
return await sql`
|
|
SELECT id, aaguid, description, created_at
|
|
FROM aaguid_allowlist
|
|
ORDER BY created_at DESC
|
|
`;
|
|
}
|
|
|
|
export async function getAdminUserDetails(targetUserId: string) {
|
|
return await sql`
|
|
SELECT id, username, display_name, account_status
|
|
FROM users
|
|
WHERE id = ${targetUserId}
|
|
`.then((res) => res[0]);
|
|
}
|
|
|
|
export async function getUserGrants(targetUserId: string) {
|
|
return await sql`
|
|
SELECT g.id, g.app_id, g.role, g.created_at, a.name AS app_name, a.spiffe_id
|
|
FROM grants g
|
|
JOIN apps a ON g.app_id = a.id
|
|
WHERE g.user_id = ${targetUserId}
|
|
ORDER BY a.name ASC
|
|
`;
|
|
}
|
|
|
|
export async function getAdminAuditLogs() {
|
|
return await sql`
|
|
SELECT a.id, a.action, a.resource, a.details, a.ip_address, a.created_at, u.username as user
|
|
FROM audit_records a
|
|
LEFT JOIN users u ON a.user_id = u.id
|
|
ORDER BY a.created_at DESC
|
|
LIMIT 100
|
|
`;
|
|
}
|