@abtnode/blocklet-services 1.16.45-beta-20250610-112229-2eb0face → 1.16.45-beta-20250614-101901-d1700f8d
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/api/cache.js +36 -21
- package/api/libs/connect/session.js +8 -275
- package/api/libs/kyc.js +1 -1
- package/api/middlewares/proxy-to-daemon.js +6 -2
- package/api/routes/blocklet.js +25 -5
- package/api/routes/dns-resolver.js +1 -1
- package/api/routes/env.js +2 -1
- package/api/routes/oauth/client.js +2 -1
- package/api/routes/user.js +1 -2
- package/api/services/auth/connect/bind-wallet.js +2 -44
- package/api/services/auth/connect/gen-access-key.js +1 -1
- package/api/services/auth/connect/invite.js +1 -1
- package/api/services/auth/connect/issue-passport.js +1 -1
- package/api/services/auth/connect/verify-destroy.js +9 -8
- package/api/services/auth/connect/verify-elevated.js +15 -11
- package/api/services/auth/passport.js +20 -7
- package/api/services/auth/session.js +3 -3
- package/api/services/oauth/client.js +1 -179
- package/api/services/oauth/server.js +2 -1
- package/api/socket/channel/did.js +2 -2
- package/api/util/federated.js +1 -12
- package/dist/assets/{AdapterDayjs-Dvf_tKNm.js → AdapterDayjs-Cnt9tqu2.js} +1 -1
- package/dist/assets/{ArrowDropDown-w902LDz5.js → ArrowDropDown-BMwBndHf.js} +1 -1
- package/dist/assets/{CheckCircle-DKLAiayP.js → CheckCircle-41Yqmlux.js} +1 -1
- package/dist/assets/{ChevronLeft-DoQQtCAX.js → ChevronLeft-CLsrCaxE.js} +1 -1
- package/dist/assets/{ChevronRight-Ch_6RLsY.js → ChevronRight-BVlAyY8t.js} +1 -1
- package/dist/assets/{DeleteOutline-CPVsjCvJ.js → DeleteOutline-5003D11l.js} +1 -1
- package/dist/assets/{Done-C5C8-4SV.js → Done-LE-14AsK.js} +1 -1
- package/dist/assets/{Download-DqajrKRK.js → Download-BGEarAho.js} +1 -1
- package/dist/assets/{Edit-D_qzRYqq.js → Edit-CrL54Zhc.js} +1 -1
- package/dist/assets/{Error-KxELF1Nr.js → Error-quFZHb54.js} +1 -1
- package/dist/assets/{ExpandLess-JVHHKQQZ.js → ExpandLess-DJGiqXwX.js} +1 -1
- package/dist/assets/{Google-BBqC-Muc.js → Google-woDe3URG.js} +1 -1
- package/dist/assets/{Home-DD-eYV7C.js → Home-C0Jy-iyL.js} +1 -1
- package/dist/assets/{InfoOutlined-CEh25_NY.js → InfoOutlined-3bCMdMdL.js} +1 -1
- package/dist/assets/{Launch-Cs8Cmdb_.js → Launch-DrVQ-_LF.js} +1 -1
- package/dist/assets/{LaunchOutlined-CH9e3hkq.js → LaunchOutlined-DCRD1Xd5.js} +1 -1
- package/dist/assets/{MoreHoriz-Cpg0a_lm.js → MoreHoriz-CCqkD-2X.js} +1 -1
- package/dist/assets/{PlayArrow-Hu915_DX.js → PlayArrow-b0SwYNYM.js} +1 -1
- package/dist/assets/{TuneOutlined-DRDP7kDe.js → TuneOutlined-CfZi6Ajz.js} +1 -1
- package/dist/assets/{ViewList-DN8B89Ry.js → ViewList-DHazaGfw.js} +1 -1
- package/dist/assets/{access-control-MsBNowAW.js → access-control-CrHHfd-3.js} +1 -1
- package/dist/assets/{actions-CcWHhKZq.js → actions-DP5QUAr6.js} +1 -1
- package/dist/assets/add-component-core-8M0C-Kp3.js +768 -0
- package/dist/assets/{add-resource-LwzRr27k.js → add-resource-BTg7Qs0I.js} +1 -1
- package/dist/assets/{addon-Dju3pjTL.js → addon-BKkiKK74.js} +1 -1
- package/dist/assets/{advanced-DYaxCBlN.js → advanced-BaQVvy3K.js} +2 -2
- package/dist/assets/api-87p2GGd0.js +1 -0
- package/dist/assets/{appearance-A-FJhFPq.js → appearance-CuPgS_bN.js} +1 -1
- package/dist/assets/{ar-D9QEDjY-.js → ar-C_PbiO-w.js} +1 -1
- package/dist/assets/{audit-logs-Cs45RZoE.js → audit-logs-CUC_aqut.js} +2 -2
- package/dist/assets/{authorize-fdrPc1Nd.js → authorize-DCQNYqJl.js} +1 -1
- package/dist/assets/{base-chart-DIErGYHN.js → base-chart-C2FJuVG1.js} +1 -1
- package/dist/assets/{base32-Do9iD28a.js → base32-CRxHrKOV.js} +1 -1
- package/dist/assets/{branding-CT66qulY.js → branding-Di3by3dx.js} +2 -2
- package/dist/assets/{branding-OfbhdEgY.js → branding-DrCX9AmH.js} +1 -1
- package/dist/assets/{bundle-avatar-LAkmelll.js → bundle-avatar-hjU0GiOA.js} +1 -1
- package/dist/assets/{button-B_vgCyye.js → button-BWISngjs.js} +1 -1
- package/dist/assets/{click-to-copy-BfYfYud0.js → click-to-copy-DoEzJWuJ.js} +1 -1
- package/dist/assets/{cloneDeep-ro06l5HL.js → cloneDeep-Jl_OPbSo.js} +1 -1
- package/dist/assets/{collapse-DRY-fGId.js → collapse-QPZHNi8E.js} +1 -1
- package/dist/assets/{complete-kFFCUlMp.js → complete-EC4tK63r.js} +1 -1
- package/dist/assets/{component-DkUWDmEA.js → component-D9Dwvz3W.js} +3 -3
- package/dist/assets/{config-WtCW9USL.js → config-BMkCrsxC.js} +1 -1
- package/dist/assets/{config-Dw2MWXp7.js → config-OasAWfj3.js} +1 -1
- package/dist/assets/{config-navigation-DxvpF5im.js → config-navigation-BRSxDGox.js} +6 -6
- package/dist/assets/{config-space-CU10Rw2i.js → config-space-DlI-IdsO.js} +1 -1
- package/dist/assets/{confirm-Vh9bFw1L.js → confirm-C3U-iZgd.js} +1 -1
- package/dist/assets/connect-2DXv3-VS.js +5 -0
- package/dist/assets/{connect-lFo0rnUJ.js → connect-CJtKCJvL.js} +1 -1
- package/dist/assets/{connect-to-1dd-PxCa.js → connect-to-DJWMCDWB.js} +1 -1
- package/dist/assets/{dashboard-BS4bpY03.js → dashboard-Dswj6QO1.js} +3 -3
- package/dist/assets/{de-BOa43YBF.js → de-m_nuB8Qa.js} +1 -1
- package/dist/assets/{delete-confirm-CzUZlQMV.js → delete-confirm-BPN0b1Ew.js} +1 -1
- package/dist/assets/{did-address-Ca4O6-Gb.js → did-address-BW7HQteV.js} +1 -1
- package/dist/assets/{domain-action-card-BxEOdRG6.js → domain-action-card-DK0_bx6-.js} +2 -2
- package/dist/assets/{domain-CcapWTGW.js → domain-i1NE8m1K.js} +1 -1
- package/dist/assets/domains-CDhyGAuz.js +1 -0
- package/dist/assets/{dot-ClH4jhsr.js → dot-iw3hN9HL.js} +1 -1
- package/dist/assets/{email-BKF-qRvM.js → email-DLukryRf.js} +1 -1
- package/dist/assets/{es-A3ma-OJp.js → es-BrT673RG.js} +1 -1
- package/dist/assets/{exchange-passport-C05YacXz.js → exchange-passport-CtBW8-z_.js} +1 -1
- package/dist/assets/{fr-I3xKp6I5.js → fr-BmbyLkZB.js} +1 -1
- package/dist/assets/{fuel-D5i0LwEE.js → fuel-TZdSL_3D.js} +1 -1
- package/dist/assets/{gen-access-key-OYE9vkTV.js → gen-access-key-CqRouazq.js} +1 -1
- package/dist/assets/{get-safe-url-CJuFtnAD.js → get-safe-url-CROWoUui.js} +1 -1
- package/dist/assets/{get-safe-url-ClddTGUv.js → get-safe-url-DPUvqYEg.js} +1 -1
- package/dist/assets/{hi-DacRhM8A.js → hi-CL8_a9An.js} +1 -1
- package/dist/assets/{home-DR0M74FO.js → home-hnxCx6H0.js} +1 -1
- package/dist/assets/{id-B7LQAHL7.js → id-DkcL27A7.js} +1 -1
- package/dist/assets/{iframe-CymxKzen.js → iframe-BB2MTAjn.js} +1 -1
- package/dist/assets/{index-BbupHZzB.js → index-B6fg0S6c.js} +1 -1
- package/dist/assets/{index-Cphaf-Ek.js → index-BAbxWghb.js} +9 -9
- package/dist/assets/{index-BpvW-cUy.js → index-BCtTVvHw.js} +1 -1
- package/dist/assets/{index-BJQsWjyx.js → index-BVBJxqPd.js} +4 -4
- package/dist/assets/{index-CRe5KsOj.js → index-BXRM3Fxt.js} +1 -1
- package/dist/assets/{index-iO-8g74B.js → index-BdgSI0pZ.js} +1 -1
- package/dist/assets/{index-BTKm4T5J.js → index-C-reBQ41.js} +1 -1
- package/dist/assets/{index-Hgoqly4p.js → index-C5pIrCeP.js} +3 -3
- package/dist/assets/{index--zVoF7lp.js → index-CIN38Uuw.js} +1 -1
- package/dist/assets/{index-Dntq1ezd.js → index-CKY4HT0P.js} +1 -1
- package/dist/assets/{index-BSIauQNZ.js → index-C_MX-sJs.js} +4 -4
- package/dist/assets/{index-B354cP6P.js → index-CcRZdZB8.js} +1 -1
- package/dist/assets/{index-CMXod_BF.js → index-ClKx_csi.js} +1 -1
- package/dist/assets/{index-DqYKLMVq.js → index-CnSfgOR1.js} +1 -1
- package/dist/assets/{index-D5uPwJ6o.js → index-CsA1GkvG.js} +1 -1
- package/dist/assets/{index-BtF2_mmu.js → index-D3Sj3zCK.js} +1 -1
- package/dist/assets/{index-CaercczO.js → index-OIQ3e2Ld.js} +1 -1
- package/dist/assets/{index-DGclkoMp.js → index-S_bysQ3H.js} +1 -1
- package/dist/assets/{index-6_wWEItq.js → index-gRIImn2q.js} +51 -51
- package/dist/assets/{index-DZfl-BHr.js → index-vo14BOSK.js} +1 -1
- package/dist/assets/{index-DJmmHgxv.js → index-zlAFuATT.js} +1 -1
- package/dist/assets/{invitation-CHKJRReb.js → invitation-BvT07MYl.js} +1 -1
- package/dist/assets/{invite-BIyTLjFG.js → invite-rbOwUpQz.js} +1 -1
- package/dist/assets/{issue-passport-D_1dgjgm.js → issue-passport-DqDO2lOV.js} +1 -1
- package/dist/assets/{item-Cvm3RZ4-.js → item-Kx7a4SrL.js} +1 -1
- package/dist/assets/{ja-DRQ4Eecl.js → ja-BVJLb0qY.js} +1 -1
- package/dist/assets/{ko-CzL3UzwL.js → ko-Dd2Xcc8p.js} +1 -1
- package/dist/assets/{layout-7LZ3RpDb.js → layout-veO5MoKq.js} +1 -1
- package/dist/assets/{list-Bz8uJNpj.js → list-CzMORzTV.js} +1 -1
- package/dist/assets/{list-CqGQfIx9.js → list-fB7PuMGP.js} +2 -2
- package/dist/assets/localization-CWcvfX_h.js +1 -0
- package/dist/assets/{log-CEcMfPWb.js → log-DFvq1Ya8.js} +1 -1
- package/dist/assets/{logger-DMlN-IbM.js → logger-Ch0sfkGE.js} +1 -1
- package/dist/assets/{login-y0a0ypm7.js → login-Cc4U4UbE.js} +1 -1
- package/dist/assets/{login-oauth-callback-CnAgJXgp.js → login-oauth-callback-BH3tsO_b.js} +1 -1
- package/dist/assets/{logo-uploader-BAsVxZ3U.js → logo-uploader-BfnTtNB4.js} +3 -3
- package/dist/assets/lost-passport-CEk2gBj4.js +168 -0
- package/dist/assets/{omit-O1pUD7ku.js → omit-BlzmxIB5.js} +1 -1
- package/dist/assets/{open-window-B-GejaY2.js → open-window-DNB3B3k8.js} +1 -1
- package/dist/assets/{overview-V76wvba7.js → overview-DqaHfHTX.js} +1 -1
- package/dist/assets/{page-header-huQjTQSw.js → page-header-DmVEhivC.js} +1 -1
- package/dist/assets/{passport-item-tcnz8j0r.js → passport-item-Dw5vAzG8.js} +1 -1
- package/dist/assets/{permission-BfejVUva.js → permission-CmSuLv3N.js} +1 -1
- package/dist/assets/{preferences-6lvT1ugx.js → preferences-DoIPeyXx.js} +1 -1
- package/dist/assets/{profile-embed-BqPZ87OZ.js → profile-embed-BzGFlRQR.js} +1 -1
- package/dist/assets/{pt-CHKumXYv.js → pt-BfbUt_Nx.js} +1 -1
- package/dist/assets/publish-resource-Dbw9ICt4.js +1 -0
- package/dist/assets/{react-beautiful-dnd.esm-Btnab_OF.js → react-beautiful-dnd.esm-B9_jlyiB.js} +1 -1
- package/dist/assets/{ru-CvkEKhgU.js → ru-uXrAFAz0.js} +1 -1
- package/dist/assets/{runtime-qegegcsI.js → runtime-D90jDC3r.js} +1 -1
- package/dist/assets/{sanitize-DbZs1H_T.js → sanitize-B18rcrOf.js} +1 -1
- package/dist/assets/sdk-DDQwgEwY.js +1 -0
- package/dist/assets/{security-Cxiq1ziT.js → security-D8kq04bN.js} +1 -1
- package/dist/assets/{session-CwC5SgVz.js → session-igceijP1.js} +1 -1
- package/dist/assets/setup-n8Ikg3vS.js +30 -0
- package/dist/assets/{spaces-Cgazj3bm.js → spaces-DVZd70Fi.js} +1 -1
- package/dist/assets/{start-FFKcgzTb.js → start-YvnbU7Eo.js} +1 -1
- package/dist/assets/{starting-progress-CKWusmmh.js → starting-progress-BOsNmsFB.js} +1 -1
- package/dist/assets/{status-D98jk27v.js → status-BGmXEfM-.js} +1 -1
- package/dist/assets/{step-actions-Cp7vl1Uh.js → step-actions-_L8XSfG4.js} +1 -1
- package/dist/assets/{studio-CvtVT5aS.js → studio-BImlv1KI.js} +1 -1
- package/dist/assets/{switch-control-DCl96cpf.js → switch-control-CGm8CkkK.js} +1 -1
- package/dist/assets/{table-tips-DdnbF0LB.js → table-tips-C8uXQ5tF.js} +1 -1
- package/dist/assets/{th-B2BUfjNJ.js → th-BnT_StPj.js} +1 -1
- package/dist/assets/{traffic-Bf1b6xSQ.js → traffic-NFBtntJ-.js} +1 -1
- package/dist/assets/{transfer-ChzHdW_I.js → transfer-CJjNcsEy.js} +1 -1
- package/dist/assets/{unsubscribe-CRSsqbPw.js → unsubscribe-Co6pOu2N.js} +1 -1
- package/dist/assets/{use-blocklet-logo-D73B-sw0.js → use-blocklet-logo-BUV6ER3X.js} +1 -1
- package/dist/assets/{useAsync-B6ZHbOEG.js → useAsync-DVHp96Uu.js} +1 -1
- package/dist/assets/{useLocalStorage-B85cd9HR.js → useLocalStorage-Cw7tZL-P.js} +1 -1
- package/dist/assets/{user-center-h3PNeVcw.js → user-center-CHyAfsyF.js} +3 -3
- package/dist/assets/{util-B5wObXV8.js → util-BKry4J3y.js} +1 -1
- package/dist/assets/{util-SfP61JNJ.js → util-BfQiNudG.js} +1 -1
- package/dist/assets/{vendor-arcblock-qCd0o3Hz.js → vendor-arcblock-Cspz6Fmz.js} +14 -14
- package/dist/assets/{vendor-hooks-BCm626KH.js → vendor-hooks-BFlOfe0M.js} +1 -1
- package/dist/assets/vendor-utils-BotmZdBm.js +208 -0
- package/dist/assets/{vendor-ux-did-connect-dVrbSJfQ.js → vendor-ux-did-connect-ETVwYaIV.js} +91 -92
- package/dist/assets/{vi-BykmwIAT.js → vi-DmitUjjk.js} +1 -1
- package/dist/assets/wrap-locale-ugI1o5oc.js +1 -0
- package/dist/assets/{zh-CbCaOuAd.js → zh-syG1cNt6.js} +2 -2
- package/dist/assets/{zh-tw-C9JfiCVV.js → zh-tw-DnHJQaoN.js} +1 -1
- package/dist/index.html +5 -5
- package/dist/service-worker.js +1 -1
- package/package.json +34 -34
- package/api/libs/auth/utils.js +0 -159
- package/dist/assets/add-component-core-C3s0hRWv.js +0 -768
- package/dist/assets/api-CQoRx33p.js +0 -1
- package/dist/assets/connect-Cg0d_ebx.js +0 -5
- package/dist/assets/domains-C9MeMLdA.js +0 -1
- package/dist/assets/localization-gg0fgyqC.js +0 -1
- package/dist/assets/lost-passport-D-GKwrh2.js +0 -168
- package/dist/assets/publish-resource-BqdiC6O1.js +0 -1
- package/dist/assets/sdk-DOmS9lyP.js +0 -1
- package/dist/assets/setup-Dilg0too.js +0 -30
- package/dist/assets/vendor-utils-B3iZkn2R.js +0 -208
- package/dist/assets/wrap-locale-C5884ev0.js +0 -1
package/api/cache.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const { DBCache, getAbtNodeRedisAndSQLiteUrl } = require('@abtnode/db-cache');
|
|
2
2
|
const nodemailer = require('nodemailer');
|
|
3
|
+
const { LRUCache } = require('lru-cache');
|
|
3
4
|
const getBlockletInfo = require('@blocklet/meta/lib/info');
|
|
4
5
|
const { fromJSON } = require('@ocap/wallet');
|
|
5
6
|
|
|
@@ -7,52 +8,57 @@ const CACHE_TTL = 60 * 60 * 1000;
|
|
|
7
8
|
const SESSION_CACHE_DISABLED_USER_TTL = 86400 * 1000;
|
|
8
9
|
const SECURITY_CONFIG_TTL = 86400 * 1000;
|
|
9
10
|
|
|
11
|
+
const nonStandardCache = new LRUCache({
|
|
12
|
+
max: 100,
|
|
13
|
+
ttl: 60 * 60 * 1000, // cache for 1 hour
|
|
14
|
+
});
|
|
15
|
+
|
|
10
16
|
const cache = new DBCache(() => ({
|
|
11
|
-
...getAbtNodeRedisAndSQLiteUrl(),
|
|
12
17
|
prefix: 'services-base',
|
|
13
18
|
ttl: CACHE_TTL,
|
|
19
|
+
...getAbtNodeRedisAndSQLiteUrl(),
|
|
14
20
|
}));
|
|
15
21
|
|
|
16
22
|
const cacheNodeInfo = new DBCache(() => ({
|
|
17
|
-
...getAbtNodeRedisAndSQLiteUrl(),
|
|
18
23
|
prefix: 'services-node-state',
|
|
19
24
|
ttl: CACHE_TTL,
|
|
25
|
+
...getAbtNodeRedisAndSQLiteUrl(),
|
|
20
26
|
}));
|
|
21
27
|
|
|
22
28
|
const cacheBlocklet = new DBCache(() => ({
|
|
23
|
-
...getAbtNodeRedisAndSQLiteUrl(),
|
|
24
29
|
prefix: 'services-blocklet',
|
|
25
30
|
ttl: CACHE_TTL,
|
|
31
|
+
...getAbtNodeRedisAndSQLiteUrl(),
|
|
26
32
|
}));
|
|
27
33
|
|
|
28
34
|
const cacheBlockletInfo = new DBCache(() => ({
|
|
29
|
-
...getAbtNodeRedisAndSQLiteUrl(),
|
|
30
35
|
prefix: 'services-blocklet-info-v2',
|
|
31
36
|
ttl: CACHE_TTL,
|
|
37
|
+
...getAbtNodeRedisAndSQLiteUrl(),
|
|
32
38
|
}));
|
|
33
39
|
|
|
34
40
|
const cacheRule = new DBCache(() => ({
|
|
35
|
-
...getAbtNodeRedisAndSQLiteUrl(),
|
|
36
41
|
prefix: 'services-rule',
|
|
37
42
|
ttl: CACHE_TTL,
|
|
43
|
+
...getAbtNodeRedisAndSQLiteUrl(),
|
|
38
44
|
}));
|
|
39
45
|
|
|
40
46
|
const cacheNotificationConfig = new DBCache(() => ({
|
|
41
|
-
...getAbtNodeRedisAndSQLiteUrl(),
|
|
42
47
|
prefix: 'services-notification-config',
|
|
43
48
|
ttl: CACHE_TTL,
|
|
49
|
+
...getAbtNodeRedisAndSQLiteUrl(),
|
|
44
50
|
}));
|
|
45
51
|
|
|
46
52
|
const cacheSessionDisabledUser = new DBCache(() => ({
|
|
47
|
-
...getAbtNodeRedisAndSQLiteUrl(),
|
|
48
53
|
prefix: 'services-session-cache-disabled-user',
|
|
49
54
|
ttl: SESSION_CACHE_DISABLED_USER_TTL,
|
|
55
|
+
...getAbtNodeRedisAndSQLiteUrl(),
|
|
50
56
|
}));
|
|
51
57
|
|
|
52
58
|
const cacheSecurityConfig = new DBCache(() => ({
|
|
53
|
-
...getAbtNodeRedisAndSQLiteUrl(),
|
|
54
59
|
prefix: 'services-security-config',
|
|
55
60
|
ttl: SECURITY_CONFIG_TTL,
|
|
61
|
+
...getAbtNodeRedisAndSQLiteUrl(),
|
|
56
62
|
}));
|
|
57
63
|
|
|
58
64
|
cache.getNodeInfo = ({ node }) => {
|
|
@@ -65,14 +71,10 @@ cache.deleteNodeInfo = () => {
|
|
|
65
71
|
cacheNodeInfo.del('base');
|
|
66
72
|
};
|
|
67
73
|
|
|
68
|
-
cache.getBlocklet =
|
|
69
|
-
|
|
74
|
+
cache.getBlocklet = ({ did, node, force, context }) => {
|
|
75
|
+
return cacheBlocklet.autoCache(force ? null : did, () => {
|
|
70
76
|
return node.getBlocklet({ did, useCache: !force }, context);
|
|
71
77
|
});
|
|
72
|
-
// if (!blocklet || !blocklet.did) {
|
|
73
|
-
// return null;
|
|
74
|
-
// }
|
|
75
|
-
return blocklet;
|
|
76
78
|
};
|
|
77
79
|
|
|
78
80
|
cache.getBlockletInfo = async ({ did, node, context }) => {
|
|
@@ -116,14 +118,27 @@ cache.getTransport = ({ did, config, force }) => {
|
|
|
116
118
|
if (!did) {
|
|
117
119
|
return null;
|
|
118
120
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
121
|
+
|
|
122
|
+
const cacheKey = did;
|
|
123
|
+
|
|
124
|
+
if (!force) {
|
|
125
|
+
const exist = nonStandardCache.get(cacheKey);
|
|
126
|
+
if (exist) {
|
|
127
|
+
return exist;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const transporter = nodemailer.createTransport({
|
|
132
|
+
host: config.host,
|
|
133
|
+
port: config.port,
|
|
134
|
+
secure: !!config.secure,
|
|
135
|
+
auth: { user: config.user, pass: config.password },
|
|
126
136
|
});
|
|
137
|
+
if (transporter) {
|
|
138
|
+
nonStandardCache.set(cacheKey, transporter);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return transporter;
|
|
127
142
|
};
|
|
128
143
|
|
|
129
144
|
cache.getSecurityConfig = ({ did, url, force = false, getDataFn } = {}) => {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// Holds shared logic for session-manager v1 and v2
|
|
2
2
|
const get = require('lodash/get');
|
|
3
|
-
const merge = require('lodash/merge');
|
|
4
3
|
const { joinURL } = require('ufo');
|
|
5
4
|
const formatContext = require('@abtnode/util/lib/format-context');
|
|
6
5
|
const { extractUserAvatar, getAppAvatarUrl } = require('@abtnode/util/lib/user');
|
|
@@ -8,7 +7,6 @@ const {
|
|
|
8
7
|
messages,
|
|
9
8
|
validatePassportStatus,
|
|
10
9
|
getPassportStatusEndpoint,
|
|
11
|
-
getApplicationInfo,
|
|
12
10
|
verifyNFT,
|
|
13
11
|
canSessionBeElevated,
|
|
14
12
|
} = require('@abtnode/auth/lib/auth');
|
|
@@ -33,9 +31,7 @@ const {
|
|
|
33
31
|
const { CustomError } = require('@blocklet/error');
|
|
34
32
|
const { getKeyPairClaim, getAuthPrincipalForMigrateAppToV2 } = require('@abtnode/auth/lib/server');
|
|
35
33
|
const { checkInvitedUserOnly } = require('@abtnode/auth/lib/oauth');
|
|
36
|
-
const { fromAppDid } = require('@arcblock/did-ext');
|
|
37
34
|
const { LOGIN_PROVIDER, BLOCKLET_APP_SPACE_REQUIREMENT, DID_SPACES } = require('@blocklet/constant');
|
|
38
|
-
const createTranslator = require('@abtnode/util/lib/translate');
|
|
39
35
|
const {
|
|
40
36
|
getBlockletAppIdList,
|
|
41
37
|
forEachBlockletSync,
|
|
@@ -50,16 +46,15 @@ const { PASSPORT_LOG_ACTION, PASSPORT_SOURCE, PASSPORT_STATUS } = require('@abtn
|
|
|
50
46
|
const { getDeviceData } = require('@abtnode/util/lib/device');
|
|
51
47
|
const { getVerifyAccessClaims } = require('@abtnode/auth/lib/server');
|
|
52
48
|
const getOrigin = require('@abtnode/util/lib/get-origin');
|
|
49
|
+
const { PASSPORT_VC_TYPES } = require('@abtnode/auth/lib/util/transfer-passport');
|
|
50
|
+
const bindWallet = require('@abtnode/auth/lib/util/bind-wallet');
|
|
53
51
|
|
|
54
52
|
const logger = require('../logger')('connect');
|
|
55
53
|
const { createTokenFn, getDidConnectVersion } = require('../../util');
|
|
56
|
-
const { transferPassport, PASSPORT_VC_TYPES } = require('../auth/utils');
|
|
57
|
-
const { migrateAccount, declareAccount } = require('../../services/oauth/client');
|
|
58
54
|
const { getKycClaims, verifyKycClaims, getPassportVc, getProfileItems } = require('../kyc');
|
|
59
55
|
const { getTrustedIssuers, getFederatedTrustedIssuers } = require('../../util/blocklet-utils');
|
|
60
56
|
const {
|
|
61
57
|
getUserAvatarUrl,
|
|
62
|
-
migrateFederatedAccount,
|
|
63
58
|
getFederatedMaster,
|
|
64
59
|
shouldSyncFederated,
|
|
65
60
|
getUserWithinFederated,
|
|
@@ -250,14 +245,14 @@ module.exports = {
|
|
|
250
245
|
* }} param0
|
|
251
246
|
* @returns
|
|
252
247
|
*/
|
|
253
|
-
onConnect: async ({ node, request, userDid, locale = 'en', passportId = '', action, baseUrl, inviter }) => {
|
|
248
|
+
onConnect: async ({ node, request, userDid, userPk, locale = 'en', passportId = '', action, baseUrl, inviter }) => {
|
|
254
249
|
/**
|
|
255
250
|
* @type {import('@abtnode/client').BlockletState}
|
|
256
251
|
*/
|
|
257
252
|
const blocklet = await request.getBlocklet();
|
|
258
253
|
const { accessPolicyConfig } = await request.getSecurityConfig({ id: SECURITY_RULE_DEFAULT_ID });
|
|
259
254
|
const blockletInfo = await request.getBlockletInfo();
|
|
260
|
-
const { did: teamDid
|
|
255
|
+
const { did: teamDid } = blockletInfo;
|
|
261
256
|
const sourceAppPid = getSourceAppPid(request);
|
|
262
257
|
|
|
263
258
|
const profileItems = getProfileItems(blocklet.settings?.session, request.context.didwallet);
|
|
@@ -269,16 +264,7 @@ module.exports = {
|
|
|
269
264
|
},
|
|
270
265
|
};
|
|
271
266
|
|
|
272
|
-
const user = await
|
|
273
|
-
teamDid: blocklet.meta.did,
|
|
274
|
-
user: {
|
|
275
|
-
did: userDid,
|
|
276
|
-
},
|
|
277
|
-
options: {
|
|
278
|
-
enableConnectedAccount: true,
|
|
279
|
-
blockletSk: blockletWallet.secretKey,
|
|
280
|
-
},
|
|
281
|
-
});
|
|
267
|
+
const user = await getUserWithinFederated({ sourceAppPid, teamDid, userDid, userPk }, { node, blocklet });
|
|
282
268
|
|
|
283
269
|
const isInvitedUserOnly = accessPolicyConfig
|
|
284
270
|
? await checkInvitedUserOnly(accessPolicyConfig, node, teamDid)
|
|
@@ -726,7 +712,7 @@ module.exports = {
|
|
|
726
712
|
walletOS,
|
|
727
713
|
emailVerified: updatedUser.emailVerified,
|
|
728
714
|
phoneVerified: updatedUser.phoneVerified,
|
|
729
|
-
elevated: canSessionBeElevated(role,
|
|
715
|
+
elevated: canSessionBeElevated(role, blocklet?.settings),
|
|
730
716
|
},
|
|
731
717
|
{ ...sessionConfig, didConnectVersion: getDidConnectVersion(request) }
|
|
732
718
|
);
|
|
@@ -1120,7 +1106,7 @@ module.exports = {
|
|
|
1120
1106
|
walletOS: request.context.didwallet.os,
|
|
1121
1107
|
emailVerified: user.emailVerified,
|
|
1122
1108
|
phoneVerified: user.phoneVerified,
|
|
1123
|
-
elevated: canSessionBeElevated(role,
|
|
1109
|
+
elevated: canSessionBeElevated(role, blocklet?.settings),
|
|
1124
1110
|
},
|
|
1125
1111
|
{ ...sessionConfig, didConnectVersion: getDidConnectVersion(request) }
|
|
1126
1112
|
);
|
|
@@ -1129,260 +1115,7 @@ module.exports = {
|
|
|
1129
1115
|
},
|
|
1130
1116
|
|
|
1131
1117
|
// 给 Auth0 绑定 DID Wallet 账户,基本流程与 login 一致,但在创建更新用户信息的逻辑不一样
|
|
1132
|
-
bindWallet
|
|
1133
|
-
authPrincipal: ({ email, locale, previousUserDid }) => {
|
|
1134
|
-
const user = email || previousUserDid;
|
|
1135
|
-
|
|
1136
|
-
const message =
|
|
1137
|
-
locale === 'zh' ? `将你的 DID Wallet 与账号 ${user} 绑定` : `Connect your DID Wallet with ${user}`;
|
|
1138
|
-
|
|
1139
|
-
return {
|
|
1140
|
-
description: message,
|
|
1141
|
-
supervised: true,
|
|
1142
|
-
};
|
|
1143
|
-
},
|
|
1144
|
-
onConnect: async ({ node, request, userDid, locale, previousUserDid }) => {
|
|
1145
|
-
const translations = {
|
|
1146
|
-
en: {
|
|
1147
|
-
notFound: "Couldn't find account information.",
|
|
1148
|
-
alreadyBindOAuth: 'Your wallet account ({did}) is already bond to another email.',
|
|
1149
|
-
alreadyBindWallet: 'Your email is already bond to another wallet account {did}.',
|
|
1150
|
-
alreadyMainAccount:
|
|
1151
|
-
'Your wallet account is already bond to this app. You cannot bind it again. Please use another wallet account or create a new one to try again.',
|
|
1152
|
-
},
|
|
1153
|
-
zh: {
|
|
1154
|
-
notFound: '无法获取账户信息。',
|
|
1155
|
-
alreadyBindOAuth: '你的钱包账户 {did} 已经与其他账户绑定。',
|
|
1156
|
-
alreadyBindWallet: '当前账户已经绑定过钱包账户 {did}。',
|
|
1157
|
-
alreadyMainAccount: '你的钱包账户 {did} 已绑定过该应用,无法重复绑定,请切换或新建一个钱包账户再次尝试。',
|
|
1158
|
-
},
|
|
1159
|
-
};
|
|
1160
|
-
const t = createTranslator({ translations });
|
|
1161
|
-
const { did: teamDid } = await request.getBlockletInfo();
|
|
1162
|
-
|
|
1163
|
-
const walletUser = await node.getUser({ teamDid, user: { did: userDid } });
|
|
1164
|
-
if (walletUser) {
|
|
1165
|
-
throw new Error(t('alreadyMainAccount', locale, { did: userDid }));
|
|
1166
|
-
}
|
|
1167
|
-
|
|
1168
|
-
const oauthUser = await node.getUser({
|
|
1169
|
-
teamDid,
|
|
1170
|
-
user: {
|
|
1171
|
-
did: previousUserDid,
|
|
1172
|
-
},
|
|
1173
|
-
options: {
|
|
1174
|
-
enableConnectedAccount: true,
|
|
1175
|
-
},
|
|
1176
|
-
});
|
|
1177
|
-
if (!oauthUser) {
|
|
1178
|
-
throw new Error(t('notFound', locale, { email: oauthUser.email }));
|
|
1179
|
-
}
|
|
1180
|
-
|
|
1181
|
-
const sourceProvider = oauthUser.sourceProvider || LOGIN_PROVIDER.WALLET;
|
|
1182
|
-
const oauthConnectedAccounts = oauthUser.connectedAccounts || [];
|
|
1183
|
-
const exist = oauthConnectedAccounts.find((item) => item.provider === LOGIN_PROVIDER.WALLET);
|
|
1184
|
-
if (exist) {
|
|
1185
|
-
throw new Error(t('alreadyBindWallet', locale, { email: oauthUser.email, did: exist.did }));
|
|
1186
|
-
}
|
|
1187
|
-
|
|
1188
|
-
const bindUser = await node.getUser({
|
|
1189
|
-
teamDid,
|
|
1190
|
-
user: {
|
|
1191
|
-
did: userDid,
|
|
1192
|
-
},
|
|
1193
|
-
options: {
|
|
1194
|
-
enableConnectedAccount: true,
|
|
1195
|
-
},
|
|
1196
|
-
});
|
|
1197
|
-
|
|
1198
|
-
if (bindUser) {
|
|
1199
|
-
const bindConnectedAccounts = bindUser.connectedAccounts || [];
|
|
1200
|
-
if (bindConnectedAccounts.find((item) => item.provider === sourceProvider)) {
|
|
1201
|
-
throw new Error(t('alreadyBindOAuth', locale, { email: oauthUser.email, did: userDid }));
|
|
1202
|
-
}
|
|
1203
|
-
}
|
|
1204
|
-
|
|
1205
|
-
const claims = {
|
|
1206
|
-
profile: {
|
|
1207
|
-
type: 'profile',
|
|
1208
|
-
description: messages.description[locale],
|
|
1209
|
-
items: ['fullName', 'avatar'],
|
|
1210
|
-
},
|
|
1211
|
-
};
|
|
1212
|
-
|
|
1213
|
-
// 至少需要一个 claim
|
|
1214
|
-
if (oauthUser.avatar) {
|
|
1215
|
-
delete claims.profile;
|
|
1216
|
-
}
|
|
1217
|
-
if (Object.keys(claims).length > 0) {
|
|
1218
|
-
return claims;
|
|
1219
|
-
}
|
|
1220
|
-
|
|
1221
|
-
return [];
|
|
1222
|
-
},
|
|
1223
|
-
onApprove: async ({ node, request, locale, userDid, userPk, claims, previousUserDid, baseUrl }) => {
|
|
1224
|
-
const blocklet = await request.getBlocklet();
|
|
1225
|
-
const sourceAppPid = getSourceAppPid(request);
|
|
1226
|
-
const blockletInfo = await request.getBlockletInfo();
|
|
1227
|
-
const { did: teamDid, wallet: blockletWallet } = blockletInfo;
|
|
1228
|
-
|
|
1229
|
-
const oauthUser = await node.getUser({ teamDid, user: { did: previousUserDid } });
|
|
1230
|
-
const nodeInfo = await request.getNodeInfo();
|
|
1231
|
-
// Check user approved
|
|
1232
|
-
let bindUser = await node.getUser({
|
|
1233
|
-
teamDid,
|
|
1234
|
-
user: {
|
|
1235
|
-
did: userDid,
|
|
1236
|
-
},
|
|
1237
|
-
options: {
|
|
1238
|
-
enableConnectedAccount: true,
|
|
1239
|
-
},
|
|
1240
|
-
});
|
|
1241
|
-
if (bindUser && !bindUser.approved) {
|
|
1242
|
-
throw new Error(messages.notAllowedAppUser[locale]);
|
|
1243
|
-
}
|
|
1244
|
-
|
|
1245
|
-
const { dataDir } = await getApplicationInfo({ node, nodeInfo, teamDid });
|
|
1246
|
-
|
|
1247
|
-
const profileOld = claims.find((x) => x.type === 'profile') || { avatar: null };
|
|
1248
|
-
const avatar = await extractUserAvatar(oauthUser.avatar || profileOld.avatar, { dataDir });
|
|
1249
|
-
const profile = {
|
|
1250
|
-
fullName: oauthUser.fullName,
|
|
1251
|
-
avatar,
|
|
1252
|
-
email: oauthUser.email,
|
|
1253
|
-
};
|
|
1254
|
-
|
|
1255
|
-
if (sourceAppPid) {
|
|
1256
|
-
try {
|
|
1257
|
-
await migrateFederatedAccount({
|
|
1258
|
-
// 目前只允许未注册过的钱包绑定 auth0,所以直接传入钱包生成的 userDid 和 userPk
|
|
1259
|
-
toUserDid: userDid,
|
|
1260
|
-
toUserPk: userPk,
|
|
1261
|
-
fromUserDid: previousUserDid,
|
|
1262
|
-
blockletInfo,
|
|
1263
|
-
blocklet,
|
|
1264
|
-
});
|
|
1265
|
-
} catch (error) {
|
|
1266
|
-
logger.error('Failed to migrate federated account', {
|
|
1267
|
-
error,
|
|
1268
|
-
toUserDid: userDid,
|
|
1269
|
-
fromUserDid: previousUserDid,
|
|
1270
|
-
});
|
|
1271
|
-
|
|
1272
|
-
if (error?.response?.data) {
|
|
1273
|
-
throw new Error(error.response.data);
|
|
1274
|
-
}
|
|
1275
|
-
throw error;
|
|
1276
|
-
}
|
|
1277
|
-
} else {
|
|
1278
|
-
const connectedAccounts = oauthUser?.connectedAccounts || [];
|
|
1279
|
-
const sourceProvider = oauthUser?.sourceProvider;
|
|
1280
|
-
const oauthAccount = connectedAccounts.find((item) => item.provider === sourceProvider);
|
|
1281
|
-
const userWallet = fromAppDid(oauthAccount.id, blockletWallet.secretKey);
|
|
1282
|
-
await declareAccount({ wallet: userWallet, blocklet });
|
|
1283
|
-
await migrateAccount({ wallet: userWallet, blocklet, user: { did: userDid, pk: userPk } });
|
|
1284
|
-
}
|
|
1285
|
-
|
|
1286
|
-
// TODO: 获取当前登录使用的 passport(无法获取到 passport.id)
|
|
1287
|
-
// 使用最近一次使用的 passport 来代替
|
|
1288
|
-
const mergePassport = (oauthUser.passports || []).reduce((sum, cur) => {
|
|
1289
|
-
return upsertToPassports(sum, cur);
|
|
1290
|
-
}, bindUser?.passports || []);
|
|
1291
|
-
const mergeProfile = merge(profile, {
|
|
1292
|
-
email: bindUser?.email,
|
|
1293
|
-
fullName: bindUser?.fullName,
|
|
1294
|
-
avatar: bindUser?.avatar,
|
|
1295
|
-
inviter: bindUser?.inviter,
|
|
1296
|
-
generation: bindUser?.generation,
|
|
1297
|
-
emailVerified: bindUser?.emailVerified,
|
|
1298
|
-
phoneVerified: bindUser?.phoneVerified,
|
|
1299
|
-
});
|
|
1300
|
-
const currentTime = new Date().toISOString();
|
|
1301
|
-
|
|
1302
|
-
const connectedAccount = {
|
|
1303
|
-
provider: LOGIN_PROVIDER.WALLET,
|
|
1304
|
-
did: userDid,
|
|
1305
|
-
pk: userPk,
|
|
1306
|
-
lastLoginAt: currentTime,
|
|
1307
|
-
firstLoginAt: currentTime,
|
|
1308
|
-
userInfo: {
|
|
1309
|
-
wallet: request.context.didwallet,
|
|
1310
|
-
},
|
|
1311
|
-
};
|
|
1312
|
-
|
|
1313
|
-
await node.updateUser({
|
|
1314
|
-
teamDid,
|
|
1315
|
-
user: {
|
|
1316
|
-
did: oauthUser.did,
|
|
1317
|
-
pk: oauthUser.pk,
|
|
1318
|
-
...mergeProfile,
|
|
1319
|
-
lastLoginIp: getRequestIP(request),
|
|
1320
|
-
connectedAccounts: [connectedAccount],
|
|
1321
|
-
passports: mergePassport,
|
|
1322
|
-
},
|
|
1323
|
-
});
|
|
1324
|
-
const masterSite = getFederatedMaster(blocklet);
|
|
1325
|
-
// NOTICE: 采用异步来更新,不阻塞接口的正常响应
|
|
1326
|
-
if (shouldSyncFederated(sourceAppPid, blocklet)) {
|
|
1327
|
-
const syncUserData = {
|
|
1328
|
-
did: oauthUser.did,
|
|
1329
|
-
pk: oauthUser.pk,
|
|
1330
|
-
...mergeProfile,
|
|
1331
|
-
connectedAccount: [connectedAccount],
|
|
1332
|
-
};
|
|
1333
|
-
if (syncUserData.avatar) {
|
|
1334
|
-
syncUserData.avatar = getUserAvatarUrl(syncUserData.avatar, blocklet);
|
|
1335
|
-
}
|
|
1336
|
-
node.syncFederated({
|
|
1337
|
-
did: teamDid,
|
|
1338
|
-
data: {
|
|
1339
|
-
users: [
|
|
1340
|
-
{
|
|
1341
|
-
...syncUserData,
|
|
1342
|
-
action: 'connectAccount',
|
|
1343
|
-
sourceAppPid: sourceAppPid || masterSite.appPid,
|
|
1344
|
-
},
|
|
1345
|
-
],
|
|
1346
|
-
},
|
|
1347
|
-
});
|
|
1348
|
-
}
|
|
1349
|
-
|
|
1350
|
-
if (!bindUser) {
|
|
1351
|
-
bindUser = {
|
|
1352
|
-
...oauthUser,
|
|
1353
|
-
// 发送 passport 的对象要设置为 wallet-did
|
|
1354
|
-
did: userDid,
|
|
1355
|
-
pk: userPk,
|
|
1356
|
-
};
|
|
1357
|
-
}
|
|
1358
|
-
|
|
1359
|
-
// FIXME:@zhanghan 统一登录的 passport 相关问题后续统一处理
|
|
1360
|
-
await transferPassport(oauthUser, bindUser, {
|
|
1361
|
-
req: request,
|
|
1362
|
-
node,
|
|
1363
|
-
nodeInfo,
|
|
1364
|
-
teamDid,
|
|
1365
|
-
baseUrl,
|
|
1366
|
-
revokePassport: true,
|
|
1367
|
-
});
|
|
1368
|
-
|
|
1369
|
-
await node.createAuditLog(
|
|
1370
|
-
{
|
|
1371
|
-
action: 'connectAccount',
|
|
1372
|
-
args: { teamDid, connectedAccount, provider: LOGIN_PROVIDER.WALLET, userDid: oauthUser.did },
|
|
1373
|
-
context: formatContext(Object.assign(request, { user: oauthUser })),
|
|
1374
|
-
result: bindUser,
|
|
1375
|
-
},
|
|
1376
|
-
node
|
|
1377
|
-
);
|
|
1378
|
-
|
|
1379
|
-
return {
|
|
1380
|
-
nextWorkflowData: {
|
|
1381
|
-
userDid,
|
|
1382
|
-
},
|
|
1383
|
-
};
|
|
1384
|
-
},
|
|
1385
|
-
},
|
|
1118
|
+
bindWallet,
|
|
1386
1119
|
|
|
1387
1120
|
migrateToStructV2: {
|
|
1388
1121
|
authPrincipal: false,
|
package/api/libs/kyc.js
CHANGED
|
@@ -8,10 +8,10 @@ const { Hasher } = require('@ocap/mcrypto');
|
|
|
8
8
|
const { LOGIN_PROVIDER } = require('@blocklet/constant');
|
|
9
9
|
const { messages, getVCFromClaims } = require('@abtnode/auth/lib/auth');
|
|
10
10
|
const { getPassportClaimUrl, getKycAcquireUrl } = require('@abtnode/auth/lib/passport');
|
|
11
|
+
const { PASSPORT_VC_TYPES } = require('@abtnode/auth/lib/util/transfer-passport');
|
|
11
12
|
const logger = require('@abtnode/logger')('@abtnode/blocklet-services/kyc');
|
|
12
13
|
|
|
13
14
|
const { getTrustedIssuers } = require('../util/blocklet-utils');
|
|
14
|
-
const { PASSPORT_VC_TYPES } = require('./auth/utils');
|
|
15
15
|
const { api } = require('./api');
|
|
16
16
|
|
|
17
17
|
const getPassportVc = async ({ claims, challenge, locale, trustedIssuers, types = PASSPORT_VC_TYPES }) => {
|
|
@@ -5,7 +5,7 @@ const { AUTH_CERT_TYPE, WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/cons
|
|
|
5
5
|
const { BLOCKLET_TENANT_MODES } = require('@blocklet/constant');
|
|
6
6
|
|
|
7
7
|
const proxyToDaemon = ({ proxy, node }) => {
|
|
8
|
-
const getToken = async (did, tenantMode, user) =>
|
|
8
|
+
const getToken = async (did, tenantMode, user, settings) =>
|
|
9
9
|
jwt.sign(
|
|
10
10
|
{
|
|
11
11
|
type: AUTH_CERT_TYPE.BLOCKLET_USER,
|
|
@@ -16,6 +16,7 @@ const proxyToDaemon = ({ proxy, node }) => {
|
|
|
16
16
|
elevated: user.elevated,
|
|
17
17
|
kyc: user.kyc,
|
|
18
18
|
provider: user.provider,
|
|
19
|
+
esh: settings?.enableSessionHardening, // ensureBlockletSettings.enableSessionHardening, 方便 proxy gql 中获取 blocklet SessionHardening
|
|
19
20
|
},
|
|
20
21
|
await node.getSessionSecret(),
|
|
21
22
|
{ expiresIn: '1h' }
|
|
@@ -26,10 +27,13 @@ const proxyToDaemon = ({ proxy, node }) => {
|
|
|
26
27
|
// did returned ty req.getBlockletDid() is blocklet.meta.did
|
|
27
28
|
// the blocklet.meta.did is always the same as appPid in structV2 application
|
|
28
29
|
const did = req.getBlockletDid();
|
|
30
|
+
const blocklet = await req.getBlocklet();
|
|
31
|
+
|
|
29
32
|
const token = await getToken(
|
|
30
33
|
did,
|
|
31
34
|
req.tenantMode || BLOCKLET_TENANT_MODES.SINGLE,
|
|
32
|
-
pick(req.user, ['did', 'role', 'elevated', 'kyc', 'provider'])
|
|
35
|
+
pick(req.user, ['did', 'role', 'elevated', 'kyc', 'provider']),
|
|
36
|
+
blocklet?.settings
|
|
33
37
|
);
|
|
34
38
|
|
|
35
39
|
req.headers.source = 'blocklet-service';
|
package/api/routes/blocklet.js
CHANGED
|
@@ -41,12 +41,12 @@ const {
|
|
|
41
41
|
ROLES,
|
|
42
42
|
USER_AVATAR_URL_PREFIX,
|
|
43
43
|
WELLKNOWN_BLOCKLET_HEALTH_PATH,
|
|
44
|
+
PASSPORT_SOURCE,
|
|
45
|
+
PASSPORT_LOG_ACTION,
|
|
46
|
+
PASSPORT_ISSUE_ACTION,
|
|
44
47
|
} = require('@abtnode/constant');
|
|
45
|
-
const { PASSPORT_SOURCE, PASSPORT_LOG_ACTION, PASSPORT_ISSUE_ACTION } = require('@abtnode/constant');
|
|
46
|
-
|
|
47
48
|
const { createDownloadLogStream } = require('@abtnode/core/lib/util/log');
|
|
48
|
-
|
|
49
|
-
const { BlockletStatus } = require('@blocklet/constant');
|
|
49
|
+
const { BlockletStatus, BLOCKLET_INTERFACE_TYPE_WEB } = require('@blocklet/constant');
|
|
50
50
|
|
|
51
51
|
const logger = require('../libs/logger')();
|
|
52
52
|
const { checkAdminPermission } = require('../middlewares/check-permission');
|
|
@@ -394,17 +394,37 @@ module.exports = {
|
|
|
394
394
|
}
|
|
395
395
|
|
|
396
396
|
const components = {};
|
|
397
|
+
let webInterfaceCount = 0;
|
|
397
398
|
forEachComponentV2Sync(blocklet, (component) => {
|
|
398
399
|
components[component.meta.did] = {
|
|
399
400
|
running: component.status === BlockletStatus.running,
|
|
400
401
|
};
|
|
402
|
+
|
|
403
|
+
const hasWebInterface = (component.meta?.interfaces || []).some((x) => x.type === BLOCKLET_INTERFACE_TYPE_WEB);
|
|
404
|
+
if (hasWebInterface) {
|
|
405
|
+
webInterfaceCount++;
|
|
406
|
+
}
|
|
401
407
|
});
|
|
402
408
|
|
|
403
409
|
if (blocklet.status !== BlockletStatus.running) {
|
|
404
410
|
return res.status(503).json({ message: 'not running', components });
|
|
405
411
|
}
|
|
406
412
|
|
|
407
|
-
|
|
413
|
+
const siteRuleCount = blocklet.site?.rules?.length || 0;
|
|
414
|
+
let healthy = true;
|
|
415
|
+
if (webInterfaceCount > 0 && siteRuleCount <= 0) {
|
|
416
|
+
healthy = false;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
return res.json({
|
|
420
|
+
message: 'ok',
|
|
421
|
+
components,
|
|
422
|
+
routing: {
|
|
423
|
+
webInterfaceCount,
|
|
424
|
+
siteRuleCount,
|
|
425
|
+
running: healthy,
|
|
426
|
+
},
|
|
427
|
+
});
|
|
408
428
|
});
|
|
409
429
|
|
|
410
430
|
server.get(`${WELLKNOWN_BLOCKLET_HEALTH_PATH}/:componentId`, cors({ origin: true }), async (req, res) => {
|
|
@@ -5,9 +5,9 @@ const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
|
|
|
5
5
|
module.exports = {
|
|
6
6
|
init(app) {
|
|
7
7
|
const cache = new DBCache(() => ({
|
|
8
|
-
...getAbtNodeRedisAndSQLiteUrl(),
|
|
9
8
|
prefix: 'services-dns-resolver',
|
|
10
9
|
ttl: 5 * 60 * 1000,
|
|
10
|
+
...getAbtNodeRedisAndSQLiteUrl(),
|
|
11
11
|
}));
|
|
12
12
|
|
|
13
13
|
app.get(`${WELLKNOWN_SERVICE_PATH_PREFIX}/api/dns-resolve/`, async (req, res) => {
|
package/api/routes/env.js
CHANGED
|
@@ -29,6 +29,7 @@ module.exports = {
|
|
|
29
29
|
`https://${getDidDomainForBlocklet({ did: info.did })}${serverPort}`,
|
|
30
30
|
info.routing?.adminPath || '/'
|
|
31
31
|
);
|
|
32
|
+
const isSessionHardeningEnabled = blocklet?.settings?.enableSessionHardening;
|
|
32
33
|
|
|
33
34
|
res.send(`window.env = {
|
|
34
35
|
did: "${blockletInfo.did}",
|
|
@@ -46,7 +47,7 @@ module.exports = {
|
|
|
46
47
|
serverEndpoint: "${serverEndpoint}",
|
|
47
48
|
serverVersion: "${info.version}",
|
|
48
49
|
mode: "${info.mode}",
|
|
49
|
-
enableSessionHardening: ${
|
|
50
|
+
enableSessionHardening: ${isSessionHardeningEnabled || false},
|
|
50
51
|
ownerNft: ${JSON.stringify(info.ownerNft || '')},
|
|
51
52
|
launcher: ${JSON.stringify(info.launcher || '')},
|
|
52
53
|
runtimeConfig: {
|
|
@@ -14,6 +14,8 @@ const { CustomError } = require('@blocklet/error');
|
|
|
14
14
|
const { LOGIN_PROVIDER } = require('@blocklet/constant');
|
|
15
15
|
const { withHttps, withTrailingSlash } = require('ufo');
|
|
16
16
|
const { getLastUsedPassport } = require('@abtnode/auth/lib/passport');
|
|
17
|
+
const { getAvatarByEmail, getAvatarByUrl } = require('@abtnode/util/lib/user');
|
|
18
|
+
const { transferPassport } = require('@abtnode/auth/lib/util/transfer-passport');
|
|
17
19
|
|
|
18
20
|
const logger = require('../../libs/logger')('oauth:client');
|
|
19
21
|
const { OauthClient } = require('../../libs/auth');
|
|
@@ -22,7 +24,6 @@ const OAuthAuth0Legacy = require('../../libs/auth/adapters/auth0-legacy');
|
|
|
22
24
|
const OAuthGithub = require('../../libs/auth/adapters/github');
|
|
23
25
|
const OAuthGoogle = require('../../libs/auth/adapters/google');
|
|
24
26
|
const OAuthApple = require('../../libs/auth/adapters/apple');
|
|
25
|
-
const { getAvatarByEmail, transferPassport, getAvatarByUrl } = require('../../libs/auth/utils');
|
|
26
27
|
const initJwt = require('../../libs/jwt');
|
|
27
28
|
const { sendToUser } = require('../../libs/notification');
|
|
28
29
|
const { createTokenFn, getDidConnectVersion, redirectWithoutCache } = require('../../util');
|
package/api/routes/user.js
CHANGED
|
@@ -26,13 +26,12 @@ const createTranslator = require('@abtnode/util/lib/translate');
|
|
|
26
26
|
const { getDeviceData } = require('@abtnode/util/lib/device');
|
|
27
27
|
const { Op } = require('sequelize');
|
|
28
28
|
const getOrigin = require('@abtnode/util/lib/get-origin');
|
|
29
|
+
const { getAvatarByEmail, getAvatarByUrl } = require('@abtnode/util/lib/user');
|
|
29
30
|
|
|
30
31
|
const { createTokenFn, getDidConnectVersion } = require('../util');
|
|
31
32
|
const initJwt = require('../libs/jwt');
|
|
32
|
-
const { getAvatarByUrl } = require('../libs/auth/utils');
|
|
33
33
|
const { loginWalletSchema, loginOAuthSchema, loginUserWalletSchema, checkUserSchema } = require('../validators/login');
|
|
34
34
|
const verifySig = require('../middlewares/verify-sig');
|
|
35
|
-
const { getAvatarByEmail } = require('../libs/auth/utils');
|
|
36
35
|
const logger = require('../libs/logger')('user');
|
|
37
36
|
const ensureBlocklet = require('../middlewares/ensure-blocklet');
|
|
38
37
|
const checkUser = require('../middlewares/check-user');
|