feat: move sso and ldap logins into plugins (C2)

This commit is contained in:
LukeGus committed 2026-09-24 18:23:20 -05:00
1 parent 5c18435105
commit 925da4a661
223 files changed
+25778 -6820

No files matched your search

+1 -89
View File
@@ -57,12 +57,6 @@ import {
uploadManualSslCertificate,
type AcmeSettings,
} from "@/api/acme-ssl-api";
import {
getAdminSSOProviders,
updateSSOProvider,
deleteSSOProvider,
} from "@/api/sso-provider-api";
import type { SSOProvider } from "@/types/index";
import {
type ApiKey,
type CreatedApiKey,
@@ -85,10 +79,8 @@ import {
AdminDatabaseSection,
AdminGeneralSettingsSection,
AdminHostDefaultsSection,
AdminSSOSection,
AdminSSLSection,
} from "./AdminSettingsSections";
import { SSOProviderDialog } from "./SSOProviderDialog";
import { AdminApiKeysSection } from "./AdminApiKeysSection";
import { AdminAuditLogSection } from "./AdminAuditLogSection";
import {
@@ -168,15 +160,11 @@ export function AdminSettingsPanel({
const [brandingSaving, setBrandingSaving] = useState(false);
const { applyBranding } = useBranding();
// SSO / auto-provision state
// External login state
const [oidcAutoProvision, setOidcAutoProvision] = useState(false);
const [secondFactorAfterExternalLogin, setSecondFactorAfterExternalLogin] =
useState(false);
const [oidcSilentLoginDefault, setOidcSilentLoginDefault] = useState(false);
const [ssoProviders, setSsoProviders] = useState<SSOProvider[]>([]);
const [ssoDialogOpen, setSsoDialogOpen] = useState(false);
const [ssoDialogProvider, setSsoDialogProvider] =
useState<SSOProvider | null>(null);
// Create user dialog
const [createUserOpen, setCreateUserOpen] = useState(false);
@@ -259,7 +247,6 @@ export function AdminSettingsPanel({
loadRoles();
loadApiKeys();
loadGeneralSettings();
loadSSOProviders();
}, []);
// Debounced so typing in the search box does not fire a request per keystroke.
@@ -414,15 +401,6 @@ export function AdminSettingsPanel({
.catch(() => {});
}
async function loadSSOProviders() {
try {
const providers = await getAdminSSOProviders();
setSsoProviders(providers);
} catch {
// non-fatal
}
}
function toggle(id: AdminSection) {
setOpenSections((prev) => {
const next = new Set(prev);
@@ -627,43 +605,6 @@ export function AdminSettingsPanel({
}
}
function handleAddProvider() {
setSsoDialogProvider(null);
setSsoDialogOpen(true);
}
function handleEditProvider(provider: SSOProvider) {
setSsoDialogProvider(provider);
setSsoDialogOpen(true);
}
async function handleDeleteProvider(id: number) {
if (!window.confirm(t("admin.ssoDeleteConfirm"))) return;
try {
await deleteSSOProvider(id);
setSsoProviders((prev) => prev.filter((p) => p.id !== id));
toast.success(t("common.deleted"));
} catch (e) {
toast.error(apiErrorMessage(e, t("common.deleteFailed")));
}
}
async function handleToggleProviderEnabled(id: number, enabled: boolean) {
const provider = ssoProviders.find((p) => p.id === id);
if (!provider) return;
setSsoProviders((prev) =>
prev.map((p) => (p.id === id ? { ...p, enabled } : p)),
);
try {
await updateSSOProvider(id, { enabled });
} catch (e) {
setSsoProviders((prev) =>
prev.map((p) => (p.id === id ? { ...p, enabled: !enabled } : p)),
);
toast.error(apiErrorMessage(e, t("common.saveFailed")));
}
}
async function handleSaveAcmeSettings() {
try {
const payload: Parameters<typeof updateAcmeSslSettings>[0] = {
@@ -736,18 +677,6 @@ export function AdminSettingsPanel({
}
}
function handleProviderSaved(saved: SSOProvider) {
setSsoProviders((prev) => {
const idx = prev.findIndex((p) => p.id === saved.id);
if (idx >= 0) {
const next = [...prev];
next[idx] = saved;
return next;
}
return [...prev, saved];
});
}
async function handleCreateUser() {
if (!newUsername.trim() || !newPassword.trim()) {
toast.error(t("admin.createUserRequired"));
@@ -1043,23 +972,6 @@ export function AdminSettingsPanel({
handleSaveLogLevel={handleSaveLogLevel}
/>
<AdminSSOSection
open={openSections.has("sso")}
onToggle={() => toggle("sso")}
providers={ssoProviders}
onAddProvider={handleAddProvider}
onEditProvider={handleEditProvider}
onDeleteProvider={handleDeleteProvider}
onToggleEnabled={handleToggleProviderEnabled}
/>
<SSOProviderDialog
open={ssoDialogOpen}
onOpenChange={setSsoDialogOpen}
provider={ssoDialogProvider}
onSaved={handleProviderSaved}
/>
<AdminUsersSection
open={openSections.has("users")}
onToggle={() => toggle("users")}