@abtnode/blocklet-services 1.16.42-beta-20250413-121549-22e9a196 → 1.16.42-beta-20250415-222652-04c5d2fe

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 (340) hide show
  1. package/api/index.js +4 -3
  2. package/api/libs/auth/index.js +5 -5
  3. package/api/libs/connect/session.js +29 -3
  4. package/api/libs/jwt.js +36 -1
  5. package/api/routes/federated.js +1 -1
  6. package/api/routes/mcp.js +26 -13
  7. package/api/routes/{oauth.js → oauth/client.js} +22 -21
  8. package/api/routes/oauth/server.js +95 -0
  9. package/api/routes/user.js +5 -4
  10. package/api/services/auth/connect/gen-access-key.js +92 -0
  11. package/api/services/auth/index.js +8 -0
  12. package/api/services/auth/passkey.js +1 -1
  13. package/api/services/auth/session.js +2 -3
  14. package/api/services/dashboard/index.js +6 -0
  15. package/api/services/mcp/server.js +151 -32
  16. package/api/services/notification/queue.js +9 -6
  17. package/api/services/oauth/server.js +213 -0
  18. package/api/util/index.js +1 -1
  19. package/api/util/user-util.js +1 -21
  20. package/dist/assets/AdapterDayjs-BLBXeg9J.js +3 -0
  21. package/dist/assets/{ArrowDropDown-a-C4j7Lx.js → ArrowDropDown--dAaadP8.js} +1 -1
  22. package/dist/assets/{CheckCircle-CuYzdCtm.js → CheckCircle-Av1UotA-.js} +1 -1
  23. package/dist/assets/{ChevronLeft-CnflXey6.js → ChevronLeft-De8Da-PB.js} +1 -1
  24. package/dist/assets/{ChevronRight-DE7hYCb3.js → ChevronRight-CQOI2CyK.js} +1 -1
  25. package/dist/assets/{Community-C8NtUXNH.js → Community-B_YqAP9P.js} +1 -1
  26. package/dist/assets/{DeleteOutline-PGhagisl.js → DeleteOutline-Cgoi-K0i.js} +1 -1
  27. package/dist/assets/{Done-BVaQae1-.js → Done-BYuUlh_s.js} +1 -1
  28. package/dist/assets/{Download-DNNh4N1T.js → Download-DUKR_Wkm.js} +1 -1
  29. package/dist/assets/Edit-D2RQMivt.js +1 -0
  30. package/dist/assets/{EditIcon-Y1U-3M09.js → EditIcon-5ixNT5sW.js} +1 -1
  31. package/dist/assets/{Email-BYzCrU9G.js → Email-RGD-rKFl.js} +1 -1
  32. package/dist/assets/{Error-C4dVUMw4.js → Error-By0ZMWzh.js} +1 -1
  33. package/dist/assets/{ExpandLess-Blh1x-4z.js → ExpandLess-BNGLjxae.js} +1 -1
  34. package/dist/assets/{Google-CAujGJ1A.js → Google-tZCjvU7D.js} +1 -1
  35. package/dist/assets/{Holiday-DxDxhx5X.js → Holiday-C_1hMIGZ.js} +1 -1
  36. package/dist/assets/{InfoOutlined-DF9JwavD.js → InfoOutlined-DSoJjRQo.js} +1 -1
  37. package/dist/assets/{Launch-gOz_lwLg.js → Launch-B161pSEw.js} +1 -1
  38. package/dist/assets/{LaunchOutlined-MbSPR9qn.js → LaunchOutlined-wehxIahb.js} +1 -1
  39. package/dist/assets/{Location-CEwgGcA5.js → Location-B6FoL795.js} +1 -1
  40. package/dist/assets/{LockIcon-D7BH0t_p.js → LockIcon-D3vSMIOk.js} +1 -1
  41. package/dist/assets/{Meeting-BJz5QiFc.js → Meeting-BfKca-xn.js} +1 -1
  42. package/dist/assets/{MoreHoriz-CGWVyYh4.js → MoreHoriz-Bo_R2nuS.js} +1 -1
  43. package/dist/assets/{OffSick--msvqLGm.js → OffSick-QPPyYyU6.js} +1 -1
  44. package/dist/assets/{Phone-CDl3oDYG.js → Phone-_lRBpoVi.js} +1 -1
  45. package/dist/assets/{PlayArrow-CxWt6459.js → PlayArrow-D38lbyGo.js} +1 -1
  46. package/dist/assets/{QuestionMarkCircle-CPHZnM6u.js → QuestionMarkCircle-B4EnwYju.js} +1 -1
  47. package/dist/assets/{ServerLogo-vX_nf8Sc.js → ServerLogo-BW4PKwV0.js} +1 -1
  48. package/dist/assets/{Timezone-uXi4_8BX.js → Timezone-bYzGwn3x.js} +1 -1
  49. package/dist/assets/{TuneOutlined-DcqnBMqE.js → TuneOutlined-DMMtKa6E.js} +1 -1
  50. package/dist/assets/{ViewList-B6eveRY-.js → ViewList-CMIoKrN6.js} +1 -1
  51. package/dist/assets/{WorkingRemotely-CK4z1-Sd.js → WorkingRemotely-BK9_vlZ-.js} +1 -1
  52. package/dist/assets/{access-control-Dxyg5dpc.js → access-control-DLD9n3S7.js} +1 -1
  53. package/dist/assets/actions-CMsM02NP.js +1 -0
  54. package/dist/assets/add-component-core-FnU4dwXM.js +763 -0
  55. package/dist/assets/{add-resource-BetUBTvt.js → add-resource-CubCXHBS.js} +1 -1
  56. package/dist/assets/{addon-B1aBsfOX.js → addon-5JaI2ctX.js} +1 -1
  57. package/dist/assets/advanced-D4wfoh0v.js +14 -0
  58. package/dist/assets/api-3sG9at7i.js +1 -0
  59. package/dist/assets/appearance-BUsj4DWC.js +1 -0
  60. package/dist/assets/{ar-DrRqcx2b.js → ar-BUQWR0Zu.js} +1 -1
  61. package/dist/assets/{ar-Cb5zQ0go.js → ar-CMzth4YC.js} +3 -3
  62. package/dist/assets/{audit-logs-SSAqJt40.js → audit-logs-rk_iUYcM.js} +3 -3
  63. package/dist/assets/authorize-CDJXjmiI.js +1 -0
  64. package/dist/assets/{base32-iVyUiizz.js → base32-BhlNgZPk.js} +1 -1
  65. package/dist/assets/{branding-BDuOcSfH.js → branding-BBbE2Klb.js} +1 -1
  66. package/dist/assets/branding-JQ1914RB.js +40 -0
  67. package/dist/assets/{bundle-avatar-DfAWUEqX.js → bundle-avatar-woUZoGoi.js} +1 -1
  68. package/dist/assets/button-Rx3uHycr.js +1 -0
  69. package/dist/assets/click-to-copy-BxZJa7n5.js +1 -0
  70. package/dist/assets/cloneDeep-kMVNpUap.js +1 -0
  71. package/dist/assets/{complete-R99mlHBI.js → complete-KnPBZq-P.js} +2 -2
  72. package/dist/assets/{component-By64LaLD.js → component-fD-EGTLm.js} +80 -80
  73. package/dist/assets/{config-BvNNOdw8.js → config-8xeoVfWN.js} +2 -2
  74. package/dist/assets/{config-BHBxeyYh.js → config-DbqQgRSU.js} +1 -1
  75. package/dist/assets/{config-navigation-CPd_4svD.js → config-navigation-DrgPbe5I.js} +6 -6
  76. package/dist/assets/{config-space-BgWEAM0m.js → config-space-DZ9w_4_9.js} +1 -1
  77. package/dist/assets/confirm-_RIb3OmR.js +7 -0
  78. package/dist/assets/connect-CJOq1BXE.js +5 -0
  79. package/dist/assets/{connect-Bq-p3hnS.js → connect-CPIImVme.js} +1 -1
  80. package/dist/assets/{connect-to-bQVCrkhh.js → connect-to-BdhN0BHi.js} +1 -1
  81. package/dist/assets/{content-layout-CFHoSupA.js → content-layout-BM34AwsG.js} +1 -1
  82. package/dist/assets/dashboard-vsk4QHJ1.js +275 -0
  83. package/dist/assets/de-BkBUnf4o.js +13 -0
  84. package/dist/assets/{de-BRPos3d1.js → de-_X0eQXZu.js} +1 -1
  85. package/dist/assets/delete-confirm-DaoAi4Gz.js +1 -0
  86. package/dist/assets/did-address-CGHn52xI.js +1 -0
  87. package/dist/assets/domain-BJUSWYGQ.js +9 -0
  88. package/dist/assets/domain-action-card-9r42-rWK.js +29 -0
  89. package/dist/assets/domains-BNDFk-7R.js +1 -0
  90. package/dist/assets/{email-JviRloBo.js → email-fp1LVcF6.js} +3 -3
  91. package/dist/assets/empty-spinner-Ict2ItjU.js +1 -0
  92. package/dist/assets/es-C47yMWlQ.js +14 -0
  93. package/dist/assets/{es-D2rCdMgt.js → es-yHIDSG5r.js} +1 -1
  94. package/dist/assets/{exchange-passport-3aXbJr-q.js → exchange-passport-DIyhYtFS.js} +1 -1
  95. package/dist/assets/{format-error-BrmqJs5a.js → format-error-LAoTjvJe.js} +1 -1
  96. package/dist/assets/{fr-Chv_7X3-.js → fr-CXUB715N.js} +3 -3
  97. package/dist/assets/{fr-DAFx50ef.js → fr-D6i3bCqR.js} +1 -1
  98. package/dist/assets/{fuel-DOs3bqYm.js → fuel-aGwI1uP2.js} +1 -1
  99. package/dist/assets/gen-access-key-DMS1kzry.js +2 -0
  100. package/dist/assets/{get-safe-url-CWgEUVPT.js → get-safe-url-DMordnyN.js} +1 -1
  101. package/dist/assets/{get-safe-url-eATw6wn7.js → get-safe-url-DW2Z07ex.js} +1 -1
  102. package/dist/assets/{hi-CkD7b6N9.js → hi-ChVLDWm_.js} +1 -1
  103. package/dist/assets/hi-DCG5QxbH.js +11 -0
  104. package/dist/assets/{home-a0RwGUp7.js → home-B_gUzcjU.js} +1 -1
  105. package/dist/assets/id-BjbrrkXh.js +14 -0
  106. package/dist/assets/{id-BMWKdVei.js → id-D6XXuY_a.js} +1 -1
  107. package/dist/assets/{iframe-DVBEjxC1.js → iframe-BEanRyio.js} +1 -1
  108. package/dist/assets/index-4rY7Xp2W.js +14 -0
  109. package/dist/assets/{index-CwdXL2a0.js → index-AhbLOD9c.js} +1 -1
  110. package/dist/assets/{index-DrUxhMM5.js → index-BDNlzmD0.js} +4 -4
  111. package/dist/assets/{index-Th4BUzmb.js → index-BPa_QtWl.js} +30 -30
  112. package/dist/assets/index-BjN8LAYh.js +224 -0
  113. package/dist/assets/index-BmexzVQt.js +1 -0
  114. package/dist/assets/{index-C1nvgBfF.js → index-C-7MyHbp.js} +1 -1
  115. package/dist/assets/index-C0hr4pkt.js +346 -0
  116. package/dist/assets/{index-BGeUo-5w.js → index-CFJtmMCn.js} +1 -1
  117. package/dist/assets/index-CFkRKsyT.js +290 -0
  118. package/dist/assets/{index-9aeq_G-H.js → index-CX4jvZnM.js} +1 -1
  119. package/dist/assets/{index-DQIxR9j5.js → index-CbW18ndN.js} +2 -2
  120. package/dist/assets/index-CcjD0qiY.js +93 -0
  121. package/dist/assets/{index-DjIOxw8x.js → index-D1fVmwHN.js} +1 -1
  122. package/dist/assets/{index-VvWvVQT8.js → index-D22ZWGxu.js} +1 -1
  123. package/dist/assets/{index-BBl5mftj.js → index-D22lazSG.js} +3 -3
  124. package/dist/assets/{index-BVOsgGKh.js → index-D2EAXstd.js} +2 -2
  125. package/dist/assets/index-DBZZ-U66.js +1 -0
  126. package/dist/assets/index-DUQK_NaI.js +113 -0
  127. package/dist/assets/{index-DBLdE2lQ.js → index-D_gSWW1P.js} +1 -1
  128. package/dist/assets/index-DbpVrp8z.js +138 -0
  129. package/dist/assets/{index-MqiIu4kd.js → index-DkPKxdcu.js} +1 -1
  130. package/dist/assets/{index-sv3a1ZUw.js → index-DzDfEcNp.js} +1 -1
  131. package/dist/assets/{index-CCwUSMuP.js → index-O2l0NSUF.js} +1 -1
  132. package/dist/assets/{index-CPE8Apzb.js → index-pV_0wOyY.js} +1 -1
  133. package/dist/assets/{index-DVQCgvFb.js → index-tUQxVYYQ.js} +1 -1
  134. package/dist/assets/index-xa5W6ExD.js +1 -0
  135. package/dist/assets/{invitation-CwtXOXZc.js → invitation-D-l4US6a.js} +3 -3
  136. package/dist/assets/invite-DPswrm4J.js +1 -0
  137. package/dist/assets/{issue-passport-DtEbcgX6.js → issue-passport-AJghkFHK.js} +1 -1
  138. package/dist/assets/item-zk7clNKz.js +2 -0
  139. package/dist/assets/{ja-D2jInSAT.js → ja-DKZCt8Yp.js} +1 -1
  140. package/dist/assets/ja-DmNZQIta.js +14 -0
  141. package/dist/assets/{ko-BGB5KJZq.js → ko-B0uE9AyQ.js} +1 -1
  142. package/dist/assets/ko-CfYwMwZz.js +14 -0
  143. package/dist/assets/{landing-page-BM1TmagN.js → landing-page-D13wALfk.js} +1 -1
  144. package/dist/assets/{launch-result-message-DOa3SWMR.js → launch-result-message-Bvdtucih.js} +1 -1
  145. package/dist/assets/{layout-DCzN0ui5.js → layout-aS-gjZH3.js} +1 -1
  146. package/dist/assets/list-CJt5nOcn.js +234 -0
  147. package/dist/assets/{list-header-BLGbkNad.js → list-header-Bm8u_Z_p.js} +1 -1
  148. package/dist/assets/localization-Us9buoy1.js +1 -0
  149. package/dist/assets/{log-C0ajhie8.js → log-DFaz-U9x.js} +7 -7
  150. package/dist/assets/{logger-D6n4nbwy.js → logger-DXlQ8ejK.js} +1 -1
  151. package/dist/assets/{login-f1AXbIm0.js → login-DKSu0ge6.js} +1 -1
  152. package/dist/assets/login-oauth-callback-CP7cNspN.js +1 -0
  153. package/dist/assets/{logo-uploader-DbAVW3BS.js → logo-uploader-B7i5QemW.js} +5 -5
  154. package/dist/assets/{lost-passport-Dlmv8D-L.js → lost-passport-QRUn4RXe.js} +3 -3
  155. package/dist/assets/{lottie-react.esm-D2t-u0YU.js → lottie-react.esm-CPHH620R.js} +1 -1
  156. package/dist/assets/{lottie-web-jYmAQWuC.js → lottie-web-B6s7dDoL.js} +1 -1
  157. package/dist/assets/omit-MMUW2k9W.js +1 -0
  158. package/dist/assets/{open-window-DskgWqba.js → open-window-B6LZyZAW.js} +1 -1
  159. package/dist/assets/{overview-DY9-9zrL.js → overview-B3A_5sHO.js} +2 -2
  160. package/dist/assets/{page-header-XbzfRkA7.js → page-header-DUh_2MUQ.js} +1 -1
  161. package/dist/assets/passport-item-BY6VS7Ot.js +1 -0
  162. package/dist/assets/{permission-Bi46fqEy.js → permission-DKFJEWNH.js} +1 -1
  163. package/dist/assets/preferences-CA76rfbp.js +1 -0
  164. package/dist/assets/profile-embed-DHFHXO1W.js +1 -0
  165. package/dist/assets/{pt-DY0Ku5W5.js → pt-DCzE4kPq.js} +1 -1
  166. package/dist/assets/pt-DD_rP5GH.js +12 -0
  167. package/dist/assets/publish-resource-rxvf6s83.js +1 -0
  168. package/dist/assets/{raf-schd.esm-B3j6BePR.js → raf-schd.esm-GV-XhwE0.js} +1 -1
  169. package/dist/assets/{react-beautiful-dnd.esm-B68lWn23.js → react-beautiful-dnd.esm-D0nBCaor.js} +1 -1
  170. package/dist/assets/{relative-time-BeR_4mfM.js → relative-time-BK3hjJNN.js} +1 -1
  171. package/dist/assets/roboto-latin-400-normal-BVyCgWwA.woff +0 -0
  172. package/dist/assets/roboto-latin-400-normal-DXyFPIdK.woff2 +0 -0
  173. package/dist/assets/roboto-latin-500-normal-C6iW8rdg.woff2 +0 -0
  174. package/dist/assets/roboto-latin-500-normal-rpP1_v3s.woff +0 -0
  175. package/dist/assets/roboto-latin-700-normal-BWcFiwQV.woff +0 -0
  176. package/dist/assets/roboto-latin-700-normal-CbYYDfWS.woff2 +0 -0
  177. package/dist/assets/roboto-latin-ext-400-normal-BSFkPfbf.woff +0 -0
  178. package/dist/assets/roboto-latin-ext-400-normal-DgXbz5gU.woff2 +0 -0
  179. package/dist/assets/roboto-latin-ext-500-normal-DvHxAkTn.woff +0 -0
  180. package/dist/assets/roboto-latin-ext-500-normal-OQJhyaXd.woff2 +0 -0
  181. package/dist/assets/roboto-latin-ext-700-normal-Ba-CAIIA.woff +0 -0
  182. package/dist/assets/roboto-latin-ext-700-normal-DchBbzVz.woff2 +0 -0
  183. package/dist/assets/{ru-Cv5vRo7s.js → ru-B9yj9TuE.js} +1 -1
  184. package/dist/assets/ru-CwgUUzV8.js +11 -0
  185. package/dist/assets/runtime-D_bXZ0w0.js +1 -0
  186. package/dist/assets/sdk-Hg_BMu_u.js +1 -0
  187. package/dist/assets/{security-DmR541pi.js → security-DEmFjZiu.js} +1 -1
  188. package/dist/assets/session-DB9Du-lc.js +1 -0
  189. package/dist/assets/setup-kkb6SvQ7.js +19 -0
  190. package/dist/assets/{shorten-label-BuH-7PI8.js → shorten-label-CwDvu4_S.js} +1 -1
  191. package/dist/assets/simple-select-DgqUhMvQ.js +1 -0
  192. package/dist/assets/{slicedToArray-C0MW3KIe.js → slicedToArray-B8PdYes9.js} +1 -1
  193. package/dist/assets/{spaces-gLUqr6Uq.js → spaces-25E9GQ6_.js} +1 -1
  194. package/dist/assets/{start-XbVMHGiE.js → start-DfEUlPuS.js} +1 -1
  195. package/dist/assets/{status-DmyvEkKL.js → status-CUyAteC9.js} +1 -1
  196. package/dist/assets/{step-actions-brdohYRv.js → step-actions-CAgwlOEY.js} +1 -1
  197. package/dist/assets/{studio-DJeZlIfF.js → studio-2U2-FOOC.js} +1 -1
  198. package/dist/assets/{switch-control-Br1YNOSB.js → switch-control-DwTxPESj.js} +1 -1
  199. package/dist/assets/th-KqE3tuDR.js +12 -0
  200. package/dist/assets/{th-D6oDBVGi.js → th-et0IV3ES.js} +1 -1
  201. package/dist/assets/traffic-B94bYvtf.js +35 -0
  202. package/dist/assets/{transfer-DboKwiA_.js → transfer-DWjvJtPs.js} +1 -1
  203. package/dist/assets/{unsubscribe-C9k_L3g5.js → unsubscribe-CTZlUfqc.js} +1 -1
  204. package/dist/assets/use-mobile-BHPd3bDQ.js +1 -0
  205. package/dist/assets/use-mobile-CHMVa8_W.js +1 -0
  206. package/dist/assets/useAsync-DKE0K0bz.js +1 -0
  207. package/dist/assets/useAsyncRetry-BBomZj1z.js +7 -0
  208. package/dist/assets/{useLocalStorage-0mjZfnua.js → useLocalStorage-DKl7XFfI.js} +1 -1
  209. package/dist/assets/{useSetState-CWq0AVWn.js → useSetState-BL3ktMon.js} +1 -1
  210. package/dist/assets/user-center-Du6EtGgy.js +77 -0
  211. package/dist/assets/{util-YnaMqM3B.js → util-BEvdQ5nP.js} +1 -1
  212. package/dist/assets/{util-DLK92HF8.js → util-DkIhTuT7.js} +1 -1
  213. package/dist/assets/{vendor-arcblock-DPMnO1AO.js → vendor-arcblock-ACo-BN0q.js} +26 -26
  214. package/dist/assets/{vendor-hooks-DN4nZ7TU.js → vendor-hooks-BwVH-TAd.js} +2 -2
  215. package/dist/assets/{vendor-mui-core-x3zpe_j_.js → vendor-mui-core-DxD1UA4o.js} +2 -2
  216. package/dist/assets/vendor-mui-x-Bit8yv3W.js +6 -0
  217. package/dist/assets/{vendor-react-DEoibe3W.js → vendor-react-DoD83n6N.js} +1 -1
  218. package/dist/assets/vendor-utils-CTIzdAFg.js +11 -0
  219. package/dist/assets/vendor-ux-did-connect-2GapMFC4.css +1 -0
  220. package/dist/assets/vendor-ux-did-connect-DOjsg91L.js +1832 -0
  221. package/dist/assets/vi-BSkiIyr-.js +12 -0
  222. package/dist/assets/{vi-BKKJMbW2.js → vi-LBvVt_pj.js} +1 -1
  223. package/dist/assets/wrap-locale-DjpRZNtr.js +1 -0
  224. package/dist/assets/{zh-nDA-W8Iz.js → zh-BYP8UvRZ.js} +4 -4
  225. package/dist/assets/{zh-tw-B9PQstHP.js → zh-tw-Dcs2VpLv.js} +3 -3
  226. package/dist/assets/{zh-tw-B08rjgK3.js → zh-tw-l3XXo5aT.js} +1 -1
  227. package/dist/assets/{zh-gJhiLbCP.js → zh-yJzqRkfw.js} +1 -1
  228. package/dist/index.html +9 -9
  229. package/dist/service-worker.js +2 -2
  230. package/package.json +45 -43
  231. package/dist/assets/actions-BAjt7G_t.js +0 -1
  232. package/dist/assets/add-component-core-BXowXTJz.js +0 -762
  233. package/dist/assets/advanced-C8t1232G.js +0 -14
  234. package/dist/assets/api-kwOW9mRz.js +0 -1
  235. package/dist/assets/appearance-BIOmTg1q.js +0 -1
  236. package/dist/assets/branding-NmIAi0kv.js +0 -40
  237. package/dist/assets/button-Kk1bqv_H.js +0 -1
  238. package/dist/assets/click-to-copy-DCUroWft.js +0 -1
  239. package/dist/assets/cloneDeep-DHAAvuEH.js +0 -1
  240. package/dist/assets/confirm-92J4n1RP.js +0 -7
  241. package/dist/assets/connect-D20f2K4u.js +0 -5
  242. package/dist/assets/dashboard-BgQFc2Pc.js +0 -262
  243. package/dist/assets/de-BOcpEFUQ.js +0 -13
  244. package/dist/assets/delete-confirm-AkwIQ5yF.js +0 -1
  245. package/dist/assets/did-address-D4v6iN2l.js +0 -1
  246. package/dist/assets/domain-CBdLs2D9.js +0 -9
  247. package/dist/assets/domain-action-card-DN3KjFwP.js +0 -29
  248. package/dist/assets/domains-CMJbalsn.js +0 -1
  249. package/dist/assets/empty-spinner-DlzuJxRt.js +0 -1
  250. package/dist/assets/es-DAe7HpzA.js +0 -14
  251. package/dist/assets/hi-BqgGDMzX.js +0 -11
  252. package/dist/assets/id-DbN1Ye4x.js +0 -14
  253. package/dist/assets/index-3q6oLa2e.js +0 -290
  254. package/dist/assets/index-BJYrBMyS.js +0 -1
  255. package/dist/assets/index-BxTrfRkG.js +0 -138
  256. package/dist/assets/index-C3-7zmeY.js +0 -346
  257. package/dist/assets/index-DWuuU3ta.js +0 -113
  258. package/dist/assets/index-K5iSHoYm.js +0 -224
  259. package/dist/assets/index-KLUHbsxg.js +0 -1
  260. package/dist/assets/invite-CMj5995Z.js +0 -1
  261. package/dist/assets/item-zVdGBfMR.js +0 -2
  262. package/dist/assets/ja-Bv-A_sTl.js +0 -14
  263. package/dist/assets/ko-Bl3kd-sp.js +0 -14
  264. package/dist/assets/list-BuXPrN1N.js +0 -221
  265. package/dist/assets/localization-qd6O0FX9.js +0 -1
  266. package/dist/assets/login-oauth-callback-C5CFUlUR.js +0 -1
  267. package/dist/assets/omit-IjXSqbDA.js +0 -1
  268. package/dist/assets/preferences-DPpwnIAs.js +0 -1
  269. package/dist/assets/profile-embed-DV5vno0C.js +0 -1
  270. package/dist/assets/pt-B7_jgyK-.js +0 -12
  271. package/dist/assets/publish-resource-z2_THSz6.js +0 -1
  272. package/dist/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
  273. package/dist/assets/roboto-cyrillic-400-normal-Dry59Hjn.woff +0 -0
  274. package/dist/assets/roboto-cyrillic-500-normal-CsCirF4J.woff +0 -0
  275. package/dist/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
  276. package/dist/assets/roboto-cyrillic-700-normal-CB1Rmiii.woff +0 -0
  277. package/dist/assets/roboto-cyrillic-700-normal-CzEIZVQR.woff2 +0 -0
  278. package/dist/assets/roboto-cyrillic-ext-400-normal-BxX1-eA_.woff +0 -0
  279. package/dist/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
  280. package/dist/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
  281. package/dist/assets/roboto-cyrillic-ext-500-normal-ElvJfk8V.woff +0 -0
  282. package/dist/assets/roboto-cyrillic-ext-700-normal-CIu0AXX2.woff +0 -0
  283. package/dist/assets/roboto-cyrillic-ext-700-normal-D_fA0fHY.woff2 +0 -0
  284. package/dist/assets/roboto-greek-400-normal-CAI06USH.woff +0 -0
  285. package/dist/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
  286. package/dist/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
  287. package/dist/assets/roboto-greek-500-normal-D8eQD5zT.woff +0 -0
  288. package/dist/assets/roboto-greek-700-normal-DCrt6r9F.woff +0 -0
  289. package/dist/assets/roboto-greek-700-normal-DpKAje7q.woff2 +0 -0
  290. package/dist/assets/roboto-latin-400-normal-551zQQ7R.woff +0 -0
  291. package/dist/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
  292. package/dist/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
  293. package/dist/assets/roboto-latin-500-normal-_8jDuD7w.woff +0 -0
  294. package/dist/assets/roboto-latin-700-normal-CTLkNcF_.woff +0 -0
  295. package/dist/assets/roboto-latin-700-normal-DZr4b_KL.woff2 +0 -0
  296. package/dist/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
  297. package/dist/assets/roboto-latin-ext-400-normal-uRIBRJt5.woff +0 -0
  298. package/dist/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
  299. package/dist/assets/roboto-latin-ext-500-normal-eJ10kk0m.woff +0 -0
  300. package/dist/assets/roboto-latin-ext-700-normal-BNPgmEQS.woff2 +0 -0
  301. package/dist/assets/roboto-latin-ext-700-normal-Cnx4FGpK.woff +0 -0
  302. package/dist/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
  303. package/dist/assets/roboto-math-400-normal-DHrwdhE6.woff +0 -0
  304. package/dist/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
  305. package/dist/assets/roboto-math-500-normal-CetgDdIa.woff +0 -0
  306. package/dist/assets/roboto-math-700-normal-CpTCM92H.woff +0 -0
  307. package/dist/assets/roboto-math-700-normal-xbpggnJp.woff2 +0 -0
  308. package/dist/assets/roboto-symbols-400-normal-bG5rsNFs.woff +0 -0
  309. package/dist/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
  310. package/dist/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
  311. package/dist/assets/roboto-symbols-500-normal-toKUCDph.woff +0 -0
  312. package/dist/assets/roboto-symbols-700-normal-B2QKVW64.woff +0 -0
  313. package/dist/assets/roboto-symbols-700-normal-DKkQdRpM.woff2 +0 -0
  314. package/dist/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
  315. package/dist/assets/roboto-vietnamese-400-normal-DgufTq8s.woff +0 -0
  316. package/dist/assets/roboto-vietnamese-500-normal-Dw5heWgq.woff +0 -0
  317. package/dist/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
  318. package/dist/assets/roboto-vietnamese-700-normal-BFWtvCOj.woff2 +0 -0
  319. package/dist/assets/roboto-vietnamese-700-normal-ChAl_rRV.woff +0 -0
  320. package/dist/assets/ru-CToatViJ.js +0 -11
  321. package/dist/assets/runtime-D6tESY33.js +0 -1
  322. package/dist/assets/sdk-DNr-nKBq.js +0 -1
  323. package/dist/assets/session-CJFbMNLl.js +0 -1
  324. package/dist/assets/setup-BSsqBrsc.js +0 -19
  325. package/dist/assets/simple-select-DHvjqsw4.js +0 -1
  326. package/dist/assets/th-23Hwasay.js +0 -12
  327. package/dist/assets/traffic-LuIcK-L1.js +0 -37
  328. package/dist/assets/use-mobile-C98e2dYy.js +0 -1
  329. package/dist/assets/use-mobile-CqLLcWbr.js +0 -1
  330. package/dist/assets/useAsync-BxB2TpDl.js +0 -1
  331. package/dist/assets/useAsync-L7_fHBH5.js +0 -1
  332. package/dist/assets/useAsyncRetry-CEouAsle.js +0 -7
  333. package/dist/assets/user-center-BaKv3X4J.js +0 -77
  334. package/dist/assets/vendor-mui-x-CPOc4sOK.js +0 -6
  335. package/dist/assets/vendor-utils-C3FZIS9A.js +0 -11
  336. package/dist/assets/vendor-ux-did-connect-B1u6nvmg.js +0 -1832
  337. package/dist/assets/vendor-ux-did-connect-BDmhBveY.css +0 -1
  338. package/dist/assets/vi-D-QGxDS1.js +0 -12
  339. package/dist/assets/wrap-locale-m_NRjq-h.js +0 -1
  340. /package/api/services/oauth/{index.js → client.js} +0 -0
package/api/index.js CHANGED
@@ -12,7 +12,6 @@ const httpProxy = require('@arcblock/http-proxy');
12
12
  const { minimatch } = require('minimatch');
13
13
  const helmet = require('helmet');
14
14
  const isUrl = require('is-url');
15
-
16
15
  const { WELLKNOWN_SERVICE_PATH_PREFIX, EVENTS } = require('@abtnode/constant');
17
16
  const {
18
17
  BlockletEvents,
@@ -62,7 +61,8 @@ const StudioService = require('./services/studio');
62
61
  const AnalyticService = require('./services/analytics');
63
62
  const DidSpaceService = require('./services/did-space');
64
63
  const createEnvRoutes = require('./routes/env');
65
- const createOAuthRoutes = require('./routes/oauth');
64
+ const createOauthClientRoutes = require('./routes/oauth/client');
65
+ const createOAuthServerRoutes = require('./routes/oauth/server');
66
66
  const createFederatedRoutes = require('./routes/federated');
67
67
  const createUserRoutes = require('./routes/user');
68
68
  const createOcapRoutes = require('./routes/ocap');
@@ -722,7 +722,8 @@ self.blocklet = {
722
722
  createMCPRoutes.init(server, node);
723
723
 
724
724
  // API: auth
725
- createOAuthRoutes.init(server, node, options);
725
+ createOauthClientRoutes.init(server, node, options);
726
+ createOAuthServerRoutes.init(server, node, options);
726
727
  createFederatedRoutes.init(server, node, options);
727
728
  createUserRoutes.init(server, node, options);
728
729
  createOcapRoutes.init(server);
@@ -1,6 +1,6 @@
1
1
  const { default: axios } = require('axios');
2
2
  const logger = require('../logger')('blocklet-services:oauth');
3
- const { verifyIdToken } = require('../../services/oauth');
3
+ const { verifyIdToken } = require('../../services/oauth/client');
4
4
 
5
5
  /**
6
6
  * @typedef {Object} Provider
@@ -53,7 +53,7 @@ function getUrl(urlLike, params) {
53
53
  return url.toString();
54
54
  }
55
55
 
56
- class OAuthClient {
56
+ class OauthClient {
57
57
  /**
58
58
  * Constructor for initializing providers.
59
59
  * @param {Object} options
@@ -120,7 +120,7 @@ class OAuthClient {
120
120
  async getUserInfo(tokens) {
121
121
  try {
122
122
  if (tokens.id_token) {
123
- const cliams = await verifyIdToken({
123
+ const claims = await verifyIdToken({
124
124
  clientId:
125
125
  this.provider?.getClientList?.() || this.provider?.getClientId?.() || this.provider.options.clientId,
126
126
  idToken: tokens.id_token,
@@ -128,7 +128,7 @@ class OAuthClient {
128
128
  jwksUri: this.provider.jwks_uri,
129
129
  nonce: tokens.nonce,
130
130
  });
131
- return cliams;
131
+ return claims;
132
132
  }
133
133
  if (this.provider.userinfo?.request) {
134
134
  return this.provider.userinfo.request({ tokens });
@@ -169,5 +169,5 @@ class OAuthClient {
169
169
  }
170
170
 
171
171
  module.exports = {
172
- OAuthClient,
172
+ OauthClient,
173
173
  };
@@ -48,11 +48,12 @@ const { getDidSpacesInfoByClaims, silentAuthorizationInConnect } = require('@abt
48
48
  const getRequestIP = require('@abtnode/util/lib/get-request-ip');
49
49
  const { PASSPORT_LOG_ACTION, PASSPORT_SOURCE, PASSPORT_STATUS } = require('@abtnode/constant');
50
50
  const { getDeviceData } = require('@abtnode/util/lib/device');
51
+ const { getVerifyAccessClaims } = require('@abtnode/auth/lib/server');
51
52
 
52
53
  const logger = require('../logger')('connect');
53
54
  const { createTokenFn, getDidConnectVersion } = require('../../util');
54
55
  const { transferPassport, PASSPORT_VC_TYPES } = require('../auth/utils');
55
- const { migrateAccount, declareAccount } = require('../../services/oauth');
56
+ const { migrateAccount, declareAccount } = require('../../services/oauth/client');
56
57
  const { getKycClaims, verifyKycClaims, getPassportVc, getProfileItems } = require('../kyc');
57
58
  const { getTrustedIssuers, getFederatedTrustedIssuers } = require('../../util/blocklet-utils');
58
59
  const {
@@ -64,6 +65,7 @@ const {
64
65
  syncFederatedUser,
65
66
  } = require('../../util/federated');
66
67
  const { Profile } = require('../../state/profile');
68
+ const { getDefaultPassport } = require('../../util/user-util');
67
69
 
68
70
  // do some check if the passport issued by the blocklet itself
69
71
  const validateLocalPassport = async ({ vc, node, locale, blocklet, teamDid, userDid }) => {
@@ -184,6 +186,29 @@ const checkAppOwner = async ({ node, role, blocklet, userDid, locale = 'en' }) =
184
186
  throw new Error(messages.notAppOwner[locale]);
185
187
  };
186
188
 
189
+ const checkUserRole = async ({ node, userDid, locale, request, roles }) => {
190
+ const blocklet = await request.getBlocklet();
191
+ const user = await node.getUser({ teamDid: blocklet.appPid, user: { did: userDid } });
192
+ if (!user) {
193
+ throw new Error(messages.notAllowed[locale]);
194
+ }
195
+ if (!user.approved) {
196
+ throw new Error(messages.notAuthorized[locale]);
197
+ }
198
+
199
+ const sourceAppPid = getSourceAppPid(request);
200
+ return {
201
+ verifiableCredential: getVerifyAccessClaims({
202
+ node,
203
+ passports: user.passports,
204
+ roles,
205
+ types: PASSPORT_VC_TYPES,
206
+ source: 'blocklet',
207
+ trustedIssuers: await getTrustedIssuers(blocklet, { sourceAppPid }),
208
+ }),
209
+ };
210
+ };
211
+
187
212
  /**
188
213
  * @description
189
214
  * @param {import('@abtnode/client').BlockletState} blocklet
@@ -519,7 +544,7 @@ module.exports = {
519
544
 
520
545
  let fullName = currentUser?.fullName;
521
546
  // Update profile
522
- const passportForLog = passport || { name: 'Guest', role: 'guest' };
547
+ const passportForLog = passport || getDefaultPassport();
523
548
 
524
549
  const connectAccount = { provider, did: userDid, pk: userPk };
525
550
 
@@ -1039,7 +1064,7 @@ module.exports = {
1039
1064
  });
1040
1065
 
1041
1066
  // Audit log
1042
- const passportForLog = passport || { name: 'Guest', role: 'guest' };
1067
+ const passportForLog = passport || getDefaultPassport();
1043
1068
  await node.createAuditLog(
1044
1069
  {
1045
1070
  action: 'switchPassport',
@@ -1390,5 +1415,6 @@ module.exports = {
1390
1415
 
1391
1416
  utils: {
1392
1417
  checkAppOwner,
1418
+ checkUserRole,
1393
1419
  },
1394
1420
  };
package/api/libs/jwt.js CHANGED
@@ -17,6 +17,24 @@ const initJwt = (node, options) => {
17
17
  // 保持默认有效期为 1 天
18
18
  const ttl = options.sessionTtl || '1d';
19
19
 
20
+ /**
21
+ * Creates a JWT session token for a user
22
+ * @param {string} did - The DID of the user
23
+ * @param {Object} options - Token creation options
24
+ * @param {string} options.role - User's role
25
+ * @param {string} options.secret - Secret key used to sign the token
26
+ * @param {Object} [options.passport] - User's passport information
27
+ * @param {string} [options.expiresIn] - Token expiration time, defaults to configured ttl
28
+ * @param {string} [options.tokenType] - Type of token being created
29
+ * @param {string} [options.fullName] - User's full name
30
+ * @param {string} [options.provider=LOGIN_PROVIDER.WALLET] - Authentication provider
31
+ * @param {string} [options.walletOS] - User's wallet operating system
32
+ * @param {boolean} [options.emailVerified=false] - Whether user's email is verified
33
+ * @param {boolean} [options.phoneVerified=false] - Whether user's phone is verified
34
+ * @param {boolean} [options.elevated=false] - Whether the session has elevated privileges
35
+ * @param {Object} [options.oauth=null] - OAuth related information
36
+ * @returns {Object} The created token object
37
+ */
20
38
  const createSessionToken = (
21
39
  did,
22
40
  {
@@ -31,6 +49,7 @@ const initJwt = (node, options) => {
31
49
  emailVerified = false,
32
50
  phoneVerified = false,
33
51
  elevated = false,
52
+ oauth = null,
34
53
  }
35
54
  ) =>
36
55
  createAuthToken({
@@ -45,8 +64,20 @@ const initJwt = (node, options) => {
45
64
  walletOS,
46
65
  kyc: encodeKycStatus(emailVerified, phoneVerified),
47
66
  elevated,
67
+ oauth,
48
68
  });
49
69
 
70
+ /**
71
+ * Verifies a JWT session token
72
+ * @param {string} token - The JWT token to verify
73
+ * @param {string} secret - Secret key used to verify the token
74
+ * @param {Object} [options={}] - Verification options
75
+ * @param {boolean|Function} options.checkFromDb - Whether to check user from database or a function that returns boolean
76
+ * @param {string} options.teamDid - The DID of the team/application
77
+ * @param {Function} options.checkToken - Optional function to perform additional token validation
78
+ * @param {string} [options.locale='en'] - Locale for error messages, defaults to 'en'
79
+ * @returns {Promise<Object>} - Resolves with decoded token data if valid
80
+ */
50
81
  const verifySessionToken = (token, secret, { checkFromDb, teamDid, checkToken, locale = 'en' } = {}) =>
51
82
  // eslint-disable-next-line implicit-arrow-linebreak
52
83
  new Promise((resolve, reject) => {
@@ -72,6 +103,8 @@ const initJwt = (node, options) => {
72
103
  walletOS,
73
104
  kyc = 0,
74
105
  elevated = false,
106
+ oauth = null,
107
+ exp,
75
108
  } = decoded;
76
109
  let user;
77
110
  if (!did) {
@@ -107,9 +140,11 @@ const initJwt = (node, options) => {
107
140
  user.walletOS = walletOS;
108
141
  user.kyc = encodeKycStatus(user.emailVerified, user.phoneVerified);
109
142
  user.elevated = elevated;
143
+ user.oauth = oauth;
144
+ user.exp = exp;
110
145
  } else {
111
146
  user = Object.assign(
112
- { did, role, passport, fullName, provider, walletOS, kyc, elevated },
147
+ { did, role, passport, fullName, provider, walletOS, kyc, elevated, oauth, exp },
113
148
  decodeKycStatus(kyc)
114
149
  );
115
150
  }
@@ -27,7 +27,7 @@ const {
27
27
  getUserWithinFederated,
28
28
  getTrustedDomains,
29
29
  } = require('../util/federated');
30
- const { declareAccount, migrateAccount } = require('../services/oauth');
30
+ const { declareAccount, migrateAccount } = require('../services/oauth/client');
31
31
  const { checkFederatedCall } = require('../middlewares/check-federated');
32
32
 
33
33
  const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
package/api/routes/mcp.js CHANGED
@@ -1,18 +1,20 @@
1
- /* eslint-disable no-console */
2
1
  const { WELLKNOWN_SERVICE_PATH_PREFIX, SECURITY_RULE_DEFAULT_ID } = require('@abtnode/constant');
3
2
  const { joinURL } = require('ufo');
4
3
  const get = require('lodash/get');
5
4
  const getBlockletInfo = require('@blocklet/meta/lib/info');
6
5
  const { checkPublicAccess } = require('@blocklet/meta/lib/util');
7
6
  // eslint-disable-next-line import/no-unresolved
8
- const { SSEServerTransport } = require('@modelcontextprotocol/sdk/server/sse.js');
7
+ const { SSEServerTransport } = require('@blocklet/mcp/server/sse.js');
9
8
 
10
- const { mcpServer } = require('../services/mcp/server');
9
+ const { initMcpServer } = require('../services/mcp/server');
10
+ const logger = require('../libs/logger')('mcp:server:routes');
11
11
 
12
12
  const isMCPSupported = (b) => get(b.meta, 'capabilities.mcp', false);
13
13
 
14
14
  module.exports = {
15
15
  init(server, node) {
16
+ const mcpServer = initMcpServer(node);
17
+
16
18
  // Return all MCP servers
17
19
  server.get(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/servers'), async (req, res) => {
18
20
  const blocklet = await req.getBlocklet();
@@ -50,7 +52,7 @@ module.exports = {
50
52
  }
51
53
  });
52
54
 
53
- // TODO: should we include official services? such as chain, did-spaces, name-service, etc.
55
+ // TODO: @wangshijun should we include official services? such as chain, did-spaces, name-service, etc.
54
56
  res.json({
55
57
  version: info.version,
56
58
  servers: mcpServers,
@@ -61,27 +63,38 @@ module.exports = {
61
63
 
62
64
  // to support multiple simultaneous connections we have a lookup object from sessionId to transport
63
65
  const transports = {};
64
- server.get(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/sse'), async (_, res) => {
66
+ server.get(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/sse'), async (req, res) => {
67
+ if (!req.user) {
68
+ res.status(401).json({ error: 'Unauthorized' });
69
+ return;
70
+ }
71
+
65
72
  // Set required headers for SSE
66
73
  res.header('X-Accel-Buffering', 'no');
67
74
 
68
75
  const transport = new SSEServerTransport(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/messages'), res);
69
- transports[transport.sessionId] = transport;
76
+ transport.authContext = Object.assign({ user: req.user || {} }, { blockletDid: req.getBlockletDid() });
77
+ const { sessionId } = transport;
78
+ transports[sessionId] = transport;
79
+ logger.debug('Client connected', sessionId);
70
80
  res.on('close', () => {
71
- delete transports[transport.sessionId];
81
+ logger.debug('Client Disconnected', sessionId);
82
+ delete transports[sessionId];
72
83
  });
73
84
  await mcpServer.connect(transport);
74
85
  });
75
86
 
76
87
  server.post(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/messages'), async (req, res) => {
77
88
  const { sessionId } = req.query;
78
- const transport = transports[sessionId];
79
- if (transport) {
80
- // Send the body to the transport since we have already parsed it
81
- await transport.handlePostMessage(req, res, req.body);
82
- } else {
83
- res.status(400).send('No transport found for sessionId');
89
+ logger.debug('Client Message', { sessionId, body: req.body });
90
+ let transport = transports[sessionId];
91
+ if (!transport) {
92
+ transport = new SSEServerTransport(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/messages'), res);
84
93
  }
94
+
95
+ // Send the body to the transport since we have already parsed it
96
+ transport.authContext = Object.assign({ user: req.user || {} }, { blockletDid: req.getBlockletDid() });
97
+ await transport.handlePostMessage(req, res, req.body);
85
98
  });
86
99
  },
87
100
  };
@@ -13,22 +13,23 @@ const createTranslator = require('@abtnode/util/lib/translate');
13
13
  const CustomError = require('@abtnode/util/lib/custom-error');
14
14
  const { LOGIN_PROVIDER } = require('@blocklet/constant');
15
15
  const { withHttps, withTrailingSlash } = require('ufo');
16
-
17
- const logger = require('../libs/logger')('oauth');
18
- const { OAuthClient } = require('../libs/auth');
19
- const OAuthAuth0 = require('../libs/auth/adapters/auth0');
20
- const OAuthAuth0Legacy = require('../libs/auth/adapters/auth0-legacy');
21
- const OAuthGithub = require('../libs/auth/adapters/github');
22
- const OAuthGoogle = require('../libs/auth/adapters/google');
23
- const OAuthApple = require('../libs/auth/adapters/apple');
24
- const { getAvatarByEmail, transferPassport, getAvatarByUrl } = require('../libs/auth/utils');
25
- const initJwt = require('../libs/jwt');
26
- const { sendToUser } = require('../libs/notification');
27
- const { createTokenFn, getDidConnectVersion, redirectWithoutCache } = require('../util');
28
- const federatedUtil = require('../util/federated');
29
- const userUtil = require('../util/user-util');
30
- const { isOAuthEmailVerified, isEmailUniqueRequired, isEmailKycRequired, isSameEmail } = require('../libs/kyc');
31
- const checkUser = require('../middlewares/check-user');
16
+ const { getLastUsedPassport } = require('@abtnode/auth/lib/passport');
17
+
18
+ const logger = require('../../libs/logger')('oauth:client');
19
+ const { OauthClient } = require('../../libs/auth');
20
+ const OAuthAuth0 = require('../../libs/auth/adapters/auth0');
21
+ const OAuthAuth0Legacy = require('../../libs/auth/adapters/auth0-legacy');
22
+ const OAuthGithub = require('../../libs/auth/adapters/github');
23
+ const OAuthGoogle = require('../../libs/auth/adapters/google');
24
+ const OAuthApple = require('../../libs/auth/adapters/apple');
25
+ const { getAvatarByEmail, transferPassport, getAvatarByUrl } = require('../../libs/auth/utils');
26
+ const initJwt = require('../../libs/jwt');
27
+ const { sendToUser } = require('../../libs/notification');
28
+ const { createTokenFn, getDidConnectVersion, redirectWithoutCache } = require('../../util');
29
+ const federatedUtil = require('../../util/federated');
30
+ const userUtil = require('../../util/user-util');
31
+ const { isOAuthEmailVerified, isEmailUniqueRequired, isEmailKycRequired, isSameEmail } = require('../../libs/kyc');
32
+ const checkUser = require('../../middlewares/check-user');
32
33
 
33
34
  const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
34
35
 
@@ -143,7 +144,7 @@ function getAuthClient(blocklet, provider, { legacy = false, appPid } = {}) {
143
144
  if (!providerConfig.clientSecret) {
144
145
  throw new Error('missing client secret');
145
146
  }
146
- return new OAuthClient({
147
+ return new OauthClient({
147
148
  provider: OAuthAuth0({
148
149
  // HACK: auth0 比较奇葩,它的 issuer 有斜杠后缀
149
150
  issuer: withTrailingSlash(withHttps(providerConfig.domain)),
@@ -155,13 +156,13 @@ function getAuthClient(blocklet, provider, { legacy = false, appPid } = {}) {
155
156
  }
156
157
 
157
158
  if (provider === 'github') {
158
- return new OAuthClient({ provider: OAuthGithub(providerConfig) });
159
+ return new OauthClient({ provider: OAuthGithub(providerConfig) });
159
160
  }
160
161
  if (provider === 'google') {
161
- return new OAuthClient({ provider: OAuthGoogle(providerConfig) });
162
+ return new OauthClient({ provider: OAuthGoogle(providerConfig) });
162
163
  }
163
164
  if (provider === 'apple') {
164
- return new OAuthClient({ provider: OAuthApple(providerConfig) });
165
+ return new OauthClient({ provider: OAuthApple(providerConfig) });
165
166
  }
166
167
  return null;
167
168
  }
@@ -193,7 +194,7 @@ async function login(req, node, options) {
193
194
  userInfo: oauthInfo,
194
195
  };
195
196
  let profile;
196
- const lastUsedPassport = userUtil.getLastUsedPassport({ passports: currentUser?.passports });
197
+ const lastUsedPassport = getLastUsedPassport(currentUser?.passports, '', { useFallback: false });
197
198
  if (!currentUser) {
198
199
  currentUser = {
199
200
  did: userDid,
@@ -0,0 +1,95 @@
1
+ /* eslint-disable import/no-unresolved */
2
+ const { joinURL } = require('ufo');
3
+ const { OAUTH_ENDPOINTS, OAUTH_CLIENT_SECRET_TTL, WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
4
+ const { authorizationHandler } = require('@blocklet/mcp/server/auth/handlers/authorize.js');
5
+ const { tokenHandler } = require('@blocklet/mcp/server/auth/handlers/token.js');
6
+ const { revocationHandler } = require('@blocklet/mcp/server/auth/handlers/revoke.js');
7
+ const { clientRegistrationHandler } = require('@blocklet/mcp/server/auth/handlers/register.js');
8
+
9
+ const { createBlockletOAuthServerProvider } = require('../../services/oauth/server');
10
+ const { redirectWithoutCache, getRedirectUrl } = require('../../util');
11
+
12
+ const logger = require('../../libs/logger')('oauth:server:routes');
13
+
14
+ module.exports = {
15
+ init(router, node, options) {
16
+ const prefix = `${WELLKNOWN_SERVICE_PATH_PREFIX}/oauth`;
17
+
18
+ const ensureOAuthProvider = async (req, res, next) => {
19
+ const [blocklet, info] = await Promise.all([req.getBlocklet(), req.getBlockletInfo()]);
20
+
21
+ if (!blocklet) {
22
+ return res.status(404).json({ error: 'Blocklet not found' });
23
+ }
24
+ // TODO: @wangshijun check if oauth server service is enabled, make it configurable
25
+ req.provider = createBlockletOAuthServerProvider(node, options, blocklet, info);
26
+
27
+ return next();
28
+ };
29
+
30
+ router.use(joinURL(prefix, OAUTH_ENDPOINTS.AUTHORIZATION), ensureOAuthProvider, (req, res, next) => {
31
+ if (req.method === 'GET') {
32
+ if (req.user) {
33
+ logger.debug('User already logged in, send to consent page');
34
+ // Send to oauth consent page
35
+ next();
36
+ } else {
37
+ logger.debug('User not logged in, send to login page');
38
+ // redirect to login page and redirect back once login success
39
+ redirectWithoutCache(
40
+ res,
41
+ getRedirectUrl({
42
+ req,
43
+ pagePath: '/login',
44
+ params: {
45
+ redirect: req.originalUrl,
46
+ },
47
+ })
48
+ );
49
+ }
50
+ } else if (req.method === 'POST') {
51
+ logger.debug('Handle oauth authorization request', req.body);
52
+
53
+ if (req.body.action === 'deny') {
54
+ logger.debug('User denied oauth authorization, redirect to redirect_uri');
55
+ const errorUrl = new URL(req.body.redirect_uri);
56
+ errorUrl.searchParams.set('error', 'access_denied');
57
+ errorUrl.searchParams.set('error_description', 'The user denied the request');
58
+ if (req.body.state) errorUrl.searchParams.set('state', req.body.state);
59
+ res.redirect(errorUrl.toString());
60
+ return;
61
+ }
62
+
63
+ authorizationHandler({ provider: req.provider, rateLimit: false })(req, res, next);
64
+ } else {
65
+ res.status(405).json({ error: 'Method not allowed' });
66
+ }
67
+ });
68
+
69
+ router.use(joinURL(prefix, OAUTH_ENDPOINTS.TOKEN), ensureOAuthProvider, (req, res, next) => {
70
+ tokenHandler({ provider: req.provider, rateLimit: false })(req, res, next);
71
+ });
72
+
73
+ router.use(joinURL(prefix, OAUTH_ENDPOINTS.REGISTRATION), ensureOAuthProvider, (req, res, next) => {
74
+ clientRegistrationHandler({
75
+ clientsStore: req.provider.clientsStore,
76
+ clientSecretExpirySeconds: OAUTH_CLIENT_SECRET_TTL,
77
+ rateLimit: false,
78
+ })(req, res, next);
79
+ });
80
+
81
+ router.use(joinURL(prefix, OAUTH_ENDPOINTS.REVOCATION), ensureOAuthProvider, (req, res, next) => {
82
+ revocationHandler({ provider: req.provider, rateLimit: false })(req, res, next);
83
+ });
84
+
85
+ router.get(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/api/oauth/client'), ensureOAuthProvider, async (req, res) => {
86
+ const { clientId } = req.query;
87
+ if (!clientId) {
88
+ res.status(400).json({ error: 'clientId is required' });
89
+ return;
90
+ }
91
+ const client = await req.provider.clientsStore.getClient(clientId);
92
+ res.json(client);
93
+ });
94
+ },
95
+ };
@@ -446,7 +446,7 @@ function checkUserSig({ node }) {
446
446
  }
447
447
 
448
448
  async function loginEmail(req, node, options) {
449
- const { locale = 'en' } = req.query;
449
+ const locale = req.blockletLocale;
450
450
  const { sourceAppPid = null, inviter = null } = req.body;
451
451
 
452
452
  const blocklet = await req.getBlocklet();
@@ -482,7 +482,7 @@ async function loginEmail(req, node, options) {
482
482
  id: sub,
483
483
  userInfo,
484
484
  };
485
- const lastUsedPassport = userUtil.getLastUsedPassport({ passports: currentUser?.passports });
485
+ const lastUsedPassport = getLastUsedPassport(currentUser?.passports, '', { useFallback: false });
486
486
 
487
487
  if (!currentUser) {
488
488
  await userUtil.checkNeedInvite({ req, node, teamDid, locale });
@@ -522,7 +522,7 @@ async function loginEmail(req, node, options) {
522
522
  }
523
523
 
524
524
  async function inviteEmail(req, node, options) {
525
- const { locale = 'en' } = req.query;
525
+ const locale = req.blockletLocale;
526
526
  const { sourceAppPid = null, inviteId, baseUrl } = req.body;
527
527
 
528
528
  if (!inviteId) {
@@ -1084,7 +1084,7 @@ module.exports = {
1084
1084
  );
1085
1085
 
1086
1086
  server.post(`${prefixApi}/email/sendCode`, ensureBlocklet(), ensureCors, async (req, res) => {
1087
- const { locale = 'en' } = req.query;
1087
+ const locale = req.blockletLocale;
1088
1088
  const { blocklet } = req;
1089
1089
  const teamDid = blocklet.appPid;
1090
1090
  const { email, useCode = true, useMagicLink = true, sourceAppPid = null } = req.body;
@@ -1140,6 +1140,7 @@ module.exports = {
1140
1140
  params: {
1141
1141
  ...emailData,
1142
1142
  subject,
1143
+ locale,
1143
1144
  },
1144
1145
  });
1145
1146
  } else {
@@ -0,0 +1,92 @@
1
+ const { getSourceAppPid } = require('@blocklet/sdk/lib/util/login');
2
+ const { messages } = require('@abtnode/auth/lib/auth');
3
+ const { authenticateByVc } = require('@abtnode/auth/lib/server');
4
+ const { PASSPORT_LOG_ACTION } = require('@abtnode/constant');
5
+ const formatContext = require('@abtnode/util/lib/format-context');
6
+
7
+ const logger = require('../../../libs/logger')('blocklet-service:connect-cli');
8
+ const { utils } = require('../../../libs/connect/session');
9
+ const { PASSPORT_VC_TYPES } = require('../../../libs/auth/utils');
10
+ const { getTrustedIssuers } = require('../../../util/blocklet-utils');
11
+
12
+ const allowedRoles = ['owner', 'admin'];
13
+
14
+ module.exports = function createRoutes(node) {
15
+ return {
16
+ action: 'gen-access-key',
17
+ onConnect: async ({ request, userDid, extraParams: { locale } }) => {
18
+ const checkUserRole = await utils.checkUserRole({ node, userDid, locale, request, roles: allowedRoles });
19
+ return checkUserRole;
20
+ },
21
+
22
+ onAuth: async ({ request, userDid, challenge, claims, updateSession, extraParams }) => {
23
+ const { locale } = extraParams;
24
+ const sourceAppPid = getSourceAppPid(request);
25
+ const blocklet = await request.getBlocklet();
26
+
27
+ const { role, user, passport } = await authenticateByVc({
28
+ node,
29
+ locale,
30
+ teamDid: blocklet.appPid,
31
+ userDid,
32
+ claims,
33
+ challenge,
34
+ types: PASSPORT_VC_TYPES,
35
+ trustedIssuers: await getTrustedIssuers(blocklet, { sourceAppPid }),
36
+ action: 'gen-access-key',
37
+ });
38
+
39
+ if (!allowedRoles.includes(role)) {
40
+ throw new Error(messages.notAllowed[locale]);
41
+ }
42
+
43
+ if (passport) {
44
+ await node.createPassportLog(
45
+ blocklet.appPid,
46
+ {
47
+ passportId: passport.id,
48
+ action: PASSPORT_LOG_ACTION.USED,
49
+ operatorDid: userDid,
50
+ metadata: {
51
+ action: 'gen-access-key',
52
+ ownerDid: userDid,
53
+ userDid: user.did,
54
+ },
55
+ },
56
+ request
57
+ );
58
+ }
59
+
60
+ const teamDid = blocklet.meta.did;
61
+
62
+ const { accessKeyId, accessKeySecret, expireAt } = await node.createAccessKey(
63
+ { teamDid, remark: extraParams.source, createdVia: 'connect', passport: 'ci' },
64
+ { user }
65
+ );
66
+
67
+ await node.createAuditLog(
68
+ {
69
+ action: 'switchPassport',
70
+ args: { teamDid, userDid, passport, sourceAppPid },
71
+ context: formatContext(Object.assign(request, { user })),
72
+ result: { accessKeyId, expireAt },
73
+ },
74
+ node
75
+ );
76
+
77
+ logger.info('accessKeyId', accessKeyId);
78
+
79
+ await updateSession(
80
+ {
81
+ config: {
82
+ developerDid: userDid,
83
+ accessKeyId,
84
+ accessKeySecret,
85
+ expireAt,
86
+ },
87
+ },
88
+ true
89
+ );
90
+ },
91
+ };
92
+ };
@@ -40,6 +40,8 @@ const createApproveVaultAuth = require('./connect/approve-vault');
40
40
  const createSessionRoutes = require('./session');
41
41
  const createPassportRoutes = require('./passport');
42
42
  const createPasskeyRoutes = require('./passkey');
43
+ const createGenAccessKeyRoutes = require('./connect/gen-access-key');
44
+
43
45
  const { getRedirectUrl, shouldIgnoreUrl, redirectWithoutCache } = require('../../util');
44
46
  const { createConnectToDidSpacesForUserRoute } = require('./connect/connect-to-did-spaces-for-user');
45
47
  const { isEmailKycRequired, isPhoneKycRequired } = require('../../libs/kyc');
@@ -211,6 +213,11 @@ const init = ({ node, options }) => {
211
213
  const { token } = req;
212
214
  await req.ensureUser({ token });
213
215
 
216
+ // Saved for oauth server
217
+ if (req.user) {
218
+ res.locals.user = req.user;
219
+ }
220
+
214
221
  setUserInfoHeaders(req);
215
222
 
216
223
  next();
@@ -247,6 +254,7 @@ const init = ({ node, options }) => {
247
254
  handler.attach(Object.assign({ app }, createVerifyElevatedAuth(node, authenticator, createSessionToken)));
248
255
  handler.attach(Object.assign({ app }, createVerifyDestroyAuth(node, authenticator, createSessionToken)));
249
256
  handler.attach(Object.assign({ app }, createDestroyMyselfAuth(node)));
257
+ handler.attach(Object.assign({ app }, createGenAccessKeyRoutes(node)));
250
258
  });
251
259
  };
252
260
 
@@ -2,7 +2,7 @@ const { createPasskeyHandlers } = require('@abtnode/auth/lib/passkey');
2
2
  const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
3
3
  const { createPassportList, createPassportSwitcher } = require('@abtnode/auth/lib/oauth');
4
4
  const { createTokenFn } = require('../../util');
5
- const { checkUser } = require('../../routes/oauth');
5
+ const { checkUser } = require('../../routes/oauth/client');
6
6
 
7
7
  module.exports = {
8
8
  init(router, node, options, createSessionToken) {