2016-08-26 18:50:37 +03:00
|
|
|
'use strict';
|
|
|
|
|
|
2018-02-20 14:51:41 -05:00
|
|
|
var os = require('os');
|
2018-06-06 13:11:43 -04:00
|
|
|
var winston = require('winston');
|
2018-12-07 11:29:20 -05:00
|
|
|
var _ = require('lodash');
|
2018-02-20 14:51:41 -05:00
|
|
|
|
2016-10-17 18:58:25 +03:00
|
|
|
var meta = require('../meta');
|
2018-12-07 11:29:20 -05:00
|
|
|
var languages = require('../languages');
|
2020-06-03 20:18:42 -04:00
|
|
|
var helpers = require('./helpers');
|
2016-08-26 18:50:37 +03:00
|
|
|
|
2016-10-13 11:43:39 +02:00
|
|
|
module.exports = function (middleware) {
|
2020-06-03 20:18:42 -04:00
|
|
|
middleware.addHeaders = helpers.try(function addHeaders(req, res, next) {
|
2016-08-26 18:50:37 +03:00
|
|
|
var headers = {
|
2016-11-23 21:06:02 +03:00
|
|
|
'X-Powered-By': encodeURI(meta.config['powered-by'] || 'NodeBB'),
|
|
|
|
|
'X-Frame-Options': meta.config['allow-from-uri'] ? 'ALLOW-FROM ' + encodeURI(meta.config['allow-from-uri']) : 'SAMEORIGIN',
|
|
|
|
|
'Access-Control-Allow-Methods': encodeURI(meta.config['access-control-allow-methods'] || ''),
|
2017-02-17 19:31:21 -07:00
|
|
|
'Access-Control-Allow-Headers': encodeURI(meta.config['access-control-allow-headers'] || ''),
|
2016-08-26 18:50:37 +03:00
|
|
|
};
|
|
|
|
|
|
2017-04-06 17:56:54 -04:00
|
|
|
if (meta.config['access-control-allow-origin']) {
|
2018-03-20 12:24:55 -04:00
|
|
|
var origins = meta.config['access-control-allow-origin'].split(',');
|
|
|
|
|
origins = origins.map(function (origin) {
|
|
|
|
|
return origin && origin.trim();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (origins.includes(req.get('origin'))) {
|
|
|
|
|
headers['Access-Control-Allow-Origin'] = encodeURI(req.get('origin'));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-06 13:11:43 -04:00
|
|
|
if (meta.config['access-control-allow-origin-regex']) {
|
|
|
|
|
var originsRegex = meta.config['access-control-allow-origin-regex'].split(',');
|
|
|
|
|
originsRegex = originsRegex.map(function (origin) {
|
|
|
|
|
try {
|
|
|
|
|
origin = new RegExp(origin.trim());
|
|
|
|
|
} catch (err) {
|
|
|
|
|
winston.error('[middleware.addHeaders] Invalid RegExp For access-control-allow-origin ' + origin);
|
|
|
|
|
origin = null;
|
|
|
|
|
}
|
|
|
|
|
return origin;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
originsRegex.forEach(function (regex) {
|
|
|
|
|
if (regex && regex.test(req.get('origin'))) {
|
|
|
|
|
headers['Access-Control-Allow-Origin'] = encodeURI(req.get('origin'));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-20 12:24:55 -04:00
|
|
|
if (meta.config['access-control-allow-credentials']) {
|
|
|
|
|
headers['Access-Control-Allow-Credentials'] = meta.config['access-control-allow-credentials'];
|
2017-04-06 17:56:54 -04:00
|
|
|
}
|
|
|
|
|
|
2018-02-20 14:51:41 -05:00
|
|
|
if (process.env.NODE_ENV === 'development') {
|
|
|
|
|
headers['X-Upstream-Hostname'] = os.hostname();
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-17 18:58:25 +03:00
|
|
|
for (var key in headers) {
|
2016-11-23 21:06:02 +03:00
|
|
|
if (headers.hasOwnProperty(key) && headers[key]) {
|
2016-11-23 12:25:01 -05:00
|
|
|
res.setHeader(key, headers[key]);
|
2016-08-26 18:50:37 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
next();
|
2020-06-03 20:18:42 -04:00
|
|
|
});
|
2018-12-07 11:29:20 -05:00
|
|
|
|
2020-06-03 20:18:42 -04:00
|
|
|
middleware.autoLocale = helpers.try(async function autoLocale(req, res, next) {
|
2020-07-24 12:22:24 -04:00
|
|
|
let langs;
|
|
|
|
|
if (req.query.lang) {
|
|
|
|
|
langs = await listCodes();
|
|
|
|
|
if (!langs.includes(req.query.lang)) {
|
|
|
|
|
req.query.lang = meta.config.defaultLang;
|
|
|
|
|
}
|
|
|
|
|
return next();
|
|
|
|
|
}
|
|
|
|
|
if (parseInt(req.uid, 10) > 0 || !meta.config.autoDetectLang) {
|
2018-12-07 11:29:20 -05:00
|
|
|
return next();
|
|
|
|
|
}
|
2020-07-24 12:22:24 -04:00
|
|
|
langs = await listCodes();
|
2020-05-19 14:18:07 -04:00
|
|
|
const lang = req.acceptsLanguages(langs);
|
2018-12-07 11:29:20 -05:00
|
|
|
if (!lang) {
|
|
|
|
|
return next();
|
|
|
|
|
}
|
|
|
|
|
req.query.lang = lang;
|
|
|
|
|
next();
|
2020-06-03 20:18:42 -04:00
|
|
|
});
|
2018-12-07 11:29:20 -05:00
|
|
|
|
2020-06-03 20:18:42 -04:00
|
|
|
async function listCodes() {
|
|
|
|
|
const defaultLang = meta.config.defaultLang || 'en-GB';
|
|
|
|
|
try {
|
|
|
|
|
const codes = await languages.listCodes();
|
|
|
|
|
winston.verbose('[middleware/autoLocale] Retrieves languages list for middleware');
|
|
|
|
|
return _.uniq([defaultLang, ...codes]);
|
|
|
|
|
} catch (err) {
|
|
|
|
|
winston.error('[middleware/autoLocale] Could not retrieve languages codes list! ' + err.stack);
|
|
|
|
|
return [defaultLang];
|
2018-12-07 11:29:20 -05:00
|
|
|
}
|
2020-06-03 20:18:42 -04:00
|
|
|
}
|
2016-08-26 18:50:37 +03:00
|
|
|
};
|