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,329 +0,0 @@
|
|
|
1
|
-
const hbs = require('express-hbs');
|
|
2
|
-
const _ = require('lodash');
|
|
3
|
-
const debug = require('@tryghost/debug')('error-handler');
|
|
4
|
-
const errors = require('@tryghost/errors');
|
|
5
|
-
const tpl = require('@tryghost/tpl');
|
|
6
|
-
const config = require('../../../../shared/config');
|
|
7
|
-
const helpers = require('../../../../frontend/services/routing/helpers');
|
|
8
|
-
const sentry = require('../../../../shared/sentry');
|
|
9
|
-
|
|
10
|
-
const messages = {
|
|
11
|
-
oopsErrorTemplateHasError: 'Oops, seems there is an error in the error template.',
|
|
12
|
-
encounteredError: 'Encountered the error: ',
|
|
13
|
-
whilstTryingToRender: 'whilst trying to render an error page for the error: ',
|
|
14
|
-
pageNotFound: 'Page not found',
|
|
15
|
-
resourceNotFound: 'Resource not found',
|
|
16
|
-
actions: {
|
|
17
|
-
images: {
|
|
18
|
-
upload: 'upload image'
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
userMessages: {
|
|
22
|
-
BookshelfRelationsError: 'Database error, cannot {action}.',
|
|
23
|
-
InternalServerError: 'Internal server error, cannot {action}.',
|
|
24
|
-
IncorrectUsageError: 'Incorrect usage error, cannot {action}.',
|
|
25
|
-
NotFoundError: 'Resource not found error, cannot {action}.',
|
|
26
|
-
BadRequestError: 'Request not understood error, cannot {action}.',
|
|
27
|
-
UnauthorizedError: 'Authorisation error, cannot {action}.',
|
|
28
|
-
NoPermissionError: 'Permission error, cannot {action}.',
|
|
29
|
-
ValidationError: 'Validation error, cannot {action}.',
|
|
30
|
-
UnsupportedMediaTypeError: 'Unsupported media error, cannot {action}.',
|
|
31
|
-
TooManyRequestsError: 'Too many requests error, cannot {action}.',
|
|
32
|
-
MaintenanceError: 'Server down for maintenance, cannot {action}.',
|
|
33
|
-
MethodNotAllowedError: 'Method not allowed, cannot {action}.',
|
|
34
|
-
RequestEntityTooLargeError: 'Request too large, cannot {action}.',
|
|
35
|
-
TokenRevocationError: 'Token is not available, cannot {action}.',
|
|
36
|
-
VersionMismatchError: 'Version mismatch error, cannot {action}.',
|
|
37
|
-
DataExportError: 'Error exporting content.',
|
|
38
|
-
DataImportError: 'Duplicated entry, cannot save {action}.',
|
|
39
|
-
DatabaseVersionError: 'Database version compatibility error, cannot {action}.',
|
|
40
|
-
EmailError: 'Error sending email!',
|
|
41
|
-
ThemeValidationError: 'Theme validation error, cannot {action}.',
|
|
42
|
-
HostLimitError: 'Host Limit error, cannot {action}.',
|
|
43
|
-
DisabledFeatureError: 'Theme validation error, the {{{helperName}}} helper is not available. Cannot {action}.',
|
|
44
|
-
UpdateCollisionError: 'Saving failed! Someone else is editing this post.'
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const escapeExpression = hbs.Utils.escapeExpression;
|
|
49
|
-
const _private = {};
|
|
50
|
-
const errorHandler = {};
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* This is a bare minimum setup, which allows us to render the error page
|
|
54
|
-
* It uses the {{asset}} helper, and nothing more
|
|
55
|
-
*/
|
|
56
|
-
_private.createHbsEngine = () => {
|
|
57
|
-
const engine = hbs.create();
|
|
58
|
-
engine.registerHelper('asset', require('../../../../frontend/helpers/asset'));
|
|
59
|
-
|
|
60
|
-
return engine.express4();
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Get an error ready to be shown the the user
|
|
65
|
-
*
|
|
66
|
-
* @TODO: support multiple errors within one single error, see https://github.com/TryGhost/Ghost/issues/7116#issuecomment-252231809
|
|
67
|
-
*/
|
|
68
|
-
_private.prepareError = (err, req, res, next) => {
|
|
69
|
-
debug(err);
|
|
70
|
-
|
|
71
|
-
if (Array.isArray(err)) {
|
|
72
|
-
err = err[0];
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (!errors.utils.isIgnitionError(err)) {
|
|
76
|
-
// We need a special case for 404 errors
|
|
77
|
-
// @TODO look at adding this to the GhostError class
|
|
78
|
-
if (err.statusCode && err.statusCode === 404) {
|
|
79
|
-
err = new errors.NotFoundError({
|
|
80
|
-
err: err
|
|
81
|
-
});
|
|
82
|
-
} else if (err.stack.match(/node_modules\/handlebars\//)) {
|
|
83
|
-
// Temporary handling of theme errors from handlebars
|
|
84
|
-
// @TODO remove this when #10496 is solved properly
|
|
85
|
-
err = new errors.IncorrectUsageError({
|
|
86
|
-
err: err,
|
|
87
|
-
message: err.message,
|
|
88
|
-
statusCode: err.statusCode
|
|
89
|
-
});
|
|
90
|
-
} else {
|
|
91
|
-
err = new errors.GhostError({
|
|
92
|
-
err: err,
|
|
93
|
-
message: err.message,
|
|
94
|
-
statusCode: err.statusCode
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// used for express logging middleware see core/server/app.js
|
|
100
|
-
req.err = err;
|
|
101
|
-
|
|
102
|
-
// alternative for res.status();
|
|
103
|
-
res.statusCode = err.statusCode;
|
|
104
|
-
|
|
105
|
-
// never cache errors
|
|
106
|
-
res.set({
|
|
107
|
-
'Cache-Control': 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0'
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
next(err);
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
_private.JSONErrorRenderer = (err, req, res, next) => { // eslint-disable-line no-unused-vars
|
|
114
|
-
res.json({
|
|
115
|
-
errors: [{
|
|
116
|
-
message: err.message,
|
|
117
|
-
context: err.context,
|
|
118
|
-
help: err.help,
|
|
119
|
-
errorType: err.errorType,
|
|
120
|
-
errorDetails: err.errorDetails,
|
|
121
|
-
ghostErrorCode: err.ghostErrorCode
|
|
122
|
-
}]
|
|
123
|
-
});
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
_private.prepareUserMessage = (err, res) => {
|
|
127
|
-
const userError = {
|
|
128
|
-
message: err.message,
|
|
129
|
-
context: err.context
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
const docName = _.get(res, 'frameOptions.docName');
|
|
133
|
-
const method = _.get(res, 'frameOptions.method');
|
|
134
|
-
|
|
135
|
-
if (docName && method) {
|
|
136
|
-
let action;
|
|
137
|
-
|
|
138
|
-
const actionMap = {
|
|
139
|
-
browse: 'list',
|
|
140
|
-
read: 'read',
|
|
141
|
-
add: 'save',
|
|
142
|
-
edit: 'edit',
|
|
143
|
-
destroy: 'delete'
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
if (_.get(messages.actions, [docName, method])) {
|
|
147
|
-
action = tpl(messages.actions[docName][method]);
|
|
148
|
-
} else if (Object.keys(actionMap).includes(method)) {
|
|
149
|
-
let resource = docName;
|
|
150
|
-
|
|
151
|
-
if (method !== 'browse') {
|
|
152
|
-
resource = resource.replace(/s$/, '');
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
action = `${actionMap[method]} ${resource}`;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (action) {
|
|
159
|
-
if (err.context) {
|
|
160
|
-
userError.context = `${err.message} ${err.context}`;
|
|
161
|
-
} else {
|
|
162
|
-
userError.context = err.message;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
userError.message = tpl(messages.userMessages[err.name], {action: action});
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
return userError;
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
_private.JSONErrorRendererV2 = (err, req, res, next) => { // eslint-disable-line no-unused-vars
|
|
173
|
-
const userError = _private.prepareUserMessage(err, req);
|
|
174
|
-
|
|
175
|
-
res.json({
|
|
176
|
-
errors: [{
|
|
177
|
-
message: userError.message || null,
|
|
178
|
-
context: userError.context || null,
|
|
179
|
-
type: err.errorType || null,
|
|
180
|
-
details: err.errorDetails || null,
|
|
181
|
-
property: err.property || null,
|
|
182
|
-
help: err.help || null,
|
|
183
|
-
code: err.code || null,
|
|
184
|
-
id: err.id || null
|
|
185
|
-
}]
|
|
186
|
-
});
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
_private.ErrorFallbackMessage = err => `<h1>${tpl(messages.oopsErrorTemplateHasError)}</h1>
|
|
190
|
-
<p>${tpl(messages.encounteredError)}</p>
|
|
191
|
-
<pre>${escapeExpression(err.message || err)}</pre>
|
|
192
|
-
<br ><p>${tpl(messages.whilstTryingToRender)}</p>
|
|
193
|
-
${err.statusCode} <pre>${escapeExpression(err.message || err)}</pre>`;
|
|
194
|
-
|
|
195
|
-
_private.ThemeErrorRenderer = (err, req, res, next) => {
|
|
196
|
-
// If the error code is explicitly set to STATIC_FILE_NOT_FOUND,
|
|
197
|
-
// Skip trying to render an HTML error, and move on to the basic error renderer
|
|
198
|
-
// We do this because customised 404 templates could reference the image that's missing
|
|
199
|
-
// A better long term solution might be to do this based on extension
|
|
200
|
-
if (err.code === 'STATIC_FILE_NOT_FOUND') {
|
|
201
|
-
return next(err);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Renderer begin
|
|
205
|
-
// Format Data
|
|
206
|
-
const data = {
|
|
207
|
-
message: err.message,
|
|
208
|
-
// @deprecated Remove in Ghost 5.0
|
|
209
|
-
code: err.statusCode,
|
|
210
|
-
statusCode: err.statusCode,
|
|
211
|
-
errorDetails: err.errorDetails || []
|
|
212
|
-
};
|
|
213
|
-
|
|
214
|
-
// Template
|
|
215
|
-
// @TODO: very dirty !!!!!!
|
|
216
|
-
helpers.templates.setTemplate(req, res);
|
|
217
|
-
|
|
218
|
-
// It can be that something went wrong with the theme or otherwise loading handlebars
|
|
219
|
-
// This ensures that no matter what res.render will work here
|
|
220
|
-
// @TODO: split the error handler for assets, admin & theme to refactor this away
|
|
221
|
-
if (_.isEmpty(req.app.engines)) {
|
|
222
|
-
res._template = 'error';
|
|
223
|
-
req.app.engine('hbs', _private.createHbsEngine());
|
|
224
|
-
req.app.set('view engine', 'hbs');
|
|
225
|
-
req.app.set('views', config.get('paths').defaultViews);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// @TODO use renderer here?!
|
|
229
|
-
// Render Call - featuring an error handler for what happens if rendering fails
|
|
230
|
-
res.render(res._template, data, (_err, html) => {
|
|
231
|
-
if (!_err) {
|
|
232
|
-
return res.send(html);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// re-attach new error e.g. error template has syntax error or misusage
|
|
236
|
-
req.err = _err;
|
|
237
|
-
|
|
238
|
-
// And then try to explain things to the user...
|
|
239
|
-
// Cheat and output the error using handlebars escapeExpression
|
|
240
|
-
return res.status(500).send(_private.ErrorFallbackMessage(_err));
|
|
241
|
-
});
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
_private.HTMLErrorRenderer = (err, req, res, next) => { // eslint-disable-line no-unused-vars
|
|
245
|
-
const data = {
|
|
246
|
-
message: err.message,
|
|
247
|
-
statusCode: err.statusCode,
|
|
248
|
-
errorDetails: err.errorDetails || []
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
// e.g. if you serve the admin /ghost and Ghost returns a 503 because it generates the urls at the moment.
|
|
252
|
-
// This ensures that no matter what res.render will work here
|
|
253
|
-
// @TODO: put to prepare error function?
|
|
254
|
-
if (_.isEmpty(req.app.engines)) {
|
|
255
|
-
res._template = 'error';
|
|
256
|
-
req.app.engine('hbs', _private.createHbsEngine());
|
|
257
|
-
req.app.set('view engine', 'hbs');
|
|
258
|
-
req.app.set('views', config.get('paths').defaultViews);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
res.render('error', data, (_err, html) => {
|
|
262
|
-
if (!_err) {
|
|
263
|
-
return res.send(html);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// re-attach new error e.g. error template has syntax error or misusage
|
|
267
|
-
req.err = _err;
|
|
268
|
-
|
|
269
|
-
// And then try to explain things to the user...
|
|
270
|
-
// Cheat and output the error using handlebars escapeExpression
|
|
271
|
-
return res.status(500).send(_private.ErrorFallbackMessage(_err));
|
|
272
|
-
});
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
_private.BasicErrorRenderer = (err, req, res, next) => { // eslint-disable-line no-unused-vars
|
|
276
|
-
return res.send(res.statusCode + ' ' + err.message);
|
|
277
|
-
};
|
|
278
|
-
|
|
279
|
-
errorHandler.resourceNotFound = (req, res, next) => {
|
|
280
|
-
// TODO, handle unknown resources & methods differently, so that we can also produce
|
|
281
|
-
// 405 Method Not Allowed
|
|
282
|
-
next(new errors.NotFoundError({message: tpl(messages.resourceNotFound)}));
|
|
283
|
-
};
|
|
284
|
-
|
|
285
|
-
errorHandler.pageNotFound = (req, res, next) => {
|
|
286
|
-
next(new errors.NotFoundError({message: tpl(messages.pageNotFound)}));
|
|
287
|
-
};
|
|
288
|
-
|
|
289
|
-
errorHandler.handleJSONResponse = [
|
|
290
|
-
// Make sure the error can be served
|
|
291
|
-
_private.prepareError,
|
|
292
|
-
// Handle the error in Sentry
|
|
293
|
-
sentry.errorHandler,
|
|
294
|
-
// Render the error using JSON format
|
|
295
|
-
_private.JSONErrorRenderer
|
|
296
|
-
];
|
|
297
|
-
|
|
298
|
-
errorHandler.handleJSONResponseV2 = [
|
|
299
|
-
// Make sure the error can be served
|
|
300
|
-
_private.prepareError,
|
|
301
|
-
// Handle the error in Sentry
|
|
302
|
-
sentry.errorHandler,
|
|
303
|
-
// Render the error using JSON format
|
|
304
|
-
_private.JSONErrorRendererV2
|
|
305
|
-
];
|
|
306
|
-
|
|
307
|
-
errorHandler.handleHTMLResponse = [
|
|
308
|
-
// Make sure the error can be served
|
|
309
|
-
_private.prepareError,
|
|
310
|
-
// Handle the error in Sentry
|
|
311
|
-
sentry.errorHandler,
|
|
312
|
-
// Render the error using HTML format
|
|
313
|
-
_private.HTMLErrorRenderer,
|
|
314
|
-
// Fall back to basic if HTML is not explicitly accepted
|
|
315
|
-
_private.BasicErrorRenderer
|
|
316
|
-
];
|
|
317
|
-
|
|
318
|
-
errorHandler.handleThemeResponse = [
|
|
319
|
-
// Make sure the error can be served
|
|
320
|
-
_private.prepareError,
|
|
321
|
-
// Handle the error in Sentry
|
|
322
|
-
sentry.errorHandler,
|
|
323
|
-
// Render the error using theme template
|
|
324
|
-
_private.ThemeErrorRenderer,
|
|
325
|
-
// Fall back to basic if HTML is not explicitly accepted
|
|
326
|
-
_private.BasicErrorRenderer
|
|
327
|
-
];
|
|
328
|
-
|
|
329
|
-
module.exports = errorHandler;
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const errors = require('@tryghost/errors');
|
|
2
|
-
const config = require('../../../../shared/config');
|
|
3
|
-
const tpl = require('@tryghost/tpl');
|
|
4
|
-
const urlService = require('../../../services/url');
|
|
5
|
-
|
|
6
|
-
const messages = {
|
|
7
|
-
maintenance: 'Site is currently undergoing maintenance, please wait a moment then retry.',
|
|
8
|
-
maintenanceUrlService: 'Site is starting up, please wait a moment then retry.'
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
module.exports = function maintenance(req, res, next) {
|
|
12
|
-
if (config.get('maintenance').enabled) {
|
|
13
|
-
return next(new errors.MaintenanceError({
|
|
14
|
-
message: tpl(messages.maintenance)
|
|
15
|
-
}));
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
if (!urlService.hasFinished()) {
|
|
19
|
-
return next(new errors.MaintenanceError({
|
|
20
|
-
message: tpl(messages.maintenanceUrlService)
|
|
21
|
-
}));
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
next();
|
|
25
|
-
};
|