diff --git a/CHANGELOG.md b/CHANGELOG.md index c332c62342..0c361fc2c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ +#### v2.5.5 (2022-10-11) + +##### Chores + +* up plugins (b91ef6dd) +* incrementing version number - v2.5.4 (e83260ca) +* update changelog for v2.5.4 (aabf073c) +* incrementing version number - v2.5.3 (7e922936) +* incrementing version number - v2.5.2 (babcd17e) +* incrementing version number - v2.5.1 (ce3aa950) +* incrementing version number - v2.5.0 (01d276cb) +* incrementing version number - v2.4.5 (dd3e1a28) +* incrementing version number - v2.4.4 (d5525c87) +* incrementing version number - v2.4.3 (9c647c6c) +* incrementing version number - v2.4.2 (3aa7b855) +* incrementing version number - v2.4.1 (60cbd148) +* incrementing version number - v2.4.0 (4834cde3) +* incrementing version number - v2.3.1 (d2425942) +* incrementing version number - v2.3.0 (046ea120) + #### v2.5.4 (2022-10-11) ##### Chores diff --git a/src/api/groups.js b/src/api/groups.js index 36f11471d2..9e6aa30d0b 100644 --- a/src/api/groups.js +++ b/src/api/groups.js @@ -215,14 +215,14 @@ async function isOwner(caller, groupName) { if (typeof groupName !== 'string') { throw new Error('[[error:invalid-group-name]]'); } - const [isAdmin, isGlobalModerator, isOwner, group] = await Promise.all([ - user.isAdministrator(caller.uid), + const [hasAdminPrivilege, isGlobalModerator, isOwner, group] = await Promise.all([ + privileges.admin.can('admin:groups', caller.uid), user.isGlobalModerator(caller.uid), groups.ownership.isOwner(caller.uid, groupName), groups.getGroupData(groupName), ]); - const check = isOwner || isAdmin || (isGlobalModerator && !group.system); + const check = isOwner || hasAdminPrivilege || (isGlobalModerator && !group.system); if (!check) { throw new Error('[[error:no-privileges]]'); } diff --git a/src/install.js b/src/install.js index 97e981d071..ba0f13e7be 100644 --- a/src/install.js +++ b/src/install.js @@ -342,6 +342,14 @@ async function createAdmin() { try { User.isPasswordValid(results.password); } catch (err) { + const [namespace, key] = err.message.slice(2, -2).split(':', 2); + if (namespace && key && err.message.startsWith('[[') && err.message.endsWith(']]')) { + const lang = require(path.join(__dirname, `../public/language/en-GB/${namespace}`)); + if (lang && lang[key]) { + err.message = lang[key]; + } + } + winston.warn(`Password error, please try again. ${err.message}`); return await retryPassword(results); } diff --git a/src/meta/build.js b/src/meta/build.js index 0647cc7e0d..5f272387b3 100644 --- a/src/meta/build.js +++ b/src/meta/build.js @@ -201,7 +201,7 @@ exports.webpack = async function (options) { const util = require('util'); const plugins = require('../plugins/data'); - const activePlugins = await plugins.getActive(); + const activePlugins = (await plugins.getActive()).map(p => p.id); if (!activePlugins.includes('nodebb-plugin-composer-default')) { activePlugins.push('nodebb-plugin-composer-default'); } diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js index 7e7c93d859..3b6f30a38d 100644 --- a/src/socket.io/groups.js +++ b/src/socket.io/groups.js @@ -42,13 +42,15 @@ async function isOwner(socket, data) { throw new Error('[[error:invalid-group-name]]'); } const results = await utils.promiseParallel({ - isAdmin: await user.isAdministrator(socket.uid), - isGlobalModerator: await user.isGlobalModerator(socket.uid), - isOwner: await groups.ownership.isOwner(socket.uid, data.groupName), - group: await groups.getGroupData(data.groupName), + hasAdminPrivilege: privileges.admin.can('admin:groups', socket.uid), + isGlobalModerator: user.isGlobalModerator(socket.uid), + isOwner: groups.ownership.isOwner(socket.uid, data.groupName), + group: groups.getGroupData(data.groupName), }); - const isOwner = results.isOwner || results.isAdmin || (results.isGlobalModerator && !results.group.system); + const isOwner = results.isOwner || + results.hasAdminPrivilege || + (results.isGlobalModerator && !results.group.system); if (!isOwner) { throw new Error('[[error:no-privileges]]'); } @@ -220,15 +222,15 @@ SocketGroups.loadMoreMembers = async (socket, data) => { }; async function canSearchMembers(uid, groupName) { - const [isHidden, isMember, isAdmin, isGlobalMod, viewGroups] = await Promise.all([ + const [isHidden, isMember, hasAdminPrivilege, isGlobalMod, viewGroups] = await Promise.all([ groups.isHidden(groupName), groups.isMember(uid, groupName), - user.isAdministrator(uid), + privileges.admin.can('admin:groups', uid), user.isGlobalModerator(uid), privileges.global.can('view:groups', uid), ]); - if (!viewGroups || (isHidden && !isMember && !isAdmin && !isGlobalMod)) { + if (!viewGroups || (isHidden && !isMember && !hasAdminPrivilege && !isGlobalMod)) { throw new Error('[[error:no-privileges]]'); } } @@ -268,11 +270,11 @@ async function canModifyGroup(uid, groupName) { const results = await utils.promiseParallel({ isOwner: groups.ownership.isOwner(uid, groupName), system: groups.getGroupField(groupName, 'system'), - isAdmin: user.isAdministrator(uid), + hasAdminPrivilege: privileges.admin.can('admin:groups', uid), isGlobalMod: user.isGlobalModerator(uid), }); - if (!(results.isOwner || results.isAdmin || (results.isGlobalMod && !results.system))) { + if (!(results.isOwner || results.hasAdminPrivilege || (results.isGlobalMod && !results.system))) { throw new Error('[[error:no-privileges]]'); } }