mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 08:36:12 +01:00
fix: closes #7217
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
"private-groups": "Private Groups",
|
||||
"private-groups.help": "If enabled, joining of groups requires the approval of the group owner <em>(Default: enabled)</em>",
|
||||
"private-groups.warning": "<strong>Beware!</strong> 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 <em>(Default: disabled)</em>",
|
||||
"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",
|
||||
|
||||
@@ -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)) ||
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
},
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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]]'));
|
||||
}
|
||||
|
||||
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, callback);
|
||||
groups.create(data, next);
|
||||
},
|
||||
], callback);
|
||||
};
|
||||
|
||||
SocketGroups.delete = isOwner(function (socket, data, callback) {
|
||||
|
||||
16
src/upgrades/1.12.0/group_create_privilege.js
Normal file
16
src/upgrades/1.12.0/group_create_privilege.js
Normal file
@@ -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);
|
||||
}
|
||||
},
|
||||
};
|
||||
@@ -18,17 +18,6 @@
|
||||
[[admin/settings/group:private-groups.warning]]
|
||||
</p>
|
||||
|
||||
<div class="checkbox">
|
||||
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect">
|
||||
<input class="mdl-switch__input" type="checkbox" data-field="allowGroupCreation">
|
||||
<span class="mdl-switch__label"><strong>[[admin/settings/group:allow-creation]]</strong></span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<p class="help-block">
|
||||
[[admin/settings/group:allow-creation-help]]
|
||||
</p>
|
||||
|
||||
<div class="checkbox">
|
||||
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect">
|
||||
<input class="mdl-switch__input" type="checkbox" data-field="allowMultipleBadges">
|
||||
|
||||
@@ -743,6 +743,7 @@ describe('Categories', function () {
|
||||
'upload:post:file': false,
|
||||
signature: false,
|
||||
'local:login': false,
|
||||
'group:create': false,
|
||||
});
|
||||
|
||||
done();
|
||||
@@ -787,6 +788,7 @@ describe('Categories', function () {
|
||||
'groups:upload:post:file': false,
|
||||
'groups:signature': true,
|
||||
'groups:local:login': true,
|
||||
'groups:group:create': false,
|
||||
});
|
||||
|
||||
done();
|
||||
|
||||
@@ -985,31 +985,21 @@ describe('Groups', function () {
|
||||
});
|
||||
|
||||
it('should fail to create group if group creation is disabled', function (done) {
|
||||
var oldValue = meta.config.allowGroupCreation;
|
||||
meta.config.allowGroupCreation = 0;
|
||||
socketGroups.create({ uid: 1 }, {}, function (err) {
|
||||
assert.equal(err.message, '[[error:group-creation-disabled]]');
|
||||
meta.config.allowGroupCreation = oldValue;
|
||||
socketGroups.create({ uid: testUid }, {}, function (err) {
|
||||
assert.equal(err.message, '[[error:no-privileges]]');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should fail to create group if name is privilege group', function (done) {
|
||||
var oldValue = meta.config.allowGroupCreation;
|
||||
meta.config.allowGroupCreation = 1;
|
||||
socketGroups.create({ uid: 1 }, { name: 'cid:1:privileges:groups:find' }, function (err) {
|
||||
assert.equal(err.message, '[[error:invalid-group-name]]');
|
||||
meta.config.allowGroupCreation = oldValue;
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
it('should create/update group', function (done) {
|
||||
var oldValue = meta.config.allowGroupCreation;
|
||||
meta.config.allowGroupCreation = 1;
|
||||
socketGroups.create({ uid: adminUid }, { name: 'createupdategroup' }, function (err, groupData) {
|
||||
meta.config.allowGroupCreation = oldValue;
|
||||
assert.ifError(err);
|
||||
assert(groupData);
|
||||
var data = {
|
||||
@@ -1041,10 +1031,7 @@ describe('Groups', function () {
|
||||
});
|
||||
|
||||
it('should fail to create a group with name guests', function (done) {
|
||||
var oldValue = meta.config.allowGroupCreation;
|
||||
meta.config.allowGroupCreation = 1;
|
||||
socketGroups.create({ uid: adminUid }, { name: 'guests' }, function (err) {
|
||||
meta.config.allowGroupCreation = oldValue;
|
||||
assert.equal(err.message, '[[error:invalid-group-name]]');
|
||||
done();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user