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