mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
fix: removal of timeago fallback middleware (#7259)
* fix: removal of timeago fallback middleware Instead of loading English fallback on missing language, we opt to not send a script tag for a missing language to begin with. Timeago already loads with English as default, so it will just continue to use English. * fix: check userLang against supported language codes * fix: cleaned up code as per @pitaj * fix: added comments * fix: more fixes as per @pitaj * feat: added addl. test for timeago locales, fixed broken test
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
var path = require('path');
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var nconf = require('nconf');
|
var nconf = require('nconf');
|
||||||
var jsesc = require('jsesc');
|
var jsesc = require('jsesc');
|
||||||
@@ -14,7 +15,9 @@ var plugins = require('../plugins');
|
|||||||
var navigation = require('../navigation');
|
var navigation = require('../navigation');
|
||||||
var translator = require('../translator');
|
var translator = require('../translator');
|
||||||
var privileges = require('../privileges');
|
var privileges = require('../privileges');
|
||||||
|
var languages = require('../languages');
|
||||||
var utils = require('../utils');
|
var utils = require('../utils');
|
||||||
|
var file = require('../file');
|
||||||
|
|
||||||
var controllers = {
|
var controllers = {
|
||||||
api: require('../controllers/api'),
|
api: require('../controllers/api'),
|
||||||
@@ -223,11 +226,6 @@ module.exports = function (middleware) {
|
|||||||
], callback);
|
], callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
function addTimeagoLocaleScript(scripts, userLang) {
|
|
||||||
var languageCode = utils.userLangToTimeagoCode(userLang);
|
|
||||||
scripts.push({ src: nconf.get('relative_path') + '/assets/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '.js' });
|
|
||||||
}
|
|
||||||
|
|
||||||
middleware.renderFooter = function renderFooter(req, res, data, callback) {
|
middleware.renderFooter = function renderFooter(req, res, data, callback) {
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
function (next) {
|
function (next) {
|
||||||
@@ -240,15 +238,35 @@ module.exports = function (middleware) {
|
|||||||
function (data, next) {
|
function (data, next) {
|
||||||
async.parallel({
|
async.parallel({
|
||||||
scripts: async.apply(plugins.fireHook, 'filter:scripts.get', []),
|
scripts: async.apply(plugins.fireHook, 'filter:scripts.get', []),
|
||||||
|
timeagoLocale: (next) => {
|
||||||
|
const userLang = res.locals.config.userLang;
|
||||||
|
const pathToLocaleFile = '/vendor/jquery/timeago/locales/jquery.timeago.' + utils.userLangToTimeagoCode(userLang) + '.js';
|
||||||
|
|
||||||
|
async.waterfall([
|
||||||
|
async.apply(languages.list),
|
||||||
|
(languages, next) => {
|
||||||
|
if (!languages.some(obj => obj.code === userLang)) {
|
||||||
|
return next(null, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
file.exists(path.join(__dirname, '../../public', pathToLocaleFile), next);
|
||||||
|
},
|
||||||
|
(exists, next) => {
|
||||||
|
next(null, exists ? (nconf.get('relative_path') + '/assets' + pathToLocaleFile) : null);
|
||||||
|
},
|
||||||
|
], next);
|
||||||
|
},
|
||||||
}, function (err, results) {
|
}, function (err, results) {
|
||||||
next(err, data, results);
|
next(err, data, results);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
function (data, results, next) {
|
function (data, results, next) {
|
||||||
|
if (results.timeagoLocale) {
|
||||||
|
results.scripts.push(results.timeagoLocale);
|
||||||
|
}
|
||||||
data.templateValues.scripts = results.scripts.map(function (script) {
|
data.templateValues.scripts = results.scripts.map(function (script) {
|
||||||
return { src: script };
|
return { src: script };
|
||||||
});
|
});
|
||||||
addTimeagoLocaleScript(data.templateValues.scripts, res.locals.config.userLang);
|
|
||||||
|
|
||||||
data.templateValues.useCustomJS = meta.config.useCustomJS;
|
data.templateValues.useCustomJS = meta.config.useCustomJS;
|
||||||
data.templateValues.customJS = data.templateValues.useCustomJS ? meta.config.customJS : '';
|
data.templateValues.customJS = data.templateValues.useCustomJS ? meta.config.customJS : '';
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ var plugins = require('../plugins');
|
|||||||
var meta = require('../meta');
|
var meta = require('../meta');
|
||||||
var user = require('../user');
|
var user = require('../user');
|
||||||
var groups = require('../groups');
|
var groups = require('../groups');
|
||||||
var file = require('../file');
|
|
||||||
|
|
||||||
var analytics = require('../analytics');
|
var analytics = require('../analytics');
|
||||||
|
|
||||||
@@ -174,29 +173,6 @@ middleware.applyBlacklist = function applyBlacklist(req, res, next) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
middleware.processTimeagoLocales = function processTimeagoLocales(req, res, next) {
|
|
||||||
var fallback = !req.path.includes('-short') ? 'jquery.timeago.en.js' : 'jquery.timeago.en-short.js';
|
|
||||||
var localPath = path.join(__dirname, '../../public/vendor/jquery/timeago/locales', req.path);
|
|
||||||
|
|
||||||
async.waterfall([
|
|
||||||
function (next) {
|
|
||||||
file.exists(localPath, next);
|
|
||||||
},
|
|
||||||
function (exists, next) {
|
|
||||||
if (exists) {
|
|
||||||
next(null, localPath);
|
|
||||||
} else {
|
|
||||||
next(null, path.join(__dirname, '../../public/vendor/jquery/timeago/locales', fallback));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
function (path) {
|
|
||||||
res.status(200).sendFile(path, {
|
|
||||||
maxAge: req.app.enabled('cache') ? 5184000000 : 0,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
], next);
|
|
||||||
};
|
|
||||||
|
|
||||||
middleware.delayLoading = function delayLoading(req, res, next) {
|
middleware.delayLoading = function delayLoading(req, res, next) {
|
||||||
// Introduces an artificial delay during load so that brute force attacks are effectively mitigated
|
// Introduces an artificial delay during load so that brute force attacks are effectively mitigated
|
||||||
|
|
||||||
|
|||||||
@@ -187,7 +187,6 @@ function addCoreRoutes(app, router, middleware, callback) {
|
|||||||
res.redirect(relativePath + '/assets/client.css?' + meta.config['cache-buster']);
|
res.redirect(relativePath + '/assets/client.css?' + meta.config['cache-buster']);
|
||||||
});
|
});
|
||||||
|
|
||||||
app.use(relativePath + '/assets/vendor/jquery/timeago/locales', middleware.processTimeagoLocales);
|
|
||||||
app.use(controllers['404'].handle404);
|
app.use(controllers['404'].handle404);
|
||||||
app.use(controllers.errors.handleURIErrors);
|
app.use(controllers.errors.handleURIErrors);
|
||||||
app.use(controllers.errors.handleErrors);
|
app.use(controllers.errors.handleErrors);
|
||||||
|
|||||||
@@ -1807,11 +1807,18 @@ describe('Controllers', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should load timeago locale', function (done) {
|
it('should return not found if NodeBB language exists but timeago locale does not exist', function (done) {
|
||||||
request(nconf.get('url') + '/assets/vendor/jquery/timeago/locales/jquery.timeago.404.js', function (err, res, body) {
|
request(nconf.get('url') + '/assets/vendor/jquery/timeago/locales/jquery.timeago.ms.js', function (err, res, body) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.equal(res.statusCode, 200);
|
assert.equal(res.statusCode, 404);
|
||||||
assert(body.includes('English'));
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return not found if NodeBB language does not exist', function (done) {
|
||||||
|
request(nconf.get('url') + '/assets/vendor/jquery/timeago/locales/jquery.timeago.muggle.js', function (err, res, body) {
|
||||||
|
assert.ifError(err);
|
||||||
|
assert.equal(res.statusCode, 404);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user