@abtnode/blocklet-services 1.16.42-beta-20250413-121549-22e9a196 → 1.16.42-beta-20250415-224346-080ee735
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/index.js +4 -3
- package/api/libs/auth/index.js +5 -5
- package/api/libs/connect/session.js +29 -3
- package/api/libs/jwt.js +36 -1
- package/api/routes/federated.js +1 -1
- package/api/routes/mcp.js +26 -13
- package/api/routes/{oauth.js → oauth/client.js} +22 -21
- package/api/routes/oauth/server.js +95 -0
- package/api/routes/user.js +5 -4
- package/api/services/auth/connect/gen-access-key.js +92 -0
- package/api/services/auth/index.js +8 -0
- package/api/services/auth/passkey.js +1 -1
- package/api/services/auth/session.js +2 -3
- package/api/services/dashboard/index.js +6 -0
- package/api/services/mcp/server.js +151 -32
- package/api/services/notification/queue.js +9 -6
- package/api/services/oauth/server.js +213 -0
- package/api/util/index.js +1 -1
- package/api/util/user-util.js +1 -21
- package/dist/assets/AdapterDayjs-BLBXeg9J.js +3 -0
- package/dist/assets/{ArrowDropDown-a-C4j7Lx.js → ArrowDropDown--dAaadP8.js} +1 -1
- package/dist/assets/{CheckCircle-CuYzdCtm.js → CheckCircle-Av1UotA-.js} +1 -1
- package/dist/assets/{ChevronLeft-CnflXey6.js → ChevronLeft-De8Da-PB.js} +1 -1
- package/dist/assets/{ChevronRight-DE7hYCb3.js → ChevronRight-CQOI2CyK.js} +1 -1
- package/dist/assets/{Community-C8NtUXNH.js → Community-B_YqAP9P.js} +1 -1
- package/dist/assets/{DeleteOutline-PGhagisl.js → DeleteOutline-Cgoi-K0i.js} +1 -1
- package/dist/assets/{Done-BVaQae1-.js → Done-BYuUlh_s.js} +1 -1
- package/dist/assets/{Download-DNNh4N1T.js → Download-DUKR_Wkm.js} +1 -1
- package/dist/assets/Edit-D2RQMivt.js +1 -0
- package/dist/assets/{EditIcon-Y1U-3M09.js → EditIcon-5ixNT5sW.js} +1 -1
- package/dist/assets/{Email-BYzCrU9G.js → Email-RGD-rKFl.js} +1 -1
- package/dist/assets/{Error-C4dVUMw4.js → Error-By0ZMWzh.js} +1 -1
- package/dist/assets/{ExpandLess-Blh1x-4z.js → ExpandLess-BNGLjxae.js} +1 -1
- package/dist/assets/{Google-CAujGJ1A.js → Google-tZCjvU7D.js} +1 -1
- package/dist/assets/{Holiday-DxDxhx5X.js → Holiday-C_1hMIGZ.js} +1 -1
- package/dist/assets/{InfoOutlined-DF9JwavD.js → InfoOutlined-DSoJjRQo.js} +1 -1
- package/dist/assets/{Launch-gOz_lwLg.js → Launch-B161pSEw.js} +1 -1
- package/dist/assets/{LaunchOutlined-MbSPR9qn.js → LaunchOutlined-wehxIahb.js} +1 -1
- package/dist/assets/{Location-CEwgGcA5.js → Location-B6FoL795.js} +1 -1
- package/dist/assets/{LockIcon-D7BH0t_p.js → LockIcon-D3vSMIOk.js} +1 -1
- package/dist/assets/{Meeting-BJz5QiFc.js → Meeting-BfKca-xn.js} +1 -1
- package/dist/assets/{MoreHoriz-CGWVyYh4.js → MoreHoriz-Bo_R2nuS.js} +1 -1
- package/dist/assets/{OffSick--msvqLGm.js → OffSick-QPPyYyU6.js} +1 -1
- package/dist/assets/{Phone-CDl3oDYG.js → Phone-_lRBpoVi.js} +1 -1
- package/dist/assets/{PlayArrow-CxWt6459.js → PlayArrow-D38lbyGo.js} +1 -1
- package/dist/assets/{QuestionMarkCircle-CPHZnM6u.js → QuestionMarkCircle-B4EnwYju.js} +1 -1
- package/dist/assets/{ServerLogo-vX_nf8Sc.js → ServerLogo-BW4PKwV0.js} +1 -1
- package/dist/assets/{Timezone-uXi4_8BX.js → Timezone-bYzGwn3x.js} +1 -1
- package/dist/assets/{TuneOutlined-DcqnBMqE.js → TuneOutlined-DMMtKa6E.js} +1 -1
- package/dist/assets/{ViewList-B6eveRY-.js → ViewList-CMIoKrN6.js} +1 -1
- package/dist/assets/{WorkingRemotely-CK4z1-Sd.js → WorkingRemotely-BK9_vlZ-.js} +1 -1
- package/dist/assets/{access-control-Dxyg5dpc.js → access-control-DLD9n3S7.js} +1 -1
- package/dist/assets/actions-CMsM02NP.js +1 -0
- package/dist/assets/add-component-core-FnU4dwXM.js +763 -0
- package/dist/assets/{add-resource-BetUBTvt.js → add-resource-CubCXHBS.js} +1 -1
- package/dist/assets/{addon-B1aBsfOX.js → addon-5JaI2ctX.js} +1 -1
- package/dist/assets/advanced-D4wfoh0v.js +14 -0
- package/dist/assets/api-3sG9at7i.js +1 -0
- package/dist/assets/appearance-BUsj4DWC.js +1 -0
- package/dist/assets/{ar-DrRqcx2b.js → ar-BUQWR0Zu.js} +1 -1
- package/dist/assets/{ar-Cb5zQ0go.js → ar-CMzth4YC.js} +3 -3
- package/dist/assets/{audit-logs-SSAqJt40.js → audit-logs-rk_iUYcM.js} +3 -3
- package/dist/assets/authorize-CDJXjmiI.js +1 -0
- package/dist/assets/{base32-iVyUiizz.js → base32-BhlNgZPk.js} +1 -1
- package/dist/assets/{branding-BDuOcSfH.js → branding-BBbE2Klb.js} +1 -1
- package/dist/assets/branding-JQ1914RB.js +40 -0
- package/dist/assets/{bundle-avatar-DfAWUEqX.js → bundle-avatar-woUZoGoi.js} +1 -1
- package/dist/assets/button-Rx3uHycr.js +1 -0
- package/dist/assets/click-to-copy-BxZJa7n5.js +1 -0
- package/dist/assets/cloneDeep-kMVNpUap.js +1 -0
- package/dist/assets/{complete-R99mlHBI.js → complete-KnPBZq-P.js} +2 -2
- package/dist/assets/{component-By64LaLD.js → component-fD-EGTLm.js} +80 -80
- package/dist/assets/{config-BvNNOdw8.js → config-8xeoVfWN.js} +2 -2
- package/dist/assets/{config-BHBxeyYh.js → config-DbqQgRSU.js} +1 -1
- package/dist/assets/{config-navigation-CPd_4svD.js → config-navigation-DrgPbe5I.js} +6 -6
- package/dist/assets/{config-space-BgWEAM0m.js → config-space-DZ9w_4_9.js} +1 -1
- package/dist/assets/confirm-_RIb3OmR.js +7 -0
- package/dist/assets/connect-CJOq1BXE.js +5 -0
- package/dist/assets/{connect-Bq-p3hnS.js → connect-CPIImVme.js} +1 -1
- package/dist/assets/{connect-to-bQVCrkhh.js → connect-to-BdhN0BHi.js} +1 -1
- package/dist/assets/{content-layout-CFHoSupA.js → content-layout-BM34AwsG.js} +1 -1
- package/dist/assets/dashboard-vsk4QHJ1.js +275 -0
- package/dist/assets/de-BkBUnf4o.js +13 -0
- package/dist/assets/{de-BRPos3d1.js → de-_X0eQXZu.js} +1 -1
- package/dist/assets/delete-confirm-DaoAi4Gz.js +1 -0
- package/dist/assets/did-address-CGHn52xI.js +1 -0
- package/dist/assets/domain-BJUSWYGQ.js +9 -0
- package/dist/assets/domain-action-card-9r42-rWK.js +29 -0
- package/dist/assets/domains-BNDFk-7R.js +1 -0
- package/dist/assets/{email-JviRloBo.js → email-fp1LVcF6.js} +3 -3
- package/dist/assets/empty-spinner-Ict2ItjU.js +1 -0
- package/dist/assets/es-C47yMWlQ.js +14 -0
- package/dist/assets/{es-D2rCdMgt.js → es-yHIDSG5r.js} +1 -1
- package/dist/assets/{exchange-passport-3aXbJr-q.js → exchange-passport-DIyhYtFS.js} +1 -1
- package/dist/assets/{format-error-BrmqJs5a.js → format-error-LAoTjvJe.js} +1 -1
- package/dist/assets/{fr-Chv_7X3-.js → fr-CXUB715N.js} +3 -3
- package/dist/assets/{fr-DAFx50ef.js → fr-D6i3bCqR.js} +1 -1
- package/dist/assets/{fuel-DOs3bqYm.js → fuel-aGwI1uP2.js} +1 -1
- package/dist/assets/gen-access-key-DMS1kzry.js +2 -0
- package/dist/assets/{get-safe-url-CWgEUVPT.js → get-safe-url-DMordnyN.js} +1 -1
- package/dist/assets/{get-safe-url-eATw6wn7.js → get-safe-url-DW2Z07ex.js} +1 -1
- package/dist/assets/{hi-CkD7b6N9.js → hi-ChVLDWm_.js} +1 -1
- package/dist/assets/hi-DCG5QxbH.js +11 -0
- package/dist/assets/{home-a0RwGUp7.js → home-B_gUzcjU.js} +1 -1
- package/dist/assets/id-BjbrrkXh.js +14 -0
- package/dist/assets/{id-BMWKdVei.js → id-D6XXuY_a.js} +1 -1
- package/dist/assets/{iframe-DVBEjxC1.js → iframe-BEanRyio.js} +1 -1
- package/dist/assets/index-4rY7Xp2W.js +14 -0
- package/dist/assets/{index-CwdXL2a0.js → index-AhbLOD9c.js} +1 -1
- package/dist/assets/{index-DrUxhMM5.js → index-BDNlzmD0.js} +4 -4
- package/dist/assets/{index-Th4BUzmb.js → index-BPa_QtWl.js} +30 -30
- package/dist/assets/index-BjN8LAYh.js +224 -0
- package/dist/assets/index-BmexzVQt.js +1 -0
- package/dist/assets/{index-C1nvgBfF.js → index-C-7MyHbp.js} +1 -1
- package/dist/assets/index-C0hr4pkt.js +346 -0
- package/dist/assets/{index-BGeUo-5w.js → index-CFJtmMCn.js} +1 -1
- package/dist/assets/index-CFkRKsyT.js +290 -0
- package/dist/assets/{index-9aeq_G-H.js → index-CX4jvZnM.js} +1 -1
- package/dist/assets/{index-DQIxR9j5.js → index-CbW18ndN.js} +2 -2
- package/dist/assets/index-CcjD0qiY.js +93 -0
- package/dist/assets/{index-DjIOxw8x.js → index-D1fVmwHN.js} +1 -1
- package/dist/assets/{index-VvWvVQT8.js → index-D22ZWGxu.js} +1 -1
- package/dist/assets/{index-BBl5mftj.js → index-D22lazSG.js} +3 -3
- package/dist/assets/{index-BVOsgGKh.js → index-D2EAXstd.js} +2 -2
- package/dist/assets/index-DBZZ-U66.js +1 -0
- package/dist/assets/index-DUQK_NaI.js +113 -0
- package/dist/assets/{index-DBLdE2lQ.js → index-D_gSWW1P.js} +1 -1
- package/dist/assets/index-DbpVrp8z.js +138 -0
- package/dist/assets/{index-MqiIu4kd.js → index-DkPKxdcu.js} +1 -1
- package/dist/assets/{index-sv3a1ZUw.js → index-DzDfEcNp.js} +1 -1
- package/dist/assets/{index-CCwUSMuP.js → index-O2l0NSUF.js} +1 -1
- package/dist/assets/{index-CPE8Apzb.js → index-pV_0wOyY.js} +1 -1
- package/dist/assets/{index-DVQCgvFb.js → index-tUQxVYYQ.js} +1 -1
- package/dist/assets/index-xa5W6ExD.js +1 -0
- package/dist/assets/{invitation-CwtXOXZc.js → invitation-D-l4US6a.js} +3 -3
- package/dist/assets/invite-DPswrm4J.js +1 -0
- package/dist/assets/{issue-passport-DtEbcgX6.js → issue-passport-AJghkFHK.js} +1 -1
- package/dist/assets/item-zk7clNKz.js +2 -0
- package/dist/assets/{ja-D2jInSAT.js → ja-DKZCt8Yp.js} +1 -1
- package/dist/assets/ja-DmNZQIta.js +14 -0
- package/dist/assets/{ko-BGB5KJZq.js → ko-B0uE9AyQ.js} +1 -1
- package/dist/assets/ko-CfYwMwZz.js +14 -0
- package/dist/assets/{landing-page-BM1TmagN.js → landing-page-D13wALfk.js} +1 -1
- package/dist/assets/{launch-result-message-DOa3SWMR.js → launch-result-message-Bvdtucih.js} +1 -1
- package/dist/assets/{layout-DCzN0ui5.js → layout-aS-gjZH3.js} +1 -1
- package/dist/assets/list-CJt5nOcn.js +234 -0
- package/dist/assets/{list-header-BLGbkNad.js → list-header-Bm8u_Z_p.js} +1 -1
- package/dist/assets/localization-Us9buoy1.js +1 -0
- package/dist/assets/{log-C0ajhie8.js → log-DFaz-U9x.js} +7 -7
- package/dist/assets/{logger-D6n4nbwy.js → logger-DXlQ8ejK.js} +1 -1
- package/dist/assets/{login-f1AXbIm0.js → login-DKSu0ge6.js} +1 -1
- package/dist/assets/login-oauth-callback-CP7cNspN.js +1 -0
- package/dist/assets/{logo-uploader-DbAVW3BS.js → logo-uploader-B7i5QemW.js} +5 -5
- package/dist/assets/{lost-passport-Dlmv8D-L.js → lost-passport-QRUn4RXe.js} +3 -3
- package/dist/assets/{lottie-react.esm-D2t-u0YU.js → lottie-react.esm-CPHH620R.js} +1 -1
- package/dist/assets/{lottie-web-jYmAQWuC.js → lottie-web-B6s7dDoL.js} +1 -1
- package/dist/assets/omit-MMUW2k9W.js +1 -0
- package/dist/assets/{open-window-DskgWqba.js → open-window-B6LZyZAW.js} +1 -1
- package/dist/assets/{overview-DY9-9zrL.js → overview-B3A_5sHO.js} +2 -2
- package/dist/assets/{page-header-XbzfRkA7.js → page-header-DUh_2MUQ.js} +1 -1
- package/dist/assets/passport-item-BY6VS7Ot.js +1 -0
- package/dist/assets/{permission-Bi46fqEy.js → permission-DKFJEWNH.js} +1 -1
- package/dist/assets/preferences-CA76rfbp.js +1 -0
- package/dist/assets/profile-embed-DHFHXO1W.js +1 -0
- package/dist/assets/{pt-DY0Ku5W5.js → pt-DCzE4kPq.js} +1 -1
- package/dist/assets/pt-DD_rP5GH.js +12 -0
- package/dist/assets/publish-resource-rxvf6s83.js +1 -0
- package/dist/assets/{raf-schd.esm-B3j6BePR.js → raf-schd.esm-GV-XhwE0.js} +1 -1
- package/dist/assets/{react-beautiful-dnd.esm-B68lWn23.js → react-beautiful-dnd.esm-D0nBCaor.js} +1 -1
- package/dist/assets/{relative-time-BeR_4mfM.js → relative-time-BK3hjJNN.js} +1 -1
- package/dist/assets/roboto-latin-400-normal-BVyCgWwA.woff +0 -0
- package/dist/assets/roboto-latin-400-normal-DXyFPIdK.woff2 +0 -0
- package/dist/assets/roboto-latin-500-normal-C6iW8rdg.woff2 +0 -0
- package/dist/assets/roboto-latin-500-normal-rpP1_v3s.woff +0 -0
- package/dist/assets/roboto-latin-700-normal-BWcFiwQV.woff +0 -0
- package/dist/assets/roboto-latin-700-normal-CbYYDfWS.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-400-normal-BSFkPfbf.woff +0 -0
- package/dist/assets/roboto-latin-ext-400-normal-DgXbz5gU.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-500-normal-DvHxAkTn.woff +0 -0
- package/dist/assets/roboto-latin-ext-500-normal-OQJhyaXd.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-700-normal-Ba-CAIIA.woff +0 -0
- package/dist/assets/roboto-latin-ext-700-normal-DchBbzVz.woff2 +0 -0
- package/dist/assets/{ru-Cv5vRo7s.js → ru-B9yj9TuE.js} +1 -1
- package/dist/assets/ru-CwgUUzV8.js +11 -0
- package/dist/assets/runtime-D_bXZ0w0.js +1 -0
- package/dist/assets/sdk-Hg_BMu_u.js +1 -0
- package/dist/assets/{security-DmR541pi.js → security-DEmFjZiu.js} +1 -1
- package/dist/assets/session-DB9Du-lc.js +1 -0
- package/dist/assets/setup-kkb6SvQ7.js +19 -0
- package/dist/assets/{shorten-label-BuH-7PI8.js → shorten-label-CwDvu4_S.js} +1 -1
- package/dist/assets/simple-select-DgqUhMvQ.js +1 -0
- package/dist/assets/{slicedToArray-C0MW3KIe.js → slicedToArray-B8PdYes9.js} +1 -1
- package/dist/assets/{spaces-gLUqr6Uq.js → spaces-25E9GQ6_.js} +1 -1
- package/dist/assets/{start-XbVMHGiE.js → start-DfEUlPuS.js} +1 -1
- package/dist/assets/{status-DmyvEkKL.js → status-CUyAteC9.js} +1 -1
- package/dist/assets/{step-actions-brdohYRv.js → step-actions-CAgwlOEY.js} +1 -1
- package/dist/assets/{studio-DJeZlIfF.js → studio-2U2-FOOC.js} +1 -1
- package/dist/assets/{switch-control-Br1YNOSB.js → switch-control-DwTxPESj.js} +1 -1
- package/dist/assets/th-KqE3tuDR.js +12 -0
- package/dist/assets/{th-D6oDBVGi.js → th-et0IV3ES.js} +1 -1
- package/dist/assets/traffic-B94bYvtf.js +35 -0
- package/dist/assets/{transfer-DboKwiA_.js → transfer-DWjvJtPs.js} +1 -1
- package/dist/assets/{unsubscribe-C9k_L3g5.js → unsubscribe-CTZlUfqc.js} +1 -1
- package/dist/assets/use-mobile-BHPd3bDQ.js +1 -0
- package/dist/assets/use-mobile-CHMVa8_W.js +1 -0
- package/dist/assets/useAsync-DKE0K0bz.js +1 -0
- package/dist/assets/useAsyncRetry-BBomZj1z.js +7 -0
- package/dist/assets/{useLocalStorage-0mjZfnua.js → useLocalStorage-DKl7XFfI.js} +1 -1
- package/dist/assets/{useSetState-CWq0AVWn.js → useSetState-BL3ktMon.js} +1 -1
- package/dist/assets/user-center-Du6EtGgy.js +77 -0
- package/dist/assets/{util-YnaMqM3B.js → util-BEvdQ5nP.js} +1 -1
- package/dist/assets/{util-DLK92HF8.js → util-DkIhTuT7.js} +1 -1
- package/dist/assets/{vendor-arcblock-DPMnO1AO.js → vendor-arcblock-ACo-BN0q.js} +26 -26
- package/dist/assets/{vendor-hooks-DN4nZ7TU.js → vendor-hooks-BwVH-TAd.js} +2 -2
- package/dist/assets/{vendor-mui-core-x3zpe_j_.js → vendor-mui-core-DxD1UA4o.js} +2 -2
- package/dist/assets/vendor-mui-x-Bit8yv3W.js +6 -0
- package/dist/assets/{vendor-react-DEoibe3W.js → vendor-react-DoD83n6N.js} +1 -1
- package/dist/assets/vendor-utils-CTIzdAFg.js +11 -0
- package/dist/assets/vendor-ux-did-connect-2GapMFC4.css +1 -0
- package/dist/assets/vendor-ux-did-connect-DOjsg91L.js +1832 -0
- package/dist/assets/vi-BSkiIyr-.js +12 -0
- package/dist/assets/{vi-BKKJMbW2.js → vi-LBvVt_pj.js} +1 -1
- package/dist/assets/wrap-locale-DjpRZNtr.js +1 -0
- package/dist/assets/{zh-nDA-W8Iz.js → zh-BYP8UvRZ.js} +4 -4
- package/dist/assets/{zh-tw-B9PQstHP.js → zh-tw-Dcs2VpLv.js} +3 -3
- package/dist/assets/{zh-tw-B08rjgK3.js → zh-tw-l3XXo5aT.js} +1 -1
- package/dist/assets/{zh-gJhiLbCP.js → zh-yJzqRkfw.js} +1 -1
- package/dist/index.html +9 -9
- package/dist/service-worker.js +2 -2
- package/package.json +44 -43
- package/dist/assets/actions-BAjt7G_t.js +0 -1
- package/dist/assets/add-component-core-BXowXTJz.js +0 -762
- package/dist/assets/advanced-C8t1232G.js +0 -14
- package/dist/assets/api-kwOW9mRz.js +0 -1
- package/dist/assets/appearance-BIOmTg1q.js +0 -1
- package/dist/assets/branding-NmIAi0kv.js +0 -40
- package/dist/assets/button-Kk1bqv_H.js +0 -1
- package/dist/assets/click-to-copy-DCUroWft.js +0 -1
- package/dist/assets/cloneDeep-DHAAvuEH.js +0 -1
- package/dist/assets/confirm-92J4n1RP.js +0 -7
- package/dist/assets/connect-D20f2K4u.js +0 -5
- package/dist/assets/dashboard-BgQFc2Pc.js +0 -262
- package/dist/assets/de-BOcpEFUQ.js +0 -13
- package/dist/assets/delete-confirm-AkwIQ5yF.js +0 -1
- package/dist/assets/did-address-D4v6iN2l.js +0 -1
- package/dist/assets/domain-CBdLs2D9.js +0 -9
- package/dist/assets/domain-action-card-DN3KjFwP.js +0 -29
- package/dist/assets/domains-CMJbalsn.js +0 -1
- package/dist/assets/empty-spinner-DlzuJxRt.js +0 -1
- package/dist/assets/es-DAe7HpzA.js +0 -14
- package/dist/assets/hi-BqgGDMzX.js +0 -11
- package/dist/assets/id-DbN1Ye4x.js +0 -14
- package/dist/assets/index-3q6oLa2e.js +0 -290
- package/dist/assets/index-BJYrBMyS.js +0 -1
- package/dist/assets/index-BxTrfRkG.js +0 -138
- package/dist/assets/index-C3-7zmeY.js +0 -346
- package/dist/assets/index-DWuuU3ta.js +0 -113
- package/dist/assets/index-K5iSHoYm.js +0 -224
- package/dist/assets/index-KLUHbsxg.js +0 -1
- package/dist/assets/invite-CMj5995Z.js +0 -1
- package/dist/assets/item-zVdGBfMR.js +0 -2
- package/dist/assets/ja-Bv-A_sTl.js +0 -14
- package/dist/assets/ko-Bl3kd-sp.js +0 -14
- package/dist/assets/list-BuXPrN1N.js +0 -221
- package/dist/assets/localization-qd6O0FX9.js +0 -1
- package/dist/assets/login-oauth-callback-C5CFUlUR.js +0 -1
- package/dist/assets/omit-IjXSqbDA.js +0 -1
- package/dist/assets/preferences-DPpwnIAs.js +0 -1
- package/dist/assets/profile-embed-DV5vno0C.js +0 -1
- package/dist/assets/pt-B7_jgyK-.js +0 -12
- package/dist/assets/publish-resource-z2_THSz6.js +0 -1
- package/dist/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-400-normal-Dry59Hjn.woff +0 -0
- package/dist/assets/roboto-cyrillic-500-normal-CsCirF4J.woff +0 -0
- package/dist/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-700-normal-CB1Rmiii.woff +0 -0
- package/dist/assets/roboto-cyrillic-700-normal-CzEIZVQR.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-ext-400-normal-BxX1-eA_.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-ext-500-normal-ElvJfk8V.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-700-normal-CIu0AXX2.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-700-normal-D_fA0fHY.woff2 +0 -0
- package/dist/assets/roboto-greek-400-normal-CAI06USH.woff +0 -0
- package/dist/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
- package/dist/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
- package/dist/assets/roboto-greek-500-normal-D8eQD5zT.woff +0 -0
- package/dist/assets/roboto-greek-700-normal-DCrt6r9F.woff +0 -0
- package/dist/assets/roboto-greek-700-normal-DpKAje7q.woff2 +0 -0
- package/dist/assets/roboto-latin-400-normal-551zQQ7R.woff +0 -0
- package/dist/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
- package/dist/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
- package/dist/assets/roboto-latin-500-normal-_8jDuD7w.woff +0 -0
- package/dist/assets/roboto-latin-700-normal-CTLkNcF_.woff +0 -0
- package/dist/assets/roboto-latin-700-normal-DZr4b_KL.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-400-normal-uRIBRJt5.woff +0 -0
- package/dist/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-500-normal-eJ10kk0m.woff +0 -0
- package/dist/assets/roboto-latin-ext-700-normal-BNPgmEQS.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-700-normal-Cnx4FGpK.woff +0 -0
- package/dist/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
- package/dist/assets/roboto-math-400-normal-DHrwdhE6.woff +0 -0
- package/dist/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
- package/dist/assets/roboto-math-500-normal-CetgDdIa.woff +0 -0
- package/dist/assets/roboto-math-700-normal-CpTCM92H.woff +0 -0
- package/dist/assets/roboto-math-700-normal-xbpggnJp.woff2 +0 -0
- package/dist/assets/roboto-symbols-400-normal-bG5rsNFs.woff +0 -0
- package/dist/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
- package/dist/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
- package/dist/assets/roboto-symbols-500-normal-toKUCDph.woff +0 -0
- package/dist/assets/roboto-symbols-700-normal-B2QKVW64.woff +0 -0
- package/dist/assets/roboto-symbols-700-normal-DKkQdRpM.woff2 +0 -0
- package/dist/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
- package/dist/assets/roboto-vietnamese-400-normal-DgufTq8s.woff +0 -0
- package/dist/assets/roboto-vietnamese-500-normal-Dw5heWgq.woff +0 -0
- package/dist/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
- package/dist/assets/roboto-vietnamese-700-normal-BFWtvCOj.woff2 +0 -0
- package/dist/assets/roboto-vietnamese-700-normal-ChAl_rRV.woff +0 -0
- package/dist/assets/ru-CToatViJ.js +0 -11
- package/dist/assets/runtime-D6tESY33.js +0 -1
- package/dist/assets/sdk-DNr-nKBq.js +0 -1
- package/dist/assets/session-CJFbMNLl.js +0 -1
- package/dist/assets/setup-BSsqBrsc.js +0 -19
- package/dist/assets/simple-select-DHvjqsw4.js +0 -1
- package/dist/assets/th-23Hwasay.js +0 -12
- package/dist/assets/traffic-LuIcK-L1.js +0 -37
- package/dist/assets/use-mobile-C98e2dYy.js +0 -1
- package/dist/assets/use-mobile-CqLLcWbr.js +0 -1
- package/dist/assets/useAsync-BxB2TpDl.js +0 -1
- package/dist/assets/useAsync-L7_fHBH5.js +0 -1
- package/dist/assets/useAsyncRetry-CEouAsle.js +0 -7
- package/dist/assets/user-center-BaKv3X4J.js +0 -77
- package/dist/assets/vendor-mui-x-CPOc4sOK.js +0 -6
- package/dist/assets/vendor-utils-C3FZIS9A.js +0 -11
- package/dist/assets/vendor-ux-did-connect-B1u6nvmg.js +0 -1832
- package/dist/assets/vendor-ux-did-connect-BDmhBveY.css +0 -1
- package/dist/assets/vi-D-QGxDS1.js +0 -12
- package/dist/assets/wrap-locale-m_NRjq-h.js +0 -1
- /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
|
|
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
|
-
|
|
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);
|
package/api/libs/auth/index.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
|
|
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 ||
|
|
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 ||
|
|
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
|
}
|
package/api/routes/federated.js
CHANGED
|
@@ -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('@
|
|
7
|
+
const { SSEServerTransport } = require('@blocklet/mcp/server/sse.js');
|
|
9
8
|
|
|
10
|
-
const {
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const {
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
const
|
|
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
|
|
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
|
|
159
|
+
return new OauthClient({ provider: OAuthGithub(providerConfig) });
|
|
159
160
|
}
|
|
160
161
|
if (provider === 'google') {
|
|
161
|
-
return new
|
|
162
|
+
return new OauthClient({ provider: OAuthGoogle(providerConfig) });
|
|
162
163
|
}
|
|
163
164
|
if (provider === 'apple') {
|
|
164
|
-
return new
|
|
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 =
|
|
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
|
+
};
|
package/api/routes/user.js
CHANGED
|
@@ -446,7 +446,7 @@ function checkUserSig({ node }) {
|
|
|
446
446
|
}
|
|
447
447
|
|
|
448
448
|
async function loginEmail(req, node, options) {
|
|
449
|
-
const
|
|
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 =
|
|
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
|
|
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
|
|
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) {
|