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-users": "Search Users",
|
||||||
"search-tags": "Search Tags",
|
"search-tags": "Search Tags",
|
||||||
"allow-local-login": "Local Login",
|
"allow-local-login": "Local Login",
|
||||||
|
"allow-group-creation": "Group Create",
|
||||||
|
|
||||||
"find-category": "Find Category",
|
"find-category": "Find Category",
|
||||||
"access-category": "Access Category",
|
"access-category": "Access Category",
|
||||||
|
|||||||
@@ -3,8 +3,6 @@
|
|||||||
"private-groups": "Private Groups",
|
"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.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.",
|
"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.",
|
"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",
|
"max-name-length": "Maximum Group Name Length",
|
||||||
"cover-image": "Group Cover Image",
|
"cover-image": "Group Cover Image",
|
||||||
|
|||||||
@@ -178,7 +178,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return states.map(function (priv) {
|
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 spidersEnabled = ['groups:find', 'groups:read', 'groups:topics:read'];
|
||||||
var disabled =
|
var disabled =
|
||||||
(member === 'guests' && guestDisabled.includes(priv.name)) ||
|
(member === 'guests' && guestDisabled.includes(priv.name)) ||
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ var groups = require('../groups');
|
|||||||
var user = require('../user');
|
var user = require('../user');
|
||||||
var helpers = require('./helpers');
|
var helpers = require('./helpers');
|
||||||
var pagination = require('../pagination');
|
var pagination = require('../pagination');
|
||||||
|
var privileges = require('../privileges');
|
||||||
|
|
||||||
var groupsController = module.exports;
|
var groupsController = module.exports;
|
||||||
|
|
||||||
@@ -34,12 +35,15 @@ groupsController.getGroupsFromSet = function (uid, sort, start, stop, callback)
|
|||||||
|
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
function (next) {
|
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, {
|
next(null, {
|
||||||
groups: groupsData,
|
groups: results.groupsData,
|
||||||
allowGroupCreation: meta.config.allowGroupCreation,
|
allowGroupCreation: results.allowGroupCreation,
|
||||||
nextStart: stop + 1,
|
nextStart: stop + 1,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ module.exports = function (privileges) {
|
|||||||
{ name: '[[admin/manage/privileges:search-users]]' },
|
{ name: '[[admin/manage/privileges:search-users]]' },
|
||||||
{ name: '[[admin/manage/privileges:search-tags]]' },
|
{ name: '[[admin/manage/privileges:search-tags]]' },
|
||||||
{ name: '[[admin/manage/privileges:allow-local-login]]' },
|
{ name: '[[admin/manage/privileges:allow-local-login]]' },
|
||||||
|
{ name: '[[admin/manage/privileges:allow-group-creation]]' },
|
||||||
];
|
];
|
||||||
|
|
||||||
privileges.global.userPrivilegeList = [
|
privileges.global.userPrivilegeList = [
|
||||||
@@ -34,6 +35,7 @@ module.exports = function (privileges) {
|
|||||||
'search:users',
|
'search:users',
|
||||||
'search:tags',
|
'search:tags',
|
||||||
'local:login',
|
'local:login',
|
||||||
|
'group:create',
|
||||||
];
|
];
|
||||||
|
|
||||||
privileges.global.groupPrivilegeList = privileges.global.userPrivilegeList.map(function (privilege) {
|
privileges.global.groupPrivilegeList = privileges.global.userPrivilegeList.map(function (privilege) {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ var user = require('../user');
|
|||||||
var utils = require('../utils');
|
var utils = require('../utils');
|
||||||
var groupsController = require('../controllers/groups');
|
var groupsController = require('../controllers/groups');
|
||||||
var events = require('../events');
|
var events = require('../events');
|
||||||
|
var privileges = require('../privileges');
|
||||||
|
|
||||||
var SocketGroups = module.exports;
|
var SocketGroups = module.exports;
|
||||||
|
|
||||||
@@ -238,14 +239,22 @@ SocketGroups.kick = isOwner(function (socket, data, callback) {
|
|||||||
SocketGroups.create = function (socket, data, callback) {
|
SocketGroups.create = function (socket, data, callback) {
|
||||||
if (!socket.uid) {
|
if (!socket.uid) {
|
||||||
return callback(new Error('[[error:no-privileges]]'));
|
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)) {
|
} else if (groups.isPrivilegeGroup(data.name)) {
|
||||||
return callback(new Error('[[error:invalid-group-name]]'));
|
return callback(new Error('[[error:invalid-group-name]]'));
|
||||||
}
|
}
|
||||||
|
|
||||||
data.ownerUid = socket.uid;
|
async.waterfall([
|
||||||
groups.create(data, callback);
|
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) {
|
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]]
|
[[admin/settings/group:private-groups.warning]]
|
||||||
</p>
|
</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">
|
<div class="checkbox">
|
||||||
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect">
|
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect">
|
||||||
<input class="mdl-switch__input" type="checkbox" data-field="allowMultipleBadges">
|
<input class="mdl-switch__input" type="checkbox" data-field="allowMultipleBadges">
|
||||||
|
|||||||
@@ -743,6 +743,7 @@ describe('Categories', function () {
|
|||||||
'upload:post:file': false,
|
'upload:post:file': false,
|
||||||
signature: false,
|
signature: false,
|
||||||
'local:login': false,
|
'local:login': false,
|
||||||
|
'group:create': false,
|
||||||
});
|
});
|
||||||
|
|
||||||
done();
|
done();
|
||||||
@@ -787,6 +788,7 @@ describe('Categories', function () {
|
|||||||
'groups:upload:post:file': false,
|
'groups:upload:post:file': false,
|
||||||
'groups:signature': true,
|
'groups:signature': true,
|
||||||
'groups:local:login': true,
|
'groups:local:login': true,
|
||||||
|
'groups:group:create': false,
|
||||||
});
|
});
|
||||||
|
|
||||||
done();
|
done();
|
||||||
|
|||||||
@@ -985,31 +985,21 @@ describe('Groups', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should fail to create group if group creation is disabled', function (done) {
|
it('should fail to create group if group creation is disabled', function (done) {
|
||||||
var oldValue = meta.config.allowGroupCreation;
|
socketGroups.create({ uid: testUid }, {}, function (err) {
|
||||||
meta.config.allowGroupCreation = 0;
|
assert.equal(err.message, '[[error:no-privileges]]');
|
||||||
socketGroups.create({ uid: 1 }, {}, function (err) {
|
|
||||||
assert.equal(err.message, '[[error:group-creation-disabled]]');
|
|
||||||
meta.config.allowGroupCreation = oldValue;
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fail to create group if name is privilege group', function (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) {
|
socketGroups.create({ uid: 1 }, { name: 'cid:1:privileges:groups:find' }, function (err) {
|
||||||
assert.equal(err.message, '[[error:invalid-group-name]]');
|
assert.equal(err.message, '[[error:invalid-group-name]]');
|
||||||
meta.config.allowGroupCreation = oldValue;
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should create/update group', function (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) {
|
socketGroups.create({ uid: adminUid }, { name: 'createupdategroup' }, function (err, groupData) {
|
||||||
meta.config.allowGroupCreation = oldValue;
|
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert(groupData);
|
assert(groupData);
|
||||||
var data = {
|
var data = {
|
||||||
@@ -1041,10 +1031,7 @@ describe('Groups', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should fail to create a group with name guests', function (done) {
|
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) {
|
socketGroups.create({ uid: adminUid }, { name: 'guests' }, function (err) {
|
||||||
meta.config.allowGroupCreation = oldValue;
|
|
||||||
assert.equal(err.message, '[[error:invalid-group-name]]');
|
assert.equal(err.message, '[[error:invalid-group-name]]');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user