@burdenoff/microfe-auth 2026.510.127
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/auth/AuthRoot.d.ts +30 -0
- package/dist/auth/AuthRoot.d.ts.map +1 -0
- package/dist/auth/AuthRoot.js +82 -0
- package/dist/auth/AuthRoot.js.map +1 -0
- package/dist/auth/AuthRoutes.d.ts +29 -0
- package/dist/auth/AuthRoutes.d.ts.map +1 -0
- package/dist/auth/AuthRoutes.js +271 -0
- package/dist/auth/AuthRoutes.js.map +1 -0
- package/dist/auth/components/AuthIcons.d.ts +17 -0
- package/dist/auth/components/AuthIcons.d.ts.map +1 -0
- package/dist/auth/components/AuthIcons.js +197 -0
- package/dist/auth/components/AuthIcons.js.map +1 -0
- package/dist/auth/components/AuthLayout.d.ts +17 -0
- package/dist/auth/components/AuthLayout.d.ts.map +1 -0
- package/dist/auth/components/AuthLayout.js +237 -0
- package/dist/auth/components/AuthLayout.js.map +1 -0
- package/dist/auth/components/CaptchaV2.d.ts +16 -0
- package/dist/auth/components/CaptchaV2.d.ts.map +1 -0
- package/dist/auth/components/CaptchaV2.js +47 -0
- package/dist/auth/components/CaptchaV2.js.map +1 -0
- package/dist/auth/components/ConfirmActionDialog.d.ts +16 -0
- package/dist/auth/components/ConfirmActionDialog.d.ts.map +1 -0
- package/dist/auth/components/ConfirmActionDialog.js +68 -0
- package/dist/auth/components/ConfirmActionDialog.js.map +1 -0
- package/dist/auth/components/index.d.ts +4 -0
- package/dist/auth/components/index.d.ts.map +1 -0
- package/dist/auth/components/profile/UserProfileMenu.d.ts +42 -0
- package/dist/auth/components/profile/UserProfileMenu.d.ts.map +1 -0
- package/dist/auth/components/profile/UserProfileMenu.js +91 -0
- package/dist/auth/components/profile/UserProfileMenu.js.map +1 -0
- package/dist/auth/components/workspace/WorkspaceSelector.d.ts +76 -0
- package/dist/auth/components/workspace/WorkspaceSelector.d.ts.map +1 -0
- package/dist/auth/components/workspace/WorkspaceSelector.js +240 -0
- package/dist/auth/components/workspace/WorkspaceSelector.js.map +1 -0
- package/dist/auth/constants/permissions.d.ts +30 -0
- package/dist/auth/constants/permissions.d.ts.map +1 -0
- package/dist/auth/constants/permissions.js +18 -0
- package/dist/auth/constants/permissions.js.map +1 -0
- package/dist/auth/constants/sessionKeys.d.ts +18 -0
- package/dist/auth/constants/sessionKeys.d.ts.map +1 -0
- package/dist/auth/constants/sessionKeys.js +6 -0
- package/dist/auth/constants/sessionKeys.js.map +1 -0
- package/dist/auth/hooks/index.d.ts +18 -0
- package/dist/auth/hooks/index.d.ts.map +1 -0
- package/dist/auth/hooks/index.js +16 -0
- package/dist/auth/hooks/useAccountOperations.d.ts +19 -0
- package/dist/auth/hooks/useAccountOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useAccountOperations.js +52 -0
- package/dist/auth/hooks/useAccountOperations.js.map +1 -0
- package/dist/auth/hooks/useApiKeyOperations.d.ts +22 -0
- package/dist/auth/hooks/useApiKeyOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useApiKeyOperations.js +4 -0
- package/dist/auth/hooks/useAppOperations.d.ts +26 -0
- package/dist/auth/hooks/useAppOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useAppOperations.js +4 -0
- package/dist/auth/hooks/useAuthOperations.d.ts +57 -0
- package/dist/auth/hooks/useAuthOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthOperations.js +236 -0
- package/dist/auth/hooks/useAuthOperations.js.map +1 -0
- package/dist/auth/hooks/useAuthPermissions.d.ts +20 -0
- package/dist/auth/hooks/useAuthPermissions.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthPermissions.js +22 -0
- package/dist/auth/hooks/useAuthPermissions.js.map +1 -0
- package/dist/auth/hooks/useCaptchaV3.d.ts +13 -0
- package/dist/auth/hooks/useCaptchaV3.d.ts.map +1 -0
- package/dist/auth/hooks/useCaptchaV3.js +19 -0
- package/dist/auth/hooks/useCaptchaV3.js.map +1 -0
- package/dist/auth/hooks/useContextSwitcherData.d.ts +106 -0
- package/dist/auth/hooks/useContextSwitcherData.d.ts.map +1 -0
- package/dist/auth/hooks/useContextSwitcherData.js +466 -0
- package/dist/auth/hooks/useContextSwitcherData.js.map +1 -0
- package/dist/auth/hooks/useDelegationOperations.d.ts +25 -0
- package/dist/auth/hooks/useDelegationOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useDelegationOperations.js +4 -0
- package/dist/auth/hooks/useMfaOperations.d.ts +18 -0
- package/dist/auth/hooks/useMfaOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useMfaOperations.js +103 -0
- package/dist/auth/hooks/useMfaOperations.js.map +1 -0
- package/dist/auth/hooks/useMyWorkspaces.d.ts +45 -0
- package/dist/auth/hooks/useMyWorkspaces.d.ts.map +1 -0
- package/dist/auth/hooks/useMyWorkspaces.js +140 -0
- package/dist/auth/hooks/useMyWorkspaces.js.map +1 -0
- package/dist/auth/hooks/useOAuthOperations.d.ts +19 -0
- package/dist/auth/hooks/useOAuthOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useOAuthOperations.js +103 -0
- package/dist/auth/hooks/useOAuthOperations.js.map +1 -0
- package/dist/auth/hooks/usePasswordOperations.d.ts +13 -0
- package/dist/auth/hooks/usePasswordOperations.d.ts.map +1 -0
- package/dist/auth/hooks/usePasswordOperations.js +56 -0
- package/dist/auth/hooks/usePasswordOperations.js.map +1 -0
- package/dist/auth/hooks/useSessionOperations.d.ts +41 -0
- package/dist/auth/hooks/useSessionOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useSessionOperations.js +59 -0
- package/dist/auth/hooks/useSessionOperations.js.map +1 -0
- package/dist/auth/hooks/useSsoOperations.d.ts +65 -0
- package/dist/auth/hooks/useSsoOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useSsoOperations.js +236 -0
- package/dist/auth/hooks/useSsoOperations.js.map +1 -0
- package/dist/auth/hooks/useTokenRefresh.d.ts +56 -0
- package/dist/auth/hooks/useTokenRefresh.d.ts.map +1 -0
- package/dist/auth/hooks/useTokenRefresh.js +53 -0
- package/dist/auth/hooks/useTokenRefresh.js.map +1 -0
- package/dist/auth/hooks/useUserOperations.d.ts +32 -0
- package/dist/auth/hooks/useUserOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useUserOperations.js +100 -0
- package/dist/auth/hooks/useUserOperations.js.map +1 -0
- package/dist/auth/hooks/useWorkspaceOperations.d.ts +35 -0
- package/dist/auth/hooks/useWorkspaceOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useWorkspaceOperations.js +35 -0
- package/dist/auth/hooks/useWorkspaceOperations.js.map +1 -0
- package/dist/auth/hooks/useWorkspaceToken.d.ts +56 -0
- package/dist/auth/hooks/useWorkspaceToken.d.ts.map +1 -0
- package/dist/auth/hooks/useWorkspaceToken.js +94 -0
- package/dist/auth/hooks/useWorkspaceToken.js.map +1 -0
- package/dist/auth/index.d.ts +63 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +18 -0
- package/dist/auth/pages/ApiKeysPage.d.ts +5 -0
- package/dist/auth/pages/ApiKeysPage.d.ts.map +1 -0
- package/dist/auth/pages/AppsPage.d.ts +5 -0
- package/dist/auth/pages/AppsPage.d.ts.map +1 -0
- package/dist/auth/pages/AuditLogPage.d.ts +5 -0
- package/dist/auth/pages/AuditLogPage.d.ts.map +1 -0
- package/dist/auth/pages/AuditLogPage.js +129 -0
- package/dist/auth/pages/AuditLogPage.js.map +1 -0
- package/dist/auth/pages/DelegationsPage.d.ts +5 -0
- package/dist/auth/pages/DelegationsPage.d.ts.map +1 -0
- package/dist/auth/pages/EmailVerifyPage.d.ts +5 -0
- package/dist/auth/pages/EmailVerifyPage.d.ts.map +1 -0
- package/dist/auth/pages/EmailVerifyPage.js +166 -0
- package/dist/auth/pages/EmailVerifyPage.js.map +1 -0
- package/dist/auth/pages/LoginPage.d.ts +6 -0
- package/dist/auth/pages/LoginPage.d.ts.map +1 -0
- package/dist/auth/pages/LoginPage.js +575 -0
- package/dist/auth/pages/LoginPage.js.map +1 -0
- package/dist/auth/pages/MagicLinkPage.d.ts +6 -0
- package/dist/auth/pages/MagicLinkPage.d.ts.map +1 -0
- package/dist/auth/pages/MagicLinkPage.js +219 -0
- package/dist/auth/pages/MagicLinkPage.js.map +1 -0
- package/dist/auth/pages/MfaSetupPage.d.ts +5 -0
- package/dist/auth/pages/MfaSetupPage.d.ts.map +1 -0
- package/dist/auth/pages/MfaSetupPage.js +341 -0
- package/dist/auth/pages/MfaSetupPage.js.map +1 -0
- package/dist/auth/pages/MfaVerifyPage.d.ts +7 -0
- package/dist/auth/pages/MfaVerifyPage.d.ts.map +1 -0
- package/dist/auth/pages/MfaVerifyPage.js +189 -0
- package/dist/auth/pages/MfaVerifyPage.js.map +1 -0
- package/dist/auth/pages/OAuthCallbackPage.d.ts +7 -0
- package/dist/auth/pages/OAuthCallbackPage.d.ts.map +1 -0
- package/dist/auth/pages/OAuthCallbackPage.js +100 -0
- package/dist/auth/pages/OAuthCallbackPage.js.map +1 -0
- package/dist/auth/pages/PasswordResetPage.d.ts +6 -0
- package/dist/auth/pages/PasswordResetPage.d.ts.map +1 -0
- package/dist/auth/pages/PasswordResetPage.js +352 -0
- package/dist/auth/pages/PasswordResetPage.js.map +1 -0
- package/dist/auth/pages/ReactivatePage.d.ts +6 -0
- package/dist/auth/pages/ReactivatePage.d.ts.map +1 -0
- package/dist/auth/pages/ReactivatePage.js +217 -0
- package/dist/auth/pages/ReactivatePage.js.map +1 -0
- package/dist/auth/pages/RegisterPage.d.ts +5 -0
- package/dist/auth/pages/RegisterPage.d.ts.map +1 -0
- package/dist/auth/pages/RegisterPage.js +439 -0
- package/dist/auth/pages/RegisterPage.js.map +1 -0
- package/dist/auth/pages/SSORelayCallbackPage.d.ts +8 -0
- package/dist/auth/pages/SSORelayCallbackPage.d.ts.map +1 -0
- package/dist/auth/pages/SSORelayCallbackPage.js +48 -0
- package/dist/auth/pages/SSORelayCallbackPage.js.map +1 -0
- package/dist/auth/pages/SSORelayPage.d.ts +18 -0
- package/dist/auth/pages/SSORelayPage.d.ts.map +1 -0
- package/dist/auth/pages/SSORelayPage.js +134 -0
- package/dist/auth/pages/SSORelayPage.js.map +1 -0
- package/dist/auth/pages/SecurityPage.d.ts +5 -0
- package/dist/auth/pages/SecurityPage.d.ts.map +1 -0
- package/dist/auth/pages/SecurityPage.js +587 -0
- package/dist/auth/pages/SecurityPage.js.map +1 -0
- package/dist/auth/pages/SessionBridgePage.d.ts +14 -0
- package/dist/auth/pages/SessionBridgePage.d.ts.map +1 -0
- package/dist/auth/pages/SessionBridgePage.js +231 -0
- package/dist/auth/pages/SessionBridgePage.js.map +1 -0
- package/dist/auth/pages/SessionsPage.d.ts +5 -0
- package/dist/auth/pages/SessionsPage.d.ts.map +1 -0
- package/dist/auth/pages/SessionsPage.js +258 -0
- package/dist/auth/pages/SessionsPage.js.map +1 -0
- package/dist/auth/pages/SsoCallbackPage.d.ts +8 -0
- package/dist/auth/pages/SsoCallbackPage.d.ts.map +1 -0
- package/dist/auth/pages/SsoCallbackPage.js +188 -0
- package/dist/auth/pages/SsoCallbackPage.js.map +1 -0
- package/dist/auth/pages/SsoConfigPage.d.ts +6 -0
- package/dist/auth/pages/SsoConfigPage.d.ts.map +1 -0
- package/dist/auth/pages/SsoConfigPage.js +1144 -0
- package/dist/auth/pages/SsoConfigPage.js.map +1 -0
- package/dist/auth/pages/SsoLoginPage.d.ts +7 -0
- package/dist/auth/pages/SsoLoginPage.d.ts.map +1 -0
- package/dist/auth/pages/SsoLoginPage.js +236 -0
- package/dist/auth/pages/SsoLoginPage.js.map +1 -0
- package/dist/auth/pages/UserDetailsPage.d.ts +11 -0
- package/dist/auth/pages/UserDetailsPage.d.ts.map +1 -0
- package/dist/auth/pages/UserDetailsPage.js +338 -0
- package/dist/auth/pages/UserDetailsPage.js.map +1 -0
- package/dist/auth/pages/UserProfilePage.d.ts +5 -0
- package/dist/auth/pages/UserProfilePage.d.ts.map +1 -0
- package/dist/auth/pages/UserProfilePage.js +445 -0
- package/dist/auth/pages/UserProfilePage.js.map +1 -0
- package/dist/auth/pages/UsersPage.d.ts +5 -0
- package/dist/auth/pages/UsersPage.d.ts.map +1 -0
- package/dist/auth/pages/UsersPage.js +899 -0
- package/dist/auth/pages/UsersPage.js.map +1 -0
- package/dist/auth/providers/AuthProvider.d.ts +18 -0
- package/dist/auth/providers/AuthProvider.d.ts.map +1 -0
- package/dist/auth/providers/AuthProvider.js +36 -0
- package/dist/auth/providers/AuthProvider.js.map +1 -0
- package/dist/auth/providers/CaptchaProvider.d.ts +13 -0
- package/dist/auth/providers/CaptchaProvider.d.ts.map +1 -0
- package/dist/auth/providers/CaptchaProvider.js +21 -0
- package/dist/auth/providers/CaptchaProvider.js.map +1 -0
- package/dist/auth/store/authStore.d.ts +91 -0
- package/dist/auth/store/authStore.d.ts.map +1 -0
- package/dist/auth/store/authStore.js +314 -0
- package/dist/auth/store/authStore.js.map +1 -0
- package/dist/auth/types/index.d.ts +636 -0
- package/dist/auth/types/index.d.ts.map +1 -0
- package/dist/auth/utils/captchaConfig.d.ts +4 -0
- package/dist/auth/utils/captchaConfig.d.ts.map +1 -0
- package/dist/auth/utils/captchaConfig.js +13 -0
- package/dist/auth/utils/captchaConfig.js.map +1 -0
- package/dist/auth/utils/formatters.d.ts +37 -0
- package/dist/auth/utils/formatters.d.ts.map +1 -0
- package/dist/auth/utils/formatters.js +48 -0
- package/dist/auth/utils/formatters.js.map +1 -0
- package/dist/auth/utils/gatewayBaseUrls.d.ts +6 -0
- package/dist/auth/utils/gatewayBaseUrls.d.ts.map +1 -0
- package/dist/auth/utils/gatewayBaseUrls.js +18 -0
- package/dist/auth/utils/gatewayBaseUrls.js.map +1 -0
- package/dist/auth/utils/index.d.ts +3 -0
- package/dist/auth/utils/index.d.ts.map +1 -0
- package/dist/auth/utils/validation.d.ts +30 -0
- package/dist/auth/utils/validation.d.ts.map +1 -0
- package/dist/auth/utils/validation.js +15 -0
- package/dist/auth/utils/validation.js.map +1 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2978 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-operations.js +944 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +21253 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +55214 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/microfe-auth.css +3 -0
- package/dist/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js +70 -0
- package/dist/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js.map +1 -0
- package/dist/node_modules/object-assign/index.js +41 -0
- package/dist/node_modules/object-assign/index.js.map +1 -0
- package/dist/node_modules/prop-types/checkPropTypes.js +46 -0
- package/dist/node_modules/prop-types/checkPropTypes.js.map +1 -0
- package/dist/node_modules/prop-types/factoryWithThrowingShims.js +49 -0
- package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +1 -0
- package/dist/node_modules/prop-types/factoryWithTypeCheckers.js +272 -0
- package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +1 -0
- package/dist/node_modules/prop-types/index.js +16 -0
- package/dist/node_modules/prop-types/index.js.map +1 -0
- package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js +10 -0
- package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +1 -0
- package/dist/node_modules/prop-types/lib/has.js +10 -0
- package/dist/node_modules/prop-types/lib/has.js.map +1 -0
- package/dist/node_modules/qrcode.react/lib/esm/index.js +959 -0
- package/dist/node_modules/qrcode.react/lib/esm/index.js.map +1 -0
- package/dist/node_modules/react-async-script/lib/esm/async-script-loader.js +114 -0
- package/dist/node_modules/react-async-script/lib/esm/async-script-loader.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/index.js +8 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/index.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js +20 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha.js +148 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha-v3/dist/react-google-recaptcha-v3.esm.js +445 -0
- package/dist/node_modules/react-google-recaptcha-v3/dist/react-google-recaptcha-v3.esm.js.map +1 -0
- package/dist/node_modules/react-is/cjs/react-is.development.js +84 -0
- package/dist/node_modules/react-is/cjs/react-is.development.js.map +1 -0
- package/dist/node_modules/react-is/cjs/react-is.production.min.js +64 -0
- package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
- package/dist/node_modules/react-is/index.js +12 -0
- package/dist/node_modules/react-is/index.js.map +1 -0
- package/dist/shared/hooks/index.d.ts +7 -0
- package/dist/shared/hooks/index.d.ts.map +1 -0
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/types/index.d.ts +109 -0
- package/dist/shared/types/index.d.ts.map +1 -0
- package/dist/utils/nativeBridge.d.ts +3 -0
- package/dist/utils/nativeBridge.d.ts.map +1 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +114 -0
|
@@ -0,0 +1,1144 @@
|
|
|
1
|
+
import { useSsoOperations as e } from "../hooks/useSsoOperations.js";
|
|
2
|
+
import { useAuthPermissions as t } from "../hooks/useAuthPermissions.js";
|
|
3
|
+
import "../hooks/index.js";
|
|
4
|
+
import { AlertIcon as n, SpinnerIcon as r } from "../components/AuthIcons.js";
|
|
5
|
+
import { ConfirmActionDialog as i } from "../components/ConfirmActionDialog.js";
|
|
6
|
+
import { nativeCopyText as a, nativeImpact as o, nativeNotify as s } from "../../utils/nativeBridge.js";
|
|
7
|
+
import { useCallback as c, useEffect as l, useRef as u, useState as d } from "react";
|
|
8
|
+
import { useNavigate as f } from "react-router-dom";
|
|
9
|
+
import { useI18n as p } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
10
|
+
import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
11
|
+
//#region src/auth/pages/SsoConfigPage.tsx
|
|
12
|
+
var _ = async (e) => {
|
|
13
|
+
o("light"), s(await a(e) ? "success" : "error");
|
|
14
|
+
};
|
|
15
|
+
function v(e) {
|
|
16
|
+
try {
|
|
17
|
+
let t = new DOMParser().parseFromString(e, "text/xml"), n = t.querySelector("parsererror");
|
|
18
|
+
if (n) return console.error("XML parse error:", n.textContent), null;
|
|
19
|
+
let r = t.querySelector("EntityDescriptor")?.getAttribute("entityID") || "", i = t.querySelector("IDPSSODescriptor");
|
|
20
|
+
if (!i) return console.error("No IDPSSODescriptor found"), null;
|
|
21
|
+
let a = i.querySelectorAll("SingleSignOnService"), o = "";
|
|
22
|
+
for (let e of a) {
|
|
23
|
+
let t = e.getAttribute("Binding") || "";
|
|
24
|
+
if (t.includes("HTTP-Redirect") || t.includes("HTTP-POST")) {
|
|
25
|
+
o = e.getAttribute("Location") || "";
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
let s = i.querySelectorAll("SingleLogoutService"), c = "";
|
|
30
|
+
for (let e of s) {
|
|
31
|
+
let t = e.getAttribute("Binding") || "";
|
|
32
|
+
if (t.includes("HTTP-Redirect") || t.includes("HTTP-POST")) {
|
|
33
|
+
c = e.getAttribute("Location") || "";
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
let l = t.querySelector("X509Certificate")?.textContent?.trim() || "";
|
|
38
|
+
return l && !l.includes("-----BEGIN") && (l = `-----BEGIN CERTIFICATE-----\n${l}\n-----END CERTIFICATE-----`), !r || !o || !l ? (console.error("Missing required SAML metadata fields"), null) : {
|
|
39
|
+
entityId: r,
|
|
40
|
+
ssoUrl: o,
|
|
41
|
+
sloUrl: c,
|
|
42
|
+
certificate: l
|
|
43
|
+
};
|
|
44
|
+
} catch (e) {
|
|
45
|
+
return console.error("Failed to parse SAML metadata:", e), null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function y() {
|
|
49
|
+
let a = f(), { canManageSsoConfig: y, isLoading: ee } = t(), b = u(null), { ssoConfig: x, oidcConfig: S, isLoading: C, isSaving: w, isDeleting: T, saveSsoConfig: E, deleteSsoConfig: D } = e("burdenoff.com"), { t: O } = p(), k = c((e, t) => {
|
|
50
|
+
let n = O(e);
|
|
51
|
+
return n === e ? t : n;
|
|
52
|
+
}, [O]), [A, j] = d("saml"), [M, N] = d(!1), [P, F] = d(!1), [I, L] = d(null), [R, z] = d(null), [B, V] = d(""), [H, U] = d(!1), [W, G] = d(!1), [K, q] = d({
|
|
53
|
+
client_name: "",
|
|
54
|
+
redirect_uris: "",
|
|
55
|
+
grant_types: ["authorization_code", "refresh_token"],
|
|
56
|
+
token_endpoint_auth_method: "none"
|
|
57
|
+
}), [J, Y] = d(!1), [X, Z] = d(null), [Q, $] = d({
|
|
58
|
+
entityId: "",
|
|
59
|
+
ssoUrl: "",
|
|
60
|
+
sloUrl: "",
|
|
61
|
+
certificate: "",
|
|
62
|
+
enabled: !1
|
|
63
|
+
});
|
|
64
|
+
return l(() => {
|
|
65
|
+
x && $({
|
|
66
|
+
entityId: x.entityId || "",
|
|
67
|
+
ssoUrl: x.ssoUrl || "",
|
|
68
|
+
sloUrl: x.sloUrl || "",
|
|
69
|
+
certificate: x.certificate || "",
|
|
70
|
+
enabled: x.enabled || !1
|
|
71
|
+
});
|
|
72
|
+
}, [x]), ee ? /* @__PURE__ */ h("div", {
|
|
73
|
+
className: "max-w-5xl mx-auto p-6",
|
|
74
|
+
children: /* @__PURE__ */ g("div", {
|
|
75
|
+
className: "text-center py-16",
|
|
76
|
+
children: [/* @__PURE__ */ h(r, { className: "w-8 h-8 mx-auto text-text-secondary animate-spin" }), /* @__PURE__ */ h("p", {
|
|
77
|
+
className: "mt-4 text-text-secondary",
|
|
78
|
+
children: k("auth.sso.loadingPermissions", "Loading permissions...")
|
|
79
|
+
})]
|
|
80
|
+
})
|
|
81
|
+
}) : y ? /* @__PURE__ */ g("div", {
|
|
82
|
+
className: "max-w-5xl mx-auto p-6",
|
|
83
|
+
children: [
|
|
84
|
+
/* @__PURE__ */ h(i, {
|
|
85
|
+
open: P,
|
|
86
|
+
onOpenChange: F,
|
|
87
|
+
title: k("auth.sso.deleteConfirmTitle", "Delete SSO configuration?"),
|
|
88
|
+
description: k("auth.sso.deleteConfirmDesc", "Users will immediately lose the ability to sign in with this SSO setup until a new configuration is saved."),
|
|
89
|
+
confirmText: k("auth.sso.deleteConfirmButton", "Delete configuration"),
|
|
90
|
+
variant: "danger",
|
|
91
|
+
isPending: T,
|
|
92
|
+
onConfirm: async () => {
|
|
93
|
+
L(null), z(null), o("medium");
|
|
94
|
+
try {
|
|
95
|
+
await D(), s("success"), z(k("auth.sso.deleteSuccess", "SSO configuration deleted successfully.")), F(!1), $({
|
|
96
|
+
entityId: "",
|
|
97
|
+
ssoUrl: "",
|
|
98
|
+
sloUrl: "",
|
|
99
|
+
certificate: "",
|
|
100
|
+
enabled: !1
|
|
101
|
+
});
|
|
102
|
+
} catch (e) {
|
|
103
|
+
s("error"), L(e instanceof Error ? e.message : k("auth.sso.deleteFailed", "Failed to delete configuration"));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}),
|
|
107
|
+
/* @__PURE__ */ g("div", {
|
|
108
|
+
className: "flex items-center justify-between mb-8",
|
|
109
|
+
children: [/* @__PURE__ */ g("div", {
|
|
110
|
+
className: "flex items-center gap-4",
|
|
111
|
+
children: [/* @__PURE__ */ h("button", {
|
|
112
|
+
onClick: () => a("/auth/security"),
|
|
113
|
+
className: "p-2 rounded-lg hover:bg-bg-sunken transition-colors",
|
|
114
|
+
children: /* @__PURE__ */ h("svg", {
|
|
115
|
+
className: "w-5 h-5 text-text-secondary",
|
|
116
|
+
fill: "none",
|
|
117
|
+
viewBox: "0 0 24 24",
|
|
118
|
+
stroke: "currentColor",
|
|
119
|
+
children: /* @__PURE__ */ h("path", {
|
|
120
|
+
strokeLinecap: "round",
|
|
121
|
+
strokeLinejoin: "round",
|
|
122
|
+
strokeWidth: 2,
|
|
123
|
+
d: "M10 19l-7-7m0 0l7-7m-7 7h18"
|
|
124
|
+
})
|
|
125
|
+
})
|
|
126
|
+
}), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("h1", {
|
|
127
|
+
className: "text-2xl font-semibold text-text-primary",
|
|
128
|
+
children: k("auth.sso.title", "Single Sign-On (SSO)")
|
|
129
|
+
}), /* @__PURE__ */ h("p", {
|
|
130
|
+
className: "text-text-secondary mt-1",
|
|
131
|
+
children: k("auth.sso.description", "Configure enterprise SSO with SAML 2.0 or OIDC")
|
|
132
|
+
})] })]
|
|
133
|
+
}), x && /* @__PURE__ */ g("div", {
|
|
134
|
+
className: "flex items-center gap-3",
|
|
135
|
+
children: [/* @__PURE__ */ h("span", {
|
|
136
|
+
className: `px-3 py-1 rounded-full text-sm font-medium ${Q.enabled ? "bg-status-success-bg-subtle text-status-success-text" : "bg-bg-sunken text-text-secondary"}`,
|
|
137
|
+
children: Q.enabled ? k("auth.sso.enabled", "Enabled") : k("auth.sso.disabled", "Disabled")
|
|
138
|
+
}), /* @__PURE__ */ h("button", {
|
|
139
|
+
onClick: async () => {
|
|
140
|
+
L(null);
|
|
141
|
+
try {
|
|
142
|
+
await E({
|
|
143
|
+
...Q,
|
|
144
|
+
enabled: !Q.enabled
|
|
145
|
+
}), z(Q.enabled ? k("auth.sso.ssoDisabled", "SSO disabled") : k("auth.sso.ssoEnabled", "SSO enabled"));
|
|
146
|
+
} catch (e) {
|
|
147
|
+
L(e instanceof Error ? e.message : k("auth.sso.statusUpdateFailed", "Failed to update status"));
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
disabled: w,
|
|
151
|
+
className: "px-4 py-2 rounded-lg border border-border-default text-text-primary hover:bg-bg-sunken transition-colors text-sm font-medium",
|
|
152
|
+
children: Q.enabled ? k("auth.sso.disable", "Disable") : k("auth.sso.enable", "Enable")
|
|
153
|
+
})]
|
|
154
|
+
})]
|
|
155
|
+
}),
|
|
156
|
+
I && /* @__PURE__ */ g("div", {
|
|
157
|
+
className: "mb-6 flex items-start gap-3 p-4 rounded-xl bg-status-error-bg-subtle border border-status-error-border",
|
|
158
|
+
children: [/* @__PURE__ */ h(n, { className: "w-5 h-5 text-status-error-text flex-shrink-0 mt-0.5" }), /* @__PURE__ */ g("div", {
|
|
159
|
+
className: "flex-1",
|
|
160
|
+
children: [/* @__PURE__ */ h("p", {
|
|
161
|
+
className: "text-sm text-status-error-text",
|
|
162
|
+
children: I
|
|
163
|
+
}), /* @__PURE__ */ h("button", {
|
|
164
|
+
onClick: () => L(null),
|
|
165
|
+
className: "mt-2 text-sm text-status-error-text hover:underline",
|
|
166
|
+
children: k("auth.sso.dismiss", "Dismiss")
|
|
167
|
+
})]
|
|
168
|
+
})]
|
|
169
|
+
}),
|
|
170
|
+
R && /* @__PURE__ */ g("div", {
|
|
171
|
+
className: "mb-6 flex items-start gap-3 p-4 rounded-xl bg-status-success-bg-subtle border border-status-success-border",
|
|
172
|
+
children: [/* @__PURE__ */ h("svg", {
|
|
173
|
+
className: "w-5 h-5 text-status-success-text flex-shrink-0 mt-0.5",
|
|
174
|
+
fill: "currentColor",
|
|
175
|
+
viewBox: "0 0 20 20",
|
|
176
|
+
children: /* @__PURE__ */ h("path", {
|
|
177
|
+
fillRule: "evenodd",
|
|
178
|
+
d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",
|
|
179
|
+
clipRule: "evenodd"
|
|
180
|
+
})
|
|
181
|
+
}), /* @__PURE__ */ g("div", {
|
|
182
|
+
className: "flex-1",
|
|
183
|
+
children: [/* @__PURE__ */ h("p", {
|
|
184
|
+
className: "text-sm text-status-success-text",
|
|
185
|
+
children: R
|
|
186
|
+
}), /* @__PURE__ */ h("button", {
|
|
187
|
+
onClick: () => z(null),
|
|
188
|
+
className: "mt-2 text-sm text-status-success-text hover:underline",
|
|
189
|
+
children: k("auth.sso.dismiss", "Dismiss")
|
|
190
|
+
})]
|
|
191
|
+
})]
|
|
192
|
+
}),
|
|
193
|
+
/* @__PURE__ */ h("div", {
|
|
194
|
+
className: "mb-6 border-b border-border-subtle",
|
|
195
|
+
children: /* @__PURE__ */ h("nav", {
|
|
196
|
+
className: "flex gap-6",
|
|
197
|
+
children: [
|
|
198
|
+
{
|
|
199
|
+
id: "saml",
|
|
200
|
+
label: k("auth.sso.samlTab", "SAML 2.0"),
|
|
201
|
+
icon: "🔐"
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
id: "oidc",
|
|
205
|
+
label: k("auth.sso.oidcTab", "OIDC Provider"),
|
|
206
|
+
icon: "🌐"
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
id: "clients",
|
|
210
|
+
label: k("auth.sso.clientsTab", "OIDC Clients"),
|
|
211
|
+
icon: "🔑"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
id: "test",
|
|
215
|
+
label: k("auth.sso.testTab", "Test SSO"),
|
|
216
|
+
icon: "🧪"
|
|
217
|
+
}
|
|
218
|
+
].map((e) => /* @__PURE__ */ g("button", {
|
|
219
|
+
onClick: () => j(e.id),
|
|
220
|
+
className: `pb-3 text-sm font-medium transition-colors relative ${A === e.id ? "text-text-link" : "text-text-secondary hover:text-text-primary"}`,
|
|
221
|
+
children: [/* @__PURE__ */ g("span", {
|
|
222
|
+
className: "flex items-center gap-2",
|
|
223
|
+
children: [/* @__PURE__ */ h("span", { children: e.icon }), e.label]
|
|
224
|
+
}), A === e.id && /* @__PURE__ */ h("span", { className: "absolute bottom-0 left-0 right-0 h-0.5 bg-action-primary-bg" })]
|
|
225
|
+
}, e.id))
|
|
226
|
+
})
|
|
227
|
+
}),
|
|
228
|
+
C && /* @__PURE__ */ g("div", {
|
|
229
|
+
className: "flex items-center justify-center py-12",
|
|
230
|
+
children: [/* @__PURE__ */ h(r, { className: "w-8 h-8 text-text-link animate-spin" }), /* @__PURE__ */ h("span", {
|
|
231
|
+
className: "ml-3 text-text-secondary",
|
|
232
|
+
children: k("auth.sso.loadingConfig", "Loading configuration...")
|
|
233
|
+
})]
|
|
234
|
+
}),
|
|
235
|
+
!C && A === "saml" && /* @__PURE__ */ g("div", {
|
|
236
|
+
className: "space-y-6",
|
|
237
|
+
children: [
|
|
238
|
+
/* @__PURE__ */ g("div", {
|
|
239
|
+
className: "p-4 rounded-xl bg-status-info-bg-subtle border border-status-info-border",
|
|
240
|
+
children: [
|
|
241
|
+
/* @__PURE__ */ h("h3", {
|
|
242
|
+
className: "font-medium text-status-info-text mb-2",
|
|
243
|
+
children: k("auth.sso.samlConfigTitle", "SAML 2.0 Configuration")
|
|
244
|
+
}),
|
|
245
|
+
/* @__PURE__ */ h("p", {
|
|
246
|
+
className: "text-sm text-status-info-text",
|
|
247
|
+
children: k("auth.sso.samlConfigDesc", "Configure your Identity Provider (IdP) to enable enterprise SSO. You'll need to get the following information from your IdP (Okta, Azure AD, OneLogin, etc.):")
|
|
248
|
+
}),
|
|
249
|
+
/* @__PURE__ */ g("ul", {
|
|
250
|
+
className: "mt-2 text-sm text-status-info-text list-disc list-inside",
|
|
251
|
+
children: [
|
|
252
|
+
/* @__PURE__ */ h("li", { children: k("auth.sso.entityIdItem", "Entity ID (Issuer URL)") }),
|
|
253
|
+
/* @__PURE__ */ h("li", { children: k("auth.sso.ssoUrlItem", "SSO URL (Login URL)") }),
|
|
254
|
+
/* @__PURE__ */ h("li", { children: k("auth.sso.certificateItem", "X.509 Certificate") })
|
|
255
|
+
]
|
|
256
|
+
})
|
|
257
|
+
]
|
|
258
|
+
}),
|
|
259
|
+
/* @__PURE__ */ g("div", {
|
|
260
|
+
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
261
|
+
children: [
|
|
262
|
+
/* @__PURE__ */ h("h3", {
|
|
263
|
+
className: "text-lg font-medium text-text-primary mb-4",
|
|
264
|
+
children: k("auth.sso.importMetadata", "Import IdP Metadata")
|
|
265
|
+
}),
|
|
266
|
+
/* @__PURE__ */ h("p", {
|
|
267
|
+
className: "text-sm text-text-secondary mb-4",
|
|
268
|
+
children: k("auth.sso.importMetadataDesc", "Automatically configure SSO by importing your IdP's metadata XML file or URL.")
|
|
269
|
+
}),
|
|
270
|
+
/* @__PURE__ */ g("div", {
|
|
271
|
+
className: "grid grid-cols-1 md:grid-cols-2 gap-6",
|
|
272
|
+
children: [/* @__PURE__ */ g("div", {
|
|
273
|
+
className: "space-y-3",
|
|
274
|
+
children: [
|
|
275
|
+
/* @__PURE__ */ h("label", {
|
|
276
|
+
className: "block text-sm font-medium text-text-primary",
|
|
277
|
+
children: k("auth.sso.uploadFile", "Upload Metadata File")
|
|
278
|
+
}),
|
|
279
|
+
/* @__PURE__ */ h("input", {
|
|
280
|
+
ref: b,
|
|
281
|
+
type: "file",
|
|
282
|
+
accept: ".xml,application/xml,text/xml",
|
|
283
|
+
onChange: async (e) => {
|
|
284
|
+
let t = e.target.files?.[0];
|
|
285
|
+
if (t) {
|
|
286
|
+
L(null), U(!0);
|
|
287
|
+
try {
|
|
288
|
+
let e = v(await t.text());
|
|
289
|
+
e ? ($({
|
|
290
|
+
...Q,
|
|
291
|
+
entityId: e.entityId,
|
|
292
|
+
ssoUrl: e.ssoUrl,
|
|
293
|
+
sloUrl: e.sloUrl || "",
|
|
294
|
+
certificate: e.certificate
|
|
295
|
+
}), z(k("auth.sso.importSuccess", "SAML metadata imported successfully! Review and save the configuration.")), N(!0)) : L(k("auth.sso.parseError", "Failed to parse SAML metadata. Make sure the file contains valid IdP metadata XML."));
|
|
296
|
+
} catch {
|
|
297
|
+
L(k("auth.sso.readError", "Failed to read metadata file"));
|
|
298
|
+
} finally {
|
|
299
|
+
U(!1), b.current && (b.current.value = "");
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
className: "hidden",
|
|
304
|
+
id: "metadata-file"
|
|
305
|
+
}),
|
|
306
|
+
/* @__PURE__ */ g("label", {
|
|
307
|
+
htmlFor: "metadata-file",
|
|
308
|
+
className: "flex items-center justify-center gap-2 w-full px-4 py-3 border-2 border-dashed border-border-default rounded-xl cursor-pointer hover:border-action-primary-bg transition-colors",
|
|
309
|
+
children: [H ? /* @__PURE__ */ h(r, { className: "w-5 h-5 animate-spin text-text-link" }) : /* @__PURE__ */ h("svg", {
|
|
310
|
+
className: "w-5 h-5 text-text-tertiary",
|
|
311
|
+
fill: "none",
|
|
312
|
+
viewBox: "0 0 24 24",
|
|
313
|
+
stroke: "currentColor",
|
|
314
|
+
children: /* @__PURE__ */ h("path", {
|
|
315
|
+
strokeLinecap: "round",
|
|
316
|
+
strokeLinejoin: "round",
|
|
317
|
+
strokeWidth: 2,
|
|
318
|
+
d: "M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"
|
|
319
|
+
})
|
|
320
|
+
}), /* @__PURE__ */ h("span", {
|
|
321
|
+
className: "text-sm text-text-secondary",
|
|
322
|
+
children: H ? k("auth.sso.importing", "Importing...") : k("auth.sso.chooseFile", "Choose XML file")
|
|
323
|
+
})]
|
|
324
|
+
})
|
|
325
|
+
]
|
|
326
|
+
}), /* @__PURE__ */ g("div", {
|
|
327
|
+
className: "space-y-3",
|
|
328
|
+
children: [/* @__PURE__ */ h("label", {
|
|
329
|
+
className: "block text-sm font-medium text-text-primary",
|
|
330
|
+
children: k("auth.sso.fetchFromUrl", "Fetch from URL")
|
|
331
|
+
}), /* @__PURE__ */ g("div", {
|
|
332
|
+
className: "flex gap-2",
|
|
333
|
+
children: [/* @__PURE__ */ h("input", {
|
|
334
|
+
type: "url",
|
|
335
|
+
value: B,
|
|
336
|
+
onChange: (e) => V(e.target.value),
|
|
337
|
+
placeholder: "https://idp.example.com/metadata.xml",
|
|
338
|
+
className: "flex-1 px-4 py-2.5 border border-border-default rounded-xl bg-bg-surface text-text-primary placeholder-text-tertiary focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg transition-all text-sm"
|
|
339
|
+
}), /* @__PURE__ */ g("button", {
|
|
340
|
+
type: "button",
|
|
341
|
+
onClick: async () => {
|
|
342
|
+
if (!B) {
|
|
343
|
+
L(k("auth.sso.enterUrl", "Please enter a metadata URL"));
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
L(null), U(!0);
|
|
347
|
+
try {
|
|
348
|
+
let e = await fetch(B);
|
|
349
|
+
if (!e.ok) throw Error(`Failed to fetch: ${e.statusText}`);
|
|
350
|
+
let t = v(await e.text());
|
|
351
|
+
t ? ($({
|
|
352
|
+
...Q,
|
|
353
|
+
entityId: t.entityId,
|
|
354
|
+
ssoUrl: t.ssoUrl,
|
|
355
|
+
sloUrl: t.sloUrl || "",
|
|
356
|
+
certificate: t.certificate
|
|
357
|
+
}), z("SAML metadata imported successfully! Review and save the configuration."), N(!0), V("")) : L(k("auth.sso.parseUrlError", "Failed to parse SAML metadata from URL."));
|
|
358
|
+
} catch (e) {
|
|
359
|
+
L(e instanceof Error ? e.message : k("auth.sso.fetchError", "Failed to fetch metadata from URL"));
|
|
360
|
+
} finally {
|
|
361
|
+
U(!1);
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
disabled: H || !B,
|
|
365
|
+
className: "px-4 py-2.5 rounded-xl bg-action-primary-bg text-white font-medium hover:bg-action-primary-bg-hover disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex items-center gap-2",
|
|
366
|
+
children: [H ? /* @__PURE__ */ h(r, { className: "w-4 h-4 animate-spin" }) : /* @__PURE__ */ h("svg", {
|
|
367
|
+
className: "w-4 h-4",
|
|
368
|
+
fill: "none",
|
|
369
|
+
viewBox: "0 0 24 24",
|
|
370
|
+
stroke: "currentColor",
|
|
371
|
+
children: /* @__PURE__ */ h("path", {
|
|
372
|
+
strokeLinecap: "round",
|
|
373
|
+
strokeLinejoin: "round",
|
|
374
|
+
strokeWidth: 2,
|
|
375
|
+
d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"
|
|
376
|
+
})
|
|
377
|
+
}), k("auth.sso.fetch", "Fetch")]
|
|
378
|
+
})]
|
|
379
|
+
})]
|
|
380
|
+
})]
|
|
381
|
+
})
|
|
382
|
+
]
|
|
383
|
+
}),
|
|
384
|
+
/* @__PURE__ */ g("div", {
|
|
385
|
+
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
386
|
+
children: [
|
|
387
|
+
/* @__PURE__ */ h("h3", {
|
|
388
|
+
className: "text-lg font-medium text-text-primary mb-4",
|
|
389
|
+
children: k("auth.sso.spMetadata", "Service Provider (SP) Metadata")
|
|
390
|
+
}),
|
|
391
|
+
/* @__PURE__ */ h("p", {
|
|
392
|
+
className: "text-sm text-text-secondary mb-4",
|
|
393
|
+
children: k("auth.sso.spMetadataDesc", "Provide these values to your Identity Provider when setting up the SAML integration:")
|
|
394
|
+
}),
|
|
395
|
+
/* @__PURE__ */ g("div", {
|
|
396
|
+
className: "space-y-4",
|
|
397
|
+
children: [/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
398
|
+
className: "block text-sm font-medium text-text-primary mb-1",
|
|
399
|
+
children: k("auth.sso.spEntityId", "SP Entity ID / Audience URI")
|
|
400
|
+
}), /* @__PURE__ */ g("div", {
|
|
401
|
+
className: "flex items-center gap-2",
|
|
402
|
+
children: [/* @__PURE__ */ g("code", {
|
|
403
|
+
className: "flex-1 px-3 py-2 rounded-lg bg-bg-sunken text-sm text-text-primary font-mono",
|
|
404
|
+
children: [window.location.origin, "/auth/saml/metadata"]
|
|
405
|
+
}), /* @__PURE__ */ h("button", {
|
|
406
|
+
onClick: () => void _(`${window.location.origin}/auth/saml/metadata`),
|
|
407
|
+
className: "px-3 py-2 rounded-lg border border-border-default text-text-secondary hover:bg-bg-sunken",
|
|
408
|
+
children: k("auth.sso.copy", "Copy")
|
|
409
|
+
})]
|
|
410
|
+
})] }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
411
|
+
className: "block text-sm font-medium text-text-primary mb-1",
|
|
412
|
+
children: k("auth.sso.acsUrl", "Assertion Consumer Service (ACS) URL")
|
|
413
|
+
}), /* @__PURE__ */ g("div", {
|
|
414
|
+
className: "flex items-center gap-2",
|
|
415
|
+
children: [/* @__PURE__ */ g("code", {
|
|
416
|
+
className: "flex-1 px-3 py-2 rounded-lg bg-bg-sunken text-sm text-text-primary font-mono",
|
|
417
|
+
children: [window.location.origin, "/auth/sso/callback"]
|
|
418
|
+
}), /* @__PURE__ */ h("button", {
|
|
419
|
+
onClick: () => void _(`${window.location.origin}/auth/sso/callback`),
|
|
420
|
+
className: "px-3 py-2 rounded-lg border border-border-default text-text-secondary hover:bg-bg-sunken",
|
|
421
|
+
children: k("auth.sso.copy", "Copy")
|
|
422
|
+
})]
|
|
423
|
+
})] })]
|
|
424
|
+
})
|
|
425
|
+
]
|
|
426
|
+
}),
|
|
427
|
+
/* @__PURE__ */ g("form", {
|
|
428
|
+
onSubmit: async (e) => {
|
|
429
|
+
e.preventDefault(), L(null), z(null);
|
|
430
|
+
try {
|
|
431
|
+
await E(Q), z(k("auth.sso.saveSuccess", "SSO configuration saved successfully!")), N(!1);
|
|
432
|
+
} catch (e) {
|
|
433
|
+
L(e instanceof Error ? e.message : k("auth.sso.saveFailed", "Failed to save configuration"));
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
437
|
+
children: [
|
|
438
|
+
/* @__PURE__ */ g("div", {
|
|
439
|
+
className: "flex items-center justify-between mb-6",
|
|
440
|
+
children: [/* @__PURE__ */ h("h3", {
|
|
441
|
+
className: "text-lg font-medium text-text-primary",
|
|
442
|
+
children: k("auth.sso.idpSettings", "Identity Provider (IdP) Settings")
|
|
443
|
+
}), !M && x && /* @__PURE__ */ h("button", {
|
|
444
|
+
type: "button",
|
|
445
|
+
onClick: () => N(!0),
|
|
446
|
+
className: "px-4 py-2 rounded-lg border border-status-info-border text-text-link hover:bg-status-info-bg-subtle text-sm font-medium transition-colors",
|
|
447
|
+
children: k("auth.sso.editConfig", "Edit Configuration")
|
|
448
|
+
})]
|
|
449
|
+
}),
|
|
450
|
+
/* @__PURE__ */ g("div", {
|
|
451
|
+
className: "space-y-5",
|
|
452
|
+
children: [
|
|
453
|
+
/* @__PURE__ */ g("div", { children: [
|
|
454
|
+
/* @__PURE__ */ g("label", {
|
|
455
|
+
className: "block text-sm font-medium text-text-primary mb-2",
|
|
456
|
+
children: [
|
|
457
|
+
k("auth.sso.idpEntityId", "IdP Entity ID / Issuer URL"),
|
|
458
|
+
" ",
|
|
459
|
+
/* @__PURE__ */ h("span", {
|
|
460
|
+
className: "text-status-error-text",
|
|
461
|
+
children: "*"
|
|
462
|
+
})
|
|
463
|
+
]
|
|
464
|
+
}),
|
|
465
|
+
/* @__PURE__ */ h("input", {
|
|
466
|
+
type: "url",
|
|
467
|
+
value: Q.entityId,
|
|
468
|
+
onChange: (e) => $({
|
|
469
|
+
...Q,
|
|
470
|
+
entityId: e.target.value
|
|
471
|
+
}),
|
|
472
|
+
disabled: !M && !!x,
|
|
473
|
+
placeholder: k("auth.sso.idpEntityIdPlaceholder", "https://your-idp.example.com/saml/metadata"),
|
|
474
|
+
required: !0,
|
|
475
|
+
className: "block w-full px-4 py-3 border border-border-default rounded-xl bg-bg-surface text-text-primary placeholder-text-tertiary focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg disabled:opacity-60 disabled:cursor-not-allowed transition-all"
|
|
476
|
+
}),
|
|
477
|
+
/* @__PURE__ */ h("p", {
|
|
478
|
+
className: "mt-1 text-xs text-text-secondary",
|
|
479
|
+
children: k("auth.sso.idpEntityIdHelper", "The unique identifier of your Identity Provider")
|
|
480
|
+
})
|
|
481
|
+
] }),
|
|
482
|
+
/* @__PURE__ */ g("div", { children: [
|
|
483
|
+
/* @__PURE__ */ g("label", {
|
|
484
|
+
className: "block text-sm font-medium text-text-primary mb-2",
|
|
485
|
+
children: [
|
|
486
|
+
k("auth.sso.ssoUrl", "SSO URL (Login URL)"),
|
|
487
|
+
" ",
|
|
488
|
+
/* @__PURE__ */ h("span", {
|
|
489
|
+
className: "text-status-error-text",
|
|
490
|
+
children: "*"
|
|
491
|
+
})
|
|
492
|
+
]
|
|
493
|
+
}),
|
|
494
|
+
/* @__PURE__ */ h("input", {
|
|
495
|
+
type: "url",
|
|
496
|
+
value: Q.ssoUrl,
|
|
497
|
+
onChange: (e) => $({
|
|
498
|
+
...Q,
|
|
499
|
+
ssoUrl: e.target.value
|
|
500
|
+
}),
|
|
501
|
+
disabled: !M && !!x,
|
|
502
|
+
placeholder: k("auth.sso.ssoUrlPlaceholder", "https://your-idp.example.com/saml/sso"),
|
|
503
|
+
required: !0,
|
|
504
|
+
className: "block w-full px-4 py-3 border border-border-default rounded-xl bg-bg-surface text-text-primary placeholder-text-tertiary focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg disabled:opacity-60 disabled:cursor-not-allowed transition-all"
|
|
505
|
+
}),
|
|
506
|
+
/* @__PURE__ */ h("p", {
|
|
507
|
+
className: "mt-1 text-xs text-text-secondary",
|
|
508
|
+
children: k("auth.sso.ssoUrlHelper", "The URL where users are redirected to authenticate")
|
|
509
|
+
})
|
|
510
|
+
] }),
|
|
511
|
+
/* @__PURE__ */ g("div", { children: [
|
|
512
|
+
/* @__PURE__ */ h("label", {
|
|
513
|
+
className: "block text-sm font-medium text-text-primary mb-2",
|
|
514
|
+
children: k("auth.sso.sloUrl", "Single Logout (SLO) URL")
|
|
515
|
+
}),
|
|
516
|
+
/* @__PURE__ */ h("input", {
|
|
517
|
+
type: "url",
|
|
518
|
+
value: Q.sloUrl,
|
|
519
|
+
onChange: (e) => $({
|
|
520
|
+
...Q,
|
|
521
|
+
sloUrl: e.target.value
|
|
522
|
+
}),
|
|
523
|
+
disabled: !M && !!x,
|
|
524
|
+
placeholder: k("auth.sso.sloUrlPlaceholder", "https://your-idp.example.com/saml/slo"),
|
|
525
|
+
className: "block w-full px-4 py-3 border border-border-default rounded-xl bg-bg-surface text-text-primary placeholder-text-tertiary focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg disabled:opacity-60 disabled:cursor-not-allowed transition-all"
|
|
526
|
+
}),
|
|
527
|
+
/* @__PURE__ */ h("p", {
|
|
528
|
+
className: "mt-1 text-xs text-text-secondary",
|
|
529
|
+
children: k("auth.sso.sloUrlHelper", "Optional: URL for single logout across all applications")
|
|
530
|
+
})
|
|
531
|
+
] }),
|
|
532
|
+
/* @__PURE__ */ g("div", { children: [
|
|
533
|
+
/* @__PURE__ */ g("label", {
|
|
534
|
+
className: "block text-sm font-medium text-text-primary mb-2",
|
|
535
|
+
children: [
|
|
536
|
+
k("auth.sso.certificate", "X.509 Certificate"),
|
|
537
|
+
" ",
|
|
538
|
+
/* @__PURE__ */ h("span", {
|
|
539
|
+
className: "text-status-error-text",
|
|
540
|
+
children: "*"
|
|
541
|
+
})
|
|
542
|
+
]
|
|
543
|
+
}),
|
|
544
|
+
/* @__PURE__ */ h("textarea", {
|
|
545
|
+
value: Q.certificate,
|
|
546
|
+
onChange: (e) => $({
|
|
547
|
+
...Q,
|
|
548
|
+
certificate: e.target.value
|
|
549
|
+
}),
|
|
550
|
+
disabled: !M && !!x,
|
|
551
|
+
placeholder: k("auth.sso.certificatePlaceholder", "-----BEGIN CERTIFICATE-----\nMIIDpDCCAoygAwIBAgIGAX...\n-----END CERTIFICATE-----"),
|
|
552
|
+
required: !0,
|
|
553
|
+
rows: 6,
|
|
554
|
+
className: "block w-full px-4 py-3 border border-border-default rounded-xl bg-bg-surface text-text-primary placeholder-text-tertiary focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg disabled:opacity-60 disabled:cursor-not-allowed transition-all font-mono text-sm"
|
|
555
|
+
}),
|
|
556
|
+
/* @__PURE__ */ h("p", {
|
|
557
|
+
className: "mt-1 text-xs text-text-secondary",
|
|
558
|
+
children: k("auth.sso.certificateHelper", "The public X.509 certificate from your IdP for signature verification")
|
|
559
|
+
})
|
|
560
|
+
] })
|
|
561
|
+
]
|
|
562
|
+
}),
|
|
563
|
+
(M || !x) && /* @__PURE__ */ g("div", {
|
|
564
|
+
className: "mt-6 flex items-center gap-3",
|
|
565
|
+
children: [/* @__PURE__ */ h("button", {
|
|
566
|
+
type: "submit",
|
|
567
|
+
disabled: w,
|
|
568
|
+
className: "auth-primary-button flex items-center gap-2 px-6 py-3 font-medium",
|
|
569
|
+
children: w ? /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(r, { className: "w-4 h-4 animate-spin" }), k("auth.sso.saving", "Saving...")] }) : k("auth.sso.saveConfig", "Save Configuration")
|
|
570
|
+
}), M && /* @__PURE__ */ h("button", {
|
|
571
|
+
type: "button",
|
|
572
|
+
onClick: () => {
|
|
573
|
+
N(!1), x && $({
|
|
574
|
+
entityId: x.entityId || "",
|
|
575
|
+
ssoUrl: x.ssoUrl || "",
|
|
576
|
+
sloUrl: x.sloUrl || "",
|
|
577
|
+
certificate: x.certificate || "",
|
|
578
|
+
enabled: x.enabled || !1
|
|
579
|
+
});
|
|
580
|
+
},
|
|
581
|
+
className: "px-6 py-3 rounded-xl border border-border-default text-text-primary font-medium hover:bg-bg-sunken transition-colors",
|
|
582
|
+
children: k("auth.sso.cancel", "Cancel")
|
|
583
|
+
})]
|
|
584
|
+
})
|
|
585
|
+
]
|
|
586
|
+
}),
|
|
587
|
+
x && /* @__PURE__ */ g("div", {
|
|
588
|
+
className: "p-6 rounded-xl border border-status-error-border bg-status-error-bg-subtle",
|
|
589
|
+
children: [
|
|
590
|
+
/* @__PURE__ */ h("h3", {
|
|
591
|
+
className: "text-lg font-medium text-status-error-text mb-2",
|
|
592
|
+
children: k("auth.sso.dangerZone", "Danger Zone")
|
|
593
|
+
}),
|
|
594
|
+
/* @__PURE__ */ h("p", {
|
|
595
|
+
className: "text-sm text-status-error-text mb-4",
|
|
596
|
+
children: k("auth.sso.dangerZoneDesc", "Deleting the SSO configuration will prevent users from signing in with their enterprise credentials. This action cannot be undone.")
|
|
597
|
+
}),
|
|
598
|
+
/* @__PURE__ */ h("button", {
|
|
599
|
+
onClick: () => F(!0),
|
|
600
|
+
disabled: T,
|
|
601
|
+
className: "px-4 py-2 rounded-lg bg-status-error-bg text-white font-medium hover:bg-status-error-bg-hover disabled:opacity-50 transition-colors flex items-center gap-2",
|
|
602
|
+
children: T ? /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(r, { className: "w-4 h-4 animate-spin" }), k("auth.sso.deleting", "Deleting...")] }) : k("auth.sso.deleteConfig", "Delete SSO Configuration")
|
|
603
|
+
})
|
|
604
|
+
]
|
|
605
|
+
})
|
|
606
|
+
]
|
|
607
|
+
}),
|
|
608
|
+
!C && A === "oidc" && /* @__PURE__ */ g("div", {
|
|
609
|
+
className: "space-y-6",
|
|
610
|
+
children: [
|
|
611
|
+
/* @__PURE__ */ g("div", {
|
|
612
|
+
className: "p-4 rounded-xl bg-accent-purple-subtle border border-accent-purple-subtle",
|
|
613
|
+
children: [/* @__PURE__ */ h("h3", {
|
|
614
|
+
className: "font-medium text-accent-purple mb-2",
|
|
615
|
+
children: k("auth.sso.oidcProviderInfo", "OIDC Provider Information")
|
|
616
|
+
}), /* @__PURE__ */ h("p", {
|
|
617
|
+
className: "text-sm text-accent-purple",
|
|
618
|
+
children: k("auth.sso.oidcProviderInfoDesc", "Your auth service acts as an OpenID Connect Provider. This allows other applications to authenticate users through your system using standard OAuth 2.0/OIDC flows.")
|
|
619
|
+
})]
|
|
620
|
+
}),
|
|
621
|
+
/* @__PURE__ */ g("div", {
|
|
622
|
+
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
623
|
+
children: [
|
|
624
|
+
/* @__PURE__ */ h("h3", {
|
|
625
|
+
className: "text-lg font-medium text-text-primary mb-4",
|
|
626
|
+
children: k("auth.sso.discoveryEndpoint", "Discovery Endpoint")
|
|
627
|
+
}),
|
|
628
|
+
/* @__PURE__ */ h("p", {
|
|
629
|
+
className: "text-sm text-text-secondary mb-4",
|
|
630
|
+
children: k("auth.sso.discoveryEndpointDesc", "Applications can auto-configure by fetching the OpenID Connect Discovery document:")
|
|
631
|
+
}),
|
|
632
|
+
/* @__PURE__ */ g("div", {
|
|
633
|
+
className: "flex items-center gap-2",
|
|
634
|
+
children: [/* @__PURE__ */ h("code", {
|
|
635
|
+
className: "flex-1 px-3 py-2 rounded-lg bg-bg-sunken text-sm text-text-primary font-mono break-all",
|
|
636
|
+
children: S?.issuer ? `${S.issuer}/.well-known/openid-configuration` : "Discovery endpoint unavailable until OIDC is configured"
|
|
637
|
+
}), /* @__PURE__ */ h("button", {
|
|
638
|
+
onClick: () => {
|
|
639
|
+
let e = S?.issuer ? `${S.issuer}/.well-known/openid-configuration` : "";
|
|
640
|
+
e && _(e);
|
|
641
|
+
},
|
|
642
|
+
disabled: !S?.issuer,
|
|
643
|
+
className: "px-3 py-2 rounded-lg border border-border-default text-text-secondary hover:bg-bg-sunken flex-shrink-0",
|
|
644
|
+
children: k("auth.sso.copy", "Copy")
|
|
645
|
+
})]
|
|
646
|
+
})
|
|
647
|
+
]
|
|
648
|
+
}),
|
|
649
|
+
S && /* @__PURE__ */ g("div", {
|
|
650
|
+
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
651
|
+
children: [/* @__PURE__ */ h("h3", {
|
|
652
|
+
className: "text-lg font-medium text-text-primary mb-4",
|
|
653
|
+
children: k("auth.sso.oidcEndpoints", "OIDC Endpoints")
|
|
654
|
+
}), /* @__PURE__ */ h("div", {
|
|
655
|
+
className: "space-y-4",
|
|
656
|
+
children: [
|
|
657
|
+
{
|
|
658
|
+
label: k("auth.sso.issuer", "Issuer"),
|
|
659
|
+
value: S.issuer
|
|
660
|
+
},
|
|
661
|
+
{
|
|
662
|
+
label: k("auth.sso.authorizationEndpoint", "Authorization Endpoint"),
|
|
663
|
+
value: S.authorizationEndpoint
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
label: k("auth.sso.tokenEndpoint", "Token Endpoint"),
|
|
667
|
+
value: S.tokenEndpoint
|
|
668
|
+
},
|
|
669
|
+
{
|
|
670
|
+
label: k("auth.sso.userinfoEndpoint", "UserInfo Endpoint"),
|
|
671
|
+
value: S.userinfoEndpoint
|
|
672
|
+
},
|
|
673
|
+
{
|
|
674
|
+
label: k("auth.sso.jwksUri", "JWKS URI"),
|
|
675
|
+
value: S.jwksUri
|
|
676
|
+
}
|
|
677
|
+
].map((e) => /* @__PURE__ */ g("div", {
|
|
678
|
+
className: "flex items-start gap-4",
|
|
679
|
+
children: [/* @__PURE__ */ h("span", {
|
|
680
|
+
className: "w-48 text-sm font-medium text-text-primary flex-shrink-0",
|
|
681
|
+
children: e.label
|
|
682
|
+
}), /* @__PURE__ */ h("code", {
|
|
683
|
+
className: "text-sm text-text-secondary font-mono break-all",
|
|
684
|
+
children: e.value
|
|
685
|
+
})]
|
|
686
|
+
}, e.label))
|
|
687
|
+
})]
|
|
688
|
+
}),
|
|
689
|
+
/* @__PURE__ */ g("div", {
|
|
690
|
+
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
691
|
+
children: [/* @__PURE__ */ h("h3", {
|
|
692
|
+
className: "text-lg font-medium text-text-primary mb-4",
|
|
693
|
+
children: k("auth.sso.supportedFeatures", "Supported Features")
|
|
694
|
+
}), /* @__PURE__ */ h("div", {
|
|
695
|
+
className: "grid grid-cols-2 gap-4",
|
|
696
|
+
children: [
|
|
697
|
+
{
|
|
698
|
+
name: k("auth.sso.featAuthCodePkce", "Authorization Code + PKCE"),
|
|
699
|
+
status: !0
|
|
700
|
+
},
|
|
701
|
+
{
|
|
702
|
+
name: k("auth.sso.featClientCreds", "Client Credentials"),
|
|
703
|
+
status: !0
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
name: k("auth.sso.featDeviceAuth", "Device Authorization"),
|
|
707
|
+
status: !0
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
name: k("auth.sso.featRefreshTokens", "Refresh Tokens"),
|
|
711
|
+
status: !0
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
name: k("auth.sso.featTokenIntrospection", "Token Introspection"),
|
|
715
|
+
status: !0
|
|
716
|
+
},
|
|
717
|
+
{
|
|
718
|
+
name: k("auth.sso.featTokenRevocation", "Token Revocation"),
|
|
719
|
+
status: !0
|
|
720
|
+
}
|
|
721
|
+
].map((e) => /* @__PURE__ */ g("div", {
|
|
722
|
+
className: "flex items-center gap-2",
|
|
723
|
+
children: [/* @__PURE__ */ h("span", { className: `w-2 h-2 rounded-full ${e.status ? "bg-status-success-text" : "bg-bg-sunken"}` }), /* @__PURE__ */ h("span", {
|
|
724
|
+
className: "text-sm text-text-primary",
|
|
725
|
+
children: e.name
|
|
726
|
+
})]
|
|
727
|
+
}, e.name))
|
|
728
|
+
})]
|
|
729
|
+
})
|
|
730
|
+
]
|
|
731
|
+
}),
|
|
732
|
+
!C && A === "clients" && /* @__PURE__ */ g("div", {
|
|
733
|
+
className: "space-y-6",
|
|
734
|
+
children: [
|
|
735
|
+
/* @__PURE__ */ g("div", {
|
|
736
|
+
className: "p-4 rounded-xl bg-status-warning-bg-subtle border border-status-warning-border",
|
|
737
|
+
children: [/* @__PURE__ */ h("h3", {
|
|
738
|
+
className: "font-medium text-status-warning-text mb-2",
|
|
739
|
+
children: k("auth.sso.clientManagement", "OIDC Client Management")
|
|
740
|
+
}), /* @__PURE__ */ h("p", {
|
|
741
|
+
className: "text-sm text-status-warning-text",
|
|
742
|
+
children: k("auth.sso.clientManagementDesc", "Register applications that can authenticate users through your OIDC provider. Each client gets unique credentials to use in the OAuth 2.0 / OIDC flow.")
|
|
743
|
+
})]
|
|
744
|
+
}),
|
|
745
|
+
X && /* @__PURE__ */ g("div", {
|
|
746
|
+
className: "p-6 rounded-xl border-2 border-status-success-border bg-status-success-bg-subtle",
|
|
747
|
+
children: [/* @__PURE__ */ g("div", {
|
|
748
|
+
className: "flex items-start justify-between mb-4",
|
|
749
|
+
children: [/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("h3", {
|
|
750
|
+
className: "text-lg font-medium text-status-success-text",
|
|
751
|
+
children: k("auth.sso.clientCreatedTitle", "Client Created Successfully!")
|
|
752
|
+
}), /* @__PURE__ */ h("p", {
|
|
753
|
+
className: "text-sm text-status-success-text mt-1",
|
|
754
|
+
children: k("auth.sso.clientCreatedDesc", "Save these credentials securely. The client secret will not be shown again.")
|
|
755
|
+
})] }), /* @__PURE__ */ h("button", {
|
|
756
|
+
onClick: () => Z(null),
|
|
757
|
+
className: "text-status-success-text hover:text-status-success-text",
|
|
758
|
+
children: /* @__PURE__ */ h("svg", {
|
|
759
|
+
className: "w-5 h-5",
|
|
760
|
+
fill: "none",
|
|
761
|
+
viewBox: "0 0 24 24",
|
|
762
|
+
stroke: "currentColor",
|
|
763
|
+
children: /* @__PURE__ */ h("path", {
|
|
764
|
+
strokeLinecap: "round",
|
|
765
|
+
strokeLinejoin: "round",
|
|
766
|
+
strokeWidth: 2,
|
|
767
|
+
d: "M6 18L18 6M6 6l12 12"
|
|
768
|
+
})
|
|
769
|
+
})
|
|
770
|
+
})]
|
|
771
|
+
}), /* @__PURE__ */ g("div", {
|
|
772
|
+
className: "space-y-3",
|
|
773
|
+
children: [
|
|
774
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
775
|
+
className: "block text-xs font-medium text-status-success-text mb-1",
|
|
776
|
+
children: k("auth.sso.clientId", "Client ID")
|
|
777
|
+
}), /* @__PURE__ */ g("div", {
|
|
778
|
+
className: "flex gap-2",
|
|
779
|
+
children: [/* @__PURE__ */ h("code", {
|
|
780
|
+
className: "flex-1 px-3 py-2 rounded-lg bg-bg-surface text-sm font-mono border border-status-success-border",
|
|
781
|
+
children: X.client_id
|
|
782
|
+
}), /* @__PURE__ */ h("button", {
|
|
783
|
+
onClick: () => void _(X.client_id),
|
|
784
|
+
className: "px-3 py-2 rounded-lg bg-status-success-bg text-white text-sm hover:bg-status-success-bg",
|
|
785
|
+
children: k("auth.sso.copy", "Copy")
|
|
786
|
+
})]
|
|
787
|
+
})] }),
|
|
788
|
+
X.client_secret && /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
789
|
+
className: "block text-xs font-medium text-status-success-text mb-1",
|
|
790
|
+
children: k("auth.sso.clientSecret", "Client Secret (save now!)")
|
|
791
|
+
}), /* @__PURE__ */ g("div", {
|
|
792
|
+
className: "flex gap-2",
|
|
793
|
+
children: [/* @__PURE__ */ h("code", {
|
|
794
|
+
className: "flex-1 px-3 py-2 rounded-lg bg-bg-surface text-sm font-mono border border-status-success-border",
|
|
795
|
+
children: X.client_secret
|
|
796
|
+
}), /* @__PURE__ */ h("button", {
|
|
797
|
+
onClick: () => void _(X.client_secret || ""),
|
|
798
|
+
className: "px-3 py-2 rounded-lg bg-status-success-bg text-white text-sm hover:bg-status-success-bg",
|
|
799
|
+
children: k("auth.sso.copy", "Copy")
|
|
800
|
+
})]
|
|
801
|
+
})] }),
|
|
802
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
803
|
+
className: "block text-xs font-medium text-status-success-text mb-1",
|
|
804
|
+
children: k("auth.sso.redirectUris", "Redirect URIs")
|
|
805
|
+
}), /* @__PURE__ */ h("code", {
|
|
806
|
+
className: "block px-3 py-2 rounded-lg bg-bg-surface text-sm font-mono border border-status-success-border",
|
|
807
|
+
children: X.redirect_uris.join(", ")
|
|
808
|
+
})] })
|
|
809
|
+
]
|
|
810
|
+
})]
|
|
811
|
+
}),
|
|
812
|
+
/* @__PURE__ */ g("div", {
|
|
813
|
+
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
814
|
+
children: [/* @__PURE__ */ g("div", {
|
|
815
|
+
className: "flex items-center justify-between mb-6",
|
|
816
|
+
children: [/* @__PURE__ */ h("h3", {
|
|
817
|
+
className: "text-lg font-medium text-text-primary",
|
|
818
|
+
children: k("auth.sso.registerClient", "Register New Client")
|
|
819
|
+
}), !W && /* @__PURE__ */ g("button", {
|
|
820
|
+
onClick: () => G(!0),
|
|
821
|
+
className: "px-4 py-2 rounded-lg bg-action-primary-bg text-white font-medium hover:bg-action-primary-bg-hover transition-colors flex items-center gap-2",
|
|
822
|
+
children: [/* @__PURE__ */ h("svg", {
|
|
823
|
+
className: "w-4 h-4",
|
|
824
|
+
fill: "none",
|
|
825
|
+
viewBox: "0 0 24 24",
|
|
826
|
+
stroke: "currentColor",
|
|
827
|
+
children: /* @__PURE__ */ h("path", {
|
|
828
|
+
strokeLinecap: "round",
|
|
829
|
+
strokeLinejoin: "round",
|
|
830
|
+
strokeWidth: 2,
|
|
831
|
+
d: "M12 4v16m8-8H4"
|
|
832
|
+
})
|
|
833
|
+
}), k("auth.sso.newClient", "New Client")]
|
|
834
|
+
})]
|
|
835
|
+
}), W ? /* @__PURE__ */ g("div", {
|
|
836
|
+
className: "space-y-5",
|
|
837
|
+
children: [
|
|
838
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("label", {
|
|
839
|
+
className: "block text-sm font-medium text-text-primary mb-2",
|
|
840
|
+
children: [
|
|
841
|
+
k("auth.sso.clientName", "Client Name"),
|
|
842
|
+
" ",
|
|
843
|
+
/* @__PURE__ */ h("span", {
|
|
844
|
+
className: "text-status-error-text",
|
|
845
|
+
children: "*"
|
|
846
|
+
})
|
|
847
|
+
]
|
|
848
|
+
}), /* @__PURE__ */ h("input", {
|
|
849
|
+
type: "text",
|
|
850
|
+
value: K.client_name,
|
|
851
|
+
onChange: (e) => q({
|
|
852
|
+
...K,
|
|
853
|
+
client_name: e.target.value
|
|
854
|
+
}),
|
|
855
|
+
placeholder: k("auth.sso.clientNamePlaceholder", "My Application"),
|
|
856
|
+
className: "block w-full px-4 py-3 border border-border-default rounded-xl bg-bg-surface text-text-primary placeholder-text-tertiary focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg transition-all"
|
|
857
|
+
})] }),
|
|
858
|
+
/* @__PURE__ */ g("div", { children: [
|
|
859
|
+
/* @__PURE__ */ g("label", {
|
|
860
|
+
className: "block text-sm font-medium text-text-primary mb-2",
|
|
861
|
+
children: [
|
|
862
|
+
k("auth.sso.redirectUris", "Redirect URIs"),
|
|
863
|
+
" ",
|
|
864
|
+
/* @__PURE__ */ h("span", {
|
|
865
|
+
className: "text-status-error-text",
|
|
866
|
+
children: "*"
|
|
867
|
+
})
|
|
868
|
+
]
|
|
869
|
+
}),
|
|
870
|
+
/* @__PURE__ */ h("input", {
|
|
871
|
+
type: "text",
|
|
872
|
+
value: K.redirect_uris,
|
|
873
|
+
onChange: (e) => q({
|
|
874
|
+
...K,
|
|
875
|
+
redirect_uris: e.target.value
|
|
876
|
+
}),
|
|
877
|
+
placeholder: k("auth.sso.redirectUrisPlaceholder", "http://localhost:3000/callback, https://app.example.com/callback"),
|
|
878
|
+
className: "block w-full px-4 py-3 border border-border-default rounded-xl bg-bg-surface text-text-primary placeholder-text-tertiary focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg transition-all"
|
|
879
|
+
}),
|
|
880
|
+
/* @__PURE__ */ h("p", {
|
|
881
|
+
className: "mt-1 text-xs text-text-secondary",
|
|
882
|
+
children: k("auth.sso.redirectUrisHelper", "Separate multiple URIs with commas")
|
|
883
|
+
})
|
|
884
|
+
] }),
|
|
885
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
886
|
+
className: "block text-sm font-medium text-text-primary mb-2",
|
|
887
|
+
children: k("auth.sso.grantTypes", "Grant Types")
|
|
888
|
+
}), /* @__PURE__ */ h("div", {
|
|
889
|
+
className: "flex flex-wrap gap-3",
|
|
890
|
+
children: [
|
|
891
|
+
"authorization_code",
|
|
892
|
+
"refresh_token",
|
|
893
|
+
"client_credentials"
|
|
894
|
+
].map((e) => /* @__PURE__ */ g("label", {
|
|
895
|
+
className: "flex items-center gap-2 cursor-pointer",
|
|
896
|
+
children: [/* @__PURE__ */ h("input", {
|
|
897
|
+
type: "checkbox",
|
|
898
|
+
checked: K.grant_types.includes(e),
|
|
899
|
+
onChange: (t) => {
|
|
900
|
+
t.target.checked ? q({
|
|
901
|
+
...K,
|
|
902
|
+
grant_types: [...K.grant_types, e]
|
|
903
|
+
}) : q({
|
|
904
|
+
...K,
|
|
905
|
+
grant_types: K.grant_types.filter((t) => t !== e)
|
|
906
|
+
});
|
|
907
|
+
},
|
|
908
|
+
className: "w-4 h-4 rounded border-border-default text-text-link focus:ring-action-primary-bg"
|
|
909
|
+
}), /* @__PURE__ */ h("span", {
|
|
910
|
+
className: "text-sm text-text-primary",
|
|
911
|
+
children: e.replace(/_/g, " ")
|
|
912
|
+
})]
|
|
913
|
+
}, e))
|
|
914
|
+
})] }),
|
|
915
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
916
|
+
className: "block text-sm font-medium text-text-primary mb-2",
|
|
917
|
+
children: k("auth.sso.tokenEndpointAuth", "Token Endpoint Auth Method")
|
|
918
|
+
}), /* @__PURE__ */ g("select", {
|
|
919
|
+
value: K.token_endpoint_auth_method,
|
|
920
|
+
onChange: (e) => q({
|
|
921
|
+
...K,
|
|
922
|
+
token_endpoint_auth_method: e.target.value
|
|
923
|
+
}),
|
|
924
|
+
className: "block w-full px-4 py-3 border border-border-default rounded-xl bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg transition-all",
|
|
925
|
+
children: [
|
|
926
|
+
/* @__PURE__ */ h("option", {
|
|
927
|
+
value: "none",
|
|
928
|
+
children: k("auth.sso.tokenAuthNone", "None (Public Client - SPAs, Mobile Apps)")
|
|
929
|
+
}),
|
|
930
|
+
/* @__PURE__ */ h("option", {
|
|
931
|
+
value: "client_secret_basic",
|
|
932
|
+
children: k("auth.sso.tokenAuthBasic", "Client Secret Basic")
|
|
933
|
+
}),
|
|
934
|
+
/* @__PURE__ */ h("option", {
|
|
935
|
+
value: "client_secret_post",
|
|
936
|
+
children: k("auth.sso.tokenAuthPost", "Client Secret Post")
|
|
937
|
+
})
|
|
938
|
+
]
|
|
939
|
+
})] }),
|
|
940
|
+
/* @__PURE__ */ g("div", {
|
|
941
|
+
className: "flex items-center gap-3 pt-2",
|
|
942
|
+
children: [/* @__PURE__ */ h("button", {
|
|
943
|
+
onClick: async () => {
|
|
944
|
+
if (!K.client_name || !K.redirect_uris) {
|
|
945
|
+
L(k("auth.sso.clientRequired", "Client name and redirect URI are required"));
|
|
946
|
+
return;
|
|
947
|
+
}
|
|
948
|
+
Y(!0), L(null);
|
|
949
|
+
try {
|
|
950
|
+
let e = S?.registrationEndpoint;
|
|
951
|
+
if (!e) throw Error(k("auth.sso.oidcNotConfigured", "OIDC dynamic client registration is not configured for this environment."));
|
|
952
|
+
let t = await fetch(e, {
|
|
953
|
+
method: "POST",
|
|
954
|
+
headers: { "Content-Type": "application/json" },
|
|
955
|
+
body: JSON.stringify({
|
|
956
|
+
client_name: K.client_name,
|
|
957
|
+
redirect_uris: K.redirect_uris.split(",").map((e) => e.trim()),
|
|
958
|
+
grant_types: K.grant_types,
|
|
959
|
+
response_types: ["code"],
|
|
960
|
+
token_endpoint_auth_method: K.token_endpoint_auth_method
|
|
961
|
+
})
|
|
962
|
+
});
|
|
963
|
+
if (!t.ok) {
|
|
964
|
+
let e = await t.json();
|
|
965
|
+
throw Error(e.error_description || e.error || "Registration failed");
|
|
966
|
+
}
|
|
967
|
+
Z(await t.json()), z(k("auth.sso.clientRegistered", "OIDC client registered successfully! Save the client credentials.")), G(!1), q({
|
|
968
|
+
client_name: "",
|
|
969
|
+
redirect_uris: "",
|
|
970
|
+
grant_types: ["authorization_code", "refresh_token"],
|
|
971
|
+
token_endpoint_auth_method: "none"
|
|
972
|
+
});
|
|
973
|
+
} catch (e) {
|
|
974
|
+
L(e instanceof Error ? e.message : k("auth.sso.registerFailed", "Failed to register client"));
|
|
975
|
+
} finally {
|
|
976
|
+
Y(!1);
|
|
977
|
+
}
|
|
978
|
+
},
|
|
979
|
+
disabled: J,
|
|
980
|
+
className: "auth-primary-button flex items-center gap-2 px-6 py-3 font-medium",
|
|
981
|
+
children: J ? /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(r, { className: "w-4 h-4 animate-spin" }), k("auth.sso.registering", "Registering...")] }) : k("auth.sso.registerClientButton", "Register Client")
|
|
982
|
+
}), /* @__PURE__ */ h("button", {
|
|
983
|
+
onClick: () => {
|
|
984
|
+
G(!1), q({
|
|
985
|
+
client_name: "",
|
|
986
|
+
redirect_uris: "",
|
|
987
|
+
grant_types: ["authorization_code", "refresh_token"],
|
|
988
|
+
token_endpoint_auth_method: "none"
|
|
989
|
+
});
|
|
990
|
+
},
|
|
991
|
+
className: "px-6 py-3 rounded-xl border border-border-default text-text-primary font-medium hover:bg-bg-sunken transition-colors",
|
|
992
|
+
children: k("auth.sso.cancel", "Cancel")
|
|
993
|
+
})]
|
|
994
|
+
})
|
|
995
|
+
]
|
|
996
|
+
}) : /* @__PURE__ */ g("div", {
|
|
997
|
+
className: "text-center py-8 text-text-secondary",
|
|
998
|
+
children: [/* @__PURE__ */ h("svg", {
|
|
999
|
+
className: "w-12 h-12 mx-auto mb-3 text-text-muted",
|
|
1000
|
+
fill: "none",
|
|
1001
|
+
viewBox: "0 0 24 24",
|
|
1002
|
+
stroke: "currentColor",
|
|
1003
|
+
children: /* @__PURE__ */ h("path", {
|
|
1004
|
+
strokeLinecap: "round",
|
|
1005
|
+
strokeLinejoin: "round",
|
|
1006
|
+
strokeWidth: 1.5,
|
|
1007
|
+
d: "M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"
|
|
1008
|
+
})
|
|
1009
|
+
}), /* @__PURE__ */ h("p", {
|
|
1010
|
+
className: "text-sm",
|
|
1011
|
+
children: k("auth.sso.emptyClients", "Click \"New Client\" to register an OAuth 2.0 / OIDC client application.")
|
|
1012
|
+
})]
|
|
1013
|
+
})]
|
|
1014
|
+
}),
|
|
1015
|
+
/* @__PURE__ */ g("div", {
|
|
1016
|
+
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
1017
|
+
children: [/* @__PURE__ */ h("h3", {
|
|
1018
|
+
className: "text-lg font-medium text-text-primary mb-4",
|
|
1019
|
+
children: k("auth.sso.preconfiguredClients", "Pre-configured Clients")
|
|
1020
|
+
}), /* @__PURE__ */ h("div", {
|
|
1021
|
+
className: "space-y-4",
|
|
1022
|
+
children: /* @__PURE__ */ g("div", {
|
|
1023
|
+
className: "p-4 rounded-lg bg-bg-canvas/50 border border-border-default",
|
|
1024
|
+
children: [
|
|
1025
|
+
/* @__PURE__ */ g("div", {
|
|
1026
|
+
className: "flex items-center justify-between mb-2",
|
|
1027
|
+
children: [/* @__PURE__ */ h("span", {
|
|
1028
|
+
className: "font-medium text-text-primary",
|
|
1029
|
+
children: "tenant-frontend"
|
|
1030
|
+
}), /* @__PURE__ */ h("span", {
|
|
1031
|
+
className: "px-2 py-1 rounded-full text-xs bg-status-success-bg-subtle text-status-success-text",
|
|
1032
|
+
children: k("auth.sso.active", "Active")
|
|
1033
|
+
})]
|
|
1034
|
+
}),
|
|
1035
|
+
/* @__PURE__ */ h("p", {
|
|
1036
|
+
className: "text-sm text-text-secondary",
|
|
1037
|
+
children: k("auth.sso.preconfigClientDesc", "Default frontend client for tenant authentication")
|
|
1038
|
+
}),
|
|
1039
|
+
/* @__PURE__ */ g("div", {
|
|
1040
|
+
className: "mt-2 flex flex-wrap gap-2",
|
|
1041
|
+
children: [
|
|
1042
|
+
/* @__PURE__ */ h("span", {
|
|
1043
|
+
className: "px-2 py-0.5 rounded bg-bg-sunken text-xs text-text-primary",
|
|
1044
|
+
children: "authorization_code"
|
|
1045
|
+
}),
|
|
1046
|
+
/* @__PURE__ */ h("span", {
|
|
1047
|
+
className: "px-2 py-0.5 rounded bg-bg-sunken text-xs text-text-primary",
|
|
1048
|
+
children: "refresh_token"
|
|
1049
|
+
}),
|
|
1050
|
+
/* @__PURE__ */ h("span", {
|
|
1051
|
+
className: "px-2 py-0.5 rounded bg-bg-sunken text-xs text-text-primary",
|
|
1052
|
+
children: k("auth.sso.pkceRequired", "PKCE required")
|
|
1053
|
+
})
|
|
1054
|
+
]
|
|
1055
|
+
})
|
|
1056
|
+
]
|
|
1057
|
+
})
|
|
1058
|
+
})]
|
|
1059
|
+
})
|
|
1060
|
+
]
|
|
1061
|
+
}),
|
|
1062
|
+
!C && A === "test" && /* @__PURE__ */ g("div", {
|
|
1063
|
+
className: "space-y-6",
|
|
1064
|
+
children: [
|
|
1065
|
+
/* @__PURE__ */ g("div", {
|
|
1066
|
+
className: "p-4 rounded-xl bg-status-warning-bg-subtle border border-status-warning-border",
|
|
1067
|
+
children: [/* @__PURE__ */ h("h3", {
|
|
1068
|
+
className: "font-medium text-status-warning-text mb-2",
|
|
1069
|
+
children: k("auth.sso.testLoginTitle", "Test SSO Login")
|
|
1070
|
+
}), /* @__PURE__ */ h("p", {
|
|
1071
|
+
className: "text-sm text-status-warning-text",
|
|
1072
|
+
children: k("auth.sso.testLoginDesc", "Use this section to test your SSO configuration before rolling it out to users. Make sure your IdP is properly configured with the SP metadata above.")
|
|
1073
|
+
})]
|
|
1074
|
+
}),
|
|
1075
|
+
/* @__PURE__ */ g("div", {
|
|
1076
|
+
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
1077
|
+
children: [
|
|
1078
|
+
/* @__PURE__ */ h("h3", {
|
|
1079
|
+
className: "text-lg font-medium text-text-primary mb-4",
|
|
1080
|
+
children: k("auth.sso.spInitiatedTest", "SP-Initiated Login Test")
|
|
1081
|
+
}),
|
|
1082
|
+
/* @__PURE__ */ h("p", {
|
|
1083
|
+
className: "text-sm text-text-secondary mb-4",
|
|
1084
|
+
children: k("auth.sso.spInitiatedTestDesc", "Click the button below to initiate an SSO login flow. You will be redirected to your IdP to authenticate.")
|
|
1085
|
+
}),
|
|
1086
|
+
x && x.enabled ? /* @__PURE__ */ g("a", {
|
|
1087
|
+
href: `${window.location.origin}/auth/sso/login`,
|
|
1088
|
+
className: "inline-flex items-center gap-2 px-6 py-3 rounded-xl bg-gradient-to-r from-green-600 to-emerald-600 text-white font-medium shadow-lg shadow-green-500/25 hover:shadow-xl hover:shadow-green-500/30 hover:from-green-500 hover:to-emerald-500 transition-all duration-200",
|
|
1089
|
+
children: [/* @__PURE__ */ h("svg", {
|
|
1090
|
+
className: "w-5 h-5",
|
|
1091
|
+
fill: "none",
|
|
1092
|
+
viewBox: "0 0 24 24",
|
|
1093
|
+
stroke: "currentColor",
|
|
1094
|
+
children: /* @__PURE__ */ h("path", {
|
|
1095
|
+
strokeLinecap: "round",
|
|
1096
|
+
strokeLinejoin: "round",
|
|
1097
|
+
strokeWidth: 2,
|
|
1098
|
+
d: "M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h7a3 3 0 013 3v1"
|
|
1099
|
+
})
|
|
1100
|
+
}), k("auth.sso.testSsoLoginButton", "Test SSO Login")]
|
|
1101
|
+
}) : /* @__PURE__ */ h("div", {
|
|
1102
|
+
className: "p-4 rounded-xl bg-bg-sunken/50 text-text-secondary text-sm",
|
|
1103
|
+
children: x ? k("auth.sso.disabledTest", "SSO is disabled. Enable it to test the login flow.") : k("auth.sso.notConfigured", "SSO is not configured. Please configure your IdP settings first.")
|
|
1104
|
+
})
|
|
1105
|
+
]
|
|
1106
|
+
}),
|
|
1107
|
+
/* @__PURE__ */ g("div", {
|
|
1108
|
+
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
1109
|
+
children: [/* @__PURE__ */ h("h3", {
|
|
1110
|
+
className: "text-lg font-medium text-text-primary mb-4",
|
|
1111
|
+
children: k("auth.sso.testResults", "Test Results")
|
|
1112
|
+
}), /* @__PURE__ */ h("p", {
|
|
1113
|
+
className: "text-sm text-text-secondary",
|
|
1114
|
+
children: k("auth.sso.testResultsDesc", "After testing, results will appear here. Check the browser console for detailed logs.")
|
|
1115
|
+
})]
|
|
1116
|
+
})
|
|
1117
|
+
]
|
|
1118
|
+
})
|
|
1119
|
+
]
|
|
1120
|
+
}) : /* @__PURE__ */ h("div", {
|
|
1121
|
+
className: "max-w-5xl mx-auto p-6",
|
|
1122
|
+
children: /* @__PURE__ */ g("div", {
|
|
1123
|
+
className: "text-center py-16 border-2 border-dashed border-border-subtle rounded-xl",
|
|
1124
|
+
children: [
|
|
1125
|
+
/* @__PURE__ */ h("div", {
|
|
1126
|
+
className: "w-16 h-16 mx-auto mb-4 rounded-full bg-status-error-bg-subtle flex items-center justify-center",
|
|
1127
|
+
children: /* @__PURE__ */ h(n, { className: "w-8 h-8 text-status-error-text" })
|
|
1128
|
+
}),
|
|
1129
|
+
/* @__PURE__ */ h("h2", {
|
|
1130
|
+
className: "text-xl font-semibold text-text-primary mb-2",
|
|
1131
|
+
children: k("auth.sso.adminRequired", "Admin Access Required")
|
|
1132
|
+
}),
|
|
1133
|
+
/* @__PURE__ */ h("p", {
|
|
1134
|
+
className: "text-text-secondary",
|
|
1135
|
+
children: k("auth.sso.adminRequiredDesc", "You need administrator privileges to configure SSO settings.")
|
|
1136
|
+
})
|
|
1137
|
+
]
|
|
1138
|
+
})
|
|
1139
|
+
});
|
|
1140
|
+
}
|
|
1141
|
+
//#endregion
|
|
1142
|
+
export { y as SsoConfigPage };
|
|
1143
|
+
|
|
1144
|
+
//# sourceMappingURL=SsoConfigPage.js.map
|