diff --git a/public/language/en_GB/error.json b/public/language/en_GB/error.json index 251db61998..fed0c807c9 100644 --- a/public/language/en_GB/error.json +++ b/public/language/en_GB/error.json @@ -65,6 +65,7 @@ "group-name-too-short": "Group name too short", "group-already-exists": "Group already exists", "group-name-change-not-allowed": "Group name change not allowed", + "group-already-member": "You are already part of this group", "post-already-deleted": "This post has already been deleted", "post-already-restored": "This post has already been restored", diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index c439216d25..0ef47b3fd8 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -120,7 +120,9 @@ define('forum/groups/details', ['iconSelect', 'vendor/colorpicker/colorpicker', } if (settings.name) { - ajaxify.go('groups/' + encodeURIComponent(settings.name)); + var pathname = window.location.pathname; + pathname = pathname.substr(1, pathname.lastIndexOf('/')); + ajaxify.go(pathname + encodeURIComponent(settings.name)); } else { ajaxify.refresh(); } diff --git a/public/src/client/groups/list.js b/public/src/client/groups/list.js index 3fc76a4962..d4a92ac9aa 100644 --- a/public/src/client/groups/list.js +++ b/public/src/client/groups/list.js @@ -10,7 +10,7 @@ define('forum/groups/list', function() { groupsEl.on('click', '.list-cover', function() { var groupName = $(this).parents('[data-group]').attr('data-group'); - ajaxify.go('groups/' + groupName); + ajaxify.go('groups/' + encodeURIComponent(groupName)); }); // Group creation diff --git a/src/database/redis/main.js b/src/database/redis/main.js index 5157386d3b..9b08e4af65 100644 --- a/src/database/redis/main.js +++ b/src/database/redis/main.js @@ -77,6 +77,7 @@ module.exports = function(redisClient, module) { }; module.deleteAll = function(keys, callback) { + callback = callback || function() {}; var multi = redisClient.multi(); for(var i=0; i 0) { - db.setAdd('group:' + groupName + ':pending', uid, callback); - plugins.fireHook('action:group.requestMembership', { - groupName: groupName, - uid: uid - }); - } else { - callback(new Error('[[error:not-logged-in]]')); - } + async.parallel({ + exists: async.apply(Groups.isMember, uid, groupName), + isMember: async.apply(Groups.exists, groupName) + }, function(err, checks) { + if (!checks.exists) { + return callback(new Error('[[error:no-group]]')); + } else if (checks.isMember) { + return callback(new Error('[[error:group-already-member]]')); + } + + if (parseInt(uid, 10) > 0) { + db.setAdd('group:' + groupName + ':pending', uid, callback); + plugins.fireHook('action:group.requestMembership', { + groupName: groupName, + uid: uid + }); + } else { + callback(new Error('[[error:not-logged-in]]')); + } + }); }; Groups.acceptMembership = function(groupName, uid, callback) { diff --git a/src/privileges/categories.js b/src/privileges/categories.js index 7662ef5913..5ff70730d4 100644 --- a/src/privileges/categories.js +++ b/src/privileges/categories.js @@ -143,6 +143,12 @@ module.exports = function(privileges) { }, callback); }; + privileges.categories.rescind = function(privileges, cid, groupName, callback) { + async.each(privileges, function(privilege, next) { + groups.leave('cid:' + cid + ':privileges:groups:' + privilege, groupName, next); + }, callback); + }; + privileges.categories.canMoveAllTopics = function(currentCid, targetCid, uid, callback) { async.parallel({ isAdministrator: function(next) {