mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-27 00:56:13 +01:00
fix: #9394, fix guest handles
This commit is contained in:
@@ -68,6 +68,9 @@ topicsAPI.reply = async function (caller, data) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (data.toPid) { payload.toPid = data.toPid; }
|
if (data.toPid) { payload.toPid = data.toPid; }
|
||||||
|
if (data.handle && !parseInt(caller.uid, 10)) {
|
||||||
|
payload.handle = data.handle;
|
||||||
|
}
|
||||||
|
|
||||||
// Blacklist & Post Queue
|
// Blacklist & Post Queue
|
||||||
await meta.blacklist.test(caller.ip);
|
await meta.blacklist.test(caller.ip);
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ module.exports = function (Posts) {
|
|||||||
options.parse = options.hasOwnProperty('parse') ? options.parse : true;
|
options.parse = options.hasOwnProperty('parse') ? options.parse : true;
|
||||||
options.extraFields = options.hasOwnProperty('extraFields') ? options.extraFields : [];
|
options.extraFields = options.hasOwnProperty('extraFields') ? options.extraFields : [];
|
||||||
|
|
||||||
const fields = ['pid', 'tid', 'content', 'uid', 'timestamp', 'deleted', 'upvotes', 'downvotes', 'replies'].concat(options.extraFields);
|
const fields = ['pid', 'tid', 'content', 'uid', 'timestamp', 'deleted', 'upvotes', 'downvotes', 'replies', 'handle'].concat(options.extraFields);
|
||||||
|
|
||||||
let posts = await Posts.getPostsFields(pids, fields);
|
let posts = await Posts.getPostsFields(pids, fields);
|
||||||
posts = posts.filter(Boolean);
|
posts = posts.filter(Boolean);
|
||||||
@@ -45,6 +45,8 @@ module.exports = function (Posts) {
|
|||||||
post.uid = 0;
|
post.uid = 0;
|
||||||
}
|
}
|
||||||
post.user = uidToUser[post.uid];
|
post.user = uidToUser[post.uid];
|
||||||
|
Posts.overrideGuestHandle(post, post.handle);
|
||||||
|
post.handle = undefined;
|
||||||
post.topic = tidToTopic[post.tid];
|
post.topic = tidToTopic[post.tid];
|
||||||
post.category = post.topic && cidToCategory[post.topic.cid];
|
post.category = post.topic && cidToCategory[post.topic.cid];
|
||||||
post.isMainPost = post.topic && post.pid === post.topic.mainPid;
|
post.isMainPost = post.topic && post.pid === post.topic.mainPid;
|
||||||
@@ -60,7 +62,7 @@ module.exports = function (Posts) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
async function parsePosts(posts, options) {
|
async function parsePosts(posts, options) {
|
||||||
async function parse(post) {
|
return await Promise.all(posts.map(async (post) => {
|
||||||
if (!post.content || !options.parse) {
|
if (!post.content || !options.parse) {
|
||||||
post.content = post.content ? validator.escape(String(post.content)) : post.content;
|
post.content = post.content ? validator.escape(String(post.content)) : post.content;
|
||||||
return post;
|
return post;
|
||||||
@@ -70,8 +72,7 @@ module.exports = function (Posts) {
|
|||||||
post.content = stripTags(post.content);
|
post.content = stripTags(post.content);
|
||||||
}
|
}
|
||||||
return post;
|
return post;
|
||||||
}
|
}));
|
||||||
return await Promise.all(posts.map(p => parse(p)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getTopicAndCategories(tids) {
|
async function getTopicAndCategories(tids) {
|
||||||
|
|||||||
@@ -53,6 +53,16 @@ module.exports = function (Posts) {
|
|||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Posts.overrideGuestHandle = function (postData, handle) {
|
||||||
|
if (meta.config.allowGuestHandles && postData && postData.user && parseInt(postData.uid, 10) === 0 && handle) {
|
||||||
|
postData.user.username = validator.escape(String(handle));
|
||||||
|
if (postData.user.hasOwnProperty('fullname')) {
|
||||||
|
postData.user.fullname = postData.user.username;
|
||||||
|
}
|
||||||
|
postData.user.displayname = postData.user.username;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
async function checkGroupMembership(uid, groupTitleArray) {
|
async function checkGroupMembership(uid, groupTitleArray) {
|
||||||
if (!Array.isArray(groupTitleArray) || !groupTitleArray.length) {
|
if (!Array.isArray(groupTitleArray) || !groupTitleArray.length) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -217,10 +217,7 @@ module.exports = function (Topics) {
|
|||||||
postData.topic = topicInfo;
|
postData.topic = topicInfo;
|
||||||
postData.index = topicInfo.postcount - 1;
|
postData.index = topicInfo.postcount - 1;
|
||||||
|
|
||||||
// Username override for guests, if enabled
|
posts.overrideGuestHandle(postData, data.handle);
|
||||||
if (meta.config.allowGuestHandles && postData.uid === 0 && data.handle) {
|
|
||||||
postData.user.username = validator.escape(String(data.handle));
|
|
||||||
}
|
|
||||||
|
|
||||||
postData.votes = 0;
|
postData.votes = 0;
|
||||||
postData.bookmarked = false;
|
postData.bookmarked = false;
|
||||||
|
|||||||
@@ -167,6 +167,44 @@ describe('Topic\'s', () => {
|
|||||||
json: true,
|
json: true,
|
||||||
});
|
});
|
||||||
assert.strictEqual(replyResult.body.response.content, 'a reply by guest');
|
assert.strictEqual(replyResult.body.response.content, 'a reply by guest');
|
||||||
|
assert.strictEqual(replyResult.body.response.user.username, '[[global:guest]]');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should post a topic/reply as guest with handle if guest group has privileges', async () => {
|
||||||
|
const categoryObj = await categories.create({
|
||||||
|
name: 'Test Category',
|
||||||
|
description: 'Test category created by testing script',
|
||||||
|
});
|
||||||
|
await privileges.categories.give(['groups:topics:create'], categoryObj.cid, 'guests');
|
||||||
|
await privileges.categories.give(['groups:topics:reply'], categoryObj.cid, 'guests');
|
||||||
|
const oldValue = meta.config.allowGuestHandles;
|
||||||
|
meta.config.allowGuestHandles = 1;
|
||||||
|
const result = await requestType('post', `${nconf.get('url')}/api/v3/topics`, {
|
||||||
|
form: {
|
||||||
|
title: 'just a title',
|
||||||
|
cid: categoryObj.cid,
|
||||||
|
content: 'content for the main post',
|
||||||
|
handle: 'guest123',
|
||||||
|
},
|
||||||
|
json: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(result.body.status.code, 'ok');
|
||||||
|
assert.strictEqual(result.body.response.title, 'just a title');
|
||||||
|
assert.strictEqual(result.body.response.user.username, 'guest123');
|
||||||
|
assert.strictEqual(result.body.response.user.displayname, 'guest123');
|
||||||
|
|
||||||
|
const replyResult = await requestType('post', `${nconf.get('url')}/api/v3/topics/${result.body.response.tid}`, {
|
||||||
|
form: {
|
||||||
|
content: 'a reply by guest',
|
||||||
|
handle: 'guest124',
|
||||||
|
},
|
||||||
|
json: true,
|
||||||
|
});
|
||||||
|
assert.strictEqual(replyResult.body.response.content, 'a reply by guest');
|
||||||
|
assert.strictEqual(replyResult.body.response.user.username, 'guest124');
|
||||||
|
assert.strictEqual(replyResult.body.response.user.displayname, 'guest124');
|
||||||
|
meta.config.allowGuestHandles = oldValue;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user