@burdenoff/microfe-auth 2026.830.1 → 2026.904.1
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/dist/auth/AuthRoot.js +43 -41
- package/dist/auth/AuthRoot.js.map +1 -1
- package/dist/auth/AuthRoutes.js +7 -0
- package/dist/auth/AuthRoutes.js.map +1 -1
- package/dist/auth/components/AuthLayout.js +65 -67
- package/dist/auth/components/AuthLayout.js.map +1 -1
- package/dist/auth/components/CaptchaV2.js +21 -24
- package/dist/auth/components/CaptchaV2.js.map +1 -1
- package/dist/auth/components/ConfirmActionDialog.js +33 -32
- package/dist/auth/components/ConfirmActionDialog.js.map +1 -1
- package/dist/auth/components/profile/UserProfileMenu.js +44 -46
- package/dist/auth/components/profile/UserProfileMenu.js.map +1 -1
- package/dist/auth/components/workspace/WorkspaceSelector.js +62 -68
- package/dist/auth/components/workspace/WorkspaceSelector.js.map +1 -1
- package/dist/auth/pages/AuditLogPage.js +65 -68
- package/dist/auth/pages/AuditLogPage.js.map +1 -1
- package/dist/auth/pages/EmailVerifyPage.js +51 -54
- package/dist/auth/pages/EmailVerifyPage.js.map +1 -1
- package/dist/auth/pages/LoginPage.js +223 -225
- package/dist/auth/pages/LoginPage.js.map +1 -1
- package/dist/auth/pages/MagicLinkPage.js +67 -69
- package/dist/auth/pages/MagicLinkPage.js.map +1 -1
- package/dist/auth/pages/MfaSetupPage.js +85 -88
- package/dist/auth/pages/MfaSetupPage.js.map +1 -1
- package/dist/auth/pages/MfaVerifyPage.js +60 -63
- package/dist/auth/pages/MfaVerifyPage.js.map +1 -1
- package/dist/auth/pages/OAuthCallbackPage.js +37 -40
- package/dist/auth/pages/OAuthCallbackPage.js.map +1 -1
- package/dist/auth/pages/PasswordResetPage.js +102 -105
- package/dist/auth/pages/PasswordResetPage.js.map +1 -1
- package/dist/auth/pages/ReactivatePage.js +54 -57
- package/dist/auth/pages/ReactivatePage.js.map +1 -1
- package/dist/auth/pages/RegisterPage.js +171 -174
- package/dist/auth/pages/RegisterPage.js.map +1 -1
- package/dist/auth/pages/SSOClearPage.js +21 -20
- package/dist/auth/pages/SSOClearPage.js.map +1 -1
- package/dist/auth/pages/SSODepositPage.js +27 -26
- package/dist/auth/pages/SSODepositPage.js.map +1 -1
- package/dist/auth/pages/SSORelayCallbackPage.js +19 -18
- package/dist/auth/pages/SSORelayCallbackPage.js.map +1 -1
- package/dist/auth/pages/SecurityPage.js +247 -250
- package/dist/auth/pages/SecurityPage.js.map +1 -1
- package/dist/auth/pages/SessionsPage.js +95 -98
- package/dist/auth/pages/SessionsPage.js.map +1 -1
- package/dist/auth/pages/SsoCallbackPage.js +53 -56
- package/dist/auth/pages/SsoCallbackPage.js.map +1 -1
- package/dist/auth/pages/SsoConfigPage.js +296 -299
- package/dist/auth/pages/SsoConfigPage.js.map +1 -1
- package/dist/auth/pages/SsoLoginPage.js +65 -68
- package/dist/auth/pages/SsoLoginPage.js.map +1 -1
- package/dist/auth/pages/UserDetailsPage.js +124 -127
- package/dist/auth/pages/UserDetailsPage.js.map +1 -1
- package/dist/auth/pages/UserProfilePage.js +171 -174
- package/dist/auth/pages/UserProfilePage.js.map +1 -1
- package/dist/auth/pages/UsersPage.js +322 -325
- package/dist/auth/pages/UsersPage.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -1
- package/dist/shared/hooks/index.d.ts +1 -6
- package/dist/shared/hooks/useTr.d.ts +16 -0
- package/dist/shared/hooks/useTr.js +14 -0
- package/dist/shared/hooks/useTr.js.map +1 -0
- package/dist/translations/en.d.ts +806 -248
- package/dist/translations/en.js +870 -0
- package/dist/translations/en.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { useTr as e } from "../../shared/hooks/useTr.js";
|
|
2
|
+
import { AlertIcon as t, SpinnerIcon as n } from "../components/AuthIcons.js";
|
|
3
|
+
import { useSsoOperations as r } from "../hooks/useSsoOperations.js";
|
|
4
|
+
import { useAuthPermissions as i } from "../hooks/useAuthPermissions.js";
|
|
5
|
+
import { ConfirmActionDialog as a } from "../components/ConfirmActionDialog.js";
|
|
6
|
+
import { nativeCopyText as o, nativeImpact as s, nativeNotify as c } from "../../utils/nativeBridge.js";
|
|
7
|
+
import { useEffect as l, useRef as ee, useState as u } from "react";
|
|
7
8
|
import { useNavigate as te, useSearchParams as ne } from "react-router";
|
|
8
|
-
import { useI18n as re } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
9
9
|
import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
10
|
-
import { useFeatureFlagDetails as
|
|
10
|
+
import { useFeatureFlagDetails as re } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
11
11
|
import { Button as m } from "@burdenoff/fe-libs/button";
|
|
12
|
-
import { EmphasisPanel as
|
|
12
|
+
import { EmphasisPanel as ie, IllustratedEmptyState as h, NextSteps as ae, PagePurpose as oe } from "@burdenoff/fe-libs/ui";
|
|
13
13
|
//#region src/auth/pages/SsoConfigPage.tsx
|
|
14
14
|
var g = async (e) => {
|
|
15
|
-
|
|
15
|
+
s("light"), c(await o(e) ? "success" : "error");
|
|
16
16
|
};
|
|
17
17
|
function _(e) {
|
|
18
18
|
try {
|
|
@@ -47,25 +47,22 @@ function _(e) {
|
|
|
47
47
|
return console.error("Failed to parse SAML metadata:", e), null;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
function v({ bypassEnterprisePlanGate:
|
|
51
|
-
let v = te(), [
|
|
52
|
-
let n = A(e);
|
|
53
|
-
return n === e ? t : n;
|
|
54
|
-
}, [A]), [M, pe] = u("saml"), [N, P] = u(!1), [me, F] = u(!1), [I, L] = u(null), [R, z] = u(null), [B, V] = u(""), [H, U] = u(!1), [W, G] = u(!1), [K, q] = u({
|
|
50
|
+
function v({ bypassEnterprisePlanGate: o = !1 }) {
|
|
51
|
+
let v = e(), y = te(), [b] = ne(), { canManageSsoConfig: se, isLoading: ce } = i(), le = re("workspace.auth.enterprise-sso"), ue = o || le?.value === !0, x = ee(null), S = b.get("tenant"), C = b.get("org"), w = b.get("workspace"), { ssoConfig: T, oidcConfig: E, isLoading: D, isSaving: O, isDeleting: k, saveSsoConfig: A, deleteSsoConfig: de } = r(S ?? "burdenoff.com"), [j, fe] = u("saml"), [M, N] = u(!1), [pe, P] = u(!1), [F, I] = u(null), [L, R] = u(null), [z, B] = u(""), [V, H] = u(!1), [U, W] = u(!1), [G, K] = u({
|
|
55
52
|
client_name: "",
|
|
56
53
|
redirect_uris: "",
|
|
57
54
|
grant_types: ["authorization_code", "refresh_token"],
|
|
58
55
|
token_endpoint_auth_method: "none"
|
|
59
|
-
}), [
|
|
56
|
+
}), [q, J] = u(!1), [Y, X] = u(null), [Z, Q] = u({
|
|
60
57
|
entityId: "",
|
|
61
58
|
ssoUrl: "",
|
|
62
59
|
sloUrl: "",
|
|
63
60
|
certificate: "",
|
|
64
61
|
enabled: !1
|
|
65
|
-
}),
|
|
62
|
+
}), me = async (e) => {
|
|
66
63
|
let t = e.target.files?.[0];
|
|
67
64
|
if (t) {
|
|
68
|
-
|
|
65
|
+
I(null), H(!0);
|
|
69
66
|
try {
|
|
70
67
|
let e = _(await t.text());
|
|
71
68
|
e ? (Q({
|
|
@@ -74,21 +71,21 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
74
71
|
ssoUrl: e.ssoUrl,
|
|
75
72
|
sloUrl: e.sloUrl || "",
|
|
76
73
|
certificate: e.certificate
|
|
77
|
-
}),
|
|
74
|
+
}), R(v("auth.sso.importSuccess", "SAML metadata imported successfully! Review and save the configuration.")), N(!0)) : I(v("auth.sso.parseError", "Failed to parse SAML metadata. Make sure the file contains valid IdP metadata XML."));
|
|
78
75
|
} catch {
|
|
79
|
-
|
|
76
|
+
I(v("auth.sso.readError", "Failed to read metadata file"));
|
|
80
77
|
} finally {
|
|
81
|
-
|
|
78
|
+
H(!1), x.current && (x.current.value = "");
|
|
82
79
|
}
|
|
83
80
|
}
|
|
84
|
-
},
|
|
85
|
-
if (!
|
|
86
|
-
|
|
81
|
+
}, he = async () => {
|
|
82
|
+
if (!z) {
|
|
83
|
+
I(v("auth.sso.enterUrl", "Please enter a metadata URL"));
|
|
87
84
|
return;
|
|
88
85
|
}
|
|
89
|
-
|
|
86
|
+
I(null), H(!0);
|
|
90
87
|
try {
|
|
91
|
-
let e = await fetch(
|
|
88
|
+
let e = await fetch(z);
|
|
92
89
|
if (!e.ok) throw Error(`Failed to fetch: ${e.statusText}`);
|
|
93
90
|
let t = _(await e.text());
|
|
94
91
|
t ? (Q({
|
|
@@ -97,68 +94,68 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
97
94
|
ssoUrl: t.ssoUrl,
|
|
98
95
|
sloUrl: t.sloUrl || "",
|
|
99
96
|
certificate: t.certificate
|
|
100
|
-
}),
|
|
97
|
+
}), R(v("auth.sso.importSuccessFromUrl", "SAML metadata imported successfully! Review and save the configuration.")), N(!0), B("")) : I(v("auth.sso.parseUrlError", "Failed to parse SAML metadata from URL."));
|
|
101
98
|
} catch (e) {
|
|
102
|
-
|
|
99
|
+
I(e instanceof Error ? e.message : v("auth.sso.fetchError", "Failed to fetch metadata from URL"));
|
|
103
100
|
} finally {
|
|
104
|
-
|
|
101
|
+
H(!1);
|
|
105
102
|
}
|
|
106
|
-
},
|
|
107
|
-
if (!
|
|
108
|
-
|
|
103
|
+
}, ge = async () => {
|
|
104
|
+
if (!G.client_name || !G.redirect_uris) {
|
|
105
|
+
I(v("auth.sso.clientRequired", "Client name and redirect URI are required"));
|
|
109
106
|
return;
|
|
110
107
|
}
|
|
111
|
-
|
|
108
|
+
J(!0), I(null);
|
|
112
109
|
try {
|
|
113
|
-
let e =
|
|
114
|
-
if (!e) throw Error(
|
|
110
|
+
let e = E?.registrationEndpoint;
|
|
111
|
+
if (!e) throw Error(v("auth.sso.oidcNotConfigured", "OIDC dynamic client registration is not configured for this environment."));
|
|
115
112
|
let t = await fetch(e, {
|
|
116
113
|
method: "POST",
|
|
117
114
|
headers: { "Content-Type": "application/json" },
|
|
118
115
|
body: JSON.stringify({
|
|
119
|
-
client_name:
|
|
120
|
-
redirect_uris:
|
|
121
|
-
grant_types:
|
|
116
|
+
client_name: G.client_name,
|
|
117
|
+
redirect_uris: G.redirect_uris.split(",").map((e) => e.trim()),
|
|
118
|
+
grant_types: G.grant_types,
|
|
122
119
|
response_types: ["code"],
|
|
123
|
-
token_endpoint_auth_method:
|
|
120
|
+
token_endpoint_auth_method: G.token_endpoint_auth_method
|
|
124
121
|
})
|
|
125
122
|
});
|
|
126
123
|
if (!t.ok) {
|
|
127
124
|
let e = await t.json();
|
|
128
125
|
throw Error(e.error_description || e.error || "Registration failed");
|
|
129
126
|
}
|
|
130
|
-
|
|
127
|
+
X(await t.json()), R(v("auth.sso.clientRegistered", "OIDC client registered successfully! Save the client credentials.")), W(!1), K({
|
|
131
128
|
client_name: "",
|
|
132
129
|
redirect_uris: "",
|
|
133
130
|
grant_types: ["authorization_code", "refresh_token"],
|
|
134
131
|
token_endpoint_auth_method: "none"
|
|
135
132
|
});
|
|
136
133
|
} catch (e) {
|
|
137
|
-
|
|
134
|
+
I(e instanceof Error ? e.message : v("auth.sso.registerFailed", "Failed to register client"));
|
|
138
135
|
} finally {
|
|
139
|
-
|
|
136
|
+
J(!1);
|
|
140
137
|
}
|
|
141
138
|
};
|
|
142
139
|
l(() => {
|
|
143
|
-
|
|
144
|
-
entityId:
|
|
145
|
-
ssoUrl:
|
|
146
|
-
sloUrl:
|
|
147
|
-
certificate:
|
|
148
|
-
enabled:
|
|
140
|
+
T && Q({
|
|
141
|
+
entityId: T.entityId || "",
|
|
142
|
+
ssoUrl: T.ssoUrl || "",
|
|
143
|
+
sloUrl: T.sloUrl || "",
|
|
144
|
+
certificate: T.certificate || "",
|
|
145
|
+
enabled: T.enabled || !1
|
|
149
146
|
});
|
|
150
|
-
}, [
|
|
151
|
-
let
|
|
152
|
-
e.preventDefault(),
|
|
147
|
+
}, [T]);
|
|
148
|
+
let _e = async (e) => {
|
|
149
|
+
e.preventDefault(), I(null), R(null);
|
|
153
150
|
try {
|
|
154
|
-
await
|
|
151
|
+
await A(Z), R(v("auth.sso.saveSuccess", "SSO configuration saved successfully!")), N(!1);
|
|
155
152
|
} catch (e) {
|
|
156
|
-
|
|
153
|
+
I(e instanceof Error ? e.message : v("auth.sso.saveFailed", "Failed to save configuration"));
|
|
157
154
|
}
|
|
158
|
-
},
|
|
159
|
-
|
|
155
|
+
}, ve = async () => {
|
|
156
|
+
I(null), R(null), s("medium");
|
|
160
157
|
try {
|
|
161
|
-
await
|
|
158
|
+
await de(), c("success"), R(v("auth.sso.deleteSuccess", "SSO configuration deleted successfully.")), P(!1), Q({
|
|
162
159
|
entityId: "",
|
|
163
160
|
ssoUrl: "",
|
|
164
161
|
sloUrl: "",
|
|
@@ -166,40 +163,40 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
166
163
|
enabled: !1
|
|
167
164
|
});
|
|
168
165
|
} catch (e) {
|
|
169
|
-
|
|
166
|
+
c("error"), I(e instanceof Error ? e.message : v("auth.sso.deleteFailed", "Failed to delete configuration"));
|
|
170
167
|
}
|
|
171
168
|
}, $ = async () => {
|
|
172
|
-
|
|
169
|
+
I(null);
|
|
173
170
|
try {
|
|
174
|
-
await
|
|
171
|
+
await A({
|
|
175
172
|
...Z,
|
|
176
173
|
enabled: !Z.enabled
|
|
177
|
-
}),
|
|
174
|
+
}), R(Z.enabled ? v("auth.sso.ssoDisabled", "SSO disabled") : v("auth.sso.ssoEnabled", "SSO enabled"));
|
|
178
175
|
} catch (e) {
|
|
179
|
-
|
|
176
|
+
I(e instanceof Error ? e.message : v("auth.sso.statusUpdateFailed", "Failed to update status"));
|
|
180
177
|
}
|
|
181
178
|
};
|
|
182
|
-
return
|
|
179
|
+
return ce ? /* @__PURE__ */ f("div", {
|
|
183
180
|
className: "max-w-5xl mx-auto p-6",
|
|
184
181
|
children: /* @__PURE__ */ p("div", {
|
|
185
182
|
className: "text-center py-16",
|
|
186
|
-
children: [/* @__PURE__ */ f(
|
|
183
|
+
children: [/* @__PURE__ */ f(n, { className: "size-8 mx-auto text-text-secondary animate-spin" }), /* @__PURE__ */ f("p", {
|
|
187
184
|
className: "mt-4 text-text-secondary",
|
|
188
|
-
children:
|
|
185
|
+
children: v("auth.sso.loadingPermissions", "Loading permissions...")
|
|
189
186
|
})]
|
|
190
187
|
})
|
|
191
|
-
}) :
|
|
188
|
+
}) : se ? ue ? /* @__PURE__ */ p("div", {
|
|
192
189
|
className: "max-w-5xl mx-auto p-6",
|
|
193
190
|
children: [
|
|
194
|
-
/* @__PURE__ */ f(
|
|
195
|
-
open:
|
|
196
|
-
onOpenChange:
|
|
197
|
-
title:
|
|
198
|
-
description:
|
|
199
|
-
confirmText:
|
|
191
|
+
/* @__PURE__ */ f(a, {
|
|
192
|
+
open: pe,
|
|
193
|
+
onOpenChange: P,
|
|
194
|
+
title: v("auth.sso.deleteConfirmTitle", "Delete SSO configuration?"),
|
|
195
|
+
description: v("auth.sso.deleteConfirmDesc", "Users will immediately lose the ability to sign in with this SSO setup until a new configuration is saved."),
|
|
196
|
+
confirmText: v("auth.sso.deleteConfirmButton", "Delete configuration"),
|
|
200
197
|
variant: "danger",
|
|
201
|
-
isPending:
|
|
202
|
-
onConfirm:
|
|
198
|
+
isPending: k,
|
|
199
|
+
onConfirm: ve
|
|
203
200
|
}),
|
|
204
201
|
/* @__PURE__ */ p("div", {
|
|
205
202
|
className: "flex items-center justify-between mb-8",
|
|
@@ -207,8 +204,8 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
207
204
|
className: "flex items-center gap-4",
|
|
208
205
|
children: [/* @__PURE__ */ f("button", {
|
|
209
206
|
type: "button",
|
|
210
|
-
onClick: () =>
|
|
211
|
-
"aria-label":
|
|
207
|
+
onClick: () => y("/auth/security"),
|
|
208
|
+
"aria-label": v("auth.sso.backToSecurity", "Back to Security"),
|
|
212
209
|
className: "p-2 rounded-lg hover:bg-bg-sunken transition-colors",
|
|
213
210
|
children: /* @__PURE__ */ f("svg", {
|
|
214
211
|
className: "size-5 text-text-secondary",
|
|
@@ -225,109 +222,109 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
225
222
|
})
|
|
226
223
|
}), /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h1", {
|
|
227
224
|
className: "text-2xl font-semibold text-text-primary",
|
|
228
|
-
children:
|
|
225
|
+
children: v("auth.sso.title", "Single Sign-On (SSO)")
|
|
229
226
|
}), /* @__PURE__ */ f("p", {
|
|
230
227
|
className: "text-text-secondary mt-1",
|
|
231
|
-
children:
|
|
228
|
+
children: v("auth.sso.description", "Configure enterprise SSO with SAML 2.0 or OIDC")
|
|
232
229
|
})] })]
|
|
233
|
-
}),
|
|
230
|
+
}), T && /* @__PURE__ */ p("div", {
|
|
234
231
|
className: "flex items-center gap-3",
|
|
235
232
|
children: [/* @__PURE__ */ f("span", {
|
|
236
233
|
className: `px-3 py-1 rounded-full text-sm font-medium ${Z.enabled ? "bg-status-success-bg-subtle text-status-success-text" : "bg-bg-sunken text-text-secondary"}`,
|
|
237
|
-
children: Z.enabled ?
|
|
234
|
+
children: Z.enabled ? v("auth.sso.enabled", "Enabled") : v("auth.sso.disabled", "Disabled")
|
|
238
235
|
}), /* @__PURE__ */ f("button", {
|
|
239
236
|
type: "button",
|
|
240
237
|
onClick: $,
|
|
241
|
-
disabled:
|
|
238
|
+
disabled: O,
|
|
242
239
|
className: "px-4 py-2 rounded-lg border border-border-default text-text-primary hover:bg-bg-sunken transition-colors text-sm font-medium",
|
|
243
|
-
children: Z.enabled ?
|
|
240
|
+
children: Z.enabled ? v("auth.sso.disable", "Disable") : v("auth.sso.enable", "Enable")
|
|
244
241
|
})]
|
|
245
242
|
})]
|
|
246
243
|
}),
|
|
247
|
-
/* @__PURE__ */ f(
|
|
244
|
+
/* @__PURE__ */ f(oe, {
|
|
248
245
|
className: "mb-6",
|
|
249
|
-
children:
|
|
246
|
+
children: v("auth.sso.purpose", "Connect your organization's identity provider so your team signs in with their existing corporate credentials. Configure SAML 2.0 or OIDC here, then register the client apps that should accept these logins.")
|
|
250
247
|
}),
|
|
251
|
-
/* @__PURE__ */ f(
|
|
248
|
+
/* @__PURE__ */ f(ie, {
|
|
252
249
|
className: "mb-8",
|
|
253
250
|
children: /* @__PURE__ */ f("div", {
|
|
254
251
|
className: "flex items-center justify-between gap-4",
|
|
255
252
|
children: /* @__PURE__ */ p("div", { children: [
|
|
256
253
|
/* @__PURE__ */ f("p", {
|
|
257
254
|
className: "text-sm font-medium text-text-secondary",
|
|
258
|
-
children:
|
|
255
|
+
children: v("auth.sso.statusLabel", "SSO connection")
|
|
259
256
|
}),
|
|
260
257
|
/* @__PURE__ */ f("p", {
|
|
261
258
|
className: "mt-1 text-lg font-semibold text-text-primary",
|
|
262
|
-
children:
|
|
259
|
+
children: T ? Z.enabled ? v("auth.sso.statusActive", "Active — users can sign in via SSO") : v("auth.sso.statusConfiguredDisabled", "Configured but disabled") : v("auth.sso.statusNotConfigured", "Not configured yet")
|
|
263
260
|
}),
|
|
264
261
|
/* @__PURE__ */ f("p", {
|
|
265
262
|
className: "mt-1 text-sm text-text-secondary",
|
|
266
|
-
children:
|
|
263
|
+
children: v("auth.sso.statusHint", "Save a SAML or OIDC configuration below, then enable it to go live.")
|
|
267
264
|
})
|
|
268
265
|
] })
|
|
269
266
|
})
|
|
270
267
|
}),
|
|
271
|
-
|
|
268
|
+
o && (S ?? C ?? w) && /* @__PURE__ */ p("div", {
|
|
272
269
|
className: "mb-6 p-4 rounded-xl bg-status-info-bg-subtle border border-status-info-border",
|
|
273
270
|
children: [/* @__PURE__ */ f("p", {
|
|
274
271
|
className: "text-sm font-medium text-status-info-text mb-1",
|
|
275
|
-
children:
|
|
272
|
+
children: v("auth.sso.adminContext", "Configuring SSO for")
|
|
276
273
|
}), /* @__PURE__ */ p("div", {
|
|
277
274
|
className: "flex flex-wrap gap-4 text-xs text-status-info-text",
|
|
278
275
|
children: [
|
|
279
|
-
|
|
276
|
+
S && /* @__PURE__ */ p("span", { children: [
|
|
280
277
|
/* @__PURE__ */ f("span", {
|
|
281
278
|
className: "font-medium",
|
|
282
|
-
children:
|
|
279
|
+
children: v("auth.sso.tenant", "Tenant:")
|
|
283
280
|
}),
|
|
284
281
|
" ",
|
|
285
282
|
/* @__PURE__ */ f("code", {
|
|
286
283
|
className: "font-mono",
|
|
287
|
-
children:
|
|
284
|
+
children: S
|
|
288
285
|
})
|
|
289
286
|
] }),
|
|
290
|
-
|
|
287
|
+
C && /* @__PURE__ */ p("span", { children: [
|
|
291
288
|
/* @__PURE__ */ f("span", {
|
|
292
289
|
className: "font-medium",
|
|
293
|
-
children:
|
|
290
|
+
children: v("auth.sso.organization", "Organization:")
|
|
294
291
|
}),
|
|
295
292
|
" ",
|
|
296
293
|
/* @__PURE__ */ f("code", {
|
|
297
294
|
className: "font-mono",
|
|
298
|
-
children:
|
|
295
|
+
children: C
|
|
299
296
|
})
|
|
300
297
|
] }),
|
|
301
|
-
|
|
298
|
+
w && /* @__PURE__ */ p("span", { children: [
|
|
302
299
|
/* @__PURE__ */ f("span", {
|
|
303
300
|
className: "font-medium",
|
|
304
|
-
children:
|
|
301
|
+
children: v("auth.sso.workspace", "Workspace:")
|
|
305
302
|
}),
|
|
306
303
|
" ",
|
|
307
304
|
/* @__PURE__ */ f("code", {
|
|
308
305
|
className: "font-mono",
|
|
309
|
-
children:
|
|
306
|
+
children: w
|
|
310
307
|
})
|
|
311
308
|
] })
|
|
312
309
|
]
|
|
313
310
|
})]
|
|
314
311
|
}),
|
|
315
|
-
|
|
312
|
+
F && /* @__PURE__ */ p("div", {
|
|
316
313
|
className: "mb-6 flex items-start gap-3 p-4 rounded-xl bg-status-error-bg-subtle border border-status-error-border",
|
|
317
|
-
children: [/* @__PURE__ */ f(
|
|
314
|
+
children: [/* @__PURE__ */ f(t, { className: "size-5 text-status-error-text flex-shrink-0 mt-0.5" }), /* @__PURE__ */ p("div", {
|
|
318
315
|
className: "flex-1",
|
|
319
316
|
children: [/* @__PURE__ */ f("p", {
|
|
320
317
|
className: "text-sm text-status-error-text",
|
|
321
|
-
children:
|
|
318
|
+
children: F
|
|
322
319
|
}), /* @__PURE__ */ f("button", {
|
|
323
320
|
type: "button",
|
|
324
|
-
onClick: () =>
|
|
321
|
+
onClick: () => I(null),
|
|
325
322
|
className: "mt-2 text-sm text-status-error-text hover:underline",
|
|
326
|
-
children:
|
|
323
|
+
children: v("auth.sso.dismiss", "Dismiss")
|
|
327
324
|
})]
|
|
328
325
|
})]
|
|
329
326
|
}),
|
|
330
|
-
|
|
327
|
+
L && /* @__PURE__ */ p("div", {
|
|
331
328
|
className: "mb-6 flex items-start gap-3 p-4 rounded-xl bg-status-success-bg-subtle border border-status-success-border",
|
|
332
329
|
children: [/* @__PURE__ */ f("svg", {
|
|
333
330
|
className: "size-5 text-status-success-text flex-shrink-0 mt-0.5",
|
|
@@ -342,12 +339,12 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
342
339
|
className: "flex-1",
|
|
343
340
|
children: [/* @__PURE__ */ f("p", {
|
|
344
341
|
className: "text-sm text-status-success-text",
|
|
345
|
-
children:
|
|
342
|
+
children: L
|
|
346
343
|
}), /* @__PURE__ */ f("button", {
|
|
347
344
|
type: "button",
|
|
348
|
-
onClick: () =>
|
|
345
|
+
onClick: () => R(null),
|
|
349
346
|
className: "mt-2 text-sm text-status-success-text hover:underline",
|
|
350
|
-
children:
|
|
347
|
+
children: v("auth.sso.dismiss", "Dismiss")
|
|
351
348
|
})]
|
|
352
349
|
})]
|
|
353
350
|
}),
|
|
@@ -358,43 +355,43 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
358
355
|
children: [
|
|
359
356
|
{
|
|
360
357
|
id: "saml",
|
|
361
|
-
label:
|
|
358
|
+
label: v("auth.sso.samlTab", "SAML 2.0"),
|
|
362
359
|
icon: "🔐"
|
|
363
360
|
},
|
|
364
361
|
{
|
|
365
362
|
id: "oidc",
|
|
366
|
-
label:
|
|
363
|
+
label: v("auth.sso.oidcTab", "OIDC Provider"),
|
|
367
364
|
icon: "🌐"
|
|
368
365
|
},
|
|
369
366
|
{
|
|
370
367
|
id: "clients",
|
|
371
|
-
label:
|
|
368
|
+
label: v("auth.sso.clientsTab", "OIDC Clients"),
|
|
372
369
|
icon: "🔑"
|
|
373
370
|
},
|
|
374
371
|
{
|
|
375
372
|
id: "test",
|
|
376
|
-
label:
|
|
373
|
+
label: v("auth.sso.testTab", "Test SSO"),
|
|
377
374
|
icon: "🧪"
|
|
378
375
|
}
|
|
379
376
|
].map((e) => /* @__PURE__ */ p("button", {
|
|
380
377
|
type: "button",
|
|
381
|
-
onClick: () =>
|
|
382
|
-
className: `pb-3 text-sm font-medium transition-colors relative ${
|
|
378
|
+
onClick: () => fe(e.id),
|
|
379
|
+
className: `pb-3 text-sm font-medium transition-colors relative ${j === e.id ? "text-text-link" : "text-text-secondary hover:text-text-primary"}`,
|
|
383
380
|
children: [/* @__PURE__ */ p("span", {
|
|
384
381
|
className: "flex items-center gap-2",
|
|
385
382
|
children: [/* @__PURE__ */ f("span", { children: e.icon }), e.label]
|
|
386
|
-
}),
|
|
383
|
+
}), j === e.id && /* @__PURE__ */ f("span", { className: "absolute bottom-0 left-0 right-0 h-0.5 bg-action-primary-bg" })]
|
|
387
384
|
}, e.id))
|
|
388
385
|
})
|
|
389
386
|
}),
|
|
390
|
-
|
|
387
|
+
D && /* @__PURE__ */ p("div", {
|
|
391
388
|
className: "flex items-center justify-center py-12",
|
|
392
|
-
children: [/* @__PURE__ */ f(
|
|
389
|
+
children: [/* @__PURE__ */ f(n, { className: "size-8 text-text-link animate-spin" }), /* @__PURE__ */ f("span", {
|
|
393
390
|
className: "ml-3 text-text-secondary",
|
|
394
|
-
children:
|
|
391
|
+
children: v("auth.sso.loadingConfig", "Loading configuration...")
|
|
395
392
|
})]
|
|
396
393
|
}),
|
|
397
|
-
!
|
|
394
|
+
!D && j === "saml" && /* @__PURE__ */ p("div", {
|
|
398
395
|
className: "space-y-6",
|
|
399
396
|
children: [
|
|
400
397
|
/* @__PURE__ */ p("div", {
|
|
@@ -402,18 +399,18 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
402
399
|
children: [
|
|
403
400
|
/* @__PURE__ */ f("h3", {
|
|
404
401
|
className: "font-medium text-status-info-text mb-2",
|
|
405
|
-
children:
|
|
402
|
+
children: v("auth.sso.samlConfigTitle", "SAML 2.0 Configuration")
|
|
406
403
|
}),
|
|
407
404
|
/* @__PURE__ */ f("p", {
|
|
408
405
|
className: "text-sm text-status-info-text",
|
|
409
|
-
children:
|
|
406
|
+
children: v("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.):")
|
|
410
407
|
}),
|
|
411
408
|
/* @__PURE__ */ p("ul", {
|
|
412
409
|
className: "mt-2 text-sm text-status-info-text list-disc list-inside",
|
|
413
410
|
children: [
|
|
414
|
-
/* @__PURE__ */ f("li", { children:
|
|
415
|
-
/* @__PURE__ */ f("li", { children:
|
|
416
|
-
/* @__PURE__ */ f("li", { children:
|
|
411
|
+
/* @__PURE__ */ f("li", { children: v("auth.sso.entityIdItem", "Entity ID (Issuer URL)") }),
|
|
412
|
+
/* @__PURE__ */ f("li", { children: v("auth.sso.ssoUrlItem", "SSO URL (Login URL)") }),
|
|
413
|
+
/* @__PURE__ */ f("li", { children: v("auth.sso.certificateItem", "X.509 Certificate") })
|
|
417
414
|
]
|
|
418
415
|
})
|
|
419
416
|
]
|
|
@@ -423,11 +420,11 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
423
420
|
children: [
|
|
424
421
|
/* @__PURE__ */ f("h3", {
|
|
425
422
|
className: "text-lg font-medium text-text-primary mb-4",
|
|
426
|
-
children:
|
|
423
|
+
children: v("auth.sso.importMetadata", "Import IdP Metadata")
|
|
427
424
|
}),
|
|
428
425
|
/* @__PURE__ */ f("p", {
|
|
429
426
|
className: "text-sm text-text-secondary mb-4",
|
|
430
|
-
children:
|
|
427
|
+
children: v("auth.sso.importMetadataDesc", "Automatically configure SSO by importing your IdP's metadata XML file or URL.")
|
|
431
428
|
}),
|
|
432
429
|
/* @__PURE__ */ p("div", {
|
|
433
430
|
className: "grid grid-cols-1 md:grid-cols-2 gap-6",
|
|
@@ -436,21 +433,21 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
436
433
|
children: [
|
|
437
434
|
/* @__PURE__ */ f("label", {
|
|
438
435
|
className: "block text-sm font-medium text-text-primary",
|
|
439
|
-
children:
|
|
436
|
+
children: v("auth.sso.uploadFile", "Upload Metadata File")
|
|
440
437
|
}),
|
|
441
438
|
/* @__PURE__ */ f("input", {
|
|
442
|
-
ref:
|
|
439
|
+
ref: x,
|
|
443
440
|
type: "file",
|
|
444
441
|
accept: ".xml,application/xml,text/xml",
|
|
445
|
-
onChange:
|
|
442
|
+
onChange: me,
|
|
446
443
|
className: "hidden",
|
|
447
444
|
id: "metadata-file",
|
|
448
|
-
"aria-label":
|
|
445
|
+
"aria-label": v("auth.sso.uploadFile", "Upload Metadata File")
|
|
449
446
|
}),
|
|
450
447
|
/* @__PURE__ */ p("label", {
|
|
451
448
|
htmlFor: "metadata-file",
|
|
452
449
|
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",
|
|
453
|
-
children: [
|
|
450
|
+
children: [V ? /* @__PURE__ */ f(n, { className: "size-5 animate-spin text-text-link" }) : /* @__PURE__ */ f("svg", {
|
|
454
451
|
className: "size-5 text-text-tertiary",
|
|
455
452
|
fill: "none",
|
|
456
453
|
viewBox: "0 0 24 24",
|
|
@@ -463,7 +460,7 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
463
460
|
})
|
|
464
461
|
}), /* @__PURE__ */ f("span", {
|
|
465
462
|
className: "text-sm text-text-secondary",
|
|
466
|
-
children:
|
|
463
|
+
children: V ? v("auth.sso.importing", "Importing...") : v("auth.sso.chooseFile", "Choose XML file")
|
|
467
464
|
})]
|
|
468
465
|
})
|
|
469
466
|
]
|
|
@@ -471,23 +468,23 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
471
468
|
className: "space-y-3",
|
|
472
469
|
children: [/* @__PURE__ */ f("label", {
|
|
473
470
|
className: "block text-sm font-medium text-text-primary",
|
|
474
|
-
children:
|
|
471
|
+
children: v("auth.sso.fetchFromUrl", "Fetch from URL")
|
|
475
472
|
}), /* @__PURE__ */ p("div", {
|
|
476
473
|
className: "flex gap-2",
|
|
477
474
|
children: [/* @__PURE__ */ f("input", {
|
|
478
475
|
id: "sso-metadata-url",
|
|
479
476
|
type: "url",
|
|
480
|
-
value:
|
|
481
|
-
onChange: (e) =>
|
|
477
|
+
value: z,
|
|
478
|
+
onChange: (e) => B(e.target.value),
|
|
482
479
|
placeholder: "https://idp.example.com/metadata.xml",
|
|
483
|
-
"aria-label":
|
|
480
|
+
"aria-label": v("auth.sso.fetchFromUrl", "Fetch from URL"),
|
|
484
481
|
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"
|
|
485
482
|
}), /* @__PURE__ */ p("button", {
|
|
486
483
|
type: "button",
|
|
487
|
-
onClick:
|
|
488
|
-
disabled:
|
|
484
|
+
onClick: he,
|
|
485
|
+
disabled: V || !z,
|
|
489
486
|
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",
|
|
490
|
-
children: [
|
|
487
|
+
children: [V ? /* @__PURE__ */ f(n, { className: "size-4 animate-spin" }) : /* @__PURE__ */ f("svg", {
|
|
491
488
|
className: "size-4",
|
|
492
489
|
fill: "none",
|
|
493
490
|
viewBox: "0 0 24 24",
|
|
@@ -498,7 +495,7 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
498
495
|
strokeWidth: 2,
|
|
499
496
|
d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"
|
|
500
497
|
})
|
|
501
|
-
}),
|
|
498
|
+
}), v("auth.sso.fetch", "Fetch")]
|
|
502
499
|
})]
|
|
503
500
|
})]
|
|
504
501
|
})]
|
|
@@ -510,17 +507,17 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
510
507
|
children: [
|
|
511
508
|
/* @__PURE__ */ f("h3", {
|
|
512
509
|
className: "text-lg font-medium text-text-primary mb-4",
|
|
513
|
-
children:
|
|
510
|
+
children: v("auth.sso.spMetadata", "Service Provider (SP) Metadata")
|
|
514
511
|
}),
|
|
515
512
|
/* @__PURE__ */ f("p", {
|
|
516
513
|
className: "text-sm text-text-secondary mb-4",
|
|
517
|
-
children:
|
|
514
|
+
children: v("auth.sso.spMetadataDesc", "Provide these values to your Identity Provider when setting up the SAML integration:")
|
|
518
515
|
}),
|
|
519
516
|
/* @__PURE__ */ p("div", {
|
|
520
517
|
className: "space-y-4",
|
|
521
518
|
children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
|
|
522
519
|
className: "block text-sm font-medium text-text-primary mb-1",
|
|
523
|
-
children:
|
|
520
|
+
children: v("auth.sso.spEntityId", "SP Entity ID / Audience URI")
|
|
524
521
|
}), /* @__PURE__ */ p("div", {
|
|
525
522
|
className: "flex items-center gap-2",
|
|
526
523
|
children: [/* @__PURE__ */ p("code", {
|
|
@@ -530,11 +527,11 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
530
527
|
type: "button",
|
|
531
528
|
onClick: () => void g(`${window.location.origin}/auth/saml/metadata`),
|
|
532
529
|
className: "px-3 py-2 rounded-lg border border-border-default text-text-secondary hover:bg-bg-sunken",
|
|
533
|
-
children:
|
|
530
|
+
children: v("auth.sso.copy", "Copy")
|
|
534
531
|
})]
|
|
535
532
|
})] }), /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
|
|
536
533
|
className: "block text-sm font-medium text-text-primary mb-1",
|
|
537
|
-
children:
|
|
534
|
+
children: v("auth.sso.acsUrl", "Assertion Consumer Service (ACS) URL")
|
|
538
535
|
}), /* @__PURE__ */ p("div", {
|
|
539
536
|
className: "flex items-center gap-2",
|
|
540
537
|
children: [/* @__PURE__ */ p("code", {
|
|
@@ -544,26 +541,26 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
544
541
|
type: "button",
|
|
545
542
|
onClick: () => void g(`${window.location.origin}/auth/sso/callback`),
|
|
546
543
|
className: "px-3 py-2 rounded-lg border border-border-default text-text-secondary hover:bg-bg-sunken",
|
|
547
|
-
children:
|
|
544
|
+
children: v("auth.sso.copy", "Copy")
|
|
548
545
|
})]
|
|
549
546
|
})] })]
|
|
550
547
|
})
|
|
551
548
|
]
|
|
552
549
|
}),
|
|
553
550
|
/* @__PURE__ */ p("form", {
|
|
554
|
-
onSubmit:
|
|
551
|
+
onSubmit: _e,
|
|
555
552
|
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
556
553
|
children: [
|
|
557
554
|
/* @__PURE__ */ p("div", {
|
|
558
555
|
className: "flex items-center justify-between mb-6",
|
|
559
556
|
children: [/* @__PURE__ */ f("h3", {
|
|
560
557
|
className: "text-lg font-medium text-text-primary",
|
|
561
|
-
children:
|
|
562
|
-
}), !
|
|
558
|
+
children: v("auth.sso.idpSettings", "Identity Provider (IdP) Settings")
|
|
559
|
+
}), !M && T && /* @__PURE__ */ f("button", {
|
|
563
560
|
type: "button",
|
|
564
|
-
onClick: () =>
|
|
561
|
+
onClick: () => N(!0),
|
|
565
562
|
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",
|
|
566
|
-
children:
|
|
563
|
+
children: v("auth.sso.editConfig", "Edit Configuration")
|
|
567
564
|
})]
|
|
568
565
|
}),
|
|
569
566
|
/* @__PURE__ */ p("div", {
|
|
@@ -574,7 +571,7 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
574
571
|
htmlFor: "sso-entity-id",
|
|
575
572
|
className: "block text-sm font-medium text-text-primary mb-2",
|
|
576
573
|
children: [
|
|
577
|
-
|
|
574
|
+
v("auth.sso.idpEntityId", "IdP Entity ID / Issuer URL"),
|
|
578
575
|
" ",
|
|
579
576
|
/* @__PURE__ */ f("span", {
|
|
580
577
|
className: "text-status-error-text",
|
|
@@ -586,14 +583,14 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
586
583
|
/* @__PURE__ */ f("input", {
|
|
587
584
|
id: "sso-entity-id",
|
|
588
585
|
type: "url",
|
|
589
|
-
"aria-label":
|
|
586
|
+
"aria-label": v("auth.sso.idpEntityId", "IdP Entity ID"),
|
|
590
587
|
value: Z.entityId,
|
|
591
588
|
onChange: (e) => Q({
|
|
592
589
|
...Z,
|
|
593
590
|
entityId: e.target.value
|
|
594
591
|
}),
|
|
595
|
-
disabled: !
|
|
596
|
-
placeholder:
|
|
592
|
+
disabled: !M && !!T,
|
|
593
|
+
placeholder: v("auth.sso.idpEntityIdPlaceholder", "https://your-idp.example.com/saml/metadata"),
|
|
597
594
|
required: !0,
|
|
598
595
|
"aria-required": "true",
|
|
599
596
|
"aria-describedby": "sso-entity-id-hint",
|
|
@@ -602,7 +599,7 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
602
599
|
/* @__PURE__ */ f("p", {
|
|
603
600
|
id: "sso-entity-id-hint",
|
|
604
601
|
className: "mt-1 text-xs text-text-secondary",
|
|
605
|
-
children:
|
|
602
|
+
children: v("auth.sso.idpEntityIdHelper", "The unique identifier of your Identity Provider")
|
|
606
603
|
})
|
|
607
604
|
] }),
|
|
608
605
|
/* @__PURE__ */ p("div", { children: [
|
|
@@ -610,7 +607,7 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
610
607
|
htmlFor: "sso-sso-url",
|
|
611
608
|
className: "block text-sm font-medium text-text-primary mb-2",
|
|
612
609
|
children: [
|
|
613
|
-
|
|
610
|
+
v("auth.sso.ssoUrl", "SSO URL (Login URL)"),
|
|
614
611
|
" ",
|
|
615
612
|
/* @__PURE__ */ f("span", {
|
|
616
613
|
className: "text-status-error-text",
|
|
@@ -622,14 +619,14 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
622
619
|
/* @__PURE__ */ f("input", {
|
|
623
620
|
id: "sso-sso-url",
|
|
624
621
|
type: "url",
|
|
625
|
-
"aria-label":
|
|
622
|
+
"aria-label": v("auth.sso.ssoUrl", "SSO URL"),
|
|
626
623
|
value: Z.ssoUrl,
|
|
627
624
|
onChange: (e) => Q({
|
|
628
625
|
...Z,
|
|
629
626
|
ssoUrl: e.target.value
|
|
630
627
|
}),
|
|
631
|
-
disabled: !
|
|
632
|
-
placeholder:
|
|
628
|
+
disabled: !M && !!T,
|
|
629
|
+
placeholder: v("auth.sso.ssoUrlPlaceholder", "https://your-idp.example.com/saml/sso"),
|
|
633
630
|
required: !0,
|
|
634
631
|
"aria-required": "true",
|
|
635
632
|
"aria-describedby": "sso-sso-url-hint",
|
|
@@ -638,7 +635,7 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
638
635
|
/* @__PURE__ */ f("p", {
|
|
639
636
|
id: "sso-sso-url-hint",
|
|
640
637
|
className: "mt-1 text-xs text-text-secondary",
|
|
641
|
-
children:
|
|
638
|
+
children: v("auth.sso.ssoUrlHelper", "The URL where users are redirected to authenticate")
|
|
642
639
|
})
|
|
643
640
|
] }),
|
|
644
641
|
/* @__PURE__ */ p("div", { children: [
|
|
@@ -646,7 +643,7 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
646
643
|
htmlFor: "sso-certificate",
|
|
647
644
|
className: "block text-sm font-medium text-text-primary mb-2",
|
|
648
645
|
children: [
|
|
649
|
-
|
|
646
|
+
v("auth.sso.certificate", "X.509 Certificate"),
|
|
650
647
|
" ",
|
|
651
648
|
/* @__PURE__ */ f("span", {
|
|
652
649
|
className: "text-status-error-text",
|
|
@@ -657,14 +654,14 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
657
654
|
}),
|
|
658
655
|
/* @__PURE__ */ f("textarea", {
|
|
659
656
|
id: "sso-certificate",
|
|
660
|
-
"aria-label":
|
|
657
|
+
"aria-label": v("auth.sso.certificate", "X.509 Certificate"),
|
|
661
658
|
value: Z.certificate,
|
|
662
659
|
onChange: (e) => Q({
|
|
663
660
|
...Z,
|
|
664
661
|
certificate: e.target.value
|
|
665
662
|
}),
|
|
666
|
-
disabled: !
|
|
667
|
-
placeholder:
|
|
663
|
+
disabled: !M && !!T,
|
|
664
|
+
placeholder: v("auth.sso.certificatePlaceholder", "-----BEGIN CERTIFICATE-----\nMIIDpDCCAoygAwIBAgIGAX...\n-----END CERTIFICATE-----"),
|
|
668
665
|
required: !0,
|
|
669
666
|
"aria-required": "true",
|
|
670
667
|
"aria-describedby": "sso-certificate-hint",
|
|
@@ -674,70 +671,70 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
674
671
|
/* @__PURE__ */ f("p", {
|
|
675
672
|
id: "sso-certificate-hint",
|
|
676
673
|
className: "mt-1 text-xs text-text-secondary",
|
|
677
|
-
children:
|
|
674
|
+
children: v("auth.sso.certificateHelper", "The public X.509 certificate from your IdP for signature verification")
|
|
678
675
|
})
|
|
679
676
|
] })
|
|
680
677
|
]
|
|
681
678
|
}),
|
|
682
|
-
(
|
|
679
|
+
(M || !T) && /* @__PURE__ */ p("div", {
|
|
683
680
|
className: "mt-6 flex items-center gap-3",
|
|
684
681
|
children: [/* @__PURE__ */ f(m, {
|
|
685
682
|
type: "submit",
|
|
686
|
-
disabled:
|
|
683
|
+
disabled: O,
|
|
687
684
|
variant: "default",
|
|
688
685
|
size: "lg",
|
|
689
686
|
className: "font-semibold",
|
|
690
|
-
children:
|
|
691
|
-
}),
|
|
687
|
+
children: O ? /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(n, { className: "size-4 animate-spin" }), v("auth.sso.saving", "Saving...")] }) : v("auth.sso.saveConfig", "Save Configuration")
|
|
688
|
+
}), M && /* @__PURE__ */ f("button", {
|
|
692
689
|
type: "button",
|
|
693
690
|
onClick: () => {
|
|
694
|
-
|
|
695
|
-
entityId:
|
|
696
|
-
ssoUrl:
|
|
697
|
-
sloUrl:
|
|
698
|
-
certificate:
|
|
699
|
-
enabled:
|
|
691
|
+
N(!1), T && Q({
|
|
692
|
+
entityId: T.entityId || "",
|
|
693
|
+
ssoUrl: T.ssoUrl || "",
|
|
694
|
+
sloUrl: T.sloUrl || "",
|
|
695
|
+
certificate: T.certificate || "",
|
|
696
|
+
enabled: T.enabled || !1
|
|
700
697
|
});
|
|
701
698
|
},
|
|
702
699
|
className: "px-6 py-3 rounded-xl border border-border-default text-text-primary font-medium hover:bg-bg-sunken transition-colors",
|
|
703
|
-
children:
|
|
700
|
+
children: v("auth.sso.cancel", "Cancel")
|
|
704
701
|
})]
|
|
705
702
|
})
|
|
706
703
|
]
|
|
707
704
|
}),
|
|
708
|
-
|
|
705
|
+
T && /* @__PURE__ */ p("div", {
|
|
709
706
|
className: "p-6 rounded-xl border border-status-error-border bg-status-error-bg-subtle",
|
|
710
707
|
children: [
|
|
711
708
|
/* @__PURE__ */ f("h3", {
|
|
712
709
|
className: "text-lg font-medium text-status-error-text mb-2",
|
|
713
|
-
children:
|
|
710
|
+
children: v("auth.sso.dangerZone", "Danger Zone")
|
|
714
711
|
}),
|
|
715
712
|
/* @__PURE__ */ f("p", {
|
|
716
713
|
className: "text-sm text-status-error-text mb-4",
|
|
717
|
-
children:
|
|
714
|
+
children: v("auth.sso.dangerZoneDesc", "Deleting the SSO configuration will prevent users from signing in with their enterprise credentials. This action cannot be undone.")
|
|
718
715
|
}),
|
|
719
716
|
/* @__PURE__ */ f("button", {
|
|
720
717
|
type: "button",
|
|
721
|
-
onClick: () =>
|
|
722
|
-
disabled:
|
|
718
|
+
onClick: () => P(!0),
|
|
719
|
+
disabled: k,
|
|
723
720
|
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",
|
|
724
|
-
children:
|
|
721
|
+
children: k ? /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(n, { className: "size-4 animate-spin" }), v("auth.sso.deleting", "Deleting...")] }) : v("auth.sso.deleteConfig", "Delete SSO Configuration")
|
|
725
722
|
})
|
|
726
723
|
]
|
|
727
724
|
})
|
|
728
725
|
]
|
|
729
726
|
}),
|
|
730
|
-
!
|
|
727
|
+
!D && j === "oidc" && /* @__PURE__ */ p("div", {
|
|
731
728
|
className: "space-y-6",
|
|
732
729
|
children: [
|
|
733
730
|
/* @__PURE__ */ p("div", {
|
|
734
731
|
className: "p-4 rounded-xl bg-accent-purple-subtle border border-accent-purple-subtle",
|
|
735
732
|
children: [/* @__PURE__ */ f("h3", {
|
|
736
733
|
className: "font-medium text-accent-purple mb-2",
|
|
737
|
-
children:
|
|
734
|
+
children: v("auth.sso.oidcProviderInfo", "OIDC Provider Information")
|
|
738
735
|
}), /* @__PURE__ */ f("p", {
|
|
739
736
|
className: "text-sm text-accent-purple",
|
|
740
|
-
children:
|
|
737
|
+
children: v("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.")
|
|
741
738
|
})]
|
|
742
739
|
}),
|
|
743
740
|
/* @__PURE__ */ p("div", {
|
|
@@ -745,57 +742,57 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
745
742
|
children: [
|
|
746
743
|
/* @__PURE__ */ f("h3", {
|
|
747
744
|
className: "text-lg font-medium text-text-primary mb-4",
|
|
748
|
-
children:
|
|
745
|
+
children: v("auth.sso.discoveryEndpoint", "Discovery Endpoint")
|
|
749
746
|
}),
|
|
750
747
|
/* @__PURE__ */ f("p", {
|
|
751
748
|
className: "text-sm text-text-secondary mb-4",
|
|
752
|
-
children:
|
|
749
|
+
children: v("auth.sso.discoveryEndpointDesc", "Applications can auto-configure by fetching the OpenID Connect Discovery document:")
|
|
753
750
|
}),
|
|
754
751
|
/* @__PURE__ */ p("div", {
|
|
755
752
|
className: "flex items-center gap-2",
|
|
756
753
|
children: [/* @__PURE__ */ f("code", {
|
|
757
754
|
className: "flex-1 px-3 py-2 rounded-lg bg-bg-sunken text-sm text-text-primary font-mono break-all",
|
|
758
|
-
children:
|
|
755
|
+
children: E?.issuer ? `${E.issuer}/.well-known/openid-configuration` : "Discovery endpoint unavailable until OIDC is configured"
|
|
759
756
|
}), /* @__PURE__ */ f("button", {
|
|
760
757
|
type: "button",
|
|
761
758
|
onClick: () => {
|
|
762
|
-
let e =
|
|
759
|
+
let e = E?.issuer ? `${E.issuer}/.well-known/openid-configuration` : "";
|
|
763
760
|
e && g(e);
|
|
764
761
|
},
|
|
765
|
-
disabled: !
|
|
762
|
+
disabled: !E?.issuer,
|
|
766
763
|
className: "px-3 py-2 rounded-lg border border-border-default text-text-secondary hover:bg-bg-sunken flex-shrink-0",
|
|
767
|
-
children:
|
|
764
|
+
children: v("auth.sso.copy", "Copy")
|
|
768
765
|
})]
|
|
769
766
|
})
|
|
770
767
|
]
|
|
771
768
|
}),
|
|
772
|
-
|
|
769
|
+
E && /* @__PURE__ */ p("div", {
|
|
773
770
|
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
774
771
|
children: [/* @__PURE__ */ f("h3", {
|
|
775
772
|
className: "text-lg font-medium text-text-primary mb-4",
|
|
776
|
-
children:
|
|
773
|
+
children: v("auth.sso.oidcEndpoints", "OIDC Endpoints")
|
|
777
774
|
}), /* @__PURE__ */ f("div", {
|
|
778
775
|
className: "space-y-4",
|
|
779
776
|
children: [
|
|
780
777
|
{
|
|
781
|
-
label:
|
|
782
|
-
value:
|
|
778
|
+
label: v("auth.sso.issuer", "Issuer"),
|
|
779
|
+
value: E.issuer
|
|
783
780
|
},
|
|
784
781
|
{
|
|
785
|
-
label:
|
|
786
|
-
value:
|
|
782
|
+
label: v("auth.sso.authorizationEndpoint", "Authorization Endpoint"),
|
|
783
|
+
value: E.authorizationEndpoint
|
|
787
784
|
},
|
|
788
785
|
{
|
|
789
|
-
label:
|
|
790
|
-
value:
|
|
786
|
+
label: v("auth.sso.tokenEndpoint", "Token Endpoint"),
|
|
787
|
+
value: E.tokenEndpoint
|
|
791
788
|
},
|
|
792
789
|
{
|
|
793
|
-
label:
|
|
794
|
-
value:
|
|
790
|
+
label: v("auth.sso.userinfoEndpoint", "UserInfo Endpoint"),
|
|
791
|
+
value: E.userinfoEndpoint
|
|
795
792
|
},
|
|
796
793
|
{
|
|
797
|
-
label:
|
|
798
|
-
value:
|
|
794
|
+
label: v("auth.sso.jwksUri", "JWKS URI"),
|
|
795
|
+
value: E.jwksUri
|
|
799
796
|
}
|
|
800
797
|
].map((e) => /* @__PURE__ */ p("div", {
|
|
801
798
|
className: "flex items-start gap-4",
|
|
@@ -813,32 +810,32 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
813
810
|
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
814
811
|
children: [/* @__PURE__ */ f("h3", {
|
|
815
812
|
className: "text-lg font-medium text-text-primary mb-4",
|
|
816
|
-
children:
|
|
813
|
+
children: v("auth.sso.supportedFeatures", "Supported Features")
|
|
817
814
|
}), /* @__PURE__ */ f("div", {
|
|
818
815
|
className: "grid grid-cols-2 gap-4",
|
|
819
816
|
children: [
|
|
820
817
|
{
|
|
821
|
-
name:
|
|
818
|
+
name: v("auth.sso.featAuthCodePkce", "Authorization Code + PKCE"),
|
|
822
819
|
status: !0
|
|
823
820
|
},
|
|
824
821
|
{
|
|
825
|
-
name:
|
|
822
|
+
name: v("auth.sso.featClientCreds", "Client Credentials"),
|
|
826
823
|
status: !0
|
|
827
824
|
},
|
|
828
825
|
{
|
|
829
|
-
name:
|
|
826
|
+
name: v("auth.sso.featDeviceAuth", "Device Authorization"),
|
|
830
827
|
status: !0
|
|
831
828
|
},
|
|
832
829
|
{
|
|
833
|
-
name:
|
|
830
|
+
name: v("auth.sso.featRefreshTokens", "Refresh Tokens"),
|
|
834
831
|
status: !0
|
|
835
832
|
},
|
|
836
833
|
{
|
|
837
|
-
name:
|
|
834
|
+
name: v("auth.sso.featTokenIntrospection", "Token Introspection"),
|
|
838
835
|
status: !0
|
|
839
836
|
},
|
|
840
837
|
{
|
|
841
|
-
name:
|
|
838
|
+
name: v("auth.sso.featTokenRevocation", "Token Revocation"),
|
|
842
839
|
status: !0
|
|
843
840
|
}
|
|
844
841
|
].map((e) => /* @__PURE__ */ p("div", {
|
|
@@ -852,33 +849,33 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
852
849
|
})
|
|
853
850
|
]
|
|
854
851
|
}),
|
|
855
|
-
!
|
|
852
|
+
!D && j === "clients" && /* @__PURE__ */ p("div", {
|
|
856
853
|
className: "space-y-6",
|
|
857
854
|
children: [
|
|
858
855
|
/* @__PURE__ */ p("div", {
|
|
859
856
|
className: "p-4 rounded-xl bg-status-warning-bg-subtle border border-status-warning-border",
|
|
860
857
|
children: [/* @__PURE__ */ f("h3", {
|
|
861
858
|
className: "font-medium text-status-warning-text mb-2",
|
|
862
|
-
children:
|
|
859
|
+
children: v("auth.sso.clientManagement", "OIDC Client Management")
|
|
863
860
|
}), /* @__PURE__ */ f("p", {
|
|
864
861
|
className: "text-sm text-status-warning-text",
|
|
865
|
-
children:
|
|
862
|
+
children: v("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.")
|
|
866
863
|
})]
|
|
867
864
|
}),
|
|
868
|
-
|
|
865
|
+
Y && /* @__PURE__ */ p("div", {
|
|
869
866
|
className: "p-6 rounded-xl border-2 border-status-success-border bg-status-success-bg-subtle",
|
|
870
867
|
children: [/* @__PURE__ */ p("div", {
|
|
871
868
|
className: "flex items-start justify-between mb-4",
|
|
872
869
|
children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h3", {
|
|
873
870
|
className: "text-lg font-medium text-status-success-text",
|
|
874
|
-
children:
|
|
871
|
+
children: v("auth.sso.clientCreatedTitle", "Client Created Successfully!")
|
|
875
872
|
}), /* @__PURE__ */ f("p", {
|
|
876
873
|
className: "text-sm text-status-success-text mt-1",
|
|
877
|
-
children:
|
|
874
|
+
children: v("auth.sso.clientCreatedDesc", "Save these credentials securely. The client secret will not be shown again.")
|
|
878
875
|
})] }), /* @__PURE__ */ f("button", {
|
|
879
876
|
type: "button",
|
|
880
|
-
onClick: () =>
|
|
881
|
-
"aria-label":
|
|
877
|
+
onClick: () => X(null),
|
|
878
|
+
"aria-label": v("auth.sso.dismissClientCredentials", "Dismiss"),
|
|
882
879
|
className: "text-status-success-text hover:text-status-success-text",
|
|
883
880
|
children: /* @__PURE__ */ f("svg", {
|
|
884
881
|
className: "size-5",
|
|
@@ -898,40 +895,40 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
898
895
|
children: [
|
|
899
896
|
/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
|
|
900
897
|
className: "block text-xs font-medium text-status-success-text mb-1",
|
|
901
|
-
children:
|
|
898
|
+
children: v("auth.sso.clientId", "Client ID")
|
|
902
899
|
}), /* @__PURE__ */ p("div", {
|
|
903
900
|
className: "flex gap-2",
|
|
904
901
|
children: [/* @__PURE__ */ f("code", {
|
|
905
902
|
className: "flex-1 px-3 py-2 rounded-lg bg-bg-surface text-sm font-mono border border-status-success-border",
|
|
906
|
-
children:
|
|
903
|
+
children: Y.client_id
|
|
907
904
|
}), /* @__PURE__ */ f("button", {
|
|
908
905
|
type: "button",
|
|
909
|
-
onClick: () => void g(
|
|
906
|
+
onClick: () => void g(Y.client_id),
|
|
910
907
|
className: "px-3 py-2 rounded-lg bg-status-success-bg text-white text-sm hover:bg-status-success-bg",
|
|
911
|
-
children:
|
|
908
|
+
children: v("auth.sso.copy", "Copy")
|
|
912
909
|
})]
|
|
913
910
|
})] }),
|
|
914
|
-
|
|
911
|
+
Y.client_secret && /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
|
|
915
912
|
className: "block text-xs font-medium text-status-success-text mb-1",
|
|
916
|
-
children:
|
|
913
|
+
children: v("auth.sso.clientSecret", "Client Secret (save now!)")
|
|
917
914
|
}), /* @__PURE__ */ p("div", {
|
|
918
915
|
className: "flex gap-2",
|
|
919
916
|
children: [/* @__PURE__ */ f("code", {
|
|
920
917
|
className: "flex-1 px-3 py-2 rounded-lg bg-bg-surface text-sm font-mono border border-status-success-border",
|
|
921
|
-
children:
|
|
918
|
+
children: Y.client_secret
|
|
922
919
|
}), /* @__PURE__ */ f("button", {
|
|
923
920
|
type: "button",
|
|
924
|
-
onClick: () => void g(
|
|
921
|
+
onClick: () => void g(Y.client_secret || ""),
|
|
925
922
|
className: "px-3 py-2 rounded-lg bg-status-success-bg text-white text-sm hover:bg-status-success-bg",
|
|
926
|
-
children:
|
|
923
|
+
children: v("auth.sso.copy", "Copy")
|
|
927
924
|
})]
|
|
928
925
|
})] }),
|
|
929
926
|
/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
|
|
930
927
|
className: "block text-xs font-medium text-status-success-text mb-1",
|
|
931
|
-
children:
|
|
928
|
+
children: v("auth.sso.redirectUris", "Redirect URIs")
|
|
932
929
|
}), /* @__PURE__ */ f("code", {
|
|
933
930
|
className: "block px-3 py-2 rounded-lg bg-bg-surface text-sm font-mono border border-status-success-border",
|
|
934
|
-
children:
|
|
931
|
+
children: Y.redirect_uris.join(", ")
|
|
935
932
|
})] })
|
|
936
933
|
]
|
|
937
934
|
})]
|
|
@@ -942,10 +939,10 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
942
939
|
className: "flex items-center justify-between mb-6",
|
|
943
940
|
children: [/* @__PURE__ */ f("h3", {
|
|
944
941
|
className: "text-lg font-medium text-text-primary",
|
|
945
|
-
children:
|
|
946
|
-
}), !
|
|
942
|
+
children: v("auth.sso.registerClient", "Register New Client")
|
|
943
|
+
}), !U && /* @__PURE__ */ p("button", {
|
|
947
944
|
type: "button",
|
|
948
|
-
onClick: () =>
|
|
945
|
+
onClick: () => W(!0),
|
|
949
946
|
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",
|
|
950
947
|
children: [/* @__PURE__ */ f("svg", {
|
|
951
948
|
className: "size-4",
|
|
@@ -958,16 +955,16 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
958
955
|
strokeWidth: 2,
|
|
959
956
|
d: "M12 4v16m8-8H4"
|
|
960
957
|
})
|
|
961
|
-
}),
|
|
958
|
+
}), v("auth.sso.newClient", "New Client")]
|
|
962
959
|
})]
|
|
963
|
-
}),
|
|
960
|
+
}), U ? /* @__PURE__ */ p("div", {
|
|
964
961
|
className: "space-y-5",
|
|
965
962
|
children: [
|
|
966
963
|
/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ p("label", {
|
|
967
964
|
htmlFor: "oidc-client-name",
|
|
968
965
|
className: "block text-sm font-medium text-text-primary mb-2",
|
|
969
966
|
children: [
|
|
970
|
-
|
|
967
|
+
v("auth.sso.clientName", "Client Name"),
|
|
971
968
|
" ",
|
|
972
969
|
/* @__PURE__ */ f("span", {
|
|
973
970
|
className: "text-status-error-text",
|
|
@@ -978,13 +975,13 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
978
975
|
}), /* @__PURE__ */ f("input", {
|
|
979
976
|
id: "oidc-client-name",
|
|
980
977
|
type: "text",
|
|
981
|
-
"aria-label":
|
|
982
|
-
value:
|
|
983
|
-
onChange: (e) =>
|
|
984
|
-
...
|
|
978
|
+
"aria-label": v("auth.sso.oidcClientName", "Client Name"),
|
|
979
|
+
value: G.client_name,
|
|
980
|
+
onChange: (e) => K({
|
|
981
|
+
...G,
|
|
985
982
|
client_name: e.target.value
|
|
986
983
|
}),
|
|
987
|
-
placeholder:
|
|
984
|
+
placeholder: v("auth.sso.clientNamePlaceholder", "My Application"),
|
|
988
985
|
"aria-required": "true",
|
|
989
986
|
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"
|
|
990
987
|
})] }),
|
|
@@ -993,7 +990,7 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
993
990
|
htmlFor: "oidc-redirect-uris",
|
|
994
991
|
className: "block text-sm font-medium text-text-primary mb-2",
|
|
995
992
|
children: [
|
|
996
|
-
|
|
993
|
+
v("auth.sso.redirectUris", "Redirect URIs"),
|
|
997
994
|
" ",
|
|
998
995
|
/* @__PURE__ */ f("span", {
|
|
999
996
|
className: "text-status-error-text",
|
|
@@ -1005,13 +1002,13 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1005
1002
|
/* @__PURE__ */ f("input", {
|
|
1006
1003
|
id: "oidc-redirect-uris",
|
|
1007
1004
|
type: "text",
|
|
1008
|
-
"aria-label":
|
|
1009
|
-
value:
|
|
1010
|
-
onChange: (e) =>
|
|
1011
|
-
...
|
|
1005
|
+
"aria-label": v("auth.sso.oidcRedirectUris", "Redirect URIs"),
|
|
1006
|
+
value: G.redirect_uris,
|
|
1007
|
+
onChange: (e) => K({
|
|
1008
|
+
...G,
|
|
1012
1009
|
redirect_uris: e.target.value
|
|
1013
1010
|
}),
|
|
1014
|
-
placeholder:
|
|
1011
|
+
placeholder: v("auth.sso.redirectUrisPlaceholder", "http://localhost:3000/callback, https://app.example.com/callback"),
|
|
1015
1012
|
"aria-required": "true",
|
|
1016
1013
|
"aria-describedby": "oidc-redirect-uris-hint",
|
|
1017
1014
|
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"
|
|
@@ -1019,12 +1016,12 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1019
1016
|
/* @__PURE__ */ f("p", {
|
|
1020
1017
|
id: "oidc-redirect-uris-hint",
|
|
1021
1018
|
className: "mt-1 text-xs text-text-secondary",
|
|
1022
|
-
children:
|
|
1019
|
+
children: v("auth.sso.redirectUrisHelper", "Separate multiple URIs with commas")
|
|
1023
1020
|
})
|
|
1024
1021
|
] }),
|
|
1025
1022
|
/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
|
|
1026
1023
|
className: "block text-sm font-medium text-text-primary mb-2",
|
|
1027
|
-
children:
|
|
1024
|
+
children: v("auth.sso.grantTypes", "Grant Types")
|
|
1028
1025
|
}), /* @__PURE__ */ f("div", {
|
|
1029
1026
|
className: "flex flex-wrap gap-3",
|
|
1030
1027
|
children: [
|
|
@@ -1036,14 +1033,14 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1036
1033
|
children: [/* @__PURE__ */ f("input", {
|
|
1037
1034
|
type: "checkbox",
|
|
1038
1035
|
"aria-label": e,
|
|
1039
|
-
checked:
|
|
1036
|
+
checked: G.grant_types.includes(e),
|
|
1040
1037
|
onChange: (t) => {
|
|
1041
|
-
t.target.checked ?
|
|
1042
|
-
...
|
|
1043
|
-
grant_types: [...
|
|
1044
|
-
}) :
|
|
1045
|
-
...
|
|
1046
|
-
grant_types:
|
|
1038
|
+
t.target.checked ? K({
|
|
1039
|
+
...G,
|
|
1040
|
+
grant_types: [...G.grant_types, e]
|
|
1041
|
+
}) : K({
|
|
1042
|
+
...G,
|
|
1043
|
+
grant_types: G.grant_types.filter((t) => t !== e)
|
|
1047
1044
|
});
|
|
1048
1045
|
},
|
|
1049
1046
|
className: "size-4 rounded border-border-default text-text-link focus:ring-action-primary-bg"
|
|
@@ -1056,27 +1053,27 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1056
1053
|
/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
|
|
1057
1054
|
htmlFor: "oidc-token-auth-method",
|
|
1058
1055
|
className: "block text-sm font-medium text-text-primary mb-2",
|
|
1059
|
-
children:
|
|
1056
|
+
children: v("auth.sso.tokenEndpointAuth", "Token Endpoint Auth Method")
|
|
1060
1057
|
}), /* @__PURE__ */ p("select", {
|
|
1061
1058
|
id: "oidc-token-auth-method",
|
|
1062
|
-
value:
|
|
1063
|
-
onChange: (e) =>
|
|
1064
|
-
...
|
|
1059
|
+
value: G.token_endpoint_auth_method,
|
|
1060
|
+
onChange: (e) => K({
|
|
1061
|
+
...G,
|
|
1065
1062
|
token_endpoint_auth_method: e.target.value
|
|
1066
1063
|
}),
|
|
1067
1064
|
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",
|
|
1068
1065
|
children: [
|
|
1069
1066
|
/* @__PURE__ */ f("option", {
|
|
1070
1067
|
value: "none",
|
|
1071
|
-
children:
|
|
1068
|
+
children: v("auth.sso.tokenAuthNone", "None (Public Client - SPAs, Mobile Apps)")
|
|
1072
1069
|
}),
|
|
1073
1070
|
/* @__PURE__ */ f("option", {
|
|
1074
1071
|
value: "client_secret_basic",
|
|
1075
|
-
children:
|
|
1072
|
+
children: v("auth.sso.tokenAuthBasic", "Client Secret Basic")
|
|
1076
1073
|
}),
|
|
1077
1074
|
/* @__PURE__ */ f("option", {
|
|
1078
1075
|
value: "client_secret_post",
|
|
1079
|
-
children:
|
|
1076
|
+
children: v("auth.sso.tokenAuthPost", "Client Secret Post")
|
|
1080
1077
|
})
|
|
1081
1078
|
]
|
|
1082
1079
|
})] }),
|
|
@@ -1084,16 +1081,16 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1084
1081
|
className: "flex items-center gap-3 pt-2",
|
|
1085
1082
|
children: [/* @__PURE__ */ f(m, {
|
|
1086
1083
|
type: "button",
|
|
1087
|
-
onClick:
|
|
1088
|
-
disabled:
|
|
1084
|
+
onClick: ge,
|
|
1085
|
+
disabled: q,
|
|
1089
1086
|
variant: "default",
|
|
1090
1087
|
size: "lg",
|
|
1091
1088
|
className: "font-semibold",
|
|
1092
|
-
children:
|
|
1089
|
+
children: q ? /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(n, { className: "size-4 animate-spin" }), v("auth.sso.registering", "Registering...")] }) : v("auth.sso.registerClientButton", "Register Client")
|
|
1093
1090
|
}), /* @__PURE__ */ f("button", {
|
|
1094
1091
|
type: "button",
|
|
1095
1092
|
onClick: () => {
|
|
1096
|
-
|
|
1093
|
+
W(!1), K({
|
|
1097
1094
|
client_name: "",
|
|
1098
1095
|
redirect_uris: "",
|
|
1099
1096
|
grant_types: ["authorization_code", "refresh_token"],
|
|
@@ -1101,21 +1098,21 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1101
1098
|
});
|
|
1102
1099
|
},
|
|
1103
1100
|
className: "px-6 py-3 rounded-xl border border-border-default text-text-primary font-medium hover:bg-bg-sunken transition-colors",
|
|
1104
|
-
children:
|
|
1101
|
+
children: v("auth.sso.cancel", "Cancel")
|
|
1105
1102
|
})]
|
|
1106
1103
|
})
|
|
1107
1104
|
]
|
|
1108
1105
|
}) : /* @__PURE__ */ f(h, {
|
|
1109
1106
|
illustration: "empty-generic",
|
|
1110
|
-
title:
|
|
1111
|
-
description:
|
|
1107
|
+
title: v("auth.sso.emptyClientsTitle", "No client apps yet"),
|
|
1108
|
+
description: v("auth.sso.emptyClients", "Click \"New Client\" to register an OAuth 2.0 / OIDC client application.")
|
|
1112
1109
|
})]
|
|
1113
1110
|
}),
|
|
1114
1111
|
/* @__PURE__ */ p("div", {
|
|
1115
1112
|
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
1116
1113
|
children: [/* @__PURE__ */ f("h3", {
|
|
1117
1114
|
className: "text-lg font-medium text-text-primary mb-4",
|
|
1118
|
-
children:
|
|
1115
|
+
children: v("auth.sso.preconfiguredClients", "Pre-configured Clients")
|
|
1119
1116
|
}), /* @__PURE__ */ f("div", {
|
|
1120
1117
|
className: "space-y-4",
|
|
1121
1118
|
children: /* @__PURE__ */ p("div", {
|
|
@@ -1128,12 +1125,12 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1128
1125
|
children: "tenant-frontend"
|
|
1129
1126
|
}), /* @__PURE__ */ f("span", {
|
|
1130
1127
|
className: "px-2 py-1 rounded-full text-xs bg-status-success-bg-subtle text-status-success-text",
|
|
1131
|
-
children:
|
|
1128
|
+
children: v("auth.sso.active", "Active")
|
|
1132
1129
|
})]
|
|
1133
1130
|
}),
|
|
1134
1131
|
/* @__PURE__ */ f("p", {
|
|
1135
1132
|
className: "text-sm text-text-secondary",
|
|
1136
|
-
children:
|
|
1133
|
+
children: v("auth.sso.preconfigClientDesc", "Default frontend client for tenant authentication")
|
|
1137
1134
|
}),
|
|
1138
1135
|
/* @__PURE__ */ p("div", {
|
|
1139
1136
|
className: "mt-2 flex flex-wrap gap-2",
|
|
@@ -1148,7 +1145,7 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1148
1145
|
}),
|
|
1149
1146
|
/* @__PURE__ */ f("span", {
|
|
1150
1147
|
className: "px-2 py-0.5 rounded bg-bg-sunken text-xs text-text-primary",
|
|
1151
|
-
children:
|
|
1148
|
+
children: v("auth.sso.pkceRequired", "PKCE required")
|
|
1152
1149
|
})
|
|
1153
1150
|
]
|
|
1154
1151
|
})
|
|
@@ -1158,17 +1155,17 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1158
1155
|
})
|
|
1159
1156
|
]
|
|
1160
1157
|
}),
|
|
1161
|
-
!
|
|
1158
|
+
!D && j === "test" && /* @__PURE__ */ p("div", {
|
|
1162
1159
|
className: "space-y-6",
|
|
1163
1160
|
children: [
|
|
1164
1161
|
/* @__PURE__ */ p("div", {
|
|
1165
1162
|
className: "p-4 rounded-xl bg-status-warning-bg-subtle border border-status-warning-border",
|
|
1166
1163
|
children: [/* @__PURE__ */ f("h3", {
|
|
1167
1164
|
className: "font-medium text-status-warning-text mb-2",
|
|
1168
|
-
children:
|
|
1165
|
+
children: v("auth.sso.testLoginTitle", "Test SSO Login")
|
|
1169
1166
|
}), /* @__PURE__ */ f("p", {
|
|
1170
1167
|
className: "text-sm text-status-warning-text",
|
|
1171
|
-
children:
|
|
1168
|
+
children: v("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.")
|
|
1172
1169
|
})]
|
|
1173
1170
|
}),
|
|
1174
1171
|
/* @__PURE__ */ p("div", {
|
|
@@ -1176,13 +1173,13 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1176
1173
|
children: [
|
|
1177
1174
|
/* @__PURE__ */ f("h3", {
|
|
1178
1175
|
className: "text-lg font-medium text-text-primary mb-4",
|
|
1179
|
-
children:
|
|
1176
|
+
children: v("auth.sso.spInitiatedTest", "SP-Initiated Login Test")
|
|
1180
1177
|
}),
|
|
1181
1178
|
/* @__PURE__ */ f("p", {
|
|
1182
1179
|
className: "text-sm text-text-secondary mb-4",
|
|
1183
|
-
children:
|
|
1180
|
+
children: v("auth.sso.spInitiatedTestDesc", "Click the button below to initiate an SSO login flow. You will be redirected to your IdP to authenticate.")
|
|
1184
1181
|
}),
|
|
1185
|
-
|
|
1182
|
+
T && T.enabled ? /* @__PURE__ */ p("a", {
|
|
1186
1183
|
href: `${window.location.origin}/auth/sso/login`,
|
|
1187
1184
|
className: "inline-flex items-center gap-2 px-6 py-3 rounded-xl bg-status-success-bg text-white font-medium shadow-sm hover:opacity-90 transition-all duration-200",
|
|
1188
1185
|
children: [/* @__PURE__ */ f("svg", {
|
|
@@ -1196,10 +1193,10 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1196
1193
|
strokeWidth: 2,
|
|
1197
1194
|
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"
|
|
1198
1195
|
})
|
|
1199
|
-
}),
|
|
1196
|
+
}), v("auth.sso.testSsoLoginButton", "Test SSO Login")]
|
|
1200
1197
|
}) : /* @__PURE__ */ f("div", {
|
|
1201
1198
|
className: "p-4 rounded-xl bg-bg-sunken/50 text-text-secondary text-sm",
|
|
1202
|
-
children:
|
|
1199
|
+
children: T ? v("auth.sso.disabledTest", "SSO is disabled. Enable it to test the login flow.") : v("auth.sso.notConfigured", "SSO is not configured. Please configure your IdP settings first.")
|
|
1203
1200
|
})
|
|
1204
1201
|
]
|
|
1205
1202
|
}),
|
|
@@ -1207,38 +1204,38 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1207
1204
|
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface",
|
|
1208
1205
|
children: [/* @__PURE__ */ f("h3", {
|
|
1209
1206
|
className: "text-lg font-medium text-text-primary mb-4",
|
|
1210
|
-
children:
|
|
1207
|
+
children: v("auth.sso.testResults", "Test Results")
|
|
1211
1208
|
}), /* @__PURE__ */ f("p", {
|
|
1212
1209
|
className: "text-sm text-text-secondary",
|
|
1213
|
-
children:
|
|
1210
|
+
children: v("auth.sso.testResultsDesc", "After testing, results will appear here. Check the browser console for detailed logs.")
|
|
1214
1211
|
})]
|
|
1215
1212
|
})
|
|
1216
1213
|
]
|
|
1217
1214
|
}),
|
|
1218
|
-
/* @__PURE__ */ f(
|
|
1215
|
+
/* @__PURE__ */ f(ae, {
|
|
1219
1216
|
className: "mt-8",
|
|
1220
1217
|
storageKey: "auth-sso-config",
|
|
1221
1218
|
steps: [
|
|
1222
1219
|
{
|
|
1223
1220
|
id: "save-config",
|
|
1224
|
-
label:
|
|
1225
|
-
description:
|
|
1226
|
-
done: !!
|
|
1221
|
+
label: v("auth.sso.nextSave", "Save your IdP configuration"),
|
|
1222
|
+
description: v("auth.sso.nextSaveDesc", "Enter your SAML or OIDC details, then save so the connection exists."),
|
|
1223
|
+
done: !!T
|
|
1227
1224
|
},
|
|
1228
1225
|
{
|
|
1229
1226
|
id: "enable-sso",
|
|
1230
|
-
label:
|
|
1231
|
-
description:
|
|
1232
|
-
done: !!(
|
|
1227
|
+
label: v("auth.sso.nextEnable", "Enable SSO for sign-in"),
|
|
1228
|
+
description: v("auth.sso.nextEnableDesc", "Flip the connection on once you've confirmed the settings."),
|
|
1229
|
+
done: !!(T && Z.enabled),
|
|
1233
1230
|
onClick: () => {
|
|
1234
|
-
|
|
1231
|
+
T && !Z.enabled && $();
|
|
1235
1232
|
}
|
|
1236
1233
|
},
|
|
1237
1234
|
{
|
|
1238
1235
|
id: "test-login",
|
|
1239
|
-
label:
|
|
1240
|
-
description:
|
|
1241
|
-
href:
|
|
1236
|
+
label: v("auth.sso.nextTest", "Test the login flow"),
|
|
1237
|
+
description: v("auth.sso.nextTestDesc", "Run a test sign-in before rolling SSO out to your whole team."),
|
|
1238
|
+
href: T && T.enabled ? `${window.location.origin}/auth/sso/login` : void 0
|
|
1242
1239
|
}
|
|
1243
1240
|
]
|
|
1244
1241
|
})
|
|
@@ -1247,19 +1244,19 @@ function v({ bypassEnterprisePlanGate: a = !1 }) {
|
|
|
1247
1244
|
className: "max-w-5xl mx-auto p-6",
|
|
1248
1245
|
children: /* @__PURE__ */ f(h, {
|
|
1249
1246
|
illustration: "onboarding",
|
|
1250
|
-
title:
|
|
1247
|
+
title: v("auth.sso.enterprisePlanRequired", "Enterprise Plan Required"),
|
|
1251
1248
|
description: /* @__PURE__ */ p(d, { children: [
|
|
1252
|
-
|
|
1249
|
+
v("auth.sso.enterprisePlanRequiredDesc", "Single Sign-On (SAML / OIDC) configuration is available on the Enterprise plan."),
|
|
1253
1250
|
" ",
|
|
1254
|
-
|
|
1251
|
+
v("auth.sso.contactSales", "Contact sales to upgrade your workspace to the Enterprise plan.")
|
|
1255
1252
|
] })
|
|
1256
1253
|
})
|
|
1257
1254
|
}) : /* @__PURE__ */ f("div", {
|
|
1258
1255
|
className: "max-w-5xl mx-auto p-6",
|
|
1259
1256
|
children: /* @__PURE__ */ f(h, {
|
|
1260
1257
|
illustration: "empty-generic",
|
|
1261
|
-
title:
|
|
1262
|
-
description:
|
|
1258
|
+
title: v("auth.sso.adminRequired", "Admin Access Required"),
|
|
1259
|
+
description: v("auth.sso.adminRequiredDesc", "You need administrator privileges to configure SSO settings.")
|
|
1263
1260
|
})
|
|
1264
1261
|
});
|
|
1265
1262
|
}
|