@abtnode/blocklet-services 1.16.32-beta-93e1a798 → 1.16.32-beta-820e4cfa
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/emails/components/content.js +2 -2
- package/api/emails/pages/notification.js +3 -2
- package/api/libs/connect/session.js +5 -33
- package/api/libs/email.js +6 -1
- package/api/libs/kyc.js +76 -2
- package/api/routes/oauth.js +3 -3
- package/api/routes/openapi.js +4 -4
- package/api/routes/opencomponent.js +4 -6
- package/api/routes/openembed.js +6 -5
- package/api/services/auth/connect/bind-wallet.js +2 -12
- package/api/services/auth/connect/update-kyc.js +10 -2
- package/api/services/kyc/index.js +25 -5
- package/api/util/federated.js +35 -0
- package/dist/assets/{Add-D8jHDZuh.js → Add-BnNzBkSM.js} +1 -1
- package/dist/assets/{Alert-CRD24aa1.js → Alert-MdMGtLD7.js} +1 -1
- package/dist/assets/{ArrowDropDown-CFc0zow6.js → ArrowDropDown-BxN9s0B3.js} +1 -1
- package/dist/assets/{Avatar-BIWwirOj.js → Avatar-C8UCl2Ga.js} +1 -1
- package/dist/assets/{ButtonGroup-DcU8GHuP.js → ButtonGroup-CZa7-ajY.js} +1 -1
- package/dist/assets/{CheckCircle-BrcbSmIK.js → CheckCircle-sCoWELrn.js} +1 -1
- package/dist/assets/{ChevronLeft-Cyjchnxw.js → ChevronLeft-DkDFOWTc.js} +1 -1
- package/dist/assets/{ChevronRight-j0-gJxyM.js → ChevronRight-B4jca3VR.js} +1 -1
- package/dist/assets/{Close-B2vbXcur.js → Close-Dsq723dc.js} +1 -1
- package/dist/assets/{CloseOutlined-BWhWoWD_.js → CloseOutlined-SmGyPCCX.js} +1 -1
- package/dist/assets/{Delete-B2j1UcE8.js → Delete-Dq713V6u.js} +1 -1
- package/dist/assets/{DeleteOutline-C2h-KiXe.js → DeleteOutline-CnT4EQeF.js} +1 -1
- package/dist/assets/{DialogContentText-D5Xxal_F.js → DialogContentText-DacbluUW.js} +1 -1
- package/dist/assets/{Done-B-JT0RXC.js → Done-qR9kVgrH.js} +1 -1
- package/dist/assets/{Download-DP_lDlx2.js → Download-DW26ur5s.js} +1 -1
- package/dist/assets/{Edit-B3J8-Twv.js → Edit-Dws2_-ub.js} +1 -1
- package/dist/assets/{EditIcon-R508XR9R.js → EditIcon-CY6l5Il6.js} +1 -1
- package/dist/assets/{Error-B4vCt6tb.js → Error-C5amiEhI.js} +1 -1
- package/dist/assets/{ExpandMore-IE6fvawl.js → ExpandMore-d42Ky8li.js} +1 -1
- package/dist/assets/{FormControl-Chtq9AE7.js → FormControl-C07X4iXm.js} +1 -1
- package/dist/assets/{FormControlLabel-BmopTtvW.js → FormControlLabel-jY_KMRPD.js} +1 -1
- package/dist/assets/{FormGroup-C54kQ9N4.js → FormGroup-CErrZ95I.js} +1 -1
- package/dist/assets/{Google-DBXwxuV5.js → Google-CvInay_a.js} +1 -1
- package/dist/assets/{Hidden-DPIGUAMJ.js → Hidden-NXnAHRZU.js} +1 -1
- package/dist/assets/{InfoOutlined-BmUBc2r2.js → InfoOutlined-DiESNXUD.js} +1 -1
- package/dist/assets/{InputAdornment-DXkRELYA.js → InputAdornment-DKQXkF5o.js} +1 -1
- package/dist/assets/{InputLabel-DMWY4sIp.js → InputLabel-DCPOxFdI.js} +1 -1
- package/dist/assets/{LastPage-D0B9CdNo.js → LastPage-CupdKuWQ.js} +1 -1
- package/dist/assets/{Launch-DhHbLKKF.js → Launch-BvCfmwc3.js} +1 -1
- package/dist/assets/{LaunchOutlined-CvTIL2cU.js → LaunchOutlined-B-TcY8Ty.js} +1 -1
- package/dist/assets/{Link-CYqMveft.js → Link-B6WCZ3ri.js} +1 -1
- package/dist/assets/{ListItemText-BR6T5ZDu.js → ListItemText-CAgBao36.js} +1 -1
- package/dist/assets/{LoadingButton-DmCdDxLA.js → LoadingButton-BO2pLS2M.js} +1 -1
- package/dist/assets/{LockIcon-C1x7LbhO.js → LockIcon-C--7O0SU.js} +1 -1
- package/dist/assets/{Loop-BwgmQ4ke.js → Loop-BbewjFkt.js} +1 -1
- package/dist/assets/{MoreHoriz-NGD3jXnn.js → MoreHoriz-BnLDnV7Y.js} +1 -1
- package/dist/assets/{MoreVert-MUbtAQHv.js → MoreVert-C8wT9PBh.js} +1 -1
- package/dist/assets/{OpenInNew-CJl5exgf.js → OpenInNew-BuRkQUDs.js} +1 -1
- package/dist/assets/{Pagination-IHWKke1i.js → Pagination-Tk6JJJWb.js} +1 -1
- package/dist/assets/{PlayArrow-DzoHzRoJ.js → PlayArrow-DGa9lwdU.js} +1 -1
- package/dist/assets/{QuestionMarkCircle-TnBpzaSI.js → QuestionMarkCircle-BJqkf48h.js} +1 -1
- package/dist/assets/{RadioGroup-C6M_sifl.js → RadioGroup-Ceyc11_1.js} +1 -1
- package/dist/assets/{Search-wiijyIeu.js → Search-B37iNoKq.js} +1 -1
- package/dist/assets/{Select-CIDtym3x.js → Select-B0ouveBQ.js} +1 -1
- package/dist/assets/{ServerLogo-Bal3ugu3.js → ServerLogo-8TjGIlip.js} +1 -1
- package/dist/assets/{Skeleton-BXCyEPW7.js → Skeleton-8eEDG-Ms.js} +1 -1
- package/dist/assets/{Slider-Ntyz_Q-E.js → Slider-BujG4_Kd.js} +1 -1
- package/dist/assets/{Stack-CYabuVI4.js → Stack-C7-JMCCu.js} +1 -1
- package/dist/assets/{Stepper-DuAngjIl.js → Stepper-Bc34zZ-Y.js} +1 -1
- package/dist/assets/{TextField-x4CoNOlz.js → TextField-D1ujlYf9.js} +1 -1
- package/dist/assets/{Toolbar-DlYXwq_K.js → Toolbar-3DD8ghgH.js} +1 -1
- package/dist/assets/{ViewColumn-8HGbbav-.js → ViewColumn-Dbd2RcMW.js} +1 -1
- package/dist/assets/{ViewList-DjDLjZbQ.js → ViewList-B4KeBI85.js} +1 -1
- package/dist/assets/{access-control-BSvhOxQQ.js → access-control-g3afaGNm.js} +1 -1
- package/dist/assets/{actions-byFcd21l.js → actions-D1fO3id2.js} +1 -1
- package/dist/assets/{add-component-core-BaGwMeTq.js → add-component-core-DrCymqMX.js} +1 -1
- package/dist/assets/{add-resource-R3DTTpMs.js → add-resource-id1YX_Oo.js} +1 -1
- package/dist/assets/{addon-B9HdZ1hJ.js → addon-DwXg8kbW.js} +1 -1
- package/dist/assets/{analytics-Drr9ic2m.js → analytics-DCFGDrSe.js} +1 -1
- package/dist/assets/api-BYS9rs2B.js +1 -0
- package/dist/assets/ar-5o8kqNk7.js +1 -0
- package/dist/assets/{audit-logs-tviTMDA1.js → audit-logs-D0fFriz5.js} +1 -1
- package/dist/assets/{button-D68lNTBN.js → button-ClHJcnVR.js} +1 -1
- package/dist/assets/{click-to-copy-Cy7g0c_W.js → click-to-copy-BqLgKtqA.js} +1 -1
- package/dist/assets/{complete-N8h-bC0Y.js → complete-D-sLwQDJ.js} +4 -4
- package/dist/assets/{component-CyfiUp-R.js → component-ZjhQBkiP.js} +60 -60
- package/dist/assets/{config-BZSxOwu6.js → config-N0FSLwXJ.js} +1 -1
- package/dist/assets/{config-BEOq9uec.js → config-_xJ464M_.js} +1 -1
- package/dist/assets/{config-navigation-C6EN0Fwq.js → config-navigation-fVL2wq7x.js} +1 -1
- package/dist/assets/{confirm-Bz_GmEiI.js → confirm-WGw4zZ8r.js} +1 -1
- package/dist/assets/{connect-BZC3CdFF.js → connect-1sWbqUfW.js} +1 -1
- package/dist/assets/{connect-Cr0AxBUc.js → connect-BZGrsZSG.js} +1 -1
- package/dist/assets/{connect-to-BmqBRB3U.js → connect-to-BzHQacMQ.js} +1 -1
- package/dist/assets/{content-layout-2vv5OZW9.js → content-layout-CBN6Dvqp.js} +1 -1
- package/dist/assets/{dashboard-Cwcji3JN.js → dashboard-B4ze-X1x.js} +3 -3
- package/dist/assets/de-Lu3QkkkU.js +1 -0
- package/dist/assets/{did-address-BIfBoDiQ.js → did-address-BURJDyiC.js} +1 -1
- package/dist/assets/domain-D5gY-NEc.js +9 -0
- package/dist/assets/domain-list-Mq2Fan-d.js +15 -0
- package/dist/assets/email-B50BtSL8.js +15 -0
- package/dist/assets/es-CTrW8z60.js +1 -0
- package/dist/assets/{exchange-passport-D-WRM3Wn.js → exchange-passport-CdNpP3Y-.js} +1 -1
- package/dist/assets/{fallback-DTP7cYpM.js → fallback-BgjQELn7.js} +1 -1
- package/dist/assets/{format-error-BOzcbfGa.js → format-error-CrcMEK2V.js} +1 -1
- package/dist/assets/fr-DU73a_6g.js +1 -0
- package/dist/assets/{fuel-Bn4-TEHO.js → fuel-Ct9vWJB8.js} +1 -1
- package/dist/assets/{fullpage-rvVF1rz8.js → fullpage-DibIuyDh.js} +1 -1
- package/dist/assets/hi-KeUirlJV.js +1 -0
- package/dist/assets/{home-DR7GS6ca.js → home-D4Hg_oC0.js} +1 -1
- package/dist/assets/id-CtWLWcnp.js +1 -0
- package/dist/assets/{iframe-glv0Poq3.js → iframe-DjP5hzT4.js} +1 -1
- package/dist/assets/{index-DFZwS5zQ.js → index-2WFTBY3L.js} +1 -1
- package/dist/assets/{index-ChqFEpi4.js → index-5HAOVHgh.js} +1 -1
- package/dist/assets/{index-DZIjChbd.js → index-9sFaWssT.js} +1 -1
- package/dist/assets/{index-B5vlCSnw.js → index-B2uvJWil.js} +1 -1
- package/dist/assets/{index-BZqmUYmf.js → index-B8yobdAt.js} +1 -1
- package/dist/assets/{index-Bukl4DJp.js → index-BAM5GUAz.js} +1 -1
- package/dist/assets/{index-DgFd31_6.js → index-BCt_GquA.js} +1 -1
- package/dist/assets/{index-B6NXai6_.js → index-BOtnl4g3.js} +1 -1
- package/dist/assets/{index-CEaTcEQs.js → index-BP0e3trc.js} +6 -6
- package/dist/assets/{index-wMDpYZdf.js → index-BYp7PNIm.js} +1 -1
- package/dist/assets/{index-BcUb67P2.js → index-BxmTVomL.js} +1 -1
- package/dist/assets/{index-DWAL5jyd.js → index-C3La5sKU.js} +1 -1
- package/dist/assets/{index-C_flIkR0.js → index-CEBNAvPK.js} +1 -1
- package/dist/assets/{index-CJPYlJzX.js → index-CHp2FXIo.js} +1 -1
- package/dist/assets/{index-BbBRjIRQ.js → index-CInwQHvl.js} +1 -1
- package/dist/assets/{index-BreZlHA5.js → index-CLhW7LJ4.js} +1 -1
- package/dist/assets/{index-Bsh1JZ9i.js → index-CnjLsEef.js} +1 -1
- package/dist/assets/{index-CE9qCuXL.js → index-D-f5DDJ1.js} +1 -1
- package/dist/assets/{index-bxrR9ubG.js → index-DVc2iGFg.js} +4 -4
- package/dist/assets/{index-B8cOlg3J.js → index-DZi-2Gbw.js} +1 -1
- package/dist/assets/{index-3hwSska-.js → index-D_Vu2xLx.js} +3 -3
- package/dist/assets/{index-DYNsUZaH.js → index-Di3jF2ud.js} +1 -1
- package/dist/assets/{index-BQQSQ70k.js → index-DmXHr_Jd.js} +1 -1
- package/dist/assets/{index-CeEJtkL-.js → index-DnjFnDbB.js} +1 -1
- package/dist/assets/{index-mmP1Lkjm.js → index-DqtfVmQd.js} +1 -1
- package/dist/assets/{index-DsNs234N.js → index-Ee7FJItU.js} +1 -1
- package/dist/assets/{index-MgF3lCRP.js → index-FKe4fuVo.js} +1 -1
- package/dist/assets/{index-BNm1w4Av.js → index-h75gmDWw.js} +1 -1
- package/dist/assets/index-j2-hVzu_.js +262 -0
- package/dist/assets/{index-j8Uq5XuX.js → index-wwrsvgTo.js} +1 -1
- package/dist/assets/{index-BNFvQJs8.js → index-wxPofhyR.js} +1 -1
- package/dist/assets/{index.es-Dz_wpH3d.js → index.es-B4hyWcg0.js} +1 -1
- package/dist/assets/index.esm-Xnj83P4x.js +1 -0
- package/dist/assets/{invitation-Bxk7RQM2.js → invitation-B6D49MAH.js} +1 -1
- package/dist/assets/{invite-DxTtxFmK.js → invite-C9_gSzwl.js} +1 -1
- package/dist/assets/{issue-passport-SKwEWQ_s.js → issue-passport-C4GU6O8E.js} +1 -1
- package/dist/assets/{item-B-EBHzLe.js → item-BF5S_bSW.js} +1 -1
- package/dist/assets/ja-CrqtPWVX.js +1 -0
- package/dist/assets/{jss-plugin-props-sort.esm-Bm1tsMYs.js → jss-plugin-props-sort.esm-C037h0ZA.js} +1 -1
- package/dist/assets/ko-Cl75HOeP.js +1 -0
- package/dist/assets/{launch-result-message-CaImC-I4.js → launch-result-message-CSFk0yKu.js} +1 -1
- package/dist/assets/{layout-DskBhVxG.js → layout-Cgc_KlR_.js} +1 -1
- package/dist/assets/{list-header-CfS2OSwd.js → list-header-BJmy3Sb6.js} +1 -1
- package/dist/assets/localization-DxBUHiuu.js +1 -0
- package/dist/assets/{log-BSUm2QeV.js → log-yfx-YeX0.js} +1 -1
- package/dist/assets/{login-BXwy09YT.js → login-CBnpVuLH.js} +1 -1
- package/dist/assets/{login-oauth-callback-CrNNy4ro.js → login-oauth-callback-DhSyRbsE.js} +1 -1
- package/dist/assets/{logo-uploader-Blhm721C.js → logo-uploader-CbVnmlud.js} +3 -3
- package/dist/assets/{lost-passport-r7tegJSQ.js → lost-passport-DYISuGT6.js} +3 -3
- package/dist/assets/{lottie-Bw0llhbP.js → lottie-yg9CNUXF.js} +1 -1
- package/dist/assets/{notifications-CymYmkqD.js → notifications-sAYV5JP7.js} +1 -1
- package/dist/assets/{open-window-EH5UZ1B9.js → open-window-B3y-K43C.js} +1 -1
- package/dist/assets/overview-B2gi6-EB.js +12 -0
- package/dist/assets/{page-header-CGrnydWl.js → page-header-C178XWza.js} +1 -1
- package/dist/assets/{permission-VH_Fm7Pw.js → permission-C_C-c12n.js} +1 -1
- package/dist/assets/{preferences-D4Eq55c6.js → preferences-dJVu_aGA.js} +1 -1
- package/dist/assets/pt-DQT1OGc3.js +1 -0
- package/dist/assets/publish-resource-CmTtvQT5.js +1 -0
- package/dist/assets/react-ByKj6cfy.js +57 -0
- package/dist/assets/{redux-DN6s-mdl.js → redux-B09DmXDw.js} +1 -1
- package/dist/assets/{resource-dialog-uAYGlGhi.js → resource-dialog-BwEU4HN_.js} +1 -1
- package/dist/assets/ru-BnBjQSIA.js +1 -0
- package/dist/assets/sdk-CVUR4sWS.js +1 -0
- package/dist/assets/{selector-LFwadlX9.js → selector-C48VqXJG.js} +1 -1
- package/dist/assets/session-6dBAYf8V.js +1 -0
- package/dist/assets/setup-CW9Mc5ia.js +19 -0
- package/dist/assets/{shorten-label-DZrPE8HL.js → shorten-label-BFmx1uT0.js} +1 -1
- package/dist/assets/{slicedToArray-DEmwrQWd.js → slicedToArray-nXfwDj8Z.js} +1 -1
- package/dist/assets/{spaces-D6Mid5Z_.js → spaces-4Z8WLh5r.js} +1 -1
- package/dist/assets/{start-Dgs20fUu.js → start-CphZOBJ-.js} +1 -1
- package/dist/assets/{step-actions-CQZle7ap.js → step-actions-dsgNJO3G.js} +1 -1
- package/dist/assets/{studio-Bk3f_TnH.js → studio-CqWqozKn.js} +1 -1
- package/dist/assets/{switch-control-XeRJBgck.js → switch-control-Cfn8zFPo.js} +1 -1
- package/dist/assets/th-CGHFfwO3.js +1 -0
- package/dist/assets/{toUpper-D3wJMACz.js → toUpper-D5T8Q9sM.js} +1 -1
- package/dist/assets/{transfer-CJn1-1Hv.js → transfer-Cb9oltJL.js} +1 -1
- package/dist/assets/trim-DT0GIvSS.js +1 -0
- package/dist/assets/{uniqBy-DA6z7OdT.js → uniqBy-DcaH1r2Z.js} +1 -1
- package/dist/assets/{unsubscribe-FfeRFV57.js → unsubscribe-B_g1tnbx.js} +1 -1
- package/dist/assets/{url-join-5MzXbhiU.js → url-join-2JMT_sNX.js} +1 -1
- package/dist/assets/{use-blocklet-info-for-connect-did-spaces-C5KUrb2h.js → use-blocklet-info-for-connect-did-spaces-BdJyHLGD.js} +1 -1
- package/dist/assets/{use-mobile-mkcGNRhM.js → use-mobile-iaxCrChc.js} +1 -1
- package/dist/assets/{useAsync-ByBqdjCT.js → useAsync-BNwz4d_3.js} +1 -1
- package/dist/assets/{useFormControl-BA79DoOc.js → useFormControl-ZYiDKPwe.js} +1 -1
- package/dist/assets/{useLocalStorage-CmGNzDHX.js → useLocalStorage-DJ6SjiMe.js} +1 -1
- package/dist/assets/{useSetState-Cz7xEaUb.js → useSetState-1EVxD1ii.js} +1 -1
- package/dist/assets/{useSlot-CDa1PttK.js → useSlot-DEzPBH-O.js} +1 -1
- package/dist/assets/{useSlotProps-4qJAhdYR.js → useSlotProps-OKH9p37y.js} +1 -1
- package/dist/assets/{useThemeProps-B-j4MceL.js → useThemeProps-CYOsA0xw.js} +1 -1
- package/dist/assets/{user-center-lM3dah3G.js → user-center--iMqbkOW.js} +1 -1
- package/dist/assets/{user-sessions-Bf8PBzsX.js → user-sessions-CSjxxHUQ.js} +1 -1
- package/dist/assets/{util-CxaUEagR.js → util-BBc8rTnk.js} +1 -1
- package/dist/assets/vi-DmvzB5rE.js +1 -0
- package/dist/assets/wrap-locale-HTk2AmiE.js +1 -0
- package/dist/assets/zh-DdFcZXz5.js +2 -0
- package/dist/assets/zh-qFJGs7UR.js +1 -0
- package/dist/assets/zh-tw-DfkXr6W8.js +1 -0
- package/dist/index.html +1 -1
- package/dist/service-worker.js +1 -1
- package/package.json +18 -18
- package/dist/assets/api-DHCXgKlp.js +0 -1
- package/dist/assets/ar-BywPGmOa.js +0 -1
- package/dist/assets/de-qs3PjT55.js +0 -1
- package/dist/assets/domain-CRovIqk7.js +0 -9
- package/dist/assets/domain-list-DcneFIba.js +0 -15
- package/dist/assets/email-CeOASC0F.js +0 -9
- package/dist/assets/es-DXb9xB6c.js +0 -1
- package/dist/assets/fr-CMgZc3LR.js +0 -1
- package/dist/assets/hi-Ch52Lky6.js +0 -1
- package/dist/assets/id-_x67Rh2B.js +0 -1
- package/dist/assets/index-BNnk2PUZ.js +0 -262
- package/dist/assets/index.esm-CoLXjYXU.js +0 -1
- package/dist/assets/ja-BemsOTjE.js +0 -1
- package/dist/assets/ko-CqkhhVdi.js +0 -1
- package/dist/assets/localization-BW8TQLcf.js +0 -1
- package/dist/assets/overview-BpKMkNIP.js +0 -12
- package/dist/assets/pt-DZmF_qcN.js +0 -1
- package/dist/assets/publish-resource-CtKz6A2f.js +0 -1
- package/dist/assets/react-DJuQ-Z9X.js +0 -57
- package/dist/assets/ru-BFNdjdAO.js +0 -1
- package/dist/assets/sdk-BYKTwfxu.js +0 -1
- package/dist/assets/session-BG5hlQoH.js +0 -1
- package/dist/assets/setup-DckNmKNu.js +0 -19
- package/dist/assets/th-B61cOYck.js +0 -1
- package/dist/assets/vi-B884zOLu.js +0 -1
- package/dist/assets/wrap-locale-aLhwmHYY.js +0 -1
- package/dist/assets/zh-DjEnl7LY.js +0 -1
- package/dist/assets/zh-kNAPjCk5.js +0 -2
- package/dist/assets/zh-tw-Bn1Pkz9A.js +0 -1
|
@@ -8,8 +8,8 @@ const components_1 = require("@react-email/components");
|
|
|
8
8
|
const attachments_1 = __importDefault(require("./attachments"));
|
|
9
9
|
const actions_1 = __importDefault(require("./actions"));
|
|
10
10
|
const highlight_1 = require("../libs/highlight");
|
|
11
|
-
function Content({ title, content, attachments = [], actions = [], style = {}, locale, severity = 'normal', }) {
|
|
12
|
-
return ((0, jsx_runtime_1.jsxs)(components_1.Section, { style: style, children: [(0, jsx_runtime_1.jsx)(components_1.Heading, { style: h1, children: title }), content && ((0, jsx_runtime_1.jsx)(components_1.Text, { className: "content", style: { whiteSpace: 'pre-line!important' }, dangerouslySetInnerHTML: { __html: (0, highlight_1.toClickableSpan)(content) } })), (0, jsx_runtime_1.jsx)(attachments_1.default, { severity: severity, attachments: attachments, locale: locale }), (0, jsx_runtime_1.jsx)(actions_1.default, { actions: actions })] }));
|
|
11
|
+
function Content({ title, content, attachments = [], actions = [], style = {}, locale, raw = false, severity = 'normal', }) {
|
|
12
|
+
return ((0, jsx_runtime_1.jsxs)(components_1.Section, { style: style, children: [(0, jsx_runtime_1.jsx)(components_1.Heading, { style: h1, children: title }), content && ((0, jsx_runtime_1.jsx)(components_1.Text, { className: "content", style: { whiteSpace: 'pre-line!important' }, dangerouslySetInnerHTML: { __html: raw ? content : (0, highlight_1.toClickableSpan)(content) } })), (0, jsx_runtime_1.jsx)(attachments_1.default, { severity: severity, attachments: attachments, locale: locale }), (0, jsx_runtime_1.jsx)(actions_1.default, { actions: actions })] }));
|
|
13
13
|
}
|
|
14
14
|
exports.default = Content;
|
|
15
15
|
const h1 = {
|
|
@@ -10,8 +10,9 @@ const footer_1 = __importDefault(require("../components/footer"));
|
|
|
10
10
|
const content_1 = __importDefault(require("../components/content"));
|
|
11
11
|
const layout_1 = __importDefault(require("../components/layout"));
|
|
12
12
|
const header_1 = __importDefault(require("../components/header"));
|
|
13
|
-
const NotificationEmail = ({ title, body = '',
|
|
14
|
-
|
|
13
|
+
const NotificationEmail = ({ title, body = '', raw = false, // do not convert body to clickable span
|
|
14
|
+
subject, attachments = [], actions = [], appInfo, locale = 'en', severity = 'normal', unsubscribeToken, userInfo, }) => {
|
|
15
|
+
return ((0, jsx_runtime_1.jsxs)(layout_1.default, { mainStyle: main, subject: subject, children: [(0, jsx_runtime_1.jsx)(components_1.Preview, { children: subject }), (0, jsx_runtime_1.jsx)(header_1.default, { appInfo: appInfo }), (0, jsx_runtime_1.jsx)(content_1.default, { style: container, title: title, content: body, attachments: attachments, actions: actions, locale: locale, severity: severity, raw: raw }), (0, jsx_runtime_1.jsx)(footer_1.default, { showCopyright: false, showBlocklet: true, appInfo: appInfo, locale: locale, unsubscribeToken: unsubscribeToken, userInfo: userInfo })] }));
|
|
15
16
|
};
|
|
16
17
|
exports.NotificationEmail = NotificationEmail;
|
|
17
18
|
exports.default = exports.NotificationEmail;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// Holds shared logic for session-manager v1 and v2
|
|
2
2
|
const get = require('lodash/get');
|
|
3
3
|
const merge = require('lodash/merge');
|
|
4
|
-
const pick = require('lodash/pick');
|
|
5
4
|
const { joinURL } = require('ufo');
|
|
6
5
|
const formatContext = require('@abtnode/util/lib/format-context');
|
|
7
6
|
const { extractUserAvatar, getAppAvatarUrl } = require('@abtnode/util/lib/user');
|
|
@@ -59,6 +58,7 @@ const {
|
|
|
59
58
|
getFederatedMaster,
|
|
60
59
|
shouldSyncFederated,
|
|
61
60
|
getUserWithinFederated,
|
|
61
|
+
syncFederatedUser,
|
|
62
62
|
} = require('../../util/federated');
|
|
63
63
|
const { Profile } = require('../../state/profile');
|
|
64
64
|
|
|
@@ -813,38 +813,7 @@ module.exports = {
|
|
|
813
813
|
node
|
|
814
814
|
);
|
|
815
815
|
|
|
816
|
-
|
|
817
|
-
'did',
|
|
818
|
-
'pk',
|
|
819
|
-
'fullName',
|
|
820
|
-
'avatar',
|
|
821
|
-
'email',
|
|
822
|
-
'phone',
|
|
823
|
-
'url',
|
|
824
|
-
'inviter',
|
|
825
|
-
'generation',
|
|
826
|
-
'emailVerified',
|
|
827
|
-
'phoneVerified',
|
|
828
|
-
]);
|
|
829
|
-
if (syncUserData.avatar) {
|
|
830
|
-
syncUserData.avatar = getUserAvatarUrl(syncUserData.avatar, blocklet);
|
|
831
|
-
}
|
|
832
|
-
const masterSite = getFederatedMaster(blocklet);
|
|
833
|
-
// NOTICE: 采用异步来更新,不阻塞接口的正常响应
|
|
834
|
-
if (shouldSyncFederated(sourceAppPid, blocklet)) {
|
|
835
|
-
node.syncFederated({
|
|
836
|
-
did: teamDid,
|
|
837
|
-
data: {
|
|
838
|
-
users: [
|
|
839
|
-
{
|
|
840
|
-
...syncUserData,
|
|
841
|
-
action: 'switchProfile',
|
|
842
|
-
sourceAppPid: sourceAppPid || masterSite.appPid,
|
|
843
|
-
},
|
|
844
|
-
],
|
|
845
|
-
},
|
|
846
|
-
});
|
|
847
|
-
}
|
|
816
|
+
syncFederatedUser(blocklet, node, doc, sourceAppPid);
|
|
848
817
|
|
|
849
818
|
// @NOTE: 异步地刷新 profile
|
|
850
819
|
Profile.refresh({
|
|
@@ -1163,6 +1132,9 @@ module.exports = {
|
|
|
1163
1132
|
pk: userPk,
|
|
1164
1133
|
lastLoginAt: currentTime,
|
|
1165
1134
|
firstLoginAt: currentTime,
|
|
1135
|
+
userInfo: {
|
|
1136
|
+
wallet: request.context.didwallet,
|
|
1137
|
+
},
|
|
1166
1138
|
};
|
|
1167
1139
|
|
|
1168
1140
|
await node.updateUser({
|
package/api/libs/email.js
CHANGED
|
@@ -12,7 +12,11 @@ const schemaEmail = Joi.string().email().required();
|
|
|
12
12
|
|
|
13
13
|
const validateEmail = schemaEmail.validateAsync.bind(schemaEmail);
|
|
14
14
|
|
|
15
|
-
async function sendEmail(
|
|
15
|
+
async function sendEmail(
|
|
16
|
+
receiver,
|
|
17
|
+
notification,
|
|
18
|
+
{ teamDid, node, locale, unsubscribeToken = '', userInfo = {}, raw = false }
|
|
19
|
+
) {
|
|
16
20
|
if (!receiver) {
|
|
17
21
|
throw new Error('receiver is required');
|
|
18
22
|
}
|
|
@@ -61,6 +65,7 @@ async function sendEmail(receiver, notification, { teamDid, node, locale, unsubs
|
|
|
61
65
|
...notification,
|
|
62
66
|
appInfo,
|
|
63
67
|
locale,
|
|
68
|
+
raw,
|
|
64
69
|
unsubscribeToken,
|
|
65
70
|
userInfo: {
|
|
66
71
|
...userInfo,
|
package/api/libs/kyc.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
const get = require('lodash/get');
|
|
2
2
|
const uniq = require('lodash/uniq');
|
|
3
3
|
const pick = require('lodash/pick');
|
|
4
|
+
const trim = require('lodash/trim');
|
|
5
|
+
const lowerCase = require('lodash/lowerCase');
|
|
4
6
|
const semver = require('semver');
|
|
5
7
|
const { messages, getVCFromClaims } = require('@abtnode/auth/lib/auth');
|
|
6
8
|
const { getPassportClaimUrl, getKycAcquireUrl } = require('@abtnode/auth/lib/passport');
|
|
9
|
+
const logger = require('@abtnode/logger')('@abtnode/blocklet-services/kyc');
|
|
7
10
|
|
|
8
11
|
const { getTrustedIssuers } = require('../util/blocklet-utils');
|
|
9
12
|
const { PASSPORT_VC_TYPES } = require('./auth/utils');
|
|
13
|
+
const { api } = require('./api');
|
|
10
14
|
|
|
11
15
|
const getPassportVc = async ({ blocklet, claims, challenge, locale, sourceAppPid, types = PASSPORT_VC_TYPES }) => {
|
|
12
16
|
const trustedIssuers = await getTrustedIssuers(blocklet, { sourceAppPid });
|
|
@@ -39,6 +43,35 @@ function isProfileUrlSupported(didWallet) {
|
|
|
39
43
|
return webCanUse || iosCanUse || androidCanUse;
|
|
40
44
|
}
|
|
41
45
|
|
|
46
|
+
function createEmailDomainChecker(toggleField, listField, valueOnDisabled = false) {
|
|
47
|
+
return async (blocklet, email) => {
|
|
48
|
+
if (!email) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
let domain = email.split('@')[1];
|
|
52
|
+
if (!domain) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
domain = domain.toLowerCase();
|
|
56
|
+
|
|
57
|
+
const config = blocklet.settings?.session?.email || {};
|
|
58
|
+
if (!config[toggleField]) {
|
|
59
|
+
return valueOnDisabled;
|
|
60
|
+
}
|
|
61
|
+
if (!config[listField] || !Array.isArray(config[listField]) || config[listField].length === 0) {
|
|
62
|
+
return valueOnDisabled;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const results = await Promise.allSettled(config[listField].map((x) => api.get(x, { timeout: 5000 })));
|
|
66
|
+
const data = results
|
|
67
|
+
.filter((x) => x.status === 'fulfilled' && x.value.data)
|
|
68
|
+
.map((x) => (x.value.data || '').split('\n').map(trim));
|
|
69
|
+
return data.some((x) => x.includes(domain));
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const isEmailBlocked = createEmailDomainChecker('enableDomainBlackList', 'domainBlackList', false);
|
|
73
|
+
const isEmailAllowed = createEmailDomainChecker('enableDomainWhiteList', 'domainWhiteList', true);
|
|
74
|
+
|
|
42
75
|
/**
|
|
43
76
|
* @description
|
|
44
77
|
* @param {object} settings
|
|
@@ -127,6 +160,20 @@ function getKycClaims(blocklet, user, locale, baseUrl, trustedIssuers) {
|
|
|
127
160
|
return claims;
|
|
128
161
|
}
|
|
129
162
|
|
|
163
|
+
const isSameEmail = (email1, email2) => {
|
|
164
|
+
if (!email1 || !email2) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
return lowerCase(email1) === lowerCase(email2);
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const isSamePhone = (phone1, phone2) => {
|
|
171
|
+
if (!phone1 || !phone2) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
return phone1.replace(/\s+/g, '').replace(/[()-]/g, '') === phone2.replace(/\s+/g, '').replace(/[()-]/g, '');
|
|
175
|
+
};
|
|
176
|
+
|
|
130
177
|
async function verifyKycClaims({ node, blocklet, teamDid, claims, challenge, locale, sourceAppPid, user }) {
|
|
131
178
|
const profile = claims.find((claim) => claim.type === 'profile');
|
|
132
179
|
const kycUpdates = pick(user || {}, ['emailVerified', 'phoneVerified']);
|
|
@@ -145,9 +192,21 @@ async function verifyKycClaims({ node, blocklet, teamDid, claims, challenge, loc
|
|
|
145
192
|
throw new Error(messages.missingEmailKyc[locale]);
|
|
146
193
|
}
|
|
147
194
|
const email = get(emailKyc, 'credentialSubject.kyc.subject');
|
|
148
|
-
if (profile?.email && profile.email
|
|
195
|
+
if (profile?.email && !isSameEmail(profile.email, email)) {
|
|
149
196
|
throw new Error(messages.emailMismatch[locale]);
|
|
150
197
|
}
|
|
198
|
+
|
|
199
|
+
const allowed = await isEmailAllowed(blocklet, email);
|
|
200
|
+
if (!allowed) {
|
|
201
|
+
logger.warn('Email domain is not allowed', { teamDid, email });
|
|
202
|
+
throw new Error(messages.emailBlocked[locale]);
|
|
203
|
+
}
|
|
204
|
+
const blocked = await isEmailBlocked(blocklet, email);
|
|
205
|
+
if (blocked) {
|
|
206
|
+
logger.warn('Email domain is blocked', { teamDid, email });
|
|
207
|
+
throw new Error(messages.emailBlocked[locale]);
|
|
208
|
+
}
|
|
209
|
+
|
|
151
210
|
if (!user && isEmailUniqueRequired(blocklet)) {
|
|
152
211
|
const isEmailUsed = await node.isEmailUsed({ teamDid, email, verified: true });
|
|
153
212
|
if (isEmailUsed) {
|
|
@@ -157,6 +216,17 @@ async function verifyKycClaims({ node, blocklet, teamDid, claims, challenge, loc
|
|
|
157
216
|
|
|
158
217
|
kycUpdates.emailVerified = true;
|
|
159
218
|
} else if (!user && profile?.email && isEmailUniqueRequired(blocklet)) {
|
|
219
|
+
const allowed = await isEmailAllowed(blocklet, profile.email);
|
|
220
|
+
if (!allowed) {
|
|
221
|
+
logger.warn('Email domain is not allowed', { teamDid, email: profile.email });
|
|
222
|
+
throw new Error(messages.emailBlocked[locale]);
|
|
223
|
+
}
|
|
224
|
+
const blocked = await isEmailBlocked(blocklet, profile.email);
|
|
225
|
+
if (blocked) {
|
|
226
|
+
logger.warn('Email domain is blocked', { teamDid, email: profile.email });
|
|
227
|
+
throw new Error(messages.emailBlocked[locale]);
|
|
228
|
+
}
|
|
229
|
+
|
|
160
230
|
const isEmailUsed = await node.isEmailUsed({ teamDid, email: profile.email, verified: false });
|
|
161
231
|
if (isEmailUsed) {
|
|
162
232
|
throw new Error(messages.emailAlreadyUsed[locale]);
|
|
@@ -177,7 +247,7 @@ async function verifyKycClaims({ node, blocklet, teamDid, claims, challenge, loc
|
|
|
177
247
|
throw new Error(messages.missingPhoneKyc[locale]);
|
|
178
248
|
}
|
|
179
249
|
const phone = get(phoneKyc, 'credentialSubject.kyc.subject');
|
|
180
|
-
if (profile?.phone && profile.phone
|
|
250
|
+
if (profile?.phone && !isSamePhone(profile.phone, phone)) {
|
|
181
251
|
throw new Error(messages.phoneMismatch[locale]);
|
|
182
252
|
}
|
|
183
253
|
if (!user && isPhoneUniqueRequired(blocklet)) {
|
|
@@ -210,4 +280,8 @@ module.exports = {
|
|
|
210
280
|
getKycClaims,
|
|
211
281
|
verifyKycClaims,
|
|
212
282
|
getPassportVc,
|
|
283
|
+
isEmailBlocked,
|
|
284
|
+
isEmailAllowed,
|
|
285
|
+
isSameEmail,
|
|
286
|
+
isSamePhone,
|
|
213
287
|
};
|
package/api/routes/oauth.js
CHANGED
|
@@ -31,7 +31,7 @@ const { sendToUser } = require('../libs/notification');
|
|
|
31
31
|
const { isInvitedUserOnly, createTokenFn, getDidConnectVersion } = require('../util');
|
|
32
32
|
const { ApiError } = require('../util/error');
|
|
33
33
|
const federatedUtil = require('../util/federated');
|
|
34
|
-
const { isOAuthEmailVerified, isEmailUniqueRequired, isEmailKycRequired } = require('../libs/kyc');
|
|
34
|
+
const { isOAuthEmailVerified, isEmailUniqueRequired, isEmailKycRequired, isSameEmail } = require('../libs/kyc');
|
|
35
35
|
|
|
36
36
|
const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
|
|
37
37
|
|
|
@@ -438,7 +438,7 @@ async function invite(req, node, options) {
|
|
|
438
438
|
fullName: oauthInfo.name,
|
|
439
439
|
avatar: getUserAvatarUrl(baseUrl, avatar),
|
|
440
440
|
};
|
|
441
|
-
if (profile.email
|
|
441
|
+
if (isSameEmail(profile.email, oauthInfo.email) && isOAuthEmailVerified(blocklet, oauthInfo)) {
|
|
442
442
|
profile.emailVerified = true;
|
|
443
443
|
}
|
|
444
444
|
}
|
|
@@ -644,7 +644,7 @@ async function bind(req, node, options) {
|
|
|
644
644
|
avatar,
|
|
645
645
|
};
|
|
646
646
|
|
|
647
|
-
if (mergeProfile.email
|
|
647
|
+
if (isSameEmail(mergeProfile.email, oauthInfo.email) && isOAuthEmailVerified(blocklet, oauthInfo)) {
|
|
648
648
|
mergeProfile.emailVerified = true;
|
|
649
649
|
}
|
|
650
650
|
|
package/api/routes/openapi.js
CHANGED
|
@@ -91,17 +91,17 @@ function mergeOpenAPI(dataList, { blocklet }) {
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
async function generateOpenAPIData({ blocklet, did }) {
|
|
94
|
-
const
|
|
94
|
+
const blockletComponents = blocklet?.children || [];
|
|
95
95
|
const appUrl = blocklet?.environmentObj?.BLOCKLET_APP_URL;
|
|
96
96
|
const healthCheckUrl = joinURL(appUrl, '.well-known/service/health');
|
|
97
97
|
const { data: healthCheckData } = await api.get(healthCheckUrl);
|
|
98
|
-
const
|
|
98
|
+
const runningComponents = blockletComponents.filter((x) => {
|
|
99
99
|
const status = healthCheckData.components?.[x.meta.did];
|
|
100
100
|
return status?.running === true;
|
|
101
101
|
});
|
|
102
102
|
// 单个 component
|
|
103
103
|
if (did) {
|
|
104
|
-
const findComponent =
|
|
104
|
+
const findComponent = runningComponents.find((component) => component?.meta?.did === did);
|
|
105
105
|
if (findComponent) {
|
|
106
106
|
const result = getComponentOpenAPIData(findComponent, { baseUrl: appUrl });
|
|
107
107
|
return result;
|
|
@@ -109,7 +109,7 @@ async function generateOpenAPIData({ blocklet, did }) {
|
|
|
109
109
|
return null;
|
|
110
110
|
}
|
|
111
111
|
// 多个 component 组合
|
|
112
|
-
const componentListData = await pMap(
|
|
112
|
+
const componentListData = await pMap(runningComponents, (x) => getComponentOpenAPIData(x, { baseUrl: appUrl }));
|
|
113
113
|
const result = mergeOpenAPI(componentListData, { blocklet });
|
|
114
114
|
return result;
|
|
115
115
|
}
|
|
@@ -87,17 +87,17 @@ function mergeOpenComponent(dataList, { blocklet }) {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
async function generateOpenComponentData({ blocklet, did }) {
|
|
90
|
-
const
|
|
90
|
+
const blockletComponents = blocklet?.children || [];
|
|
91
91
|
const appUrl = blocklet?.environmentObj?.BLOCKLET_APP_URL;
|
|
92
92
|
const healthCheckUrl = joinURL(appUrl, '.well-known/service/health');
|
|
93
93
|
const { data: healthCheckData } = await api.get(healthCheckUrl);
|
|
94
|
-
const
|
|
94
|
+
const runningComponents = blockletComponents.filter((x) => {
|
|
95
95
|
const status = healthCheckData.components?.[x.meta.did];
|
|
96
96
|
return status?.running === true;
|
|
97
97
|
});
|
|
98
98
|
// 单个 component
|
|
99
99
|
if (did) {
|
|
100
|
-
const findComponent =
|
|
100
|
+
const findComponent = runningComponents.find((component) => component?.meta?.did === did);
|
|
101
101
|
if (findComponent) {
|
|
102
102
|
const result = getComponentOpenComponentData(findComponent, { baseUrl: appUrl });
|
|
103
103
|
return result;
|
|
@@ -105,9 +105,7 @@ async function generateOpenComponentData({ blocklet, did }) {
|
|
|
105
105
|
return null;
|
|
106
106
|
}
|
|
107
107
|
// 多个 component 组合
|
|
108
|
-
const componentListData = await pMap(
|
|
109
|
-
getComponentOpenComponentData(x, { baseUrl: appUrl })
|
|
110
|
-
);
|
|
108
|
+
const componentListData = await pMap(runningComponents, (x) => getComponentOpenComponentData(x, { baseUrl: appUrl }));
|
|
111
109
|
const result = mergeOpenComponent(componentListData, { blocklet });
|
|
112
110
|
return result;
|
|
113
111
|
}
|
package/api/routes/openembed.js
CHANGED
|
@@ -1,5 +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('@abtnode/util/lib/format-error');
|
|
3
4
|
const pMap = require('p-map');
|
|
4
5
|
const YAML = require('yaml');
|
|
5
6
|
const { joinURL, withQuery, withLeadingSlash, withoutTrailingSlash } = require('ufo');
|
|
@@ -25,7 +26,7 @@ async function getComponentOpenEmbedData(component) {
|
|
|
25
26
|
result = JSON.parse(result);
|
|
26
27
|
}
|
|
27
28
|
} catch (err) {
|
|
28
|
-
console.error('openembed.json parse error', err);
|
|
29
|
+
console.error('openembed.json parse error', formatError(err));
|
|
29
30
|
return null;
|
|
30
31
|
}
|
|
31
32
|
|
|
@@ -107,17 +108,17 @@ async function mergeOpenEmbed(dataList, { blocklet, node }) {
|
|
|
107
108
|
}
|
|
108
109
|
|
|
109
110
|
async function generateOpenEmbedData({ blocklet, did, node }) {
|
|
110
|
-
const
|
|
111
|
+
const blockletComponents = blocklet?.children || [];
|
|
111
112
|
const appUrl = blocklet?.environmentObj?.BLOCKLET_APP_URL;
|
|
112
113
|
const healthCheckUrl = joinURL(appUrl, '/.well-known/service/health');
|
|
113
114
|
const { data: healthCheckData } = await api.get(healthCheckUrl);
|
|
114
|
-
const
|
|
115
|
+
const runningComponents = blockletComponents.filter((x) => {
|
|
115
116
|
const status = healthCheckData.components?.[x.meta.did];
|
|
116
117
|
return hasStartEngine(x?.meta) && status?.running === true;
|
|
117
118
|
});
|
|
118
119
|
// 单个 component
|
|
119
120
|
if (did) {
|
|
120
|
-
const findComponent =
|
|
121
|
+
const findComponent = runningComponents.find((component) => component?.meta?.did === did);
|
|
121
122
|
if (findComponent) {
|
|
122
123
|
const result = getComponentOpenEmbedData(findComponent, { baseUrl: appUrl });
|
|
123
124
|
return result;
|
|
@@ -125,7 +126,7 @@ async function generateOpenEmbedData({ blocklet, did, node }) {
|
|
|
125
126
|
return null;
|
|
126
127
|
}
|
|
127
128
|
// 多个 component 组合
|
|
128
|
-
const componentListData = await pMap(
|
|
129
|
+
const componentListData = await pMap(runningComponents, (x) => getComponentOpenEmbedData(x, { baseUrl: appUrl }), {
|
|
129
130
|
concurrency: 3,
|
|
130
131
|
stopOnError: false,
|
|
131
132
|
});
|
|
@@ -3,6 +3,7 @@ const logger = require('../../../libs/logger')(require('../../../../package.json
|
|
|
3
3
|
|
|
4
4
|
const { onConnect, onApprove, authPrincipal } = bindWallet;
|
|
5
5
|
|
|
6
|
+
// eslint-disable-next-line no-unused-vars
|
|
6
7
|
module.exports = function createRoutes(node, authenticator, createSessionToken) {
|
|
7
8
|
return {
|
|
8
9
|
action: 'bind-wallet',
|
|
@@ -24,27 +25,16 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
24
25
|
});
|
|
25
26
|
},
|
|
26
27
|
|
|
27
|
-
onAuth: async ({
|
|
28
|
-
claims,
|
|
29
|
-
challenge,
|
|
30
|
-
userDid,
|
|
31
|
-
userPk,
|
|
32
|
-
extraParams: { locale, componentId, previousUserDid },
|
|
33
|
-
req,
|
|
34
|
-
baseUrl,
|
|
35
|
-
}) => {
|
|
28
|
+
onAuth: async ({ claims, userDid, userPk, extraParams: { locale, previousUserDid }, req, baseUrl }) => {
|
|
36
29
|
try {
|
|
37
30
|
const result = await onApprove({
|
|
38
31
|
node,
|
|
39
32
|
request: req,
|
|
40
33
|
locale,
|
|
41
|
-
challenge,
|
|
42
34
|
userDid,
|
|
43
35
|
userPk,
|
|
44
36
|
baseUrl,
|
|
45
37
|
claims,
|
|
46
|
-
createSessionToken,
|
|
47
|
-
componentId,
|
|
48
38
|
previousUserDid,
|
|
49
39
|
});
|
|
50
40
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const { messages } = require('@abtnode/auth/lib/auth');
|
|
2
2
|
const { getKycClaims, verifyKycClaims, getProfileItems, isProfileClaimRequired } = require('../../../libs/kyc');
|
|
3
3
|
const { getTrustedIssuers } = require('../../../util/blocklet-utils');
|
|
4
|
+
const { syncFederatedUser } = require('../../../util/federated');
|
|
4
5
|
|
|
5
6
|
// Used to update user kyc status using existing certificates
|
|
6
7
|
// eslint-disable-next-line no-unused-vars
|
|
@@ -34,7 +35,12 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
const trustedIssuers = await getTrustedIssuers(blocklet, { sourceAppPid });
|
|
37
|
-
|
|
38
|
+
Object.assign(claims, getKycClaims(blocklet, user, locale, baseUrl, trustedIssuers));
|
|
39
|
+
if (Object.keys(claims).length === 0) {
|
|
40
|
+
throw new Error(messages.noKycRequired[locale]);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return claims;
|
|
38
44
|
},
|
|
39
45
|
|
|
40
46
|
onAuth: async ({ userDid, claims, challenge, extraParams, request }) => {
|
|
@@ -78,12 +84,14 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
78
84
|
teamDid: blocklet.appPid,
|
|
79
85
|
user: {
|
|
80
86
|
did: user.did,
|
|
81
|
-
kycChanged: true,
|
|
82
87
|
...kycUpdates,
|
|
83
88
|
...profileUpdates,
|
|
84
89
|
},
|
|
85
90
|
});
|
|
86
91
|
|
|
92
|
+
// 同步到站点群
|
|
93
|
+
syncFederatedUser(blocklet, node, updatedUser, sourceAppPid);
|
|
94
|
+
|
|
87
95
|
return updatedUser;
|
|
88
96
|
},
|
|
89
97
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
|
|
1
|
+
const { WELLKNOWN_SERVICE_PATH_PREFIX, VERIFY_CODE_TTL } = require('@abtnode/constant');
|
|
2
2
|
const { emailSchema } = require('../../socket/channel/did');
|
|
3
3
|
const { sendEmail } = require('../../libs/email');
|
|
4
|
-
const { isEmailKycRequired, isEmailUniqueRequired } = require('../../libs/kyc');
|
|
4
|
+
const { isEmailKycRequired, isEmailUniqueRequired, isEmailBlocked, isEmailAllowed } = require('../../libs/kyc');
|
|
5
5
|
|
|
6
6
|
const logger = require('../../libs/logger')('kyc');
|
|
7
7
|
|
|
@@ -33,6 +33,24 @@ const init = ({ node }) => {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
const isAllowed = await isEmailAllowed(blocklet, subject);
|
|
37
|
+
if (!isAllowed) {
|
|
38
|
+
logger.warn('Email domain is not allowed', { teamDid, subject });
|
|
39
|
+
return res.status(400).send({
|
|
40
|
+
error: 'Email domain is not allowed, please use another email',
|
|
41
|
+
code: 'email_not_allowed',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const isBlocked = await isEmailBlocked(blocklet, subject);
|
|
46
|
+
if (isBlocked) {
|
|
47
|
+
logger.warn('Email domain is blocked', { teamDid, subject });
|
|
48
|
+
return res.status(400).send({
|
|
49
|
+
error: 'Email domain is blocked, please use another email',
|
|
50
|
+
code: 'email_blocked',
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
36
54
|
if (await node.isSubjectSent({ teamDid, subject })) {
|
|
37
55
|
return res.status(400).send({
|
|
38
56
|
error: 'Email is already sent, please check your inbox, or retry later',
|
|
@@ -47,12 +65,16 @@ const init = ({ node }) => {
|
|
|
47
65
|
subject,
|
|
48
66
|
{
|
|
49
67
|
title: `Verify Your Email on ${info.name}`,
|
|
50
|
-
body:
|
|
68
|
+
body: `<p style="font-size:14px;line-height:24px;margin:16px 0;">To ensure the security of your account and enhance your experience, you need to use following code to verify your email, and you will receive a certificate in your DID Wallet upon verification.</p>
|
|
69
|
+
<p style="font-size:36px; line-height:24px; color: #333; font-weight: bold; text-align: center;">${doc.code}</p>
|
|
70
|
+
<p style="font-size:14px;line-height:24px;margin:16px 0;">This code is valid for ${VERIFY_CODE_TTL / 60 / 1000} minutes. If you don't want to verify your email, you can ignore this message.</p>
|
|
71
|
+
<p style="font-size:14px;line-height:24px;margin:16px 0;">${info.name} will never email you and ask you to disclose your password, credit card, or banking account number. </p>`,
|
|
51
72
|
},
|
|
52
73
|
{
|
|
53
74
|
teamDid,
|
|
54
75
|
node,
|
|
55
76
|
locale: req.query.locale,
|
|
77
|
+
raw: true,
|
|
56
78
|
}
|
|
57
79
|
);
|
|
58
80
|
logger.info('send verify code', { teamDid, result });
|
|
@@ -67,8 +89,6 @@ const init = ({ node }) => {
|
|
|
67
89
|
|
|
68
90
|
const onEndEmailVerify = async (req, res) => {
|
|
69
91
|
try {
|
|
70
|
-
logger.info('onEndEmailVerify', { payload: req.body, user: req.user });
|
|
71
|
-
|
|
72
92
|
const blocklet = await req.getBlocklet();
|
|
73
93
|
const teamDid = blocklet.meta.did;
|
|
74
94
|
|
package/api/util/federated.js
CHANGED
|
@@ -132,6 +132,40 @@ async function getUserWithinFederated({ userDid, userPk, teamDid, sourceAppPid }
|
|
|
132
132
|
return currentUser;
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
+
function syncFederatedUser(blocklet, node, user, sourceAppPid) {
|
|
136
|
+
const masterSite = getFederatedMaster(blocklet);
|
|
137
|
+
if (shouldSyncFederated(sourceAppPid, blocklet)) {
|
|
138
|
+
const data = pick(user, [
|
|
139
|
+
'did',
|
|
140
|
+
'pk',
|
|
141
|
+
'fullName',
|
|
142
|
+
'avatar',
|
|
143
|
+
'email',
|
|
144
|
+
'phone',
|
|
145
|
+
'url',
|
|
146
|
+
'inviter',
|
|
147
|
+
'generation',
|
|
148
|
+
'emailVerified',
|
|
149
|
+
'phoneVerified',
|
|
150
|
+
]);
|
|
151
|
+
if (data.avatar) {
|
|
152
|
+
data.avatar = getUserAvatarUrl(data.avatar, blocklet);
|
|
153
|
+
}
|
|
154
|
+
node.syncFederated({
|
|
155
|
+
did: blocklet.appPid,
|
|
156
|
+
data: {
|
|
157
|
+
users: [
|
|
158
|
+
{
|
|
159
|
+
...data,
|
|
160
|
+
action: 'switchProfile',
|
|
161
|
+
sourceAppPid: sourceAppPid || masterSite.appPid,
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
135
169
|
module.exports = {
|
|
136
170
|
isMaster,
|
|
137
171
|
shouldSyncFederated,
|
|
@@ -142,4 +176,5 @@ module.exports = {
|
|
|
142
176
|
getOAuthUserInfo,
|
|
143
177
|
loginByMember,
|
|
144
178
|
getUserWithinFederated,
|
|
179
|
+
syncFederatedUser,
|
|
145
180
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{X as r,Y as t,j as a}from"./index-
|
|
1
|
+
import{X as r,Y as t,j as a}from"./index-BP0e3trc.js";var e={},u=t;Object.defineProperty(e,"__esModule",{value:!0});var d=e.default=void 0,v=u(r()),o=a;d=e.default=(0,v.default)((0,o.jsx)("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"}),"Add");export{d};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aE as w,aF as H,at as c,j as e,aG as d,ai as T,aH as g,cd as y,ce as I,aK as n,r as _,aI as F,aJ as U,aC as V,aM as Z,aN as D}from"./index-
|
|
1
|
+
import{aE as w,aF as H,at as c,j as e,aG as d,ai as T,aH as g,cd as y,ce as I,aK as n,r as _,aI as F,aJ as U,aC as V,aM as Z,aN as D}from"./index-BP0e3trc.js";import{u as M}from"./useSlot-DEzPBH-O.js";function G(t){return H("MuiAlert",t)}const S=w("MuiAlert",["root","action","icon","message","filled","colorSuccess","colorInfo","colorWarning","colorError","filledSuccess","filledInfo","filledWarning","filledError","outlined","outlinedSuccess","outlinedInfo","outlinedWarning","outlinedError","standard","standardSuccess","standardInfo","standardWarning","standardError"]),J=c(e.jsx("path",{d:"M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4C12.76,4 13.5,4.11 14.2, 4.31L15.77,2.74C14.61,2.26 13.34,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0, 0 22,12M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z"}),"SuccessOutlined"),K=c(e.jsx("path",{d:"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"}),"ReportProblemOutlined"),q=c(e.jsx("path",{d:"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"ErrorOutline"),Q=c(e.jsx("path",{d:"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z"}),"InfoOutlined"),X=c(e.jsx("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close"),Y=["action","children","className","closeText","color","components","componentsProps","icon","iconMapping","onClose","role","severity","slotProps","slots","variant"],tt=t=>{const{variant:s,color:r,severity:o,classes:l}=t,u={root:["root",`color${g(r||o)}`,`${s}${g(r||o)}`,`${s}`],icon:["icon"],message:["message"],action:["action"]};return D(u,G,l)},ot=d(T,{name:"MuiAlert",slot:"Root",overridesResolver:(t,s)=>{const{ownerState:r}=t;return[s.root,s[r.variant],s[`${r.variant}${g(r.color||r.severity)}`]]}})(({theme:t})=>{const s=t.palette.mode==="light"?y:I,r=t.palette.mode==="light"?I:y;return n({},t.typography.body2,{backgroundColor:"transparent",display:"flex",padding:"6px 16px",variants:[...Object.entries(t.palette).filter(([,o])=>o.main&&o.light).map(([o])=>({props:{colorSeverity:o,variant:"standard"},style:{color:t.vars?t.vars.palette.Alert[`${o}Color`]:s(t.palette[o].light,.6),backgroundColor:t.vars?t.vars.palette.Alert[`${o}StandardBg`]:r(t.palette[o].light,.9),[`& .${S.icon}`]:t.vars?{color:t.vars.palette.Alert[`${o}IconColor`]}:{color:t.palette[o].main}}})),...Object.entries(t.palette).filter(([,o])=>o.main&&o.light).map(([o])=>({props:{colorSeverity:o,variant:"outlined"},style:{color:t.vars?t.vars.palette.Alert[`${o}Color`]:s(t.palette[o].light,.6),border:`1px solid ${(t.vars||t).palette[o].light}`,[`& .${S.icon}`]:t.vars?{color:t.vars.palette.Alert[`${o}IconColor`]}:{color:t.palette[o].main}}})),...Object.entries(t.palette).filter(([,o])=>o.main&&o.dark).map(([o])=>({props:{colorSeverity:o,variant:"filled"},style:n({fontWeight:t.typography.fontWeightMedium},t.vars?{color:t.vars.palette.Alert[`${o}FilledColor`],backgroundColor:t.vars.palette.Alert[`${o}FilledBg`]}:{backgroundColor:t.palette.mode==="dark"?t.palette[o].dark:t.palette[o].main,color:t.palette.getContrastText(t.palette[o].main)})}))]})}),st=d("div",{name:"MuiAlert",slot:"Icon",overridesResolver:(t,s)=>s.icon})({marginRight:12,padding:"7px 0",display:"flex",fontSize:22,opacity:.9}),et=d("div",{name:"MuiAlert",slot:"Message",overridesResolver:(t,s)=>s.message})({padding:"8px 0",minWidth:0,overflow:"auto"}),j=d("div",{name:"MuiAlert",slot:"Action",overridesResolver:(t,s)=>s.action})({display:"flex",alignItems:"flex-start",padding:"4px 0 0 16px",marginLeft:"auto",marginRight:-8}),z={success:e.jsx(J,{fontSize:"inherit"}),warning:e.jsx(K,{fontSize:"inherit"}),error:e.jsx(q,{fontSize:"inherit"}),info:e.jsx(Q,{fontSize:"inherit"})},nt=_.forwardRef(function(s,r){const o=F({props:s,name:"MuiAlert"}),{action:l,children:u,className:$,closeText:v="Close",color:f,components:x={},componentsProps:L={},icon:C,iconMapping:b=z,onClose:A,role:h="alert",severity:p="success",slotProps:P={},slots:R={},variant:O="standard"}=o,k=U(o,Y),a=n({},o,{color:f,severity:p,variant:O,colorSeverity:f||p}),i=tt(a),m={slots:n({closeButton:x.CloseButton,closeIcon:x.CloseIcon},R),slotProps:n({},L,P)},[B,E]=M("closeButton",{elementType:V,externalForwardedProps:m,ownerState:a}),[N,W]=M("closeIcon",{elementType:X,externalForwardedProps:m,ownerState:a});return e.jsxs(ot,n({role:h,elevation:0,ownerState:a,className:Z(i.root,$),ref:r},k,{children:[C!==!1?e.jsx(st,{ownerState:a,className:i.icon,children:C||b[p]||z[p]}):null,e.jsx(et,{ownerState:a,className:i.message,children:u}),l!=null?e.jsx(j,{ownerState:a,className:i.action,children:l}):null,l==null&&A?e.jsx(j,{ownerState:a,className:i.action,children:e.jsx(B,n({size:"small","aria-label":v,title:v,color:"inherit",onClick:A},E,{children:e.jsx(N,n({fontSize:"small"},W))}))}):null]}))});export{nt as A,X as C};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{X as r,Y as t,j as a}from"./index-
|
|
1
|
+
import{X as r,Y as t,j as a}from"./index-BP0e3trc.js";var e={},o=t;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,i=o(r()),p=a;u=e.default=(0,i.default)((0,p.jsx)("path",{d:"m7 10 5 5 5-5z"}),"ArrowDropDown");export{u as d};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{at as w,j as u,aF as C,aE as D,aG as m,aK as l,r as g,aI as F,aJ as M,aM as N,aN as z}from"./index-
|
|
1
|
+
import{at as w,j as u,aF as C,aE as D,aG as m,aK as l,r as g,aI as F,aJ as M,aM as N,aN as z}from"./index-BP0e3trc.js";import{u as E}from"./useSlot-DEzPBH-O.js";const U=w(u.jsx("path",{d:"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"}),"Person");function L(a){return C("MuiAvatar",a)}D("MuiAvatar",["root","colorDefault","circular","rounded","square","img","fallback"]);const _=["alt","children","className","component","slots","slotProps","imgProps","sizes","src","srcSet","variant"],q=a=>{const{classes:t,variant:o,colorDefault:r}=a;return z({root:["root",o,r&&"colorDefault"],img:["img"],fallback:["fallback"]},L,t)},T=m("div",{name:"MuiAvatar",slot:"Root",overridesResolver:(a,t)=>{const{ownerState:o}=a;return[t.root,t[o.variant],o.colorDefault&&t.colorDefault]}})(({theme:a})=>({position:"relative",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0,width:40,height:40,fontFamily:a.typography.fontFamily,fontSize:a.typography.pxToRem(20),lineHeight:1,borderRadius:"50%",overflow:"hidden",userSelect:"none",variants:[{props:{variant:"rounded"},style:{borderRadius:(a.vars||a).shape.borderRadius}},{props:{variant:"square"},style:{borderRadius:0}},{props:{colorDefault:!0},style:l({color:(a.vars||a).palette.background.default},a.vars?{backgroundColor:a.vars.palette.Avatar.defaultBg}:l({backgroundColor:a.palette.grey[400]},a.applyStyles("dark",{backgroundColor:a.palette.grey[600]})))}]})),B=m("img",{name:"MuiAvatar",slot:"Img",overridesResolver:(a,t)=>t.img})({width:"100%",height:"100%",textAlign:"center",objectFit:"cover",color:"transparent",textIndent:1e4}),G=m(U,{name:"MuiAvatar",slot:"Fallback",overridesResolver:(a,t)=>t.fallback})({width:"75%",height:"75%"});function H({crossOrigin:a,referrerPolicy:t,src:o,srcSet:r}){const[n,s]=g.useState(!1);return g.useEffect(()=>{if(!o&&!r)return;s(!1);let i=!0;const e=new Image;return e.onload=()=>{i&&s("loaded")},e.onerror=()=>{i&&s("error")},e.crossOrigin=a,e.referrerPolicy=t,e.src=o,r&&(e.srcset=r),()=>{i=!1}},[a,t,o,r]),n}const W=g.forwardRef(function(t,o){const r=F({props:t,name:"MuiAvatar"}),{alt:n,children:s,className:i,component:e="div",slots:h={},slotProps:A={},imgProps:y,sizes:k,src:p,srcSet:f,variant:P="circular"}=r,R=M(r,_);let c=null;const I=H(l({},y,{src:p,srcSet:f})),b=p||f,x=b&&I!=="error",d=l({},r,{colorDefault:!x,component:e,variant:P}),v=q(d),[S,j]=E("img",{className:v.img,elementType:B,externalForwardedProps:{slots:h,slotProps:{img:l({},y,A.img)}},additionalProps:{alt:n,src:p,srcSet:f,sizes:k},ownerState:d});return x?c=u.jsx(S,l({},j)):s||s===0?c=s:b&&n?c=n[0]:c=u.jsx(G,{ownerState:d,className:v.fallback}),u.jsx(T,l({as:e,ownerState:d,className:N(v.root,i),ref:o},R,{children:c}))});export{W as A};
|