@arcblock/did-connect-service 4.1.11 → 4.1.13
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/_generated/asset-bytes.js +1 -1
- package/dist/_generated/asset-manifest.js +3 -3
- package/dist/_generated/login-bundle-string.d.ts +1 -1
- package/dist/_generated/login-bundle-string.d.ts.map +1 -1
- package/dist/_generated/login-bundle-string.js +1 -1
- package/dist/_generated/login-bundle-string.js.map +1 -1
- package/dist/access/change-role.d.ts +48 -0
- package/dist/access/change-role.d.ts.map +1 -0
- package/dist/access/change-role.js +52 -0
- package/dist/access/change-role.js.map +1 -0
- package/dist/assets/admin-core.a63bbc69.js +1464 -0
- package/dist/assets/admin-extra.143b5774.js +2543 -0
- package/dist/assets/admin-extra.5b309e5e.js +2547 -0
- package/dist/assets/login.4404e695.js +720 -0
- package/dist/assets/login.76c483c2.js +720 -0
- package/dist/assets/login.bb9f8b03.js +720 -0
- package/dist/assets/login.fa25f37a.js +720 -0
- package/dist/handler-errors.d.ts +118 -0
- package/dist/handler-errors.d.ts.map +1 -0
- package/dist/handler-errors.js +38 -0
- package/dist/handler-errors.js.map +1 -0
- package/dist/handlers/access-key-connect-handler.d.ts.map +1 -1
- package/dist/handlers/access-key-connect-handler.js +2 -1
- package/dist/handlers/access-key-connect-handler.js.map +1 -1
- package/dist/handlers/admin-instance-handler.d.ts.map +1 -1
- package/dist/handlers/admin-instance-handler.js +2 -1
- package/dist/handlers/admin-instance-handler.js.map +1 -1
- package/dist/handlers/auth-handler.d.ts.map +1 -1
- package/dist/handlers/auth-handler.js +32 -9
- package/dist/handlers/auth-handler.js.map +1 -1
- package/dist/handlers/branding-handler.d.ts.map +1 -1
- package/dist/handlers/branding-handler.js +12 -9
- package/dist/handlers/branding-handler.js.map +1 -1
- package/dist/handlers/did-connect-handler.d.ts.map +1 -1
- package/dist/handlers/did-connect-handler.js +6 -5
- package/dist/handlers/did-connect-handler.js.map +1 -1
- package/dist/handlers/email-login-handler.d.ts +1 -1
- package/dist/handlers/email-login-handler.d.ts.map +1 -1
- package/dist/handlers/email-login-handler.js +63 -12
- package/dist/handlers/email-login-handler.js.map +1 -1
- package/dist/handlers/federation-admin-handler.d.ts.map +1 -1
- package/dist/handlers/federation-admin-handler.js +48 -45
- package/dist/handlers/federation-admin-handler.js.map +1 -1
- package/dist/handlers/oauth-handler.d.ts.map +1 -1
- package/dist/handlers/oauth-handler.js +23 -12
- package/dist/handlers/oauth-handler.js.map +1 -1
- package/dist/handlers/passkey-handler.d.ts.map +1 -1
- package/dist/handlers/passkey-handler.js +5 -4
- package/dist/handlers/passkey-handler.js.map +1 -1
- package/dist/handlers/team-handler.d.ts.map +1 -1
- package/dist/handlers/team-handler.js +19 -19
- package/dist/handlers/team-handler.js.map +1 -1
- package/dist/http/security-headers.d.ts +38 -0
- package/dist/http/security-headers.d.ts.map +1 -0
- package/dist/http/security-headers.js +67 -0
- package/dist/http/security-headers.js.map +1 -0
- package/dist/identity/refresh-tokens.d.ts +21 -0
- package/dist/identity/refresh-tokens.d.ts.map +1 -0
- package/dist/identity/refresh-tokens.js +45 -0
- package/dist/identity/refresh-tokens.js.map +1 -0
- package/dist/identity/session-context.d.ts +12 -0
- package/dist/identity/session-context.d.ts.map +1 -1
- package/dist/identity/session-context.js +12 -0
- package/dist/identity/session-context.js.map +1 -1
- package/dist/identity/session-tokens.d.ts +15 -0
- package/dist/identity/session-tokens.d.ts.map +1 -0
- package/dist/identity/session-tokens.js +15 -0
- package/dist/identity/session-tokens.js.map +1 -0
- package/dist/locale.d.ts +1 -1
- package/dist/locale.d.ts.map +1 -1
- package/dist/og/ssrf-guard.d.ts.map +1 -1
- package/dist/og/ssrf-guard.js +21 -3
- package/dist/og/ssrf-guard.js.map +1 -1
- package/dist/og/templates.d.ts.map +1 -1
- package/dist/og/templates.js +33 -4
- package/dist/og/templates.js.map +1 -1
- package/dist/pages/admin/i18n.d.ts.map +1 -1
- package/dist/pages/admin/i18n.js +33 -9
- package/dist/pages/admin/i18n.js.map +1 -1
- package/dist/pages/admin/scripts/api-client.d.ts +1 -1
- package/dist/pages/admin/scripts/api-client.d.ts.map +1 -1
- package/dist/pages/admin/scripts/api-client.js +4 -4
- package/dist/pages/admin/scripts/utils.d.ts +1 -1
- package/dist/pages/admin/scripts/utils.d.ts.map +1 -1
- package/dist/pages/admin/scripts/utils.js +7 -8
- package/dist/pages/admin/scripts/utils.js.map +1 -1
- package/dist/pages/admin/tab-access-keys.d.ts +1 -1
- package/dist/pages/admin/tab-access-keys.d.ts.map +1 -1
- package/dist/pages/admin/tab-access-keys.js +4 -4
- package/dist/pages/admin/tab-invitations.d.ts +1 -1
- package/dist/pages/admin/tab-invitations.d.ts.map +1 -1
- package/dist/pages/admin/tab-invitations.js +2 -2
- package/dist/pages/admin/tab-members.d.ts +1 -1
- package/dist/pages/admin/tab-members.d.ts.map +1 -1
- package/dist/pages/admin/tab-members.js +7 -3
- package/dist/pages/admin/tab-members.js.map +1 -1
- package/dist/pages/admin/tab-profile-accounts.js +1 -1
- package/dist/pages/admin-instances-page.d.ts +1 -1
- package/dist/pages/admin-instances-page.d.ts.map +1 -1
- package/dist/pages/admin-instances-page.js +195 -65
- package/dist/pages/admin-instances-page.js.map +1 -1
- package/dist/pages/gen-access-key-page.d.ts +1 -1
- package/dist/pages/gen-access-key-page.d.ts.map +1 -1
- package/dist/pages/gen-access-key-page.js +163 -35
- package/dist/pages/gen-access-key-page.js.map +1 -1
- package/dist/pages/homepage.d.ts.map +1 -1
- package/dist/pages/homepage.js +0 -4
- package/dist/pages/homepage.js.map +1 -1
- package/dist/pages/invite-page.d.ts +1 -1
- package/dist/pages/invite-page.d.ts.map +1 -1
- package/dist/pages/invite-page.js +91 -21
- package/dist/pages/invite-page.js.map +1 -1
- package/dist/pages/oauth-callback-page.d.ts.map +1 -1
- package/dist/pages/oauth-callback-page.js +7 -3
- package/dist/pages/oauth-callback-page.js.map +1 -1
- package/dist/store/d1-store.d.ts +55 -1
- package/dist/store/d1-store.d.ts.map +1 -1
- package/dist/store/d1-store.js +162 -9
- package/dist/store/d1-store.js.map +1 -1
- package/migrations/0011_refresh_tokens.sql +23 -0
- package/package.json +5 -5
|
@@ -9,6 +9,52 @@
|
|
|
9
9
|
* Uses same LoginPage bundle and design system as login-page.ts.
|
|
10
10
|
*/
|
|
11
11
|
import { assetUrl } from "../asset-registry.js";
|
|
12
|
+
/**
|
|
13
|
+
* Authorize-page copy, localized. `en` is the default fallback for any unknown
|
|
14
|
+
* locale and reproduces the page's original (pre-i18n) strings byte-for-byte.
|
|
15
|
+
*/
|
|
16
|
+
const GEN_ACCESS_KEY_I18N = {
|
|
17
|
+
en: {
|
|
18
|
+
title: "Authorize Access",
|
|
19
|
+
defaultDesc: "An application is requesting access to your account",
|
|
20
|
+
requestingAccessSuffix: " is requesting access to your account",
|
|
21
|
+
appLabel: "App",
|
|
22
|
+
thisService: "This service",
|
|
23
|
+
accessLevel: "Access level",
|
|
24
|
+
cancel: "Cancel",
|
|
25
|
+
authorize: "Authorize",
|
|
26
|
+
accessGranted: "Access Granted",
|
|
27
|
+
autoClose: "This window will close automatically.",
|
|
28
|
+
securedBy: "Secured by DID Connect",
|
|
29
|
+
defaultAppName: "Access Key Authorization",
|
|
30
|
+
sessionExpiresInPrefix: "Session expires in ",
|
|
31
|
+
sessionExpiresInSuffix: "s",
|
|
32
|
+
sessionExpired: "Session expired — please start over.",
|
|
33
|
+
closeTabManually: "You can close this tab manually.",
|
|
34
|
+
authorizationFailed: "Authorization failed",
|
|
35
|
+
networkError: "Network error",
|
|
36
|
+
},
|
|
37
|
+
zh: {
|
|
38
|
+
title: "授权访问",
|
|
39
|
+
defaultDesc: "一个应用正在请求访问您的账户",
|
|
40
|
+
requestingAccessSuffix: " 正在请求访问您的账户",
|
|
41
|
+
appLabel: "应用",
|
|
42
|
+
thisService: "本服务",
|
|
43
|
+
accessLevel: "访问级别",
|
|
44
|
+
cancel: "取消",
|
|
45
|
+
authorize: "授权",
|
|
46
|
+
accessGranted: "已授权",
|
|
47
|
+
autoClose: "此窗口将自动关闭。",
|
|
48
|
+
securedBy: "由 DID Connect 保护",
|
|
49
|
+
defaultAppName: "访问密钥授权",
|
|
50
|
+
sessionExpiresInPrefix: "会话将在 ",
|
|
51
|
+
sessionExpiresInSuffix: " 秒后过期",
|
|
52
|
+
sessionExpired: "会话已过期,请重新开始。",
|
|
53
|
+
closeTabManually: "您可以手动关闭此标签页。",
|
|
54
|
+
authorizationFailed: "授权失败",
|
|
55
|
+
networkError: "网络错误",
|
|
56
|
+
},
|
|
57
|
+
};
|
|
12
58
|
/** Escape string for safe embedding inside <script> — prevents XSS. */
|
|
13
59
|
function escapeForScript(s) {
|
|
14
60
|
return s.replace(/<\/(script)/gi, "<\\/$1");
|
|
@@ -26,16 +72,33 @@ const AUTH_STYLES = /* css */ `
|
|
|
26
72
|
|
|
27
73
|
/* ── Source header ── */
|
|
28
74
|
.source-header { margin-bottom: 28px; text-align: center; }
|
|
29
|
-
.source-
|
|
75
|
+
.source-header h1 { margin-bottom: 4px; }
|
|
76
|
+
|
|
77
|
+
/* ── A → B connector: requesting app on the left, this service on the right ── */
|
|
78
|
+
.connector {
|
|
79
|
+
display: flex; align-items: center; justify-content: center; gap: 12px;
|
|
80
|
+
margin-bottom: 16px;
|
|
81
|
+
}
|
|
82
|
+
.connector-node { display: flex; flex-direction: column; align-items: center; gap: 6px; min-width: 0; }
|
|
83
|
+
.logo-box {
|
|
30
84
|
width: 56px; height: 56px; border-radius: var(--radius-lg);
|
|
31
85
|
background: var(--blue-light); color: var(--blue-muted);
|
|
32
86
|
display: inline-flex; align-items: center; justify-content: center;
|
|
33
|
-
|
|
87
|
+
overflow: hidden; flex-shrink: 0;
|
|
34
88
|
}
|
|
35
|
-
.
|
|
89
|
+
.logo-box img {
|
|
36
90
|
width: 56px; height: 56px; border-radius: var(--radius-lg); object-fit: cover;
|
|
37
91
|
}
|
|
38
|
-
.
|
|
92
|
+
.connector-label {
|
|
93
|
+
font-size: 11px; color: var(--text-tertiary);
|
|
94
|
+
max-width: 96px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
95
|
+
}
|
|
96
|
+
.connector-track {
|
|
97
|
+
display: flex; align-items: center; justify-content: center;
|
|
98
|
+
width: 26px; height: 26px; border-radius: 50%;
|
|
99
|
+
background: var(--bg-elevated); color: var(--text-tertiary);
|
|
100
|
+
flex-shrink: 0;
|
|
101
|
+
}
|
|
39
102
|
|
|
40
103
|
/* ── User identity card ── */
|
|
41
104
|
.user-identity {
|
|
@@ -83,8 +146,9 @@ const AUTH_STYLES = /* css */ `
|
|
|
83
146
|
text-transform: capitalize;
|
|
84
147
|
}
|
|
85
148
|
|
|
86
|
-
/* ── Actions:
|
|
87
|
-
.auth-actions { display: flex; flex-direction:
|
|
149
|
+
/* ── Actions: equal-width side-by-side buttons (Cancel left, Authorize right) ── */
|
|
150
|
+
.auth-actions { display: flex; flex-direction: row; gap: 8px; }
|
|
151
|
+
.auth-actions .btn { flex: 1 1 0; min-width: 0; }
|
|
88
152
|
|
|
89
153
|
/* ── Success view ── */
|
|
90
154
|
.success-view { text-align: center; padding: 20px 0 8px; }
|
|
@@ -138,19 +202,32 @@ const AUTH_STYLES = /* css */ `
|
|
|
138
202
|
.phase-authorize .auth-card-inner,
|
|
139
203
|
.phase-success .auth-card-inner { display: block; }
|
|
140
204
|
`;
|
|
141
|
-
export function buildGenAccessKeyPageHTML(options) {
|
|
205
|
+
export function buildGenAccessKeyPageHTML(options, locale = "en") {
|
|
142
206
|
const optionsJSON = escapeForScript(JSON.stringify({
|
|
143
207
|
methods: options?.methods || ["passkey", "oauth", "email"],
|
|
144
208
|
oauthProviders: options?.oauthProviders || [],
|
|
145
209
|
appName: options?.appName || "",
|
|
146
210
|
}));
|
|
147
211
|
const apiPrefix = options?.apiPrefix || "/.well-known/service/api/did";
|
|
212
|
+
const lang = locale === "zh" ? "zh" : "en";
|
|
213
|
+
const t = GEN_ACCESS_KEY_I18N[lang];
|
|
214
|
+
const clientI18n = escapeForScript(JSON.stringify({
|
|
215
|
+
requestingAccessSuffix: t.requestingAccessSuffix,
|
|
216
|
+
defaultAppName: t.defaultAppName,
|
|
217
|
+
authorize: t.authorize,
|
|
218
|
+
sessionExpiresInPrefix: t.sessionExpiresInPrefix,
|
|
219
|
+
sessionExpiresInSuffix: t.sessionExpiresInSuffix,
|
|
220
|
+
sessionExpired: t.sessionExpired,
|
|
221
|
+
closeTabManually: t.closeTabManually,
|
|
222
|
+
authorizationFailed: t.authorizationFailed,
|
|
223
|
+
networkError: t.networkError,
|
|
224
|
+
}));
|
|
148
225
|
return /* html */ `<!DOCTYPE html>
|
|
149
|
-
<html lang="
|
|
226
|
+
<html lang="${lang}">
|
|
150
227
|
<head>
|
|
151
228
|
<meta charset="utf-8" />
|
|
152
229
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
153
|
-
<title
|
|
230
|
+
<title>${t.title}</title>
|
|
154
231
|
<link rel="stylesheet" href="${assetUrl("login.css")}" />
|
|
155
232
|
<style>
|
|
156
233
|
${AUTH_STYLES}
|
|
@@ -162,9 +239,22 @@ export function buildGenAccessKeyPageHTML(options) {
|
|
|
162
239
|
<!-- Source preamble: transparent header above LoginPage card during login -->
|
|
163
240
|
<div class="source-preamble">
|
|
164
241
|
<div class="source-header">
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
242
|
+
<!-- A → B connector: requesting app (A, fetched/untrusted logo) on the
|
|
243
|
+
left, this service (B, same-origin logo — always resolvable, see
|
|
244
|
+
branding-handler's defaultLogoResponse fallback) on the right. -->
|
|
245
|
+
<div class="connector">
|
|
246
|
+
<div class="connector-node">
|
|
247
|
+
<div class="logo-box" id="source-icon">${ICONS.key}</div>
|
|
248
|
+
<span class="connector-label" id="source-label">${t.appLabel}</span>
|
|
249
|
+
</div>
|
|
250
|
+
<div class="connector-track">${ICONS.shield}</div>
|
|
251
|
+
<div class="connector-node">
|
|
252
|
+
<div class="logo-box"><img src="/.well-known/service/blocklet/logo" alt="" /></div>
|
|
253
|
+
<span class="connector-label" id="target-label">${t.thisService}</span>
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
<h1 id="source-name">${t.title}</h1>
|
|
257
|
+
<p class="subtitle" id="source-desc">${t.defaultDesc}</p>
|
|
168
258
|
</div>
|
|
169
259
|
</div>
|
|
170
260
|
|
|
@@ -176,9 +266,19 @@ export function buildGenAccessKeyPageHTML(options) {
|
|
|
176
266
|
|
|
177
267
|
<!-- Duplicate source header inside card (shown when preamble is hidden) -->
|
|
178
268
|
<div class="source-header">
|
|
179
|
-
<div class="
|
|
180
|
-
|
|
181
|
-
|
|
269
|
+
<div class="connector">
|
|
270
|
+
<div class="connector-node">
|
|
271
|
+
<div class="logo-box" id="source-icon-inner">${ICONS.key}</div>
|
|
272
|
+
<span class="connector-label" id="source-label-inner">${t.appLabel}</span>
|
|
273
|
+
</div>
|
|
274
|
+
<div class="connector-track">${ICONS.shield}</div>
|
|
275
|
+
<div class="connector-node">
|
|
276
|
+
<div class="logo-box"><img src="/.well-known/service/blocklet/logo" alt="" /></div>
|
|
277
|
+
<span class="connector-label" id="target-label-inner">${t.thisService}</span>
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
<h1 id="source-name-inner">${t.title}</h1>
|
|
281
|
+
<p class="subtitle" id="source-desc-inner">${t.defaultDesc}</p>
|
|
182
282
|
</div>
|
|
183
283
|
|
|
184
284
|
<!-- Phase 2: Authorize -->
|
|
@@ -191,12 +291,12 @@ export function buildGenAccessKeyPageHTML(options) {
|
|
|
191
291
|
</div>
|
|
192
292
|
</div>
|
|
193
293
|
<div class="permission-row">
|
|
194
|
-
<span class="permission-label"
|
|
294
|
+
<span class="permission-label">${t.accessLevel}</span>
|
|
195
295
|
<span class="role-badge" id="grant-role">member</span>
|
|
196
296
|
</div>
|
|
197
297
|
<div class="auth-actions">
|
|
198
|
-
<button class="btn" id="
|
|
199
|
-
<button class="btn
|
|
298
|
+
<button class="btn btn-secondary" id="cancel-btn" onclick="cancelAuth()">${t.cancel}</button>
|
|
299
|
+
<button class="btn" id="auth-btn" onclick="doAuthorize()">${t.authorize}</button>
|
|
200
300
|
</div>
|
|
201
301
|
<div id="timeout-bar" class="timeout-bar hidden"></div>
|
|
202
302
|
<div id="status" class="status"></div>
|
|
@@ -206,15 +306,15 @@ export function buildGenAccessKeyPageHTML(options) {
|
|
|
206
306
|
<div id="success-section" class="hidden">
|
|
207
307
|
<div class="success-view">
|
|
208
308
|
<div class="success-icon">${ICONS.check}</div>
|
|
209
|
-
<div class="success-title"
|
|
210
|
-
<p class="success-subtitle"
|
|
309
|
+
<div class="success-title">${t.accessGranted}</div>
|
|
310
|
+
<p class="success-subtitle">${t.autoClose}</p>
|
|
211
311
|
</div>
|
|
212
312
|
</div>
|
|
213
313
|
|
|
214
314
|
<div class="login-footer">
|
|
215
315
|
<div class="secured-badge">
|
|
216
316
|
${ICONS.shield}
|
|
217
|
-
<span
|
|
317
|
+
<span>${t.securedBy}</span>
|
|
218
318
|
</div>
|
|
219
319
|
</div>
|
|
220
320
|
</div>
|
|
@@ -226,6 +326,7 @@ export function buildGenAccessKeyPageHTML(options) {
|
|
|
226
326
|
;(function() {
|
|
227
327
|
var LB = __LoginBundle;
|
|
228
328
|
var pageOpts = ${optionsJSON};
|
|
329
|
+
var I18N = ${clientI18n};
|
|
229
330
|
var params = new URLSearchParams(location.search);
|
|
230
331
|
var token = params.get('__token__');
|
|
231
332
|
var source = params.get('source') || '';
|
|
@@ -233,25 +334,36 @@ export function buildGenAccessKeyPageHTML(options) {
|
|
|
233
334
|
var apiPrefix = '${escapeForScript(apiPrefix)}';
|
|
234
335
|
|
|
235
336
|
// Sync both source headers (preamble + inner card)
|
|
236
|
-
function setSource(name, desc,
|
|
337
|
+
function setSource(name, desc, logoUrl) {
|
|
237
338
|
['', '-inner'].forEach(function(suffix) {
|
|
238
339
|
if (name) {
|
|
239
340
|
var el = document.getElementById('source-name' + suffix);
|
|
240
341
|
if (el) el.textContent = name;
|
|
342
|
+
var labelEl = document.getElementById('source-label' + suffix);
|
|
343
|
+
if (labelEl) labelEl.textContent = name;
|
|
241
344
|
}
|
|
242
345
|
if (desc) {
|
|
243
346
|
var el2 = document.getElementById('source-desc' + suffix);
|
|
244
347
|
if (el2) el2.textContent = desc;
|
|
245
348
|
}
|
|
246
|
-
if (
|
|
349
|
+
if (logoUrl) {
|
|
247
350
|
var el3 = document.getElementById('source-icon' + suffix);
|
|
248
|
-
if (el3)
|
|
351
|
+
if (el3) {
|
|
352
|
+
// Assign via property, never innerHTML: logoUrl comes from an
|
|
353
|
+
// untrusted third-party appUrl response and must never be parsed
|
|
354
|
+
// as HTML (that would let an attacker inject live attributes/script).
|
|
355
|
+
var img = document.createElement('img');
|
|
356
|
+
img.alt = '';
|
|
357
|
+
img.src = logoUrl;
|
|
358
|
+
el3.innerHTML = '';
|
|
359
|
+
el3.appendChild(img);
|
|
360
|
+
}
|
|
249
361
|
}
|
|
250
362
|
});
|
|
251
363
|
}
|
|
252
364
|
|
|
253
365
|
if (source) {
|
|
254
|
-
setSource(source, source +
|
|
366
|
+
setSource(source, source + I18N.requestingAccessSuffix);
|
|
255
367
|
}
|
|
256
368
|
|
|
257
369
|
// Source info enhancement: fetch app details from appUrl/__blocklet__.js
|
|
@@ -260,19 +372,35 @@ export function buildGenAccessKeyPageHTML(options) {
|
|
|
260
372
|
.then(function(r) { return r.json(); })
|
|
261
373
|
.then(function(info) {
|
|
262
374
|
if (info.appName) {
|
|
263
|
-
setSource(info.appName, info.appName +
|
|
375
|
+
setSource(info.appName, info.appName + I18N.requestingAccessSuffix);
|
|
264
376
|
}
|
|
265
377
|
if (info.appLogo) {
|
|
266
|
-
setSource(null, null,
|
|
378
|
+
setSource(null, null, info.appLogo);
|
|
267
379
|
}
|
|
268
380
|
})
|
|
269
381
|
.catch(function() { /* degrade to icon */ });
|
|
270
382
|
}
|
|
271
383
|
|
|
384
|
+
// Target (B) info: this service's own name, for the connector label.
|
|
385
|
+
// Same-origin (unlike appUrl above, which is attacker-controlled), and the
|
|
386
|
+
// logo image itself is already server-rendered directly via a static
|
|
387
|
+
// same-origin <img src>, so only the display name needs fetching here.
|
|
388
|
+
function setTarget(name) {
|
|
389
|
+
if (!name) return;
|
|
390
|
+
['', '-inner'].forEach(function(suffix) {
|
|
391
|
+
var el = document.getElementById('target-label' + suffix);
|
|
392
|
+
if (el) el.textContent = name;
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
fetch(location.origin + '/__blocklet__.js?type=json')
|
|
396
|
+
.then(function(r) { return r.json(); })
|
|
397
|
+
.then(function(info) { setTarget(info.appName); })
|
|
398
|
+
.catch(function() { /* keep default label */ });
|
|
399
|
+
|
|
272
400
|
// ConnectConfig for LoginPage
|
|
273
401
|
var config = {
|
|
274
402
|
appPid: '',
|
|
275
|
-
appName: pageOpts.appName ||
|
|
403
|
+
appName: pageOpts.appName || I18N.defaultAppName,
|
|
276
404
|
apiPrefix: apiPrefix,
|
|
277
405
|
};
|
|
278
406
|
var http = new LB.FetchHttpAdapter({ prefix: apiPrefix });
|
|
@@ -341,12 +469,12 @@ export function buildGenAccessKeyPageHTML(options) {
|
|
|
341
469
|
var remaining = SESSION_TTL - (Date.now() - startTime);
|
|
342
470
|
var bar = document.getElementById('timeout-bar');
|
|
343
471
|
if (remaining <= 60000 && remaining > 0) {
|
|
344
|
-
bar.textContent =
|
|
472
|
+
bar.textContent = I18N.sessionExpiresInPrefix + Math.ceil(remaining / 1000) + I18N.sessionExpiresInSuffix;
|
|
345
473
|
bar.className = 'timeout-bar';
|
|
346
474
|
}
|
|
347
475
|
if (remaining <= 0) {
|
|
348
476
|
document.getElementById('auth-btn').disabled = true;
|
|
349
|
-
bar.textContent =
|
|
477
|
+
bar.textContent = I18N.sessionExpired;
|
|
350
478
|
bar.className = 'timeout-bar expired';
|
|
351
479
|
}
|
|
352
480
|
}, 1000);
|
|
@@ -356,7 +484,7 @@ export function buildGenAccessKeyPageHTML(options) {
|
|
|
356
484
|
window.cancelAuth = function() {
|
|
357
485
|
try { window.close(); } catch(e) {}
|
|
358
486
|
setTimeout(function() {
|
|
359
|
-
document.getElementById('status').textContent =
|
|
487
|
+
document.getElementById('status').textContent = I18N.closeTabManually;
|
|
360
488
|
document.getElementById('status').className = 'status';
|
|
361
489
|
}, 500);
|
|
362
490
|
};
|
|
@@ -384,17 +512,17 @@ export function buildGenAccessKeyPageHTML(options) {
|
|
|
384
512
|
}
|
|
385
513
|
setTimeout(function() { window.close(); }, 2000);
|
|
386
514
|
} else {
|
|
387
|
-
document.getElementById('status').textContent = data.error ||
|
|
515
|
+
document.getElementById('status').textContent = data.error || I18N.authorizationFailed;
|
|
388
516
|
document.getElementById('status').className = 'status error';
|
|
389
517
|
btn.disabled = false;
|
|
390
|
-
btn.textContent =
|
|
518
|
+
btn.textContent = I18N.authorize;
|
|
391
519
|
}
|
|
392
520
|
})
|
|
393
521
|
.catch(function(err) {
|
|
394
|
-
document.getElementById('status').textContent = err.message ||
|
|
522
|
+
document.getElementById('status').textContent = err.message || I18N.networkError;
|
|
395
523
|
document.getElementById('status').className = 'status error';
|
|
396
524
|
btn.disabled = false;
|
|
397
|
-
btn.textContent =
|
|
525
|
+
btn.textContent = I18N.authorize;
|
|
398
526
|
});
|
|
399
527
|
};
|
|
400
528
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gen-access-key-page.js","sourceRoot":"","sources":["../../src/pages/gen-access-key-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAahD,uEAAuE;AACvE,SAAS,eAAe,CAAC,CAAS;IAChC,OAAO,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,uEAAuE;AACvE,MAAM,KAAK,GAAG;IACZ,GAAG,EAAE,oWAAoW;IACzW,MAAM,EAAE,iNAAiN;IACzN,KAAK,EAAE,uLAAuL;CAC/L,CAAC;AAEF,wEAAwE;AACxE,MAAM,WAAW,GAAG,SAAS,CAAC
|
|
1
|
+
{"version":3,"file":"gen-access-key-page.js","sourceRoot":"","sources":["../../src/pages/gen-access-key-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"homepage.d.ts","sourceRoot":"","sources":["../../src/pages/homepage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"homepage.d.ts","sourceRoot":"","sources":["../../src/pages/homepage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAsQD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA+J5D"}
|
package/dist/pages/homepage.js
CHANGED
|
@@ -20,8 +20,6 @@ const EN = {
|
|
|
20
20
|
teamDesc: "Manage members, invitations, and team settings",
|
|
21
21
|
instancesTitle: "Instances",
|
|
22
22
|
instancesDesc: "Register and manage app instances",
|
|
23
|
-
accessKeysTitle: "Access Keys",
|
|
24
|
-
accessKeysDesc: "Manage API access tokens",
|
|
25
23
|
brandingTitle: "Branding",
|
|
26
24
|
brandingDesc: "Customize app appearance and theme",
|
|
27
25
|
statusTitle: "Service Status",
|
|
@@ -46,8 +44,6 @@ const ZH = {
|
|
|
46
44
|
teamDesc: "管理成员、邀请和团队设置",
|
|
47
45
|
instancesTitle: "实例管理",
|
|
48
46
|
instancesDesc: "注册和管理应用实例",
|
|
49
|
-
accessKeysTitle: "访问密钥",
|
|
50
|
-
accessKeysDesc: "管理 API 访问令牌",
|
|
51
47
|
brandingTitle: "品牌",
|
|
52
48
|
brandingDesc: "自定义应用外观和主题",
|
|
53
49
|
statusTitle: "服务状态",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"homepage.js","sourceRoot":"","sources":["../../src/pages/homepage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAkBhD,MAAM,EAAE,GAAa;IACnB,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,2CAA2C;IACrD,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,UAAU;IACnB,UAAU,EAAE,SAAS;IACrB,SAAS,EAAE,6CAA6C;IACxD,YAAY,EAAE,YAAY;IAC1B,WAAW,EAAE,yCAAyC;IACtD,aAAa,EAAE,iBAAiB;IAChC,YAAY,EAAE,6CAA6C;IAC3D,SAAS,EAAE,iBAAiB;IAC5B,QAAQ,EAAE,gDAAgD;IAC1D,cAAc,EAAE,WAAW;IAC3B,aAAa,EAAE,mCAAmC;IAClD,
|
|
1
|
+
{"version":3,"file":"homepage.js","sourceRoot":"","sources":["../../src/pages/homepage.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* 4. If not: Embed full LoginPage (all configured methods) → on success → accept
|
|
11
11
|
* 5. POST /invitations/:id/accept → redirect to "/"
|
|
12
12
|
*/
|
|
13
|
-
export declare function buildInvitePageHTML(apiBase: string, options?: {
|
|
13
|
+
export declare function buildInvitePageHTML(apiBase: string, locale?: string, options?: {
|
|
14
14
|
masterOAuthOrigin?: string;
|
|
15
15
|
}): string;
|
|
16
16
|
//# sourceMappingURL=invite-page.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invite-page.d.ts","sourceRoot":"","sources":["../../src/pages/invite-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"invite-page.d.ts","sourceRoot":"","sources":["../../src/pages/invite-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA2DH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,SAAO,EACb,OAAO,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,GACvC,MAAM,CAkPR"}
|
|
@@ -11,14 +11,83 @@
|
|
|
11
11
|
* 5. POST /invitations/:id/accept → redirect to "/"
|
|
12
12
|
*/
|
|
13
13
|
import { assetUrl } from "../asset-registry.js";
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Invite-page copy, localized. `en` is the default fallback for any unknown locale.
|
|
16
|
+
* `invitedPrefix`/`invitedSuffix` wrap the dynamic role badge so the sentence reads
|
|
17
|
+
* naturally in each language (the role sits in the middle).
|
|
18
|
+
*/
|
|
19
|
+
const INVITE_I18N = {
|
|
20
|
+
en: {
|
|
21
|
+
title: "You're Invited",
|
|
22
|
+
verifying: "Verifying invitation...",
|
|
23
|
+
pleaseWait: "Please wait",
|
|
24
|
+
invitedPrefix: "You've been invited to join as a ",
|
|
25
|
+
invitedSuffix: "",
|
|
26
|
+
confirmJoin: "Confirm & Join",
|
|
27
|
+
errorTitle: "Invalid Invitation",
|
|
28
|
+
goHome: "Go to homepage",
|
|
29
|
+
welcome: "Welcome!",
|
|
30
|
+
joinedRedirect: "You've joined successfully. Redirecting...",
|
|
31
|
+
// client-side (serialized into the page script)
|
|
32
|
+
noIdTitle: "Invalid Link",
|
|
33
|
+
noIdMsg: "No invitation ID provided.",
|
|
34
|
+
unavailableTitle: "Invitation Unavailable",
|
|
35
|
+
notFound: "This invitation link is invalid.",
|
|
36
|
+
expired: "This invitation has expired.",
|
|
37
|
+
closed: "This invitation is no longer available.",
|
|
38
|
+
invalidFallback: "This invitation is not valid.",
|
|
39
|
+
verifyErrorTitle: "Error",
|
|
40
|
+
verifyErrorMsg: "Failed to verify invitation. Please try again.",
|
|
41
|
+
joining: "Joining...",
|
|
42
|
+
acceptFailed: "Failed to accept invitation",
|
|
43
|
+
},
|
|
44
|
+
zh: {
|
|
45
|
+
title: "您收到一份邀请",
|
|
46
|
+
verifying: "正在验证邀请…",
|
|
47
|
+
pleaseWait: "请稍候",
|
|
48
|
+
invitedPrefix: "您被邀请以 ",
|
|
49
|
+
invitedSuffix: " 的身份加入",
|
|
50
|
+
confirmJoin: "确认并加入",
|
|
51
|
+
errorTitle: "无效的邀请",
|
|
52
|
+
goHome: "返回首页",
|
|
53
|
+
welcome: "欢迎!",
|
|
54
|
+
joinedRedirect: "您已成功加入,正在跳转…",
|
|
55
|
+
noIdTitle: "无效链接",
|
|
56
|
+
noIdMsg: "未提供邀请 ID。",
|
|
57
|
+
unavailableTitle: "邀请不可用",
|
|
58
|
+
notFound: "此邀请链接无效。",
|
|
59
|
+
expired: "此邀请已过期。",
|
|
60
|
+
closed: "此邀请已不再可用。",
|
|
61
|
+
invalidFallback: "此邀请无效。",
|
|
62
|
+
verifyErrorTitle: "出错了",
|
|
63
|
+
verifyErrorMsg: "验证邀请失败,请重试。",
|
|
64
|
+
joining: "正在加入…",
|
|
65
|
+
acceptFailed: "接受邀请失败",
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
export function buildInvitePageHTML(apiBase, locale = "en", options) {
|
|
15
69
|
const masterOAuthOriginJson = JSON.stringify(options?.masterOAuthOrigin ?? null);
|
|
70
|
+
const lang = locale === "zh" ? "zh" : "en";
|
|
71
|
+
const t = INVITE_I18N[lang];
|
|
72
|
+
const clientI18n = JSON.stringify({
|
|
73
|
+
noIdTitle: t.noIdTitle,
|
|
74
|
+
noIdMsg: t.noIdMsg,
|
|
75
|
+
unavailableTitle: t.unavailableTitle,
|
|
76
|
+
notFound: t.notFound,
|
|
77
|
+
expired: t.expired,
|
|
78
|
+
closed: t.closed,
|
|
79
|
+
invalidFallback: t.invalidFallback,
|
|
80
|
+
verifyErrorTitle: t.verifyErrorTitle,
|
|
81
|
+
verifyErrorMsg: t.verifyErrorMsg,
|
|
82
|
+
joining: t.joining,
|
|
83
|
+
acceptFailed: t.acceptFailed,
|
|
84
|
+
});
|
|
16
85
|
return /* html */ `<!DOCTYPE html>
|
|
17
|
-
<html lang="
|
|
86
|
+
<html lang="${lang}">
|
|
18
87
|
<head>
|
|
19
88
|
<meta charset="utf-8" />
|
|
20
89
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
21
|
-
<title
|
|
90
|
+
<title>${t.title}</title>
|
|
22
91
|
<link rel="stylesheet" href="${assetUrl("login.css")}" />
|
|
23
92
|
<style>
|
|
24
93
|
.invite-role {
|
|
@@ -51,14 +120,14 @@ export function buildInvitePageHTML(apiBase, options) {
|
|
|
51
120
|
<body>
|
|
52
121
|
<div class="card" id="card">
|
|
53
122
|
<div id="loading-state">
|
|
54
|
-
<h1
|
|
55
|
-
<div class="status"
|
|
123
|
+
<h1>${t.verifying}</h1>
|
|
124
|
+
<div class="status">${t.pleaseWait}</div>
|
|
56
125
|
</div>
|
|
57
126
|
|
|
58
127
|
<div id="valid-state" class="hidden">
|
|
59
|
-
<h1
|
|
128
|
+
<h1>${t.title}</h1>
|
|
60
129
|
<div class="invite-info">
|
|
61
|
-
<p class="subtitle"
|
|
130
|
+
<p class="subtitle">${t.invitedPrefix}<span class="invite-role" id="invite-role"></span>${t.invitedSuffix}</p>
|
|
62
131
|
<p class="invite-remark hidden" id="invite-remark"></p>
|
|
63
132
|
</div>
|
|
64
133
|
<!-- Authenticated: show confirm button -->
|
|
@@ -69,20 +138,20 @@ export function buildInvitePageHTML(apiBase, options) {
|
|
|
69
138
|
<line x1="20" y1="8" x2="20" y2="14"/>
|
|
70
139
|
<line x1="23" y1="11" x2="17" y2="11"/>
|
|
71
140
|
</svg>
|
|
72
|
-
<span
|
|
141
|
+
<span>${t.confirmJoin}</span>
|
|
73
142
|
</button>
|
|
74
143
|
<div class="status" id="status"></div>
|
|
75
144
|
</div>
|
|
76
145
|
|
|
77
146
|
<div id="error-state" class="hidden error-state">
|
|
78
|
-
<h1 id="error-title"
|
|
147
|
+
<h1 id="error-title">${t.errorTitle}</h1>
|
|
79
148
|
<p class="subtitle" id="error-message"></p>
|
|
80
|
-
<a href="/" class="home-link"
|
|
149
|
+
<a href="/" class="home-link">${t.goHome}</a>
|
|
81
150
|
</div>
|
|
82
151
|
|
|
83
152
|
<div id="success-state" class="hidden">
|
|
84
|
-
<h1
|
|
85
|
-
<p class="subtitle"
|
|
153
|
+
<h1>${t.welcome}</h1>
|
|
154
|
+
<p class="subtitle">${t.joinedRedirect}</p>
|
|
86
155
|
</div>
|
|
87
156
|
</div>
|
|
88
157
|
<!-- LoginPage mounts here (outside the card — it renders its own card) -->
|
|
@@ -93,6 +162,7 @@ export function buildInvitePageHTML(apiBase, options) {
|
|
|
93
162
|
var LoginPage = __LoginBundle.LoginPage;
|
|
94
163
|
var FetchHttpAdapter = __LoginBundle.FetchHttpAdapter;
|
|
95
164
|
|
|
165
|
+
var I18N = ${clientI18n};
|
|
96
166
|
var API_BASE = ${JSON.stringify(apiBase)};
|
|
97
167
|
var MASTER_OAUTH_ORIGIN = ${masterOAuthOriginJson};
|
|
98
168
|
var invitationId = new URLSearchParams(location.search).get("id");
|
|
@@ -122,7 +192,7 @@ async function acceptInvitation() {
|
|
|
122
192
|
});
|
|
123
193
|
if (!res.ok) {
|
|
124
194
|
var err = await res.json().catch(function() { return {}; });
|
|
125
|
-
throw new Error(err.error ||
|
|
195
|
+
throw new Error(err.error || I18N.acceptFailed);
|
|
126
196
|
}
|
|
127
197
|
return res.json();
|
|
128
198
|
}
|
|
@@ -131,19 +201,19 @@ async function handleConfirm() {
|
|
|
131
201
|
var btn = document.getElementById("confirm-btn");
|
|
132
202
|
btn.disabled = true;
|
|
133
203
|
try {
|
|
134
|
-
setStatus(
|
|
204
|
+
setStatus(I18N.joining, false);
|
|
135
205
|
await acceptInvitation();
|
|
136
206
|
show("success-state");
|
|
137
207
|
setTimeout(function() { location.href = "/"; }, 1000);
|
|
138
208
|
} catch (err) {
|
|
139
|
-
setStatus(err.message ||
|
|
209
|
+
setStatus(err.message || I18N.acceptFailed, true);
|
|
140
210
|
btn.disabled = false;
|
|
141
211
|
}
|
|
142
212
|
}
|
|
143
213
|
|
|
144
214
|
async function init() {
|
|
145
215
|
if (!invitationId) {
|
|
146
|
-
showError(
|
|
216
|
+
showError(I18N.noIdTitle, I18N.noIdMsg);
|
|
147
217
|
return;
|
|
148
218
|
}
|
|
149
219
|
|
|
@@ -158,11 +228,11 @@ async function init() {
|
|
|
158
228
|
|
|
159
229
|
if (!invInfo.valid) {
|
|
160
230
|
var messages = {
|
|
161
|
-
not_found:
|
|
162
|
-
expired:
|
|
163
|
-
closed:
|
|
231
|
+
not_found: I18N.notFound,
|
|
232
|
+
expired: I18N.expired,
|
|
233
|
+
closed: I18N.closed,
|
|
164
234
|
};
|
|
165
|
-
showError(
|
|
235
|
+
showError(I18N.unavailableTitle, messages[invInfo.error] || I18N.invalidFallback);
|
|
166
236
|
return;
|
|
167
237
|
}
|
|
168
238
|
|
|
@@ -174,7 +244,7 @@ async function init() {
|
|
|
174
244
|
remarkEl.classList.remove("hidden");
|
|
175
245
|
}
|
|
176
246
|
} catch (err) {
|
|
177
|
-
showError(
|
|
247
|
+
showError(I18N.verifyErrorTitle, I18N.verifyErrorMsg);
|
|
178
248
|
return;
|
|
179
249
|
}
|
|
180
250
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invite-page.js","sourceRoot":"","sources":["../../src/pages/invite-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"invite-page.js","sourceRoot":"","sources":["../../src/pages/invite-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-callback-page.d.ts","sourceRoot":"","sources":["../../src/pages/oauth-callback-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"oauth-callback-page.d.ts","sourceRoot":"","sources":["../../src/pages/oauth-callback-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACvD,MAAM,CAwER"}
|