diff --git a/customize.dist/500.html b/customize.dist/500.html new file mode 100644 index 000000000..7e84c8737 --- /dev/null +++ b/customize.dist/500.html @@ -0,0 +1,16 @@ + + + + + CryptPad: Collaboration suite, encrypted and open-source + + + + + + + diff --git a/customize.dist/four-oh-four.js b/customize.dist/four-oh-four.js index 568faf951..b344a4af8 100644 --- a/customize.dist/four-oh-four.js +++ b/customize.dist/four-oh-four.js @@ -12,9 +12,12 @@ define([ src: '/customize/CryptPad_logo_grey.svg?' + urlArgs }); + Messages.fivehundred_internalServerError = 'Internal Server Error'; // XXX + + var is500 = Boolean(document.querySelector('#five-hundred')); var brand = h('h1#cp-brand', 'CryptPad'); - var message = h('h2#cp-scramble', Messages.four04_pageNotFound); - var title = h('h2#cp-title', "404"); + var message = h('h2#cp-scramble', Messages[is500? 'fivehundred_internalServerError':'four04_pageNotFound']); + var title = h('h2#cp-title', is500? "500":"404"); var loggedIn = LocalStore.isLoggedIn(); var link = h('a#cp-link', { diff --git a/lib/env.js b/lib/env.js index 516a9af7d..1923dcc9e 100644 --- a/lib/env.js +++ b/lib/env.js @@ -72,8 +72,6 @@ module.exports.create = function (config) { NO_SANDBOX: NO_SANDBOX, httpSafePort: httpSafePort, - NODE_ENV: process.env.NODE_ENV, - shouldUpdateNode: !isRecentVersion(), version: Package.version, diff --git a/server.js b/server.js index 30920abef..e347cf16c 100644 --- a/server.js +++ b/server.js @@ -262,7 +262,9 @@ app.get('/api/config', serveConfig); app.get('/api/broadcast', serveBroadcast); var four04_path = Path.resolve(__dirname + '/customize.dist/404.html'); +var fivehundred_path = Path.resolve(__dirname + '/customize.dist/500.html'); var custom_four04_path = Path.resolve(__dirname + '/customize/404.html'); +var custom_fivehundred_path = Path.resolve(__dirname + '/customize/500.html'); var send404 = function (res, path) { if (!path && path !== four04_path) { path = four04_path; } @@ -272,6 +274,15 @@ var send404 = function (res, path) { send404(res); }); }; +var send500 = function (res, path) { + if (!path && path !== fivehundred_path) { path = fivehundred_path; } + Fs.exists(path, function (exists) { + res.setHeader('Content-Type', 'text/html; charset=utf-8'); + if (exists) { return Fs.createReadStream(path).pipe(res); } + send500(res); + }); +}; + app.get('/api/profiling', function (req, res, next) { if (!Env.enableProfiling) { return void send404(res); } res.setHeader('Content-Type', 'text/javascript'); @@ -285,6 +296,15 @@ app.use(function (req, res, next) { send404(res, custom_four04_path); }); +// default message for thrown errors in ExpressJS routes +app.use(function (err, req, res, next) { + Env.Log.error('EXPRESSJS_ROUTING', { + error: err.stack || err, + }); + res.status(500); + send500(res, custom_fivehundred_path); +}); + var httpServer = Env.httpServer = Http.createServer(app); nThen(function (w) { @@ -332,9 +352,6 @@ nThen(function (w) { currentVersion: process.version, }); } - if (Env.NODE_ENV !== 'production') { - Env.Log.warn("NODE_ENV", `If this server is running in a production context then it is recommended that you set NODE_ENV=production to prevent Expressjs from responding with stack traces when it catches an error.`); - } if (Env.OFFLINE_MODE) { return; } if (Env.websocketPath) { return; }