mirror of
https://github.com/khoaliber/dockhand.git
synced 2026-03-03 05:29:05 +00:00
72 lines
2.5 KiB
TypeScript
72 lines
2.5 KiB
TypeScript
import { json } from '@sveltejs/kit';
|
|
import type { RequestHandler } from '@sveltejs/kit';
|
|
import { getAuthSettings, updateAuthSettings, countAdminUsers } from '$lib/server/db';
|
|
import { isEnterprise } from '$lib/server/license';
|
|
import { authorize } from '$lib/server/authorize';
|
|
|
|
// GET /api/auth/settings - Get auth settings
|
|
// Public when auth is disabled, requires authentication when enabled
|
|
export const GET: RequestHandler = async ({ cookies }) => {
|
|
const auth = await authorize(cookies);
|
|
|
|
// When auth is enabled, require authentication first, then settings:view permission
|
|
if (auth.authEnabled) {
|
|
if (!auth.isAuthenticated) {
|
|
return json({ error: 'Authentication required' }, { status: 401 });
|
|
}
|
|
if (!await auth.can('settings', 'view')) {
|
|
return json({ error: 'Permission denied' }, { status: 403 });
|
|
}
|
|
}
|
|
|
|
try {
|
|
const settings = await getAuthSettings();
|
|
return json(settings);
|
|
} catch (error) {
|
|
console.error('Failed to get auth settings:', error);
|
|
return json({ error: 'Failed to get auth settings' }, { status: 500 });
|
|
}
|
|
};
|
|
|
|
// PUT /api/auth/settings - Update auth settings
|
|
// Requires authentication and settings:edit permission
|
|
export const PUT: RequestHandler = async ({ request, cookies }) => {
|
|
const auth = await authorize(cookies);
|
|
|
|
// When auth is enabled, require authentication first, then settings:edit permission
|
|
if (auth.authEnabled) {
|
|
if (!auth.isAuthenticated) {
|
|
return json({ error: 'Authentication required' }, { status: 401 });
|
|
}
|
|
if (!await auth.can('settings', 'edit')) {
|
|
return json({ error: 'Permission denied' }, { status: 403 });
|
|
}
|
|
}
|
|
|
|
try {
|
|
const data = await request.json();
|
|
|
|
// Check if trying to enable auth without required users
|
|
if (data.authEnabled === true) {
|
|
const userCount = await countAdminUsers();
|
|
// PostgreSQL returns bigint for count(*), convert to number for comparison
|
|
if (Number(userCount) === 0) {
|
|
const enterprise = await isEnterprise();
|
|
const errorMessage = enterprise
|
|
? 'Cannot enable authentication without an admin user. Create a user and assign them the Admin role first.'
|
|
: 'Cannot enable authentication without any users. Create a user first.';
|
|
return json({
|
|
error: errorMessage,
|
|
requiresUser: true
|
|
}, { status: 400 });
|
|
}
|
|
}
|
|
|
|
const settings = await updateAuthSettings(data);
|
|
return json(settings);
|
|
} catch (error) {
|
|
console.error('Failed to update auth settings:', error);
|
|
return json({ error: 'Failed to update auth settings' }, { status: 500 });
|
|
}
|
|
};
|