ghost 5.130.2 → 6.0.0-alpha.2

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 (281) hide show
  1. package/components/tryghost-i18n-6.0.0-alpha.2.tgz +0 -0
  2. package/core/boot.js +0 -2
  3. package/core/built/admin/assets/admin-x-activitypub/admin-x-activitypub.js +1 -1
  4. package/core/built/admin/assets/admin-x-activitypub/{index-B8te98RZ.mjs → index-BZDwG-OG.mjs} +7397 -7385
  5. package/core/built/admin/assets/admin-x-activitypub/{index-C8qwgKWF.mjs → index-DTlSQCGz.mjs} +2 -2
  6. package/core/built/admin/assets/admin-x-settings/{CodeEditorView-CAtv7MlN.mjs → CodeEditorView-CCUvrZhe.mjs} +2 -2
  7. package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +3 -3
  8. package/core/built/admin/assets/admin-x-settings/{index-BVxh86CD.mjs → index-Cubs_8W6.mjs} +8088 -8532
  9. package/core/built/admin/assets/admin-x-settings/{index-DUhmXSBR.mjs → index-D0ejKdD5.mjs} +2 -2
  10. package/core/built/admin/assets/admin-x-settings/{modals-B5dtfzsB.mjs → modals-DSxs9dLy.mjs} +1676 -1614
  11. package/core/built/admin/assets/{chunk.524.1f2faf572078e5b86b09.js → chunk.524.0953dd72ae1efbabe0de.js} +7 -7
  12. package/core/built/admin/assets/{chunk.582.675905fe8f9be138fb19.js → chunk.582.3caa825c2a91efc48f1d.js} +8 -8
  13. package/core/built/admin/assets/{ghost-280b83af263b51bc4d6ce5bd8f536096.js → ghost-db0f84981913aec8a672c57aa22da07a.js} +40 -45
  14. package/core/built/admin/assets/posts/posts.js +6549 -6537
  15. package/core/built/admin/assets/stats/stats.js +8824 -8812
  16. package/core/built/admin/index.html +3 -3
  17. package/core/frontend/helpers/get.js +4 -2
  18. package/core/frontend/helpers/ghost_head.js +71 -77
  19. package/core/frontend/meta/canonical-url.js +1 -7
  20. package/core/frontend/meta/context-object.js +1 -1
  21. package/core/frontend/meta/get-meta.js +1 -4
  22. package/core/frontend/meta/og-image.js +1 -1
  23. package/core/frontend/meta/og-type.js +0 -2
  24. package/core/frontend/meta/schema.js +1 -1
  25. package/core/frontend/meta/twitter-image.js +1 -1
  26. package/core/frontend/meta/url.js +1 -12
  27. package/core/frontend/services/rendering/context.js +0 -8
  28. package/core/frontend/web/middleware/static-theme.js +20 -1
  29. package/core/server/api/endpoints/index.js +0 -4
  30. package/core/server/api/endpoints/session.js +0 -9
  31. package/core/server/api/endpoints/utils/serializers/input/settings.js +0 -2
  32. package/core/server/api/endpoints/utils/serializers/input/utils/settings-filter-type-group-mapper.js +0 -1
  33. package/core/server/api/endpoints/utils/serializers/input/utils/settings-key-group-mapper.js +0 -1
  34. package/core/server/api/endpoints/utils/serializers/input/utils/settings-key-type-mapper.js +0 -1
  35. package/core/server/api/endpoints/utils/serializers/output/all.js +1 -1
  36. package/core/server/api/endpoints/utils/serializers/output/index.js +0 -4
  37. package/core/server/api/endpoints/utils/serializers/output/mappers/snippets.js +1 -5
  38. package/core/server/api/endpoints/utils/serializers/output/members.js +0 -2
  39. package/core/server/api/endpoints/utils/validators/input/index.js +0 -4
  40. package/core/server/data/importer/importers/data/Base.js +1 -3
  41. package/core/server/data/importer/importers/data/SettingsImporter.js +1 -3
  42. package/core/server/data/migrations/utils/index.js +1 -4
  43. package/core/server/data/migrations/utils/permissions.js +14 -6
  44. package/core/server/data/migrations/utils/settings.js +39 -22
  45. package/core/server/data/migrations/versions/4.47/2022-05-03-15-30-final-v4.js +2 -0
  46. package/core/server/data/migrations/versions/4.47/2022-05-04-10-03-no-op.js +6 -0
  47. package/core/server/data/migrations/versions/5.100/2024-11-06-04-45-15-add-activitypub-integration.js +4 -2
  48. package/core/server/data/migrations/versions/5.113/2025-03-07-12-24-00-add-super-editor.js +4 -2
  49. package/core/server/data/migrations/versions/5.3/2022-07-06-07-58-add-ghost-explore-integration-role.js +4 -2
  50. package/core/server/data/migrations/versions/5.3/2022-07-06-09-17-add-ghost-explore-integration.js +4 -2
  51. package/core/server/data/migrations/versions/5.3/2022-07-06-09-26-add-ghost-explore-integration-api-key.js +4 -2
  52. package/core/server/data/migrations/versions/5.40/2023-03-21-18-42-add-self-serve-integration-role.js +4 -2
  53. package/core/server/data/migrations/versions/5.40/2023-03-21-18-52-add-self-serve-integration.js +4 -2
  54. package/core/server/data/migrations/versions/5.40/2023-03-21-19-02-add-self-serve-integration-api-key.js +4 -2
  55. package/core/server/data/migrations/versions/5.63/2023-09-13-13-03-10-add-ghost-core-content-integration.js +4 -2
  56. package/core/server/data/migrations/versions/5.63/2023-09-13-13-34-11-add-ghost-core-content-integration-key.js +4 -2
  57. package/core/server/data/migrations/versions/6.0/2025-06-20-01-41-54-remove-updated-by-column.js +46 -0
  58. package/core/server/data/migrations/versions/6.0/2025-06-20-13-41-55-remove-created-by-column.js +47 -0
  59. package/core/server/data/migrations/versions/6.0/2025-06-23-09-49-25-add-missing-member-uuids.js +22 -0
  60. package/core/server/data/migrations/versions/6.0/2025-06-23-10-03-26-members-nullable-uuid.js +5 -0
  61. package/core/server/data/migrations/versions/6.0/2025-06-24-09-19-42-use-object-id-for-hardcoded-user-id.js +95 -0
  62. package/core/server/data/migrations/versions/6.0/2025-06-25-15-03-29-remove-amp-from-settings.js +6 -0
  63. package/core/server/data/migrations/versions/6.0/2025-06-30-13-59-10-remove-mail-events-table.js +3 -0
  64. package/core/server/data/migrations/versions/6.0/2025-06-30-14-00-00-update-feature-image-alt-length.js +25 -0
  65. package/core/server/data/schema/default-settings/default-settings.json +0 -13
  66. package/core/server/data/schema/fixtures/FixtureManager.js +128 -5
  67. package/core/server/data/schema/fixtures/fixtures.json +4 -6
  68. package/core/server/data/schema/fixtures/index.js +3 -1
  69. package/core/server/data/schema/schema.js +20 -65
  70. package/core/server/data/seeders/DataGenerator.js +11 -2
  71. package/core/server/data/seeders/importers/EmailsImporter.js +1 -3
  72. package/core/server/data/seeders/importers/LabelsImporter.js +1 -3
  73. package/core/server/data/seeders/importers/MembersImporter.js +0 -1
  74. package/core/server/data/seeders/importers/MembersStripeCustomersImporter.js +1 -2
  75. package/core/server/data/seeders/importers/MembersStripeCustomersSubscriptionsImporter.js +0 -1
  76. package/core/server/data/seeders/importers/PostsImporter.js +0 -1
  77. package/core/server/data/seeders/importers/RolesUsersImporter.js +6 -1
  78. package/core/server/data/seeders/importers/TagsImporter.js +1 -2
  79. package/core/server/data/seeders/importers/UsersImporter.js +1 -2
  80. package/core/server/data/tinybird/ARCHITECTURE.md +0 -4
  81. package/core/server/data/tinybird/DOCS.md +0 -4
  82. package/core/server/models/base/bookshelf.js +8 -1
  83. package/core/server/models/base/plugins/events.js +0 -28
  84. package/core/server/models/base/plugins/user-type.js +10 -36
  85. package/core/server/models/post.js +25 -10
  86. package/core/server/models/relations/authors.js +2 -2
  87. package/core/server/models/settings.js +1 -14
  88. package/core/server/models/user.js +33 -6
  89. package/core/server/services/activitypub/ActivityPubService.js +1 -2
  90. package/core/server/services/activitypub/ActivityPubService.ts +1 -2
  91. package/core/server/services/explore-ping/ExplorePingService.js +3 -1
  92. package/core/server/services/link-redirection/README.md +1 -1
  93. package/core/server/services/mentions/MentionSendingService.js +1 -1
  94. package/core/server/services/settings/SettingsBREADService.js +5 -1
  95. package/core/server/services/settings/settings-service.js +3 -1
  96. package/core/server/services/settings-helpers/SettingsHelpers.js +0 -12
  97. package/core/server/services/update-check/UpdateCheckService.js +18 -2
  98. package/core/server/services/url/config.js +0 -2
  99. package/core/server/web/api/app.js +4 -0
  100. package/core/server/web/api/endpoints/admin/middleware.js +8 -9
  101. package/core/server/web/api/endpoints/admin/routes.js +0 -2
  102. package/core/server/web/comments/routes.js +3 -0
  103. package/core/server/web/shared/middleware/index.js +4 -0
  104. package/core/server/web/shared/middleware/max-limit-cap.js +27 -0
  105. package/core/server/web/shared/middleware/pretty-urls.js +3 -1
  106. package/core/server/web/shared/middleware/redirect-amp-urls.js +36 -0
  107. package/core/shared/config/defaults.json +2 -0
  108. package/core/shared/config/overrides.json +1 -4
  109. package/core/shared/labs.js +2 -6
  110. package/core/shared/max-limit-cap.js +61 -0
  111. package/package.json +5 -6
  112. package/tsconfig.tsbuildinfo +1 -1
  113. package/yarn.lock +18 -107
  114. package/components/tryghost-i18n-5.130.2.tgz +0 -0
  115. package/core/built/admin/assets/img/amp-d7b72aae3315fda95921fb575dfca100.svg +0 -4
  116. package/core/frontend/apps/amp/index.js +0 -30
  117. package/core/frontend/apps/amp/lib/helpers/amp_analytics.js +0 -32
  118. package/core/frontend/apps/amp/lib/helpers/amp_components.js +0 -48
  119. package/core/frontend/apps/amp/lib/helpers/amp_content.js +0 -214
  120. package/core/frontend/apps/amp/lib/helpers/amp_style.js +0 -8
  121. package/core/frontend/apps/amp/lib/router.js +0 -95
  122. package/core/frontend/apps/amp/lib/views/amp.hbs +0 -1046
  123. package/core/frontend/meta/amp-url.js +0 -14
  124. package/core/server/api/endpoints/mail-events.js +0 -17
  125. package/core/server/api/endpoints/utils/serializers/output/mail-events.js +0 -9
  126. package/core/server/api/endpoints/utils/validators/input/mail-events.js +0 -7
  127. package/core/server/data/migrations/utils/constants.js +0 -3
  128. package/core/server/data/migrations/versions/4.0/01-update-mobiledoc.js +0 -61
  129. package/core/server/data/migrations/versions/4.0/02-add-status-column-to-members.js +0 -11
  130. package/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js +0 -81
  131. package/core/server/data/migrations/versions/4.0/04-drop-apps-related-tables.js +0 -10
  132. package/core/server/data/migrations/versions/4.0/05-add-members-subscribe-events-table.js +0 -9
  133. package/core/server/data/migrations/versions/4.0/06-populate-members-subscribe-events-table.js +0 -53
  134. package/core/server/data/migrations/versions/4.0/07-alter-unique-constraint-for-posts-slug.js +0 -7
  135. package/core/server/data/migrations/versions/4.0/08-add-members-login-events-table.js +0 -7
  136. package/core/server/data/migrations/versions/4.0/09-add-members-email-change-events-table.js +0 -9
  137. package/core/server/data/migrations/versions/4.0/10-add-members-status-events-table.js +0 -9
  138. package/core/server/data/migrations/versions/4.0/11-add-members-paid-subscription-events-table.js +0 -12
  139. package/core/server/data/migrations/versions/4.0/12-delete-apps-related-settings-keys.js +0 -16
  140. package/core/server/data/migrations/versions/4.0/13-add-members-payment-events-table.js +0 -10
  141. package/core/server/data/migrations/versions/4.0/14-remove-orphaned-stripe-records.js +0 -36
  142. package/core/server/data/migrations/versions/4.0/15-add-frontmatter-column-to-meta.js +0 -7
  143. package/core/server/data/migrations/versions/4.0/16-refactor-slack-setting.js +0 -96
  144. package/core/server/data/migrations/versions/4.0/17-populate-members-status-events-table.js +0 -41
  145. package/core/server/data/migrations/versions/4.0/18-transform-urls-absolute-to-transform-ready.js +0 -201
  146. package/core/server/data/migrations/versions/4.0/19-remove-labs-members-setting.js +0 -10
  147. package/core/server/data/migrations/versions/4.0/20-refactor-unsplash-setting.js +0 -41
  148. package/core/server/data/migrations/versions/4.0/21-sanitize-email-batches-provider-id.js +0 -8
  149. package/core/server/data/migrations/versions/4.0/22-solve-orphaned-webhooks.js +0 -87
  150. package/core/server/data/migrations/versions/4.0/23-regenerate-posts-html.js +0 -66
  151. package/core/server/data/migrations/versions/4.0/24-add-missing-email-permissions.js +0 -36
  152. package/core/server/data/migrations/versions/4.0/25-populate-members-paid-subscription-events-table.js +0 -129
  153. package/core/server/data/migrations/versions/4.0/26-add-cascade-on-delete.js +0 -76
  154. package/core/server/data/migrations/versions/4.0/27-add-primary-key-brute-migrations-lock.js +0 -9
  155. package/core/server/data/migrations/versions/4.0/28-add-webhook-intergrations-foreign-key.js +0 -16
  156. package/core/server/data/migrations/versions/4.0/29-fix-foreign-key-for-members-stripe-customers-subscriptions.js +0 -35
  157. package/core/server/data/migrations/versions/4.0/30-set-default-accent-color.js +0 -21
  158. package/core/server/data/migrations/versions/4.1/01-fix-backup-content-permission-typo.js +0 -15
  159. package/core/server/data/migrations/versions/4.1/02-add-unique-constraint-for-member-stripe-tables.js +0 -21
  160. package/core/server/data/migrations/versions/4.11/01-add-oauth-user-data.js +0 -12
  161. package/core/server/data/migrations/versions/4.11/02-add-email-verification-required-setting.js +0 -43
  162. package/core/server/data/migrations/versions/4.12/01-add-email-only-column-to-posts-meta-table.js +0 -7
  163. package/core/server/data/migrations/versions/4.12/02-fix-member-statuses.js +0 -39
  164. package/core/server/data/migrations/versions/4.13/01-add-members-stripe-connect-auth-permission-to-administrators.js +0 -6
  165. package/core/server/data/migrations/versions/4.13/02-add-members-products-events-table.js +0 -33
  166. package/core/server/data/migrations/versions/4.14/01-fix-comped-member-statuses.js +0 -73
  167. package/core/server/data/migrations/versions/4.14/02-fix-free-members-status-events.js +0 -61
  168. package/core/server/data/migrations/versions/4.15/01-add-temp-members-analytic-events-table.js +0 -12
  169. package/core/server/data/migrations/versions/4.16/01-add-custom-theme-settings-table.js +0 -9
  170. package/core/server/data/migrations/versions/4.17/01-add-custom-theme-settings-permissions.js +0 -21
  171. package/core/server/data/migrations/versions/4.17/02-add-offers-table.js +0 -19
  172. package/core/server/data/migrations/versions/4.17/03-add-offers-permissions.js +0 -35
  173. package/core/server/data/migrations/versions/4.19/01-add-active-column-to-offers.js +0 -7
  174. package/core/server/data/migrations/versions/4.19/02-add-offer-redemptions-table.js +0 -8
  175. package/core/server/data/migrations/versions/4.2/01-fix-incorrect-mrr-delta-events.js +0 -13
  176. package/core/server/data/migrations/versions/4.20/01-remove-offer-redemptions-table.js +0 -19
  177. package/core/server/data/migrations/versions/4.20/02-remove-offers-table.js +0 -30
  178. package/core/server/data/migrations/versions/4.20/03-add-offers-table.js +0 -21
  179. package/core/server/data/migrations/versions/4.20/04-add-offer-redemptions-table.js +0 -9
  180. package/core/server/data/migrations/versions/4.20/05-remove-not-null-constraint-from-portal-title.js +0 -44
  181. package/core/server/data/migrations/versions/4.22/01-add-is-launch-complete-setting.js +0 -8
  182. package/core/server/data/migrations/versions/4.22/02-update-launch-complete-setting-from-user-data.js +0 -39
  183. package/core/server/data/migrations/versions/4.23/01-truncate-offer-names.js +0 -59
  184. package/core/server/data/migrations/versions/4.3/01-add-products-table.js +0 -9
  185. package/core/server/data/migrations/versions/4.3/02-add-members-products-table.js +0 -8
  186. package/core/server/data/migrations/versions/4.3/03-add-default-product.js +0 -39
  187. package/core/server/data/migrations/versions/4.3/04-attach-members-to-product.js +0 -50
  188. package/core/server/data/migrations/versions/4.3/05-add-stripe-products-table.js +0 -9
  189. package/core/server/data/migrations/versions/4.3/06-add-stripe-prices-table.js +0 -15
  190. package/core/server/data/migrations/versions/4.3/07-add-products-permissions.js +0 -29
  191. package/core/server/data/migrations/versions/4.3/08-migrate-members-signup-setting.js +0 -109
  192. package/core/server/data/migrations/versions/4.3/09-add-price-id-column-to-subscriptions-table.js +0 -10
  193. package/core/server/data/migrations/versions/4.3/10-populate-stripe-price-id-in-subscriptions.js +0 -20
  194. package/core/server/data/migrations/versions/4.33/2022-01-14-11-50-add-type-column-to-products.js +0 -12
  195. package/core/server/data/migrations/versions/4.33/2022-01-14-11-51-add-default-free-tier.js +0 -40
  196. package/core/server/data/migrations/versions/4.33/2022-01-18-09-07-remove-duplicate-offer-redemptions.js +0 -46
  197. package/core/server/data/migrations/versions/4.33/2022-01-19-10-43-add-active-column-to-products-table.js +0 -7
  198. package/core/server/data/migrations/versions/4.34/2022-01-25-13-53-add-welcome-page-url-column-to-products.js +0 -7
  199. package/core/server/data/migrations/versions/4.35/2022-01-20-05-55-add-post-products-table.js +0 -8
  200. package/core/server/data/migrations/versions/4.35/2022-01-30-15-17-set-welcome-page-url-from-settings.js +0 -45
  201. package/core/server/data/migrations/versions/4.35/2022-02-01-11-48-update-email-recipient-filter-column-type.js +0 -19
  202. package/core/server/data/migrations/versions/4.35/2022-02-01-12-03-update-recipient-filter-column-type.js +0 -19
  203. package/core/server/data/migrations/versions/4.35/2022-02-02-10-38-add-default-content-visibility-tiers-setting.js +0 -8
  204. package/core/server/data/migrations/versions/4.35/2022-02-02-13-10-transform-specific-tiers-default-content-visibility.js +0 -147
  205. package/core/server/data/migrations/versions/4.35/2022-02-04-04-34-populate-empty-portal-products.js +0 -60
  206. package/core/server/data/migrations/versions/4.36/2022-02-07-14-34-add-last-seen-at-column-to-members.js +0 -10
  207. package/core/server/data/migrations/versions/4.37/2022-02-21-09-53-backfill-members-last-seen-at-column.js +0 -32
  208. package/core/server/data/migrations/versions/4.38/2022-03-01-08-46-add-visibility-to-tiers.js +0 -11
  209. package/core/server/data/migrations/versions/4.38/2022-03-03-16-12-add-visibility-to-tiers.js +0 -8
  210. package/core/server/data/migrations/versions/4.38/2022-03-03-16-17-drop-tiers-visible-column.js +0 -7
  211. package/core/server/data/migrations/versions/4.39/2022-03-07-10-57-update-free-products-visibility-column.js +0 -66
  212. package/core/server/data/migrations/versions/4.39/2022-03-07-10-57-update-products-visibility-column.js +0 -36
  213. package/core/server/data/migrations/versions/4.4/01-restore-free-members-signup-setting-from-backup.js +0 -99
  214. package/core/server/data/migrations/versions/4.4/02-migrate-members-signup-access.js +0 -126
  215. package/core/server/data/migrations/versions/4.40/2022-03-07-14-37-add-members-cancel-events-table.js +0 -8
  216. package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-offers-admin-integration-permission-roles.js +0 -23
  217. package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-tiers-admin-integration-permission-roles.js +0 -20
  218. package/core/server/data/migrations/versions/4.42/2022-03-21-17-17-add.js +0 -25
  219. package/core/server/data/migrations/versions/4.42/2022-03-30-15-44-add-newsletter-permissions.js +0 -28
  220. package/core/server/data/migrations/versions/4.43/2022-03-28-19-26-recreate-newsletter-table.js +0 -29
  221. package/core/server/data/migrations/versions/4.43/2022-03-29-14-45-add-members-newsletters-table.js +0 -7
  222. package/core/server/data/migrations/versions/4.43/2022-04-01-10-13-add-post-newsletter-relation.js +0 -108
  223. package/core/server/data/migrations/versions/4.43/2022-04-06-09-47-add-type-column-to-paid-subscription-events.js +0 -7
  224. package/core/server/data/migrations/versions/4.43/2022-04-06-14-56-add-email-newsletter-relation.js +0 -8
  225. package/core/server/data/migrations/versions/4.43/2022-04-08-10-45-add-subscription-id-to-mrr-events.js +0 -7
  226. package/core/server/data/migrations/versions/4.44/2022-04-06-15-22-populate-type-column-for-paid-subscription-events.js +0 -21
  227. package/core/server/data/migrations/versions/4.44/2022-04-08-11-54-add-cancelled-events.js +0 -51
  228. package/core/server/data/migrations/versions/4.44/2022-04-11-08-24-add-newsletter-permissions.js +0 -33
  229. package/core/server/data/migrations/versions/4.44/2022-04-11-10-54-add-mrr-to-subscriptions.js +0 -8
  230. package/core/server/data/migrations/versions/4.44/2022-04-12-07-33-fill-mrr.js +0 -29
  231. package/core/server/data/migrations/versions/4.44/2022-04-13-12-00-remove-newsletter-sender-name-not-null-constraint.js +0 -33
  232. package/core/server/data/migrations/versions/4.44/2022-04-15-07-53-add-offer-id-to-subscriptions.js +0 -9
  233. package/core/server/data/migrations/versions/4.45/2022-04-19-12-23-backfill-subscriptions-offers.js +0 -60
  234. package/core/server/data/migrations/versions/4.45/2022-04-20-11-25-add-newsletter-read-permission.js +0 -9
  235. package/core/server/data/migrations/versions/4.45/2022-04-21-02-55-add-notifications-key-entry-to-settings-table.js +0 -8
  236. package/core/server/data/migrations/versions/4.46/2022-04-13-12-00-add-created-at-newsletters.js +0 -6
  237. package/core/server/data/migrations/versions/4.46/2022-04-13-12-01-add-updated-at-newsletters.js +0 -6
  238. package/core/server/data/migrations/versions/4.46/2022-04-13-12-02-fill-created-at-newsletters.js +0 -19
  239. package/core/server/data/migrations/versions/4.46/2022-04-13-12-03-drop-nullable-created-at-newsletters.js +0 -3
  240. package/core/server/data/migrations/versions/4.46/2022-04-13-12-08-newsletters-show-header-name.js +0 -7
  241. package/core/server/data/migrations/versions/4.46/2022-04-13-12-57-add-uuid-column-to-newsletters.js +0 -8
  242. package/core/server/data/migrations/versions/4.46/2022-04-13-12-58-fill-uuid-for-newsletters.js +0 -19
  243. package/core/server/data/migrations/versions/4.46/2022-04-13-12-59-drop-nullable-uuid-newsletters.js +0 -3
  244. package/core/server/data/migrations/versions/4.46/2022-04-13-13-00-add-default-newsletter.js +0 -92
  245. package/core/server/data/migrations/versions/4.46/2022-04-20-08-39-map-subscribers-to-default-newsletter.js +0 -66
  246. package/core/server/data/migrations/versions/4.46/2022-04-22-07-43-add-newsletter-id-to-subscribe-events.js +0 -9
  247. package/core/server/data/migrations/versions/4.46/2022-04-27-07-59-set-newsletter-id-subscribe-events.js +0 -31
  248. package/core/server/data/migrations/versions/4.47/2022-05-03-15-30-update-newsletter-sending-options.js +0 -34
  249. package/core/server/data/migrations/versions/4.47/2022-05-04-10-03-transform-newsletter-header-image.js +0 -26
  250. package/core/server/data/migrations/versions/4.5/01-add-stripe-price-description-column.js +0 -7
  251. package/core/server/data/migrations/versions/4.5/02-add-product-description-column.js +0 -7
  252. package/core/server/data/migrations/versions/4.5/03-give-label-read-permissions-to-editors.js +0 -14
  253. package/core/server/data/migrations/versions/4.5/04-remove-unique-constraint-from-product-name.js +0 -13
  254. package/core/server/data/migrations/versions/4.5/05-rename-default-product-to-site-title.js +0 -38
  255. package/core/server/data/migrations/versions/4.6/01-remove-comped-status.js +0 -47
  256. package/core/server/data/migrations/versions/4.7/01-add-monthly-price-column-to-products.js +0 -7
  257. package/core/server/data/migrations/versions/4.7/02-add-yearly-price-column-to-products.js +0 -7
  258. package/core/server/data/migrations/versions/4.7/03-add-labs-setting.js +0 -42
  259. package/core/server/data/migrations/versions/4.8/01-add-feature-image-alt-column-to-posts-meta.js +0 -7
  260. package/core/server/data/migrations/versions/4.8/02-add-feature-image-caption-column-to-posts-meta.js +0 -7
  261. package/core/server/data/migrations/versions/4.8/03-add-default-product-portal-products.js +0 -69
  262. package/core/server/data/migrations/versions/4.8/04-migrate-show-newsletter-header-setting.js +0 -124
  263. package/core/server/data/migrations/versions/4.9/01-add-reset-all-passwords-permission.js +0 -11
  264. package/core/server/data/migrations/versions/4.9/02-add-benefits-table.js +0 -9
  265. package/core/server/data/migrations/versions/4.9/03-add-products-benefits-table.js +0 -8
  266. package/core/server/data/migrations/versions/4.9/04-add-member-segment-to-email-batches.js +0 -7
  267. package/core/server/data/migrations/versions/4.9/05-fix-missed-mobiledoc-url-transforms.js +0 -87
  268. package/core/server/data/migrations/versions/4.9/06-add-comped-status.js +0 -47
  269. package/core/server/data/migrations/versions/4.9/07-update-comped-members-status-events.js +0 -39
  270. package/core/server/models/mail-event.js +0 -12
  271. package/core/server/services/mail-events/BookshelfMailEventRepository.js +0 -40
  272. package/core/server/services/mail-events/InMemoryMailEventRepository.js +0 -10
  273. package/core/server/services/mail-events/InMemoryMailEventRepository.ts +0 -8
  274. package/core/server/services/mail-events/MailEvent.js +0 -20
  275. package/core/server/services/mail-events/MailEvent.ts +0 -10
  276. package/core/server/services/mail-events/MailEventRepository.js +0 -2
  277. package/core/server/services/mail-events/MailEventRepository.ts +0 -5
  278. package/core/server/services/mail-events/MailEventService.js +0 -124
  279. package/core/server/services/mail-events/MailEventService.ts +0 -169
  280. package/core/server/services/mail-events/index.js +0 -21
  281. package/core/server/services/mail-events/libraries.d.ts +0 -2
@@ -1,11 +0,0 @@
1
- const {
2
- addPermissionWithRoles
3
- } = require('../../utils');
4
-
5
- module.exports = addPermissionWithRoles({
6
- name: 'Reset all passwords',
7
- action: 'resetAllPasswords',
8
- object: 'authentication'
9
- }, [
10
- 'Administrator'
11
- ]);
@@ -1,9 +0,0 @@
1
- const {addTable} = require('../../utils');
2
-
3
- module.exports = addTable('benefits', {
4
- id: {type: 'string', maxlength: 24, nullable: false, primary: true},
5
- name: {type: 'string', maxlength: 191, nullable: false},
6
- slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
7
- created_at: {type: 'dateTime', nullable: false},
8
- updated_at: {type: 'dateTime', nullable: true}
9
- });
@@ -1,8 +0,0 @@
1
- const {addTable} = require('../../utils');
2
-
3
- module.exports = addTable('products_benefits', {
4
- id: {type: 'string', maxlength: 24, nullable: false, primary: true},
5
- product_id: {type: 'string', maxlength: 24, nullable: false, references: 'products.id', cascadeDelete: true},
6
- benefit_id: {type: 'string', maxlength: 24, nullable: false, references: 'benefits.id', cascadeDelete: true},
7
- sort_order: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0}
8
- });
@@ -1,7 +0,0 @@
1
- const {createAddColumnMigration} = require('../../utils');
2
-
3
- module.exports = createAddColumnMigration('email_batches', 'member_segment', {
4
- type: 'text',
5
- maxlength: 2000,
6
- nullable: true
7
- });
@@ -1,87 +0,0 @@
1
- const logging = require('@tryghost/logging');
2
- const urlUtils = require('../../../../../shared/url-utils');
3
- const htmlToPlaintext = require('@tryghost/html-to-plaintext');
4
- const mobiledocLib = require('../../../../lib/mobiledoc');
5
- const {createTransactionalMigration} = require('../../utils');
6
-
7
- // in Ghost versions 4.6.1-4.8.4 the 4.0 migration that transformed URLs had a bug
8
- // that meant urls inside cards in mobiledoc content was not being transformed
9
- //
10
- // if the migrations table indicates an upgrade was made from 3.x to 4.6-4.8 then
11
- // we'll re-run the transforms against post.mobiledoc and re-generate the html
12
- // and plaintext contents
13
-
14
- module.exports = createTransactionalMigration(
15
- async function up(knex) {
16
- const badVersionUsedFor40Migration = await knex('migrations')
17
- .where({
18
- name: '18-transform-urls-absolute-to-transform-ready.js'
19
- })
20
- .whereIn('currentVersion', ['4.6', '4.7', '4.8'])
21
- .first();
22
-
23
- if (!badVersionUsedFor40Migration) {
24
- logging.info('Skipping transform of mobiledoc URLs - original transform was good');
25
- return;
26
- }
27
-
28
- logging.info('Transforming all internal URLs in posts.{mobiledoc,html,plaintext} to transform-ready');
29
-
30
- await knex.transaction(async (trx) => {
31
- const postIdRows = await knex('posts')
32
- .transacting(trx)
33
- .forUpdate()
34
- .select('id');
35
-
36
- // eslint-disable-next-line no-restricted-syntax
37
- for (const postIdRow of postIdRows) {
38
- const {id} = postIdRow;
39
- const [post] = await knex('posts')
40
- .transacting(trx)
41
- .where({id})
42
- .select([
43
- 'mobiledoc'
44
- ]);
45
-
46
- let mobiledoc;
47
- let html;
48
-
49
- try {
50
- mobiledoc = urlUtils.mobiledocToTransformReady(post.mobiledoc, {cardTransformers: mobiledocLib.cards});
51
-
52
- if (!mobiledoc) {
53
- logging.warn(`No mobiledoc for ${id}. Skipping.`);
54
- continue;
55
- }
56
- } catch (err) {
57
- logging.warn(`Invalid mobiledoc JSON structure for ${id}. Skipping`);
58
- continue;
59
- }
60
-
61
- try {
62
- html = mobiledocLib.render(JSON.parse(mobiledoc));
63
- } catch (err) {
64
- logging.warn(`Invalid mobiledoc content structure for ${id}, unable to render. Skipping`);
65
- continue;
66
- }
67
-
68
- const plaintext = htmlToPlaintext.excerpt(html);
69
-
70
- await knex('posts')
71
- .transacting(trx)
72
- .where({id})
73
- .update({
74
- mobiledoc,
75
- html,
76
- plaintext
77
- });
78
- }
79
-
80
- return 'transaction complete';
81
- });
82
- },
83
-
84
- async function down() {
85
- // noop
86
- }
87
- );
@@ -1,47 +0,0 @@
1
- const logging = require('@tryghost/logging');
2
- const {createTransactionalMigration} = require('../../utils');
3
-
4
- module.exports = createTransactionalMigration(
5
- async function up(knex) {
6
- // eslint-disable-next-line no-restricted-syntax
7
- const compedMemberIds = (await knex('members')
8
- .select('members.id')
9
- .innerJoin(
10
- 'members_stripe_customers',
11
- 'members.id',
12
- 'members_stripe_customers.member_id'
13
- ).innerJoin(
14
- 'members_stripe_customers_subscriptions',
15
- function () {
16
- this.on(
17
- 'members_stripe_customers.customer_id',
18
- 'members_stripe_customers_subscriptions.customer_id'
19
- ).onIn(
20
- 'members_stripe_customers_subscriptions.status',
21
- ['active', 'trialing', 'past_due', 'unpaid']
22
- );
23
- }
24
- ).where(
25
- 'members_stripe_customers_subscriptions.plan_nickname',
26
- '=',
27
- 'Complimentary'
28
- )).map(({id}) => id);
29
-
30
- if (compedMemberIds.length === 0) {
31
- logging.info('No Members found with Complimentary subscriptions');
32
- return;
33
- }
34
-
35
- logging.info(`Updating ${compedMemberIds.length} Members status from 'paid' -> 'comped'`);
36
-
37
- await knex('members')
38
- .update('status', 'comped')
39
- .whereIn('id', compedMemberIds);
40
- },
41
- async function down(knex) {
42
- logging.info('Updating all member "comped" statuses to "paid"');
43
- await knex('members')
44
- .update('status', 'paid')
45
- .where('status', 'comped');
46
- }
47
- );
@@ -1,39 +0,0 @@
1
- const logging = require('@tryghost/logging');
2
- const {createTransactionalMigration} = require('../../utils');
3
-
4
- module.exports = createTransactionalMigration(
5
- async function up(knex) {
6
- logging.info('Updating members_status_events for comped members');
7
- const compedMembers = await knex('members')
8
- .select('id')
9
- .where('status', 'comped');
10
-
11
- if (compedMembers.length === 0) {
12
- logging.info('No comped members found - skipping migration');
13
- return;
14
- } else {
15
- logging.info(`Found ${compedMembers.length} comped members - checking members_status_events`);
16
- }
17
-
18
- // eslint-disable-next-line no-restricted-syntax
19
- for (const member of compedMembers) {
20
- const mostRecentStatusEvent = await knex('members_status_events')
21
- .select('*')
22
- .where('member_id', member.id)
23
- .orderBy('created_at', 'desc')
24
- .limit(1)
25
- .first();
26
-
27
- if (!mostRecentStatusEvent) {
28
- logging.warn(`Could not find a status event for member ${member.id} - skipping this member`);
29
- } else if (mostRecentStatusEvent.to_status !== 'comped') {
30
- logging.info(`Updating members_status_event ${mostRecentStatusEvent.id}`);
31
- await knex('members_status_events')
32
- .update('to_status', 'comped')
33
- .where('id', mostRecentStatusEvent.id);
34
- }
35
- }
36
- },
37
- async function down() {}
38
- );
39
-
@@ -1,12 +0,0 @@
1
- const ghostBookshelf = require('./base');
2
-
3
- const MailEvent = ghostBookshelf.Model.extend({
4
- tableName: 'temp_mail_events',
5
- defaults() {
6
- return {};
7
- }
8
- }, {});
9
-
10
- module.exports = {
11
- MailEvent: ghostBookshelf.model('MailEvent', MailEvent)
12
- };
@@ -1,40 +0,0 @@
1
- /**
2
- * @typedef {import('./MailEventRepository')} MailEventRepository
3
- * @typedef {import('./MailEvent').MailEvent} MailEvent
4
- */
5
-
6
- /**
7
- * @typedef {object} MailEventModel
8
- * @property {function} add
9
- */
10
-
11
- /**
12
- * @implements MailEventRepository
13
- */
14
- module.exports = class BookshelfMailEventRepository {
15
- /**
16
- * @type {MailEventModel}
17
- */
18
- #MailEventModel;
19
-
20
- /**
21
- * @param {object} MailEventModel
22
- */
23
- constructor(MailEventModel) {
24
- this.#MailEventModel = MailEventModel;
25
- }
26
-
27
- /**
28
- * @param {MailEvent} mailEvent
29
- * @returns {Promise<void>}
30
- */
31
- async save(mailEvent) {
32
- await this.#MailEventModel.add({
33
- id: mailEvent.id,
34
- type: mailEvent.type,
35
- message_id: mailEvent.messageId,
36
- recipient: mailEvent.recipient,
37
- occurred_at: new Date(mailEvent.timestampMs)
38
- });
39
- }
40
- };
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InMemoryMailEventRepository = void 0;
4
- const InMemoryRepository_1 = require("../lib/InMemoryRepository");
5
- class InMemoryMailEventRepository extends InMemoryRepository_1.InMemoryRepository {
6
- toPrimitive() {
7
- return {};
8
- }
9
- }
10
- exports.InMemoryMailEventRepository = InMemoryMailEventRepository;
@@ -1,8 +0,0 @@
1
- import {InMemoryRepository} from '../lib/InMemoryRepository';
2
- import {MailEvent} from './MailEvent';
3
-
4
- export class InMemoryMailEventRepository extends InMemoryRepository<string, MailEvent> {
5
- protected toPrimitive(): object {
6
- return {};
7
- }
8
- }
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MailEvent = void 0;
4
- class MailEvent {
5
- id;
6
- type;
7
- messageId;
8
- recipient;
9
- timestampMs;
10
- deleted;
11
- constructor(id, type, messageId, recipient, timestampMs, deleted = false) {
12
- this.id = id;
13
- this.type = type;
14
- this.messageId = messageId;
15
- this.recipient = recipient;
16
- this.timestampMs = timestampMs;
17
- this.deleted = deleted;
18
- }
19
- }
20
- exports.MailEvent = MailEvent;
@@ -1,10 +0,0 @@
1
- export class MailEvent {
2
- constructor(
3
- readonly id: string,
4
- readonly type: string,
5
- readonly messageId: string,
6
- readonly recipient: string,
7
- readonly timestampMs: number,
8
- readonly deleted: boolean = false
9
- ) {}
10
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +0,0 @@
1
- import {MailEvent} from './MailEvent';
2
-
3
- export interface MailEventRepository {
4
- save(event: MailEvent): Promise<void>;
5
- }
@@ -1,124 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.MailEventService = void 0;
7
- const crypto_1 = __importDefault(require("crypto"));
8
- const errors_1 = __importDefault(require("@tryghost/errors"));
9
- const tpl_1 = __importDefault(require("@tryghost/tpl"));
10
- const MailEvent_1 = require("./MailEvent");
11
- /**
12
- * @see https://documentation.mailgun.com/en/latest/user_manual.html#events-1
13
- */
14
- var EventType;
15
- (function (EventType) {
16
- EventType["CLICKED"] = "clicked";
17
- EventType["COMPLAINED"] = "complained";
18
- EventType["DELIVERED"] = "delivered";
19
- EventType["FAILED"] = "failed";
20
- EventType["OPENED"] = "opened";
21
- EventType["UNSUBSCRIBED"] = "unsubscribed";
22
- })(EventType || (EventType = {}));
23
- const VALIDATION_MESSAGES = {
24
- signingKeyNotConfigured: 'payload signing key is not configured',
25
- payloadSignatureMissing: 'Payload is missing "signature"',
26
- payloadSignatureInvalid: '"signature" is invalid',
27
- payloadEventsMissing: 'Payload is missing "mail_events"',
28
- payloadEventsInvalid: '"mail_events" is not an array',
29
- payloadEventKeyMissing: 'Event [{idx}] is missing "{key}"'
30
- };
31
- class MailEventService {
32
- mailEventRepository;
33
- config;
34
- labs;
35
- static LABS_KEY = 'mailEvents';
36
- static CONFIG_KEY_PAYLOAD_SIGNING_KEY = 'hostSettings:mailEventsPayloadSigningKey';
37
- constructor(mailEventRepository, config, labs) {
38
- this.mailEventRepository = mailEventRepository;
39
- this.config = config;
40
- this.labs = labs;
41
- }
42
- async processPayload(payload) {
43
- if (this.labs.isSet(MailEventService.LABS_KEY) === false) {
44
- throw new errors_1.default.NotFoundError();
45
- }
46
- const payloadSigningKey = this.config.get(MailEventService.CONFIG_KEY_PAYLOAD_SIGNING_KEY);
47
- // Verify that the service is configured correctly - We expect a string
48
- // for the payload signing key but as a safeguard we check the type here
49
- // to prevent any unexpected behaviour
50
- if (typeof payloadSigningKey !== 'string') {
51
- throw new errors_1.default.InternalServerError({
52
- message: (0, tpl_1.default)(VALIDATION_MESSAGES.signingKeyNotConfigured)
53
- });
54
- }
55
- // Verify the payload
56
- this.verifyPayload(payload, payloadSigningKey);
57
- // Store known events
58
- const eventTypes = new Set(Object.values(EventType));
59
- for (const payloadEvent of payload.mail_events) {
60
- if (eventTypes.has(payloadEvent.event) === false) {
61
- continue;
62
- }
63
- try {
64
- await this.mailEventRepository.save(new MailEvent_1.MailEvent(payloadEvent.id, payloadEvent.event, payloadEvent.message.headers['message-id'], payloadEvent.recipient, payloadEvent.timestamp * 1000));
65
- }
66
- catch (err) {
67
- throw new errors_1.default.InternalServerError({
68
- message: 'Event could not be stored',
69
- err: err
70
- });
71
- }
72
- }
73
- }
74
- validatePayload(payload) {
75
- if (payload.signature === undefined) {
76
- throw new errors_1.default.ValidationError({
77
- message: (0, tpl_1.default)(VALIDATION_MESSAGES.payloadSignatureMissing)
78
- });
79
- }
80
- if (typeof payload.signature !== 'string') {
81
- throw new errors_1.default.ValidationError({
82
- message: (0, tpl_1.default)(VALIDATION_MESSAGES.payloadSignatureInvalid)
83
- });
84
- }
85
- if (payload.mail_events === undefined) {
86
- throw new errors_1.default.ValidationError({
87
- message: (0, tpl_1.default)(VALIDATION_MESSAGES.payloadEventsMissing)
88
- });
89
- }
90
- if (Array.isArray(payload.mail_events) === false) {
91
- throw new errors_1.default.ValidationError({
92
- message: (0, tpl_1.default)(VALIDATION_MESSAGES.payloadEventsInvalid)
93
- });
94
- }
95
- const expectedKeys = ['id', 'timestamp', 'event', 'message', 'recipient'];
96
- payload.mail_events.forEach((payloadEvent, idx) => {
97
- expectedKeys.forEach((key) => {
98
- if (payloadEvent[key] === undefined) {
99
- throw new errors_1.default.ValidationError({
100
- message: (0, tpl_1.default)(VALIDATION_MESSAGES.payloadEventKeyMissing, { idx, key })
101
- });
102
- }
103
- if (key === 'message' && payloadEvent.message.headers?.['message-id'] === undefined) {
104
- throw new errors_1.default.ValidationError({
105
- message: (0, tpl_1.default)(VALIDATION_MESSAGES.payloadEventKeyMissing, { idx, key: 'message.headers.message-id' })
106
- });
107
- }
108
- });
109
- });
110
- }
111
- verifyPayload(payload, payloadSigningKey) {
112
- const data = JSON.stringify(payload.mail_events);
113
- const signature = crypto_1.default
114
- .createHmac('sha256', payloadSigningKey)
115
- .update(data)
116
- .digest('hex');
117
- if (signature !== payload.signature) {
118
- throw new errors_1.default.UnauthorizedError({
119
- message: (0, tpl_1.default)(VALIDATION_MESSAGES.payloadSignatureInvalid)
120
- });
121
- }
122
- }
123
- }
124
- exports.MailEventService = MailEventService;
@@ -1,169 +0,0 @@
1
- import crypto from 'crypto';
2
- import errors from '@tryghost/errors';
3
- import tpl from '@tryghost/tpl';
4
-
5
- import {MailEvent} from './MailEvent';
6
- import {MailEventRepository} from './MailEventRepository';
7
-
8
- /**
9
- * @see https://documentation.mailgun.com/en/latest/user_manual.html#events-1
10
- */
11
- enum EventType { // eslint-disable-line no-shadow
12
- CLICKED = 'clicked',
13
- COMPLAINED = 'complained',
14
- DELIVERED = 'delivered',
15
- FAILED = 'failed',
16
- OPENED = 'opened',
17
- UNSUBSCRIBED = 'unsubscribed'
18
- }
19
-
20
- interface PayloadEvent {
21
- id: string;
22
- timestamp: number; // Unix timestamp in seconds
23
- event: string;
24
- message: {
25
- headers: {
26
- 'message-id': string;
27
- }
28
- },
29
- recipient: string;
30
- }
31
-
32
- interface Payload {
33
- signature: string;
34
- mail_events: PayloadEvent[];
35
- }
36
-
37
- interface Labs {
38
- isSet(key: string): boolean;
39
- }
40
-
41
- interface Config {
42
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
- get(key: string): any;
44
- }
45
-
46
- const VALIDATION_MESSAGES = {
47
- signingKeyNotConfigured: 'payload signing key is not configured',
48
- payloadSignatureMissing: 'Payload is missing "signature"',
49
- payloadSignatureInvalid: '"signature" is invalid',
50
- payloadEventsMissing: 'Payload is missing "mail_events"',
51
- payloadEventsInvalid: '"mail_events" is not an array',
52
- payloadEventKeyMissing: 'Event [{idx}] is missing "{key}"'
53
- };
54
-
55
- export class MailEventService {
56
- static readonly LABS_KEY = 'mailEvents';
57
- static readonly CONFIG_KEY_PAYLOAD_SIGNING_KEY = 'hostSettings:mailEventsPayloadSigningKey';
58
-
59
- constructor(
60
- private mailEventRepository: MailEventRepository,
61
- private config: Config,
62
- private labs: Labs
63
- ) {}
64
-
65
- async processPayload(payload: Payload) {
66
- if (this.labs.isSet(MailEventService.LABS_KEY) === false) {
67
- throw new errors.NotFoundError();
68
- }
69
-
70
- const payloadSigningKey = this.config.get(MailEventService.CONFIG_KEY_PAYLOAD_SIGNING_KEY);
71
-
72
- // Verify that the service is configured correctly - We expect a string
73
- // for the payload signing key but as a safeguard we check the type here
74
- // to prevent any unexpected behaviour
75
- if (typeof payloadSigningKey !== 'string') {
76
- throw new errors.InternalServerError({
77
- message: tpl(VALIDATION_MESSAGES.signingKeyNotConfigured)
78
- });
79
- }
80
-
81
- // Verify the payload
82
- this.verifyPayload(payload, payloadSigningKey);
83
-
84
- // Store known events
85
- const eventTypes = new Set<string>(Object.values(EventType) as string[]);
86
-
87
- for (const payloadEvent of payload.mail_events) {
88
- if (eventTypes.has(payloadEvent.event) === false) {
89
- continue;
90
- }
91
-
92
- try {
93
- await this.mailEventRepository.save(
94
- new MailEvent(
95
- payloadEvent.id,
96
- payloadEvent.event,
97
- payloadEvent.message.headers['message-id'],
98
- payloadEvent.recipient,
99
- payloadEvent.timestamp * 1000
100
- )
101
- );
102
- } catch (err) {
103
- throw new errors.InternalServerError({
104
- message: 'Event could not be stored',
105
- err: err
106
- });
107
- }
108
- }
109
- }
110
-
111
- validatePayload(payload: Payload) {
112
- if (payload.signature === undefined) {
113
- throw new errors.ValidationError({
114
- message: tpl(VALIDATION_MESSAGES.payloadSignatureMissing)
115
- });
116
- }
117
-
118
- if (typeof payload.signature !== 'string') {
119
- throw new errors.ValidationError({
120
- message: tpl(VALIDATION_MESSAGES.payloadSignatureInvalid)
121
- });
122
- }
123
-
124
- if (payload.mail_events === undefined) {
125
- throw new errors.ValidationError({
126
- message: tpl(VALIDATION_MESSAGES.payloadEventsMissing)
127
- });
128
- }
129
-
130
- if (Array.isArray(payload.mail_events) === false) {
131
- throw new errors.ValidationError({
132
- message: tpl(VALIDATION_MESSAGES.payloadEventsInvalid)
133
- });
134
- }
135
-
136
- const expectedKeys: (keyof PayloadEvent)[] = ['id', 'timestamp', 'event', 'message', 'recipient'];
137
-
138
- payload.mail_events.forEach((payloadEvent, idx) => {
139
- expectedKeys.forEach((key) => {
140
- if (payloadEvent[key] === undefined) {
141
- throw new errors.ValidationError({
142
- message: tpl(VALIDATION_MESSAGES.payloadEventKeyMissing, {idx, key})
143
- });
144
- }
145
-
146
- if (key === 'message' && payloadEvent.message.headers?.['message-id'] === undefined) {
147
- throw new errors.ValidationError({
148
- message: tpl(VALIDATION_MESSAGES.payloadEventKeyMissing, {idx, key: 'message.headers.message-id'})
149
- });
150
- }
151
- });
152
- });
153
- }
154
-
155
- private verifyPayload(payload: Payload, payloadSigningKey: string) {
156
- const data = JSON.stringify(payload.mail_events);
157
-
158
- const signature = crypto
159
- .createHmac('sha256', payloadSigningKey)
160
- .update(data)
161
- .digest('hex');
162
-
163
- if (signature !== payload.signature) {
164
- throw new errors.UnauthorizedError({
165
- message: tpl(VALIDATION_MESSAGES.payloadSignatureInvalid)
166
- });
167
- }
168
- }
169
- }
@@ -1,21 +0,0 @@
1
- const {MailEventService} = require('./MailEventService');
2
- const MailEventRepository = require('./BookshelfMailEventRepository.js');
3
-
4
- class MailEventsServiceWrapper {
5
- /**
6
- * @type {MailEventService}
7
- */
8
- service;
9
-
10
- async init() {
11
- const config = require('../../../shared/config');
12
- const labs = require('../../../shared/labs');
13
- const models = require('../../models');
14
-
15
- const repository = new MailEventRepository(models.MailEvent);
16
-
17
- this.service = new MailEventService(repository, config, labs);
18
- }
19
- }
20
-
21
- module.exports = new MailEventsServiceWrapper();
@@ -1,2 +0,0 @@
1
- declare module '@tryghost/errors';
2
- declare module '@tryghost/tpl';