From 041531a2e3a1fedb0e1189fee0f65239d4f760ae Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 21 Mar 2016 16:48:07 +0200 Subject: [PATCH 1/7] closes #4424 --- src/socket.io/groups.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js index 8e35d74bca..a54db76b05 100644 --- a/src/socket.io/groups.js +++ b/src/socket.io/groups.js @@ -155,7 +155,7 @@ SocketGroups.kick = isOwner(function(socket, data, callback) { if (socket.uid === parseInt(data.uid, 10)) { return callback(new Error('[[error:cant-kick-self]]')); } - + groups.ownership.isOwner(data.uid, data.groupName, function(err, isOwner) { if (err) { return callback(err); @@ -178,16 +178,16 @@ SocketGroups.create = function(socket, data, callback) { }; SocketGroups.delete = function(socket, data, callback) { - if (data.groupName === 'administrators' || data.groupName === 'registered-users') { + if (data.groupName === 'administrators' || + data.groupName === 'registered-users' || + data.groupName === 'Global Moderators') { return callback(new Error('[[error:not-allowed]]')); } - var tasks = { + async.parallel({ isOwner: async.apply(groups.ownership.isOwner, socket.uid, data.groupName), isAdmin: async.apply(user.isAdministrator, socket.uid) - }; - - async.parallel(tasks, function(err, checks) { + }, function(err, checks) { if (err) { return callback(err); } From f665a1e353ffd9e89994ceaabcda60ef00999e27 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 21 Mar 2016 17:49:44 +0200 Subject: [PATCH 2/7] closes #4394 --- public/src/client/topic/postTools.js | 1 - src/controllers/topics.js | 2 +- src/routes/feeds.js | 2 +- src/social.js | 37 ++++++++++++++++++++++---- src/socket.io/posts/tools.js | 2 +- src/socket.io/topics/infinitescroll.js | 6 ++++- src/topics.js | 25 +++++++++-------- src/topics/posts.js | 24 ++++++++--------- 8 files changed, 66 insertions(+), 33 deletions(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 28701dd56a..101df3c646 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -34,7 +34,6 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator return app.alertError(err); } data.posts.display_move_tools = data.posts.display_move_tools && index !== 0; - data.postSharing = data.postSharing.filter(function(share) { return share.activated === true; }); templates.parse('partials/topic/post-menu-list', data, function(html) { translator.translate(html, function(html) { diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 27c0ed5b81..cb30caf4d3 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -124,7 +124,7 @@ topicsController.get = function(req, res, callback) { return callback(); } - topics.modifyPostsByPrivilege(topicData.posts, userPrivileges); + topics.modifyPostsByPrivilege(topicData, userPrivileges); plugins.fireHook('filter:controllers.topic.get', {topicData: topicData, uid: req.uid}, next); }, diff --git a/src/routes/feeds.js b/src/routes/feeds.js index b71fc99aab..bfa2945fb5 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -49,7 +49,7 @@ function generateForTopic(req, res, callback) { return callback(err); } - topics.modifyPostsByPrivilege(topicData.posts, userPrivileges); + topics.modifyPostsByPrivilege(topicData, userPrivileges); var description = topicData.posts.length ? topicData.posts[0].content : ''; var image_url = topicData.posts.length ? topicData.posts[0].picture : ''; diff --git a/src/social.js b/src/social.js index c450421dcb..fec8fb036c 100644 --- a/src/social.js +++ b/src/social.js @@ -6,7 +6,13 @@ var async = require('async'); var social = {}; +social.postSharing = null; + social.getPostSharing = function(callback) { + if (social.postSharing) { + return callback(null, social.postSharing); + } + var networks = [ { id: "facebook", @@ -39,20 +45,41 @@ social.getPostSharing = function(callback) { networks[i].activated = (activated.indexOf(network.id) !== -1); }); + social.postSharing = networks; next(null, networks); }); } ], callback); }; -social.setActivePostSharingNetworks = function(networkIDs, callback) { - db.delete('social:posts.activated', function(err) { - if (!networkIDs.length) { +social.getActivePostSharing = function(callback) { + social.getPostSharing(function(err, networks) { + if (err) { return callback(err); } - - db.setAdd('social:posts.activated', networkIDs, callback); + networks = networks.filter(function(network) { + return network && network.activated; + }); + callback(null, networks); }); }; +social.setActivePostSharingNetworks = function(networkIDs, callback) { + async.waterfall([ + function (next) { + db.delete('social:posts.activated', next); + }, + function (next) { + if (!networkIDs.length) { + return next(); + } + db.setAdd('social:posts.activated', networkIDs, next); + }, + function (next) { + social.postSharing = null; + next(); + } + ], callback); +}; + module.exports = social; \ No newline at end of file diff --git a/src/socket.io/posts/tools.js b/src/socket.io/posts/tools.js index c3f08461fe..5c59b28918 100644 --- a/src/socket.io/posts/tools.js +++ b/src/socket.io/posts/tools.js @@ -32,7 +32,7 @@ module.exports = function(SocketPosts) { plugins.fireHook('filter:post.tools', {pid: data.pid, uid: socket.uid, tools: []}, next); }, postSharing: function(next) { - social.getPostSharing(next); + social.getActivePostSharing(next); } }, function(err, results) { if (err) { diff --git a/src/socket.io/topics/infinitescroll.js b/src/socket.io/topics/infinitescroll.js index 3ffe1c65c8..5c45c6e4fb 100644 --- a/src/socket.io/topics/infinitescroll.js +++ b/src/socket.io/topics/infinitescroll.js @@ -6,6 +6,7 @@ var topics = require('../../topics'); var privileges = require('../../privileges'); var meta = require('../../meta'); var utils = require('../../../public/src/utils'); +var social = require('../../social'); module.exports = function(SocketTopics) { @@ -68,6 +69,9 @@ module.exports = function(SocketTopics) { }, posts: function(next) { topics.getTopicPosts(data.tid, set, start, stop, socket.uid, reverse, next); + }, + postSharing: function (next) { + social.getActivePostSharing(next); } }, function(err, topicData) { if (err) { @@ -81,7 +85,7 @@ module.exports = function(SocketTopics) { topicData['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; topicData['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; - topics.modifyPostsByPrivilege(topicData.posts, results.privileges); + topics.modifyPostsByPrivilege(topicData, results.privileges); callback(null, topicData); }); }); diff --git a/src/topics.js b/src/topics.js index 4f7f5a066d..ea9ac41830 100644 --- a/src/topics.js +++ b/src/topics.js @@ -1,15 +1,16 @@ "use strict"; -var async = require('async'), - _ = require('underscore'), - - db = require('./database'), - posts = require('./posts'), - utils = require('../public/src/utils'), - plugins = require('./plugins'), - user = require('./user'), - categories = require('./categories'), - privileges = require('./privileges'); +var async = require('async'); +var _ = require('underscore'); + +var db = require('./database'); +var posts = require('./posts'); +var utils = require('../public/src/utils'); +var plugins = require('./plugins'); +var user = require('./user'); +var categories = require('./categories'); +var privileges = require('./privileges'); +var social = require('./social'); (function(Topics) { @@ -179,7 +180,8 @@ var async = require('async'), threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', {topic: topicData, uid: uid, tools: []}), tags: async.apply(Topics.getTopicTagsObjects, topicData.tid), isFollowing: async.apply(Topics.isFollowing, [topicData.tid], uid), - bookmark: async.apply(Topics.getUserBookmark, topicData.tid, uid) + bookmark: async.apply(Topics.getUserBookmark, topicData.tid, uid), + postSharing: async.apply(social.getActivePostSharing) }, next); }, function (results, next) { @@ -189,6 +191,7 @@ var async = require('async'), topicData.tags = results.tags; topicData.isFollowing = results.isFollowing[0]; topicData.bookmark = results.bookmark; + topicData.postSharing = results.postSharing; topicData.unreplied = parseInt(topicData.postcount, 10) === 1; topicData.deleted = parseInt(topicData.deleted, 10) === 1; diff --git a/src/topics/posts.js b/src/topics/posts.js index 8177e93ebd..0c9722f801 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -1,16 +1,15 @@ - 'use strict'; -var async = require('async'), - _ = require('underscore'), - validator = require('validator'), +var async = require('async'); +var _ = require('underscore'); +var validator = require('validator'); - db = require('../database'), - user = require('../user'), - favourites = require('../favourites'), - posts = require('../posts'), - meta = require('../meta'); +var db = require('../database'); +var user = require('../user'); +var favourites = require('../favourites'); +var posts = require('../posts'); +var meta = require('../meta'); module.exports = function(Topics) { @@ -138,12 +137,13 @@ module.exports = function(Topics) { }); }; - Topics.modifyPostsByPrivilege = function(postData, topicPrivileges) { - postData.forEach(function(post) { + Topics.modifyPostsByPrivilege = function(topicData, topicPrivileges) { + var loggedIn = !!parseInt(topicPrivileges.uid, 10); + topicData.posts.forEach(function(post) { if (post) { post.display_moderator_tools = topicPrivileges.isAdminOrMod || post.selfPost; post.display_move_tools = topicPrivileges.isAdminOrMod && post.index !== 0; - post.display_post_menu = topicPrivileges.isAdminOrMod || post.selfPost || !post.deleted; + post.display_post_menu = topicPrivileges.isAdminOrMod || post.selfPost || ((loggedIn || topicData.postSharing.length) && !post.deleted); post.ip = topicPrivileges.isAdminOrMod ? post.ip : undefined; if (post.deleted && !(topicPrivileges.isAdminOrMod || post.selfPost)) { From 8075a2f00fcf50300ce912e6be1145e7489cf5d1 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 21 Mar 2016 17:51:10 +0200 Subject: [PATCH 3/7] up persona --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 71864fcb41..8afd54ca9a 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.9", - "nodebb-theme-persona": "4.0.101", + "nodebb-theme-persona": "4.0.102", "nodebb-theme-vanilla": "5.0.57", "nodebb-widget-essentials": "2.0.8", "nodemailer": "2.0.0", From 301f12d630ba72c72c144581a038173da40672e2 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 21 Mar 2016 17:55:15 +0200 Subject: [PATCH 4/7] fix conditional --- public/src/client/topic/posts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index c83b8c245f..143a547744 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -26,7 +26,7 @@ define('forum/topic/posts', [ post.selfPost = !!app.user.uid && parseInt(post.uid, 10) === parseInt(app.user.uid, 10); post.display_moderator_tools = post.selfPost || ajaxify.data.privileges.isAdminOrMod; post.display_move_tools = ajaxify.data.privileges.isAdminOrMod; - post.display_post_menu = post.selfPost || ajaxify.data.privileges.isAdminOrMod || !post.deleted; + post.display_post_menu = ajaxify.data.privileges.isAdminOrMod || post.selfPost || ((app.user.uid || ajaxify.data.postSharing.length) && !post.deleted); }); updatePostCounts(data.posts); From cb8abab5c52bd347fc87e09500e036ec740e3977 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 21 Mar 2016 18:13:36 +0200 Subject: [PATCH 5/7] fix for undefined topicTitle --- src/notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/notifications.js b/src/notifications.js index f32ca031d3..8e90e0d62f 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -450,7 +450,7 @@ var async = require('async'), }); var numUsers = usernames.length; - var title = S(notifications[modifyIndex].topicTitle).decodeHTMLEntities().s; + var title = S(notifications[modifyIndex].topicTitle || '').decodeHTMLEntities().s; var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ','); if (numUsers === 2) { From e3077b0ab0c83162130f59d91803002fdef25be6 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 21 Mar 2016 18:18:59 +0200 Subject: [PATCH 6/7] dont use titleEscaped if its empty --- src/notifications.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/notifications.js b/src/notifications.js index 8e90e0d62f..498337a7db 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -106,7 +106,7 @@ var async = require('async'), }); callback(null, _nids.filter(function(nid, idx) { - return mergeIds.indexOf(sets[idx]) !== -1 + return mergeIds.indexOf(sets[idx]) !== -1; })); }); }; @@ -452,11 +452,12 @@ var async = require('async'), var title = S(notifications[modifyIndex].topicTitle || '').decodeHTMLEntities().s; var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ','); + titleEscaped = titleEscaped ? (', ' + titleEscaped) : ''; if (numUsers === 2) { - notifications[modifyIndex].bodyShort = '[[' + mergeId + '_dual, ' + usernames.join(', ') + ', ' + titleEscaped + ']]'; + notifications[modifyIndex].bodyShort = '[[' + mergeId + '_dual, ' + usernames.join(', ') + titleEscaped + ']]'; } else if (numUsers > 2) { - notifications[modifyIndex].bodyShort = '[[' + mergeId + '_multiple, ' + usernames[0] + ', ' + (numUsers-1) + ', ' + titleEscaped + ']]'; + notifications[modifyIndex].bodyShort = '[[' + mergeId + '_multiple, ' + usernames[0] + ', ' + (numUsers - 1) + titleEscaped + ']]'; } break; From 35a7554ec7c312435fe9c2ba5a1461da4f76fe5a Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 21 Mar 2016 18:41:33 +0200 Subject: [PATCH 7/7] closes #4427 --- src/topics/data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topics/data.js b/src/topics/data.js index a32ce5256a..9d153b5b78 100644 --- a/src/topics/data.js +++ b/src/topics/data.js @@ -59,7 +59,7 @@ module.exports = function(Topics) { return; } topic.titleRaw = topic.title; - topic.title = validator.escape(topic.title); + topic.title = validator.escape(String(topic.title)); topic.timestampISO = utils.toISOString(topic.timestamp); topic.lastposttimeISO = utils.toISOString(topic.lastposttime); }