From f665a1e353ffd9e89994ceaabcda60ef00999e27 Mon Sep 17 00:00:00 2001
From: barisusakli <barisusakli@gmail.com>
Date: Mon, 21 Mar 2016 17:49:44 +0200
Subject: [PATCH] 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)) {