diff --git a/public/language/en-GB/admin/menu.json b/public/language/en-GB/admin/menu.json index 90e8b4185a..5cfee48e7c 100644 --- a/public/language/en-GB/admin/menu.json +++ b/public/language/en-GB/admin/menu.json @@ -21,13 +21,13 @@ "settings/navigation": "Navigation", "settings/reputation": "Reputation", "settings/email": "Email", - "settings/user": "User", - "settings/group": "Group", + "settings/user": "Users", + "settings/group": "Groups", "settings/guest": "Guests", "settings/uploads": "Uploads", "settings/languages": "Languages", - "settings/post": "Post", - "settings/chat": "Chat", + "settings/post": "Posts", + "settings/chat": "Chats", "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", diff --git a/public/language/en-GB/admin/settings/advanced.json b/public/language/en-GB/admin/settings/advanced.json index 5594bcd45d..aa4079f6f4 100644 --- a/public/language/en-GB/admin/settings/advanced.json +++ b/public/language/en-GB/admin/settings/advanced.json @@ -25,5 +25,10 @@ "traffic.event-lag": "Event Loop Lag Threshold (in milliseconds)", "traffic.event-lag-help": "Lowering this value decreases wait times for page loads, but will also show the \"excessive load\" message to more users. (Restart required)", "traffic.lag-check-interval": "Check Interval (in milliseconds)", - "traffic.lag-check-interval-help": "Lowering this value causes NodeBB to become more sensitive to spikes in load, but may also cause the check to become too sensitive. (Restart required)" + "traffic.lag-check-interval-help": "Lowering this value causes NodeBB to become more sensitive to spikes in load, but may also cause the check to become too sensitive. (Restart required)", + + "sockets.settings": "WebSocket Settings", + "sockets.max-attempts": "Max Reconnection Attempts", + "sockets.default-placeholder": "Default: %1", + "sockets.delay": "Reconnection Delay" } \ No newline at end of file diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 773745c97d..02e61463f5 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -6,8 +6,6 @@ var adminController = { privileges: require('./admin/privileges'), adminsMods: require('./admin/admins-mods'), tags: require('./admin/tags'), - postQueue: require('./admin/postqueue'), - blacklist: require('./admin/blacklist'), groups: require('./admin/groups'), digest: require('./admin/digest'), appearance: require('./admin/appearance'), diff --git a/src/controllers/admin/blacklist.js b/src/controllers/admin/blacklist.js deleted file mode 100644 index 36a446c0aa..0000000000 --- a/src/controllers/admin/blacklist.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -const meta = require('../../meta'); -const analytics = require('../../analytics'); - -const blacklistController = module.exports; - -blacklistController.get = async function (req, res) { - const [rules, analyticsData] = await Promise.all([ - meta.blacklist.get(), - analytics.getBlacklistAnalytics(), - ]); - res.render('admin/manage/ip-blacklist', { - title: '[[pages:ip-blacklist]]', - rules: rules, - analytics: analyticsData, - }); -}; diff --git a/src/controllers/admin/postqueue.js b/src/controllers/admin/postqueue.js deleted file mode 100644 index 1d3eba0f71..0000000000 --- a/src/controllers/admin/postqueue.js +++ /dev/null @@ -1,76 +0,0 @@ -'use strict'; - -const validator = require('validator'); - -const db = require('../../database'); -const user = require('../../user'); -const topics = require('../../topics'); -const categories = require('../../categories'); -const pagination = require('../../pagination'); -const plugins = require('../../plugins'); -const utils = require('../../utils'); - -const postQueueController = module.exports; - -postQueueController.get = async function (req, res) { - const page = parseInt(req.query.page, 10) || 1; - const postsPerPage = 20; - - const [ids, isAdminOrGlobalMod, moderatedCids] = await Promise.all([ - db.getSortedSetRange('post:queue', 0, -1), - user.isAdminOrGlobalMod(req.uid), - user.getModeratedCids(req.uid), - ]); - - let postData = await getQueuedPosts(ids); - postData = postData.filter(p => p && (isAdminOrGlobalMod || moderatedCids.includes(String(p.category.cid)))); - - const pageCount = Math.max(1, Math.ceil(postData.length / postsPerPage)); - const start = (page - 1) * postsPerPage; - const stop = start + postsPerPage - 1; - postData = postData.slice(start, stop + 1); - - res.render('admin/manage/post-queue', { - title: '[[pages:post-queue]]', - posts: postData, - pagination: pagination.create(page, pageCount), - }); -}; - -async function getQueuedPosts(ids) { - const keys = ids.map(id => 'post:queue:' + id); - const postData = await db.getObjects(keys); - postData.forEach(function (data) { - if (data) { - data.data = JSON.parse(data.data); - data.data.timestampISO = utils.toISOString(data.data.timestamp); - } - }); - const uids = postData.map(data => data && data.uid); - const userData = await user.getUsersFields(uids, ['username', 'userslug', 'picture']); - postData.forEach(function (postData, index) { - if (postData) { - postData.user = userData[index]; - postData.data.rawContent = validator.escape(String(postData.data.content)); - postData.data.title = validator.escape(String(postData.data.title || '')); - } - }); - - await Promise.all(postData.map(p => addMetaData(p))); - return postData; -} - -async function addMetaData(postData) { - if (!postData) { - return; - } - postData.topic = { cid: 0 }; - if (postData.data.cid) { - postData.topic = { cid: postData.data.cid }; - } else if (postData.data.tid) { - postData.topic = await topics.getTopicFields(postData.data.tid, ['title', 'cid']); - } - postData.category = await categories.getCategoryData(postData.topic.cid); - const result = await plugins.fireHook('filter:parse.post', { postData: postData.data }); - postData.data.content = result.postData.content; -} diff --git a/src/controllers/globalmods.js b/src/controllers/globalmods.js index 6608cc15ad..d2f0ae6656 100644 --- a/src/controllers/globalmods.js +++ b/src/controllers/globalmods.js @@ -1,7 +1,8 @@ 'use strict'; const user = require('../user'); -const adminBlacklistController = require('./admin/blacklist'); +const meta = require('../meta'); +const analytics = require('../analytics'); const usersController = require('./admin/users'); const globalModsController = module.exports; @@ -11,7 +12,16 @@ globalModsController.ipBlacklist = async function (req, res, next) { if (!isAdminOrGlobalMod) { return next(); } - await adminBlacklistController.get(req, res); + + const [rules, analyticsData] = await Promise.all([ + meta.blacklist.get(), + analytics.getBlacklistAnalytics(), + ]); + res.render('admin/manage/ip-blacklist', { + title: '[[pages:ip-blacklist]]', + rules: rules, + analytics: analyticsData, + }); }; diff --git a/src/controllers/mods.js b/src/controllers/mods.js index d3f216322b..2911881bf5 100644 --- a/src/controllers/mods.js +++ b/src/controllers/mods.js @@ -1,6 +1,10 @@ 'use strict'; +const validator = require('validator'); + +const db = require('../database'); const user = require('../user'); +const topics = require('../topics'); const categories = require('../categories'); const flags = require('../flags'); const analytics = require('../analytics'); @@ -8,7 +12,6 @@ const plugins = require('../plugins'); const pagination = require('../pagination'); const utils = require('../utils'); -const adminPostQueueController = require('./admin/postqueue'); const modsController = module.exports; modsController.flags = {}; @@ -159,9 +162,70 @@ function filterCategories(moderatedCids, categories) { } modsController.postQueue = async function (req, res, next) { + // Admins, global mods, and individual mods only const isPrivileged = await user.isPrivileged(req.uid); if (!isPrivileged) { return next(); } - await adminPostQueueController.get(req, res, next); + + const page = parseInt(req.query.page, 10) || 1; + const postsPerPage = 20; + + const [ids, isAdminOrGlobalMod, moderatedCids] = await Promise.all([ + db.getSortedSetRange('post:queue', 0, -1), + user.isAdminOrGlobalMod(req.uid), + user.getModeratedCids(req.uid), + ]); + + let postData = await getQueuedPosts(ids); + postData = postData.filter(p => p && (isAdminOrGlobalMod || moderatedCids.includes(String(p.category.cid)))); + + const pageCount = Math.max(1, Math.ceil(postData.length / postsPerPage)); + const start = (page - 1) * postsPerPage; + const stop = start + postsPerPage - 1; + postData = postData.slice(start, stop + 1); + + res.render('admin/manage/post-queue', { + title: '[[pages:post-queue]]', + posts: postData, + pagination: pagination.create(page, pageCount), + }); }; + +async function getQueuedPosts(ids) { + const keys = ids.map(id => 'post:queue:' + id); + const postData = await db.getObjects(keys); + postData.forEach(function (data) { + if (data) { + data.data = JSON.parse(data.data); + data.data.timestampISO = utils.toISOString(data.data.timestamp); + } + }); + const uids = postData.map(data => data && data.uid); + const userData = await user.getUsersFields(uids, ['username', 'userslug', 'picture']); + postData.forEach(function (postData, index) { + if (postData) { + postData.user = userData[index]; + postData.data.rawContent = validator.escape(String(postData.data.content)); + postData.data.title = validator.escape(String(postData.data.title || '')); + } + }); + + await Promise.all(postData.map(p => addMetaData(p))); + return postData; +} + +async function addMetaData(postData) { + if (!postData) { + return; + } + postData.topic = { cid: 0 }; + if (postData.data.cid) { + postData.topic = { cid: postData.data.cid }; + } else if (postData.data.tid) { + postData.topic = await topics.getTopicFields(postData.data.tid, ['title', 'cid']); + } + postData.category = await categories.getCategoryData(postData.topic.cid); + const result = await plugins.fireHook('filter:parse.post', { postData: postData.data }); + postData.data.content = result.postData.content; +} diff --git a/src/routes/admin.js b/src/routes/admin.js index 9130b002ea..087911abf1 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -15,8 +15,6 @@ module.exports = function (app, middleware, controllers) { helpers.setupAdminPageRoute(app, '/admin/manage/privileges/:cid?', middleware, middlewares, controllers.admin.privileges.get); helpers.setupAdminPageRoute(app, '/admin/manage/tags', middleware, middlewares, controllers.admin.tags.get); - helpers.setupAdminPageRoute(app, '/admin/manage/post-queue', middleware, middlewares, controllers.admin.postQueue.get); - helpers.setupAdminPageRoute(app, '/admin/manage/ip-blacklist', middleware, middlewares, controllers.admin.blacklist.get); helpers.setupAdminPageRoute(app, '/admin/manage/users', middleware, middlewares, controllers.admin.users.sortByJoinDate); helpers.setupAdminPageRoute(app, '/admin/manage/users/search', middleware, middlewares, controllers.admin.users.search); diff --git a/src/views/admin/partials/menu.tpl b/src/views/admin/partials/menu.tpl index 31f557308f..653a0ef9a8 100644 --- a/src/views/admin/partials/menu.tpl +++ b/src/views/admin/partials/menu.tpl @@ -15,14 +15,15 @@