ghost 6.25.0 → 6.25.1
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/components/tryghost-i18n-6.25.1.tgz +0 -0
- package/components/{tryghost-parse-email-address-6.25.0.tgz → tryghost-parse-email-address-6.25.1.tgz} +0 -0
- package/core/built/admin/assets/{PolarAngleAxis-BNo3yZOE.js → PolarAngleAxis-C6ZeSpZB.js} +1 -1
- package/core/built/admin/assets/{_baseAssignValue-DwWJd_kU.js → _baseAssignValue-BKAl5FrV.js} +1 -1
- package/core/built/admin/assets/{a-large-small-DzN0AB7t.js → a-large-small-B_ulQCIs.js} +1 -1
- package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
- package/core/built/admin/assets/admin-x-settings/{code-editor-view-De3K_osj.mjs → code-editor-view-CBYT1gA1.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-bGxDzD13.mjs → index-CN5CixaU.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-5D8KqsFU.mjs → index-CPQODntW.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-BIUDn7ot.mjs → index-CgTfOd7g.mjs} +9 -9
- package/core/built/admin/assets/admin-x-settings/{modals-DuokUyAH.mjs → modals-_y-6HROx.mjs} +2 -2
- package/core/built/admin/assets/{at-sign-vqoOA4VZ.js → at-sign-B8xWKM0y.js} +1 -1
- package/core/built/admin/assets/{audience-CFjVlFTu.js → audience-CBOR--z9.js} +1 -1
- package/core/built/admin/assets/{avatar-flipboard-DuTJ0ty5.js → avatar-flipboard-IipGb_wZ.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-C1WkXrRJ.js → bluesky-sharing-CkI1QuAm.js} +1 -1
- package/core/built/admin/assets/{chart-Bs2L1q8g.js → chart-_slUcr-K.js} +1 -1
- package/core/built/admin/assets/{chunk.524.ed5714f505e821e549f3.js → chunk.524.5b9b463506a16221fc91.js} +6 -6
- package/core/built/admin/assets/{chunk.582.639cecaca9e77bd7dd4f.js → chunk.582.d8eae1661d753befaefd.js} +7 -7
- package/core/built/admin/assets/{chunk.603.5cb992da88800a9388f3.js → chunk.630.3dbb0231a2d871126a80.js} +4 -4
- package/core/built/admin/assets/{code-editor-view-DIH4grxv.js → code-editor-view-BWMqr2JV.js} +1 -1
- package/core/built/admin/assets/comments-BeoA0nfK.js +1 -0
- package/core/built/admin/assets/{content-helpers-Cr_DHEOl.js → content-helpers-CmTGdEmL.js} +1 -1
- package/core/built/admin/assets/{copy-w3c9zkaZ.js → copy-CDHcAPJw.js} +1 -1
- package/core/built/admin/assets/{data-list-D-K_XfF3.js → data-list-Crb1ffbp.js} +1 -1
- package/core/built/admin/assets/{deleted-feed-item-DK47iaMV.js → deleted-feed-item-DBW0zJQg.js} +1 -1
- package/core/built/admin/assets/{dropzone-BHWXAN0m.js → dropzone-B9JUsQlW.js} +3 -3
- package/core/built/admin/assets/{edit-profile-DCyHhZgx.js → edit-profile-Dz-IhetN.js} +1 -1
- package/core/built/admin/assets/{empty-indicator-DjmACVr2.js → empty-indicator-2QGnEbtY.js} +1 -1
- package/core/built/admin/assets/{en-Cl0b7CNW.js → en-BRQS1Z8j.js} +1 -1
- package/core/built/admin/assets/{feed-C5AauoXf.js → feed-T3kW9UJA.js} +1 -1
- package/core/built/admin/assets/filters-ChOMQQZW.js +1 -0
- package/core/built/admin/assets/{gh-chart-xjwu2HZo.js → gh-chart-fuWw60Ka.js} +1 -1
- package/core/built/admin/assets/{growth-DDyypj0q.js → growth-D9sCnmon.js} +1 -1
- package/core/built/admin/assets/{hash-Bowe71Lt.js → hash-CI1pQ1UC.js} +1 -1
- package/core/built/admin/assets/header-OevT95FI.js +1 -0
- package/core/built/admin/assets/{inbox-DS4qMjUb.js → inbox-DYY8-M1K.js} +1 -1
- package/core/built/admin/assets/{index-A6WmqYr6.js → index-8CZdLQzu.js} +1 -1
- package/core/built/admin/assets/{index-6Ag8SK_E.js → index-BDAOs7pI.js} +1 -1
- package/core/built/admin/assets/{index-B_XhekWb.js → index-BEEgMX-_.js} +1 -1
- package/core/built/admin/assets/index-BbveDn8H.css +1 -0
- package/core/built/admin/assets/{index-CfpTfwls.js → index-C-Cpbee5.js} +1 -1
- package/core/built/admin/assets/{index-4xuWCs9h.js → index-CCF2RKxR.js} +12 -12
- package/core/built/admin/assets/{index-JMWMnGGt.js → index-CEnfjH5h.js} +3 -3
- package/core/built/admin/assets/{index-N61Xkr32.js → index-CcFVbffG.js} +1 -1
- package/core/built/admin/assets/{index-CZK1A375.js → index-CyMlhfZJ.js} +1 -1
- package/core/built/admin/assets/{index-CFY2MOp4.js → index-DBZYUfjO.js} +1 -1
- package/core/built/admin/assets/{index-C8ssgmjI.js → index-DJa3pLmx.js} +1 -1
- package/core/built/admin/assets/{index-SDMWxO5r.js → index-DVqmhe-L.js} +1 -1
- package/core/built/admin/assets/{index-BCvRITTU.js → index-DW5aEj6O.js} +2 -2
- package/core/built/admin/assets/{index-CVvW6Q-y.js → index-DcFgRUSN.js} +1 -1
- package/core/built/admin/assets/{index-DX6vaEVx.js → index-DjgsxHeB.js} +1 -1
- package/core/built/admin/assets/{index-B8XuCPIT.js → index-mqQc8MVd.js} +1 -1
- package/core/built/admin/assets/{index-DqlHFtZD.js → index-qQZsxgFE.js} +1 -1
- package/core/built/admin/assets/{koenig-lexical-DL3I-AcK.js → koenig-lexical-CsbE6fpi.js} +1 -1
- package/core/built/admin/assets/kpis-Dw04ruBN.js +1 -0
- package/core/built/admin/assets/{label-DBwnwMrX.js → label-tBvn89sm.js} +1 -1
- package/core/built/admin/assets/{links-CnjcW0lg.js → links-Do4jcjIh.js} +1 -1
- package/core/built/admin/assets/{loader-circle-CGDGFypO.js → loader-circle-C8exRUku.js} +4 -4
- package/core/built/admin/assets/{lucide-react-BfVLf4Hw.js → lucide-react-4VO5Dwow.js} +1 -1
- package/core/built/admin/assets/{main-layout-C_UH037j.js → main-layout-BAqXRgAx.js} +1 -1
- package/core/built/admin/assets/{member-route-CKuE9uDU.js → member-route-D4n-RbQd.js} +1 -1
- package/core/built/admin/assets/members-DRLgwCgJ.js +15 -0
- package/core/built/admin/assets/{message-square-text-BDJyLbG2.js → message-square-text-CC_1bY-Q.js} +5 -5
- package/core/built/admin/assets/{minus-BM0xhFIQ.js → minus-DSyx9DCe.js} +1 -1
- package/core/built/admin/assets/{modals-B6ZySU0x.js → modals-AryZr_DA.js} +1 -1
- package/core/built/admin/assets/{moderation-CQMIGpv1.js → moderation-DwKm9LO-.js} +1 -1
- package/core/built/admin/assets/{newsletter-Dexg7vU8.js → newsletter-C0rydPGS.js} +1 -1
- package/core/built/admin/assets/{newsletters-CT4k07rm.js → newsletters-DKdmxfDG.js} +1 -1
- package/core/built/admin/assets/{note-CiemurXq.js → note-996Zos9G.js} +1 -1
- package/core/built/admin/assets/{overview-9TwqfzGq.js → overview-r17hlWAB.js} +1 -1
- package/core/built/admin/assets/{pagemenu-Dq744OgH.js → pagemenu-DzpB1AkZ.js} +17 -17
- package/core/built/admin/assets/{post-analytics-CcRhLDKA.js → post-analytics-AwufPVFE.js} +1 -1
- package/core/built/admin/assets/{post-analytics-context-COgn3d86.js → post-analytics-context-GFe0lMc-.js} +1 -1
- package/core/built/admin/assets/{post-analytics-header-DtBp2QSX.js → post-analytics-header-DmGyNvP9.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-BlOEKX3-.js → post-share-modal-CTpdCS2X.js} +1 -1
- package/core/built/admin/assets/posts/{comments-C4rwkXWy.mjs → comments-Cvt31uBs.mjs} +32 -31
- package/core/built/admin/assets/posts/{dialog-Chkt119L.mjs → dialog-DaViJlnd.mjs} +3 -3
- package/core/built/admin/assets/posts/{dropdown-menu-CvSs_ay2.mjs → dropdown-menu-B4KGMiRI.mjs} +5 -5
- package/core/built/admin/assets/posts/{empty-indicator-GyeO28CG.mjs → empty-indicator-BaD6pCXM.mjs} +2 -2
- package/core/built/admin/assets/posts/{filters-BD3A2GlB.mjs → filters-BsCI4RJg.mjs} +11 -7
- package/core/built/admin/assets/posts/{get-site-timezone-Baeue4hE.mjs → get-site-timezone-Bo-iI2bI.mjs} +2 -2
- package/core/built/admin/assets/posts/{growth-kmVbKjBt.mjs → growth-BJxIDp2o.mjs} +14 -14
- package/core/built/admin/assets/posts/header-7zhnErbb.mjs +100 -0
- package/core/built/admin/assets/posts/{heading-DV_WQJh4.mjs → heading-BCDx_eVF.mjs} +2 -2
- package/core/built/admin/assets/posts/{hooks-DQhsid0U.mjs → hooks-DQL2O_El.mjs} +2 -2
- package/core/built/admin/assets/posts/{index-CVum5OE6.mjs → index-0mEgtljt.mjs} +3 -3
- package/core/built/admin/assets/posts/{index-Bl1ReYmV.mjs → index-BTzJVQ6S.mjs} +10 -10
- package/core/built/admin/assets/posts/{input-C7qFEkmt.mjs → input-DaHXv92f.mjs} +2 -2
- package/core/built/admin/assets/posts/{kpis-DteuJY-D.mjs → kpis-GRsx6fPV.mjs} +10 -10
- package/core/built/admin/assets/posts/{links-eoZr0T0x.mjs → links-B1q_pqE9.mjs} +4 -4
- package/core/built/admin/assets/posts/{loading-indicator-Dj1SCL40.mjs → loading-indicator-DiYqXomj.mjs} +3 -3
- package/core/built/admin/assets/posts/{main-layout-Ct-TA0TH.mjs → main-layout-DeqPTJTe.mjs} +2 -2
- package/core/built/admin/assets/posts/{members-BY9oPKo4.mjs → members-LABk5yI5.mjs} +3055 -2831
- package/core/built/admin/assets/posts/{newsletter-BR1tln6E.mjs → newsletter-C_nbHBaP.mjs} +15 -15
- package/core/built/admin/assets/posts/{overview-j1ANMAQ2.mjs → overview-AJnKv4Ze.mjs} +16 -16
- package/core/built/admin/assets/posts/{post-analytics-DnG-Rolr.mjs → post-analytics-b_CKsePp.mjs} +6 -6
- package/core/built/admin/assets/posts/{post-analytics-context-hiKFF4yE.mjs → post-analytics-context-D6jtpxxm.mjs} +5 -5
- package/core/built/admin/assets/posts/{post-analytics-header-OqAJ8SUL.mjs → post-analytics-header-R5UF_tF0.mjs} +11 -11
- package/core/built/admin/assets/posts/{post-share-modal-BWfujDu2.mjs → post-share-modal-y4BEOajk.mjs} +4 -4
- package/core/built/admin/assets/posts/{posts-CS9tqSJC.mjs → posts-C2hNrf1c.mjs} +2 -2
- package/core/built/admin/assets/posts/posts.js +1 -1
- package/core/built/admin/assets/posts/{reply-CX_EQh9X.mjs → reply-2Uvi3Kxb.mjs} +2 -2
- package/core/built/admin/assets/posts/{search-BqzdnPQb.mjs → search-se7meOnL.mjs} +2 -2
- package/core/built/admin/assets/posts/{select-CD5WLIrZ.mjs → select-DpUpauFg.mjs} +8 -8
- package/core/built/admin/assets/posts/{separator-DFPLsWCc.mjs → separator-CdBM46dw.mjs} +3 -3
- package/core/built/admin/assets/posts/{settings-lnEt3Kb-.mjs → settings-Chhj9xKP.mjs} +2 -2
- package/core/built/admin/assets/posts/{sheet-CkLfUqdH.mjs → sheet--k3SiDko.mjs} +3 -3
- package/core/built/admin/assets/posts/{skeleton-BZCi-IYy.mjs → skeleton-CUSLSLoY.mjs} +3 -3
- package/core/built/admin/assets/posts/{source-icon-C0k2hDC_.mjs → source-icon-BjYUIoXN.mjs} +3 -3
- package/core/built/admin/assets/posts/{stats-AHbSTqzG.mjs → stats-BRdXKaxM.mjs} +4 -4
- package/core/built/admin/assets/posts/{table-DMrf6wp5.mjs → table-Bgi_UcfL.mjs} +2 -2
- package/core/built/admin/assets/posts/{tabs-BH8GNJCe.mjs → tabs-DT8Bh72E.mjs} +14 -14
- package/core/built/admin/assets/posts/{tags-C5VV8Gd0.mjs → tags-BCFLnZYl.mjs} +61 -60
- package/core/built/admin/assets/posts/{tags-DucujdYI.mjs → tags-Kv2q0o3p.mjs} +2 -2
- package/core/built/admin/assets/posts/{use-scroll-restoration-C7A3TpAz.mjs → use-scroll-restoration-CLAUAal3.mjs} +6 -6
- package/core/built/admin/assets/posts/{virtual-list-window-BIGoc0th.mjs → virtual-list-window-CQDEqNBL.mjs} +180 -274
- package/core/built/admin/assets/posts/{web-DczNailO.mjs → web-CqN0MQU6.mjs} +18 -18
- package/core/built/admin/assets/{posts-Dr3u9yOp.js → posts-GvXDuhVG.js} +1 -1
- package/core/built/admin/assets/{referrers-6As_USul.js → referrers-Bd9pW-WX.js} +1 -1
- package/core/built/admin/assets/{repeat-D-Ki-Cg5.js → repeat-y6HlMgGO.js} +2 -2
- package/core/built/admin/assets/{reply-C4V0xZ2U.js → reply-Cc8ryI5v.js} +2 -2
- package/core/built/admin/assets/{select-Dt579MbD.js → select-CGr_5qad.js} +1 -1
- package/core/built/admin/assets/{settings-BMsoTszq.js → settings-BPsfSgg3.js} +1 -1
- package/core/built/admin/assets/{settings-Ck1Hqs1x.js → settings-BTd0Adha.js} +4 -4
- package/core/built/admin/assets/{sort-button-Bn325H3y.js → sort-button-k76_5HR2.js} +1 -1
- package/core/built/admin/assets/{source-icon-CNqsYZeA.js → source-icon-DMt0UskC.js} +1 -1
- package/core/built/admin/assets/{sprout-C9DbfYGe.js → sprout-Td9eaOoY.js} +2 -2
- package/core/built/admin/assets/{square-CWrI0H4v.js → square-Df8vEYlG.js} +1 -1
- package/core/built/admin/assets/stats/{audience-DBW5Xu1c.mjs → audience-DMTObpL8.mjs} +3 -3
- package/core/built/admin/assets/stats/{content-helpers-BR6DcWwH.mjs → content-helpers-ReMp9KJN.mjs} +4 -4
- package/core/built/admin/assets/stats/{index-CFvGHbAV.mjs → index-6L-yLKFX.mjs} +8 -8
- package/core/built/admin/assets/stats/{index-BuS4r1cs.mjs → index-CIUyjeP-.mjs} +5 -5
- package/core/built/admin/assets/stats/{index-DKS4mzS-.mjs → index-CMSDpQm3.mjs} +11 -7
- package/core/built/admin/assets/stats/{index-ZjicrvMA.mjs → index-Ca-_KJzy.mjs} +5 -5
- package/core/built/admin/assets/stats/{index-TeAxlGlY.mjs → index-CfO5yPSP.mjs} +5 -5
- package/core/built/admin/assets/stats/{sort-button-DbwzvVKL.mjs → sort-button-BB_M2CdZ.mjs} +3 -3
- package/core/built/admin/assets/stats/{stats-BatzfgdA.mjs → stats-B2nnuLeU.mjs} +2 -2
- package/core/built/admin/assets/stats/stats.js +1 -1
- package/core/built/admin/assets/stats/{tabs-B32ptD5t.mjs → tabs-DjJG-d3O.mjs} +3 -3
- package/core/built/admin/assets/stats/{use-growth-stats-DmTT2gKd.mjs → use-growth-stats-BMT5M7l6.mjs} +3 -3
- package/core/built/admin/assets/{stats-G4Ge9ETb.js → stats-Bs9ZbmXX.js} +1 -1
- package/core/built/admin/assets/{stats-view-Bx3oDAIW.js → stats-view-BWoPuaLz.js} +1 -1
- package/core/built/admin/assets/{step-1-y3anLU0g.js → step-1-BUvsuCs0.js} +1 -1
- package/core/built/admin/assets/{step-2-Dr1lGnHU.js → step-2-DI9ekXls.js} +1 -1
- package/core/built/admin/assets/{step-3-C_d2hvMs.js → step-3-DzT_XhaS.js} +2 -2
- package/core/built/admin/assets/{table-CbN_vbUx.js → table-BKqaEGAm.js} +1 -1
- package/core/built/admin/assets/{tabs-DFJzY5np.js → tabs-G6Ql8vbf.js} +1 -1
- package/core/built/admin/assets/tags-BHm-dlBs.js +1 -0
- package/core/built/admin/assets/{tags-Ddg8oG2Y.js → tags-_taMP0sJ.js} +1 -1
- package/core/built/admin/assets/{textarea-DikWsYMt.js → textarea-DcVuGYYq.js} +1 -1
- package/core/built/admin/assets/{tiers-B7qV_8mO.js → tiers-kv-xBoqQ.js} +1 -1
- package/core/built/admin/assets/{toggle-group-tXaaTD7P.js → toggle-group-DsatLdt7.js} +1 -1
- package/core/built/admin/assets/{topic-filter-bQtscKE6.js → topic-filter-DkJyIuAf.js} +1 -1
- package/core/built/admin/assets/{trash--VS50LgS.js → trash-BeZZgbn-.js} +1 -1
- package/core/built/admin/assets/{upload-Dz-DI9rQ.js → upload-BG7KNIn7.js} +4 -4
- package/core/built/admin/assets/{use-growth-stats-DNVioFUq.js → use-growth-stats-CNGdl44N.js} +1 -1
- package/core/built/admin/assets/{use-scroll-restoration-CxWEiCuS.js → use-scroll-restoration-CQ3w0W98.js} +1 -1
- package/core/built/admin/assets/{use-simple-pagination-BA6xsVQO.js → use-simple-pagination-BeIJ_5Vv.js} +1 -1
- package/core/built/admin/assets/{user-plus-B0tpOnLM.js → user-plus-CMxR50-Y.js} +1 -1
- package/core/built/admin/assets/{user-round-check-caJYm0bB.js → user-round-check-2nhPmqP3.js} +1 -1
- package/core/built/admin/assets/virtual-list-window-Uq8oKYVG.js +4 -0
- package/core/built/admin/assets/{wallet-cards-DBM65lA_.js → wallet-cards-CJcVzH0D.js} +1 -1
- package/core/built/admin/assets/{web-CSXixG1S.js → web-BPwTFKrc.js} +1 -1
- package/core/built/admin/index.html +5 -5
- package/core/server/services/members/service.js +0 -22
- package/core/server/services/verification/verification-webhook-service.js +2 -2
- package/core/server/services/verification/verification-webhook-service.ts +2 -2
- package/core/server/services/verification-trigger.js +34 -69
- package/core/shared/labs.js +2 -2
- package/package.json +5 -5
- package/tsconfig.tsbuildinfo +1 -1
- package/components/tryghost-i18n-6.25.0.tgz +0 -0
- package/core/built/admin/assets/comments-gAnA10dK.js +0 -1
- package/core/built/admin/assets/filters-DzSJ1ez3.js +0 -1
- package/core/built/admin/assets/index-Chp0ODAU.css +0 -1
- package/core/built/admin/assets/kpis-Bm-hIEkf.js +0 -1
- package/core/built/admin/assets/members-CzztojNk.js +0 -15
- package/core/built/admin/assets/tags-D5g9tXZU.js +0 -1
- package/core/built/admin/assets/virtual-list-window-JdKgHS9L.js +0 -4
- package/core/shared/config/env/config.testing-browser.json +0 -98
|
@@ -3,17 +3,7 @@ const DomainEvents = require('@tryghost/domain-events');
|
|
|
3
3
|
const {MemberCreatedEvent} = require('../../shared/events');
|
|
4
4
|
|
|
5
5
|
const messages = {
|
|
6
|
-
emailVerificationNeeded: `We're hard at work processing your import. To make sure you get great deliverability, we'll need to enable some extra features for your account. A member of our team will be in touch
|
|
7
|
-
emailVerificationEmailSubject: `Email needs verification`,
|
|
8
|
-
emailVerificationEmailMessageImport: `Email verification needed for site: {siteUrl}, has imported: {amountTriggered} members in the last 30 days.`,
|
|
9
|
-
emailVerificationEmailMessageAdmin: `Email verification needed for site: {siteUrl} has added: {amountTriggered} members through the Admin client in the last 30 days.`,
|
|
10
|
-
emailVerificationEmailMessageAPI: `Email verification needed for site: {siteUrl} has added: {amountTriggered} members through the API in the last 30 days.`
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
const verificationMessageBySource = {
|
|
14
|
-
api: messages.emailVerificationEmailMessageAPI,
|
|
15
|
-
admin: messages.emailVerificationEmailMessageAdmin,
|
|
16
|
-
import: messages.emailVerificationEmailMessageImport
|
|
6
|
+
emailVerificationNeeded: `We're hard at work processing your import. To make sure you get great deliverability, we'll need to enable some extra features for your account. A member of our team will be in touch by email to review your account and make sure everything is configured correctly so you're ready to go.`
|
|
17
7
|
};
|
|
18
8
|
|
|
19
9
|
class VerificationTrigger {
|
|
@@ -26,8 +16,6 @@ class VerificationTrigger {
|
|
|
26
16
|
* @param {() => boolean} deps.isVerified Check Ghost config to see if we are already verified
|
|
27
17
|
* @param {() => boolean} deps.isVerificationRequired Check Ghost settings to see whether verification has been requested
|
|
28
18
|
* @param {(value: boolean) => void} deps.setVerificationRequired Directly update the settings cache for email_verification_required
|
|
29
|
-
* @param {() => boolean} deps.isVerificationFlowEnabled Check whether webhook-based verification flow is enabled
|
|
30
|
-
* @param {(content: {subject: string, message: string, amountTriggered: number}) => Promise<void>} deps.sendVerificationEmail Sends an email to the escalation address to confirm that customer needs to be verified
|
|
31
19
|
* @param {(content: {amountTriggered: number, threshold: number, method: string}) => Promise<boolean>} deps.sendVerificationWebhook Sends a webhook to the escalation service to confirm that customer needs to be verified
|
|
32
20
|
* @param {any} deps.Settings Ghost Settings model
|
|
33
21
|
* @param {any} deps.eventRepository For querying events
|
|
@@ -39,8 +27,6 @@ class VerificationTrigger {
|
|
|
39
27
|
isVerified,
|
|
40
28
|
isVerificationRequired,
|
|
41
29
|
setVerificationRequired,
|
|
42
|
-
isVerificationFlowEnabled,
|
|
43
|
-
sendVerificationEmail,
|
|
44
30
|
sendVerificationWebhook,
|
|
45
31
|
Settings,
|
|
46
32
|
eventRepository
|
|
@@ -51,9 +37,7 @@ class VerificationTrigger {
|
|
|
51
37
|
this._isVerified = isVerified;
|
|
52
38
|
this._isVerificationRequired = isVerificationRequired;
|
|
53
39
|
this._setVerificationRequired = setVerificationRequired || (() => {});
|
|
54
|
-
this.
|
|
55
|
-
this._sendVerificationEmail = sendVerificationEmail;
|
|
56
|
-
this._sendVerificationWebhook = sendVerificationWebhook;
|
|
40
|
+
this._sendVerificationWebhook = sendVerificationWebhook || (async () => false);
|
|
57
41
|
this._Settings = Settings;
|
|
58
42
|
this._eventRepository = eventRepository;
|
|
59
43
|
|
|
@@ -76,13 +60,9 @@ class VerificationTrigger {
|
|
|
76
60
|
return this._getImportTriggerThreshold();
|
|
77
61
|
}
|
|
78
62
|
|
|
79
|
-
_shouldUseWebhookFlow() {
|
|
80
|
-
return this._isVerificationFlowEnabled() && typeof this._sendVerificationWebhook === 'function';
|
|
81
|
-
}
|
|
82
|
-
|
|
83
63
|
/**
|
|
84
64
|
*
|
|
85
|
-
* @param {MemberCreatedEvent} event
|
|
65
|
+
* @param {InstanceType<typeof MemberCreatedEvent>} event
|
|
86
66
|
*/
|
|
87
67
|
async _handleMemberCreatedEvent(event) {
|
|
88
68
|
const source = event.data?.source;
|
|
@@ -94,25 +74,29 @@ class VerificationTrigger {
|
|
|
94
74
|
sourceThreshold = this._adminTriggerThreshold;
|
|
95
75
|
}
|
|
96
76
|
|
|
97
|
-
if (['api', 'admin'].includes(source) && isFinite(sourceThreshold)) {
|
|
77
|
+
if (['api', 'admin'].includes(source) && Number.isFinite(sourceThreshold)) {
|
|
98
78
|
const createdAt = new Date();
|
|
99
79
|
createdAt.setDate(createdAt.getDate() - 30);
|
|
100
80
|
const events = await this._eventRepository.getSignupEvents({}, {
|
|
101
|
-
source
|
|
81
|
+
source,
|
|
102
82
|
created_at: {
|
|
103
83
|
$gt: createdAt.toISOString().replace('T', ' ').substring(0, 19)
|
|
104
84
|
}
|
|
105
85
|
});
|
|
106
86
|
|
|
87
|
+
// TODO: Fix off-by-one issue in event dispatch: https://linear.app/ghost/issue/BER-3507/off-by-one-errors-in-event-query-pagination
|
|
88
|
+
const addOneForCurrentEvent = events.meta.pagination.total < events.meta.pagination.limit && events.data.length !== events.meta.pagination.total;
|
|
89
|
+
const currentImport = events.meta.pagination.total + (addOneForCurrentEvent ? 1 : 0);
|
|
90
|
+
|
|
107
91
|
const membersTotal = (await this._eventRepository.getSignupEvents({}, {
|
|
108
92
|
source: 'member'
|
|
109
93
|
})).meta.pagination.total;
|
|
110
94
|
|
|
111
95
|
const effectiveThreshold = Math.max(sourceThreshold, membersTotal);
|
|
112
96
|
|
|
113
|
-
if (
|
|
97
|
+
if (currentImport > effectiveThreshold) {
|
|
114
98
|
await this._startVerificationProcess({
|
|
115
|
-
amount:
|
|
99
|
+
amount: currentImport,
|
|
116
100
|
threshold: effectiveThreshold,
|
|
117
101
|
method: source,
|
|
118
102
|
throwOnTrigger: false,
|
|
@@ -148,24 +132,9 @@ class VerificationTrigger {
|
|
|
148
132
|
};
|
|
149
133
|
}
|
|
150
134
|
|
|
151
|
-
async _startLegacyEmailVerificationProcess({amount, triggerSource, throwOnTrigger}) {
|
|
152
|
-
// GA removal point: delete this method once webhook delivery fully replaces email escalation.
|
|
153
|
-
const verificationMessage = verificationMessageBySource[triggerSource] || messages.emailVerificationEmailMessageImport;
|
|
154
|
-
|
|
155
|
-
await this._markVerificationRequired();
|
|
156
|
-
|
|
157
|
-
await this._sendVerificationEmail({
|
|
158
|
-
message: verificationMessage,
|
|
159
|
-
subject: messages.emailVerificationEmailSubject,
|
|
160
|
-
amountTriggered: amount
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
return this._finishTrigger(throwOnTrigger);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
135
|
async getImportThreshold() {
|
|
167
136
|
const volumeThreshold = this._importTriggerThreshold;
|
|
168
|
-
if (!isFinite(volumeThreshold)) {
|
|
137
|
+
if (!Number.isFinite(volumeThreshold)) {
|
|
169
138
|
return volumeThreshold;
|
|
170
139
|
}
|
|
171
140
|
|
|
@@ -186,7 +155,7 @@ class VerificationTrigger {
|
|
|
186
155
|
}
|
|
187
156
|
|
|
188
157
|
async testImportThreshold() {
|
|
189
|
-
if (!isFinite(this._importTriggerThreshold)) {
|
|
158
|
+
if (!Number.isFinite(this._importTriggerThreshold)) {
|
|
190
159
|
// Infinite threshold, quick path
|
|
191
160
|
return;
|
|
192
161
|
}
|
|
@@ -210,16 +179,18 @@ class VerificationTrigger {
|
|
|
210
179
|
}
|
|
211
180
|
});
|
|
212
181
|
|
|
182
|
+
const currentImport = events.meta.pagination.total;
|
|
183
|
+
|
|
213
184
|
const membersTotal = (await this._eventRepository.getSignupEvents({}, {
|
|
214
185
|
source: 'member'
|
|
215
186
|
})).meta.pagination.total;
|
|
216
187
|
|
|
217
188
|
// Import threshold is either the total number of members (discounting any created by imports in
|
|
218
189
|
// the last 30 days) or the threshold defined in config, whichever is greater.
|
|
219
|
-
const importThreshold = Math.max(membersTotal -
|
|
220
|
-
if (isFinite(importThreshold) &&
|
|
190
|
+
const importThreshold = Math.max(membersTotal - currentImport, this._importTriggerThreshold);
|
|
191
|
+
if (Number.isFinite(importThreshold) && currentImport > importThreshold) {
|
|
221
192
|
await this._startVerificationProcess({
|
|
222
|
-
amount:
|
|
193
|
+
amount: currentImport,
|
|
223
194
|
threshold: importThreshold,
|
|
224
195
|
method: 'import',
|
|
225
196
|
throwOnTrigger: false,
|
|
@@ -254,36 +225,30 @@ class VerificationTrigger {
|
|
|
254
225
|
return {needsVerification: false};
|
|
255
226
|
}
|
|
256
227
|
|
|
257
|
-
// Only trigger
|
|
228
|
+
// Only trigger verification once.
|
|
258
229
|
if (this._isVerificationRequired()) {
|
|
259
230
|
return {needsVerification: false};
|
|
260
231
|
}
|
|
261
232
|
|
|
262
|
-
|
|
233
|
+
let webhookWasSent = false;
|
|
263
234
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
235
|
+
try {
|
|
236
|
+
webhookWasSent = await this._sendVerificationWebhook({
|
|
237
|
+
amountTriggered: amount,
|
|
238
|
+
threshold: threshold ?? amount,
|
|
239
|
+
method: method ?? source ?? 'import'
|
|
240
|
+
});
|
|
241
|
+
} catch (error) {
|
|
242
|
+
// `sendVerificationWebhook` already logs delivery failures.
|
|
243
|
+
return {needsVerification: false};
|
|
244
|
+
}
|
|
271
245
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
return this._finishTrigger(throwOnTrigger);
|
|
275
|
-
}
|
|
276
|
-
} catch (error) {
|
|
277
|
-
// `sendVerificationWebhook` already logs delivery failures.
|
|
278
|
-
}
|
|
246
|
+
if (!webhookWasSent) {
|
|
247
|
+
return {needsVerification: false};
|
|
279
248
|
}
|
|
280
249
|
|
|
281
|
-
|
|
282
|
-
return
|
|
283
|
-
amount,
|
|
284
|
-
triggerSource,
|
|
285
|
-
throwOnTrigger
|
|
286
|
-
});
|
|
250
|
+
await this._markVerificationRequired();
|
|
251
|
+
return this._finishTrigger(throwOnTrigger);
|
|
287
252
|
}
|
|
288
253
|
}
|
|
289
254
|
|
package/core/shared/labs.js
CHANGED
|
@@ -47,11 +47,11 @@ const PRIVATE_FEATURES = [
|
|
|
47
47
|
'emailUniqueid',
|
|
48
48
|
'themeTranslation',
|
|
49
49
|
'indexnow',
|
|
50
|
-
'verificationFlow',
|
|
51
50
|
'membersForward',
|
|
52
51
|
'welcomeEmailsDesignCustomization',
|
|
53
52
|
'pictureImageFormats',
|
|
54
|
-
'smarterCounts'
|
|
53
|
+
'smarterCounts',
|
|
54
|
+
'giftSubscriptions'
|
|
55
55
|
];
|
|
56
56
|
|
|
57
57
|
module.exports.GA_KEYS = [...GA_FEATURES];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ghost",
|
|
3
|
-
"version": "6.25.
|
|
3
|
+
"version": "6.25.1",
|
|
4
4
|
"description": "The professional publishing platform",
|
|
5
5
|
"author": "Ghost Foundation",
|
|
6
6
|
"homepage": "https://ghost.org",
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"@tryghost/helpers": "1.1.97",
|
|
89
89
|
"@tryghost/html-to-plaintext": "1.0.4",
|
|
90
90
|
"@tryghost/http-cache-utils": "0.1.20",
|
|
91
|
-
"@tryghost/i18n": "file:components/tryghost-i18n-6.25.
|
|
91
|
+
"@tryghost/i18n": "file:components/tryghost-i18n-6.25.1.tgz",
|
|
92
92
|
"@tryghost/image-transform": "1.4.13",
|
|
93
93
|
"@tryghost/job-manager": "1.0.3",
|
|
94
94
|
"@tryghost/kg-card-factory": "5.1.13",
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"@tryghost/mw-vhost": "1.0.1",
|
|
111
111
|
"@tryghost/nodemailer": "0.3.48",
|
|
112
112
|
"@tryghost/nql": "0.12.10",
|
|
113
|
-
"@tryghost/parse-email-address": "file:components/tryghost-parse-email-address-6.25.
|
|
113
|
+
"@tryghost/parse-email-address": "file:components/tryghost-parse-email-address-6.25.1.tgz",
|
|
114
114
|
"@tryghost/pretty-cli": "1.2.47",
|
|
115
115
|
"@tryghost/prometheus-metrics": "1.0.2",
|
|
116
116
|
"@tryghost/promise": "0.3.15",
|
|
@@ -275,8 +275,8 @@
|
|
|
275
275
|
"jackspeak": "2.3.6",
|
|
276
276
|
"moment": "2.24.0",
|
|
277
277
|
"moment-timezone": "0.5.45",
|
|
278
|
-
"@tryghost/i18n": "file:components/tryghost-i18n-6.25.
|
|
279
|
-
"@tryghost/parse-email-address": "file:components/tryghost-parse-email-address-6.25.
|
|
278
|
+
"@tryghost/i18n": "file:components/tryghost-i18n-6.25.1.tgz",
|
|
279
|
+
"@tryghost/parse-email-address": "file:components/tryghost-parse-email-address-6.25.1.tgz"
|
|
280
280
|
},
|
|
281
281
|
"nx": {
|
|
282
282
|
"targets": {
|