ghost 4.22.3 → 4.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.c8rc.json +24 -0
- package/.eslintrc.js +39 -0
- package/Gruntfile.js +0 -1
- package/content/public/README.md +3 -0
- package/content/themes/casper/assets/built/casper.js +1 -1
- package/content/themes/casper/assets/built/casper.js.map +1 -1
- package/content/themes/casper/assets/built/global.css +1 -1
- package/content/themes/casper/assets/built/global.css.map +1 -1
- package/content/themes/casper/assets/built/screen.css +1 -1
- package/content/themes/casper/assets/built/screen.css.map +1 -1
- package/content/themes/casper/assets/css/global.css +6 -1
- package/content/themes/casper/assets/css/screen.css +32 -216
- package/content/themes/casper/default.hbs +2 -2
- package/content/themes/casper/package.json +3 -2
- package/content/themes/casper/post.hbs +1 -1
- package/content/themes/casper/yarn.lock +173 -123
- package/core/app.js +12 -1
- package/core/boot.js +47 -28
- package/core/bridge.js +10 -10
- package/core/built/assets/{chunk.3.324fd0cc598c73650219.js → chunk.3.8f95b516d88ff4eec64c.js} +18 -18
- package/core/built/assets/ghost-dark-d690e732e17ffc794e2e59c1467ca282.css +1 -0
- package/core/built/assets/ghost.min-043bb7480a0810109b130f13b2a4235e.css +1 -0
- package/core/built/assets/{ghost.min-7da921f6c6cac3fe10da1ba104575440.js → ghost.min-bc72f685c1c9adc9885925c1412435a5.js} +563 -605
- package/core/built/assets/icons/audio-upload.svg +8 -0
- package/core/built/assets/icons/powered-by-tenor.svg +35 -0
- package/core/built/assets/icons/tenor.svg +7 -0
- package/core/built/assets/{vendor.min-413f887176a041e6dbf88214ca9a7481.js → vendor.min-d1234c632a54502777c34e50752fa3fc.js} +4622 -3631
- package/core/frontend/apps/amp/lib/helpers/amp_content.js +2 -2
- package/core/frontend/apps/amp/lib/views/amp.hbs +112 -0
- package/core/frontend/apps/private-blogging/index.js +1 -1
- package/core/frontend/apps/private-blogging/lib/router.js +1 -1
- package/core/frontend/services/apps/index.js +1 -1
- package/core/frontend/services/apps/loader.js +3 -3
- package/core/frontend/services/card-assets/index.js +0 -12
- package/core/frontend/services/card-assets/service.js +29 -28
- package/core/frontend/services/helpers/handlebars.js +1 -1
- package/core/frontend/services/routing/CollectionRouter.js +4 -5
- package/core/frontend/services/routing/EmailRouter.js +1 -1
- package/core/frontend/services/routing/ParentRouter.js +0 -8
- package/core/frontend/services/routing/PreviewRouter.js +1 -1
- package/core/frontend/services/routing/StaticPagesRouter.js +1 -1
- package/core/frontend/services/routing/StaticRoutesRouter.js +4 -4
- package/core/frontend/services/routing/TaxonomyRouter.js +3 -3
- package/core/frontend/services/routing/{middlewares → middleware}/index.js +0 -0
- package/core/frontend/services/routing/{middlewares → middleware}/page-param.js +0 -0
- package/core/frontend/services/routing/router-manager.js +7 -2
- package/core/frontend/services/rss/generate-feed.js +2 -1
- package/core/frontend/services/theme-engine/middleware/ensure-active-theme.js +34 -0
- package/core/frontend/services/theme-engine/middleware/index.js +6 -0
- package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +116 -0
- package/core/frontend/services/theme-engine/middleware/update-local-template-data.js +9 -0
- package/core/frontend/services/theme-engine/middleware/update-local-template-options.js +57 -0
- package/core/frontend/src/cards/css/bookmark.css +72 -47
- package/core/frontend/src/cards/css/button.css +4 -0
- package/core/frontend/src/cards/css/callout.css +40 -3
- package/core/frontend/src/cards/css/gallery.css +15 -10
- package/core/frontend/src/cards/css/nft.css +20 -11
- package/core/frontend/src/cards/css/toggle.css +58 -0
- package/core/frontend/src/cards/js/toggle.js +16 -0
- package/core/frontend/web/middleware/error-handler.js +93 -0
- package/core/frontend/web/middleware/handle-image-sizes.js +3 -6
- package/core/frontend/web/middleware/index.js +1 -0
- package/core/frontend/web/middleware/serve-public-file.js +39 -16
- package/core/frontend/web/site.js +11 -14
- package/core/server/adapters/scheduling/SchedulingDefault.js +2 -2
- package/core/server/adapters/storage/LocalStorageBase.js +2 -2
- package/core/server/api/canary/authentication.js +1 -1
- package/core/server/api/canary/db.js +2 -2
- package/core/server/api/canary/media.js +3 -2
- package/core/server/api/canary/oembed.js +16 -1
- package/core/server/api/canary/session.js +1 -1
- package/core/server/api/canary/slugs.js +1 -1
- package/core/server/api/canary/utils/permissions.js +2 -2
- package/core/server/api/canary/utils/serializers/output/config.js +2 -6
- package/core/server/api/v2/authentication.js +1 -1
- package/core/server/api/v2/db.js +2 -2
- package/core/server/api/v2/session.js +1 -1
- package/core/server/api/v2/slugs.js +1 -1
- package/core/server/api/v2/utils/permissions.js +2 -2
- package/core/server/api/v3/authentication.js +1 -1
- package/core/server/api/v3/db.js +2 -2
- package/core/server/api/v3/session.js +1 -1
- package/core/server/api/v3/slugs.js +1 -1
- package/core/server/api/v3/utils/permissions.js +2 -2
- package/core/server/data/db/connection.js +7 -0
- package/core/server/data/db/state-manager.js +4 -4
- package/core/server/data/exporter/export-filename.js +1 -1
- package/core/server/data/importer/handlers/json.js +1 -1
- package/core/server/data/importer/import-manager.js +1 -1
- package/core/server/data/importer/importers/data/base.js +1 -1
- package/core/server/data/importer/importers/data/data-importer.js +3 -3
- package/core/server/data/migrations/init/2-create-fixtures.js +3 -20
- package/core/server/data/migrations/utils.js +2 -2
- package/core/server/data/migrations/versions/1.21/1-add-contributor-role.js +5 -5
- package/core/server/data/migrations/versions/1.25/1-update-koenig-beta-html.js +1 -0
- package/core/server/data/migrations/versions/2.15/2-insert-zapier-integration.js +3 -3
- package/core/server/data/migrations/versions/2.2/3-insert-admin-integration-role.js +5 -5
- package/core/server/data/migrations/versions/2.27/1-insert-ghost-db-backup-role.js +5 -6
- package/core/server/data/migrations/versions/2.27/2-insert-db-backup-integration.js +3 -4
- package/core/server/data/migrations/versions/2.28/3-insert-ghost-scheduler-role.js +7 -7
- package/core/server/data/migrations/versions/2.28/4-insert-scheduler-integration.js +3 -3
- package/core/server/data/migrations/versions/3.1/08-add-uuid-values-to-members.js +1 -0
- package/core/server/data/migrations/versions/3.22/02-settings-key-renames.js +2 -0
- package/core/server/data/migrations/versions/3.22/05-migrate-members-subscription-settings.js +3 -0
- package/core/server/data/migrations/versions/3.22/06-migrate-stripe-connect-settings.js +2 -0
- package/core/server/data/migrations/versions/3.23/01-migrate-bulk-email-settings.js +1 -0
- package/core/server/data/migrations/versions/3.29/01-remove-duplicate-subscriptions.js +2 -0
- package/core/server/data/migrations/versions/3.29/02-remove-duplicate-customers.js +2 -0
- package/core/server/data/migrations/versions/3.38/04-populate-recipient-filter-column.js +2 -0
- package/core/server/data/migrations/versions/4.0/01-update-mobiledoc.js +2 -0
- package/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js +4 -0
- package/core/server/data/migrations/versions/4.0/06-populate-members-subscribe-events-table.js +1 -0
- package/core/server/data/migrations/versions/4.0/17-populate-members-status-events-table.js +1 -0
- package/core/server/data/migrations/versions/4.0/18-transform-urls-absolute-to-transform-ready.js +5 -0
- package/core/server/data/migrations/versions/4.0/22-solve-orphaned-webhooks.js +1 -0
- package/core/server/data/migrations/versions/4.0/23-regenerate-posts-html.js +1 -0
- package/core/server/data/migrations/versions/4.0/25-populate-members-paid-subscription-events-table.js +2 -1
- package/core/server/data/migrations/versions/4.12/02-fix-member-statuses.js +1 -0
- package/core/server/data/migrations/versions/4.14/01-fix-comped-member-statuses.js +3 -0
- package/core/server/data/migrations/versions/4.14/02-fix-free-members-status-events.js +1 -0
- package/core/server/data/migrations/versions/4.20/05-remove-not-null-constraint-from-portal-title.js +2 -0
- package/core/server/data/migrations/versions/4.23/01-truncate-offer-names.js +59 -0
- package/core/server/data/migrations/versions/4.3/04-attach-members-to-product.js +1 -0
- package/core/server/data/migrations/versions/4.4/01-restore-free-members-signup-setting-from-backup.js +1 -0
- package/core/server/data/migrations/versions/4.6/01-remove-comped-status.js +1 -0
- package/core/server/data/migrations/versions/4.8/04-migrate-show-newsletter-header-setting.js +1 -0
- package/core/server/data/migrations/versions/4.9/05-fix-missed-mobiledoc-url-transforms.js +1 -0
- package/core/server/data/migrations/versions/4.9/06-add-comped-status.js +1 -0
- package/core/server/data/migrations/versions/4.9/07-update-comped-members-status-events.js +1 -0
- package/core/server/data/schema/commands.js +2 -2
- package/core/server/data/schema/fixtures/fixture-manager.js +340 -0
- package/core/server/data/schema/fixtures/index.js +8 -2
- package/core/server/ghost-server.js +2 -2
- package/core/server/lib/image/image-size.js +2 -2
- package/core/server/models/base/listeners.js +2 -2
- package/core/server/models/member-email-change-event.js +2 -2
- package/core/server/models/member-login-event.js +2 -2
- package/core/server/models/member-paid-subscription-event.js +3 -3
- package/core/server/models/member-payment-event.js +3 -3
- package/core/server/models/member-product-event.js +6 -6
- package/core/server/models/member-status-event.js +5 -3
- package/core/server/models/member-subscribe-event.js +9 -3
- package/core/server/models/relations/authors.js +1 -1
- package/core/server/models/settings.js +1 -1
- package/core/server/services/auth/passwordreset.js +1 -1
- package/core/server/services/auth/setup.js +1 -1
- package/core/server/services/email-analytics/jobs/index.js +1 -1
- package/core/server/services/mega/mega.js +6 -4
- package/core/server/services/mega/post-email-serializer.js +5 -1
- package/core/server/services/mega/segment-parser.js +1 -2
- package/core/server/services/mega/template.js +52 -37
- package/core/server/services/members/api.js +22 -0
- package/core/server/services/members/config.js +1 -1
- package/core/server/services/members/emails/signup-paid.js +168 -0
- package/core/server/services/members/service.js +6 -2
- package/core/server/services/members/stripe-connect.js +4 -2
- package/core/server/services/nft-oembed.js +13 -22
- package/core/server/services/oembed.js +28 -24
- package/core/server/services/permissions/can-this.js +1 -1
- package/core/server/services/public-config/config.js +1 -1
- package/core/server/services/redirects/api.js +20 -25
- package/core/server/services/redirects/index.js +18 -10
- package/core/server/services/redirects/utils.js +14 -0
- package/core/server/services/redirects/validation.js +10 -0
- package/core/server/services/route-settings/default-settings-manager.js +1 -1
- package/core/server/services/route-settings/index.js +40 -17
- package/core/server/services/route-settings/route-settings.js +120 -115
- package/core/server/services/route-settings/settings-loader.js +18 -36
- package/core/server/services/route-settings/yaml-parser.js +1 -1
- package/core/server/services/slack.js +1 -1
- package/core/server/services/themes/activation-bridge.js +3 -3
- package/core/server/services/themes/storage.js +2 -2
- package/core/server/services/twitter-embed.js +80 -0
- package/core/server/services/url/LocalFileCache.js +75 -0
- package/core/server/services/url/Resources.js +8 -2
- package/core/server/services/url/UrlGenerator.js +23 -20
- package/core/server/services/url/UrlService.js +75 -63
- package/core/server/services/url/index.js +17 -3
- package/core/server/services/xmlrpc.js +2 -2
- package/core/server/web/admin/app.js +7 -10
- package/core/server/web/admin/controller.js +35 -12
- package/core/server/web/admin/middleware/redirect-admin-urls.js +15 -0
- package/core/server/web/admin/views/default-prod.html +4 -4
- package/core/server/web/admin/views/default.html +4 -4
- package/core/server/web/api/app.js +1 -1
- package/core/server/web/api/canary/admin/app.js +3 -6
- package/core/server/web/api/canary/admin/middleware.js +7 -7
- package/core/server/web/api/canary/admin/routes.js +5 -5
- package/core/server/web/api/canary/content/app.js +3 -6
- package/core/server/web/api/canary/content/middleware.js +3 -3
- package/core/server/web/api/v2/admin/app.js +3 -6
- package/core/server/web/api/v2/admin/middleware.js +7 -7
- package/core/server/web/api/v2/admin/routes.js +5 -5
- package/core/server/web/api/v2/content/app.js +3 -6
- package/core/server/web/api/v2/content/middleware.js +3 -3
- package/core/server/web/api/v3/admin/app.js +3 -6
- package/core/server/web/api/v3/admin/middleware.js +7 -7
- package/core/server/web/api/v3/admin/routes.js +5 -5
- package/core/server/web/api/v3/content/app.js +3 -6
- package/core/server/web/api/v3/content/middleware.js +3 -3
- package/core/server/web/members/app.js +6 -9
- package/core/server/web/oauth/app.js +0 -4
- package/core/server/web/parent/app.js +17 -9
- package/core/server/web/parent/frontend.js +1 -1
- package/core/server/web/shared/index.js +2 -2
- package/core/server/web/shared/{middlewares → middleware}/api/index.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/api/spam-prevention.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/brute.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/cache-control.js +0 -0
- package/core/server/web/shared/middleware/error-handler.js +224 -0
- package/core/server/web/shared/{middlewares → middleware}/index.js +0 -4
- package/core/server/web/shared/{middlewares → middleware}/pretty-urls.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/uncapitalise.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/url-redirects.js +0 -0
- package/core/shared/config/defaults.json +13 -1
- package/core/shared/config/helpers.js +42 -0
- package/core/shared/config/loader.js +1 -1
- package/core/shared/labs.js +9 -5
- package/core/shared/sentry.js +1 -1
- package/loggingrc.js +19 -20
- package/package.json +38 -37
- package/yarn.lock +1064 -892
- package/content/themes/casper/assets/js/gallery-card.js +0 -24
- package/core/built/assets/ghost-dark-39fb496d051565531062d7e047d1c0b1.css +0 -1
- package/core/built/assets/ghost.min-4207edfc1ae0a3f9f6505ca00d20b0c0.css +0 -1
- package/core/frontend/services/theme-engine/middleware.js +0 -209
- package/core/server/data/schema/fixtures/utils.js +0 -321
- package/core/server/web/parent/vhost-utils.js +0 -39
- package/core/server/web/shared/middlewares/error-handler.js +0 -329
- package/core/server/web/shared/middlewares/maintenance.js +0 -25
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
const debug = require('@tryghost/debug')('web:admin:controller');
|
|
2
|
+
const errors = require('@tryghost/errors');
|
|
3
|
+
const tpl = require('@tryghost/tpl');
|
|
2
4
|
const path = require('path');
|
|
3
5
|
const fs = require('fs');
|
|
4
6
|
const crypto = require('crypto');
|
|
5
7
|
const config = require('../../../shared/config');
|
|
6
8
|
const updateCheck = require('../../update-check');
|
|
7
9
|
|
|
10
|
+
const messages = {
|
|
11
|
+
templateError: {
|
|
12
|
+
message: 'Unable to find admin template file {templatePath}',
|
|
13
|
+
context: 'These template files are generated as part of the build process',
|
|
14
|
+
help: 'Please see {link}'
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
8
18
|
/**
|
|
9
19
|
* @description Admin controller to handle /ghost/ requests.
|
|
10
20
|
*
|
|
@@ -23,18 +33,31 @@ module.exports = function adminController(req, res) {
|
|
|
23
33
|
const templatePath = path.resolve(config.get('paths').adminViews, defaultTemplate);
|
|
24
34
|
const headers = {};
|
|
25
35
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
try {
|
|
37
|
+
// Generate our own ETag header
|
|
38
|
+
// `sendFile` by default uses filesize+lastmod date to generate an etag.
|
|
39
|
+
// That doesn't work for admin templates because the filesize doesn't change between versions
|
|
40
|
+
// and `npm pack` sets a fixed lastmod date for every file meaning the default etag never changes
|
|
41
|
+
const fileBuffer = fs.readFileSync(templatePath);
|
|
42
|
+
const hashSum = crypto.createHash('md5');
|
|
43
|
+
hashSum.update(fileBuffer);
|
|
44
|
+
headers.ETag = hashSum.digest('hex');
|
|
34
45
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
46
|
+
if (config.get('adminFrameProtection')) {
|
|
47
|
+
headers['X-Frame-Options'] = 'sameorigin';
|
|
48
|
+
}
|
|
38
49
|
|
|
39
|
-
|
|
50
|
+
res.sendFile(templatePath, {headers});
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (error.code === 'ENOENT') {
|
|
53
|
+
throw new errors.IncorrectUsageError({
|
|
54
|
+
message: tpl(messages.templateError.message, {templatePath}),
|
|
55
|
+
context: tpl(messages.templateError.context),
|
|
56
|
+
help: tpl(messages.templateError.help, {link: 'https://ghost.org/docs/install/source/'}),
|
|
57
|
+
error: error
|
|
58
|
+
});
|
|
59
|
+
} else {
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
40
63
|
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const urlUtils = require('../../../../shared/url-utils');
|
|
2
|
+
|
|
3
|
+
function redirectAdminUrls(req, res, next) {
|
|
4
|
+
const subdir = urlUtils.getSubdir();
|
|
5
|
+
const ghostPathRegex = new RegExp(`^${subdir}/ghost/(.+)`);
|
|
6
|
+
const ghostPathMatch = req.originalUrl.match(ghostPathRegex);
|
|
7
|
+
|
|
8
|
+
if (ghostPathMatch) {
|
|
9
|
+
return res.redirect(urlUtils.urlJoin(urlUtils.urlFor('admin'), '#', ghostPathMatch[1]));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
next();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
module.exports = redirectAdminUrls;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<title>Ghost Admin</title>
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
<meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%2F%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%224.
|
|
11
|
+
<meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%2F%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%224.25%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22moment%22%3A%7B%22includeTimezone%22%3A%22all%22%7D%2C%22emberKeyboard%22%3A%7B%22disableInputsInitializer%22%3Atrue%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%7D" />
|
|
12
12
|
|
|
13
13
|
<meta name="HandheldFriendly" content="True" />
|
|
14
14
|
<meta name="MobileOptimized" content="320" />
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
<link rel="stylesheet" href="assets/vendor.min-987af30228885bce50f05c4723fe6f53.css">
|
|
44
|
-
<link rel="stylesheet" href="assets/ghost.min-
|
|
44
|
+
<link rel="stylesheet" href="assets/ghost.min-043bb7480a0810109b130f13b2a4235e.css" title="light">
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
|
|
@@ -59,8 +59,8 @@
|
|
|
59
59
|
<div id="ember-basic-dropdown-wormhole"></div>
|
|
60
60
|
|
|
61
61
|
|
|
62
|
-
<script src="assets/vendor.min-
|
|
63
|
-
<script src="assets/ghost.min-
|
|
62
|
+
<script src="assets/vendor.min-d1234c632a54502777c34e50752fa3fc.js"></script>
|
|
63
|
+
<script src="assets/ghost.min-bc72f685c1c9adc9885925c1412435a5.js"></script>
|
|
64
64
|
|
|
65
65
|
</body>
|
|
66
66
|
</html>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<title>Ghost Admin</title>
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
<meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%2F%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%224.
|
|
11
|
+
<meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%2F%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%224.25%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22moment%22%3A%7B%22includeTimezone%22%3A%22all%22%7D%2C%22emberKeyboard%22%3A%7B%22disableInputsInitializer%22%3Atrue%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%7D" />
|
|
12
12
|
|
|
13
13
|
<meta name="HandheldFriendly" content="True" />
|
|
14
14
|
<meta name="MobileOptimized" content="320" />
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
<link rel="stylesheet" href="assets/vendor.min-987af30228885bce50f05c4723fe6f53.css">
|
|
44
|
-
<link rel="stylesheet" href="assets/ghost.min-
|
|
44
|
+
<link rel="stylesheet" href="assets/ghost.min-043bb7480a0810109b130f13b2a4235e.css" title="light">
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
|
|
@@ -59,8 +59,8 @@
|
|
|
59
59
|
<div id="ember-basic-dropdown-wormhole"></div>
|
|
60
60
|
|
|
61
61
|
|
|
62
|
-
<script src="assets/vendor.min-
|
|
63
|
-
<script src="assets/ghost.min-
|
|
62
|
+
<script src="assets/vendor.min-d1234c632a54502777c34e50752fa3fc.js"></script>
|
|
63
|
+
<script src="assets/ghost.min-bc72f685c1c9adc9885925c1412435a5.js"></script>
|
|
64
64
|
|
|
65
65
|
</body>
|
|
66
66
|
</html>
|
|
@@ -2,7 +2,7 @@ const debug = require('@tryghost/debug')('web:api:default:app');
|
|
|
2
2
|
const config = require('../../../shared/config');
|
|
3
3
|
const express = require('../../../shared/express');
|
|
4
4
|
const urlUtils = require('../../../shared/url-utils');
|
|
5
|
-
const errorHandler = require('../shared/
|
|
5
|
+
const errorHandler = require('../shared/middleware/error-handler');
|
|
6
6
|
|
|
7
7
|
module.exports = function setupApiApp() {
|
|
8
8
|
debug('Parent API setup start');
|
|
@@ -19,22 +19,19 @@ module.exports = function setupApiApp() {
|
|
|
19
19
|
// Query parsing
|
|
20
20
|
apiApp.use(boolParser());
|
|
21
21
|
|
|
22
|
-
// send 503 json response in case of maintenance
|
|
23
|
-
apiApp.use(shared.middlewares.maintenance);
|
|
24
|
-
|
|
25
22
|
// Check version matches for API requests, depends on res.locals.safeVersion being set
|
|
26
23
|
// Therefore must come after themeHandler.ghostLocals, for now
|
|
27
24
|
apiApp.use(apiMw.versionMatch);
|
|
28
25
|
|
|
29
26
|
// Admin API shouldn't be cached
|
|
30
|
-
apiApp.use(shared.
|
|
27
|
+
apiApp.use(shared.middleware.cacheControl('private'));
|
|
31
28
|
|
|
32
29
|
// Routing
|
|
33
30
|
apiApp.use(routes());
|
|
34
31
|
|
|
35
32
|
// API error handling
|
|
36
|
-
apiApp.use(shared.
|
|
37
|
-
apiApp.use(shared.
|
|
33
|
+
apiApp.use(shared.middleware.errorHandler.resourceNotFound);
|
|
34
|
+
apiApp.use(shared.middleware.errorHandler.handleJSONResponseV2);
|
|
38
35
|
|
|
39
36
|
debug('Admin API canary setup end');
|
|
40
37
|
|
|
@@ -44,7 +44,7 @@ const notImplemented = function (req, res, next) {
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
next(new errors.
|
|
47
|
+
next(new errors.InternalServerError({
|
|
48
48
|
errorType: 'NotImplementedError',
|
|
49
49
|
message: tpl(messages.notImplemented),
|
|
50
50
|
statusCode: '501'
|
|
@@ -59,8 +59,8 @@ module.exports.authAdminApi = [
|
|
|
59
59
|
auth.authorize.authorizeAdminApi,
|
|
60
60
|
apiMw.updateUserLastSeen,
|
|
61
61
|
apiMw.cors,
|
|
62
|
-
shared.
|
|
63
|
-
shared.
|
|
62
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
63
|
+
shared.middleware.prettyUrls,
|
|
64
64
|
notImplemented
|
|
65
65
|
];
|
|
66
66
|
|
|
@@ -73,8 +73,8 @@ module.exports.authAdminApiWithUrl = [
|
|
|
73
73
|
auth.authorize.authorizeAdminApi,
|
|
74
74
|
apiMw.updateUserLastSeen,
|
|
75
75
|
apiMw.cors,
|
|
76
|
-
shared.
|
|
77
|
-
shared.
|
|
76
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
77
|
+
shared.middleware.prettyUrls,
|
|
78
78
|
notImplemented
|
|
79
79
|
];
|
|
80
80
|
|
|
@@ -83,7 +83,7 @@ module.exports.authAdminApiWithUrl = [
|
|
|
83
83
|
*/
|
|
84
84
|
module.exports.publicAdminApi = [
|
|
85
85
|
apiMw.cors,
|
|
86
|
-
shared.
|
|
87
|
-
shared.
|
|
86
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
87
|
+
shared.middleware.prettyUrls,
|
|
88
88
|
notImplemented
|
|
89
89
|
];
|
|
@@ -204,8 +204,8 @@ module.exports = function apiRoutes() {
|
|
|
204
204
|
router.get('/session', mw.authAdminApi, http(api.session.read));
|
|
205
205
|
// We don't need auth when creating a new session (logging in)
|
|
206
206
|
router.post('/session',
|
|
207
|
-
shared.
|
|
208
|
-
shared.
|
|
207
|
+
shared.middleware.brute.globalBlock,
|
|
208
|
+
shared.middleware.brute.userLogin,
|
|
209
209
|
http(api.session.add)
|
|
210
210
|
);
|
|
211
211
|
router.del('/session', mw.authAdminApi, http(api.session.delete));
|
|
@@ -215,11 +215,11 @@ module.exports = function apiRoutes() {
|
|
|
215
215
|
|
|
216
216
|
// ## Authentication
|
|
217
217
|
router.post('/authentication/passwordreset',
|
|
218
|
-
shared.
|
|
219
|
-
shared.
|
|
218
|
+
shared.middleware.brute.globalReset,
|
|
219
|
+
shared.middleware.brute.userReset,
|
|
220
220
|
http(api.authentication.generateResetToken)
|
|
221
221
|
);
|
|
222
|
-
router.put('/authentication/passwordreset', shared.
|
|
222
|
+
router.put('/authentication/passwordreset', shared.middleware.brute.globalBlock, http(api.authentication.resetPassword));
|
|
223
223
|
router.post('/authentication/invitation', http(api.authentication.acceptInvitation));
|
|
224
224
|
router.get('/authentication/invitation', http(api.authentication.isInvitation));
|
|
225
225
|
router.post('/authentication/setup', http(api.authentication.setup));
|
|
@@ -17,18 +17,15 @@ module.exports = function setupApiApp() {
|
|
|
17
17
|
// Query parsing
|
|
18
18
|
apiApp.use(boolParser());
|
|
19
19
|
|
|
20
|
-
// send 503 json response in case of maintenance
|
|
21
|
-
apiApp.use(shared.middlewares.maintenance);
|
|
22
|
-
|
|
23
20
|
// API shouldn't be cached
|
|
24
|
-
apiApp.use(shared.
|
|
21
|
+
apiApp.use(shared.middleware.cacheControl('private'));
|
|
25
22
|
|
|
26
23
|
// Routing
|
|
27
24
|
apiApp.use(routes());
|
|
28
25
|
|
|
29
26
|
// API error handling
|
|
30
|
-
apiApp.use(shared.
|
|
31
|
-
apiApp.use(shared.
|
|
27
|
+
apiApp.use(shared.middleware.errorHandler.resourceNotFound);
|
|
28
|
+
apiApp.use(shared.middleware.errorHandler.handleJSONResponse);
|
|
32
29
|
|
|
33
30
|
debug('Content API canary setup end');
|
|
34
31
|
|
|
@@ -14,10 +14,10 @@ const shared = require('../../../shared');
|
|
|
14
14
|
* Authentication for public endpoints
|
|
15
15
|
*/
|
|
16
16
|
module.exports.authenticatePublic = [
|
|
17
|
-
shared.
|
|
17
|
+
shared.middleware.brute.contentApiKey,
|
|
18
18
|
auth.authenticate.authenticateContentApi,
|
|
19
19
|
auth.authorize.authorizeContentApi,
|
|
20
20
|
cors(),
|
|
21
|
-
shared.
|
|
22
|
-
shared.
|
|
21
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
22
|
+
shared.middleware.prettyUrls
|
|
23
23
|
];
|
|
@@ -19,22 +19,19 @@ module.exports = function setupApiApp() {
|
|
|
19
19
|
// Query parsing
|
|
20
20
|
apiApp.use(boolParser());
|
|
21
21
|
|
|
22
|
-
// send 503 json response in case of maintenance
|
|
23
|
-
apiApp.use(shared.middlewares.maintenance);
|
|
24
|
-
|
|
25
22
|
// Check version matches for API requests, depends on res.locals.safeVersion being set
|
|
26
23
|
// Therefore must come after themeHandler.ghostLocals, for now
|
|
27
24
|
apiApp.use(apiMw.versionMatch);
|
|
28
25
|
|
|
29
26
|
// Admin API shouldn't be cached
|
|
30
|
-
apiApp.use(shared.
|
|
27
|
+
apiApp.use(shared.middleware.cacheControl('private'));
|
|
31
28
|
|
|
32
29
|
// Routing
|
|
33
30
|
apiApp.use(routes());
|
|
34
31
|
|
|
35
32
|
// API error handling
|
|
36
|
-
apiApp.use(shared.
|
|
37
|
-
apiApp.use(shared.
|
|
33
|
+
apiApp.use(shared.middleware.errorHandler.resourceNotFound);
|
|
34
|
+
apiApp.use(shared.middleware.errorHandler.handleJSONResponseV2);
|
|
38
35
|
|
|
39
36
|
debug('Admin API v2 setup end');
|
|
40
37
|
|
|
@@ -40,7 +40,7 @@ const notImplemented = function (req, res, next) {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
next(new errors.
|
|
43
|
+
next(new errors.InternalServerError({
|
|
44
44
|
errorType: 'NotImplementedError',
|
|
45
45
|
message: tpl(messages.notImplemented),
|
|
46
46
|
statusCode: '501'
|
|
@@ -55,8 +55,8 @@ module.exports.authAdminApi = [
|
|
|
55
55
|
auth.authorize.authorizeAdminApi,
|
|
56
56
|
apiMw.updateUserLastSeen,
|
|
57
57
|
apiMw.cors,
|
|
58
|
-
shared.
|
|
59
|
-
shared.
|
|
58
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
59
|
+
shared.middleware.prettyUrls,
|
|
60
60
|
notImplemented
|
|
61
61
|
];
|
|
62
62
|
|
|
@@ -69,8 +69,8 @@ module.exports.authAdminApiWithUrl = [
|
|
|
69
69
|
auth.authorize.authorizeAdminApi,
|
|
70
70
|
apiMw.updateUserLastSeen,
|
|
71
71
|
apiMw.cors,
|
|
72
|
-
shared.
|
|
73
|
-
shared.
|
|
72
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
73
|
+
shared.middleware.prettyUrls,
|
|
74
74
|
notImplemented
|
|
75
75
|
];
|
|
76
76
|
|
|
@@ -79,7 +79,7 @@ module.exports.authAdminApiWithUrl = [
|
|
|
79
79
|
*/
|
|
80
80
|
module.exports.publicAdminApi = [
|
|
81
81
|
apiMw.cors,
|
|
82
|
-
shared.
|
|
83
|
-
shared.
|
|
82
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
83
|
+
shared.middleware.prettyUrls,
|
|
84
84
|
notImplemented
|
|
85
85
|
];
|
|
@@ -142,19 +142,19 @@ module.exports = function apiRoutes() {
|
|
|
142
142
|
router.get('/session', mw.authAdminApi, http(api.session.read));
|
|
143
143
|
// We don't need auth when creating a new session (logging in)
|
|
144
144
|
router.post('/session',
|
|
145
|
-
shared.
|
|
146
|
-
shared.
|
|
145
|
+
shared.middleware.brute.globalBlock,
|
|
146
|
+
shared.middleware.brute.userLogin,
|
|
147
147
|
http(api.session.add)
|
|
148
148
|
);
|
|
149
149
|
router.del('/session', mw.authAdminApi, http(api.session.delete));
|
|
150
150
|
|
|
151
151
|
// ## Authentication
|
|
152
152
|
router.post('/authentication/passwordreset',
|
|
153
|
-
shared.
|
|
154
|
-
shared.
|
|
153
|
+
shared.middleware.brute.globalReset,
|
|
154
|
+
shared.middleware.brute.userReset,
|
|
155
155
|
http(api.authentication.generateResetToken)
|
|
156
156
|
);
|
|
157
|
-
router.put('/authentication/passwordreset', shared.
|
|
157
|
+
router.put('/authentication/passwordreset', shared.middleware.brute.globalBlock, http(api.authentication.resetPassword));
|
|
158
158
|
router.post('/authentication/invitation', http(api.authentication.acceptInvitation));
|
|
159
159
|
router.get('/authentication/invitation', http(api.authentication.isInvitation));
|
|
160
160
|
router.post('/authentication/setup', http(api.authentication.setup));
|
|
@@ -17,18 +17,15 @@ module.exports = function setupApiApp() {
|
|
|
17
17
|
// Query parsing
|
|
18
18
|
apiApp.use(boolParser());
|
|
19
19
|
|
|
20
|
-
// send 503 json response in case of maintenance
|
|
21
|
-
apiApp.use(shared.middlewares.maintenance);
|
|
22
|
-
|
|
23
20
|
// API shouldn't be cached
|
|
24
|
-
apiApp.use(shared.
|
|
21
|
+
apiApp.use(shared.middleware.cacheControl('private'));
|
|
25
22
|
|
|
26
23
|
// Routing
|
|
27
24
|
apiApp.use(routes());
|
|
28
25
|
|
|
29
26
|
// API error handling
|
|
30
|
-
apiApp.use(shared.
|
|
31
|
-
apiApp.use(shared.
|
|
27
|
+
apiApp.use(shared.middleware.errorHandler.resourceNotFound);
|
|
28
|
+
apiApp.use(shared.middleware.errorHandler.handleJSONResponse);
|
|
32
29
|
|
|
33
30
|
debug('Content API v2 setup end');
|
|
34
31
|
|
|
@@ -14,10 +14,10 @@ const shared = require('../../../shared');
|
|
|
14
14
|
* Authentication for public endpoints
|
|
15
15
|
*/
|
|
16
16
|
module.exports.authenticatePublic = [
|
|
17
|
-
shared.
|
|
17
|
+
shared.middleware.brute.contentApiKey,
|
|
18
18
|
auth.authenticate.authenticateContentApi,
|
|
19
19
|
auth.authorize.authorizeContentApi,
|
|
20
20
|
cors(),
|
|
21
|
-
shared.
|
|
22
|
-
shared.
|
|
21
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
22
|
+
shared.middleware.prettyUrls
|
|
23
23
|
];
|
|
@@ -19,22 +19,19 @@ module.exports = function setupApiApp() {
|
|
|
19
19
|
// Query parsing
|
|
20
20
|
apiApp.use(boolParser());
|
|
21
21
|
|
|
22
|
-
// send 503 json response in case of maintenance
|
|
23
|
-
apiApp.use(shared.middlewares.maintenance);
|
|
24
|
-
|
|
25
22
|
// Check version matches for API requests, depends on res.locals.safeVersion being set
|
|
26
23
|
// Therefore must come after themeHandler.ghostLocals, for now
|
|
27
24
|
apiApp.use(apiMw.versionMatch);
|
|
28
25
|
|
|
29
26
|
// Admin API shouldn't be cached
|
|
30
|
-
apiApp.use(shared.
|
|
27
|
+
apiApp.use(shared.middleware.cacheControl('private'));
|
|
31
28
|
|
|
32
29
|
// Routing
|
|
33
30
|
apiApp.use(routes());
|
|
34
31
|
|
|
35
32
|
// API error handling
|
|
36
|
-
apiApp.use(shared.
|
|
37
|
-
apiApp.use(shared.
|
|
33
|
+
apiApp.use(shared.middleware.errorHandler.resourceNotFound);
|
|
34
|
+
apiApp.use(shared.middleware.errorHandler.handleJSONResponseV2);
|
|
38
35
|
|
|
39
36
|
debug('Admin API v3 setup end');
|
|
40
37
|
|
|
@@ -44,7 +44,7 @@ const notImplemented = function (req, res, next) {
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
next(new errors.
|
|
47
|
+
next(new errors.InternalServerError({
|
|
48
48
|
errorType: 'NotImplementedError',
|
|
49
49
|
message: tpl(messages.notImplemented),
|
|
50
50
|
statusCode: '501'
|
|
@@ -59,8 +59,8 @@ module.exports.authAdminApi = [
|
|
|
59
59
|
auth.authorize.authorizeAdminApi,
|
|
60
60
|
apiMw.updateUserLastSeen,
|
|
61
61
|
apiMw.cors,
|
|
62
|
-
shared.
|
|
63
|
-
shared.
|
|
62
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
63
|
+
shared.middleware.prettyUrls,
|
|
64
64
|
notImplemented
|
|
65
65
|
];
|
|
66
66
|
|
|
@@ -73,8 +73,8 @@ module.exports.authAdminApiWithUrl = [
|
|
|
73
73
|
auth.authorize.authorizeAdminApi,
|
|
74
74
|
apiMw.updateUserLastSeen,
|
|
75
75
|
apiMw.cors,
|
|
76
|
-
shared.
|
|
77
|
-
shared.
|
|
76
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
77
|
+
shared.middleware.prettyUrls,
|
|
78
78
|
notImplemented
|
|
79
79
|
];
|
|
80
80
|
|
|
@@ -83,7 +83,7 @@ module.exports.authAdminApiWithUrl = [
|
|
|
83
83
|
*/
|
|
84
84
|
module.exports.publicAdminApi = [
|
|
85
85
|
apiMw.cors,
|
|
86
|
-
shared.
|
|
87
|
-
shared.
|
|
86
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
87
|
+
shared.middleware.prettyUrls,
|
|
88
88
|
notImplemented
|
|
89
89
|
];
|
|
@@ -182,8 +182,8 @@ module.exports = function apiRoutes() {
|
|
|
182
182
|
router.get('/session', mw.authAdminApi, http(api.session.read));
|
|
183
183
|
// We don't need auth when creating a new session (logging in)
|
|
184
184
|
router.post('/session',
|
|
185
|
-
shared.
|
|
186
|
-
shared.
|
|
185
|
+
shared.middleware.brute.globalBlock,
|
|
186
|
+
shared.middleware.brute.userLogin,
|
|
187
187
|
http(api.session.add)
|
|
188
188
|
);
|
|
189
189
|
router.del('/session', mw.authAdminApi, http(api.session.delete));
|
|
@@ -193,11 +193,11 @@ module.exports = function apiRoutes() {
|
|
|
193
193
|
|
|
194
194
|
// ## Authentication
|
|
195
195
|
router.post('/authentication/passwordreset',
|
|
196
|
-
shared.
|
|
197
|
-
shared.
|
|
196
|
+
shared.middleware.brute.globalReset,
|
|
197
|
+
shared.middleware.brute.userReset,
|
|
198
198
|
http(api.authentication.generateResetToken)
|
|
199
199
|
);
|
|
200
|
-
router.put('/authentication/passwordreset', shared.
|
|
200
|
+
router.put('/authentication/passwordreset', shared.middleware.brute.globalBlock, http(api.authentication.resetPassword));
|
|
201
201
|
router.post('/authentication/invitation', http(api.authentication.acceptInvitation));
|
|
202
202
|
router.get('/authentication/invitation', http(api.authentication.isInvitation));
|
|
203
203
|
router.post('/authentication/setup', http(api.authentication.setup));
|
|
@@ -17,18 +17,15 @@ module.exports = function setupApiApp() {
|
|
|
17
17
|
// Query parsing
|
|
18
18
|
apiApp.use(boolParser());
|
|
19
19
|
|
|
20
|
-
// send 503 json response in case of maintenance
|
|
21
|
-
apiApp.use(shared.middlewares.maintenance);
|
|
22
|
-
|
|
23
20
|
// API shouldn't be cached
|
|
24
|
-
apiApp.use(shared.
|
|
21
|
+
apiApp.use(shared.middleware.cacheControl('private'));
|
|
25
22
|
|
|
26
23
|
// Routing
|
|
27
24
|
apiApp.use(routes());
|
|
28
25
|
|
|
29
26
|
// API error handling
|
|
30
|
-
apiApp.use(shared.
|
|
31
|
-
apiApp.use(shared.
|
|
27
|
+
apiApp.use(shared.middleware.errorHandler.resourceNotFound);
|
|
28
|
+
apiApp.use(shared.middleware.errorHandler.handleJSONResponse);
|
|
32
29
|
|
|
33
30
|
debug('Content API v3 setup end');
|
|
34
31
|
|
|
@@ -14,10 +14,10 @@ const shared = require('../../../shared');
|
|
|
14
14
|
* Authentication for public endpoints
|
|
15
15
|
*/
|
|
16
16
|
module.exports.authenticatePublic = [
|
|
17
|
-
shared.
|
|
17
|
+
shared.middleware.brute.contentApiKey,
|
|
18
18
|
auth.authenticate.authenticateContentApi,
|
|
19
19
|
auth.authorize.authorizeContentApi,
|
|
20
20
|
cors(),
|
|
21
|
-
shared.
|
|
22
|
-
shared.
|
|
21
|
+
shared.middleware.urlRedirects.adminSSLAndHostRedirect,
|
|
22
|
+
shared.middleware.prettyUrls
|
|
23
23
|
];
|
|
@@ -13,11 +13,8 @@ module.exports = function setupMembersApp() {
|
|
|
13
13
|
debug('Members App setup start');
|
|
14
14
|
const membersApp = express('members');
|
|
15
15
|
|
|
16
|
-
// send 503 json response in case of maintenance
|
|
17
|
-
membersApp.use(shared.middlewares.maintenance);
|
|
18
|
-
|
|
19
16
|
// Members API shouldn't be cached
|
|
20
|
-
membersApp.use(shared.
|
|
17
|
+
membersApp.use(shared.middleware.cacheControl('private'));
|
|
21
18
|
|
|
22
19
|
// Support CORS for requests from the frontend
|
|
23
20
|
const siteUrl = new URL(urlUtils.getSiteUrl());
|
|
@@ -42,19 +39,19 @@ module.exports = function setupMembersApp() {
|
|
|
42
39
|
membersApp.get('/api/site', middleware.getMemberSiteData);
|
|
43
40
|
|
|
44
41
|
// NOTE: this is wrapped in a function to ensure we always go via the getter
|
|
45
|
-
membersApp.post('/api/send-magic-link', bodyParser.json(), shared.
|
|
42
|
+
membersApp.post('/api/send-magic-link', bodyParser.json(), shared.middleware.brute.membersAuth, (req, res, next) => membersService.api.middleware.sendMagicLink(req, res, next));
|
|
46
43
|
membersApp.post('/api/create-stripe-checkout-session', (req, res, next) => membersService.api.middleware.createCheckoutSession(req, res, next));
|
|
47
44
|
membersApp.post('/api/create-stripe-update-session', (req, res, next) => membersService.api.middleware.createCheckoutSetupSession(req, res, next));
|
|
48
45
|
membersApp.put('/api/subscriptions/:id', (req, res, next) => membersService.api.middleware.updateSubscription(req, res, next));
|
|
49
46
|
membersApp.post('/api/events', labs.enabledMiddleware('membersActivity'), middleware.loadMemberSession, (req, res, next) => membersService.api.middleware.createEvents(req, res, next));
|
|
50
47
|
|
|
51
48
|
// API error handling
|
|
52
|
-
membersApp.use('/api', shared.
|
|
53
|
-
membersApp.use('/api', shared.
|
|
49
|
+
membersApp.use('/api', shared.middleware.errorHandler.resourceNotFound);
|
|
50
|
+
membersApp.use('/api', shared.middleware.errorHandler.handleJSONResponseV2);
|
|
54
51
|
|
|
55
52
|
// Webhook error handling
|
|
56
|
-
membersApp.use('/webhooks', shared.
|
|
57
|
-
membersApp.use('/webhooks', shared.
|
|
53
|
+
membersApp.use('/webhooks', shared.middleware.errorHandler.resourceNotFound);
|
|
54
|
+
membersApp.use('/webhooks', shared.middleware.errorHandler.handleJSONResponseV2);
|
|
58
55
|
|
|
59
56
|
debug('Members App setup end');
|
|
60
57
|
|
|
@@ -2,7 +2,6 @@ const debug = require('@tryghost/debug')('web:oauth:app');
|
|
|
2
2
|
const {URL} = require('url');
|
|
3
3
|
const express = require('../../../shared/express');
|
|
4
4
|
const urlUtils = require('../../../shared/url-utils');
|
|
5
|
-
const shared = require('../shared');
|
|
6
5
|
const settingsCache = require('../../../shared/settings-cache');
|
|
7
6
|
const models = require('../../models');
|
|
8
7
|
const auth = require('../../services/auth');
|
|
@@ -24,9 +23,6 @@ module.exports = function setupOAuthApp() {
|
|
|
24
23
|
}
|
|
25
24
|
oauthApp.use(labsMiddleware);
|
|
26
25
|
|
|
27
|
-
// send 503 json response in case of maintenance
|
|
28
|
-
oauthApp.use(shared.middlewares.maintenance);
|
|
29
|
-
|
|
30
26
|
/**
|
|
31
27
|
* Configure the passport.authenticate middleware
|
|
32
28
|
* We need to configure it on each request because clientId and secret
|