import { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { TextInput, NumberInput, Switch, Button, Stack, Paper, Text, Loader, Group, Select, PasswordInput, Alert } from '@mantine/core'; import { alert } from '../../../toast'; import LocalIcon from '../../LocalIcon'; import RestartConfirmationModal from '../RestartConfirmationModal'; import { useRestartServer } from '../useRestartServer'; interface SecuritySettingsData { enableLogin?: boolean; csrfDisabled?: boolean; loginMethod?: string; loginAttemptCount?: number; loginResetTimeMinutes?: number; jwt?: { persistence?: boolean; enableKeyRotation?: boolean; enableKeyCleanup?: boolean; keyRetentionDays?: number; secureCookie?: boolean; }; } export default function AdminSecuritySection() { const { t } = useTranslation(); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const { restartModalOpened, showRestartModal, closeRestartModal, restartServer } = useRestartServer(); const [settings, setSettings] = useState({}); useEffect(() => { fetchSettings(); }, []); const fetchSettings = async () => { try { const response = await fetch('/api/v1/admin/settings/section/security'); if (response.ok) { const data = await response.json(); setSettings(data); } } catch (error) { console.error('Failed to fetch security settings:', error); alert({ alertType: 'error', title: t('admin.error', 'Error'), body: t('admin.settings.fetchError', 'Failed to load settings'), }); } finally { setLoading(false); } }; const handleSave = async () => { setSaving(true); try { const response = await fetch('/api/v1/admin/settings/section/security', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(settings), }); if (response.ok) { showRestartModal(); } else { throw new Error('Failed to save'); } } catch (error) { alert({ alertType: 'error', title: t('admin.error', 'Error'), body: t('admin.settings.saveError', 'Failed to save settings'), }); } finally { setSaving(false); } }; if (loading) { return ( ); } return (
{t('admin.settings.security.title', 'Security')} {t('admin.settings.security.description', 'Configure authentication, login behaviour, and security policies.')}
{/* Authentication Settings */} {t('admin.settings.security.authentication', 'Authentication')}
{t('admin.settings.security.enableLogin', 'Enable Login')} {t('admin.settings.security.enableLogin.description', 'Require users to log in before accessing the application')}
setSettings({ ...settings, enableLogin: e.target.checked })} />