@abtnode/blocklet-services 1.16.45-beta-20250612-231219-481217be → 1.16.45-beta-20250618-073451-6e48fb62

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.
Files changed (182) hide show
  1. package/api/index.js +11 -5
  2. package/api/libs/connect/session.js +6 -273
  3. package/api/libs/kyc.js +1 -1
  4. package/api/routes/blocklet.js +1 -1
  5. package/api/routes/csp-proxy.js +13 -14
  6. package/api/routes/oauth/client.js +2 -1
  7. package/api/routes/user.js +1 -2
  8. package/api/services/auth/connect/bind-wallet.js +2 -44
  9. package/api/services/auth/connect/gen-access-key.js +1 -1
  10. package/api/services/auth/connect/verify-destroy.js +6 -2
  11. package/api/services/auth/connect/verify-elevated.js +7 -2
  12. package/api/services/auth/passport.js +20 -7
  13. package/api/services/auth/session.js +2 -2
  14. package/api/services/oauth/client.js +1 -179
  15. package/api/util/federated.js +1 -12
  16. package/dist/assets/{AdapterDayjs-BzjU9O7t.js → AdapterDayjs-T0keO70D.js} +1 -1
  17. package/dist/assets/{ArrowDropDown-CrJjI_sT.js → ArrowDropDown-DKq28w-B.js} +1 -1
  18. package/dist/assets/{CheckCircle-BcPSvH2E.js → CheckCircle-DYKWpCjc.js} +1 -1
  19. package/dist/assets/{ChevronLeft-Ch9iK6fF.js → ChevronLeft-C5ZElVOZ.js} +1 -1
  20. package/dist/assets/{ChevronRight-DclARA5k.js → ChevronRight-BDtG7F9C.js} +1 -1
  21. package/dist/assets/{DeleteOutline-CnS2XiM1.js → DeleteOutline-CYuYysba.js} +1 -1
  22. package/dist/assets/{Done-C9LPqADS.js → Done-C4iTqhTW.js} +1 -1
  23. package/dist/assets/{Download-D9LfWoxF.js → Download-CkjiFBw2.js} +1 -1
  24. package/dist/assets/{Edit-rPlryssW.js → Edit-D-oqMZ6h.js} +1 -1
  25. package/dist/assets/{Error-q_AhSCeT.js → Error-Dt1QvSlR.js} +1 -1
  26. package/dist/assets/{ExpandLess-Da2Rv9Ox.js → ExpandLess-CRv5O8qM.js} +1 -1
  27. package/dist/assets/{Google-Buu8u6PW.js → Google-DboCD85r.js} +1 -1
  28. package/dist/assets/{Home-DkCBzKe9.js → Home-CROW9qUz.js} +1 -1
  29. package/dist/assets/{InfoOutlined-C8ZBPUhD.js → InfoOutlined-B5f3YRb4.js} +1 -1
  30. package/dist/assets/{Launch-Nu8TBDKk.js → Launch-Cy-UlooC.js} +1 -1
  31. package/dist/assets/{LaunchOutlined-DQZ7S23O.js → LaunchOutlined-Bcn_86ca.js} +1 -1
  32. package/dist/assets/{MoreHoriz-Ba9rYlyz.js → MoreHoriz-H_VQNQ9b.js} +1 -1
  33. package/dist/assets/{PlayArrow-RVSfCmrB.js → PlayArrow-DZsdEeq_.js} +1 -1
  34. package/dist/assets/{TuneOutlined-CwV20zYf.js → TuneOutlined-GyTVf3HU.js} +1 -1
  35. package/dist/assets/{ViewList-D1BI4ac9.js → ViewList-D0tVfaVX.js} +1 -1
  36. package/dist/assets/{access-control-C-kFaf9T.js → access-control-C9hWo6TU.js} +1 -1
  37. package/dist/assets/{actions-DYQW2ChM.js → actions-BgkGoToI.js} +1 -1
  38. package/dist/assets/add-component-core-CpBArNQj.js +768 -0
  39. package/dist/assets/{add-resource-BdL-oJxe.js → add-resource-YRx2pKzx.js} +1 -1
  40. package/dist/assets/{addon-DMedfvRj.js → addon-DZBLWIf7.js} +1 -1
  41. package/dist/assets/{advanced-BZZToP_j.js → advanced-C9eBqn30.js} +1 -1
  42. package/dist/assets/api-C1S8LUld.js +1 -0
  43. package/dist/assets/{appearance-CYop22yw.js → appearance-DzftIlmu.js} +1 -1
  44. package/dist/assets/{ar-D9QEDjY-.js → ar-DLXKKOGO.js} +1 -1
  45. package/dist/assets/{audit-logs-BtBk6uAY.js → audit-logs-Cljb9yLV.js} +2 -2
  46. package/dist/assets/{authorize-CQZkUNyV.js → authorize-BS4vDs5i.js} +1 -1
  47. package/dist/assets/{base-chart-C2FJuVG1.js → base-chart-CoApVzod.js} +1 -1
  48. package/dist/assets/{base32-DEjena1X.js → base32-Cbt7-U8e.js} +1 -1
  49. package/dist/assets/{branding-gXMozCeI.js → branding-BuuaXyqZ.js} +1 -1
  50. package/dist/assets/{branding-7ppDxFZf.js → branding-uCV5ZREf.js} +2 -2
  51. package/dist/assets/{bundle-avatar-B5-ypzmO.js → bundle-avatar-CH2OoDP-.js} +1 -1
  52. package/dist/assets/{button-YPMo8IwK.js → button-ogiWKbo_.js} +1 -1
  53. package/dist/assets/{click-to-copy-BMX2P5UB.js → click-to-copy-D0HginOX.js} +1 -1
  54. package/dist/assets/{cloneDeep-Jl_OPbSo.js → cloneDeep-CDl5kZTY.js} +1 -1
  55. package/dist/assets/{collapse-9taxUXec.js → collapse-D4xd-ptF.js} +1 -1
  56. package/dist/assets/{complete-C8T0HN-B.js → complete-D2In_TeH.js} +1 -1
  57. package/dist/assets/{component-D6hOmRzO.js → component-DN1QsNYm.js} +72 -72
  58. package/dist/assets/{config-Sq1CUTiJ.js → config-DEbtcbH9.js} +1 -1
  59. package/dist/assets/{config-DcwlSddI.js → config-DS_kGhWk.js} +1 -1
  60. package/dist/assets/{config-navigation-IR_yUgmM.js → config-navigation-BB2LlxWl.js} +6 -6
  61. package/dist/assets/{config-space-C3fS58cn.js → config-space-DlQnLPiY.js} +1 -1
  62. package/dist/assets/{confirm-DApmnpvm.js → confirm-Bbp7EOHO.js} +1 -1
  63. package/dist/assets/{connect-BF4GoRL-.js → connect-CtbQgg8c.js} +1 -1
  64. package/dist/assets/connect-hUOpYByL.js +5 -0
  65. package/dist/assets/{connect-to-Bwfa2hMr.js → connect-to-EzXJLWP1.js} +1 -1
  66. package/dist/assets/{dashboard-B2X6c8E8.js → dashboard-CpxtvWAW.js} +3 -3
  67. package/dist/assets/{de-BOa43YBF.js → de-CnbmrteH.js} +1 -1
  68. package/dist/assets/{delete-confirm-BsEqJQRY.js → delete-confirm-BdthpUzC.js} +1 -1
  69. package/dist/assets/{did-address-L54dTMrT.js → did-address-DFiM35OM.js} +1 -1
  70. package/dist/assets/{domain-BGh0GDuZ.js → domain-C7iO-bfS.js} +1 -1
  71. package/dist/assets/{domain-action-card-DWqnvzry.js → domain-action-card-CqcqlPAn.js} +2 -2
  72. package/dist/assets/domains-z_Wu9ucc.js +1 -0
  73. package/dist/assets/{dot-iw3hN9HL.js → dot-4jhL56kz.js} +1 -1
  74. package/dist/assets/{email-By_nAv9m.js → email-CH6lvIGE.js} +1 -1
  75. package/dist/assets/{es-A3ma-OJp.js → es-C7oXJBWv.js} +1 -1
  76. package/dist/assets/{exchange-passport-BsgMfRJS.js → exchange-passport-F8-Xn3rX.js} +1 -1
  77. package/dist/assets/{fr-I3xKp6I5.js → fr-DzleTcLj.js} +1 -1
  78. package/dist/assets/{fuel-RMmgm9AQ.js → fuel-BRI4NZNF.js} +1 -1
  79. package/dist/assets/{gen-access-key-4teK8Dys.js → gen-access-key-CjcE_UoL.js} +1 -1
  80. package/dist/assets/{get-safe-url-B8xlSMyD.js → get-safe-url-BS4IIyYC.js} +1 -1
  81. package/dist/assets/{get-safe-url-t1C0E5Ux.js → get-safe-url-CuT70yLx.js} +1 -1
  82. package/dist/assets/{hi-DacRhM8A.js → hi-B24wH0bs.js} +1 -1
  83. package/dist/assets/{home-CmHUXg5q.js → home-B7IeN8M_.js} +1 -1
  84. package/dist/assets/{id-B7LQAHL7.js → id-BIjW1vW9.js} +1 -1
  85. package/dist/assets/{iframe-Dj9NLHp2.js → iframe-DYXqfKJj.js} +1 -1
  86. package/dist/assets/{index-BeE0KRva.js → index-0KJGv8YB.js} +1 -1
  87. package/dist/assets/{index-DXeoVV9Y.js → index-BAtw7eB6.js} +1 -1
  88. package/dist/assets/{index-DaM-GRtb.js → index-BEyvIdTp.js} +1 -1
  89. package/dist/assets/{index-CMYalRl2.js → index-BMCGWiyM.js} +52 -52
  90. package/dist/assets/{index-Inc_KF9k.js → index-BW2DapLf.js} +3 -3
  91. package/dist/assets/{index-BCtTVvHw.js → index-BxJZWVOT.js} +1 -1
  92. package/dist/assets/{index-Cs3-IS09.js → index-ClFIRXfV.js} +1 -1
  93. package/dist/assets/{index-DtZg53T9.js → index-CqrC0g0e.js} +1 -1
  94. package/dist/assets/{index-NnUiYa0L.js → index-D6ye_M7F.js} +1 -1
  95. package/dist/assets/{index-C8uNNoMb.js → index-D7U3pqVe.js} +5 -5
  96. package/dist/assets/{index-BzZuK-66.js → index-DDI23z2P.js} +1 -1
  97. package/dist/assets/{index-Mzv6hCex.js → index-DECQi8Vb.js} +1 -1
  98. package/dist/assets/{index-SX_KWrQh.js → index-DeekZg9t.js} +1 -1
  99. package/dist/assets/{index-Be8E3hiQ.js → index-DhXQuL-K.js} +4 -4
  100. package/dist/assets/{index-F85lIJcp.js → index-Dj3HMPh8.js} +1 -1
  101. package/dist/assets/{index-CJQbYw9E.js → index-Dl0q_c7r.js} +1 -1
  102. package/dist/assets/{index-CCOwwQoc.js → index-DyCrJT9-.js} +1 -1
  103. package/dist/assets/{index-Dgsq6V-N.js → index-WjR0qttM.js} +1 -1
  104. package/dist/assets/index-ZdwmM3LS.js +284 -0
  105. package/dist/assets/{index-Dfw2EDXA.js → index-mitJwLHE.js} +9 -9
  106. package/dist/assets/{index-CKY4HT0P.js → index-w4f-mlFt.js} +1 -1
  107. package/dist/assets/{invitation-Ck_kq3Tr.js → invitation-D7jOoJzU.js} +1 -1
  108. package/dist/assets/{invite-89aeW4Ho.js → invite-BiE9G1lr.js} +1 -1
  109. package/dist/assets/{issue-passport-4udVYVdq.js → issue-passport-BxmBoE32.js} +1 -1
  110. package/dist/assets/{item-D0U5vYXJ.js → item-BuWWRgL8.js} +1 -1
  111. package/dist/assets/{ja-DRQ4Eecl.js → ja-mu0bc5Fx.js} +1 -1
  112. package/dist/assets/{ko-CzL3UzwL.js → ko-CSWdQF8q.js} +1 -1
  113. package/dist/assets/{layout-CQb1lhEv.js → layout-Balq-c2F.js} +1 -1
  114. package/dist/assets/{list-KVxvPXZu.js → list-C4l_W2F_.js} +8 -8
  115. package/dist/assets/{list-BOdwWlS0.js → list-DBhbLnjZ.js} +2 -2
  116. package/dist/assets/localization-crkTHEvo.js +1 -0
  117. package/dist/assets/{log-DOIh9luu.js → log-CcBqhBEJ.js} +1 -1
  118. package/dist/assets/{logger-Dhaq1LDX.js → logger-tBhN561y.js} +1 -1
  119. package/dist/assets/{login-J6Bsrh3B.js → login-BF1AdZ-L.js} +1 -1
  120. package/dist/assets/{login-oauth-callback-BRmEibAb.js → login-oauth-callback-Cv5MlgIc.js} +1 -1
  121. package/dist/assets/{logo-uploader-Dzebv-rF.js → logo-uploader-C1N-bsM2.js} +3 -3
  122. package/dist/assets/lost-passport-C2Km75Ka.js +168 -0
  123. package/dist/assets/{omit-BlzmxIB5.js → omit-Cao4GLS7.js} +1 -1
  124. package/dist/assets/{open-window-Byi7CkW_.js → open-window-uY95lBbB.js} +1 -1
  125. package/dist/assets/{overview-ClOSCvvh.js → overview-BgK_P3ko.js} +1 -1
  126. package/dist/assets/{page-header-C_KAJILy.js → page-header-CiTTXRdM.js} +1 -1
  127. package/dist/assets/{passport-item-Du8-xENr.js → passport-item-fJ88Wv4t.js} +1 -1
  128. package/dist/assets/{permission-ClRym5FB.js → permission-CQWJVo4a.js} +1 -1
  129. package/dist/assets/{preferences-B6Y0XpLo.js → preferences-Uz2t9auQ.js} +1 -1
  130. package/dist/assets/{profile-embed-C_hd_hMh.js → profile-embed-C7ypVv2q.js} +1 -1
  131. package/dist/assets/{pt-CHKumXYv.js → pt-Odg8daEV.js} +1 -1
  132. package/dist/assets/publish-resource-DLqFuWGv.js +1 -0
  133. package/dist/assets/{react-beautiful-dnd.esm-CHsohizU.js → react-beautiful-dnd.esm-DMJVQVbv.js} +1 -1
  134. package/dist/assets/{ru-CvkEKhgU.js → ru-OkiNIvy3.js} +1 -1
  135. package/dist/assets/{runtime-D5P_2uNM.js → runtime-XL6C0WHV.js} +1 -1
  136. package/dist/assets/{sanitize-B18rcrOf.js → sanitize-e0A8A-yt.js} +1 -1
  137. package/dist/assets/sdk-D3QR4FNa.js +1 -0
  138. package/dist/assets/{security-CXewZHyS.js → security-C5-rO801.js} +1 -1
  139. package/dist/assets/{session-Bkvl2PSP.js → session-BDyIB4uh.js} +1 -1
  140. package/dist/assets/setup-Dpq6lpy4.js +30 -0
  141. package/dist/assets/{spaces-C1lh7et6.js → spaces-BR4I2U0t.js} +1 -1
  142. package/dist/assets/{start-BgSlMXsE.js → start-BTmB0MgK.js} +1 -1
  143. package/dist/assets/{starting-progress-BikYigPA.js → starting-progress-BsYL_5xB.js} +1 -1
  144. package/dist/assets/{status-DDvFiBxA.js → status-D8GKQyA3.js} +1 -1
  145. package/dist/assets/{step-actions-_23FIn8v.js → step-actions-njetG0Iy.js} +1 -1
  146. package/dist/assets/{studio-Db5oA_Tx.js → studio-DSEHQtAw.js} +1 -1
  147. package/dist/assets/{switch-control-BYqb8MZf.js → switch-control-BCB3_Ctk.js} +1 -1
  148. package/dist/assets/{table-tips-BW6G2sKO.js → table-tips-Cjv8HIcF.js} +1 -1
  149. package/dist/assets/{th-B2BUfjNJ.js → th-esLoaeiE.js} +1 -1
  150. package/dist/assets/{traffic-CUSLm0PX.js → traffic-DAzuj4ZR.js} +1 -1
  151. package/dist/assets/{transfer-CSsXAviu.js → transfer-NRpeYO3B.js} +1 -1
  152. package/dist/assets/{unsubscribe-BA46-fTa.js → unsubscribe-CBvTeTZf.js} +1 -1
  153. package/dist/assets/{use-blocklet-logo-CTCMbFiC.js → use-blocklet-logo-DwwmdicD.js} +1 -1
  154. package/dist/assets/use-server-logo-UTr-CyJD.js +1 -1
  155. package/dist/assets/{useAsync-DVHp96Uu.js → useAsync-C62uE2pS.js} +1 -1
  156. package/dist/assets/{useLocalStorage-DyVGBDlt.js → useLocalStorage-iQ2AmaOA.js} +1 -1
  157. package/dist/assets/{user-center-Cap4mg5H.js → user-center-CCOO4S3Y.js} +3 -3
  158. package/dist/assets/{util-DlS4tWs9.js → util-BK7oThoq.js} +1 -1
  159. package/dist/assets/{util-M3UFXQFT.js → util-paKPrRHx.js} +1 -1
  160. package/dist/assets/{vendor-arcblock-DiSm3oUX.js → vendor-arcblock-f1tICt1E.js} +59 -59
  161. package/dist/assets/{vendor-hooks-BFlOfe0M.js → vendor-hooks-DqdmWCmo.js} +1 -1
  162. package/dist/assets/{vendor-utils-BotmZdBm.js → vendor-utils-BfZ4tlod.js} +1 -1
  163. package/dist/assets/{vendor-ux-did-connect-DVX9lQ8a.js → vendor-ux-did-connect-BbCim3WZ.js} +89 -90
  164. package/dist/assets/{vi-BykmwIAT.js → vi-BF6u6-98.js} +1 -1
  165. package/dist/assets/wrap-locale-BLcZ6jMd.js +1 -0
  166. package/dist/assets/{zh-CbCaOuAd.js → zh-DJTjvgj8.js} +2 -2
  167. package/dist/assets/{zh-tw-C9JfiCVV.js → zh-tw-B7cFexwg.js} +1 -1
  168. package/dist/index.html +5 -5
  169. package/dist/service-worker.js +1 -1
  170. package/package.json +33 -33
  171. package/api/libs/auth/utils.js +0 -159
  172. package/dist/assets/add-component-core-UeQfX1b1.js +0 -768
  173. package/dist/assets/api-87p2GGd0.js +0 -1
  174. package/dist/assets/connect-Bf8y7fMm.js +0 -5
  175. package/dist/assets/domains-CdwErmIF.js +0 -1
  176. package/dist/assets/index-Bb7iSrGO.js +0 -284
  177. package/dist/assets/localization-OxVxEhoS.js +0 -1
  178. package/dist/assets/lost-passport-p5ZuXjnG.js +0 -168
  179. package/dist/assets/publish-resource-kHaYkbDE.js +0 -1
  180. package/dist/assets/sdk-CbugbTkF.js +0 -1
  181. package/dist/assets/setup-TPtYDnBB.js +0 -30
  182. package/dist/assets/wrap-locale-B8EvOR-l.js +0 -1
package/api/index.js CHANGED
@@ -909,12 +909,18 @@ self.blocklet = {
909
909
  proxy.off('open', setIsOpen);
910
910
  proxy.off('proxyReqWs', setProxyReq);
911
911
 
912
- socket.write('HTTP/1.1 502 Proxy Timeout\r\n\r\n', (error) => {
913
- if (error) {
914
- logger.error('ws socket timeout response error', { error });
915
- }
912
+ // Only write if socket is still open and writable
913
+ if (socket.writable && !socket.destroyed) {
914
+ socket.write('HTTP/1.1 502 Proxy Timeout\r\n\r\n', (error) => {
915
+ if (error) {
916
+ logger.error('ws socket timeout response error', { error });
917
+ }
918
+ socket.destroy();
919
+ });
920
+ // If already closed, just ensure it's destroyed
921
+ } else if (!socket.destroyed) {
916
922
  socket.destroy();
917
- });
923
+ }
918
924
 
919
925
  proxyReq?.destroy();
920
926
  proxyReq = null;
@@ -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, wallet: blockletWallet } = blockletInfo;
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 node.getUser({
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)
@@ -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 }) => {
@@ -422,7 +422,7 @@ module.exports = {
422
422
  routing: {
423
423
  webInterfaceCount,
424
424
  siteRuleCount,
425
- healthy,
425
+ running: healthy,
426
426
  },
427
427
  });
428
428
  });
@@ -2,6 +2,7 @@ const { getChainClient } = require('@abtnode/util/lib/get-chain-client');
2
2
  const { MAIN_CHAIN_ENDPOINT } = require('@abtnode/constant');
3
3
  const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
4
4
  const { default: axios } = require('axios');
5
+ const isUrl = require('is-url');
5
6
 
6
7
  const logger = require('../libs/logger')('blocklet-services:csp-proxy');
7
8
 
@@ -20,16 +21,18 @@ module.exports = {
20
21
  const { url } = req.query;
21
22
 
22
23
  if (!url) {
23
- res.status(400).send('Missing image URL');
24
+ res.status(400).send('Missing resource URL');
24
25
  }
25
26
 
26
- try {
27
- // 检查是否是一个有效的URL
28
- const urlObj = new URL(url);
27
+ if (!isUrl(url)) {
28
+ res.status(400).send('Invalid resource URL');
29
+ return;
30
+ }
29
31
 
30
- // 检查协议是否是https
31
- if (urlObj.protocol !== 'https:') {
32
- res.status(400).send('Invalid image URL');
32
+ try {
33
+ const tmp = new URL(url);
34
+ if (tmp.protocol !== 'https:') {
35
+ res.status(400).send('Invalid resource URL');
33
36
  return;
34
37
  }
35
38
 
@@ -51,16 +54,12 @@ module.exports = {
51
54
  response.data.on('error', (err) => {
52
55
  logger.error('Stream error:', err.message);
53
56
  if (!res.headersSent) {
54
- res.status(500).send('Error streaming the image');
57
+ res.status(500).send('Error streaming the resource');
55
58
  }
56
59
  });
57
60
  } catch (error) {
58
- if (error instanceof TypeError && error.message.includes('Invalid URL')) {
59
- res.status(400).send('Invalid image URL');
60
- return;
61
- }
62
- logger.error('Error fetching the image:', error.message);
63
- res.status(500).send('Could not fetch the image');
61
+ logger.error('Error fetching the resource:', { error, url });
62
+ res.status(400).send(`Could not fetch the resource: ${error.message}`);
64
63
  }
65
64
  });
66
65
  },
@@ -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');
@@ -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');
@@ -1,48 +1,6 @@
1
- const { bindWallet } = require('../../../libs/connect/session');
2
- const logger = require('../../../libs/logger')(require('../../../../package.json').name);
3
-
4
- const { onConnect, onApprove, authPrincipal } = bindWallet;
1
+ const { createBindWalletRoute } = require('@abtnode/auth/lib/bind-wallet');
5
2
 
6
3
  // eslint-disable-next-line no-unused-vars
7
4
  module.exports = function createRoutes(node, authenticator, createSessionToken) {
8
- return {
9
- action: 'bind-wallet',
10
- authPrincipal: false,
11
- claims: {
12
- authPrincipal: ({ extraParams: { locale, previousUserDid, email } }) => {
13
- return authPrincipal({ locale, previousUserDid, email });
14
- },
15
- },
16
- onConnect: ({ req, userDid, extraParams: { locale, passportId = '', componentId, previousUserDid } }) => {
17
- return onConnect({
18
- node,
19
- request: req,
20
- userDid,
21
- locale,
22
- passportId,
23
- componentId,
24
- previousUserDid,
25
- });
26
- },
27
-
28
- onAuth: async ({ claims, userDid, userPk, extraParams: { locale, previousUserDid }, req, baseUrl }) => {
29
- try {
30
- const result = await onApprove({
31
- node,
32
- request: req,
33
- locale,
34
- userDid,
35
- userPk,
36
- baseUrl,
37
- claims,
38
- previousUserDid,
39
- });
40
-
41
- return result;
42
- } catch (err) {
43
- logger.error('login.error', { error: err, userDid });
44
- throw new Error(err.message);
45
- }
46
- },
47
- };
5
+ return createBindWalletRoute({ node });
48
6
  };
@@ -3,10 +3,10 @@ const { messages } = require('@abtnode/auth/lib/auth');
3
3
  const { authenticateByVc } = require('@abtnode/auth/lib/server');
4
4
  const { PASSPORT_LOG_ACTION, SERVER_ROLES } = require('@abtnode/constant');
5
5
  const formatContext = require('@abtnode/util/lib/format-context');
6
+ const { PASSPORT_VC_TYPES } = require('@abtnode/auth/lib/util/transfer-passport');
6
7
 
7
8
  const logger = require('../../../libs/logger')('blocklet-service:connect-cli');
8
9
  const { utils } = require('../../../libs/connect/session');
9
- const { PASSPORT_VC_TYPES } = require('../../../libs/auth/utils');
10
10
  const { getTrustedIssuers } = require('../../../util/blocklet-utils');
11
11
 
12
12
  const allowedRoles = ['owner', 'admin'];
@@ -4,11 +4,11 @@ const { ROLES } = require('@abtnode/constant');
4
4
  const { getSourceAppPid } = require('@blocklet/sdk/lib/util/login');
5
5
  const { fromBase64 } = require('@ocap/util');
6
6
  const { LOGIN_PROVIDER } = require('@blocklet/constant');
7
+ const { PASSPORT_VC_TYPES } = require('@abtnode/auth/lib/util/transfer-passport');
7
8
 
8
9
  const { PASSPORT_LOG_ACTION } = require('@abtnode/constant');
9
10
  const logger = require('../../../libs/logger')();
10
11
  const { createTokenFn, getDidConnectVersion } = require('../../../util');
11
- const { PASSPORT_VC_TYPES } = require('../../../libs/auth/utils');
12
12
  const { getTrustedIssuers } = require('../../../util/blocklet-utils');
13
13
 
14
14
  const ALLOWED_ROLES = [ROLES.OWNER, ROLES.ADMIN, ROLES.MEMBER];
@@ -19,7 +19,11 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
19
19
  action: 'verify-destroy',
20
20
  onConnect: async ({ request, userDid, extraParams: { locale, payload, roles } }) => {
21
21
  const blocklet = await request.getBlocklet();
22
- const user = await node.getUser({ teamDid: blocklet.appPid, user: { did: userDid } });
22
+ const user = await node.getUser({
23
+ teamDid: blocklet.appPid,
24
+ user: { did: userDid },
25
+ options: { enableConnectedAccount: true },
26
+ });
23
27
  if (!user) {
24
28
  throw new Error(messages.notAllowed[locale]);
25
29
  }
@@ -5,8 +5,9 @@ const { LOGIN_PROVIDER } = require('@blocklet/constant');
5
5
  const { getSourceAppPid } = require('@blocklet/sdk/lib/util/login');
6
6
 
7
7
  const { PASSPORT_LOG_ACTION } = require('@abtnode/constant');
8
+ const { PASSPORT_VC_TYPES } = require('@abtnode/auth/lib/util/transfer-passport');
9
+
8
10
  const { createTokenFn, getDidConnectVersion } = require('../../../util');
9
- const { PASSPORT_VC_TYPES } = require('../../../libs/auth/utils');
10
11
  const { getTrustedIssuers } = require('../../../util/blocklet-utils');
11
12
 
12
13
  const allowedRoles = [ROLES.OWNER, ROLES.ADMIN, ROLES.MEMBER];
@@ -26,7 +27,11 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
26
27
  throw new Error(messages.notEnabled[locale]);
27
28
  }
28
29
 
29
- const user = await node.getUser({ teamDid: blocklet.appPid, user: { did: userDid } });
30
+ const user = await node.getUser({
31
+ teamDid: blocklet.appPid,
32
+ user: { did: userDid },
33
+ options: { enableConnectedAccount: true },
34
+ });
30
35
  if (!user) {
31
36
  throw new Error(messages.notAllowed[locale]);
32
37
  }
@@ -1,5 +1,14 @@
1
1
  const { getPassportStatus } = require('@abtnode/auth/lib/auth');
2
2
  const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
3
+ const { CustomError } = require('@blocklet/error');
4
+ const logger = require('../../libs/logger');
5
+
6
+ const messages = {
7
+ passportStatusCheckFailed: {
8
+ en: 'Failed to get passport status',
9
+ zh: '获取通行证状态失败',
10
+ },
11
+ };
3
12
 
4
13
  module.exports = {
5
14
  init(router, node) {
@@ -7,15 +16,19 @@ module.exports = {
7
16
  const { vcId, userDid, locale } = req.query;
8
17
  const teamDid = req.headers['x-blocklet-did'];
9
18
 
10
- // HACK: 这里的 req.query.teamDid 可能是 blocklet 容器化之前的 teamDid(等于 blocklet.yml did),需要根据这个 did 找到现有对应的 teamDid,否则无法使用在容器化之前颁发的通行证来登录
11
- const blocklet = await node.getBlocklet({ did: req.query.teamDid, useCache: true });
12
- if (teamDid !== blocklet?.meta?.did) {
13
- throw new Error('teamDid is invalid');
14
- }
19
+ try {
20
+ // HACK: 2025-06-13 经沟通,不再对 query 中的 teamDid 做校验,应该直接使用 req.headers['x-blocklet-did'] 中的 teamDid
21
+ const status = await getPassportStatus({ node, teamDid, userDid, vcId, locale });
15
22
 
16
- const status = await getPassportStatus({ node, teamDid, userDid, vcId, locale });
23
+ res.json(status);
24
+ } catch (err) {
25
+ logger.error('failed to get passport status', { teamDid, userDid, vcId, locale, err });
17
26
 
18
- res.json(status);
27
+ if (err instanceof CustomError) {
28
+ throw err;
29
+ }
30
+ throw new CustomError(500, messages.passportStatusCheckFailed[locale] || messages.passportStatusCheckFailed.en);
31
+ }
19
32
  });
20
33
  },
21
34
  };
@@ -113,10 +113,10 @@ module.exports = {
113
113
  // FIXME: @zhanghan BlockletSDK 和 Aistro 来的请求暂时不需要检查 visitorId,需要在 aistro 适配新的逻辑
114
114
  await req.ensureUser({ token, appPid, blockletInfo });
115
115
  } else {
116
- await req.ensureUser({ token, visitorId, appPid, blockletInfo });
116
+ await req.ensureUser({ token, appPid, blockletInfo, visitorId });
117
117
  }
118
118
  if (!req.user) {
119
- res.json({ user: null });
119
+ res.status(401).json({ error: 'not login' });
120
120
  return;
121
121
  }
122
122