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.
Files changed (180) hide show
  1. package/components/tryghost-i18n-6.25.1.tgz +0 -0
  2. package/components/{tryghost-parse-email-address-6.25.0.tgz → tryghost-parse-email-address-6.25.1.tgz} +0 -0
  3. package/core/built/admin/assets/{PolarAngleAxis-BNo3yZOE.js → PolarAngleAxis-C6ZeSpZB.js} +1 -1
  4. package/core/built/admin/assets/{_baseAssignValue-DwWJd_kU.js → _baseAssignValue-BKAl5FrV.js} +1 -1
  5. package/core/built/admin/assets/{a-large-small-DzN0AB7t.js → a-large-small-B_ulQCIs.js} +1 -1
  6. package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
  7. package/core/built/admin/assets/admin-x-settings/{code-editor-view-De3K_osj.mjs → code-editor-view-CBYT1gA1.mjs} +2 -2
  8. package/core/built/admin/assets/admin-x-settings/{index-bGxDzD13.mjs → index-CN5CixaU.mjs} +2 -2
  9. package/core/built/admin/assets/admin-x-settings/{index-5D8KqsFU.mjs → index-CPQODntW.mjs} +2 -2
  10. package/core/built/admin/assets/admin-x-settings/{index-BIUDn7ot.mjs → index-CgTfOd7g.mjs} +9 -9
  11. package/core/built/admin/assets/admin-x-settings/{modals-DuokUyAH.mjs → modals-_y-6HROx.mjs} +2 -2
  12. package/core/built/admin/assets/{at-sign-vqoOA4VZ.js → at-sign-B8xWKM0y.js} +1 -1
  13. package/core/built/admin/assets/{audience-CFjVlFTu.js → audience-CBOR--z9.js} +1 -1
  14. package/core/built/admin/assets/{avatar-flipboard-DuTJ0ty5.js → avatar-flipboard-IipGb_wZ.js} +1 -1
  15. package/core/built/admin/assets/{bluesky-sharing-C1WkXrRJ.js → bluesky-sharing-CkI1QuAm.js} +1 -1
  16. package/core/built/admin/assets/{chart-Bs2L1q8g.js → chart-_slUcr-K.js} +1 -1
  17. package/core/built/admin/assets/{chunk.524.ed5714f505e821e549f3.js → chunk.524.5b9b463506a16221fc91.js} +6 -6
  18. package/core/built/admin/assets/{chunk.582.639cecaca9e77bd7dd4f.js → chunk.582.d8eae1661d753befaefd.js} +7 -7
  19. package/core/built/admin/assets/{chunk.603.5cb992da88800a9388f3.js → chunk.630.3dbb0231a2d871126a80.js} +4 -4
  20. package/core/built/admin/assets/{code-editor-view-DIH4grxv.js → code-editor-view-BWMqr2JV.js} +1 -1
  21. package/core/built/admin/assets/comments-BeoA0nfK.js +1 -0
  22. package/core/built/admin/assets/{content-helpers-Cr_DHEOl.js → content-helpers-CmTGdEmL.js} +1 -1
  23. package/core/built/admin/assets/{copy-w3c9zkaZ.js → copy-CDHcAPJw.js} +1 -1
  24. package/core/built/admin/assets/{data-list-D-K_XfF3.js → data-list-Crb1ffbp.js} +1 -1
  25. package/core/built/admin/assets/{deleted-feed-item-DK47iaMV.js → deleted-feed-item-DBW0zJQg.js} +1 -1
  26. package/core/built/admin/assets/{dropzone-BHWXAN0m.js → dropzone-B9JUsQlW.js} +3 -3
  27. package/core/built/admin/assets/{edit-profile-DCyHhZgx.js → edit-profile-Dz-IhetN.js} +1 -1
  28. package/core/built/admin/assets/{empty-indicator-DjmACVr2.js → empty-indicator-2QGnEbtY.js} +1 -1
  29. package/core/built/admin/assets/{en-Cl0b7CNW.js → en-BRQS1Z8j.js} +1 -1
  30. package/core/built/admin/assets/{feed-C5AauoXf.js → feed-T3kW9UJA.js} +1 -1
  31. package/core/built/admin/assets/filters-ChOMQQZW.js +1 -0
  32. package/core/built/admin/assets/{gh-chart-xjwu2HZo.js → gh-chart-fuWw60Ka.js} +1 -1
  33. package/core/built/admin/assets/{growth-DDyypj0q.js → growth-D9sCnmon.js} +1 -1
  34. package/core/built/admin/assets/{hash-Bowe71Lt.js → hash-CI1pQ1UC.js} +1 -1
  35. package/core/built/admin/assets/header-OevT95FI.js +1 -0
  36. package/core/built/admin/assets/{inbox-DS4qMjUb.js → inbox-DYY8-M1K.js} +1 -1
  37. package/core/built/admin/assets/{index-A6WmqYr6.js → index-8CZdLQzu.js} +1 -1
  38. package/core/built/admin/assets/{index-6Ag8SK_E.js → index-BDAOs7pI.js} +1 -1
  39. package/core/built/admin/assets/{index-B_XhekWb.js → index-BEEgMX-_.js} +1 -1
  40. package/core/built/admin/assets/index-BbveDn8H.css +1 -0
  41. package/core/built/admin/assets/{index-CfpTfwls.js → index-C-Cpbee5.js} +1 -1
  42. package/core/built/admin/assets/{index-4xuWCs9h.js → index-CCF2RKxR.js} +12 -12
  43. package/core/built/admin/assets/{index-JMWMnGGt.js → index-CEnfjH5h.js} +3 -3
  44. package/core/built/admin/assets/{index-N61Xkr32.js → index-CcFVbffG.js} +1 -1
  45. package/core/built/admin/assets/{index-CZK1A375.js → index-CyMlhfZJ.js} +1 -1
  46. package/core/built/admin/assets/{index-CFY2MOp4.js → index-DBZYUfjO.js} +1 -1
  47. package/core/built/admin/assets/{index-C8ssgmjI.js → index-DJa3pLmx.js} +1 -1
  48. package/core/built/admin/assets/{index-SDMWxO5r.js → index-DVqmhe-L.js} +1 -1
  49. package/core/built/admin/assets/{index-BCvRITTU.js → index-DW5aEj6O.js} +2 -2
  50. package/core/built/admin/assets/{index-CVvW6Q-y.js → index-DcFgRUSN.js} +1 -1
  51. package/core/built/admin/assets/{index-DX6vaEVx.js → index-DjgsxHeB.js} +1 -1
  52. package/core/built/admin/assets/{index-B8XuCPIT.js → index-mqQc8MVd.js} +1 -1
  53. package/core/built/admin/assets/{index-DqlHFtZD.js → index-qQZsxgFE.js} +1 -1
  54. package/core/built/admin/assets/{koenig-lexical-DL3I-AcK.js → koenig-lexical-CsbE6fpi.js} +1 -1
  55. package/core/built/admin/assets/kpis-Dw04ruBN.js +1 -0
  56. package/core/built/admin/assets/{label-DBwnwMrX.js → label-tBvn89sm.js} +1 -1
  57. package/core/built/admin/assets/{links-CnjcW0lg.js → links-Do4jcjIh.js} +1 -1
  58. package/core/built/admin/assets/{loader-circle-CGDGFypO.js → loader-circle-C8exRUku.js} +4 -4
  59. package/core/built/admin/assets/{lucide-react-BfVLf4Hw.js → lucide-react-4VO5Dwow.js} +1 -1
  60. package/core/built/admin/assets/{main-layout-C_UH037j.js → main-layout-BAqXRgAx.js} +1 -1
  61. package/core/built/admin/assets/{member-route-CKuE9uDU.js → member-route-D4n-RbQd.js} +1 -1
  62. package/core/built/admin/assets/members-DRLgwCgJ.js +15 -0
  63. package/core/built/admin/assets/{message-square-text-BDJyLbG2.js → message-square-text-CC_1bY-Q.js} +5 -5
  64. package/core/built/admin/assets/{minus-BM0xhFIQ.js → minus-DSyx9DCe.js} +1 -1
  65. package/core/built/admin/assets/{modals-B6ZySU0x.js → modals-AryZr_DA.js} +1 -1
  66. package/core/built/admin/assets/{moderation-CQMIGpv1.js → moderation-DwKm9LO-.js} +1 -1
  67. package/core/built/admin/assets/{newsletter-Dexg7vU8.js → newsletter-C0rydPGS.js} +1 -1
  68. package/core/built/admin/assets/{newsletters-CT4k07rm.js → newsletters-DKdmxfDG.js} +1 -1
  69. package/core/built/admin/assets/{note-CiemurXq.js → note-996Zos9G.js} +1 -1
  70. package/core/built/admin/assets/{overview-9TwqfzGq.js → overview-r17hlWAB.js} +1 -1
  71. package/core/built/admin/assets/{pagemenu-Dq744OgH.js → pagemenu-DzpB1AkZ.js} +17 -17
  72. package/core/built/admin/assets/{post-analytics-CcRhLDKA.js → post-analytics-AwufPVFE.js} +1 -1
  73. package/core/built/admin/assets/{post-analytics-context-COgn3d86.js → post-analytics-context-GFe0lMc-.js} +1 -1
  74. package/core/built/admin/assets/{post-analytics-header-DtBp2QSX.js → post-analytics-header-DmGyNvP9.js} +1 -1
  75. package/core/built/admin/assets/{post-share-modal-BlOEKX3-.js → post-share-modal-CTpdCS2X.js} +1 -1
  76. package/core/built/admin/assets/posts/{comments-C4rwkXWy.mjs → comments-Cvt31uBs.mjs} +32 -31
  77. package/core/built/admin/assets/posts/{dialog-Chkt119L.mjs → dialog-DaViJlnd.mjs} +3 -3
  78. package/core/built/admin/assets/posts/{dropdown-menu-CvSs_ay2.mjs → dropdown-menu-B4KGMiRI.mjs} +5 -5
  79. package/core/built/admin/assets/posts/{empty-indicator-GyeO28CG.mjs → empty-indicator-BaD6pCXM.mjs} +2 -2
  80. package/core/built/admin/assets/posts/{filters-BD3A2GlB.mjs → filters-BsCI4RJg.mjs} +11 -7
  81. package/core/built/admin/assets/posts/{get-site-timezone-Baeue4hE.mjs → get-site-timezone-Bo-iI2bI.mjs} +2 -2
  82. package/core/built/admin/assets/posts/{growth-kmVbKjBt.mjs → growth-BJxIDp2o.mjs} +14 -14
  83. package/core/built/admin/assets/posts/header-7zhnErbb.mjs +100 -0
  84. package/core/built/admin/assets/posts/{heading-DV_WQJh4.mjs → heading-BCDx_eVF.mjs} +2 -2
  85. package/core/built/admin/assets/posts/{hooks-DQhsid0U.mjs → hooks-DQL2O_El.mjs} +2 -2
  86. package/core/built/admin/assets/posts/{index-CVum5OE6.mjs → index-0mEgtljt.mjs} +3 -3
  87. package/core/built/admin/assets/posts/{index-Bl1ReYmV.mjs → index-BTzJVQ6S.mjs} +10 -10
  88. package/core/built/admin/assets/posts/{input-C7qFEkmt.mjs → input-DaHXv92f.mjs} +2 -2
  89. package/core/built/admin/assets/posts/{kpis-DteuJY-D.mjs → kpis-GRsx6fPV.mjs} +10 -10
  90. package/core/built/admin/assets/posts/{links-eoZr0T0x.mjs → links-B1q_pqE9.mjs} +4 -4
  91. package/core/built/admin/assets/posts/{loading-indicator-Dj1SCL40.mjs → loading-indicator-DiYqXomj.mjs} +3 -3
  92. package/core/built/admin/assets/posts/{main-layout-Ct-TA0TH.mjs → main-layout-DeqPTJTe.mjs} +2 -2
  93. package/core/built/admin/assets/posts/{members-BY9oPKo4.mjs → members-LABk5yI5.mjs} +3055 -2831
  94. package/core/built/admin/assets/posts/{newsletter-BR1tln6E.mjs → newsletter-C_nbHBaP.mjs} +15 -15
  95. package/core/built/admin/assets/posts/{overview-j1ANMAQ2.mjs → overview-AJnKv4Ze.mjs} +16 -16
  96. package/core/built/admin/assets/posts/{post-analytics-DnG-Rolr.mjs → post-analytics-b_CKsePp.mjs} +6 -6
  97. package/core/built/admin/assets/posts/{post-analytics-context-hiKFF4yE.mjs → post-analytics-context-D6jtpxxm.mjs} +5 -5
  98. package/core/built/admin/assets/posts/{post-analytics-header-OqAJ8SUL.mjs → post-analytics-header-R5UF_tF0.mjs} +11 -11
  99. package/core/built/admin/assets/posts/{post-share-modal-BWfujDu2.mjs → post-share-modal-y4BEOajk.mjs} +4 -4
  100. package/core/built/admin/assets/posts/{posts-CS9tqSJC.mjs → posts-C2hNrf1c.mjs} +2 -2
  101. package/core/built/admin/assets/posts/posts.js +1 -1
  102. package/core/built/admin/assets/posts/{reply-CX_EQh9X.mjs → reply-2Uvi3Kxb.mjs} +2 -2
  103. package/core/built/admin/assets/posts/{search-BqzdnPQb.mjs → search-se7meOnL.mjs} +2 -2
  104. package/core/built/admin/assets/posts/{select-CD5WLIrZ.mjs → select-DpUpauFg.mjs} +8 -8
  105. package/core/built/admin/assets/posts/{separator-DFPLsWCc.mjs → separator-CdBM46dw.mjs} +3 -3
  106. package/core/built/admin/assets/posts/{settings-lnEt3Kb-.mjs → settings-Chhj9xKP.mjs} +2 -2
  107. package/core/built/admin/assets/posts/{sheet-CkLfUqdH.mjs → sheet--k3SiDko.mjs} +3 -3
  108. package/core/built/admin/assets/posts/{skeleton-BZCi-IYy.mjs → skeleton-CUSLSLoY.mjs} +3 -3
  109. package/core/built/admin/assets/posts/{source-icon-C0k2hDC_.mjs → source-icon-BjYUIoXN.mjs} +3 -3
  110. package/core/built/admin/assets/posts/{stats-AHbSTqzG.mjs → stats-BRdXKaxM.mjs} +4 -4
  111. package/core/built/admin/assets/posts/{table-DMrf6wp5.mjs → table-Bgi_UcfL.mjs} +2 -2
  112. package/core/built/admin/assets/posts/{tabs-BH8GNJCe.mjs → tabs-DT8Bh72E.mjs} +14 -14
  113. package/core/built/admin/assets/posts/{tags-C5VV8Gd0.mjs → tags-BCFLnZYl.mjs} +61 -60
  114. package/core/built/admin/assets/posts/{tags-DucujdYI.mjs → tags-Kv2q0o3p.mjs} +2 -2
  115. package/core/built/admin/assets/posts/{use-scroll-restoration-C7A3TpAz.mjs → use-scroll-restoration-CLAUAal3.mjs} +6 -6
  116. package/core/built/admin/assets/posts/{virtual-list-window-BIGoc0th.mjs → virtual-list-window-CQDEqNBL.mjs} +180 -274
  117. package/core/built/admin/assets/posts/{web-DczNailO.mjs → web-CqN0MQU6.mjs} +18 -18
  118. package/core/built/admin/assets/{posts-Dr3u9yOp.js → posts-GvXDuhVG.js} +1 -1
  119. package/core/built/admin/assets/{referrers-6As_USul.js → referrers-Bd9pW-WX.js} +1 -1
  120. package/core/built/admin/assets/{repeat-D-Ki-Cg5.js → repeat-y6HlMgGO.js} +2 -2
  121. package/core/built/admin/assets/{reply-C4V0xZ2U.js → reply-Cc8ryI5v.js} +2 -2
  122. package/core/built/admin/assets/{select-Dt579MbD.js → select-CGr_5qad.js} +1 -1
  123. package/core/built/admin/assets/{settings-BMsoTszq.js → settings-BPsfSgg3.js} +1 -1
  124. package/core/built/admin/assets/{settings-Ck1Hqs1x.js → settings-BTd0Adha.js} +4 -4
  125. package/core/built/admin/assets/{sort-button-Bn325H3y.js → sort-button-k76_5HR2.js} +1 -1
  126. package/core/built/admin/assets/{source-icon-CNqsYZeA.js → source-icon-DMt0UskC.js} +1 -1
  127. package/core/built/admin/assets/{sprout-C9DbfYGe.js → sprout-Td9eaOoY.js} +2 -2
  128. package/core/built/admin/assets/{square-CWrI0H4v.js → square-Df8vEYlG.js} +1 -1
  129. package/core/built/admin/assets/stats/{audience-DBW5Xu1c.mjs → audience-DMTObpL8.mjs} +3 -3
  130. package/core/built/admin/assets/stats/{content-helpers-BR6DcWwH.mjs → content-helpers-ReMp9KJN.mjs} +4 -4
  131. package/core/built/admin/assets/stats/{index-CFvGHbAV.mjs → index-6L-yLKFX.mjs} +8 -8
  132. package/core/built/admin/assets/stats/{index-BuS4r1cs.mjs → index-CIUyjeP-.mjs} +5 -5
  133. package/core/built/admin/assets/stats/{index-DKS4mzS-.mjs → index-CMSDpQm3.mjs} +11 -7
  134. package/core/built/admin/assets/stats/{index-ZjicrvMA.mjs → index-Ca-_KJzy.mjs} +5 -5
  135. package/core/built/admin/assets/stats/{index-TeAxlGlY.mjs → index-CfO5yPSP.mjs} +5 -5
  136. package/core/built/admin/assets/stats/{sort-button-DbwzvVKL.mjs → sort-button-BB_M2CdZ.mjs} +3 -3
  137. package/core/built/admin/assets/stats/{stats-BatzfgdA.mjs → stats-B2nnuLeU.mjs} +2 -2
  138. package/core/built/admin/assets/stats/stats.js +1 -1
  139. package/core/built/admin/assets/stats/{tabs-B32ptD5t.mjs → tabs-DjJG-d3O.mjs} +3 -3
  140. package/core/built/admin/assets/stats/{use-growth-stats-DmTT2gKd.mjs → use-growth-stats-BMT5M7l6.mjs} +3 -3
  141. package/core/built/admin/assets/{stats-G4Ge9ETb.js → stats-Bs9ZbmXX.js} +1 -1
  142. package/core/built/admin/assets/{stats-view-Bx3oDAIW.js → stats-view-BWoPuaLz.js} +1 -1
  143. package/core/built/admin/assets/{step-1-y3anLU0g.js → step-1-BUvsuCs0.js} +1 -1
  144. package/core/built/admin/assets/{step-2-Dr1lGnHU.js → step-2-DI9ekXls.js} +1 -1
  145. package/core/built/admin/assets/{step-3-C_d2hvMs.js → step-3-DzT_XhaS.js} +2 -2
  146. package/core/built/admin/assets/{table-CbN_vbUx.js → table-BKqaEGAm.js} +1 -1
  147. package/core/built/admin/assets/{tabs-DFJzY5np.js → tabs-G6Ql8vbf.js} +1 -1
  148. package/core/built/admin/assets/tags-BHm-dlBs.js +1 -0
  149. package/core/built/admin/assets/{tags-Ddg8oG2Y.js → tags-_taMP0sJ.js} +1 -1
  150. package/core/built/admin/assets/{textarea-DikWsYMt.js → textarea-DcVuGYYq.js} +1 -1
  151. package/core/built/admin/assets/{tiers-B7qV_8mO.js → tiers-kv-xBoqQ.js} +1 -1
  152. package/core/built/admin/assets/{toggle-group-tXaaTD7P.js → toggle-group-DsatLdt7.js} +1 -1
  153. package/core/built/admin/assets/{topic-filter-bQtscKE6.js → topic-filter-DkJyIuAf.js} +1 -1
  154. package/core/built/admin/assets/{trash--VS50LgS.js → trash-BeZZgbn-.js} +1 -1
  155. package/core/built/admin/assets/{upload-Dz-DI9rQ.js → upload-BG7KNIn7.js} +4 -4
  156. package/core/built/admin/assets/{use-growth-stats-DNVioFUq.js → use-growth-stats-CNGdl44N.js} +1 -1
  157. package/core/built/admin/assets/{use-scroll-restoration-CxWEiCuS.js → use-scroll-restoration-CQ3w0W98.js} +1 -1
  158. package/core/built/admin/assets/{use-simple-pagination-BA6xsVQO.js → use-simple-pagination-BeIJ_5Vv.js} +1 -1
  159. package/core/built/admin/assets/{user-plus-B0tpOnLM.js → user-plus-CMxR50-Y.js} +1 -1
  160. package/core/built/admin/assets/{user-round-check-caJYm0bB.js → user-round-check-2nhPmqP3.js} +1 -1
  161. package/core/built/admin/assets/virtual-list-window-Uq8oKYVG.js +4 -0
  162. package/core/built/admin/assets/{wallet-cards-DBM65lA_.js → wallet-cards-CJcVzH0D.js} +1 -1
  163. package/core/built/admin/assets/{web-CSXixG1S.js → web-BPwTFKrc.js} +1 -1
  164. package/core/built/admin/index.html +5 -5
  165. package/core/server/services/members/service.js +0 -22
  166. package/core/server/services/verification/verification-webhook-service.js +2 -2
  167. package/core/server/services/verification/verification-webhook-service.ts +2 -2
  168. package/core/server/services/verification-trigger.js +34 -69
  169. package/core/shared/labs.js +2 -2
  170. package/package.json +5 -5
  171. package/tsconfig.tsbuildinfo +1 -1
  172. package/components/tryghost-i18n-6.25.0.tgz +0 -0
  173. package/core/built/admin/assets/comments-gAnA10dK.js +0 -1
  174. package/core/built/admin/assets/filters-DzSJ1ez3.js +0 -1
  175. package/core/built/admin/assets/index-Chp0ODAU.css +0 -1
  176. package/core/built/admin/assets/kpis-Bm-hIEkf.js +0 -1
  177. package/core/built/admin/assets/members-CzztojNk.js +0 -15
  178. package/core/built/admin/assets/tags-D5g9tXZU.js +0 -1
  179. package/core/built/admin/assets/virtual-list-window-JdKgHS9L.js +0 -4
  180. 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 with you by email to review your account make sure everything is configured correctly so you're ready to go.`,
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._isVerificationFlowEnabled = isVerificationFlowEnabled || (() => false);
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: 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 (events.meta.pagination.total > effectiveThreshold) {
97
+ if (currentImport > effectiveThreshold) {
114
98
  await this._startVerificationProcess({
115
- amount: events.meta.pagination.total,
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 - events.meta.pagination.total, this._importTriggerThreshold);
220
- if (isFinite(importThreshold) && events.meta.pagination.total > importThreshold) {
190
+ const importThreshold = Math.max(membersTotal - currentImport, this._importTriggerThreshold);
191
+ if (Number.isFinite(importThreshold) && currentImport > importThreshold) {
221
192
  await this._startVerificationProcess({
222
- amount: events.meta.pagination.total,
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 flag change and escalation notification the first time
228
+ // Only trigger verification once.
258
229
  if (this._isVerificationRequired()) {
259
230
  return {needsVerification: false};
260
231
  }
261
232
 
262
- const triggerSource = method ?? source ?? 'import';
233
+ let webhookWasSent = false;
263
234
 
264
- if (this._shouldUseWebhookFlow()) {
265
- try {
266
- const webhookWasSent = await this._sendVerificationWebhook({
267
- amountTriggered: amount,
268
- threshold: threshold ?? amount,
269
- method: triggerSource
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
- if (webhookWasSent) {
273
- await this._markVerificationRequired();
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
- // Default email flow — used unless the webhook flow is enabled and succeeds.
282
- return await this._startLegacyEmailVerificationProcess({
283
- amount,
284
- triggerSource,
285
- throwOnTrigger
286
- });
250
+ await this._markVerificationRequired();
251
+ return this._finishTrigger(throwOnTrigger);
287
252
  }
288
253
  }
289
254
 
@@ -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.0",
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.0.tgz",
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.0.tgz",
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.0.tgz",
279
- "@tryghost/parse-email-address": "file:components/tryghost-parse-email-address-6.25.0.tgz"
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": {