@arcblock/did-connect-service 4.1.37 → 4.1.39
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 +5 -5
- package/dist/_generated/header-bundle-string.d.ts +1 -1
- package/dist/_generated/header-bundle-string.d.ts.map +1 -1
- package/dist/_generated/header-bundle-string.js +1 -1
- package/dist/_generated/header-bundle-string.js.map +1 -1
- 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/assets/{admin-extra.979f5e56.js → admin-extra.c7a0720f.js} +3 -3
- package/dist/assets/{admin.f5f577f9.css → admin.ab0009f2.css} +22 -2
- package/dist/assets/{header.94d9e46b.js → header.8703ab26.js} +5 -5
- package/dist/assets/login.60fd0777.js +731 -0
- package/dist/assets/{login.7b12c6dc.css → login.a9c8b434.css} +11 -0
- package/dist/handler-errors.d.ts +868 -3
- package/dist/handler-errors.d.ts.map +1 -1
- package/dist/handler-errors.js +1067 -26
- package/dist/handler-errors.js.map +1 -1
- package/dist/handlers/access-key-connect-handler.d.ts.map +1 -1
- package/dist/handlers/access-key-connect-handler.js +20 -11
- package/dist/handlers/access-key-connect-handler.js.map +1 -1
- package/dist/handlers/access-key-handler.d.ts.map +1 -1
- package/dist/handlers/access-key-handler.js +18 -7
- package/dist/handlers/access-key-handler.js.map +1 -1
- package/dist/handlers/account-merge-handler.d.ts +2 -0
- package/dist/handlers/account-merge-handler.d.ts.map +1 -1
- package/dist/handlers/account-merge-handler.js +34 -29
- package/dist/handlers/account-merge-handler.js.map +1 -1
- package/dist/handlers/admin-instance-handler.d.ts.map +1 -1
- package/dist/handlers/admin-instance-handler.js +21 -17
- 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 +14 -10
- package/dist/handlers/auth-handler.js.map +1 -1
- package/dist/handlers/blocklet-js-handler.d.ts.map +1 -1
- package/dist/handlers/blocklet-js-handler.js +2 -1
- package/dist/handlers/blocklet-js-handler.js.map +1 -1
- package/dist/handlers/branding-handler.d.ts +1 -0
- package/dist/handlers/branding-handler.d.ts.map +1 -1
- package/dist/handlers/branding-handler.js +15 -8
- package/dist/handlers/branding-handler.js.map +1 -1
- package/dist/handlers/did-connect-handler.d.ts +1 -0
- package/dist/handlers/did-connect-handler.d.ts.map +1 -1
- package/dist/handlers/did-connect-handler.js +40 -18
- package/dist/handlers/did-connect-handler.js.map +1 -1
- package/dist/handlers/email-login-handler.d.ts +81 -0
- package/dist/handlers/email-login-handler.d.ts.map +1 -1
- package/dist/handlers/email-login-handler.js +124 -23
- package/dist/handlers/email-login-handler.js.map +1 -1
- package/dist/handlers/federation-admin-handler.js +2 -2
- package/dist/handlers/federation-admin-handler.js.map +1 -1
- package/dist/handlers/oauth-handler.d.ts +1 -0
- package/dist/handlers/oauth-handler.d.ts.map +1 -1
- package/dist/handlers/oauth-handler.js +42 -53
- package/dist/handlers/oauth-handler.js.map +1 -1
- package/dist/handlers/passkey-handler.d.ts +1 -0
- package/dist/handlers/passkey-handler.d.ts.map +1 -1
- package/dist/handlers/passkey-handler.js +51 -37
- package/dist/handlers/passkey-handler.js.map +1 -1
- package/dist/handlers/team-handler.d.ts +2 -0
- package/dist/handlers/team-handler.d.ts.map +1 -1
- package/dist/handlers/team-handler.js +57 -35
- package/dist/handlers/team-handler.js.map +1 -1
- package/dist/locale.d.ts +40 -4
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +109 -34
- package/dist/locale.js.map +1 -1
- package/dist/pages/admin/i18n.d.ts.map +1 -1
- package/dist/pages/admin/i18n.js +1411 -6
- package/dist/pages/admin/i18n.js.map +1 -1
- package/dist/pages/admin/index.d.ts.map +1 -1
- package/dist/pages/admin/index.js +9 -5
- package/dist/pages/admin/index.js.map +1 -1
- package/dist/pages/admin/styles.d.ts +1 -1
- package/dist/pages/admin/styles.d.ts.map +1 -1
- package/dist/pages/admin/styles.js +22 -2
- package/dist/pages/admin/styles.js.map +1 -1
- package/dist/pages/admin/tab-branding.d.ts.map +1 -1
- package/dist/pages/admin/tab-branding.js +4 -6
- package/dist/pages/admin/tab-branding.js.map +1 -1
- package/dist/pages/admin-instances-page.d.ts +218 -0
- package/dist/pages/admin-instances-page.d.ts.map +1 -1
- package/dist/pages/admin-instances-page.js +133 -24
- package/dist/pages/admin-instances-page.js.map +1 -1
- package/dist/pages/error-page.d.ts +37 -0
- package/dist/pages/error-page.d.ts.map +1 -1
- package/dist/pages/error-page.js +33 -1
- package/dist/pages/error-page.js.map +1 -1
- package/dist/pages/gen-access-key-page.d.ts +126 -0
- package/dist/pages/gen-access-key-page.d.ts.map +1 -1
- package/dist/pages/gen-access-key-page.js +72 -20
- package/dist/pages/gen-access-key-page.js.map +1 -1
- package/dist/pages/homepage.d.ts +98 -0
- package/dist/pages/homepage.d.ts.map +1 -1
- package/dist/pages/homepage.js +66 -15
- package/dist/pages/homepage.js.map +1 -1
- package/dist/pages/invite-page.d.ts +90 -0
- package/dist/pages/invite-page.d.ts.map +1 -1
- package/dist/pages/invite-page.js +66 -17
- package/dist/pages/invite-page.js.map +1 -1
- package/dist/pages/login-page.d.ts +8 -0
- package/dist/pages/login-page.d.ts.map +1 -1
- package/dist/pages/login-page.js +12 -2
- package/dist/pages/login-page.js.map +1 -1
- package/dist/pages/oauth-callback-page.d.ts +52 -1
- package/dist/pages/oauth-callback-page.d.ts.map +1 -1
- package/dist/pages/oauth-callback-page.js +85 -8
- package/dist/pages/oauth-callback-page.js.map +1 -1
- package/package.json +3 -3
- package/dist/assets/login.566f858e.js +0 -720
|
@@ -10,6 +10,96 @@
|
|
|
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 const INVITE_I18N: {
|
|
14
|
+
readonly en: {
|
|
15
|
+
readonly title: "You're Invited";
|
|
16
|
+
readonly verifying: "Verifying invitation...";
|
|
17
|
+
readonly pleaseWait: "Please wait";
|
|
18
|
+
readonly invited: "You've been invited to join as a {role}";
|
|
19
|
+
readonly confirmJoin: "Confirm & Join";
|
|
20
|
+
readonly errorTitle: "Invalid Invitation";
|
|
21
|
+
readonly goHome: "Go to homepage";
|
|
22
|
+
readonly welcome: "Welcome!";
|
|
23
|
+
readonly joinedRedirect: "You've joined successfully. Redirecting...";
|
|
24
|
+
readonly noIdTitle: "Invalid Link";
|
|
25
|
+
readonly noIdMsg: "No invitation ID provided.";
|
|
26
|
+
readonly unavailableTitle: "Invitation Unavailable";
|
|
27
|
+
readonly notFound: "This invitation link is invalid.";
|
|
28
|
+
readonly expired: "This invitation has expired.";
|
|
29
|
+
readonly closed: "This invitation is no longer available.";
|
|
30
|
+
readonly invalidFallback: "This invitation is not valid.";
|
|
31
|
+
readonly verifyErrorTitle: "Error";
|
|
32
|
+
readonly verifyErrorMsg: "Failed to verify invitation. Please try again.";
|
|
33
|
+
readonly joining: "Joining...";
|
|
34
|
+
readonly acceptFailed: "Failed to accept invitation";
|
|
35
|
+
};
|
|
36
|
+
readonly zh: {
|
|
37
|
+
readonly title: "您收到一份邀请";
|
|
38
|
+
readonly verifying: "正在验证邀请…";
|
|
39
|
+
readonly pleaseWait: "请稍候";
|
|
40
|
+
readonly invited: "您被邀请以 {role} 的身份加入";
|
|
41
|
+
readonly confirmJoin: "确认并加入";
|
|
42
|
+
readonly errorTitle: "无效的邀请";
|
|
43
|
+
readonly goHome: "返回首页";
|
|
44
|
+
readonly welcome: "欢迎!";
|
|
45
|
+
readonly joinedRedirect: "您已成功加入,正在跳转…";
|
|
46
|
+
readonly noIdTitle: "无效链接";
|
|
47
|
+
readonly noIdMsg: "未提供邀请 ID。";
|
|
48
|
+
readonly unavailableTitle: "邀请不可用";
|
|
49
|
+
readonly notFound: "此邀请链接无效。";
|
|
50
|
+
readonly expired: "此邀请已过期。";
|
|
51
|
+
readonly closed: "此邀请已不再可用。";
|
|
52
|
+
readonly invalidFallback: "此邀请无效。";
|
|
53
|
+
readonly verifyErrorTitle: "出错了";
|
|
54
|
+
readonly verifyErrorMsg: "验证邀请失败,请重试。";
|
|
55
|
+
readonly joining: "正在加入…";
|
|
56
|
+
readonly acceptFailed: "接受邀请失败";
|
|
57
|
+
};
|
|
58
|
+
readonly "zh-TW": {
|
|
59
|
+
readonly title: "您收到一份邀請";
|
|
60
|
+
readonly verifying: "正在驗證邀請…";
|
|
61
|
+
readonly pleaseWait: "請稍候";
|
|
62
|
+
readonly invited: "您被邀請以 {role} 的身分加入";
|
|
63
|
+
readonly confirmJoin: "確認並加入";
|
|
64
|
+
readonly errorTitle: "無效的邀請";
|
|
65
|
+
readonly goHome: "返回首頁";
|
|
66
|
+
readonly welcome: "歡迎!";
|
|
67
|
+
readonly joinedRedirect: "您已成功加入,正在跳轉…";
|
|
68
|
+
readonly noIdTitle: "無效連結";
|
|
69
|
+
readonly noIdMsg: "未提供邀請 ID。";
|
|
70
|
+
readonly unavailableTitle: "邀請無法使用";
|
|
71
|
+
readonly notFound: "此邀請連結無效。";
|
|
72
|
+
readonly expired: "此邀請已過期。";
|
|
73
|
+
readonly closed: "此邀請已不再可用。";
|
|
74
|
+
readonly invalidFallback: "此邀請無效。";
|
|
75
|
+
readonly verifyErrorTitle: "發生錯誤";
|
|
76
|
+
readonly verifyErrorMsg: "驗證邀請失敗,請再試一次。";
|
|
77
|
+
readonly joining: "正在加入…";
|
|
78
|
+
readonly acceptFailed: "接受邀請失敗";
|
|
79
|
+
};
|
|
80
|
+
readonly ja: {
|
|
81
|
+
readonly title: "招待を受けました";
|
|
82
|
+
readonly verifying: "招待を確認しています…";
|
|
83
|
+
readonly pleaseWait: "しばらくお待ちください";
|
|
84
|
+
readonly invited: "{role} として参加するよう招待されました";
|
|
85
|
+
readonly confirmJoin: "確認して参加";
|
|
86
|
+
readonly errorTitle: "無効な招待";
|
|
87
|
+
readonly goHome: "ホームページへ戻る";
|
|
88
|
+
readonly welcome: "ようこそ!";
|
|
89
|
+
readonly joinedRedirect: "参加が完了しました。移動しています…";
|
|
90
|
+
readonly noIdTitle: "無効なリンク";
|
|
91
|
+
readonly noIdMsg: "招待 ID が指定されていません。";
|
|
92
|
+
readonly unavailableTitle: "招待を利用できません";
|
|
93
|
+
readonly notFound: "この招待リンクは無効です。";
|
|
94
|
+
readonly expired: "この招待は期限切れです。";
|
|
95
|
+
readonly closed: "この招待は利用できなくなりました。";
|
|
96
|
+
readonly invalidFallback: "この招待は無効です。";
|
|
97
|
+
readonly verifyErrorTitle: "エラー";
|
|
98
|
+
readonly verifyErrorMsg: "招待の確認に失敗しました。もう一度お試しください。";
|
|
99
|
+
readonly joining: "参加しています…";
|
|
100
|
+
readonly acceptFailed: "招待の承諾に失敗しました";
|
|
101
|
+
};
|
|
102
|
+
};
|
|
13
103
|
export declare function buildInvitePageHTML(apiBase: string, locale?: string, options?: {
|
|
14
104
|
masterOAuthOrigin?: string;
|
|
15
105
|
appName?: string;
|
|
@@ -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;AAiCH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFgC,CAAC;AAEzD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,SAAO,EACb,OAAO,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,MAAM,CAwQR"}
|
|
@@ -11,24 +11,18 @@
|
|
|
11
11
|
* 5. POST /invitations/:id/accept → redirect to "/"
|
|
12
12
|
*/
|
|
13
13
|
import { assetUrl } from "../asset-registry.js";
|
|
14
|
-
|
|
15
|
-
|
|
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 = {
|
|
14
|
+
import { resolvePageLocale } from "../locale.js";
|
|
15
|
+
export const INVITE_I18N = {
|
|
20
16
|
en: {
|
|
21
17
|
title: "You're Invited",
|
|
22
18
|
verifying: "Verifying invitation...",
|
|
23
19
|
pleaseWait: "Please wait",
|
|
24
|
-
|
|
25
|
-
invitedSuffix: "",
|
|
20
|
+
invited: "You've been invited to join as a {role}",
|
|
26
21
|
confirmJoin: "Confirm & Join",
|
|
27
22
|
errorTitle: "Invalid Invitation",
|
|
28
23
|
goHome: "Go to homepage",
|
|
29
24
|
welcome: "Welcome!",
|
|
30
25
|
joinedRedirect: "You've joined successfully. Redirecting...",
|
|
31
|
-
// client-side (serialized into the page script)
|
|
32
26
|
noIdTitle: "Invalid Link",
|
|
33
27
|
noIdMsg: "No invitation ID provided.",
|
|
34
28
|
unavailableTitle: "Invitation Unavailable",
|
|
@@ -45,8 +39,7 @@ const INVITE_I18N = {
|
|
|
45
39
|
title: "您收到一份邀请",
|
|
46
40
|
verifying: "正在验证邀请…",
|
|
47
41
|
pleaseWait: "请稍候",
|
|
48
|
-
|
|
49
|
-
invitedSuffix: " 的身份加入",
|
|
42
|
+
invited: "您被邀请以 {role} 的身份加入",
|
|
50
43
|
confirmJoin: "确认并加入",
|
|
51
44
|
errorTitle: "无效的邀请",
|
|
52
45
|
goHome: "返回首页",
|
|
@@ -64,11 +57,55 @@ const INVITE_I18N = {
|
|
|
64
57
|
joining: "正在加入…",
|
|
65
58
|
acceptFailed: "接受邀请失败",
|
|
66
59
|
},
|
|
60
|
+
"zh-TW": {
|
|
61
|
+
title: "您收到一份邀請",
|
|
62
|
+
verifying: "正在驗證邀請…",
|
|
63
|
+
pleaseWait: "請稍候",
|
|
64
|
+
invited: "您被邀請以 {role} 的身分加入",
|
|
65
|
+
confirmJoin: "確認並加入",
|
|
66
|
+
errorTitle: "無效的邀請",
|
|
67
|
+
goHome: "返回首頁",
|
|
68
|
+
welcome: "歡迎!",
|
|
69
|
+
joinedRedirect: "您已成功加入,正在跳轉…",
|
|
70
|
+
noIdTitle: "無效連結",
|
|
71
|
+
noIdMsg: "未提供邀請 ID。",
|
|
72
|
+
unavailableTitle: "邀請無法使用",
|
|
73
|
+
notFound: "此邀請連結無效。",
|
|
74
|
+
expired: "此邀請已過期。",
|
|
75
|
+
closed: "此邀請已不再可用。",
|
|
76
|
+
invalidFallback: "此邀請無效。",
|
|
77
|
+
verifyErrorTitle: "發生錯誤",
|
|
78
|
+
verifyErrorMsg: "驗證邀請失敗,請再試一次。",
|
|
79
|
+
joining: "正在加入…",
|
|
80
|
+
acceptFailed: "接受邀請失敗",
|
|
81
|
+
},
|
|
82
|
+
ja: {
|
|
83
|
+
title: "招待を受けました",
|
|
84
|
+
verifying: "招待を確認しています…",
|
|
85
|
+
pleaseWait: "しばらくお待ちください",
|
|
86
|
+
invited: "{role} として参加するよう招待されました",
|
|
87
|
+
confirmJoin: "確認して参加",
|
|
88
|
+
errorTitle: "無効な招待",
|
|
89
|
+
goHome: "ホームページへ戻る",
|
|
90
|
+
welcome: "ようこそ!",
|
|
91
|
+
joinedRedirect: "参加が完了しました。移動しています…",
|
|
92
|
+
noIdTitle: "無効なリンク",
|
|
93
|
+
noIdMsg: "招待 ID が指定されていません。",
|
|
94
|
+
unavailableTitle: "招待を利用できません",
|
|
95
|
+
notFound: "この招待リンクは無効です。",
|
|
96
|
+
expired: "この招待は期限切れです。",
|
|
97
|
+
closed: "この招待は利用できなくなりました。",
|
|
98
|
+
invalidFallback: "この招待は無効です。",
|
|
99
|
+
verifyErrorTitle: "エラー",
|
|
100
|
+
verifyErrorMsg: "招待の確認に失敗しました。もう一度お試しください。",
|
|
101
|
+
joining: "参加しています…",
|
|
102
|
+
acceptFailed: "招待の承諾に失敗しました",
|
|
103
|
+
},
|
|
67
104
|
};
|
|
68
105
|
export function buildInvitePageHTML(apiBase, locale = "en", options) {
|
|
69
106
|
const masterOAuthOriginJson = JSON.stringify(options?.masterOAuthOrigin ?? null);
|
|
70
|
-
const
|
|
71
|
-
const t = INVITE_I18N[
|
|
107
|
+
const { code, htmlLang } = resolvePageLocale(locale);
|
|
108
|
+
const t = INVITE_I18N[code];
|
|
72
109
|
const appName = (options?.appName ?? "App")
|
|
73
110
|
.replaceAll("&", "&")
|
|
74
111
|
.replaceAll("<", "<")
|
|
@@ -76,6 +113,7 @@ export function buildInvitePageHTML(apiBase, locale = "en", options) {
|
|
|
76
113
|
.replaceAll('"', """)
|
|
77
114
|
.replaceAll("'", "'");
|
|
78
115
|
const clientI18n = JSON.stringify({
|
|
116
|
+
invited: t.invited,
|
|
79
117
|
noIdTitle: t.noIdTitle,
|
|
80
118
|
noIdMsg: t.noIdMsg,
|
|
81
119
|
unavailableTitle: t.unavailableTitle,
|
|
@@ -89,7 +127,7 @@ export function buildInvitePageHTML(apiBase, locale = "en", options) {
|
|
|
89
127
|
acceptFailed: t.acceptFailed,
|
|
90
128
|
});
|
|
91
129
|
return /* html */ `<!DOCTYPE html>
|
|
92
|
-
<html lang="${
|
|
130
|
+
<html lang="${htmlLang}">
|
|
93
131
|
<head>
|
|
94
132
|
<meta charset="utf-8" />
|
|
95
133
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
@@ -134,7 +172,7 @@ export function buildInvitePageHTML(apiBase, locale = "en", options) {
|
|
|
134
172
|
<h1>${t.title}</h1>
|
|
135
173
|
<p class="subtitle">${appName}</p>
|
|
136
174
|
<div class="invite-info">
|
|
137
|
-
<p class="subtitle"
|
|
175
|
+
<p class="subtitle" id="invite-sentence"></p>
|
|
138
176
|
<p class="invite-remark hidden" id="invite-remark"></p>
|
|
139
177
|
</div>
|
|
140
178
|
<!-- Authenticated: show confirm button -->
|
|
@@ -180,6 +218,17 @@ function show(id) {
|
|
|
180
218
|
});
|
|
181
219
|
}
|
|
182
220
|
|
|
221
|
+
function escapeHtml(s) {
|
|
222
|
+
var d = document.createElement("div");
|
|
223
|
+
d.textContent = String(s);
|
|
224
|
+
return d.innerHTML.replace(/"/g, """).replace(/'/g, "'");
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function renderInvited(role) {
|
|
228
|
+
var badge = '<span class="invite-role" id="invite-role">' + escapeHtml(role) + '</span>';
|
|
229
|
+
document.getElementById("invite-sentence").innerHTML = I18N.invited.split("{role}").join(badge);
|
|
230
|
+
}
|
|
231
|
+
|
|
183
232
|
function showError(title, message) {
|
|
184
233
|
document.getElementById("error-title").textContent = title;
|
|
185
234
|
document.getElementById("error-message").textContent = message;
|
|
@@ -246,8 +295,8 @@ async function init() {
|
|
|
246
295
|
return;
|
|
247
296
|
}
|
|
248
297
|
|
|
249
|
-
//
|
|
250
|
-
|
|
298
|
+
// Role is unknown at HTML build time. Escape it, then drop the badge into {role}.
|
|
299
|
+
renderInvited(invInfo.role);
|
|
251
300
|
if (invInfo.remark) {
|
|
252
301
|
var remarkEl = document.getElementById("invite-remark");
|
|
253
302
|
remarkEl.textContent = invInfo.remark;
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"invite-page.js","sourceRoot":"","sources":["../../src/pages/invite-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,14 @@ export interface RenderLoginPageConfig {
|
|
|
20
20
|
}>;
|
|
21
21
|
/** Locale (default: 'en') */
|
|
22
22
|
locale?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Enabled languages for the login switcher. Labels are catalog self-names.
|
|
25
|
+
* Omitted: the core en/zh toggle. Passed, including a single item: the menu.
|
|
26
|
+
*/
|
|
27
|
+
locales?: Array<{
|
|
28
|
+
code: string;
|
|
29
|
+
label: string;
|
|
30
|
+
}>;
|
|
23
31
|
/** Application logo URL */
|
|
24
32
|
appLogo?: string;
|
|
25
33
|
/** Privacy policy URL */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-page.d.ts","sourceRoot":"","sources":["../../src/pages/login-page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"login-page.d.ts","sourceRoot":"","sources":["../../src/pages/login-page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,0BAA0B;IAC1B,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAuGrE"}
|
package/dist/pages/login-page.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* JS uses a pre-built IIFE bundle from core/ui (LoginPage + runPasskeyAuth).
|
|
6
6
|
*/
|
|
7
7
|
import { assetUrl } from "../asset-registry.js";
|
|
8
|
+
import { resolvePageLocale } from "../locale.js";
|
|
8
9
|
import { CANCEL_TO_PARAM, RETURN_TO_PARAM } from "../login-url.js";
|
|
9
10
|
/** Escape string for safe embedding inside <script> — prevents XSS. */
|
|
10
11
|
function escapeForScript(s) {
|
|
@@ -14,6 +15,13 @@ function escapeForScript(s) {
|
|
|
14
15
|
function escapeForHTML(s) {
|
|
15
16
|
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
16
17
|
}
|
|
18
|
+
/** Document titles. Same sentences as core `signIn`, with the existing title casing. */
|
|
19
|
+
const SIGN_IN_TITLES = {
|
|
20
|
+
en: "Sign In",
|
|
21
|
+
zh: "登录",
|
|
22
|
+
"zh-TW": "登入",
|
|
23
|
+
ja: "ログイン",
|
|
24
|
+
};
|
|
17
25
|
export function renderLoginPage(config) {
|
|
18
26
|
const connectConfig = {
|
|
19
27
|
apiPrefix: config.apiPrefix,
|
|
@@ -25,6 +33,7 @@ export function renderLoginPage(config) {
|
|
|
25
33
|
methods: config.methods || ["passkey", "did-connect"],
|
|
26
34
|
oauthProviders: config.oauthProviders,
|
|
27
35
|
locale,
|
|
36
|
+
...(config.locales ? { locales: config.locales } : {}),
|
|
28
37
|
onSuccess: "__reload__",
|
|
29
38
|
appName: config.appName,
|
|
30
39
|
appLogo: config.appLogo,
|
|
@@ -41,8 +50,9 @@ export function renderLoginPage(config) {
|
|
|
41
50
|
const optionsJSON = escapeForScript(JSON.stringify(options));
|
|
42
51
|
// App-level default for the escape link, overridable per-navigation via ?cancel_to=
|
|
43
52
|
const cancelDefaultJSON = escapeForScript(JSON.stringify(config.cancelUrl || "/"));
|
|
44
|
-
const
|
|
45
|
-
const
|
|
53
|
+
const pageLocale = resolvePageLocale(locale);
|
|
54
|
+
const lang = pageLocale.htmlLang;
|
|
55
|
+
const signInText = SIGN_IN_TITLES[pageLocale.code] ?? "Sign In";
|
|
46
56
|
const title = config.appName ? `${escapeForHTML(config.appName)} — ${signInText}` : signInText;
|
|
47
57
|
return /* html */ `<!DOCTYPE html>
|
|
48
58
|
<html lang="${lang}">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-page.js","sourceRoot":"","sources":["../../src/pages/login-page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"login-page.js","sourceRoot":"","sources":["../../src/pages/login-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,59 @@
|
|
|
9
9
|
* For POST callbacks (Apple), the server passes code/state via function params
|
|
10
10
|
* since they are not available in the URL search params.
|
|
11
11
|
*/
|
|
12
|
+
type OAuthCallbackCopy = {
|
|
13
|
+
completing: string;
|
|
14
|
+
mayClose: string;
|
|
15
|
+
signInFailed: string;
|
|
16
|
+
missingCodeOrState: string;
|
|
17
|
+
invalidState: string;
|
|
18
|
+
invalidOrExpired: string;
|
|
19
|
+
stateMismatch: string;
|
|
20
|
+
};
|
|
21
|
+
export declare const OAUTH_CALLBACK_COPY: {
|
|
22
|
+
readonly en: {
|
|
23
|
+
readonly completing: "Completing sign in...";
|
|
24
|
+
readonly mayClose: "You may close this window.";
|
|
25
|
+
readonly signInFailed: "Sign in failed";
|
|
26
|
+
readonly missingCodeOrState: "Missing code or state";
|
|
27
|
+
readonly invalidState: "Invalid state";
|
|
28
|
+
readonly invalidOrExpired: "Invalid or expired OAuth state";
|
|
29
|
+
readonly stateMismatch: "State mismatch";
|
|
30
|
+
};
|
|
31
|
+
readonly zh: {
|
|
32
|
+
readonly completing: "正在完成登录…";
|
|
33
|
+
readonly mayClose: "您可以关闭此窗口。";
|
|
34
|
+
readonly signInFailed: "登录失败";
|
|
35
|
+
readonly missingCodeOrState: "缺少 code 或 state";
|
|
36
|
+
readonly invalidState: "state 无效";
|
|
37
|
+
readonly invalidOrExpired: "OAuth state 无效或已过期";
|
|
38
|
+
readonly stateMismatch: "state 不匹配";
|
|
39
|
+
};
|
|
40
|
+
readonly "zh-TW": {
|
|
41
|
+
readonly completing: "正在完成登入…";
|
|
42
|
+
readonly mayClose: "您可以關閉此視窗。";
|
|
43
|
+
readonly signInFailed: "登入失敗";
|
|
44
|
+
readonly missingCodeOrState: "缺少 code 或 state";
|
|
45
|
+
readonly invalidState: "state 無效";
|
|
46
|
+
readonly invalidOrExpired: "OAuth state 無效或已過期";
|
|
47
|
+
readonly stateMismatch: "state 不相符";
|
|
48
|
+
};
|
|
49
|
+
readonly ja: {
|
|
50
|
+
readonly completing: "ログインを完了しています…";
|
|
51
|
+
readonly mayClose: "このウィンドウを閉じてもかまいません。";
|
|
52
|
+
readonly signInFailed: "ログインに失敗しました";
|
|
53
|
+
readonly missingCodeOrState: "code または state がありません";
|
|
54
|
+
readonly invalidState: "state が無効です";
|
|
55
|
+
readonly invalidOrExpired: "OAuth state が無効か、期限切れです";
|
|
56
|
+
readonly stateMismatch: "state が一致しません";
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
export declare function oauthCallbackCopy(locale?: string): OAuthCallbackCopy;
|
|
12
60
|
export declare function renderOAuthCallbackPage(origin: string, params?: {
|
|
13
61
|
code?: string | null;
|
|
14
62
|
state?: string | null;
|
|
15
|
-
}): string;
|
|
63
|
+
}, locale?: string): string;
|
|
64
|
+
/** Error bridge. `error` is already the sentence (or provider code) to show. */
|
|
65
|
+
export declare function renderOAuthCallbackErrorHTML(origin: string, error: string, locale?: string): string;
|
|
66
|
+
export {};
|
|
16
67
|
//# sourceMappingURL=oauth-callback-page.d.ts.map
|
|
@@ -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;AAIH,KAAK,iBAAiB,GAAG;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC+B,CAAC;AAEhE,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAEpE;AAqBD,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,EACxD,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAuER;AAED,gFAAgF;AAChF,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAwBnG"}
|
|
@@ -9,23 +9,74 @@
|
|
|
9
9
|
* For POST callbacks (Apple), the server passes code/state via function params
|
|
10
10
|
* since they are not available in the URL search params.
|
|
11
11
|
*/
|
|
12
|
+
import { resolvePageLocale } from "../locale.js";
|
|
13
|
+
export const OAUTH_CALLBACK_COPY = {
|
|
14
|
+
en: {
|
|
15
|
+
completing: "Completing sign in...",
|
|
16
|
+
mayClose: "You may close this window.",
|
|
17
|
+
signInFailed: "Sign in failed",
|
|
18
|
+
missingCodeOrState: "Missing code or state",
|
|
19
|
+
invalidState: "Invalid state",
|
|
20
|
+
invalidOrExpired: "Invalid or expired OAuth state",
|
|
21
|
+
stateMismatch: "State mismatch",
|
|
22
|
+
},
|
|
23
|
+
zh: {
|
|
24
|
+
completing: "正在完成登录…",
|
|
25
|
+
mayClose: "您可以关闭此窗口。",
|
|
26
|
+
signInFailed: "登录失败",
|
|
27
|
+
missingCodeOrState: "缺少 code 或 state",
|
|
28
|
+
invalidState: "state 无效",
|
|
29
|
+
invalidOrExpired: "OAuth state 无效或已过期",
|
|
30
|
+
stateMismatch: "state 不匹配",
|
|
31
|
+
},
|
|
32
|
+
"zh-TW": {
|
|
33
|
+
completing: "正在完成登入…",
|
|
34
|
+
mayClose: "您可以關閉此視窗。",
|
|
35
|
+
signInFailed: "登入失敗",
|
|
36
|
+
missingCodeOrState: "缺少 code 或 state",
|
|
37
|
+
invalidState: "state 無效",
|
|
38
|
+
invalidOrExpired: "OAuth state 無效或已過期",
|
|
39
|
+
stateMismatch: "state 不相符",
|
|
40
|
+
},
|
|
41
|
+
ja: {
|
|
42
|
+
completing: "ログインを完了しています…",
|
|
43
|
+
mayClose: "このウィンドウを閉じてもかまいません。",
|
|
44
|
+
signInFailed: "ログインに失敗しました",
|
|
45
|
+
missingCodeOrState: "code または state がありません",
|
|
46
|
+
invalidState: "state が無効です",
|
|
47
|
+
invalidOrExpired: "OAuth state が無効か、期限切れです",
|
|
48
|
+
stateMismatch: "state が一致しません",
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
export function oauthCallbackCopy(locale) {
|
|
52
|
+
return OAUTH_CALLBACK_COPY[resolvePageLocale(locale).code];
|
|
53
|
+
}
|
|
12
54
|
/** Escape string for safe embedding inside <script> — prevents XSS breakout. */
|
|
13
55
|
function escapeForScript(s) {
|
|
14
56
|
return s.replace(/<\/(script)/gi, "<\\/$1");
|
|
15
57
|
}
|
|
16
|
-
|
|
58
|
+
function escapeHtml(s) {
|
|
59
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
60
|
+
}
|
|
61
|
+
function jsString(value) {
|
|
62
|
+
return escapeForScript(JSON.stringify(value));
|
|
63
|
+
}
|
|
64
|
+
const CALLBACK_STYLES = "body{margin:0;min-height:100vh;display:flex;align-items:center;justify-content:center;background:#0a0a0b;color:#9394a1;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;font-size:14px}" +
|
|
65
|
+
".wrap{text-align:center}" +
|
|
66
|
+
"@keyframes spin{to{transform:rotate(360deg)}}" +
|
|
67
|
+
".spinner{display:inline-block;width:20px;height:20px;border:2px solid rgba(255,255,255,0.15);border-top-color:#9280ff;border-radius:50%;animation:spin .6s linear infinite;margin-bottom:12px}";
|
|
68
|
+
export function renderOAuthCallbackPage(origin, params, locale) {
|
|
17
69
|
// For POST callbacks (Apple), embed code/state directly into the page
|
|
18
70
|
// since they won't be in location.search
|
|
19
71
|
const embeddedCode = params?.code ? escapeForScript(JSON.stringify(params.code)) : "null";
|
|
20
72
|
const embeddedState = params?.state ? escapeForScript(JSON.stringify(params.state)) : "null";
|
|
73
|
+
const copy = oauthCallbackCopy(locale);
|
|
74
|
+
const { htmlLang } = resolvePageLocale(locale);
|
|
21
75
|
return `<!DOCTYPE html>
|
|
22
|
-
<html><head><style>
|
|
23
|
-
|
|
24
|
-
.wrap{text-align:center}
|
|
25
|
-
@keyframes spin{to{transform:rotate(360deg)}}
|
|
26
|
-
.spinner{display:inline-block;width:20px;height:20px;border:2px solid rgba(255,255,255,0.15);border-top-color:#9280ff;border-radius:50%;animation:spin .6s linear infinite;margin-bottom:12px}
|
|
76
|
+
<html lang="${htmlLang}"><head><style>
|
|
77
|
+
${CALLBACK_STYLES}
|
|
27
78
|
</style></head><body>
|
|
28
|
-
<div class="wrap"><div class="spinner"></div><div id="status"
|
|
79
|
+
<div class="wrap"><div class="spinner"></div><div id="status">${escapeHtml(copy.completing)}</div></div>
|
|
29
80
|
<script>
|
|
30
81
|
var urlParams = new URLSearchParams(location.search);
|
|
31
82
|
var code = urlParams.get('code') || ${embeddedCode};
|
|
@@ -56,7 +107,7 @@ export function renderOAuthCallbackPage(origin, params) {
|
|
|
56
107
|
} else if (code && state) {
|
|
57
108
|
doFallbackExchange();
|
|
58
109
|
} else {
|
|
59
|
-
document.getElementById('status').textContent =
|
|
110
|
+
document.getElementById('status').textContent = ${jsString(copy.mayClose)};
|
|
60
111
|
}
|
|
61
112
|
|
|
62
113
|
// Server-side code exchange fallback.
|
|
@@ -85,4 +136,30 @@ export function renderOAuthCallbackPage(origin, params) {
|
|
|
85
136
|
</script>
|
|
86
137
|
</body></html>`;
|
|
87
138
|
}
|
|
139
|
+
/** Error bridge. `error` is already the sentence (or provider code) to show. */
|
|
140
|
+
export function renderOAuthCallbackErrorHTML(origin, error, locale) {
|
|
141
|
+
const copy = oauthCallbackCopy(locale);
|
|
142
|
+
const { htmlLang } = resolvePageLocale(locale);
|
|
143
|
+
const errorJson = escapeForScript(JSON.stringify(error));
|
|
144
|
+
const originJson = escapeForScript(JSON.stringify(origin));
|
|
145
|
+
return `<!DOCTYPE html>
|
|
146
|
+
<html lang="${htmlLang}"><head><style>
|
|
147
|
+
body{margin:0;min-height:100vh;display:flex;align-items:center;justify-content:center;background:#0a0a0b;color:#9394a1;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;font-size:14px}
|
|
148
|
+
.wrap{text-align:center} .err{color:#f87171;margin-top:12px}
|
|
149
|
+
</style></head><body>
|
|
150
|
+
<div class="wrap"><div id="status">${escapeHtml(copy.completing)}</div><div class="err" id="err"></div></div>
|
|
151
|
+
<script>
|
|
152
|
+
if (window.opener) {
|
|
153
|
+
window.opener.postMessage({
|
|
154
|
+
type: 'authorization_response',
|
|
155
|
+
error: ${errorJson}
|
|
156
|
+
}, ${originJson});
|
|
157
|
+
setTimeout(function() { window.close(); }, 300);
|
|
158
|
+
} else {
|
|
159
|
+
document.getElementById('status').textContent = ${jsString(copy.signInFailed)};
|
|
160
|
+
document.getElementById('err').textContent = ${errorJson};
|
|
161
|
+
}
|
|
162
|
+
</script>
|
|
163
|
+
</body></html>`;
|
|
164
|
+
}
|
|
88
165
|
//# sourceMappingURL=oauth-callback-page.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-callback-page.js","sourceRoot":"","sources":["../../src/pages/oauth-callback-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,gFAAgF;AAChF,SAAS,eAAe,CAAC,CAAS;IAChC,OAAO,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAAc,EACd,MAAwD;
|
|
1
|
+
{"version":3,"file":"oauth-callback-page.js","sourceRoot":"","sources":["../../src/pages/oauth-callback-page.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arcblock/did-connect-service",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.39",
|
|
4
4
|
"description": "Multi-runtime authentication service framework — Passkey, DID Connect, OAuth, Email, Team, RBAC",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -61,8 +61,8 @@
|
|
|
61
61
|
"sharp": "^0.35.4",
|
|
62
62
|
"ufo": "^1.6.4",
|
|
63
63
|
"valibot": "^1.4.2",
|
|
64
|
-
"@arcblock/did-connect-core": "^4.1.
|
|
65
|
-
"@arcblock/did-connect-js": "^4.1.
|
|
64
|
+
"@arcblock/did-connect-core": "^4.1.39",
|
|
65
|
+
"@arcblock/did-connect-js": "^4.1.39"
|
|
66
66
|
},
|
|
67
67
|
"optionalDependencies": {
|
|
68
68
|
"@aigne/afs": "^1.11.0-beta.13"
|