diff --git a/public/language/en-GB/admin/manage/privileges.json b/public/language/en-GB/admin/manage/privileges.json index 07d0a4de50..6cadf3798c 100644 --- a/public/language/en-GB/admin/manage/privileges.json +++ b/public/language/en-GB/admin/manage/privileges.json @@ -11,6 +11,7 @@ "search-users": "Search Users", "search-tags": "Search Tags", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/en-GB/admin/settings/group.json b/public/language/en-GB/admin/settings/group.json index fe3e39915b..8275cbd367 100644 --- a/public/language/en-GB/admin/settings/group.json +++ b/public/language/en-GB/admin/settings/group.json @@ -3,8 +3,6 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", "cover-image": "Group Cover Image", diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index de5998469b..d649518949 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -178,7 +178,7 @@ } } return states.map(function (priv) { - var guestDisabled = ['groups:moderate', 'groups:posts:upvote', 'groups:posts:downvote', 'groups:local:login']; + var guestDisabled = ['groups:moderate', 'groups:posts:upvote', 'groups:posts:downvote', 'groups:local:login', 'groups:group:create']; var spidersEnabled = ['groups:find', 'groups:read', 'groups:topics:read']; var disabled = (member === 'guests' && guestDisabled.includes(priv.name)) || diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 96e6c0bbbb..041ba878df 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -8,6 +8,7 @@ var groups = require('../groups'); var user = require('../user'); var helpers = require('./helpers'); var pagination = require('../pagination'); +var privileges = require('../privileges'); var groupsController = module.exports; @@ -34,12 +35,15 @@ groupsController.getGroupsFromSet = function (uid, sort, start, stop, callback) async.waterfall([ function (next) { - groups.getGroupsFromSet(set, uid, start, stop, next); + async.parallel({ + groupsData: async.apply(groups.getGroupsFromSet, set, uid, start, stop), + allowGroupCreation: async.apply(privileges.global.can, 'group:create', uid), + }, next); }, - function (groupsData, next) { + function (results, next) { next(null, { - groups: groupsData, - allowGroupCreation: meta.config.allowGroupCreation, + groups: results.groupsData, + allowGroupCreation: results.allowGroupCreation, nextStart: stop + 1, }); }, diff --git a/src/privileges/global.js b/src/privileges/global.js index 5d0cb88213..aee98a836d 100644 --- a/src/privileges/global.js +++ b/src/privileges/global.js @@ -22,6 +22,7 @@ module.exports = function (privileges) { { name: '[[admin/manage/privileges:search-users]]' }, { name: '[[admin/manage/privileges:search-tags]]' }, { name: '[[admin/manage/privileges:allow-local-login]]' }, + { name: '[[admin/manage/privileges:allow-group-creation]]' }, ]; privileges.global.userPrivilegeList = [ @@ -34,6 +35,7 @@ module.exports = function (privileges) { 'search:users', 'search:tags', 'local:login', + 'group:create', ]; privileges.global.groupPrivilegeList = privileges.global.userPrivilegeList.map(function (privilege) { diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js index e4f7a0a985..8301974a7d 100644 --- a/src/socket.io/groups.js +++ b/src/socket.io/groups.js @@ -8,6 +8,7 @@ var user = require('../user'); var utils = require('../utils'); var groupsController = require('../controllers/groups'); var events = require('../events'); +var privileges = require('../privileges'); var SocketGroups = module.exports; @@ -238,14 +239,22 @@ SocketGroups.kick = isOwner(function (socket, data, callback) { SocketGroups.create = function (socket, data, callback) { if (!socket.uid) { return callback(new Error('[[error:no-privileges]]')); - } else if (!meta.config.allowGroupCreation) { - return callback(new Error('[[error:group-creation-disabled]]')); } else if (groups.isPrivilegeGroup(data.name)) { return callback(new Error('[[error:invalid-group-name]]')); } - data.ownerUid = socket.uid; - groups.create(data, callback); + async.waterfall([ + function (next) { + privileges.global.can('group:create', socket.uid, next); + }, + function (canCreate, next) { + if (!canCreate) { + return next(new Error('[[error:no-privileges]]')); + } + data.ownerUid = socket.uid; + groups.create(data, next); + }, + ], callback); }; SocketGroups.delete = isOwner(function (socket, data, callback) { diff --git a/src/upgrades/1.12.0/group_create_privilege.js b/src/upgrades/1.12.0/group_create_privilege.js new file mode 100644 index 0000000000..59f45ced84 --- /dev/null +++ b/src/upgrades/1.12.0/group_create_privilege.js @@ -0,0 +1,16 @@ +'use strict'; + +var privileges = require('../../privileges'); + +module.exports = { + name: 'Update category watch data', + timestamp: Date.UTC(2019, 0, 4), + method: function (callback) { + var meta = require('../../meta'); + if (parseInt(meta.config.allowGroupCreation, 10) === 1) { + privileges.global.give(['groups:create'], 'registered-users', callback); + } else { + setImmediate(callback); + } + }, +}; diff --git a/src/views/admin/settings/group.tpl b/src/views/admin/settings/group.tpl index 5319ef5309..d46b664116 100644 --- a/src/views/admin/settings/group.tpl +++ b/src/views/admin/settings/group.tpl @@ -18,17 +18,6 @@ [[admin/settings/group:private-groups.warning]]
-- [[admin/settings/group:allow-creation-help]] -
-