@abtnode/blocklet-services 1.16.44-beta-20250512-155818-937e465d → 1.16.44-beta-20250516-225119-c0b5ec8d
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 +3 -1
- package/api/libs/connect/session.js +22 -9
- package/api/libs/image.js +1 -2
- package/api/libs/open-graph/index.js +1 -2
- package/api/libs/push-kit/index.js +1 -0
- package/api/middlewares/check-federated-cors-call.js +2 -2
- package/api/middlewares/check-permission.js +10 -3
- package/api/routes/blocklet.js +1 -1
- package/api/routes/csp-proxy.js +67 -0
- package/api/routes/federated.js +30 -25
- package/api/routes/oauth/client.js +2 -2
- package/api/routes/openembed.js +1 -1
- package/api/routes/user-session.js +1 -2
- package/api/routes/user.js +9 -6
- package/api/services/auth/connect/connect-to-did-spaces-for-user.js +1 -1
- package/api/services/auth/connect/pre-setup.js +2 -1
- package/api/services/auth/connect/setup.js +31 -4
- package/api/services/image/index.js +1 -1
- package/api/services/notification/queue.js +27 -4
- package/api/socket/channel/did.js +14 -7
- package/api/util/federated.js +5 -1
- package/api/util/user-util.js +1 -1
- package/dist/assets/{AdapterDayjs-BD9H1lZ-.js → AdapterDayjs-YbaNvT9I.js} +1 -1
- package/dist/assets/{ArrowDropDown-BrO-zDlb.js → ArrowDropDown-xgs4N3Rf.js} +1 -1
- package/dist/assets/{CheckCircle-Ds4QI0ey.js → CheckCircle-JXD6tKIa.js} +1 -1
- package/dist/assets/{ChevronLeft-CnQaQ-rc.js → ChevronLeft-D0eko_T8.js} +1 -1
- package/dist/assets/{ChevronRight-a_2_x6Ew.js → ChevronRight-CQY9Ni7X.js} +1 -1
- package/dist/assets/{Community-DW6DJTIs.js → Community-BCL2L7ib.js} +1 -1
- package/dist/assets/{DeleteOutline-CFN4r-OG.js → DeleteOutline-BEGOj_wq.js} +1 -1
- package/dist/assets/{Done-DqSE6KPe.js → Done-BUJJNjlP.js} +1 -1
- package/dist/assets/{Download-C_LRKzbG.js → Download-DdZEsxmZ.js} +1 -1
- package/dist/assets/{Edit-CbR4eoK8.js → Edit-vxeVwrqO.js} +1 -1
- package/dist/assets/{EditIcon-DxUWMw59.js → EditIcon-Dffk7mPL.js} +1 -1
- package/dist/assets/{Email-DWueGk7t.js → Email-CdSNK0eA.js} +1 -1
- package/dist/assets/{Error-jEHdDLNk.js → Error-C-RD4e9g.js} +1 -1
- package/dist/assets/{ExpandLess-CkoEHpgk.js → ExpandLess-CmqG9SE7.js} +1 -1
- package/dist/assets/{Google-DHEolkW-.js → Google-B7PA4qF8.js} +1 -1
- package/dist/assets/{Holiday-Dwvo6QkZ.js → Holiday-enHMZqEf.js} +1 -1
- package/dist/assets/{InfoOutlined-DkG0jjos.js → InfoOutlined-BIr5nkjV.js} +1 -1
- package/dist/assets/{Launch-B-2Jomi6.js → Launch-KvZQI_SA.js} +1 -1
- package/dist/assets/{LaunchOutlined-CXNijfqX.js → LaunchOutlined-ClxZU_tj.js} +1 -1
- package/dist/assets/{Location-DUEOr9J2.js → Location-By12Z3Te.js} +1 -1
- package/dist/assets/{LockIcon-Cjg8jV1E.js → LockIcon-98CKEIBe.js} +1 -1
- package/dist/assets/{Meeting-CJaI_cKm.js → Meeting-CLeFWDkY.js} +1 -1
- package/dist/assets/{MoreHoriz-B6KdR0Y8.js → MoreHoriz-H8rabTmY.js} +1 -1
- package/dist/assets/{OffSick-C9VqqjrN.js → OffSick-dUm363rs.js} +1 -1
- package/dist/assets/{Phone-DcHUzCa-.js → Phone--BSu-btI.js} +1 -1
- package/dist/assets/{PlayArrow-BToG9L6q.js → PlayArrow-CmxnItFZ.js} +1 -1
- package/dist/assets/{QuestionMarkCircle-BPVDAm8U.js → QuestionMarkCircle-DTf-Tya5.js} +1 -1
- package/dist/assets/{ServerLogo-s6cfhx92.js → ServerLogo-CEsILJl5.js} +1 -1
- package/dist/assets/{Timezone-B-Ho_Uno.js → Timezone-YZ0dMUEr.js} +1 -1
- package/dist/assets/{TuneOutlined-BR2H7Mxj.js → TuneOutlined-DmhFMgM-.js} +1 -1
- package/dist/assets/{ViewList-D8vtMKQz.js → ViewList-DXk3qGFU.js} +1 -1
- package/dist/assets/{WorkingRemotely-lJ6DUMCR.js → WorkingRemotely-BX7rgbEY.js} +1 -1
- package/dist/assets/{access-control-CCSlKYYz.js → access-control-DfNk54C9.js} +1 -1
- package/dist/assets/{actions-BjTeIzgS.js → actions-V9hjjowb.js} +1 -1
- package/dist/assets/{add-component-core-C7-Epxoj.js → add-component-core-Dx4Ojnmk.js} +16 -16
- package/dist/assets/add-resource-CxXfKLfm.js +1 -0
- package/dist/assets/addon-DtaZ0TB3.js +14 -0
- package/dist/assets/{advanced-tG5IRVhQ.js → advanced-Ddtt8Hj-.js} +1 -1
- package/dist/assets/appearance-BrPMC4u8.js +1 -0
- package/dist/assets/ar-2yn9i2dw.js +7 -0
- package/dist/assets/audit-logs-D9m5k0JB.js +35 -0
- package/dist/assets/{authorize-DNTNbUhI.js → authorize-T5C3DfFM.js} +1 -1
- package/dist/assets/{base32-_zEVBJUg.js → base32-BPfgmw66.js} +1 -1
- package/dist/assets/blocklet-default-logo-Bspnu_ws.png +0 -0
- package/dist/assets/{branding-hDeNkLC2.js → branding-BVm4-_4U.js} +2 -2
- package/dist/assets/{branding-By8KDk5Q.js → branding-hFlZ2gIT.js} +2 -2
- package/dist/assets/{bundle-avatar-DYTLzqlT.js → bundle-avatar-BEofqN1I.js} +1 -1
- package/dist/assets/button-m03GMAJs.js +1 -0
- package/dist/assets/click-to-copy-DmYkL7Ui.js +1 -0
- package/dist/assets/{collapse-QV_2gdtM.js → collapse-FsvH0gRe.js} +1 -1
- package/dist/assets/complete-DwnM8k9G.js +39 -0
- package/dist/assets/{component-Blsql2u0.js → component-s7RjpIXH.js} +8 -8
- package/dist/assets/{config-LE_EJolF.js → config-Dl_53WnU.js} +1 -1
- package/dist/assets/{config-D6r2ZAFY.js → config-bdYGvEMY.js} +2 -2
- package/dist/assets/{config-navigation-B0nu0al4.js → config-navigation-bI89qiN3.js} +3 -3
- package/dist/assets/config-space-D1h9DQze.js +1 -0
- package/dist/assets/confirm-zdbJI4Oz.js +7 -0
- package/dist/assets/{connect-Cu2Ssv5A.js → connect-B2amNptu.js} +1 -1
- package/dist/assets/connect-BTGTAWj-.js +5 -0
- package/dist/assets/connect-to-DrS33AaQ.js +1 -0
- package/dist/assets/{content-layout-BzF-fNQz.js → content-layout--sy9JlYZ.js} +1 -1
- package/dist/assets/dashboard-u-oRSlsi.js +239 -0
- package/dist/assets/de-CEKbJD3-.js +7 -0
- package/dist/assets/delete-confirm-CUNBU1J1.js +1 -0
- package/dist/assets/{did-address-DjwPl1uy.js → did-address-BI9LYTx-.js} +1 -1
- package/dist/assets/domain-ER_Bg0qe.js +9 -0
- package/dist/assets/domain-action-card-CYBXEnlZ.js +28 -0
- package/dist/assets/domains-CBYb9WvZ.js +1 -0
- package/dist/assets/dot-BB5occkV.js +7 -0
- package/dist/assets/{email-BZVu6WP-.js → email-BmZcVM-V.js} +2 -2
- package/dist/assets/{empty-spinner-n0_Ehns5.js → empty-spinner-BZw_ShnT.js} +1 -1
- package/dist/assets/{es-BuUaHPig.js → es-dvMygD-W.js} +3 -3
- package/dist/assets/{exchange-passport-8jdiPDph.js → exchange-passport-B5vniH8u.js} +1 -1
- package/dist/assets/fr-BvFd5xp9.js +7 -0
- package/dist/assets/{fuel-Dx_cnsCl.js → fuel-DW3R8bWE.js} +1 -1
- package/dist/assets/{gen-access-key-CqKmmKML.js → gen-access-key-h48ZchOb.js} +1 -1
- package/dist/assets/get-safe-url-BcH2iukm.js +1 -0
- package/dist/assets/get-safe-url-OaLLn0UN.js +1 -0
- package/dist/assets/hi-C51yBXa5.js +5 -0
- package/dist/assets/{home-DzCwBE8F.js → home-CJ28zTIJ.js} +1 -1
- package/dist/assets/id-B1Mq_eQI.js +7 -0
- package/dist/assets/{iframe-DW7zzzTG.js → iframe-D0kv9-rE.js} +1 -1
- package/dist/assets/index-8eXqqyHQ.js +5 -0
- package/dist/assets/index-BGat0zzz.js +284 -0
- package/dist/assets/index-BXdw6keY.js +1 -0
- package/dist/assets/{index-BDYaw77z.js → index-BdH_4Yfe.js} +1 -1
- package/dist/assets/{index-C5SsKJ2n.js → index-C0te7llT.js} +18 -14
- package/dist/assets/index-C1rBJXFe.js +1 -0
- package/dist/assets/index-C3bbolus.js +113 -0
- package/dist/assets/{index-BYCeMwoO.js → index-C849wD9b.js} +1 -1
- package/dist/assets/{index-Bju4sfVL.js → index-CJpkpFKR.js} +2 -2
- package/dist/assets/index-CNauVjuD.js +99 -0
- package/dist/assets/{index-Btl_rz0J.js → index-CSbITcwB.js} +17 -17
- package/dist/assets/{index-DcUhenm6.js → index-CmQOzzP8.js} +1 -1
- package/dist/assets/{index-HU4yqI-9.js → index-D-X7HfwW.js} +1 -1
- package/dist/assets/{index-CPfvVvHv.js → index-D-mbJPLJ.js} +12 -12
- package/dist/assets/{index-enM9Y412.js → index-D3iGbfL9.js} +1 -1
- package/dist/assets/index-D70ICXrC.js +1 -0
- package/dist/assets/{index-DefO2n6z.js → index-DRCFOq4H.js} +58 -58
- package/dist/assets/{index-B8r-LrrM.js → index-DbsXFWms.js} +1 -1
- package/dist/assets/{index-BIPRCLBG.js → index-DoCu_ga_.js} +2 -2
- package/dist/assets/index-DwnC6XvN.js +6 -0
- package/dist/assets/{index-ftkgQlGr.js → index-DwswX2WL.js} +1 -1
- package/dist/assets/index-Up0XQY6f.js +55 -0
- package/dist/assets/index-VzeamwDR.js +241 -0
- package/dist/assets/index-nBzxkc-e.js +4 -0
- package/dist/assets/{index-SzdSxpkq.js → index-tD3kWii2.js} +4 -4
- package/dist/assets/{invitation-1bsb30Yz.js → invitation-CLUn7Gd4.js} +4 -4
- package/dist/assets/invite-B1zBa8Gp.js +1 -0
- package/dist/assets/issue-passport-5n5uQFFQ.js +1 -0
- package/dist/assets/item-BCYQnjF7.js +2 -0
- package/dist/assets/ja-CCKVmbEX.js +7 -0
- package/dist/assets/ko-A_w8tIEg.js +7 -0
- package/dist/assets/{landing-page-Due4o1uF.js → landing-page-CUrvCtHZ.js} +1 -1
- package/dist/assets/{launch-result-message-DIYoykBK.js → launch-result-message-Eea5FZDm.js} +1 -1
- package/dist/assets/{layout-D93HKT6w.js → layout-Bs_rMuQ9.js} +2 -2
- package/dist/assets/list-CFP3MiEI.js +2 -0
- package/dist/assets/list-M2tV_ZYf.js +236 -0
- package/dist/assets/list-header-DNFbdM3a.js +1 -0
- package/dist/assets/localization-Cl5vfs2R.js +1 -0
- package/dist/assets/{log--AX8zo75.js → log-CcpvITx1.js} +2 -3
- package/dist/assets/logger-BYg6vYBA.js +1 -0
- package/dist/assets/{login-WRcteY7r.js → login-4G5grSod.js} +1 -1
- package/dist/assets/login-oauth-callback-DMou-vp-.js +1 -0
- package/dist/assets/{logo-uploader-CQCy6MG3.js → logo-uploader-Bf6myR3q.js} +3 -3
- package/dist/assets/{lost-passport-kJX7pEJj.js → lost-passport-DWc6Kq0b.js} +2 -2
- package/dist/assets/{open-window--2G6Qjbq.js → open-window-CuyFfntO.js} +1 -1
- package/dist/assets/overview-vcNUrQdk.js +85 -0
- package/dist/assets/{page-header-xyZktwBS.js → page-header-DpNvpd52.js} +4 -4
- package/dist/assets/{passport-item-CIvCqz_R.js → passport-item-IDGIDfr4.js} +1 -1
- package/dist/assets/{permission-BH1TY_tz.js → permission-Cnn9EYOW.js} +1 -1
- package/dist/assets/preferences-Cqm2olsT.js +1 -0
- package/dist/assets/profile-embed-CcuuyEXm.js +1 -0
- package/dist/assets/pt-7HHecjdA.js +5 -0
- package/dist/assets/publish-resource-DGUHUINH.js +1 -0
- package/dist/assets/{react-beautiful-dnd.esm-7PS2VwOi.js → react-beautiful-dnd.esm-cfY5JZV6.js} +1 -1
- package/dist/assets/ru-Bw8FVC4M.js +5 -0
- package/dist/assets/runtime-efQyx-LE.js +1 -0
- package/dist/assets/sdk-CXaHNlMH.js +1 -0
- package/dist/assets/{section-Cv4udilp.js → section-C1TPQFRq.js} +1 -1
- package/dist/assets/{security-DM8MeY05.js → security-DFjq-0Qw.js} +4 -4
- package/dist/assets/{session-CHdTc1We.js → session-B2z_IWIe.js} +1 -1
- package/dist/assets/setup-CLYOmcmD.js +30 -0
- package/dist/assets/{shorten-label-Cng55547.js → shorten-label-Bf7YQUd6.js} +1 -1
- package/dist/assets/{simple-select-CP_Svi_D.js → simple-select-DwWEI_ZU.js} +1 -1
- package/dist/assets/{slicedToArray-C7EPqaHf.js → slicedToArray-BSaY8ui4.js} +1 -1
- package/dist/assets/{spaces-BVG-t3ND.js → spaces-DMMN97uo.js} +1 -1
- package/dist/assets/{start-CIjuDAiX.js → start-xHz18_Rr.js} +3 -3
- package/dist/assets/{starting-progress-CiLZpNpg.js → starting-progress-DeFtXRb_.js} +1 -1
- package/dist/assets/status-y-bc7cex.js +1 -0
- package/dist/assets/{step-actions-CeJCmiCS.js → step-actions-Btu6D6gk.js} +1 -1
- package/dist/assets/{studio-DikseKRr.js → studio-CiFHrC57.js} +1 -1
- package/dist/assets/{switch-control-C5i52ixk.js → switch-control-DnNP5DPe.js} +1 -1
- package/dist/assets/table-tips-hNIkakER.js +1 -0
- package/dist/assets/th-DyW-mYrC.js +5 -0
- package/dist/assets/traffic-BIrotm6H.js +35 -0
- package/dist/assets/{transfer-CTEHVklh.js → transfer-BeJGTbo1.js} +1 -1
- package/dist/assets/{unsubscribe-Bi2IV-2n.js → unsubscribe-Bjxnpv_W.js} +1 -1
- package/dist/assets/{use-blocklet-logo-BEy8Tnso.js → use-blocklet-logo-BoFa24A6.js} +1 -1
- package/dist/assets/{use-mobile-Boa_xu9A.js → use-mobile-JEGQfLZ2.js} +1 -1
- package/dist/assets/{use-mobile-DyX6Fl8Z.js → use-mobile-ZAS6Si4t.js} +1 -1
- package/dist/assets/useAsync-DnXpD472.js +1 -0
- package/dist/assets/{useLocalStorage-DVnkpneF.js → useLocalStorage-BRd3tKN9.js} +1 -1
- package/dist/assets/user-center-DI0NPFtg.js +76 -0
- package/dist/assets/{util-MKllNgBs.js → util-C3FgySYN.js} +1 -1
- package/dist/assets/{util-CEAObyfj.js → util-CVjZG67N.js} +1 -1
- package/dist/assets/{vendor-arcblock-uz9DVywv.js → vendor-arcblock-DPRICUXM.js} +109 -109
- package/dist/assets/{vendor-hooks-rDgu5KV9.js → vendor-hooks-Zkb4Ilbj.js} +1 -1
- package/dist/assets/{vendor-mui-core-D_bnq77o.js → vendor-mui-core-Bh-qMRq3.js} +1 -1
- package/dist/assets/{vendor-mui-x-R-0SFz4c.js → vendor-mui-x-CQTjfcpn.js} +1 -1
- package/dist/assets/{vendor-ux-did-connect-DHrruicZ.js → vendor-ux-did-connect-Ck9lzrbN.js} +73 -73
- package/dist/assets/vi-bzer6J4H.js +5 -0
- package/dist/assets/wrap-locale-COcPskJ7.js +1 -0
- package/dist/assets/zh-Cti0XXui.js +8 -0
- package/dist/assets/zh-tw-BLcDG99i.js +7 -0
- package/dist/images/all-done-dark.svg +68 -0
- package/dist/images/all-done-light.svg +60 -0
- package/dist/index.html +5 -5
- package/dist/service-worker.js +1 -1
- package/package.json +48 -47
- package/dist/assets/add-resource-CJHw7ea0.js +0 -1
- package/dist/assets/addon--u4EErgw.js +0 -14
- package/dist/assets/appearance-bRLsRDs2.js +0 -1
- package/dist/assets/ar-Blzb8h2o.js +0 -7
- package/dist/assets/audit-logs-B3-Fo3nR.js +0 -35
- package/dist/assets/button-D8hoY4xw.js +0 -1
- package/dist/assets/click-to-copy-CFiGx48J.js +0 -1
- package/dist/assets/complete-6R-n_Ra9.js +0 -45
- package/dist/assets/config-space-d34Deg7R.js +0 -1
- package/dist/assets/confirm-DjTZImyg.js +0 -7
- package/dist/assets/connect-K4ZmMu4L.js +0 -5
- package/dist/assets/connect-to-BG15Vnyg.js +0 -1
- package/dist/assets/dashboard-BIOpvfj3.js +0 -239
- package/dist/assets/de-BxI5dM9K.js +0 -7
- package/dist/assets/delete-confirm-BzuBR6TW.js +0 -1
- package/dist/assets/domain-action-card-Bcs_GWxq.js +0 -24
- package/dist/assets/domain-wh85yL2O.js +0 -9
- package/dist/assets/domains-bzKFbARj.js +0 -1
- package/dist/assets/dot-C4hULxc0.js +0 -7
- package/dist/assets/format-error-BrmqJs5a.js +0 -2
- package/dist/assets/fr-DezMACmP.js +0 -7
- package/dist/assets/get-safe-url-B5RJTMjC.js +0 -1
- package/dist/assets/get-safe-url-Bk6PlU7n.js +0 -1
- package/dist/assets/hi-ClbEozhq.js +0 -5
- package/dist/assets/id-CXYm-1K3.js +0 -7
- package/dist/assets/index-8CHxrfFP.js +0 -1
- package/dist/assets/index-B9nvthxv.js +0 -4
- package/dist/assets/index-C-A13dEh.js +0 -141
- package/dist/assets/index-Cc-e6lxg.js +0 -1
- package/dist/assets/index-DjEDWgGs.js +0 -6
- package/dist/assets/index-Du38Vjy4.js +0 -241
- package/dist/assets/index-Dyl-XQ73.js +0 -99
- package/dist/assets/index-Jnk92KZC.js +0 -284
- package/dist/assets/index-USO5zFMh.js +0 -55
- package/dist/assets/index-ioZVVJtg.js +0 -113
- package/dist/assets/invite-CALl83Zc.js +0 -1
- package/dist/assets/issue-passport-BcStTsbv.js +0 -1
- package/dist/assets/item-Bk_1JLeG.js +0 -2
- package/dist/assets/ja-B5V7b8Cm.js +0 -7
- package/dist/assets/ko-DP9up1nF.js +0 -7
- package/dist/assets/list-D96_O-GY.js +0 -2
- package/dist/assets/list-header-HqBQs1yn.js +0 -1
- package/dist/assets/list-rt6nku1-.js +0 -236
- package/dist/assets/localization-BUDtnbyU.js +0 -1
- package/dist/assets/logger-BLZgTs_U.js +0 -1
- package/dist/assets/login-oauth-callback-DZaPZfnA.js +0 -1
- package/dist/assets/overview-CpKMiGEK.js +0 -85
- package/dist/assets/preferences-CfmnTXfl.js +0 -1
- package/dist/assets/profile-embed-ZtzRYgXv.js +0 -1
- package/dist/assets/pt-CG45pWr4.js +0 -5
- package/dist/assets/publish-resource-CCa5xfwz.js +0 -1
- package/dist/assets/ru-0VhRQc7t.js +0 -5
- package/dist/assets/runtime-eXYlg9Cz.js +0 -1
- package/dist/assets/sdk-9eXJSWHG.js +0 -1
- package/dist/assets/setup-BEsU41BB.js +0 -30
- package/dist/assets/status-CUMJd-nJ.js +0 -1
- package/dist/assets/th-DwH8cjcw.js +0 -5
- package/dist/assets/traffic-B5x_6GvF.js +0 -35
- package/dist/assets/useAsync-C8ydfEEr.js +0 -1
- package/dist/assets/useAsync-CMWsznMW.js +0 -1
- package/dist/assets/user-center-DcXdjtRX.js +0 -76
- package/dist/assets/vi-CcmTJggB.js +0 -5
- package/dist/assets/wrap-locale-B9TkXFQe.js +0 -1
- package/dist/assets/zh-C2MKZFZw.js +0 -8
- package/dist/assets/zh-tw-mW-UVEHx.js +0 -7
- package/dist/images/all-done.png +0 -0
package/api/index.js
CHANGED
|
@@ -25,7 +25,7 @@ const { getAppOgCacheDir } = require('@abtnode/util/lib/blocklet');
|
|
|
25
25
|
const { ensureLocale } = require('@abtnode/util/lib/middlewares/ensure-locale');
|
|
26
26
|
const normalizePathPrefix = require('@abtnode/util/lib/normalize-path-prefix');
|
|
27
27
|
const createInvite = require('@abtnode/auth/lib/invitation');
|
|
28
|
-
const { getStatusFromError } = require('@
|
|
28
|
+
const { getStatusFromError } = require('@blocklet/error');
|
|
29
29
|
const { withQuery, joinURL, withTrailingSlash } = require('ufo');
|
|
30
30
|
const { createProxyMiddleware, responseInterceptor } = require('http-proxy-middleware');
|
|
31
31
|
const { findComponentByIdV2, getMountPoints } = require('@blocklet/meta/lib/util');
|
|
@@ -67,6 +67,7 @@ const createOAuthServerRoutes = require('./routes/oauth/server');
|
|
|
67
67
|
const createFederatedRoutes = require('./routes/federated');
|
|
68
68
|
const createUserRoutes = require('./routes/user');
|
|
69
69
|
const createOcapRoutes = require('./routes/ocap');
|
|
70
|
+
const createCspProxyRoutes = require('./routes/csp-proxy');
|
|
70
71
|
const createUserSessionRoutes = require('./routes/user-session');
|
|
71
72
|
const createBlockletRoutes = require('./routes/blocklet');
|
|
72
73
|
const createConnectRelayRoutes = require('./routes/connect/relay');
|
|
@@ -763,6 +764,7 @@ self.blocklet = {
|
|
|
763
764
|
createFederatedRoutes.init(server, node, options);
|
|
764
765
|
createUserRoutes.init(server, node, options);
|
|
765
766
|
createOcapRoutes.init(server);
|
|
767
|
+
createCspProxyRoutes.init(server);
|
|
766
768
|
createUserSessionRoutes.init(server, node, options);
|
|
767
769
|
createEnvRoutes.init(server, node, options);
|
|
768
770
|
createBlockletRoutes.init(server, node);
|
|
@@ -30,7 +30,7 @@ const {
|
|
|
30
30
|
upsertToPassports,
|
|
31
31
|
getPassportClaimUrl,
|
|
32
32
|
} = require('@abtnode/auth/lib/passport');
|
|
33
|
-
const CustomError = require('@
|
|
33
|
+
const { CustomError } = require('@blocklet/error');
|
|
34
34
|
const { getKeyPairClaim, getAuthPrincipalForMigrateAppToV2 } = require('@abtnode/auth/lib/server');
|
|
35
35
|
const { checkInvitedUserOnly } = require('@abtnode/auth/lib/oauth');
|
|
36
36
|
const { fromAppDid } = require('@arcblock/did-ext');
|
|
@@ -1243,14 +1243,27 @@ module.exports = {
|
|
|
1243
1243
|
};
|
|
1244
1244
|
|
|
1245
1245
|
if (sourceAppPid) {
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1246
|
+
try {
|
|
1247
|
+
await migrateFederatedAccount({
|
|
1248
|
+
// 目前只允许未注册过的钱包绑定 auth0,所以直接传入钱包生成的 userDid 和 userPk
|
|
1249
|
+
toUserDid: userDid,
|
|
1250
|
+
toUserPk: userPk,
|
|
1251
|
+
fromUserDid: previousUserDid,
|
|
1252
|
+
blockletInfo,
|
|
1253
|
+
blocklet,
|
|
1254
|
+
});
|
|
1255
|
+
} catch (error) {
|
|
1256
|
+
logger.error('Failed to migrate federated account', {
|
|
1257
|
+
error,
|
|
1258
|
+
toUserDid: userDid,
|
|
1259
|
+
fromUserDid: previousUserDid,
|
|
1260
|
+
});
|
|
1261
|
+
|
|
1262
|
+
if (error?.response?.data) {
|
|
1263
|
+
throw new Error(error.response.data);
|
|
1264
|
+
}
|
|
1265
|
+
throw error;
|
|
1266
|
+
}
|
|
1254
1267
|
} else {
|
|
1255
1268
|
const connectedAccounts = oauthUser?.connectedAccounts || [];
|
|
1256
1269
|
const sourceProvider = oauthUser?.sourceProvider;
|
package/api/libs/image.js
CHANGED
|
@@ -8,8 +8,7 @@ const toLower = require('lodash/toLower');
|
|
|
8
8
|
const { Joi } = require('@arcblock/validator');
|
|
9
9
|
const stringify = require('json-stable-stringify');
|
|
10
10
|
const md5 = require('@abtnode/util/lib/md5');
|
|
11
|
-
const formatError = require('@
|
|
12
|
-
const { getStatusFromError } = require('@abtnode/util/lib/custom-error');
|
|
11
|
+
const { formatError, getStatusFromError } = require('@blocklet/error');
|
|
13
12
|
|
|
14
13
|
const logger = require('@abtnode/logger')('@abtnode/blocklet-services/image');
|
|
15
14
|
|
|
@@ -7,8 +7,7 @@ const { joinURL } = require('ufo');
|
|
|
7
7
|
const { Joi } = require('@arcblock/validator');
|
|
8
8
|
const stringify = require('json-stable-stringify');
|
|
9
9
|
const md5 = require('@abtnode/util/lib/md5');
|
|
10
|
-
const formatError = require('@
|
|
11
|
-
const CustomError = require('@abtnode/util/lib/custom-error');
|
|
10
|
+
const { formatError, CustomError } = require('@blocklet/error');
|
|
12
11
|
const { getPassportColor } = require('@abtnode/auth/lib/util/create-passport-svg');
|
|
13
12
|
const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
|
|
14
13
|
|
|
@@ -18,6 +18,7 @@ async function sendPush(receiver, notification, { node, teamDid }) {
|
|
|
18
18
|
|
|
19
19
|
if (!config.enabled || !config.endpoint) {
|
|
20
20
|
// skip send email
|
|
21
|
+
logger.warn(`Push Kit Service is not Enabled: ${teamDid}`);
|
|
21
22
|
throw new Error('Push Kit Service is not Enabled.');
|
|
22
23
|
}
|
|
23
24
|
|
|
@@ -6,8 +6,8 @@ function checkFederatedCorsCall() {
|
|
|
6
6
|
const sites = federated?.sites || [];
|
|
7
7
|
const memberEnabled = sites.find((item) => {
|
|
8
8
|
if (item.status === 'approved') {
|
|
9
|
-
const siteHost = new URL(item.appUrl).
|
|
10
|
-
const callerHost = new URL(caller).
|
|
9
|
+
const siteHost = new URL(item.appUrl).hostname;
|
|
10
|
+
const callerHost = new URL(caller).hostname;
|
|
11
11
|
return [siteHost, ...(item.aliasDomain || [])].includes(callerHost);
|
|
12
12
|
}
|
|
13
13
|
return false;
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
const { ROLES } = require('@abtnode/constant');
|
|
1
|
+
const { ROLES, SERVER_ROLES } = require('@abtnode/constant');
|
|
2
2
|
|
|
3
|
-
const adminRoles = [ROLES.OWNER, ROLES.ADMIN];
|
|
4
|
-
const memberRoles = [
|
|
3
|
+
const adminRoles = [ROLES.OWNER, ROLES.ADMIN, SERVER_ROLES.BLOCKLET_OWNER, SERVER_ROLES.BLOCKLET_ADMIN];
|
|
4
|
+
const memberRoles = [
|
|
5
|
+
ROLES.OWNER,
|
|
6
|
+
ROLES.ADMIN,
|
|
7
|
+
ROLES.MEMBER,
|
|
8
|
+
SERVER_ROLES.BLOCKLET_OWNER,
|
|
9
|
+
SERVER_ROLES.BLOCKLET_ADMIN,
|
|
10
|
+
SERVER_ROLES.BLOCKLET_MEMBER,
|
|
11
|
+
];
|
|
5
12
|
|
|
6
13
|
const getCheckMiddleware = (roles) => (req, res, next) => {
|
|
7
14
|
if (!req.user) {
|
package/api/routes/blocklet.js
CHANGED
|
@@ -11,7 +11,7 @@ const cors = require('cors');
|
|
|
11
11
|
const { getPassportStatusEndpoint } = require('@abtnode/auth/lib/auth');
|
|
12
12
|
const { createPassportVC, createPassport, createUserPassport } = require('@abtnode/auth/lib/passport');
|
|
13
13
|
const formatContext = require('@abtnode/util/lib/format-context');
|
|
14
|
-
const { getStatusFromError } = require('@
|
|
14
|
+
const { getStatusFromError } = require('@blocklet/error');
|
|
15
15
|
const { getUserAvatarUrl, getAvatarFile, getAppAvatarUrl, extractUserAvatar } = require('@abtnode/util/lib/user');
|
|
16
16
|
const {
|
|
17
17
|
attachSendLogoContext,
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const { getChainClient } = require('@abtnode/util/lib/get-chain-client');
|
|
2
|
+
const { MAIN_CHAIN_ENDPOINT } = require('@abtnode/constant');
|
|
3
|
+
const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
|
|
4
|
+
const { default: axios } = require('axios');
|
|
5
|
+
|
|
6
|
+
const logger = require('../libs/logger')('blocklet-services:csp-proxy');
|
|
7
|
+
|
|
8
|
+
const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
|
|
9
|
+
|
|
10
|
+
module.exports = {
|
|
11
|
+
init(server) {
|
|
12
|
+
const chainClient = getChainClient(MAIN_CHAIN_ENDPOINT);
|
|
13
|
+
|
|
14
|
+
if (!chainClient) {
|
|
15
|
+
logger.error('get chain client failed');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
server.get(`${PREFIX}/proxy`, async (req, res) => {
|
|
20
|
+
const { url } = req.query;
|
|
21
|
+
|
|
22
|
+
if (!url) {
|
|
23
|
+
res.status(400).send('Missing image URL');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
// 检查是否是一个有效的URL
|
|
28
|
+
const urlObj = new URL(url);
|
|
29
|
+
|
|
30
|
+
// 检查协议是否是https
|
|
31
|
+
if (urlObj.protocol !== 'https:') {
|
|
32
|
+
res.status(400).send('Invalid image URL');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// 使用流式请求和响应
|
|
37
|
+
const response = await axios.get(url, {
|
|
38
|
+
responseType: 'stream',
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// 设置响应头
|
|
42
|
+
res.set('Content-Type', response.headers['content-type']);
|
|
43
|
+
if (response.headers['content-length']) {
|
|
44
|
+
res.set('Content-Length', response.headers['content-length']);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 直接将流管道传输到响应
|
|
48
|
+
response.data.pipe(res);
|
|
49
|
+
|
|
50
|
+
// 处理错误
|
|
51
|
+
response.data.on('error', (err) => {
|
|
52
|
+
logger.error('Stream error:', err.message);
|
|
53
|
+
if (!res.headersSent) {
|
|
54
|
+
res.status(500).send('Error streaming the image');
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
} catch (error) {
|
|
58
|
+
if (error instanceof TypeError && error.message.includes('Invalid URL')) {
|
|
59
|
+
res.status(400).send('Invalid image URL');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
logger.error('Error fetching the image:', error.message);
|
|
63
|
+
res.status(500).send('Could not fetch the image');
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
},
|
|
67
|
+
};
|
package/api/routes/federated.js
CHANGED
|
@@ -333,32 +333,37 @@ module.exports = {
|
|
|
333
333
|
ensureBlocklet(),
|
|
334
334
|
checkFederatedCall({ mode: 'memberToMaster' }),
|
|
335
335
|
async (req, res) => {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
336
|
+
try {
|
|
337
|
+
const { blocklet, verifySite, verifyData } = req;
|
|
338
|
+
const { did: teamDid, wallet: blockletWallet } = await req.getBlockletInfo();
|
|
339
|
+
const { fromUserDid, toUserDid, toUserPk } = verifyData;
|
|
340
|
+
const oauthUser = await node.getUser({ teamDid, user: { did: fromUserDid } });
|
|
341
|
+
const connectedAccounts = oauthUser?.connectedAccounts || [];
|
|
342
|
+
const sourceProvider = oauthUser?.sourceProvider;
|
|
343
|
+
const oauthAccount = connectedAccounts.find((item) => item.provider === sourceProvider);
|
|
344
|
+
const userWallet = fromAppDid(oauthAccount.id, blockletWallet.secretKey);
|
|
345
|
+
|
|
346
|
+
const bindUser = {
|
|
347
|
+
did: toUserDid,
|
|
348
|
+
pk: toUserPk,
|
|
349
|
+
};
|
|
350
|
+
await declareAccount({ wallet: userWallet, blocklet });
|
|
351
|
+
await migrateAccount({ wallet: userWallet, blocklet, user: bindUser });
|
|
352
|
+
await node.createAuditLog(
|
|
353
|
+
{
|
|
354
|
+
action: 'migrateFederatedAccount',
|
|
355
|
+
args: { fromUserDid, toUserDid, callerSite: verifySite, teamDid },
|
|
356
|
+
context: {
|
|
357
|
+
user: getAuditLogActorByFederatedSite(verifySite),
|
|
358
|
+
},
|
|
357
359
|
},
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
360
|
+
node
|
|
361
|
+
);
|
|
362
|
+
res.status(204).send();
|
|
363
|
+
} catch (error) {
|
|
364
|
+
logger.error('Failed to migrate federated account', { error });
|
|
365
|
+
res.status(500).send(error.message);
|
|
366
|
+
}
|
|
362
367
|
}
|
|
363
368
|
);
|
|
364
369
|
|
|
@@ -10,7 +10,7 @@ const { upsertToPassports } = require('@abtnode/auth/lib/passport');
|
|
|
10
10
|
const { getWalletDid, getConnectedAccounts, getSourceProvider } = require('@blocklet/meta/lib/did-utils');
|
|
11
11
|
const formatContext = require('@abtnode/util/lib/format-context');
|
|
12
12
|
const createTranslator = require('@abtnode/util/lib/translate');
|
|
13
|
-
const CustomError = require('@
|
|
13
|
+
const { CustomError } = require('@blocklet/error');
|
|
14
14
|
const { LOGIN_PROVIDER } = require('@blocklet/constant');
|
|
15
15
|
const { withHttps, withTrailingSlash } = require('ufo');
|
|
16
16
|
const { getLastUsedPassport } = require('@abtnode/auth/lib/passport');
|
|
@@ -655,7 +655,7 @@ module.exports = {
|
|
|
655
655
|
}
|
|
656
656
|
|
|
657
657
|
try {
|
|
658
|
-
referrerHost = new URL(referrer).
|
|
658
|
+
referrerHost = new URL(referrer).hostname;
|
|
659
659
|
} catch (err) {
|
|
660
660
|
logger.error('Invalid referrer (failed to parse referrer)', { err });
|
|
661
661
|
res.status(400).send('Invalid host'); // 这里故意返回 Invalid host 而不是 Invalid referrer,可以避免攻击者伪造 referrer 来绕过信任域名检查
|
package/api/routes/openembed.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
|
|
2
2
|
const { BLOCKLET_OPENEMBED_PREFIX } = require('@blocklet/constant');
|
|
3
|
-
const formatError = require('@
|
|
3
|
+
const { formatError } = require('@blocklet/error');
|
|
4
4
|
const pMap = require('p-map');
|
|
5
5
|
const YAML = require('yaml');
|
|
6
6
|
const { joinURL, withQuery, withLeadingSlash, withoutTrailingSlash } = require('ufo');
|
|
@@ -136,8 +136,7 @@ module.exports = {
|
|
|
136
136
|
init(app, node, options) {
|
|
137
137
|
const ensureCors = cors(async (req, callback) => {
|
|
138
138
|
const domains = await getTrustedDomains({ node, req, blocklet: req.blocklet });
|
|
139
|
-
|
|
140
|
-
if (domains.includes(host)) {
|
|
139
|
+
if (domains.includes(req.hostname)) {
|
|
141
140
|
callback(null, { origin: true });
|
|
142
141
|
} else {
|
|
143
142
|
callback(null, { origin: false });
|
package/api/routes/user.js
CHANGED
|
@@ -18,8 +18,7 @@ const { getWallet, getWalletDid } = require('@blocklet/meta/lib/did-utils');
|
|
|
18
18
|
const { Joi } = require('@arcblock/validator');
|
|
19
19
|
const { parse } = require('@abtnode/core/lib/util/ua');
|
|
20
20
|
const getRequestIP = require('@abtnode/util/lib/get-request-ip');
|
|
21
|
-
const formatError = require('@
|
|
22
|
-
const CustomError = require('@abtnode/util/lib/custom-error');
|
|
21
|
+
const { formatError, CustomError } = require('@blocklet/error');
|
|
23
22
|
const { xss } = require('@blocklet/xss');
|
|
24
23
|
const { withQuery, joinURL } = require('ufo');
|
|
25
24
|
const cors = require('cors');
|
|
@@ -738,8 +737,7 @@ module.exports = {
|
|
|
738
737
|
init(server, node, options) {
|
|
739
738
|
const ensureCors = cors(async (req, callback) => {
|
|
740
739
|
const domains = await federatedUtil.getTrustedDomains({ node, req, blocklet: req.blocklet });
|
|
741
|
-
|
|
742
|
-
if (domains.includes(host)) {
|
|
740
|
+
if (domains.includes(req.hostname)) {
|
|
743
741
|
callback(null, { origin: true });
|
|
744
742
|
} else {
|
|
745
743
|
callback(null, { origin: false });
|
|
@@ -940,8 +938,13 @@ module.exports = {
|
|
|
940
938
|
// HACK: 用户使用当前登录会话注销所有会话时,要排除当前登录会话
|
|
941
939
|
params.visitorId = { [Op.ne]: visitorId };
|
|
942
940
|
}
|
|
943
|
-
} else
|
|
944
|
-
params.
|
|
941
|
+
} else {
|
|
942
|
+
params.status = {
|
|
943
|
+
[Op.ne]: 'offline',
|
|
944
|
+
};
|
|
945
|
+
if (visitorId) {
|
|
946
|
+
params.visitorId = visitorId;
|
|
947
|
+
}
|
|
945
948
|
}
|
|
946
949
|
if (!params.visitorId && !params.status) {
|
|
947
950
|
res.status(400).json({ error: 'visitorId or status is required' });
|
|
@@ -3,7 +3,7 @@ const { Joi } = require('@arcblock/validator');
|
|
|
3
3
|
const { messages } = require('@abtnode/auth/lib/auth');
|
|
4
4
|
const { getDidSpacesInfoByClaims, silentAuthorizationInConnect } = require('@abtnode/auth/lib/util/spaces');
|
|
5
5
|
const { DID_SPACES } = require('@blocklet/constant');
|
|
6
|
-
const formatError = require('@
|
|
6
|
+
const { formatError } = require('@blocklet/error');
|
|
7
7
|
const logger = require('../../../libs/logger')(require('../../../../package.json').name);
|
|
8
8
|
|
|
9
9
|
const ExtraParamsSchema = Joi.object({
|
|
@@ -9,7 +9,7 @@ module.exports = function createRoutes() {
|
|
|
9
9
|
action: 'pre-setup',
|
|
10
10
|
authPrincipal: false,
|
|
11
11
|
claims: getAppDidOwnerClaims(),
|
|
12
|
-
onAuth: ({ claims, userDid, userPk, extraParams: { locale } }) => {
|
|
12
|
+
onAuth: ({ claims, userDid, userPk, extraParams: { locale, visitorId } }) => {
|
|
13
13
|
const claim = claims.find((x) => x.type === 'signature');
|
|
14
14
|
verifySignature(claim, userDid, userPk, locale);
|
|
15
15
|
logger.info('pre-setup.connect.success', { userDid });
|
|
@@ -17,6 +17,7 @@ module.exports = function createRoutes() {
|
|
|
17
17
|
nextWorkflowData: {
|
|
18
18
|
claim: pick(claim, ['origin', 'sig']),
|
|
19
19
|
pk: userPk,
|
|
20
|
+
visitorId,
|
|
20
21
|
},
|
|
21
22
|
};
|
|
22
23
|
},
|
|
@@ -4,8 +4,10 @@ const { messages } = require('@abtnode/auth/lib/auth');
|
|
|
4
4
|
const { extractUserAvatar } = require('@abtnode/util/lib/user');
|
|
5
5
|
const formatContext = require('@abtnode/util/lib/format-context');
|
|
6
6
|
const verifySignature = require('@abtnode/auth/lib/util/verify-signature');
|
|
7
|
-
const { LOGIN_PROVIDER } = require('@blocklet/constant');
|
|
8
7
|
const getRequestIP = require('@abtnode/util/lib/get-request-ip');
|
|
8
|
+
const { getDeviceData } = require('@abtnode/util/lib/device');
|
|
9
|
+
const getOrigin = require('@abtnode/util/lib/get-origin');
|
|
10
|
+
const { getLoginProvider } = require('@blocklet/sdk/lib/util/login');
|
|
9
11
|
|
|
10
12
|
const logger = require('../../../libs/logger')('setup');
|
|
11
13
|
|
|
@@ -59,6 +61,10 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
59
61
|
verifySignature(proof.claim, blocklet.appDid, proof.pk, locale);
|
|
60
62
|
const profile = claims.find((x) => x.type === 'profile');
|
|
61
63
|
|
|
64
|
+
const lastLoginIp = getRequestIP(req);
|
|
65
|
+
const deviceData = getDeviceData({ req });
|
|
66
|
+
const walletOS = req.context.didwallet.os;
|
|
67
|
+
const provider = getLoginProvider(req);
|
|
62
68
|
try {
|
|
63
69
|
if (user) {
|
|
64
70
|
// Update user
|
|
@@ -89,17 +95,18 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
89
95
|
did: userDid,
|
|
90
96
|
pk: userPk,
|
|
91
97
|
locale,
|
|
92
|
-
lastLoginIp
|
|
98
|
+
lastLoginIp,
|
|
93
99
|
extra: {
|
|
94
100
|
baseUrl,
|
|
95
101
|
},
|
|
96
102
|
connectedAccount: {
|
|
97
|
-
provider
|
|
103
|
+
provider,
|
|
98
104
|
did: userDid,
|
|
99
105
|
pk: userPk,
|
|
100
106
|
},
|
|
101
107
|
},
|
|
102
108
|
});
|
|
109
|
+
|
|
103
110
|
await node.createAuditLog(
|
|
104
111
|
{
|
|
105
112
|
action: 'addUser',
|
|
@@ -111,6 +118,22 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
111
118
|
);
|
|
112
119
|
}
|
|
113
120
|
|
|
121
|
+
const userSessionDoc = await node.upsertUserSession({
|
|
122
|
+
teamDid,
|
|
123
|
+
visitorId: proof?.visitorId || extraParams?.visitorId,
|
|
124
|
+
userDid,
|
|
125
|
+
appPid: teamDid,
|
|
126
|
+
status: 'online',
|
|
127
|
+
ua: null,
|
|
128
|
+
lastLoginIp,
|
|
129
|
+
extra: {
|
|
130
|
+
walletOS,
|
|
131
|
+
device: deviceData,
|
|
132
|
+
},
|
|
133
|
+
locale,
|
|
134
|
+
origin: await getOrigin({ req }),
|
|
135
|
+
});
|
|
136
|
+
|
|
114
137
|
// Generate new session token that client can save to localStorage
|
|
115
138
|
// HACK: 此处没有 passportId,所以特意不设置 refreshToken,失效后下次登录就能选择合适的 passport
|
|
116
139
|
const sessionToken = await createSessionToken(userDid, {
|
|
@@ -119,7 +142,11 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
119
142
|
fullName: profile?.fullName,
|
|
120
143
|
elevated: true,
|
|
121
144
|
});
|
|
122
|
-
|
|
145
|
+
if (userSessionDoc) {
|
|
146
|
+
await updateSession({ sessionToken, visitorId: userSessionDoc?.visitorId }, true);
|
|
147
|
+
} else {
|
|
148
|
+
await updateSession({ sessionToken }, true);
|
|
149
|
+
}
|
|
123
150
|
logger.info('setup.connect.success', { userDid });
|
|
124
151
|
} catch (err) {
|
|
125
152
|
logger.error('setup.connect.error', { error: err, userDid });
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
const path = require('path');
|
|
4
4
|
const { http } = require('follow-redirects');
|
|
5
5
|
const { getAppImageCacheDir } = require('@abtnode/util/lib/blocklet');
|
|
6
|
-
const CustomError = require('@
|
|
6
|
+
const { CustomError } = require('@blocklet/error');
|
|
7
7
|
|
|
8
8
|
const logger = require('../../libs/logger')();
|
|
9
9
|
|
|
@@ -5,6 +5,7 @@ const JWT = require('@arcblock/jwt');
|
|
|
5
5
|
const md5 = require('@abtnode/util/lib/md5');
|
|
6
6
|
const { wipeSensitiveData } = require('@blocklet/meta/lib/util');
|
|
7
7
|
const cloneDeep = require('@abtnode/util/lib/deep-clone');
|
|
8
|
+
const { NOTIFICATION_TYPES } = require('@blocklet/sdk/lib/validators/notification');
|
|
8
9
|
const {
|
|
9
10
|
NODE_MODES,
|
|
10
11
|
EVENTS,
|
|
@@ -23,6 +24,23 @@ const eventHub =
|
|
|
23
24
|
|
|
24
25
|
const logger = require('../../libs/logger')('notification');
|
|
25
26
|
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
* 校验是否是有效的 passthrough 消息
|
|
30
|
+
* 场景:discuss kit chat 中发送消息时会有两个通知,一个通知是消息的已读状态没有消息体,一个通知发送的内容,
|
|
31
|
+
*/
|
|
32
|
+
const validPassthroughMessage = (notification) => {
|
|
33
|
+
if (
|
|
34
|
+
!notification ||
|
|
35
|
+
notification.type !== NOTIFICATION_TYPES.PASSTHROUGH ||
|
|
36
|
+
notification.passthroughType !== 'messageStatus'
|
|
37
|
+
) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
const { data } = notification;
|
|
41
|
+
return data && data.message;
|
|
42
|
+
};
|
|
43
|
+
|
|
26
44
|
const createNotificationQueue = (name, options, handler) => {
|
|
27
45
|
if (!handler || typeof handler !== 'function') {
|
|
28
46
|
throw new Error('Handler is required');
|
|
@@ -80,7 +98,7 @@ const init = ({ node, notificationService }) => {
|
|
|
80
98
|
pushOnly: job.pushOnly,
|
|
81
99
|
});
|
|
82
100
|
} catch (error) {
|
|
83
|
-
logger.
|
|
101
|
+
logger.warning('Failed to send to app', { notificationId: job.notification.id, error });
|
|
84
102
|
}
|
|
85
103
|
}
|
|
86
104
|
);
|
|
@@ -104,7 +122,7 @@ const init = ({ node, notificationService }) => {
|
|
|
104
122
|
pushOnly: job.pushOnly,
|
|
105
123
|
});
|
|
106
124
|
} catch (error) {
|
|
107
|
-
logger.
|
|
125
|
+
logger.warn('Failed to send to push', { notificationId: job.notification.id, error });
|
|
108
126
|
}
|
|
109
127
|
});
|
|
110
128
|
|
|
@@ -176,7 +194,7 @@ const init = ({ node, notificationService }) => {
|
|
|
176
194
|
pushOnly: input.pushOnly,
|
|
177
195
|
});
|
|
178
196
|
} catch (error) {
|
|
179
|
-
logger.
|
|
197
|
+
logger.warn('Failed to send to email', { notificationId: job.notificationId, error });
|
|
180
198
|
}
|
|
181
199
|
}
|
|
182
200
|
);
|
|
@@ -226,7 +244,7 @@ const init = ({ node, notificationService }) => {
|
|
|
226
244
|
pushOnly: input.pushOnly,
|
|
227
245
|
});
|
|
228
246
|
} catch (error) {
|
|
229
|
-
logger.
|
|
247
|
+
logger.warn('Failed to send to webhook', { url: job.url, notificationId: job.notification.id, error });
|
|
230
248
|
}
|
|
231
249
|
}
|
|
232
250
|
);
|
|
@@ -415,6 +433,11 @@ const init = ({ node, notificationService }) => {
|
|
|
415
433
|
const insertToPushKitPushQueue = (props, nodeInfo, isResend) => {
|
|
416
434
|
const { channels, notification, sender, userInfo, teamDid, options = {} } = props;
|
|
417
435
|
|
|
436
|
+
// 如果是无效的 passthrough 消息,则不进行推送
|
|
437
|
+
if (!validPassthroughMessage(notification)) {
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
|
|
418
441
|
const receiverDid = getWalletDid(userInfo) || userInfo.did;
|
|
419
442
|
|
|
420
443
|
const commonParams = {
|
|
@@ -35,6 +35,12 @@ const CHANNEL_FIELD_MAP = {
|
|
|
35
35
|
[NOTIFICATION_SEND_CHANNEL.EMAIL]: ['emailSendStatus', 'emailSendAt', 'emailSendFailedReason', 'emailSendRecord'],
|
|
36
36
|
};
|
|
37
37
|
|
|
38
|
+
const CHANNEL_MAP = {
|
|
39
|
+
[NOTIFICATION_TYPES.HI]: [NOTIFICATION_SEND_CHANNEL.WALLET],
|
|
40
|
+
[NOTIFICATION_TYPES.CONNECT]: [NOTIFICATION_SEND_CHANNEL.WALLET],
|
|
41
|
+
[NOTIFICATION_TYPES.PASSTHROUGH]: [NOTIFICATION_SEND_CHANNEL.WALLET, NOTIFICATION_SEND_CHANNEL.PUSH],
|
|
42
|
+
};
|
|
43
|
+
|
|
38
44
|
const updateNotificationSendStatus = async ({
|
|
39
45
|
node,
|
|
40
46
|
teamDid,
|
|
@@ -163,10 +169,11 @@ const sendToUserDid = async ({ sender, receiver: rawDid, notification, options,
|
|
|
163
169
|
// eg: type = 'passthrough', 'hi', 'connect', 'feed', 默认只需要通知 wallet
|
|
164
170
|
const pushOnly = _notification.type && _notification.type.toLowerCase() !== NOTIFICATION_TYPES.NOTIFICATION;
|
|
165
171
|
|
|
166
|
-
//
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
172
|
+
// 通知渠道的确定有两种方式 1. 用户传入的 channels 2. 根据 notification 类型确定
|
|
173
|
+
// 如果是 hi connect, 只需要通知 wallet
|
|
174
|
+
// passthrough 类型,用于 discuss kit 的 chat channel
|
|
175
|
+
// 1. push kit: native 通知快速跳转到 chat channel
|
|
176
|
+
// 2. app: 钱包消息,可以查看到接收到消息
|
|
170
177
|
|
|
171
178
|
return node.createNotification({
|
|
172
179
|
teamDid,
|
|
@@ -177,7 +184,7 @@ const sendToUserDid = async ({ sender, receiver: rawDid, notification, options,
|
|
|
177
184
|
entityType: _notification.entityType || 'blocklet',
|
|
178
185
|
entityId: _notification.entityId || sender.appDid,
|
|
179
186
|
source: _notification.source || 'component',
|
|
180
|
-
channels:
|
|
187
|
+
channels: CHANNEL_MAP[_notification.type] || channels,
|
|
181
188
|
sender,
|
|
182
189
|
options: { ...rest },
|
|
183
190
|
pushOnly,
|
|
@@ -234,7 +241,7 @@ const sendToAppDid = async ({
|
|
|
234
241
|
}
|
|
235
242
|
|
|
236
243
|
if (count <= 0 && keepForOfflineUser) {
|
|
237
|
-
logger.
|
|
244
|
+
logger.warn('Online client was not found', { userDid: receiver });
|
|
238
245
|
await states.message.insert({
|
|
239
246
|
did: receiver,
|
|
240
247
|
event: EVENTS.MESSAGE,
|
|
@@ -558,7 +565,7 @@ const sendToPush = async ({ sender, receiver, notification, options, node, pushO
|
|
|
558
565
|
return res;
|
|
559
566
|
})
|
|
560
567
|
.catch((err) => {
|
|
561
|
-
logger.
|
|
568
|
+
logger.warn('Failed to send pushKit', { error: err });
|
|
562
569
|
if (!pushOnly) {
|
|
563
570
|
updateNotificationSendStatus({
|
|
564
571
|
node,
|
package/api/util/federated.js
CHANGED
|
@@ -126,6 +126,10 @@ function syncFederatedUser(blocklet, node, user, sourceAppPid) {
|
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
async function getTrustedDomains({ node, req, blocklet }) {
|
|
129
|
+
if (!blocklet) {
|
|
130
|
+
return req.hostname ? [req.hostname] : [];
|
|
131
|
+
}
|
|
132
|
+
|
|
129
133
|
const teamDid = blocklet.appPid;
|
|
130
134
|
const federated = defaults(cloneDeep(blocklet.settings.federated || {}), {
|
|
131
135
|
config: {
|
|
@@ -142,7 +146,7 @@ async function getTrustedDomains({ node, req, blocklet }) {
|
|
|
142
146
|
.filter((x) => x.status === 'approved' || isMaster(x))
|
|
143
147
|
.forEach((cur) => {
|
|
144
148
|
try {
|
|
145
|
-
const appDomain = new URL(cur.appUrl).
|
|
149
|
+
const appDomain = new URL(cur.appUrl).hostname;
|
|
146
150
|
if (appDomain) {
|
|
147
151
|
domainList.push(appDomain);
|
|
148
152
|
}
|
package/api/util/user-util.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const JWT = require('@arcblock/jwt');
|
|
2
|
-
const CustomError = require('@
|
|
2
|
+
const { CustomError } = require('@blocklet/error');
|
|
3
3
|
const { callFederated } = require('@abtnode/auth/lib/util/federated');
|
|
4
4
|
const { fromAppDid } = require('@arcblock/did-ext');
|
|
5
5
|
|