@abtnode/blocklet-services 1.16.42-beta-20250412-084444-20b0cf19 → 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.
- package/api/index.js +36 -5
- 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/libs/push-kit/index.js +16 -11
- 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-session.js +49 -40
- package/api/routes/user.js +21 -8
- 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 +39 -13
- 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/attach-shared-utils.js +12 -5
- 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-C_E3qkPd.js → ArrowDropDown--dAaadP8.js} +1 -1
- package/dist/assets/{CheckCircle-D7Ntmb2o.js → CheckCircle-Av1UotA-.js} +1 -1
- package/dist/assets/{ChevronLeft-BIgT65EY.js → ChevronLeft-De8Da-PB.js} +1 -1
- package/dist/assets/{ChevronRight-foZmiP4J.js → ChevronRight-CQOI2CyK.js} +1 -1
- package/dist/assets/{Community-Ds1NG5Zj.js → Community-B_YqAP9P.js} +1 -1
- package/dist/assets/{DeleteOutline-CKVA3PXs.js → DeleteOutline-Cgoi-K0i.js} +1 -1
- package/dist/assets/{Done-BDrYSkZM.js → Done-BYuUlh_s.js} +1 -1
- package/dist/assets/{Download-BQiSNQBP.js → Download-DUKR_Wkm.js} +1 -1
- package/dist/assets/Edit-D2RQMivt.js +1 -0
- package/dist/assets/{EditIcon-Bt91o1l6.js → EditIcon-5ixNT5sW.js} +1 -1
- package/dist/assets/{Email-C7SKOpM8.js → Email-RGD-rKFl.js} +1 -1
- package/dist/assets/{Error-CK4gTMoT.js → Error-By0ZMWzh.js} +1 -1
- package/dist/assets/{ExpandLess-1B6PdCYC.js → ExpandLess-BNGLjxae.js} +1 -1
- package/dist/assets/{Google-DimUFzIe.js → Google-tZCjvU7D.js} +1 -1
- package/dist/assets/{Holiday-Dfj3kBBI.js → Holiday-C_1hMIGZ.js} +1 -1
- package/dist/assets/{InfoOutlined-CEHciuDy.js → InfoOutlined-DSoJjRQo.js} +1 -1
- package/dist/assets/{Launch-DX76v5dw.js → Launch-B161pSEw.js} +1 -1
- package/dist/assets/{LaunchOutlined-CnOQGhu-.js → LaunchOutlined-wehxIahb.js} +1 -1
- package/dist/assets/{Location--4ueDivQ.js → Location-B6FoL795.js} +1 -1
- package/dist/assets/{LockIcon-B84lMZao.js → LockIcon-D3vSMIOk.js} +1 -1
- package/dist/assets/{Meeting-CVVnP-bH.js → Meeting-BfKca-xn.js} +1 -1
- package/dist/assets/{MoreHoriz-THEF6D0C.js → MoreHoriz-Bo_R2nuS.js} +1 -1
- package/dist/assets/{OffSick-C_2x7yDI.js → OffSick-QPPyYyU6.js} +1 -1
- package/dist/assets/{Phone-CaKOX2Yu.js → Phone-_lRBpoVi.js} +1 -1
- package/dist/assets/{PlayArrow-DpcMtsY5.js → PlayArrow-D38lbyGo.js} +1 -1
- package/dist/assets/{QuestionMarkCircle-5K6WR8Pc.js → QuestionMarkCircle-B4EnwYju.js} +1 -1
- package/dist/assets/{ServerLogo-C4P-qXGV.js → ServerLogo-BW4PKwV0.js} +1 -1
- package/dist/assets/{Timezone-Bgwxnj29.js → Timezone-bYzGwn3x.js} +1 -1
- package/dist/assets/{TuneOutlined-DHqZ7jGz.js → TuneOutlined-DMMtKa6E.js} +1 -1
- package/dist/assets/{ViewList-DOu7Co_L.js → ViewList-CMIoKrN6.js} +1 -1
- package/dist/assets/{WorkingRemotely-Dm2BOs5c.js → WorkingRemotely-BK9_vlZ-.js} +1 -1
- package/dist/assets/{access-control-wqGz9JCo.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-DmN1IY_o.js → add-resource-CubCXHBS.js} +1 -1
- package/dist/assets/{addon-D1_etOjl.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-DU66CSpw.js → audit-logs-rk_iUYcM.js} +3 -3
- package/dist/assets/authorize-CDJXjmiI.js +1 -0
- package/dist/assets/{base32-CLGITfm-.js → base32-BhlNgZPk.js} +1 -1
- package/dist/assets/{branding-C5rNAfwW.js → branding-BBbE2Klb.js} +1 -1
- package/dist/assets/branding-JQ1914RB.js +40 -0
- package/dist/assets/{bundle-avatar-vSofRY4G.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-BeWyfTmK.js → complete-KnPBZq-P.js} +2 -2
- package/dist/assets/{component-CZ948vh4.js → component-fD-EGTLm.js} +80 -80
- package/dist/assets/{config-CFbM7U_5.js → config-8xeoVfWN.js} +2 -2
- package/dist/assets/{config-DzZULB-q.js → config-DbqQgRSU.js} +1 -1
- package/dist/assets/config-navigation-DrgPbe5I.js +26 -0
- package/dist/assets/{config-space-Drp9NI7a.js → config-space-DZ9w_4_9.js} +1 -1
- package/dist/assets/confirm-_RIb3OmR.js +7 -0
- package/dist/assets/{connect-0zFqdTRm.js → connect-CJOq1BXE.js} +1 -1
- package/dist/assets/{connect-CpUC5BAX.js → connect-CPIImVme.js} +1 -1
- package/dist/assets/{connect-to-BasQxweP.js → connect-to-BdhN0BHi.js} +1 -1
- package/dist/assets/{content-layout-Bs-vdQ_U.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-C5iUsSjP.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-CyGvLDal.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-C5H_z1Ay.js → fuel-aGwI1uP2.js} +1 -1
- package/dist/assets/gen-access-key-DMS1kzry.js +2 -0
- package/dist/assets/{get-safe-url-BOY9UAaI.js → get-safe-url-DMordnyN.js} +1 -1
- package/dist/assets/{get-safe-url-D_Puq_oh.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-CjHQSa_8.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-BhRKCdFb.js → iframe-BEanRyio.js} +1 -1
- package/dist/assets/index-4rY7Xp2W.js +14 -0
- package/dist/assets/{index-CjmXl7jW.js → index-AhbLOD9c.js} +1 -1
- package/dist/assets/{index-CYAgDp3G.js → index-BDNlzmD0.js} +4 -4
- package/dist/assets/{index-BjYech25.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-d34Q6nXR.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-CVIeQOoE.js → index-CbW18ndN.js} +2 -2
- package/dist/assets/index-CcjD0qiY.js +93 -0
- package/dist/assets/{index-Cuoxr9xB.js → index-D1fVmwHN.js} +1 -1
- package/dist/assets/{index-Du2DtxVt.js → index-D22ZWGxu.js} +1 -1
- package/dist/assets/{index-C5lvlGzp.js → index-D22lazSG.js} +3 -3
- package/dist/assets/{index-B8FtPEFx.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-Ctl8J5Z5.js → index-D_gSWW1P.js} +1 -1
- package/dist/assets/index-DbpVrp8z.js +138 -0
- package/dist/assets/{index-BYsXlcQC.js → index-DkPKxdcu.js} +1 -1
- package/dist/assets/{index-DkZfhapD.js → index-DzDfEcNp.js} +1 -1
- package/dist/assets/{index-BTOIZL6e.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-C9hFp_wD.js → invitation-D-l4US6a.js} +3 -3
- package/dist/assets/invite-DPswrm4J.js +1 -0
- package/dist/assets/{issue-passport-D3F63x7z.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-B5nKEn_3.js → landing-page-D13wALfk.js} +1 -1
- package/dist/assets/{launch-result-message-C0Ao1hE-.js → launch-result-message-Bvdtucih.js} +1 -1
- package/dist/assets/{layout-D5ALyxXA.js → layout-aS-gjZH3.js} +1 -1
- package/dist/assets/list-CJt5nOcn.js +234 -0
- package/dist/assets/{list-header-BibBP5t1.js → list-header-Bm8u_Z_p.js} +1 -1
- package/dist/assets/localization-Us9buoy1.js +1 -0
- package/dist/assets/{log-Dg8IZoeo.js → log-DFaz-U9x.js} +7 -7
- package/dist/assets/{logger-Bd77RetM.js → logger-DXlQ8ejK.js} +1 -1
- package/dist/assets/{login-B9XiO8eS.js → login-DKSu0ge6.js} +1 -1
- package/dist/assets/login-oauth-callback-CP7cNspN.js +1 -0
- package/dist/assets/{logo-uploader-ChABQ_cS.js → logo-uploader-B7i5QemW.js} +5 -5
- package/dist/assets/{lost-passport-gGzRW--h.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-CX_mRFPs.js → open-window-B6LZyZAW.js} +1 -1
- package/dist/assets/{overview-ClfPLbRa.js → overview-B3A_5sHO.js} +2 -2
- package/dist/assets/{page-header-DWf5vODI.js → page-header-DUh_2MUQ.js} +1 -1
- package/dist/assets/passport-item-BY6VS7Ot.js +1 -0
- package/dist/assets/{permission-CmHMB8NK.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-B3HYEQUw.js → react-beautiful-dnd.esm-D0nBCaor.js} +1 -1
- package/dist/assets/{relative-time-CE47D6s7.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-DmjkCoJ_.js → security-DEmFjZiu.js} +1 -1
- package/dist/assets/session-DB9Du-lc.js +1 -0
- package/dist/assets/{setup-DLCw2h80.js → setup-kkb6SvQ7.js} +4 -4
- package/dist/assets/{shorten-label-DDBwv81M.js → shorten-label-CwDvu4_S.js} +1 -1
- package/dist/assets/simple-select-DgqUhMvQ.js +1 -0
- package/dist/assets/{slicedToArray-Da5X2Yv5.js → slicedToArray-B8PdYes9.js} +1 -1
- package/dist/assets/{spaces-CyFGYf34.js → spaces-25E9GQ6_.js} +1 -1
- package/dist/assets/{start-CwSXw9Xs.js → start-DfEUlPuS.js} +1 -1
- package/dist/assets/{status-CgfGREVl.js → status-CUyAteC9.js} +1 -1
- package/dist/assets/{step-actions-BNW8I1sI.js → step-actions-CAgwlOEY.js} +1 -1
- package/dist/assets/{studio-cLKWVbyy.js → studio-2U2-FOOC.js} +1 -1
- package/dist/assets/{switch-control-DpvMHPLC.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-BHifjdxl.js → transfer-DWjvJtPs.js} +1 -1
- package/dist/assets/{unsubscribe-CcyOqX8E.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-BENTIUEf.js → useAsync-DKE0K0bz.js} +1 -1
- package/dist/assets/{useAsyncRetry-DSYkC9r5.js → useAsyncRetry-BBomZj1z.js} +2 -2
- package/dist/assets/{useLocalStorage-Cq9THoCr.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-BmbbisPE.js → util-BEvdQ5nP.js} +1 -1
- package/dist/assets/{util-1n1Ulk5w.js → util-DkIhTuT7.js} +1 -1
- package/dist/assets/{vendor-arcblock-V3HYELzG.js → vendor-arcblock-ACo-BN0q.js} +83 -83
- package/dist/assets/{vendor-hooks-DN4nZ7TU.js → vendor-hooks-BwVH-TAd.js} +2 -2
- package/dist/assets/{vendor-mui-core-1jJmAutq.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 +45 -43
- package/dist/assets/actions-CAL1KFv7.js +0 -1
- package/dist/assets/add-component-core-DqvSoT6a.js +0 -762
- package/dist/assets/advanced-CzJgEcda.js +0 -14
- package/dist/assets/api-kwOW9mRz.js +0 -1
- package/dist/assets/appearance-Bn0kYJHu.js +0 -1
- package/dist/assets/branding-CiE421Dn.js +0 -40
- package/dist/assets/button-BSJ2z68-.js +0 -1
- package/dist/assets/click-to-copy-C9iEVQIO.js +0 -1
- package/dist/assets/cloneDeep-DHAAvuEH.js +0 -1
- package/dist/assets/config-navigation-hrdLDyFZ.js +0 -26
- package/dist/assets/confirm-B9OqaJpT.js +0 -7
- package/dist/assets/dashboard-BYUKOMAe.js +0 -262
- package/dist/assets/de-BOcpEFUQ.js +0 -13
- package/dist/assets/delete-confirm-CM4f-ajO.js +0 -1
- package/dist/assets/did-address-B_VfxEC5.js +0 -1
- package/dist/assets/domain-D0xqhxvZ.js +0 -9
- package/dist/assets/domain-action-card-pHkmKFE3.js +0 -29
- package/dist/assets/domains-BrNRyjCn.js +0 -1
- package/dist/assets/empty-spinner-Cia24BVr.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-Bee_YcJC.js +0 -113
- package/dist/assets/index-Cp_gD4ZQ.js +0 -1
- package/dist/assets/index-D3YZfNxX.js +0 -5
- package/dist/assets/index-DFoYVoMG.js +0 -346
- package/dist/assets/index-DR9nQ2tJ.js +0 -1
- package/dist/assets/index-DUU3hQpo.js +0 -138
- package/dist/assets/index-Dzvf3kMf.js +0 -220
- package/dist/assets/index-Kaq7tC6c.js +0 -290
- package/dist/assets/invite-CzfqL5Tx.js +0 -1
- package/dist/assets/item-C_TigVeC.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-DuzdV0Wa.js +0 -221
- package/dist/assets/localization-WUgLuLwU.js +0 -1
- package/dist/assets/login-oauth-callback-5AlLzjZ2.js +0 -1
- package/dist/assets/omit-IjXSqbDA.js +0 -1
- package/dist/assets/preferences-COMN8FgJ.js +0 -1
- package/dist/assets/profile-embed-Crj1xM6Z.js +0 -1
- package/dist/assets/pt-B7_jgyK-.js +0 -12
- package/dist/assets/publish-resource-C6TOyrHC.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-CdKbOwQM.js +0 -1
- package/dist/assets/sdk-j4w1A_X4.js +0 -1
- package/dist/assets/session-0rF5SuCk.js +0 -1
- package/dist/assets/simple-select-vCKkiHhG.js +0 -1
- package/dist/assets/th-23Hwasay.js +0 -12
- package/dist/assets/traffic-ChJb5Oyl.js +0 -37
- package/dist/assets/use-mobile-DjnNmGRG.js +0 -1
- package/dist/assets/use-mobile-DpXDDjat.js +0 -1
- package/dist/assets/user-center-DfDG_giT.js +0 -77
- package/dist/assets/vendor-mui-x-CPwlD3uT.js +0 -6
- package/dist/assets/vendor-utils-C3FZIS9A.js +0 -11
- package/dist/assets/vendor-ux-did-connect-BDmhBveY.css +0 -1
- package/dist/assets/vendor-ux-did-connect-DEbq97Xz.js +0 -1832
- package/dist/assets/vi-D-QGxDS1.js +0 -12
- package/dist/assets/wrap-locale-5LSB6OAr.js +0 -1
- /package/api/services/oauth/{index.js → client.js} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/* eslint-disable no-await-in-loop */
|
|
2
2
|
const {
|
|
3
3
|
WELLKNOWN_SERVICE_PATH_PREFIX,
|
|
4
|
-
SESSION_TTL,
|
|
5
4
|
PASSPORT_LOG_ACTION,
|
|
6
5
|
PASSPORT_STATUS,
|
|
6
|
+
SESSION_TTL,
|
|
7
7
|
} = require('@abtnode/constant');
|
|
8
8
|
const { LOGIN_PROVIDER } = require('@blocklet/constant');
|
|
9
9
|
const pick = require('lodash/pick');
|
|
@@ -13,7 +13,7 @@ const omit = require('lodash/omit');
|
|
|
13
13
|
const pLimit = require('p-limit');
|
|
14
14
|
const { getSourceProvider } = require('@blocklet/meta/lib/did-utils');
|
|
15
15
|
const getRequestIP = require('@abtnode/util/lib/get-request-ip');
|
|
16
|
-
const { getFederatedMembers, getFederatedMaster } = require('@abtnode/auth/lib/util/federated');
|
|
16
|
+
const { getFederatedMembers, getFederatedMaster, findFederatedSite } = require('@abtnode/auth/lib/util/federated');
|
|
17
17
|
const { messages } = require('@abtnode/auth/lib/auth');
|
|
18
18
|
const { Joi } = require('@arcblock/validator');
|
|
19
19
|
const { getDeviceData } = require('@abtnode/util/lib/device');
|
|
@@ -51,12 +51,16 @@ async function getPassportFromFederatedSite(passportId, { appPid, node, teamDid,
|
|
|
51
51
|
return undefined;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
function patchUserSessionStatus(userSession, { blocklet }) {
|
|
55
55
|
const sessionTtl = blocklet.settings?.session?.ttl || SESSION_TTL;
|
|
56
56
|
// 修正当前 session 的 status,如果超出时间了,则应该显示为过期
|
|
57
57
|
if (Date.now() - new Date(userSession.updatedAt).getTime() > sessionTtl * 1000) {
|
|
58
58
|
userSession.status = 'expired';
|
|
59
59
|
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function patchUserSessionData(userSession, { blocklet, appPid, teamDid, node }) {
|
|
63
|
+
patchUserSessionStatus(userSession, { blocklet });
|
|
60
64
|
// 修正 avatar 地址,从 bn:// 转换为 http
|
|
61
65
|
if (userSession.user?.avatar) {
|
|
62
66
|
userSession.user.avatar = getUserAvatarUrl(userSession.user.avatar, blocklet);
|
|
@@ -154,9 +158,8 @@ module.exports = {
|
|
|
154
158
|
}
|
|
155
159
|
|
|
156
160
|
const teamDid = blocklet.appPid;
|
|
157
|
-
const
|
|
161
|
+
const validSession = await node.getUserSession({
|
|
158
162
|
teamDid,
|
|
159
|
-
userDid: validUserSession.userDid,
|
|
160
163
|
id: validUserSession.id,
|
|
161
164
|
});
|
|
162
165
|
|
|
@@ -338,35 +341,31 @@ module.exports = {
|
|
|
338
341
|
|
|
339
342
|
app.get(`${prefix}/myself`, ensureBlocklet(), checkUser, async (req, res) => {
|
|
340
343
|
const { blocklet } = req;
|
|
341
|
-
const {
|
|
342
|
-
const teamDid = appPid;
|
|
344
|
+
const { page, pageSize, status } = req.query;
|
|
345
|
+
const teamDid = blocklet.appPid;
|
|
343
346
|
const userDid = req.user.did;
|
|
344
347
|
// 用户管理自己所有的登录会话,不限制 visitorId
|
|
345
|
-
const userSessions = await node.
|
|
348
|
+
const { list: userSessions, paging } = await node.getUserSessions({
|
|
346
349
|
teamDid,
|
|
347
|
-
|
|
348
|
-
|
|
350
|
+
query: {
|
|
351
|
+
appPid: teamDid, // 不需要向主站查询 member 的会话列表,所以固定为 teamDid 即可
|
|
352
|
+
userDid,
|
|
353
|
+
status,
|
|
354
|
+
},
|
|
355
|
+
paging: {
|
|
356
|
+
page: parseInt(page, 10),
|
|
357
|
+
pageSize: parseInt(pageSize, 10),
|
|
358
|
+
},
|
|
349
359
|
});
|
|
350
360
|
|
|
351
|
-
const
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
)
|
|
360
|
-
);
|
|
361
|
-
await Promise.all(pendingList);
|
|
362
|
-
|
|
363
|
-
const result = userSessions
|
|
364
|
-
.filter((x) => {
|
|
365
|
-
return x?.user?.approved;
|
|
366
|
-
})
|
|
367
|
-
.map((x) => omit(x, userInfoBlackList));
|
|
368
|
-
|
|
369
|
-
res.json(result);
|
|
361
|
+
const list = userSessions.map((x) => {
|
|
362
|
+
patchUserSessionStatus(x, { blocklet });
|
|
363
|
+
return omit(x, userInfoBlackList);
|
|
364
|
+
});
|
|
365
|
+
res.json({
|
|
366
|
+
list,
|
|
367
|
+
paging,
|
|
368
|
+
});
|
|
370
369
|
});
|
|
371
370
|
|
|
372
371
|
/**
|
|
@@ -381,8 +380,6 @@ module.exports = {
|
|
|
381
380
|
const { appPid } = blocklet;
|
|
382
381
|
const teamDid = appPid;
|
|
383
382
|
|
|
384
|
-
const federatedSites = blocklet?.settings?.federated?.sites || [];
|
|
385
|
-
|
|
386
383
|
const visitorId = req.get('x-blocklet-visitor-id');
|
|
387
384
|
|
|
388
385
|
if (!visitorId) {
|
|
@@ -390,19 +387,34 @@ module.exports = {
|
|
|
390
387
|
return;
|
|
391
388
|
}
|
|
392
389
|
|
|
393
|
-
const userSessions = await node.
|
|
390
|
+
const { list: userSessions } = await node.getUserSessions({
|
|
394
391
|
teamDid,
|
|
395
|
-
|
|
392
|
+
query: {
|
|
393
|
+
visitorId,
|
|
394
|
+
includeUser: true,
|
|
395
|
+
},
|
|
396
|
+
paging: {
|
|
397
|
+
page: 1,
|
|
398
|
+
// 模拟获取所有登录会话
|
|
399
|
+
pageSize: 100,
|
|
400
|
+
},
|
|
396
401
|
});
|
|
397
402
|
|
|
398
403
|
const validUserSessions = userSessions.filter((x) => {
|
|
399
|
-
|
|
400
|
-
if (federatedSite?.appPid === teamDid) {
|
|
404
|
+
if (x.appPid === teamDid) {
|
|
401
405
|
return true;
|
|
402
406
|
}
|
|
403
|
-
|
|
404
|
-
|
|
407
|
+
|
|
408
|
+
const federatedSite = findFederatedSite(blocklet, x.appPid);
|
|
409
|
+
if (federatedSite) {
|
|
410
|
+
if (federatedSite.appPid === teamDid) {
|
|
411
|
+
return true;
|
|
412
|
+
}
|
|
413
|
+
if (federatedSite.status === 'approved') {
|
|
414
|
+
return true;
|
|
415
|
+
}
|
|
405
416
|
}
|
|
417
|
+
|
|
406
418
|
return false;
|
|
407
419
|
});
|
|
408
420
|
const pendingList = validUserSessions.map((item) =>
|
|
@@ -419,9 +431,6 @@ module.exports = {
|
|
|
419
431
|
|
|
420
432
|
const result = validUserSessions
|
|
421
433
|
.filter((x) => {
|
|
422
|
-
if (x.status === 'expired') {
|
|
423
|
-
return false;
|
|
424
|
-
}
|
|
425
434
|
if (!x?.user?.approved) {
|
|
426
435
|
return false;
|
|
427
436
|
}
|
package/api/routes/user.js
CHANGED
|
@@ -25,6 +25,7 @@ const { withQuery, joinURL } = require('ufo');
|
|
|
25
25
|
const cors = require('cors');
|
|
26
26
|
const createTranslator = require('@abtnode/util/lib/translate');
|
|
27
27
|
const { getDeviceData } = require('@abtnode/util/lib/device');
|
|
28
|
+
const { Op } = require('sequelize');
|
|
28
29
|
|
|
29
30
|
const { createTokenFn, getDidConnectVersion } = require('../util');
|
|
30
31
|
const initJwt = require('../libs/jwt');
|
|
@@ -445,7 +446,7 @@ function checkUserSig({ node }) {
|
|
|
445
446
|
}
|
|
446
447
|
|
|
447
448
|
async function loginEmail(req, node, options) {
|
|
448
|
-
const
|
|
449
|
+
const locale = req.blockletLocale;
|
|
449
450
|
const { sourceAppPid = null, inviter = null } = req.body;
|
|
450
451
|
|
|
451
452
|
const blocklet = await req.getBlocklet();
|
|
@@ -481,7 +482,7 @@ async function loginEmail(req, node, options) {
|
|
|
481
482
|
id: sub,
|
|
482
483
|
userInfo,
|
|
483
484
|
};
|
|
484
|
-
const lastUsedPassport =
|
|
485
|
+
const lastUsedPassport = getLastUsedPassport(currentUser?.passports, '', { useFallback: false });
|
|
485
486
|
|
|
486
487
|
if (!currentUser) {
|
|
487
488
|
await userUtil.checkNeedInvite({ req, node, teamDid, locale });
|
|
@@ -521,7 +522,7 @@ async function loginEmail(req, node, options) {
|
|
|
521
522
|
}
|
|
522
523
|
|
|
523
524
|
async function inviteEmail(req, node, options) {
|
|
524
|
-
const
|
|
525
|
+
const locale = req.blockletLocale;
|
|
525
526
|
const { sourceAppPid = null, inviteId, baseUrl } = req.body;
|
|
526
527
|
|
|
527
528
|
if (!inviteId) {
|
|
@@ -921,18 +922,29 @@ module.exports = {
|
|
|
921
922
|
const { blocklet } = req;
|
|
922
923
|
const teamDid = blocklet.appPid;
|
|
923
924
|
// NOTICE: 此处需要保留从 body 携带 visitorId 的功能,用于已登录用户注销自己指定的登录会话
|
|
924
|
-
|
|
925
|
+
// eslint-disable-next-line prefer-const
|
|
926
|
+
let { status, visitorId } = req.body;
|
|
927
|
+
const params = {};
|
|
925
928
|
if (!visitorId) {
|
|
926
929
|
visitorId = req.get('x-blocklet-visitor-id');
|
|
927
930
|
}
|
|
928
|
-
if (
|
|
929
|
-
|
|
931
|
+
if (status) {
|
|
932
|
+
params.status = status;
|
|
933
|
+
if (visitorId && status === 'online') {
|
|
934
|
+
// HACK: 用户使用当前登录会话注销所有会话时,要排除当前登录会话
|
|
935
|
+
params.visitorId = { [Op.ne]: visitorId };
|
|
936
|
+
}
|
|
937
|
+
} else if (visitorId) {
|
|
938
|
+
params.visitorId = visitorId;
|
|
939
|
+
}
|
|
940
|
+
if (!params.visitorId && !params.status) {
|
|
941
|
+
res.status(400).json({ error: 'visitorId or status is required' });
|
|
930
942
|
return;
|
|
931
943
|
}
|
|
932
944
|
|
|
933
945
|
await node.logoutUser({
|
|
946
|
+
...params,
|
|
934
947
|
userDid: req.user.did,
|
|
935
|
-
visitorId,
|
|
936
948
|
appPid: teamDid,
|
|
937
949
|
teamDid,
|
|
938
950
|
});
|
|
@@ -1072,7 +1084,7 @@ module.exports = {
|
|
|
1072
1084
|
);
|
|
1073
1085
|
|
|
1074
1086
|
server.post(`${prefixApi}/email/sendCode`, ensureBlocklet(), ensureCors, async (req, res) => {
|
|
1075
|
-
const
|
|
1087
|
+
const locale = req.blockletLocale;
|
|
1076
1088
|
const { blocklet } = req;
|
|
1077
1089
|
const teamDid = blocklet.appPid;
|
|
1078
1090
|
const { email, useCode = true, useMagicLink = true, sourceAppPid = null } = req.body;
|
|
@@ -1128,6 +1140,7 @@ module.exports = {
|
|
|
1128
1140
|
params: {
|
|
1129
1141
|
...emailData,
|
|
1130
1142
|
subject,
|
|
1143
|
+
locale,
|
|
1131
1144
|
},
|
|
1132
1145
|
});
|
|
1133
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) {
|
|
@@ -17,10 +17,32 @@ const getRequestIP = require('@abtnode/util/lib/get-request-ip');
|
|
|
17
17
|
const { getDeviceData } = require('@abtnode/util/lib/device');
|
|
18
18
|
const isUrl = require('is-url');
|
|
19
19
|
const { LRUCache } = require('lru-cache');
|
|
20
|
+
const createTranslator = require('@abtnode/util/lib/translate');
|
|
20
21
|
|
|
21
22
|
const { createTokenFn, getDidConnectVersion } = require('../../util');
|
|
22
23
|
const checkUser = require('../../middlewares/check-user');
|
|
23
24
|
|
|
25
|
+
const translations = {
|
|
26
|
+
zh: {
|
|
27
|
+
userSessionLogout: '用户会话已退出',
|
|
28
|
+
invalidWebhookType: '无效的 webhook 类型',
|
|
29
|
+
invalidWebhookUrl: '无效的 webhook 地址',
|
|
30
|
+
testWebhookMessage: '这是来自 {did} 的测试消息',
|
|
31
|
+
invalidToken: '无效的 token',
|
|
32
|
+
emptyRefreshToken: 'RefreshToken 不能为空',
|
|
33
|
+
},
|
|
34
|
+
en: {
|
|
35
|
+
userSessionLogout: 'User session is logout',
|
|
36
|
+
invalidWebhookType: 'Invalid webhook type',
|
|
37
|
+
invalidWebhookUrl: 'Invalid webhook url',
|
|
38
|
+
testWebhookMessage: 'This is a test message from user {did}',
|
|
39
|
+
invalidToken: 'Invalid token',
|
|
40
|
+
emptyRefreshToken: 'RefreshToken should not be empty',
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const t = createTranslator({ translations });
|
|
45
|
+
|
|
24
46
|
const sessionRBACCache = new LRUCache({ max: 3000, ttl: 1000 * 30 });
|
|
25
47
|
const unReadCountCache = new LRUCache({ max: 3000, ttl: 1000 * 5 });
|
|
26
48
|
|
|
@@ -176,13 +198,14 @@ module.exports = {
|
|
|
176
198
|
|
|
177
199
|
const sessionApi = `${WELLKNOWN_SERVICE_PATH_PREFIX}/api/did/session`;
|
|
178
200
|
router.get(sessionApi, nocache(), sessionBearerToken, handleSession);
|
|
201
|
+
router.post(sessionApi, nocache(), sessionBearerToken, handleSession);
|
|
202
|
+
|
|
179
203
|
router.get(
|
|
180
204
|
`${WELLKNOWN_SERVICE_PATH_PREFIX}/api/notifications/unread-count`,
|
|
181
205
|
nocache(),
|
|
182
206
|
sessionBearerToken,
|
|
183
207
|
handleGetUnreadCount
|
|
184
208
|
);
|
|
185
|
-
router.post(sessionApi, nocache(), sessionBearerToken, handleSession);
|
|
186
209
|
|
|
187
210
|
// update user extra: settings, webhooks
|
|
188
211
|
const extraApi = `${WELLKNOWN_SERVICE_PATH_PREFIX}/api/user/extra`;
|
|
@@ -207,17 +230,17 @@ module.exports = {
|
|
|
207
230
|
});
|
|
208
231
|
router.put(extraApi, nocache(), sessionBearerToken, checkUser, async (req, res) => {
|
|
209
232
|
if (['slack', 'api'].includes(req.body.type) === false) {
|
|
210
|
-
res.status(400).send({ error: '
|
|
233
|
+
res.status(400).send({ error: t('invalidWebhookType', req.blockletLocale) });
|
|
211
234
|
return;
|
|
212
235
|
}
|
|
213
236
|
|
|
214
237
|
if (isUrl(req.body.url) === false) {
|
|
215
|
-
res.status(400).send({ error: '
|
|
238
|
+
res.status(400).send({ error: t('invalidWebhookUrl', req.blockletLocale) });
|
|
216
239
|
}
|
|
217
240
|
|
|
218
241
|
await node.sendTestMessage({
|
|
219
242
|
webhook: { type: req.body.type, params: [{ name: 'url', value: req.body.url }] },
|
|
220
|
-
message:
|
|
243
|
+
message: t('testWebhookMessage', req.blockletLocale, { did: req.user.did }),
|
|
221
244
|
});
|
|
222
245
|
|
|
223
246
|
res.json({ success: true });
|
|
@@ -227,7 +250,7 @@ module.exports = {
|
|
|
227
250
|
const { wallet } = await req.getBlockletInfo();
|
|
228
251
|
const { token } = req.body;
|
|
229
252
|
if (!verify(token, wallet.publicKey)) {
|
|
230
|
-
res.status(403).send('
|
|
253
|
+
res.status(403).send(t('invalidToken', req.blockletLocale));
|
|
231
254
|
return;
|
|
232
255
|
}
|
|
233
256
|
|
|
@@ -258,15 +281,18 @@ module.exports = {
|
|
|
258
281
|
if (token) {
|
|
259
282
|
const teamDid = req.getBlockletDid();
|
|
260
283
|
const visitorId = req.get('x-blocklet-visitor-id');
|
|
284
|
+
if (!visitorId) {
|
|
285
|
+
res.status(400).send(t('userSessionLogout', req.blockletLocale));
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
261
288
|
const { appPid = teamDid } = req.query;
|
|
262
289
|
await req.ensureUser({ token, visitorId, appPid });
|
|
263
290
|
if (!req.user) {
|
|
264
|
-
res.status(400).send('
|
|
291
|
+
res.status(400).send(t('userSessionLogout', req.blockletLocale));
|
|
265
292
|
return;
|
|
266
293
|
}
|
|
267
294
|
|
|
268
295
|
try {
|
|
269
|
-
const { secret } = await req.getBlockletInfo();
|
|
270
296
|
const [blocklet, info] = await Promise.all([req.getBlocklet(), req.getBlockletInfo()]);
|
|
271
297
|
|
|
272
298
|
const refreshTokenType = 'refresh';
|
|
@@ -276,12 +302,12 @@ module.exports = {
|
|
|
276
302
|
passport,
|
|
277
303
|
provider = LOGIN_PROVIDER.WALLET,
|
|
278
304
|
walletOS,
|
|
279
|
-
} = await verifySessionToken(token, secret, {
|
|
305
|
+
} = await verifySessionToken(token, info.secret, {
|
|
280
306
|
checkFromDb: true,
|
|
281
307
|
teamDid,
|
|
282
|
-
checkToken: (
|
|
283
|
-
if (
|
|
284
|
-
throw new Error(`invalid token type ${
|
|
308
|
+
checkToken: (_token) => {
|
|
309
|
+
if (_token.tokenType !== refreshTokenType) {
|
|
310
|
+
throw new Error(`invalid token type ${_token.tokenType}`);
|
|
285
311
|
}
|
|
286
312
|
},
|
|
287
313
|
locale: req.blockletLocale,
|
|
@@ -310,7 +336,7 @@ module.exports = {
|
|
|
310
336
|
const { sessionToken, refreshToken } = createToken(
|
|
311
337
|
userPid,
|
|
312
338
|
{
|
|
313
|
-
secret,
|
|
339
|
+
secret: info.secret,
|
|
314
340
|
passport,
|
|
315
341
|
role,
|
|
316
342
|
fullName: user.fullName,
|
|
@@ -368,7 +394,7 @@ module.exports = {
|
|
|
368
394
|
res.status(400).send(err.message);
|
|
369
395
|
}
|
|
370
396
|
} else {
|
|
371
|
-
res.status(400).send('
|
|
397
|
+
res.status(400).send(t('emptyRefreshToken', req.blockletLocale));
|
|
372
398
|
}
|
|
373
399
|
});
|
|
374
400
|
},
|
|
@@ -126,6 +126,12 @@ function createWebsocketServer(node, ensureWsUser, options) {
|
|
|
126
126
|
}
|
|
127
127
|
});
|
|
128
128
|
|
|
129
|
+
eventHub.on(EVENTS.NOTIFICATION_BLOCKLET_UPDATE, (data) => {
|
|
130
|
+
const did = data.teamDid;
|
|
131
|
+
const eventName = `${did}/${EVENTS.NOTIFICATION_BLOCKLET_UPDATE}`;
|
|
132
|
+
wsServer.broadcast(eventName, eventName, data, { noCluster: true });
|
|
133
|
+
});
|
|
134
|
+
|
|
129
135
|
eventHub.on(EVENTS.NOTIFICATION_READ, (data) => {
|
|
130
136
|
const did = data.teamDid;
|
|
131
137
|
if (did) {
|