Compare commits

..

8 Commits

Author SHA1 Message Date
Barış Soner Uşaklı
bd9f0077c1 perf: bypass getMultipleUserSettings 2021-07-07 10:06:34 -04:00
Barış Soner Uşaklı
b9d0219499 Merge branch 'paginate-notifications-fix-backport' of https://github.com/NodeBB/NodeBB into paginate-notifications-fix-backport 2021-07-05 10:12:06 -04:00
Barış Soner Uşaklı
7282e39e74 fix: conflicts 2021-07-05 10:11:42 -04:00
Barış Soner Uşaklı
dd04e56e00 fix: #9629, translate content property of meta tags 2021-06-23 11:04:50 -04:00
Barış Soner Uşaklı
9bc3faacde fix: toPid check 2021-06-23 10:14:39 -04:00
Barış Soner Uşaklı
44d9ac2a95 merge: fix conflicts 2021-06-22 15:32:22 -04:00
Barış Soner Uşaklı
be01951c41 merge 2021-06-18 12:43:18 -04:00
Barış Soner Uşaklı
9095057223 merge 2021-06-18 12:41:51 -04:00
9 changed files with 134 additions and 101 deletions

View File

@@ -229,22 +229,25 @@ ajaxify = window.ajaxify || {};
.forEach(function (el) {
document.head.removeChild(el);
});
// Add new meta tags
ajaxify.data._header.tags.meta
.filter(function (tagObj) {
var name = tagObj.name || tagObj.property;
return metaWhitelist.some(function (exp) {
return !!exp.test(name);
require(['translator'], function (translator) {
// Add new meta tags
ajaxify.data._header.tags.meta
.filter(function (tagObj) {
var name = tagObj.name || tagObj.property;
return metaWhitelist.some(function (exp) {
return !!exp.test(name);
});
}).forEach(async function (tagObj) {
if (tagObj.content) {
tagObj.content = await translator.translate(tagObj.content);
}
var metaEl = document.createElement('meta');
Object.keys(tagObj).forEach(function (prop) {
metaEl.setAttribute(prop, tagObj[prop]);
});
document.head.appendChild(metaEl);
});
})
.forEach(function (tagObj) {
var metaEl = document.createElement('meta');
Object.keys(tagObj).forEach(function (prop) {
metaEl.setAttribute(prop, tagObj[prop]);
});
document.head.appendChild(metaEl);
});
});
// Delete the old link tags
Array.prototype.slice

View File

@@ -10,6 +10,13 @@ const socketHelpers = require('../socket.io/helpers');
const websockets = require('../socket.io');
const events = require('../events');
exports.setDefaultPostData = function (reqOrSocket, data) {
data.uid = reqOrSocket.uid;
data.req = exports.buildReqObject(reqOrSocket, { ...data });
data.timestamp = Date.now();
data.fromQueue = false;
};
// creates a slimmed down version of the request object
exports.buildReqObject = (req, payload) => {
req = req || {};

View File

@@ -33,10 +33,7 @@ topicsAPI.create = async function (caller, data) {
const payload = { ...data };
payload.tags = payload.tags || [];
payload.uid = caller.uid;
payload.req = apiHelpers.buildReqObject(caller);
payload.timestamp = Date.now();
payload.fromQueue = false;
apiHelpers.setDefaultPostData(caller, payload);
// Blacklist & Post Queue
await meta.blacklist.test(caller.ip);
@@ -57,16 +54,8 @@ topicsAPI.create = async function (caller, data) {
};
topicsAPI.reply = async function (caller, data) {
var payload = {
tid: data.tid,
uid: caller.uid,
req: apiHelpers.buildReqObject(caller), // For IP recording
content: data.content,
timestamp: Date.now(),
fromQueue: false,
};
if (data.toPid) { payload.toPid = data.toPid; }
const payload = { ...data };
apiHelpers.setDefaultPostData(caller, payload);
// Blacklist & Post Queue
await meta.blacklist.test(caller.ip);

View File

@@ -16,74 +16,82 @@ const relative_path = nconf.get('relative_path');
module.exports = function (middleware) {
middleware.processRender = function processRender(req, res, next) {
// res.render post-processing, modified from here: https://gist.github.com/mrlannigan/5051687
const render = res.render;
const { render } = res;
res.render = async function renderOverride(template, options, fn) {
const self = this;
const req = this.req;
options = options || {};
if (typeof options === 'function') {
fn = options;
options = {};
}
options.loggedIn = req.uid > 0;
options.relative_path = relative_path;
options.template = { name: template, [template]: true };
options.url = (req.baseUrl + req.path.replace(/^\/api/, ''));
options.bodyClass = helpers.buildBodyClass(req, res, options);
const buildResult = await plugins.hooks.fire(`filter:${template}.build`, { req: req, res: res, templateData: options });
if (res.headersSent) {
return;
}
const templateToRender = buildResult.templateData.templateToRender || template;
const renderResult = await plugins.hooks.fire('filter:middleware.render', { req: req, res: res, templateData: buildResult.templateData });
if (res.headersSent) {
return;
}
options = renderResult.templateData;
options._header = {
tags: await meta.tags.parse(req, renderResult, res.locals.metaTags, res.locals.linkTags),
};
options.widgets = await widgets.render(req.uid, {
template: template + '.tpl',
url: options.url,
templateData: options,
req: req,
res: res,
});
res.locals.template = template;
options._locals = undefined;
if (res.locals.isAPI) {
if (req.route && req.route.path === '/api/') {
options.title = '[[pages:home]]';
const { req } = this;
async function renderMethod(template, options, fn) {
options = options || {};
if (typeof options === 'function') {
fn = options;
options = {};
}
options.loggedIn = req.uid > 0;
options.relative_path = relative_path;
options.template = { name: template, [template]: true };
options.url = (req.baseUrl + req.path.replace(/^\/api/, ''));
options.bodyClass = helpers.buildBodyClass(req, res, options);
const buildResult = await plugins.hooks.fire(`filter:${template}.build`, { req: req, res: res, templateData: options });
if (res.headersSent) {
return;
}
const templateToRender = buildResult.templateData.templateToRender || template;
const renderResult = await plugins.hooks.fire('filter:middleware.render', { req: req, res: res, templateData: buildResult.templateData });
if (res.headersSent) {
return;
}
options = renderResult.templateData;
options._header = {
tags: await meta.tags.parse(req, renderResult, res.locals.metaTags, res.locals.linkTags),
};
options.widgets = await widgets.render(req.uid, {
template: `${template}.tpl`,
url: options.url,
templateData: options,
req: req,
res: res,
});
res.locals.template = template;
options._locals = undefined;
if (res.locals.isAPI) {
if (req.route && req.route.path === '/api/') {
options.title = '[[pages:home]]';
}
req.app.set('json spaces', global.env === 'development' || req.query.pretty ? 4 : 0);
return res.json(options);
}
const results = await utils.promiseParallel({
header: renderHeaderFooter('renderHeader', req, res, options),
content: renderContent(render, templateToRender, req, res, options),
footer: renderHeaderFooter('renderFooter', req, res, options),
});
const str = `${results.header +
(res.locals.postHeader || '') +
results.content
}<script id="ajaxify-data" type="application/json">${
JSON.stringify(options).replace(/<\//g, '<\\/')
}</script>${
res.locals.preFooter || ''
}${results.footer}`;
if (typeof fn !== 'function') {
self.send(str);
} else {
fn(null, str);
}
req.app.set('json spaces', global.env === 'development' || req.query.pretty ? 4 : 0);
return res.json(options);
}
const results = await utils.promiseParallel({
header: renderHeaderFooter('renderHeader', req, res, options),
content: renderContent(render, templateToRender, req, res, options),
footer: renderHeaderFooter('renderFooter', req, res, options),
});
const str = results.header +
(res.locals.postHeader || '') +
results.content +
'<script id="ajaxify-data" type="application/json">' +
JSON.stringify(options).replace(/<\//g, '<\\/') +
'</script>' +
(res.locals.preFooter || '') +
results.footer;
if (typeof fn !== 'function') {
self.send(str);
} else {
fn(null, str);
try {
await renderMethod(template, options, fn);
} catch (err) {
next(err);
}
};

View File

@@ -18,10 +18,8 @@ const apiHelpers = require('../api/helpers');
const SocketHelpers = module.exports;
SocketHelpers.setDefaultPostData = function (data, socket) {
data.uid = socket.uid;
data.req = apiHelpers.buildReqObject(socket);
data.timestamp = Date.now();
data.fromQueue = false;
websockets.warnDeprecated(socket, 'apiHelpers.setDefaultPostData');
apiHelpers.setDefaultPostData(socket, data);
};
SocketHelpers.notifyNew = async function (uid, type, result) {

View File

@@ -10,6 +10,7 @@ const user = require('../user');
const socketHelpers = require('./helpers');
const utils = require('../utils');
const api = require('../api');
const apiHelpers = require('../api/helpers');
const sockets = require('.');
const SocketPosts = module.exports;
@@ -28,7 +29,7 @@ SocketPosts.reply = async function (socket, data) {
throw new Error('[[error:invalid-data]]');
}
socketHelpers.setDefaultPostData(data, socket);
apiHelpers.setDefaultPostData(socket, data);
await meta.blacklist.test(data.req.ip);
const shouldQueue = await posts.shouldQueue(socket.uid, data);
if (shouldQueue) {

View File

@@ -39,7 +39,18 @@ module.exports = function (Topics) {
if (!isAdminOrMod) {
throw new Error('[[error:no-privileges]]');
}
const tid = await Topics.create({ uid: postData.uid, title: title, cid: cid });
const params = {
uid: postData.uid,
title: title,
cid: cid,
};
const result = await plugins.hooks.fire('filter:topic.fork', {
params: params,
tid: postData.tid,
});
const tid = await Topics.create(result.params);
await Topics.updateTopicBookmarks(fromTid, pids);
await async.eachSeries(pids, async function (pid) {

View File

@@ -76,10 +76,21 @@ Topics.getTopicsByTids = async function (tids, options) {
return postData.map(p => p.handle);
}
async function loadShowfullnameSettings() {
if (meta.config.hideFullname) {
return uids.map(() => ({ showfullname: false }));
}
const data = await db.getObjectsFields(uids.map(uid => `user:${uid}:settings`), ['showfullname']);
data.forEach((settings) => {
settings.showfullname = parseInt(settings.showfullname, 10) === 1;
});
return data;
}
const [teasers, users, userSettings, categoriesData, guestHandles, thumbs] = await Promise.all([
Topics.getTeasers(topics, options),
user.getUsersFields(uids, ['uid', 'username', 'fullname', 'userslug', 'reputation', 'postcount', 'picture', 'signature', 'banned', 'status']),
user.getMultipleUserSettings(uids),
loadShowfullnameSettings(),
categories.getCategoriesFields(cids, ['cid', 'name', 'slug', 'icon', 'backgroundImage', 'imageClass', 'bgColor', 'color', 'disabled']),
loadGuestHandles(),
Topics.thumbs.get(tids),
@@ -87,7 +98,7 @@ Topics.getTopicsByTids = async function (tids, options) {
users.forEach((userObj, idx) => {
// Hide fullname if needed
if (meta.config.hideFullname || !userSettings[idx].showfullname) {
if (!userSettings[idx].showfullname) {
userObj.fullname = undefined;
}
});

View File

@@ -45,11 +45,16 @@ module.exports = function (Topics) {
async function createNewTopic(title, oldestTid) {
const topicData = await Topics.getTopicFields(oldestTid, ['uid', 'cid']);
const tid = await Topics.create({
const params = {
uid: topicData.uid,
cid: topicData.cid,
title: title,
};
const result = await plugins.hooks.fire('filter:topic.mergeCreateNewTopic', {
oldestTid: oldestTid,
params: params,
});
const tid = await Topics.create(result.params);
return tid;
}