ghost 5.89.4 → 5.89.5

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 (126) hide show
  1. package/components/{tryghost-adapter-cache-memory-ttl-5.89.4.tgz → tryghost-adapter-cache-memory-ttl-5.89.5.tgz} +0 -0
  2. package/components/tryghost-adapter-cache-redis-5.89.5.tgz +0 -0
  3. package/components/{tryghost-adapter-manager-5.89.4.tgz → tryghost-adapter-manager-5.89.5.tgz} +0 -0
  4. package/components/{tryghost-announcement-bar-settings-5.89.4.tgz → tryghost-announcement-bar-settings-5.89.5.tgz} +0 -0
  5. package/components/{tryghost-api-framework-5.89.4.tgz → tryghost-api-framework-5.89.5.tgz} +0 -0
  6. package/components/tryghost-api-version-compatibility-service-5.89.5.tgz +0 -0
  7. package/components/tryghost-audience-feedback-5.89.5.tgz +0 -0
  8. package/components/{tryghost-bookshelf-repository-5.89.4.tgz → tryghost-bookshelf-repository-5.89.5.tgz} +0 -0
  9. package/components/{tryghost-bootstrap-socket-5.89.4.tgz → tryghost-bootstrap-socket-5.89.5.tgz} +0 -0
  10. package/components/{tryghost-collections-5.89.4.tgz → tryghost-collections-5.89.5.tgz} +0 -0
  11. package/components/{tryghost-constants-5.89.4.tgz → tryghost-constants-5.89.5.tgz} +0 -0
  12. package/components/tryghost-custom-theme-settings-service-5.89.5.tgz +0 -0
  13. package/components/{tryghost-data-generator-5.89.4.tgz → tryghost-data-generator-5.89.5.tgz} +0 -0
  14. package/components/tryghost-domain-events-5.89.5.tgz +0 -0
  15. package/components/tryghost-donations-5.89.5.tgz +0 -0
  16. package/components/tryghost-dynamic-routing-events-5.89.5.tgz +0 -0
  17. package/components/tryghost-email-addresses-5.89.5.tgz +0 -0
  18. package/components/tryghost-email-analytics-provider-mailgun-5.89.5.tgz +0 -0
  19. package/components/tryghost-email-analytics-service-5.89.5.tgz +0 -0
  20. package/components/tryghost-email-content-generator-5.89.5.tgz +0 -0
  21. package/components/tryghost-email-events-5.89.5.tgz +0 -0
  22. package/components/tryghost-email-service-5.89.5.tgz +0 -0
  23. package/components/tryghost-email-suppression-list-5.89.5.tgz +0 -0
  24. package/components/{tryghost-express-dynamic-redirects-5.89.4.tgz → tryghost-express-dynamic-redirects-5.89.5.tgz} +0 -0
  25. package/components/tryghost-external-media-inliner-5.89.5.tgz +0 -0
  26. package/components/{tryghost-extract-api-key-5.89.4.tgz → tryghost-extract-api-key-5.89.5.tgz} +0 -0
  27. package/components/tryghost-ghost-5.89.5.tgz +0 -0
  28. package/components/tryghost-html-to-plaintext-5.89.5.tgz +0 -0
  29. package/components/{tryghost-i18n-5.89.4.tgz → tryghost-i18n-5.89.5.tgz} +0 -0
  30. package/components/{tryghost-importer-handler-content-files-5.89.4.tgz → tryghost-importer-handler-content-files-5.89.5.tgz} +0 -0
  31. package/components/{tryghost-importer-revue-5.89.4.tgz → tryghost-importer-revue-5.89.5.tgz} +0 -0
  32. package/components/tryghost-in-memory-repository-5.89.5.tgz +0 -0
  33. package/components/{tryghost-job-manager-5.89.4.tgz → tryghost-job-manager-5.89.5.tgz} +0 -0
  34. package/components/{tryghost-link-redirects-5.89.4.tgz → tryghost-link-redirects-5.89.5.tgz} +0 -0
  35. package/components/{tryghost-link-replacer-5.89.4.tgz → tryghost-link-replacer-5.89.5.tgz} +0 -0
  36. package/components/tryghost-link-tracking-5.89.5.tgz +0 -0
  37. package/components/{tryghost-magic-link-5.89.4.tgz → tryghost-magic-link-5.89.5.tgz} +0 -0
  38. package/components/tryghost-mail-events-5.89.5.tgz +0 -0
  39. package/components/tryghost-mailgun-client-5.89.5.tgz +0 -0
  40. package/components/{tryghost-member-attribution-5.89.4.tgz → tryghost-member-attribution-5.89.5.tgz} +0 -0
  41. package/components/{tryghost-member-events-5.89.4.tgz → tryghost-member-events-5.89.5.tgz} +0 -0
  42. package/components/{tryghost-members-api-5.89.4.tgz → tryghost-members-api-5.89.5.tgz} +0 -0
  43. package/components/tryghost-members-csv-5.89.5.tgz +0 -0
  44. package/components/{tryghost-members-events-service-5.89.4.tgz → tryghost-members-events-service-5.89.5.tgz} +0 -0
  45. package/components/{tryghost-members-importer-5.89.4.tgz → tryghost-members-importer-5.89.5.tgz} +0 -0
  46. package/components/{tryghost-members-offers-5.89.4.tgz → tryghost-members-offers-5.89.5.tgz} +0 -0
  47. package/components/{tryghost-members-payments-5.89.4.tgz → tryghost-members-payments-5.89.5.tgz} +0 -0
  48. package/components/{tryghost-members-ssr-5.89.4.tgz → tryghost-members-ssr-5.89.5.tgz} +0 -0
  49. package/components/{tryghost-members-stripe-service-5.89.4.tgz → tryghost-members-stripe-service-5.89.5.tgz} +0 -0
  50. package/components/{tryghost-mentions-email-report-5.89.4.tgz → tryghost-mentions-email-report-5.89.5.tgz} +0 -0
  51. package/components/{tryghost-milestones-5.89.4.tgz → tryghost-milestones-5.89.5.tgz} +0 -0
  52. package/components/tryghost-minifier-5.89.5.tgz +0 -0
  53. package/components/tryghost-model-to-domain-event-interceptor-5.89.5.tgz +0 -0
  54. package/components/tryghost-mw-api-version-mismatch-5.89.5.tgz +0 -0
  55. package/components/{tryghost-mw-cache-control-5.89.4.tgz → tryghost-mw-cache-control-5.89.5.tgz} +0 -0
  56. package/components/tryghost-mw-error-handler-5.89.5.tgz +0 -0
  57. package/components/{tryghost-mw-session-from-token-5.89.4.tgz → tryghost-mw-session-from-token-5.89.5.tgz} +0 -0
  58. package/components/tryghost-mw-update-user-last-seen-5.89.5.tgz +0 -0
  59. package/components/tryghost-mw-version-match-5.89.5.tgz +0 -0
  60. package/components/tryghost-mw-vhost-5.89.5.tgz +0 -0
  61. package/components/tryghost-nql-filter-expansions-5.89.5.tgz +0 -0
  62. package/components/{tryghost-oembed-service-5.89.4.tgz → tryghost-oembed-service-5.89.5.tgz} +0 -0
  63. package/components/{tryghost-package-json-5.89.4.tgz → tryghost-package-json-5.89.5.tgz} +0 -0
  64. package/components/{tryghost-post-events-5.89.4.tgz → tryghost-post-events-5.89.5.tgz} +0 -0
  65. package/components/tryghost-post-revisions-5.89.5.tgz +0 -0
  66. package/components/tryghost-posts-service-5.89.5.tgz +0 -0
  67. package/components/tryghost-recommendations-5.89.5.tgz +0 -0
  68. package/components/tryghost-referrers-5.89.5.tgz +0 -0
  69. package/components/{tryghost-security-5.89.4.tgz → tryghost-security-5.89.5.tgz} +0 -0
  70. package/components/{tryghost-session-service-5.89.4.tgz → tryghost-session-service-5.89.5.tgz} +0 -0
  71. package/components/tryghost-settings-path-manager-5.89.5.tgz +0 -0
  72. package/components/{tryghost-slack-notifications-5.89.4.tgz → tryghost-slack-notifications-5.89.5.tgz} +0 -0
  73. package/components/{tryghost-staff-service-5.89.4.tgz → tryghost-staff-service-5.89.5.tgz} +0 -0
  74. package/components/tryghost-stats-service-5.89.5.tgz +0 -0
  75. package/components/tryghost-tiers-5.89.5.tgz +0 -0
  76. package/components/{tryghost-update-check-service-5.89.4.tgz → tryghost-update-check-service-5.89.5.tgz} +0 -0
  77. package/components/{tryghost-verification-trigger-5.89.4.tgz → tryghost-verification-trigger-5.89.5.tgz} +0 -0
  78. package/components/{tryghost-version-notifications-data-service-5.89.4.tgz → tryghost-version-notifications-data-service-5.89.5.tgz} +0 -0
  79. package/components/{tryghost-webmentions-5.89.4.tgz → tryghost-webmentions-5.89.5.tgz} +0 -0
  80. package/core/built/admin/assets/{chunk.524.88e372a782fa17c3d612.js → chunk.524.9bab7936eef350e7fa99.js} +5 -5
  81. package/core/built/admin/assets/{chunk.582.5ec6b0a101a25ad210d8.js → chunk.582.0378a51f97e57bab3e99.js} +6 -6
  82. package/core/built/admin/index.html +1 -1
  83. package/core/frontend/services/routing/controllers/unsubscribe.js +16 -0
  84. package/core/server/services/members/middleware.js +25 -26
  85. package/core/server/services/settings-helpers/SettingsHelpers.js +10 -0
  86. package/core/server/web/members/app.js +10 -3
  87. package/core/shared/config/defaults.json +1 -1
  88. package/core/shared/config/env/config.development.json +1 -1
  89. package/package.json +147 -147
  90. package/components/tryghost-adapter-cache-redis-5.89.4.tgz +0 -0
  91. package/components/tryghost-api-version-compatibility-service-5.89.4.tgz +0 -0
  92. package/components/tryghost-audience-feedback-5.89.4.tgz +0 -0
  93. package/components/tryghost-custom-theme-settings-service-5.89.4.tgz +0 -0
  94. package/components/tryghost-domain-events-5.89.4.tgz +0 -0
  95. package/components/tryghost-donations-5.89.4.tgz +0 -0
  96. package/components/tryghost-dynamic-routing-events-5.89.4.tgz +0 -0
  97. package/components/tryghost-email-addresses-5.89.4.tgz +0 -0
  98. package/components/tryghost-email-analytics-provider-mailgun-5.89.4.tgz +0 -0
  99. package/components/tryghost-email-analytics-service-5.89.4.tgz +0 -0
  100. package/components/tryghost-email-content-generator-5.89.4.tgz +0 -0
  101. package/components/tryghost-email-events-5.89.4.tgz +0 -0
  102. package/components/tryghost-email-service-5.89.4.tgz +0 -0
  103. package/components/tryghost-email-suppression-list-5.89.4.tgz +0 -0
  104. package/components/tryghost-external-media-inliner-5.89.4.tgz +0 -0
  105. package/components/tryghost-ghost-5.89.4.tgz +0 -0
  106. package/components/tryghost-html-to-plaintext-5.89.4.tgz +0 -0
  107. package/components/tryghost-in-memory-repository-5.89.4.tgz +0 -0
  108. package/components/tryghost-link-tracking-5.89.4.tgz +0 -0
  109. package/components/tryghost-mail-events-5.89.4.tgz +0 -0
  110. package/components/tryghost-mailgun-client-5.89.4.tgz +0 -0
  111. package/components/tryghost-members-csv-5.89.4.tgz +0 -0
  112. package/components/tryghost-minifier-5.89.4.tgz +0 -0
  113. package/components/tryghost-model-to-domain-event-interceptor-5.89.4.tgz +0 -0
  114. package/components/tryghost-mw-api-version-mismatch-5.89.4.tgz +0 -0
  115. package/components/tryghost-mw-error-handler-5.89.4.tgz +0 -0
  116. package/components/tryghost-mw-update-user-last-seen-5.89.4.tgz +0 -0
  117. package/components/tryghost-mw-version-match-5.89.4.tgz +0 -0
  118. package/components/tryghost-mw-vhost-5.89.4.tgz +0 -0
  119. package/components/tryghost-nql-filter-expansions-5.89.4.tgz +0 -0
  120. package/components/tryghost-post-revisions-5.89.4.tgz +0 -0
  121. package/components/tryghost-posts-service-5.89.4.tgz +0 -0
  122. package/components/tryghost-recommendations-5.89.4.tgz +0 -0
  123. package/components/tryghost-referrers-5.89.4.tgz +0 -0
  124. package/components/tryghost-settings-path-manager-5.89.4.tgz +0 -0
  125. package/components/tryghost-stats-service-5.89.4.tgz +0 -0
  126. package/components/tryghost-tiers-5.89.4.tgz +0 -0
@@ -10,8 +10,8 @@ function s(e){var r=o(e)
10
10
  return t(r)}function o(e){if(!t.o(n,e)){var r=new Error("Cannot find module '"+e+"'")
11
11
  throw r.code="MODULE_NOT_FOUND",r}return n[e]}s.keys=function(){return Object.keys(n)},s.resolve=o,e.exports=s,s.id=56857},32186:e=>{"use strict"
12
12
  e.exports=require("@ember/test-waiters")},80032:e=>{"use strict"
13
- e.exports=require("ember-tracked-storage-polyfill")},17809:()=>{},86625:()=>{},88256:(e,r,t)=>{e.exports=function(){var e=_eai_d,r=_eai_r
14
- function n(e){return e&&e.__esModule?e:Object.assign({default:e},e)}window.emberAutoImportDynamic=function(e){return 1===arguments.length?r("_eai_dyn_"+e):r("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return r("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))},e("@sentry/browser",[],(function(){return n(t(51294))})),e("@sentry/core",[],(function(){return n(t(16154))})),e("@sentry/integrations",[],(function(){return n(t(20080))})),e("@sentry/replay",[],(function(){return n(t(51633))})),e("@sentry/utils",[],(function(){return n(t(88414))})),e("@tryghost/color-utils",[],(function(){return n(t(86797))})),e("@tryghost/kg-clean-basic-html",[],(function(){return n(t(3414))})),e("@tryghost/kg-converters",[],(function(){return n(t(23075))})),e("@tryghost/limit-service",[],(function(){return n(t(55983))})),e("@tryghost/members-csv/lib/unparse",[],(function(){return n(t(9589))})),e("@tryghost/nql",[],(function(){return n(t(39365))})),e("@tryghost/nql-lang",[],(function(){return n(t(716))})),e("@tryghost/string",[],(function(){return n(t(96107))})),e("@tryghost/timezone-data",[],(function(){return n(t(27019))})),e("element-resize-detector",[],(function(){return n(t(29540))})),e("ember-css-transitions/modifiers/css-transition",["@ember/test-waiters"],(function(){return n(t(67946))})),e("ember-keyboard/helpers/if-key.js",[],(function(){return n(t(10530))})),e("ember-keyboard/helpers/on-key.js",[],(function(){return n(t(13692))})),e("ember-keyboard/modifiers/on-key.js",[],(function(){return n(t(40985))})),e("ember-keyboard/services/keyboard.js",[],(function(){return n(t(89697))})),e("ember-modifier",[],(function(){return n(t(37777))})),e("ember-moment/helpers/-base.js",[],(function(){return n(t(91366))})),e("ember-moment/helpers/is-after.js",[],(function(){return n(t(91461))})),e("ember-moment/helpers/is-before.js",[],(function(){return n(t(61e3))})),e("ember-moment/helpers/is-between.js",[],(function(){return n(t(447))})),e("ember-moment/helpers/is-same-or-after.js",[],(function(){return n(t(7916))})),e("ember-moment/helpers/is-same-or-before.js",[],(function(){return n(t(54351))})),e("ember-moment/helpers/is-same.js",[],(function(){return n(t(64193))})),e("ember-moment/helpers/moment-add.js",[],(function(){return n(t(50080))})),e("ember-moment/helpers/moment-calendar.js",[],(function(){return n(t(96625))})),e("ember-moment/helpers/moment-diff.js",[],(function(){return n(t(85340))})),e("ember-moment/helpers/moment-duration.js",[],(function(){return n(t(42967))})),e("ember-moment/helpers/moment-format.js",[],(function(){return n(t(10536))})),e("ember-moment/helpers/moment-from-now.js",[],(function(){return n(t(706))})),e("ember-moment/helpers/moment-from.js",[],(function(){return n(t(50727))})),e("ember-moment/helpers/moment-subtract.js",[],(function(){return n(t(54651))})),e("ember-moment/helpers/moment-to-date.js",[],(function(){return n(t(81183))})),e("ember-moment/helpers/moment-to-now.js",[],(function(){return n(t(17083))})),e("ember-moment/helpers/moment-to.js",[],(function(){return n(t(84818))})),e("ember-moment/helpers/moment.js",[],(function(){return n(t(41678))})),e("ember-moment/helpers/now.js",[],(function(){return n(t(34980))})),e("ember-moment/helpers/unix.js",[],(function(){return n(t(79272))})),e("ember-moment/helpers/utc.js",[],(function(){return n(t(36022))})),e("ember-moment/services/moment.js",[],(function(){return n(t(39879))})),e("fast-deep-equal",[],(function(){return n(t(25383))})),e("flexsearch",[],(function(){return n(t(37991))})),e("focus-trap",[],(function(){return n(t(39632))})),e("intersection-observer-admin",[],(function(){return n(t(21431))})),e("jose",[],(function(){return n(t(82765))})),e("moment-timezone",[],(function(){return n(t(41101))})),e("papaparse",[],(function(){return n(t(78695))})),e("raf-pool",[],(function(){return n(t(60695))})),e("react",[],(function(){return n(t(72854))})),e("react-dom",[],(function(){return n(t(95303))})),e("react-dom/client",[],(function(){return n(t(70816))})),e("semver/functions/coerce",[],(function(){return n(t(18576))})),e("semver/functions/lt",[],(function(){return n(t(32817))})),e("semver/functions/parse",[],(function(){return n(t(47898))})),e("tooltip.js",[],(function(){return n(t(85557))})),e("tracked-built-ins",["ember-tracked-storage-polyfill"],(function(){return n(t(77151))})),e("validator",[],(function(){return n(t(29119))})),e("_eai_dyn_@sentry/browser",[],(function(){return Promise.resolve().then(t.bind(t,51294))}))}()},60381:function(e,r){window._eai_r=require,window._eai_d=define}},t={}
13
+ e.exports=require("ember-tracked-storage-polyfill")},17809:()=>{},86625:()=>{},72006:(e,r,t)=>{e.exports=function(){var e=_eai_d,r=_eai_r
14
+ function n(e){return e&&e.__esModule?e:Object.assign({default:e},e)}window.emberAutoImportDynamic=function(e){return 1===arguments.length?r("_eai_dyn_"+e):r("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return r("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))},e("@sentry/browser",[],(function(){return n(t(51294))})),e("@sentry/core",[],(function(){return n(t(16154))})),e("@sentry/integrations",[],(function(){return n(t(20080))})),e("@sentry/replay",[],(function(){return n(t(51633))})),e("@sentry/utils",[],(function(){return n(t(88414))})),e("@tryghost/color-utils",[],(function(){return n(t(86797))})),e("@tryghost/kg-clean-basic-html",[],(function(){return n(t(3414))})),e("@tryghost/kg-converters",[],(function(){return n(t(23075))})),e("@tryghost/limit-service",[],(function(){return n(t(55983))})),e("@tryghost/members-csv/lib/unparse",[],(function(){return n(t(9589))})),e("@tryghost/nql",[],(function(){return n(t(39365))})),e("@tryghost/nql-lang",[],(function(){return n(t(716))})),e("@tryghost/string",[],(function(){return n(t(96107))})),e("@tryghost/timezone-data",[],(function(){return n(t(27019))})),e("element-resize-detector",[],(function(){return n(t(29540))})),e("ember-css-transitions/modifiers/css-transition",["@ember/test-waiters"],(function(){return n(t(67946))})),e("ember-keyboard/helpers/if-key.js",[],(function(){return n(t(10530))})),e("ember-keyboard/helpers/on-key.js",[],(function(){return n(t(13692))})),e("ember-keyboard/modifiers/on-key.js",[],(function(){return n(t(40985))})),e("ember-keyboard/services/keyboard.js",[],(function(){return n(t(89697))})),e("ember-modifier",[],(function(){return n(t(37777))})),e("ember-moment/helpers/-base.js",[],(function(){return n(t(91366))})),e("ember-moment/helpers/is-after.js",[],(function(){return n(t(91461))})),e("ember-moment/helpers/is-before.js",[],(function(){return n(t(61e3))})),e("ember-moment/helpers/is-between.js",[],(function(){return n(t(447))})),e("ember-moment/helpers/is-same-or-after.js",[],(function(){return n(t(7916))})),e("ember-moment/helpers/is-same-or-before.js",[],(function(){return n(t(54351))})),e("ember-moment/helpers/is-same.js",[],(function(){return n(t(64193))})),e("ember-moment/helpers/moment-add.js",[],(function(){return n(t(50080))})),e("ember-moment/helpers/moment-calendar.js",[],(function(){return n(t(96625))})),e("ember-moment/helpers/moment-diff.js",[],(function(){return n(t(85340))})),e("ember-moment/helpers/moment-duration.js",[],(function(){return n(t(42967))})),e("ember-moment/helpers/moment-format.js",[],(function(){return n(t(10536))})),e("ember-moment/helpers/moment-from-now.js",[],(function(){return n(t(706))})),e("ember-moment/helpers/moment-from.js",[],(function(){return n(t(50727))})),e("ember-moment/helpers/moment-subtract.js",[],(function(){return n(t(54651))})),e("ember-moment/helpers/moment-to-date.js",[],(function(){return n(t(81183))})),e("ember-moment/helpers/moment-to-now.js",[],(function(){return n(t(17083))})),e("ember-moment/helpers/moment-to.js",[],(function(){return n(t(84818))})),e("ember-moment/helpers/moment.js",[],(function(){return n(t(41678))})),e("ember-moment/helpers/now.js",[],(function(){return n(t(34980))})),e("ember-moment/helpers/unix.js",[],(function(){return n(t(79272))})),e("ember-moment/helpers/utc.js",[],(function(){return n(t(36022))})),e("ember-moment/services/moment.js",[],(function(){return n(t(39879))})),e("fast-deep-equal",[],(function(){return n(t(25383))})),e("flexsearch",[],(function(){return n(t(37991))})),e("focus-trap",[],(function(){return n(t(39632))})),e("intersection-observer-admin",[],(function(){return n(t(21431))})),e("jose",[],(function(){return n(t(82765))})),e("moment-timezone",[],(function(){return n(t(41101))})),e("papaparse",[],(function(){return n(t(78695))})),e("raf-pool",[],(function(){return n(t(60695))})),e("react",[],(function(){return n(t(72854))})),e("react-dom",[],(function(){return n(t(95303))})),e("react-dom/client",[],(function(){return n(t(70816))})),e("semver/functions/coerce",[],(function(){return n(t(18576))})),e("semver/functions/lt",[],(function(){return n(t(32817))})),e("semver/functions/parse",[],(function(){return n(t(47898))})),e("tooltip.js",[],(function(){return n(t(85557))})),e("tracked-built-ins",["ember-tracked-storage-polyfill"],(function(){return n(t(77151))})),e("validator",[],(function(){return n(t(29119))})),e("_eai_dyn_@sentry/browser",[],(function(){return Promise.resolve().then(t.bind(t,51294))}))}()},44579:function(e,r){window._eai_r=require,window._eai_d=define}},t={}
15
15
  function n(e){var s=t[e]
16
16
  if(void 0!==s)return s.exports
17
17
  var o=t[e]={id:e,loaded:!1,exports:{}}
@@ -28,8 +28,8 @@ var r=(r,t)=>{var s,o,[i,u,m]=t,a=0
28
28
  if(i.some((r=>0!==e[r]))){for(s in u)n.o(u,s)&&(n.m[s]=u[s])
29
29
  if(m)var c=m(n)}for(r&&r(t);a<i.length;a++)o=i[a],n.o(e,o)&&e[o]&&e[o][0](),e[o]=0
30
30
  return n.O(c)},t=globalThis.webpackChunk_ember_auto_import_=globalThis.webpackChunk_ember_auto_import_||[]
31
- t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),n.O(void 0,[42],(()=>n(n.s=60381)))
32
- var s=n.O(void 0,[42],(()=>n(n.s=88256)))
31
+ t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),n.O(void 0,[42],(()=>n(n.s=44579)))
32
+ var s=n.O(void 0,[42],(()=>n(n.s=72006)))
33
33
  s=n.O(s),__ember_auto_import__=s})()
34
34
 
35
- //# sourceMappingURL=chunk.524.88e372a782fa17c3d612.map
35
+ //# sourceMappingURL=chunk.524.9bab7936eef350e7fa99.map
@@ -10,10 +10,10 @@ function s(e){var r=o(e)
10
10
  return t(r)}function o(e){if(!t.o(n,e)){var r=new Error("Cannot find module '"+e+"'")
11
11
  throw r.code="MODULE_NOT_FOUND",r}return n[e]}s.keys=function(){return Object.keys(n)},s.resolve=o,e.exports=s,s.id=56857},32186:e=>{"use strict"
12
12
  e.exports=require("@ember/test-waiters")},80032:e=>{"use strict"
13
- e.exports=require("ember-tracked-storage-polyfill")},17809:()=>{},86625:()=>{},88256:(e,r,t)=>{e.exports=function(){var e=_eai_d,r=_eai_r
14
- function n(e){return e&&e.__esModule?e:Object.assign({default:e},e)}window.emberAutoImportDynamic=function(e){return 1===arguments.length?r("_eai_dyn_"+e):r("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return r("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))},e("@sentry/browser",EAI_DISCOVERED_EXTERNALS("@sentry/browser"),(function(){return n(t(51294))})),e("@sentry/core",EAI_DISCOVERED_EXTERNALS("@sentry/core"),(function(){return n(t(16154))})),e("@sentry/integrations",EAI_DISCOVERED_EXTERNALS("@sentry/integrations"),(function(){return n(t(20080))})),e("@sentry/replay",EAI_DISCOVERED_EXTERNALS("@sentry/replay"),(function(){return n(t(51633))})),e("@sentry/utils",EAI_DISCOVERED_EXTERNALS("@sentry/utils"),(function(){return n(t(88414))})),e("@tryghost/color-utils",EAI_DISCOVERED_EXTERNALS("@tryghost/color-utils"),(function(){return n(t(86797))})),e("@tryghost/kg-clean-basic-html",EAI_DISCOVERED_EXTERNALS("@tryghost/kg-clean-basic-html"),(function(){return n(t(3414))})),e("@tryghost/kg-converters",EAI_DISCOVERED_EXTERNALS("@tryghost/kg-converters"),(function(){return n(t(23075))})),e("@tryghost/limit-service",EAI_DISCOVERED_EXTERNALS("@tryghost/limit-service"),(function(){return n(t(55983))})),e("@tryghost/members-csv/lib/unparse",EAI_DISCOVERED_EXTERNALS("@tryghost/members-csv/lib/unparse"),(function(){return n(t(9589))})),e("@tryghost/nql",EAI_DISCOVERED_EXTERNALS("@tryghost/nql"),(function(){return n(t(39365))})),e("@tryghost/nql-lang",EAI_DISCOVERED_EXTERNALS("@tryghost/nql-lang"),(function(){return n(t(716))})),e("@tryghost/string",EAI_DISCOVERED_EXTERNALS("@tryghost/string"),(function(){return n(t(96107))})),e("@tryghost/timezone-data",EAI_DISCOVERED_EXTERNALS("@tryghost/timezone-data"),(function(){return n(t(27019))})),e("element-resize-detector",EAI_DISCOVERED_EXTERNALS("element-resize-detector"),(function(){return n(t(29540))})),e("ember-css-transitions/modifiers/css-transition",EAI_DISCOVERED_EXTERNALS("ember-css-transitions/modifiers/css-transition"),(function(){return n(t(67946))})),e("ember-keyboard/helpers/if-key.js",EAI_DISCOVERED_EXTERNALS("ember-keyboard/helpers/if-key.js"),(function(){return n(t(10530))})),e("ember-keyboard/helpers/on-key.js",EAI_DISCOVERED_EXTERNALS("ember-keyboard/helpers/on-key.js"),(function(){return n(t(13692))})),e("ember-keyboard/modifiers/on-key.js",EAI_DISCOVERED_EXTERNALS("ember-keyboard/modifiers/on-key.js"),(function(){return n(t(40985))})),e("ember-keyboard/services/keyboard.js",EAI_DISCOVERED_EXTERNALS("ember-keyboard/services/keyboard.js"),(function(){return n(t(89697))})),e("ember-modifier",EAI_DISCOVERED_EXTERNALS("ember-modifier"),(function(){return n(t(37777))})),e("ember-moment/helpers/-base.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/-base.js"),(function(){return n(t(91366))})),e("ember-moment/helpers/is-after.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-after.js"),(function(){return n(t(91461))})),e("ember-moment/helpers/is-before.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-before.js"),(function(){return n(t(61e3))})),e("ember-moment/helpers/is-between.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-between.js"),(function(){return n(t(447))})),e("ember-moment/helpers/is-same-or-after.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-same-or-after.js"),(function(){return n(t(7916))})),e("ember-moment/helpers/is-same-or-before.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-same-or-before.js"),(function(){return n(t(54351))})),e("ember-moment/helpers/is-same.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-same.js"),(function(){return n(t(64193))})),e("ember-moment/helpers/moment-add.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-add.js"),(function(){return n(t(50080))})),e("ember-moment/helpers/moment-calendar.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-calendar.js"),(function(){return n(t(96625))})),e("ember-moment/helpers/moment-diff.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-diff.js"),(function(){return n(t(85340))})),e("ember-moment/helpers/moment-duration.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-duration.js"),(function(){return n(t(42967))})),e("ember-moment/helpers/moment-format.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-format.js"),(function(){return n(t(10536))})),e("ember-moment/helpers/moment-from-now.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-from-now.js"),(function(){return n(t(706))})),e("ember-moment/helpers/moment-from.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-from.js"),(function(){return n(t(50727))})),e("ember-moment/helpers/moment-subtract.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-subtract.js"),(function(){return n(t(54651))})),e("ember-moment/helpers/moment-to-date.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-to-date.js"),(function(){return n(t(81183))})),e("ember-moment/helpers/moment-to-now.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-to-now.js"),(function(){return n(t(17083))})),e("ember-moment/helpers/moment-to.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-to.js"),(function(){return n(t(84818))})),e("ember-moment/helpers/moment.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment.js"),(function(){return n(t(41678))})),e("ember-moment/helpers/now.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/now.js"),(function(){return n(t(34980))})),e("ember-moment/helpers/unix.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/unix.js"),(function(){return n(t(79272))})),e("ember-moment/helpers/utc.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/utc.js"),(function(){return n(t(36022))})),e("ember-moment/services/moment.js",EAI_DISCOVERED_EXTERNALS("ember-moment/services/moment.js"),(function(){return n(t(39879))})),e("fast-deep-equal",EAI_DISCOVERED_EXTERNALS("fast-deep-equal"),(function(){return n(t(25383))})),e("flexsearch",EAI_DISCOVERED_EXTERNALS("flexsearch"),(function(){return n(t(37991))})),e("focus-trap",EAI_DISCOVERED_EXTERNALS("focus-trap"),(function(){return n(t(39632))})),e("intersection-observer-admin",EAI_DISCOVERED_EXTERNALS("intersection-observer-admin"),(function(){return n(t(21431))})),e("jose",EAI_DISCOVERED_EXTERNALS("jose"),(function(){return n(t(82765))})),e("moment-timezone",EAI_DISCOVERED_EXTERNALS("moment-timezone"),(function(){return n(t(41101))})),e("papaparse",EAI_DISCOVERED_EXTERNALS("papaparse"),(function(){return n(t(78695))})),e("raf-pool",EAI_DISCOVERED_EXTERNALS("raf-pool"),(function(){return n(t(60695))})),e("react",EAI_DISCOVERED_EXTERNALS("react"),(function(){return n(t(72854))})),e("react-dom",EAI_DISCOVERED_EXTERNALS("react-dom"),(function(){return n(t(95303))})),e("react-dom/client",EAI_DISCOVERED_EXTERNALS("react-dom/client"),(function(){return n(t(70816))})),e("semver/functions/coerce",EAI_DISCOVERED_EXTERNALS("semver/functions/coerce"),(function(){return n(t(18576))})),e("semver/functions/lt",EAI_DISCOVERED_EXTERNALS("semver/functions/lt"),(function(){return n(t(32817))})),e("semver/functions/parse",EAI_DISCOVERED_EXTERNALS("semver/functions/parse"),(function(){return n(t(47898))})),e("tooltip.js",EAI_DISCOVERED_EXTERNALS("tooltip.js"),(function(){return n(t(85557))})),e("tracked-built-ins",EAI_DISCOVERED_EXTERNALS("tracked-built-ins"),(function(){return n(t(77151))})),e("validator",EAI_DISCOVERED_EXTERNALS("validator"),(function(){return n(t(29119))})),e("_eai_dyn_@sentry/browser",[],(function(){return Promise.resolve().then(t.bind(t,51294))}))}()},60381:function(e,r){window._eai_r=require,window._eai_d=define},42458:(e,r,t)=>{e.exports=function(){_eai_d
13
+ e.exports=require("ember-tracked-storage-polyfill")},17809:()=>{},86625:()=>{},72006:(e,r,t)=>{e.exports=function(){var e=_eai_d,r=_eai_r
14
+ function n(e){return e&&e.__esModule?e:Object.assign({default:e},e)}window.emberAutoImportDynamic=function(e){return 1===arguments.length?r("_eai_dyn_"+e):r("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return r("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))},e("@sentry/browser",EAI_DISCOVERED_EXTERNALS("@sentry/browser"),(function(){return n(t(51294))})),e("@sentry/core",EAI_DISCOVERED_EXTERNALS("@sentry/core"),(function(){return n(t(16154))})),e("@sentry/integrations",EAI_DISCOVERED_EXTERNALS("@sentry/integrations"),(function(){return n(t(20080))})),e("@sentry/replay",EAI_DISCOVERED_EXTERNALS("@sentry/replay"),(function(){return n(t(51633))})),e("@sentry/utils",EAI_DISCOVERED_EXTERNALS("@sentry/utils"),(function(){return n(t(88414))})),e("@tryghost/color-utils",EAI_DISCOVERED_EXTERNALS("@tryghost/color-utils"),(function(){return n(t(86797))})),e("@tryghost/kg-clean-basic-html",EAI_DISCOVERED_EXTERNALS("@tryghost/kg-clean-basic-html"),(function(){return n(t(3414))})),e("@tryghost/kg-converters",EAI_DISCOVERED_EXTERNALS("@tryghost/kg-converters"),(function(){return n(t(23075))})),e("@tryghost/limit-service",EAI_DISCOVERED_EXTERNALS("@tryghost/limit-service"),(function(){return n(t(55983))})),e("@tryghost/members-csv/lib/unparse",EAI_DISCOVERED_EXTERNALS("@tryghost/members-csv/lib/unparse"),(function(){return n(t(9589))})),e("@tryghost/nql",EAI_DISCOVERED_EXTERNALS("@tryghost/nql"),(function(){return n(t(39365))})),e("@tryghost/nql-lang",EAI_DISCOVERED_EXTERNALS("@tryghost/nql-lang"),(function(){return n(t(716))})),e("@tryghost/string",EAI_DISCOVERED_EXTERNALS("@tryghost/string"),(function(){return n(t(96107))})),e("@tryghost/timezone-data",EAI_DISCOVERED_EXTERNALS("@tryghost/timezone-data"),(function(){return n(t(27019))})),e("element-resize-detector",EAI_DISCOVERED_EXTERNALS("element-resize-detector"),(function(){return n(t(29540))})),e("ember-css-transitions/modifiers/css-transition",EAI_DISCOVERED_EXTERNALS("ember-css-transitions/modifiers/css-transition"),(function(){return n(t(67946))})),e("ember-keyboard/helpers/if-key.js",EAI_DISCOVERED_EXTERNALS("ember-keyboard/helpers/if-key.js"),(function(){return n(t(10530))})),e("ember-keyboard/helpers/on-key.js",EAI_DISCOVERED_EXTERNALS("ember-keyboard/helpers/on-key.js"),(function(){return n(t(13692))})),e("ember-keyboard/modifiers/on-key.js",EAI_DISCOVERED_EXTERNALS("ember-keyboard/modifiers/on-key.js"),(function(){return n(t(40985))})),e("ember-keyboard/services/keyboard.js",EAI_DISCOVERED_EXTERNALS("ember-keyboard/services/keyboard.js"),(function(){return n(t(89697))})),e("ember-modifier",EAI_DISCOVERED_EXTERNALS("ember-modifier"),(function(){return n(t(37777))})),e("ember-moment/helpers/-base.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/-base.js"),(function(){return n(t(91366))})),e("ember-moment/helpers/is-after.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-after.js"),(function(){return n(t(91461))})),e("ember-moment/helpers/is-before.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-before.js"),(function(){return n(t(61e3))})),e("ember-moment/helpers/is-between.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-between.js"),(function(){return n(t(447))})),e("ember-moment/helpers/is-same-or-after.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-same-or-after.js"),(function(){return n(t(7916))})),e("ember-moment/helpers/is-same-or-before.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-same-or-before.js"),(function(){return n(t(54351))})),e("ember-moment/helpers/is-same.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/is-same.js"),(function(){return n(t(64193))})),e("ember-moment/helpers/moment-add.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-add.js"),(function(){return n(t(50080))})),e("ember-moment/helpers/moment-calendar.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-calendar.js"),(function(){return n(t(96625))})),e("ember-moment/helpers/moment-diff.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-diff.js"),(function(){return n(t(85340))})),e("ember-moment/helpers/moment-duration.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-duration.js"),(function(){return n(t(42967))})),e("ember-moment/helpers/moment-format.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-format.js"),(function(){return n(t(10536))})),e("ember-moment/helpers/moment-from-now.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-from-now.js"),(function(){return n(t(706))})),e("ember-moment/helpers/moment-from.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-from.js"),(function(){return n(t(50727))})),e("ember-moment/helpers/moment-subtract.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-subtract.js"),(function(){return n(t(54651))})),e("ember-moment/helpers/moment-to-date.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-to-date.js"),(function(){return n(t(81183))})),e("ember-moment/helpers/moment-to-now.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-to-now.js"),(function(){return n(t(17083))})),e("ember-moment/helpers/moment-to.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment-to.js"),(function(){return n(t(84818))})),e("ember-moment/helpers/moment.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/moment.js"),(function(){return n(t(41678))})),e("ember-moment/helpers/now.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/now.js"),(function(){return n(t(34980))})),e("ember-moment/helpers/unix.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/unix.js"),(function(){return n(t(79272))})),e("ember-moment/helpers/utc.js",EAI_DISCOVERED_EXTERNALS("ember-moment/helpers/utc.js"),(function(){return n(t(36022))})),e("ember-moment/services/moment.js",EAI_DISCOVERED_EXTERNALS("ember-moment/services/moment.js"),(function(){return n(t(39879))})),e("fast-deep-equal",EAI_DISCOVERED_EXTERNALS("fast-deep-equal"),(function(){return n(t(25383))})),e("flexsearch",EAI_DISCOVERED_EXTERNALS("flexsearch"),(function(){return n(t(37991))})),e("focus-trap",EAI_DISCOVERED_EXTERNALS("focus-trap"),(function(){return n(t(39632))})),e("intersection-observer-admin",EAI_DISCOVERED_EXTERNALS("intersection-observer-admin"),(function(){return n(t(21431))})),e("jose",EAI_DISCOVERED_EXTERNALS("jose"),(function(){return n(t(82765))})),e("moment-timezone",EAI_DISCOVERED_EXTERNALS("moment-timezone"),(function(){return n(t(41101))})),e("papaparse",EAI_DISCOVERED_EXTERNALS("papaparse"),(function(){return n(t(78695))})),e("raf-pool",EAI_DISCOVERED_EXTERNALS("raf-pool"),(function(){return n(t(60695))})),e("react",EAI_DISCOVERED_EXTERNALS("react"),(function(){return n(t(72854))})),e("react-dom",EAI_DISCOVERED_EXTERNALS("react-dom"),(function(){return n(t(95303))})),e("react-dom/client",EAI_DISCOVERED_EXTERNALS("react-dom/client"),(function(){return n(t(70816))})),e("semver/functions/coerce",EAI_DISCOVERED_EXTERNALS("semver/functions/coerce"),(function(){return n(t(18576))})),e("semver/functions/lt",EAI_DISCOVERED_EXTERNALS("semver/functions/lt"),(function(){return n(t(32817))})),e("semver/functions/parse",EAI_DISCOVERED_EXTERNALS("semver/functions/parse"),(function(){return n(t(47898))})),e("tooltip.js",EAI_DISCOVERED_EXTERNALS("tooltip.js"),(function(){return n(t(85557))})),e("tracked-built-ins",EAI_DISCOVERED_EXTERNALS("tracked-built-ins"),(function(){return n(t(77151))})),e("validator",EAI_DISCOVERED_EXTERNALS("validator"),(function(){return n(t(29119))})),e("_eai_dyn_@sentry/browser",[],(function(){return Promise.resolve().then(t.bind(t,51294))}))}()},44579:function(e,r){window._eai_r=require,window._eai_d=define},98600:(e,r,t)=>{e.exports=function(){_eai_d
15
15
  var e=_eai_r
16
- window.emberAutoImportDynamic=function(r){return 1===arguments.length?e("_eai_dyn_"+r):e("_eai_dynt_"+r)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(r){return e("_eai_sync_"+r)(Array.prototype.slice.call(arguments,1))},t(88256)}()}},t={}
16
+ window.emberAutoImportDynamic=function(r){return 1===arguments.length?e("_eai_dyn_"+r):e("_eai_dynt_"+r)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(r){return e("_eai_sync_"+r)(Array.prototype.slice.call(arguments,1))},t(72006)}()}},t={}
17
17
  function n(e){var s=t[e]
18
18
  if(void 0!==s)return s.exports
19
19
  var o=t[e]={id:e,loaded:!1,exports:{}}
@@ -30,8 +30,8 @@ var r=(r,t)=>{var s,o,[m,i,E]=t,a=0
30
30
  if(m.some((r=>0!==e[r]))){for(s in i)n.o(i,s)&&(n.m[s]=i[s])
31
31
  if(E)var u=E(n)}for(r&&r(t);a<m.length;a++)o=m[a],n.o(e,o)&&e[o]&&e[o][0](),e[o]=0
32
32
  return n.O(u)},t=globalThis.webpackChunk_ember_auto_import_=globalThis.webpackChunk_ember_auto_import_||[]
33
- t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),n.O(void 0,[42],(()=>n(n.s=60381)))
34
- var s=n.O(void 0,[42],(()=>n(n.s=42458)))
33
+ t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),n.O(void 0,[42],(()=>n(n.s=44579)))
34
+ var s=n.O(void 0,[42],(()=>n(n.s=98600)))
35
35
  s=n.O(s),__ember_auto_import__=s})()
36
36
 
37
- //# sourceMappingURL=chunk.582.5ec6b0a101a25ad210d8.map
37
+ //# sourceMappingURL=chunk.582.0378a51f97e57bab3e99.map
@@ -58,7 +58,7 @@
58
58
 
59
59
  <script src="assets/vendor-eb806b4d193377b9b4bbf885840bfdc2.js"></script>
60
60
  <script src="assets/chunk.42.90f279da5ca389af68b9.js"></script>
61
- <script src="assets/chunk.524.88e372a782fa17c3d612.js"></script>
61
+ <script src="assets/chunk.524.9bab7936eef350e7fa99.js"></script>
62
62
  <script src="assets/ghost-7998cfd04d4b790bc8f7325d835775cb.js"></script>
63
63
  </body>
64
64
  </html>
@@ -3,6 +3,8 @@ const url = require('url');
3
3
  const members = require('../../../../server/services/members');
4
4
  const urlUtils = require('../../../../shared/url-utils');
5
5
  const logging = require('@tryghost/logging');
6
+ const settingsHelpers = require('../../../../server/services/settings-helpers');
7
+ const crypto = require('crypto');
6
8
 
7
9
  module.exports = async function unsubscribeController(req, res) {
8
10
  debug('unsubscribeController');
@@ -19,6 +21,17 @@ module.exports = async function unsubscribeController(req, res) {
19
21
 
20
22
  // Do an actual unsubscribe
21
23
  try {
24
+ if (!query.key) {
25
+ logging.warn('[List-Unsubscribe] Unsubscribe failed due to missing verification key for ' + query.uuid);
26
+ return res.status(400).end();
27
+ }
28
+ const membersKey = settingsHelpers.getMembersValidationKey();
29
+ const memberHmac = crypto.createHmac('sha256', membersKey).update(query.uuid).digest('hex');
30
+ if (memberHmac !== query.key) {
31
+ logging.warn('[List-Unsubscribe] Unsubscribe failed due to invalid key for ' + query.uuid);
32
+ return res.status(400).end();
33
+ }
34
+
22
35
  const member = await members.api.members.get({uuid: query.uuid}, {withRelated: ['newsletters']});
23
36
  if (member) {
24
37
  if (query.comments) {
@@ -60,6 +73,9 @@ module.exports = async function unsubscribeController(req, res) {
60
73
  if (query.comments) {
61
74
  redirectUrl.searchParams.append('comments', query.comments);
62
75
  }
76
+ if (query.key) {
77
+ redirectUrl.searchParams.append('key', query.key);
78
+ }
63
79
  redirectUrl.searchParams.append('action', 'unsubscribe');
64
80
 
65
81
  return res.redirect(302, redirectUrl.href);
@@ -15,10 +15,12 @@ const tpl = require('@tryghost/tpl');
15
15
  const onHeaders = require('on-headers');
16
16
  const tiersService = require('../tiers/service');
17
17
  const config = require('../../../shared/config');
18
+ const settingsHelpers = require('../settings-helpers');
18
19
 
19
20
  const messages = {
20
21
  missingUuid: 'Missing uuid.',
21
- invalidUuid: 'Invalid uuid.'
22
+ invalidUuid: 'Invalid uuid.',
23
+ invalidKey: 'Invalid key.'
22
24
  };
23
25
 
24
26
  const getFreeTier = async function getFreeTier() {
@@ -97,7 +99,7 @@ const loadMemberSession = async function loadMemberSession(req, res, next) {
97
99
  };
98
100
 
99
101
  /**
100
- * Require member authentication, and make it possible to authenticate via uuid.
102
+ * Require member authentication, and make it possible to authenticate via uuid + hashed key.
101
103
  * You can chain this after loadMemberSession to make it possible to authenticate via both the uuid and the session.
102
104
  */
103
105
  const authMemberByUuid = async function authMemberByUuid(req, res, next) {
@@ -114,6 +116,22 @@ const authMemberByUuid = async function authMemberByUuid(req, res, next) {
114
116
  });
115
117
  }
116
118
 
119
+ const key = req.query.key;
120
+ if (!key) {
121
+ throw new errors.UnauthorizedError({
122
+ message: tpl(messages.invalidKey)
123
+ });
124
+ }
125
+
126
+ // the request key is a hashed value from the member uuid and the members validation key so we can verify the source
127
+ // (only Ghost should be able to generate the key)
128
+ const memberHmac = crypto.createHmac('sha256', settingsHelpers.getMembersValidationKey()).update(uuid).digest('hex');
129
+ if (memberHmac !== key) {
130
+ throw new errors.UnauthorizedError({
131
+ message: tpl(messages.invalidKey)
132
+ });
133
+ }
134
+
117
135
  const member = await membersService.api.memberBREADService.read({uuid});
118
136
  if (!member) {
119
137
  throw new errors.UnauthorizedError({
@@ -193,25 +211,14 @@ const deleteSuppression = async function deleteSuppression(req, res) {
193
211
 
194
212
  const getMemberNewsletters = async function getMemberNewsletters(req, res) {
195
213
  try {
196
- const memberUuid = req.query.uuid;
197
-
198
- if (!memberUuid) {
199
- res.writeHead(400);
200
- return res.end('Invalid member uuid');
201
- }
202
-
203
- const memberData = await membersService.api.members.get({
204
- uuid: memberUuid
205
- }, {
206
- withRelated: ['newsletters']
207
- });
214
+ const memberData = req.member; // validation assumed
208
215
 
209
216
  if (!memberData) {
210
217
  res.writeHead(404);
211
218
  return res.end('Email address not found.');
212
219
  }
213
220
 
214
- const data = _.pick(memberData.toJSON(), 'uuid', 'email', 'name', 'newsletters', 'enable_comment_notifications', 'status');
221
+ const data = _.pick(memberData, 'uuid', 'email', 'name', 'newsletters', 'enable_comment_notifications', 'status');
215
222
 
216
223
  if (data.newsletters) {
217
224
  data.newsletters = formatNewsletterResponse(data.newsletters);
@@ -226,23 +233,15 @@ const getMemberNewsletters = async function getMemberNewsletters(req, res) {
226
233
 
227
234
  const updateMemberNewsletters = async function updateMemberNewsletters(req, res) {
228
235
  try {
229
- const memberUuid = req.query.uuid;
230
- if (!memberUuid) {
231
- res.writeHead(400);
232
- return res.end('Invalid member uuid');
233
- }
234
-
235
- const data = _.pick(req.body, 'newsletters', 'enable_comment_notifications');
236
- const memberData = await membersService.api.members.get({
237
- uuid: memberUuid
238
- });
236
+ const memberData = req.member; // validation assumed
239
237
  if (!memberData) {
240
238
  res.writeHead(404);
241
239
  return res.end('Email address not found.');
242
240
  }
243
241
 
242
+ const data = _.pick(req.body, 'newsletters', 'enable_comment_notifications');
244
243
  const options = {
245
- id: memberData.get('id'),
244
+ id: memberData.id,
246
245
  withRelated: ['newsletters']
247
246
  };
248
247
 
@@ -106,6 +106,16 @@ class SettingsHelpers {
106
106
  return domain;
107
107
  }
108
108
 
109
+ /**
110
+ * Retrieves the member validation key from the settings cache. The intent is for this key to be used where member
111
+ * auth is not required. For example, unsubscribe links in emails, which are required to be one-click unsubscribe.
112
+ *
113
+ * @returns {string} The member validation key.
114
+ */
115
+ getMembersValidationKey() {
116
+ return this.settingsCache.get('members_email_auth_secret');
117
+ }
118
+
109
119
  getMembersSupportAddress() {
110
120
  let supportAddress = this.settingsCache.get('members_support_address');
111
121
 
@@ -40,9 +40,16 @@ module.exports = function setupMembersApp() {
40
40
  // Initializes members specific routes as well as assigns members specific data to the req/res objects
41
41
  // We don't want to add global bodyParser middleware as that interferes with stripe webhook requests on - `/webhooks`.
42
42
 
43
- // Manage newsletter subscription via unsubscribe link
44
- membersApp.get('/api/member/newsletters', middleware.getMemberNewsletters);
45
- membersApp.put('/api/member/newsletters', bodyParser.json({limit: '50mb'}), middleware.updateMemberNewsletters);
43
+ // Manage newsletter subscription via unsubscribe link - these should be authenticated by uuid and hashed key
44
+ membersApp.get('/api/member/newsletters',
45
+ middleware.authMemberByUuid,
46
+ middleware.getMemberNewsletters
47
+ );
48
+ membersApp.put('/api/member/newsletters',
49
+ bodyParser.json({limit: '50mb'}),
50
+ middleware.authMemberByUuid,
51
+ middleware.updateMemberNewsletters
52
+ );
46
53
 
47
54
  // Get and update member data
48
55
  // Caching members content is an experimental feature
@@ -182,7 +182,7 @@
182
182
  },
183
183
  "portal": {
184
184
  "url": "https://cdn.jsdelivr.net/ghost/portal@~{version}/umd/portal.min.js",
185
- "version": "2.38"
185
+ "version": "2.39"
186
186
  },
187
187
  "sodoSearch": {
188
188
  "url": "https://cdn.jsdelivr.net/ghost/sodo-search@~{version}/umd/sodo-search.min.js",
@@ -35,4 +35,4 @@
35
35
  "maxAge": 0
36
36
  }
37
37
  }
38
- }
38
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "5.89.4",
3
+ "version": "5.89.5",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -69,44 +69,44 @@
69
69
  "@opentelemetry/sdk-trace-node": "1.25.1",
70
70
  "@sentry/node": "7.119.0",
71
71
  "@tryghost/adapter-base-cache": "0.1.12",
72
- "@tryghost/adapter-cache-redis": "file:components/tryghost-adapter-cache-redis-5.89.4.tgz",
73
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.89.4.tgz",
72
+ "@tryghost/adapter-cache-redis": "file:components/tryghost-adapter-cache-redis-5.89.5.tgz",
73
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.89.5.tgz",
74
74
  "@tryghost/admin-api-schema": "4.5.5",
75
- "@tryghost/announcement-bar-settings": "file:components/tryghost-announcement-bar-settings-5.89.4.tgz",
76
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.89.4.tgz",
77
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.89.4.tgz",
78
- "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.89.4.tgz",
75
+ "@tryghost/announcement-bar-settings": "file:components/tryghost-announcement-bar-settings-5.89.5.tgz",
76
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.89.5.tgz",
77
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.89.5.tgz",
78
+ "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.89.5.tgz",
79
79
  "@tryghost/bookshelf-plugins": "0.6.21",
80
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.89.4.tgz",
81
- "@tryghost/collections": "file:components/tryghost-collections-5.89.4.tgz",
80
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.89.5.tgz",
81
+ "@tryghost/collections": "file:components/tryghost-collections-5.89.5.tgz",
82
82
  "@tryghost/color-utils": "0.2.2",
83
83
  "@tryghost/config-url-helpers": "1.0.12",
84
- "@tryghost/constants": "file:components/tryghost-constants-5.89.4.tgz",
85
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.89.4.tgz",
86
- "@tryghost/data-generator": "file:components/tryghost-data-generator-5.89.4.tgz",
84
+ "@tryghost/constants": "file:components/tryghost-constants-5.89.5.tgz",
85
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.89.5.tgz",
86
+ "@tryghost/data-generator": "file:components/tryghost-data-generator-5.89.5.tgz",
87
87
  "@tryghost/database-info": "0.3.27",
88
88
  "@tryghost/debug": "0.1.32",
89
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.89.4.tgz",
90
- "@tryghost/donations": "file:components/tryghost-donations-5.89.4.tgz",
91
- "@tryghost/dynamic-routing-events": "file:components/tryghost-dynamic-routing-events-5.89.4.tgz",
92
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.89.4.tgz",
93
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.89.4.tgz",
94
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.89.4.tgz",
89
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.89.5.tgz",
90
+ "@tryghost/donations": "file:components/tryghost-donations-5.89.5.tgz",
91
+ "@tryghost/dynamic-routing-events": "file:components/tryghost-dynamic-routing-events-5.89.5.tgz",
92
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.89.5.tgz",
93
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.89.5.tgz",
94
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.89.5.tgz",
95
95
  "@tryghost/email-mock-receiver": "0.3.8",
96
- "@tryghost/email-service": "file:components/tryghost-email-service-5.89.4.tgz",
97
- "@tryghost/email-suppression-list": "file:components/tryghost-email-suppression-list-5.89.4.tgz",
96
+ "@tryghost/email-service": "file:components/tryghost-email-service-5.89.5.tgz",
97
+ "@tryghost/email-suppression-list": "file:components/tryghost-email-suppression-list-5.89.5.tgz",
98
98
  "@tryghost/errors": "1.3.5",
99
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.89.4.tgz",
100
- "@tryghost/external-media-inliner": "file:components/tryghost-external-media-inliner-5.89.4.tgz",
101
- "@tryghost/ghost": "file:components/tryghost-ghost-5.89.4.tgz",
99
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.89.5.tgz",
100
+ "@tryghost/external-media-inliner": "file:components/tryghost-external-media-inliner-5.89.5.tgz",
101
+ "@tryghost/ghost": "file:components/tryghost-ghost-5.89.5.tgz",
102
102
  "@tryghost/helpers": "1.1.90",
103
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.89.4.tgz",
103
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.89.5.tgz",
104
104
  "@tryghost/http-cache-utils": "0.1.17",
105
- "@tryghost/i18n": "file:components/tryghost-i18n-5.89.4.tgz",
105
+ "@tryghost/i18n": "file:components/tryghost-i18n-5.89.5.tgz",
106
106
  "@tryghost/image-transform": "1.3.0",
107
- "@tryghost/importer-handler-content-files": "file:components/tryghost-importer-handler-content-files-5.89.4.tgz",
108
- "@tryghost/importer-revue": "file:components/tryghost-importer-revue-5.89.4.tgz",
109
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.89.4.tgz",
107
+ "@tryghost/importer-handler-content-files": "file:components/tryghost-importer-handler-content-files-5.89.5.tgz",
108
+ "@tryghost/importer-revue": "file:components/tryghost-importer-revue-5.89.5.tgz",
109
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.89.5.tgz",
110
110
  "@tryghost/kg-card-factory": "5.0.5",
111
111
  "@tryghost/kg-converters": "1.0.6",
112
112
  "@tryghost/kg-default-atoms": "5.0.3",
@@ -116,59 +116,59 @@
116
116
  "@tryghost/kg-lexical-html-renderer": "1.1.18",
117
117
  "@tryghost/kg-mobiledoc-html-renderer": "7.0.6",
118
118
  "@tryghost/limit-service": "1.2.14",
119
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.89.4.tgz",
120
- "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.89.4.tgz",
121
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.89.4.tgz",
119
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.89.5.tgz",
120
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.89.5.tgz",
121
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.89.5.tgz",
122
122
  "@tryghost/logging": "2.4.18",
123
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.89.4.tgz",
124
- "@tryghost/mail-events": "file:components/tryghost-mail-events-5.89.4.tgz",
125
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.89.4.tgz",
126
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.89.4.tgz",
127
- "@tryghost/member-events": "file:components/tryghost-member-events-5.89.4.tgz",
128
- "@tryghost/members-api": "file:components/tryghost-members-api-5.89.4.tgz",
129
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.89.4.tgz",
130
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.89.4.tgz",
131
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.89.4.tgz",
132
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.89.4.tgz",
133
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.89.4.tgz",
134
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.89.4.tgz",
135
- "@tryghost/mentions-email-report": "file:components/tryghost-mentions-email-report-5.89.4.tgz",
123
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.89.5.tgz",
124
+ "@tryghost/mail-events": "file:components/tryghost-mail-events-5.89.5.tgz",
125
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.89.5.tgz",
126
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.89.5.tgz",
127
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.89.5.tgz",
128
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.89.5.tgz",
129
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.89.5.tgz",
130
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.89.5.tgz",
131
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.89.5.tgz",
132
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.89.5.tgz",
133
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.89.5.tgz",
134
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.89.5.tgz",
135
+ "@tryghost/mentions-email-report": "file:components/tryghost-mentions-email-report-5.89.5.tgz",
136
136
  "@tryghost/metrics": "1.0.34",
137
- "@tryghost/milestones": "file:components/tryghost-milestones-5.89.4.tgz",
138
- "@tryghost/minifier": "file:components/tryghost-minifier-5.89.4.tgz",
139
- "@tryghost/model-to-domain-event-interceptor": "file:components/tryghost-model-to-domain-event-interceptor-5.89.4.tgz",
140
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.89.4.tgz",
141
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.89.4.tgz",
142
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.89.4.tgz",
143
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.89.4.tgz",
144
- "@tryghost/mw-version-match": "file:components/tryghost-mw-version-match-5.89.4.tgz",
145
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.89.4.tgz",
137
+ "@tryghost/milestones": "file:components/tryghost-milestones-5.89.5.tgz",
138
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.89.5.tgz",
139
+ "@tryghost/model-to-domain-event-interceptor": "file:components/tryghost-model-to-domain-event-interceptor-5.89.5.tgz",
140
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.89.5.tgz",
141
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.89.5.tgz",
142
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.89.5.tgz",
143
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.89.5.tgz",
144
+ "@tryghost/mw-version-match": "file:components/tryghost-mw-version-match-5.89.5.tgz",
145
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.89.5.tgz",
146
146
  "@tryghost/nodemailer": "0.3.45",
147
147
  "@tryghost/nql": "0.12.3",
148
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.89.4.tgz",
149
- "@tryghost/package-json": "file:components/tryghost-package-json-5.89.4.tgz",
150
- "@tryghost/post-revisions": "file:components/tryghost-post-revisions-5.89.4.tgz",
151
- "@tryghost/posts-service": "file:components/tryghost-posts-service-5.89.4.tgz",
148
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.89.5.tgz",
149
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.89.5.tgz",
150
+ "@tryghost/post-revisions": "file:components/tryghost-post-revisions-5.89.5.tgz",
151
+ "@tryghost/posts-service": "file:components/tryghost-posts-service-5.89.5.tgz",
152
152
  "@tryghost/pretty-cli": "1.2.44",
153
153
  "@tryghost/promise": "0.3.12",
154
- "@tryghost/recommendations": "file:components/tryghost-recommendations-5.89.4.tgz",
154
+ "@tryghost/recommendations": "file:components/tryghost-recommendations-5.89.5.tgz",
155
155
  "@tryghost/request": "1.0.8",
156
- "@tryghost/security": "file:components/tryghost-security-5.89.4.tgz",
157
- "@tryghost/session-service": "file:components/tryghost-session-service-5.89.4.tgz",
158
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.89.4.tgz",
159
- "@tryghost/slack-notifications": "file:components/tryghost-slack-notifications-5.89.4.tgz",
156
+ "@tryghost/security": "file:components/tryghost-security-5.89.5.tgz",
157
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.89.5.tgz",
158
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.89.5.tgz",
159
+ "@tryghost/slack-notifications": "file:components/tryghost-slack-notifications-5.89.5.tgz",
160
160
  "@tryghost/social-urls": "0.1.43",
161
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.89.4.tgz",
162
- "@tryghost/stats-service": "file:components/tryghost-stats-service-5.89.4.tgz",
161
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.89.5.tgz",
162
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.89.5.tgz",
163
163
  "@tryghost/string": "0.2.12",
164
- "@tryghost/tiers": "file:components/tryghost-tiers-5.89.4.tgz",
164
+ "@tryghost/tiers": "file:components/tryghost-tiers-5.89.5.tgz",
165
165
  "@tryghost/tpl": "0.1.32",
166
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.89.4.tgz",
166
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.89.5.tgz",
167
167
  "@tryghost/url-utils": "4.4.8",
168
168
  "@tryghost/validator": "0.2.14",
169
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.89.4.tgz",
169
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.89.5.tgz",
170
170
  "@tryghost/version": "0.1.30",
171
- "@tryghost/webmentions": "file:components/tryghost-webmentions-5.89.4.tgz",
171
+ "@tryghost/webmentions": "file:components/tryghost-webmentions-5.89.5.tgz",
172
172
  "@tryghost/zip": "1.1.46",
173
173
  "amperize": "0.6.1",
174
174
  "body-parser": "1.20.2",
@@ -270,85 +270,85 @@
270
270
  "jackspeak": "2.1.1",
271
271
  "moment": "2.24.0",
272
272
  "moment-timezone": "0.5.45",
273
- "@tryghost/adapter-cache-memory-ttl": "file:components/tryghost-adapter-cache-memory-ttl-5.89.4.tgz",
274
- "@tryghost/adapter-cache-redis": "file:components/tryghost-adapter-cache-redis-5.89.4.tgz",
275
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.89.4.tgz",
276
- "@tryghost/announcement-bar-settings": "file:components/tryghost-announcement-bar-settings-5.89.4.tgz",
277
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.89.4.tgz",
278
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.89.4.tgz",
279
- "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.89.4.tgz",
280
- "@tryghost/bookshelf-repository": "file:components/tryghost-bookshelf-repository-5.89.4.tgz",
281
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.89.4.tgz",
282
- "@tryghost/collections": "file:components/tryghost-collections-5.89.4.tgz",
283
- "@tryghost/constants": "file:components/tryghost-constants-5.89.4.tgz",
284
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.89.4.tgz",
285
- "@tryghost/data-generator": "file:components/tryghost-data-generator-5.89.4.tgz",
286
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.89.4.tgz",
287
- "@tryghost/donations": "file:components/tryghost-donations-5.89.4.tgz",
288
- "@tryghost/dynamic-routing-events": "file:components/tryghost-dynamic-routing-events-5.89.4.tgz",
289
- "@tryghost/email-addresses": "file:components/tryghost-email-addresses-5.89.4.tgz",
290
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.89.4.tgz",
291
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.89.4.tgz",
292
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.89.4.tgz",
293
- "@tryghost/email-events": "file:components/tryghost-email-events-5.89.4.tgz",
294
- "@tryghost/email-service": "file:components/tryghost-email-service-5.89.4.tgz",
295
- "@tryghost/email-suppression-list": "file:components/tryghost-email-suppression-list-5.89.4.tgz",
296
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.89.4.tgz",
297
- "@tryghost/external-media-inliner": "file:components/tryghost-external-media-inliner-5.89.4.tgz",
298
- "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.89.4.tgz",
299
- "@tryghost/ghost": "file:components/tryghost-ghost-5.89.4.tgz",
300
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.89.4.tgz",
301
- "@tryghost/i18n": "file:components/tryghost-i18n-5.89.4.tgz",
302
- "@tryghost/importer-handler-content-files": "file:components/tryghost-importer-handler-content-files-5.89.4.tgz",
303
- "@tryghost/importer-revue": "file:components/tryghost-importer-revue-5.89.4.tgz",
304
- "@tryghost/in-memory-repository": "file:components/tryghost-in-memory-repository-5.89.4.tgz",
305
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.89.4.tgz",
306
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.89.4.tgz",
307
- "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.89.4.tgz",
308
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.89.4.tgz",
309
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.89.4.tgz",
310
- "@tryghost/mail-events": "file:components/tryghost-mail-events-5.89.4.tgz",
311
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.89.4.tgz",
312
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.89.4.tgz",
313
- "@tryghost/member-events": "file:components/tryghost-member-events-5.89.4.tgz",
314
- "@tryghost/members-api": "file:components/tryghost-members-api-5.89.4.tgz",
315
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.89.4.tgz",
316
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.89.4.tgz",
317
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.89.4.tgz",
318
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.89.4.tgz",
319
- "@tryghost/mentions-email-report": "file:components/tryghost-mentions-email-report-5.89.4.tgz",
320
- "@tryghost/milestones": "file:components/tryghost-milestones-5.89.4.tgz",
321
- "@tryghost/minifier": "file:components/tryghost-minifier-5.89.4.tgz",
322
- "@tryghost/model-to-domain-event-interceptor": "file:components/tryghost-model-to-domain-event-interceptor-5.89.4.tgz",
323
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.89.4.tgz",
324
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.89.4.tgz",
325
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.89.4.tgz",
326
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.89.4.tgz",
327
- "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.89.4.tgz",
328
- "@tryghost/mw-version-match": "file:components/tryghost-mw-version-match-5.89.4.tgz",
329
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.89.4.tgz",
330
- "@tryghost/nql-filter-expansions": "file:components/tryghost-nql-filter-expansions-5.89.4.tgz",
331
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.89.4.tgz",
332
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.89.4.tgz",
333
- "@tryghost/package-json": "file:components/tryghost-package-json-5.89.4.tgz",
334
- "@tryghost/members-payments": "file:components/tryghost-members-payments-5.89.4.tgz",
335
- "@tryghost/post-events": "file:components/tryghost-post-events-5.89.4.tgz",
336
- "@tryghost/post-revisions": "file:components/tryghost-post-revisions-5.89.4.tgz",
337
- "@tryghost/posts-service": "file:components/tryghost-posts-service-5.89.4.tgz",
338
- "@tryghost/recommendations": "file:components/tryghost-recommendations-5.89.4.tgz",
339
- "@tryghost/referrers": "file:components/tryghost-referrers-5.89.4.tgz",
340
- "@tryghost/security": "file:components/tryghost-security-5.89.4.tgz",
341
- "@tryghost/session-service": "file:components/tryghost-session-service-5.89.4.tgz",
342
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.89.4.tgz",
343
- "@tryghost/slack-notifications": "file:components/tryghost-slack-notifications-5.89.4.tgz",
344
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.89.4.tgz",
345
- "@tryghost/stats-service": "file:components/tryghost-stats-service-5.89.4.tgz",
346
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.89.4.tgz",
347
- "@tryghost/tiers": "file:components/tryghost-tiers-5.89.4.tgz",
348
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.89.4.tgz",
349
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.89.4.tgz",
350
- "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.89.4.tgz",
351
- "@tryghost/webmentions": "file:components/tryghost-webmentions-5.89.4.tgz"
273
+ "@tryghost/adapter-cache-memory-ttl": "file:components/tryghost-adapter-cache-memory-ttl-5.89.5.tgz",
274
+ "@tryghost/adapter-cache-redis": "file:components/tryghost-adapter-cache-redis-5.89.5.tgz",
275
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.89.5.tgz",
276
+ "@tryghost/announcement-bar-settings": "file:components/tryghost-announcement-bar-settings-5.89.5.tgz",
277
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.89.5.tgz",
278
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.89.5.tgz",
279
+ "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.89.5.tgz",
280
+ "@tryghost/bookshelf-repository": "file:components/tryghost-bookshelf-repository-5.89.5.tgz",
281
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.89.5.tgz",
282
+ "@tryghost/collections": "file:components/tryghost-collections-5.89.5.tgz",
283
+ "@tryghost/constants": "file:components/tryghost-constants-5.89.5.tgz",
284
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.89.5.tgz",
285
+ "@tryghost/data-generator": "file:components/tryghost-data-generator-5.89.5.tgz",
286
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.89.5.tgz",
287
+ "@tryghost/donations": "file:components/tryghost-donations-5.89.5.tgz",
288
+ "@tryghost/dynamic-routing-events": "file:components/tryghost-dynamic-routing-events-5.89.5.tgz",
289
+ "@tryghost/email-addresses": "file:components/tryghost-email-addresses-5.89.5.tgz",
290
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.89.5.tgz",
291
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.89.5.tgz",
292
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.89.5.tgz",
293
+ "@tryghost/email-events": "file:components/tryghost-email-events-5.89.5.tgz",
294
+ "@tryghost/email-service": "file:components/tryghost-email-service-5.89.5.tgz",
295
+ "@tryghost/email-suppression-list": "file:components/tryghost-email-suppression-list-5.89.5.tgz",
296
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.89.5.tgz",
297
+ "@tryghost/external-media-inliner": "file:components/tryghost-external-media-inliner-5.89.5.tgz",
298
+ "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.89.5.tgz",
299
+ "@tryghost/ghost": "file:components/tryghost-ghost-5.89.5.tgz",
300
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.89.5.tgz",
301
+ "@tryghost/i18n": "file:components/tryghost-i18n-5.89.5.tgz",
302
+ "@tryghost/importer-handler-content-files": "file:components/tryghost-importer-handler-content-files-5.89.5.tgz",
303
+ "@tryghost/importer-revue": "file:components/tryghost-importer-revue-5.89.5.tgz",
304
+ "@tryghost/in-memory-repository": "file:components/tryghost-in-memory-repository-5.89.5.tgz",
305
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.89.5.tgz",
306
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.89.5.tgz",
307
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.89.5.tgz",
308
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.89.5.tgz",
309
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.89.5.tgz",
310
+ "@tryghost/mail-events": "file:components/tryghost-mail-events-5.89.5.tgz",
311
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.89.5.tgz",
312
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.89.5.tgz",
313
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.89.5.tgz",
314
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.89.5.tgz",
315
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.89.5.tgz",
316
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.89.5.tgz",
317
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.89.5.tgz",
318
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.89.5.tgz",
319
+ "@tryghost/mentions-email-report": "file:components/tryghost-mentions-email-report-5.89.5.tgz",
320
+ "@tryghost/milestones": "file:components/tryghost-milestones-5.89.5.tgz",
321
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.89.5.tgz",
322
+ "@tryghost/model-to-domain-event-interceptor": "file:components/tryghost-model-to-domain-event-interceptor-5.89.5.tgz",
323
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.89.5.tgz",
324
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.89.5.tgz",
325
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.89.5.tgz",
326
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.89.5.tgz",
327
+ "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.89.5.tgz",
328
+ "@tryghost/mw-version-match": "file:components/tryghost-mw-version-match-5.89.5.tgz",
329
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.89.5.tgz",
330
+ "@tryghost/nql-filter-expansions": "file:components/tryghost-nql-filter-expansions-5.89.5.tgz",
331
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.89.5.tgz",
332
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.89.5.tgz",
333
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.89.5.tgz",
334
+ "@tryghost/members-payments": "file:components/tryghost-members-payments-5.89.5.tgz",
335
+ "@tryghost/post-events": "file:components/tryghost-post-events-5.89.5.tgz",
336
+ "@tryghost/post-revisions": "file:components/tryghost-post-revisions-5.89.5.tgz",
337
+ "@tryghost/posts-service": "file:components/tryghost-posts-service-5.89.5.tgz",
338
+ "@tryghost/recommendations": "file:components/tryghost-recommendations-5.89.5.tgz",
339
+ "@tryghost/referrers": "file:components/tryghost-referrers-5.89.5.tgz",
340
+ "@tryghost/security": "file:components/tryghost-security-5.89.5.tgz",
341
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.89.5.tgz",
342
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.89.5.tgz",
343
+ "@tryghost/slack-notifications": "file:components/tryghost-slack-notifications-5.89.5.tgz",
344
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.89.5.tgz",
345
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.89.5.tgz",
346
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.89.5.tgz",
347
+ "@tryghost/tiers": "file:components/tryghost-tiers-5.89.5.tgz",
348
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.89.5.tgz",
349
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.89.5.tgz",
350
+ "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.89.5.tgz",
351
+ "@tryghost/webmentions": "file:components/tryghost-webmentions-5.89.5.tgz"
352
352
  },
353
353
  "nx": {
354
354
  "targets": {