From d959aad41f885526958382f801c932d9dbe9fe64 Mon Sep 17 00:00:00 2001 From: Richie Preece Date: Tue, 21 Jan 2014 20:56:12 -0700 Subject: [PATCH 01/18] Changed to bcrypt.js --- package.json | 4 ++-- src/login.js | 2 +- src/user.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index bbc04c94ac..8534d01908 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "passport-facebook": "0.1.5", "less-middleware": "0.1.12", "marked": "0.2.8", - "bcrypt": "0.7.5", "async": "~0.2.8", "node-imagemagick": "0.1.8", "gravatar": "1.0.6", @@ -47,7 +46,8 @@ "semver": "~2.2.1", "string": "~1.7.0", "xregexp": "~2.0.0", - "socket.io-wildcard": "~0.1.1" + "socket.io-wildcard": "~0.1.1", + "bcryptjs": "~0.7.10" }, "optionalDependencies": { "redis": "0.8.3", diff --git a/src/login.js b/src/login.js index c4eb226586..baa636d73a 100644 --- a/src/login.js +++ b/src/login.js @@ -1,5 +1,5 @@ var user = require('./user'), - bcrypt = require('bcrypt'), + bcrypt = require('bcryptjs'), db = require('./database'), path = require('path'), winston = require('winston'), diff --git a/src/user.js b/src/user.js index f9e6bc548a..10dd494b2f 100644 --- a/src/user.js +++ b/src/user.js @@ -1,4 +1,4 @@ -var bcrypt = require('bcrypt'), +var bcrypt = require('bcryptjs'), async = require('async'), nconf = require('nconf'), winston = require('winston'), From da626a4035d6a5130954bde7c021642c715c5e0a Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sun, 26 Jan 2014 16:23:37 -0500 Subject: [PATCH 02/18] more fixes --- src/database/mongo.js | 17 +++++++++++++++++ src/database/redis.js | 4 ++++ src/routes/api.js | 2 +- src/topics.js | 26 +++++++++++++++++++------- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/database/mongo.js b/src/database/mongo.js index 59fbc41b5a..9ebc45bd33 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -656,6 +656,23 @@ }); } + module.sortedSetRevRank = function(key, value, callback) { + if(value !== null && value !== undefined) { + value = value.toString(); + } + module.getSortedSetRange(key, 0, -1, function(err, result) { + if(err) { + return callback(err); + } + var rank = result.indexOf(value); + if(rank === -1) { + return callback(null, null); + } + + callback(null, result.length - rank - 1); + }); + } + module.sortedSetScore = function(key, value, callback) { if(value !== null && value !== undefined) { value = value.toString(); diff --git a/src/database/redis.js b/src/database/redis.js index de4802456c..b4e67b836b 100644 --- a/src/database/redis.js +++ b/src/database/redis.js @@ -382,6 +382,10 @@ redisClient.zrank(key, value, callback); } + module.sortedSetRevRank = function(key, value, callback) { + redisClient.zrevrank(key, value, callback); + } + module.sortedSetScore = function(key, value, callback) { redisClient.zscore(key, value, callback); } diff --git a/src/routes/api.js b/src/routes/api.js index 6dbb0080f7..58b818668d 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -245,7 +245,7 @@ var path = require('path'), app.get('/recent/:term?', function (req, res, next) { var uid = (req.user) ? req.user.uid : 0; - topics.getLatestTopics(uid, 0, 19, req.params.term, function (err, data) { + topics.getLatestTopics(uid, 0, 9, req.params.term, function (err, data) { if(err) { return next(err); } diff --git a/src/topics.js b/src/topics.js index d7848ce466..76a98767d9 100644 --- a/src/topics.js +++ b/src/topics.js @@ -426,8 +426,9 @@ var async = require('async'), }; var since = terms['day']; - if(terms[term]) + if(terms[term]) { since = terms[term]; + } var args = ['topics:recent', '+inf', timestamp - since, 'LIMIT', start, end - start + 1]; db.getSortedSetRevRangeByScore(args, function(err, tids) { @@ -442,11 +443,9 @@ var async = require('async'), if (!tids || !tids.length) { latestTopics.no_topics_message = 'show'; - callback(err, latestTopics); - return; + return callback(null, latestTopics); } - // Filter out topics that belong to categories that this user cannot access async.filter(tids, function(tid, next) { threadTools.privileges(tid, current_user, function(err, privileges) { if (!err && privileges.read) { @@ -457,8 +456,20 @@ var async = require('async'), }); }, function(tids) { Topics.getTopicsByTids(tids, 0, current_user, function(err, topicData) { - latestTopics.topics = topicData; - callback(err, latestTopics); + if(err) { + return callback(err); + } + + if(!topicData || !topicData.length) { + latestTopics.no_topics_message = 'show'; + return callback(null, latestTopics); + } + + db.sortedSetRevRank('topics:recent', topicData[topicData.length - 1].tid, function(err, rank) { + latestTopics.lastIndex = rank; + latestTopics.topics = topicData; + callback(null, latestTopics); + }); }); }); }); @@ -700,6 +711,7 @@ var async = require('async'), function isTopicVisible(topicData, topicInfo) { var deleted = parseInt(topicData.deleted, 10) !== 0; + return !deleted || (deleted && topicInfo.privileges.view_deleted) || topicData.uid === current_user; } @@ -738,7 +750,7 @@ var async = require('async'), if (isTopicVisible(topicData, topicInfo)) { retrieved_topics.push(topicData); - } + } else console.log('not visible'); next(null); }); From 25442a89caf6749b0e159654bdac5cfca226a7c0 Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sun, 26 Jan 2014 17:17:34 -0500 Subject: [PATCH 03/18] closes #878 --- public/src/forum/category.js | 3 +- public/src/forum/recent.js | 3 +- public/src/forum/unread.js | 4 +- public/templates/category.tpl | 2 +- public/templates/recent.tpl | 2 +- public/templates/unread.tpl | 2 +- src/categories.js | 70 ++++++++++++++++++++--------------- src/socket.io/categories.js | 10 ++--- src/socket.io/topics.js | 6 +-- src/topics.js | 35 ++++++++++-------- tests/categories.js | 6 +-- 11 files changed, 77 insertions(+), 66 deletions(-) diff --git a/public/src/forum/category.js b/public/src/forum/category.js index 29dcffa269..e61443337b 100644 --- a/public/src/forum/category.js +++ b/public/src/forum/category.js @@ -145,7 +145,7 @@ define(['composer', 'forum/pagination'], function(composer, pagination) { loadingMoreTopics = true; socket.emit('categories.loadMore', { cid: cid, - after: $('#topics-container').children('.category-item').length + after: $('#topics-container').attr('data-nextstart') }, function (err, data) { if(err) { return app.alertError(err.message); @@ -153,6 +153,7 @@ define(['composer', 'forum/pagination'], function(composer, pagination) { if (data && data.topics.length) { Category.onTopicsLoaded(data.topics); + $('#topics-container').attr('data-nextstart', data.nextStart); } loadingMoreTopics = false; }); diff --git a/public/src/forum/recent.js b/public/src/forum/recent.js index 966ce0058d..17d4602403 100644 --- a/public/src/forum/recent.js +++ b/public/src/forum/recent.js @@ -86,7 +86,7 @@ define(function() { Recent.loadMoreTopics = function() { loadingMoreTopics = true; socket.emit('topics.loadMoreRecentTopics', { - after: $('#topics-container').children('li').length, + after: $('#topics-container').attr('data-nextstart'), term: active }, function(err, data) { if(err) { @@ -95,6 +95,7 @@ define(function() { if (data.topics && data.topics.length) { Recent.onTopicsLoaded('recent', data.topics); + $('#topics-container').attr('data-nextstart', data.nextStart); } loadingMoreTopics = false; diff --git a/public/src/forum/unread.js b/public/src/forum/unread.js index b562ce1502..4f3024fbab 100644 --- a/public/src/forum/unread.js +++ b/public/src/forum/unread.js @@ -46,7 +46,7 @@ define(['forum/recent'], function(recent) { function loadMoreTopics() { loadingMoreTopics = true; socket.emit('topics.loadMoreUnreadTopics', { - after: parseInt($('#topics-container').attr('data-next-start'), 10) + after: $('#topics-container').attr('data-nextstart') }, function(err, data) { if(err) { return app.alertError(err.message); @@ -54,7 +54,7 @@ define(['forum/recent'], function(recent) { if (data.topics && data.topics.length) { recent.onTopicsLoaded('unread', data.topics); - $('#topics-container').attr('data-next-start', data.nextStart); + $('#topics-container').attr('data-nextstart', data.nextStart); } else { $('#load-more-btn').hide(); } diff --git a/public/templates/category.tpl b/public/templates/category.tpl index 5b578dc604..a8b73e765c 100644 --- a/public/templates/category.tpl +++ b/public/templates/category.tpl @@ -28,7 +28,7 @@
-
    +
    • diff --git a/public/templates/recent.tpl b/public/templates/recent.tpl index 71ce3054d7..27fbf7ad94 100644 --- a/public/templates/recent.tpl +++ b/public/templates/recent.tpl @@ -21,7 +21,7 @@
      -
        +
        • diff --git a/public/templates/unread.tpl b/public/templates/unread.tpl index 114e8cba83..36874fd2b8 100644 --- a/public/templates/unread.tpl +++ b/public/templates/unread.tpl @@ -16,7 +16,7 @@
          -
            +
            • diff --git a/src/categories.js b/src/categories.js index a2aee70091..31e425c27b 100644 --- a/src/categories.js +++ b/src/categories.js @@ -1,8 +1,8 @@ -var db = require('./database.js'), - posts = require('./posts.js'), - utils = require('./../public/src/utils.js'), - user = require('./user.js'), - topics = require('./topics.js'), +var db = require('./database'), + posts = require('./posts'), + utils = require('./../public/src/utils'), + user = require('./user'), + topics = require('./topics'), plugins = require('./plugins'), CategoryTools = require('./categoryTools'), meta = require('./meta'), @@ -52,8 +52,8 @@ var db = require('./database.js'), return callback(err); } - function getTopicIds(next) { - Categories.getTopicIds(category_id, start, end, next); + function getTopics(next) { + Categories.getCategoryTopics(category_id, start, end, current_user, next); } function getActiveUsers(next) { @@ -70,9 +70,12 @@ var db = require('./database.js'), Categories.getPageCount(category_id, next); } - async.parallel([getTopicIds, getActiveUsers, getSidebars, getPageCount], function(err, results) { - var tids = results[0], - active_users = results[1], + async.parallel([getTopics, getActiveUsers, getSidebars, getPageCount], function(err, results) { + if(err) { + return callback(err); + } + + var active_users = results[1], sidebars = results[2], pageCount = results[3]; @@ -87,27 +90,22 @@ var db = require('./database.js'), 'topic_row_size': 'col-md-9', 'category_id': category_id, 'active_users': [], - 'topics': [], + 'topics': results[0].topics, + 'nextStart': results[0].nextStart, 'pageCount': pageCount, 'disableSocialButtons': meta.config.disableSocialButtons !== undefined ? parseInt(meta.config.disableSocialButtons, 10) !== 0 : false, 'sidebars': sidebars }; - function getTopics(next) { - topics.getTopicsByTids(tids, category_id, current_user, next); - } - function getModerators(next) { Categories.getModerators(category_id, next); } function getActiveUsers(next) { - user.getMultipleUserFields(active_users, ['uid', 'username', 'userslug', 'picture'], function(err, users) { - next(err, users); - }); + user.getMultipleUserFields(active_users, ['uid', 'username', 'userslug', 'picture'], next); } - if (tids.length === 0) { + if (!category.topics.length) { getModerators(function(err, moderators) { category.moderator_block_class = moderators.length > 0 ? '' : 'none'; category.moderators = moderators; @@ -116,11 +114,10 @@ var db = require('./database.js'), callback(null, category); }); } else { - async.parallel([getTopics, getModerators, getActiveUsers], function(err, results) { - category.topics = results[0]; - category.moderator_block_class = results[1].length > 0 ? '' : 'none'; - category.moderators = results[1]; - category.active_users = results[2]; + async.parallel([getModerators, getActiveUsers], function(err, results) { + category.moderator_block_class = results[0].length > 0 ? '' : 'none'; + category.moderators = results[0]; + category.active_users = results[1]; category.show_sidebar = category.topics.length > 0 ? 'show' : 'hidden'; callback(null, category); }); @@ -131,13 +128,26 @@ var db = require('./database.js'), }; Categories.getCategoryTopics = function(cid, start, stop, uid, callback) { - Categories.getTopicIds(cid, start, stop, function(err, tids) { - if(err) { - return callback(err); - } + async.waterfall([ + function(next) { + Categories.getTopicIds(cid, start, stop, next); + }, + function(tids, next) { + topics.getTopicsByTids(tids, cid, uid, next); + }, + function(topics, next) { + db.sortedSetRevRank('categories:' + cid + ':tid', topics[topics.length - 1].tid, function(err, rank) { + if(err) { + return next(err); + } - topics.getTopicsByTids(tids, cid, uid, callback); - }); + return next(null, { + topics: topics, + nextStart: parseInt(rank, 10) + 1 + }); + }); + } + ], callback); }; Categories.getTopicIds = function(cid, start, stop, callback) { diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index eaac85b4ac..4ccc949779 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -18,14 +18,10 @@ SocketCategories.loadMore = function(socket, data, callback) { var topicsPerPage = parseInt(meta.config.topicsPerPage, 10) || 20; - var start = data.after, + var start = parseInt(data.after, 10), end = start + topicsPerPage - 1; - - categories.getCategoryTopics(data.cid, start, end, socket.uid, function(err, topics) { - callback(err, { - topics: topics - }); - }); +console.log(start, end); + categories.getCategoryTopics(data.cid, start, end, socket.uid, callback); }; SocketCategories.getPageCount = function(socket, cid, callback) { diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index b81b484610..e290efc59e 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -236,7 +236,7 @@ SocketTopics.loadMore = function(socket, data, callback) { var postsPerPage = parseInt(meta.config.postsPerPage, 10); postsPerPage = postsPerPage ? postsPerPage : 20; - var start = data.after, + var start = parseInt(data.after, 10), end = start + postsPerPage - 1; async.parallel({ @@ -256,14 +256,14 @@ SocketTopics.loadMoreRecentTopics = function(socket, data, callback) { return callback(new Error('invalid data')); } - var start = data.after, + var start = parseInt(data.after, 10), end = start + 9; topics.getLatestTopics(socket.uid, start, end, data.term, callback); }; SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) { - var start = data.after, + var start = parseInt(data.after, 10), end = start + 9; topics.getUnreadTopics(socket.uid, start, end, callback); diff --git a/src/topics.js b/src/topics.js index 76a98767d9..580b1e15d3 100644 --- a/src/topics.js +++ b/src/topics.js @@ -448,11 +448,7 @@ var async = require('async'), async.filter(tids, function(tid, next) { threadTools.privileges(tid, current_user, function(err, privileges) { - if (!err && privileges.read) { - next(true); - } else { - next(false); - } + next(!err && privileges.read); }); }, function(tids) { Topics.getTopicsByTids(tids, 0, current_user, function(err, topicData) { @@ -466,7 +462,7 @@ var async = require('async'), } db.sortedSetRevRank('topics:recent', topicData[topicData.length - 1].tid, function(err, rank) { - latestTopics.lastIndex = rank; + latestTopics.nextStart = parseInt(rank,10) + 1; latestTopics.topics = topicData; callback(null, latestTopics); }); @@ -549,7 +545,7 @@ var async = require('async'), return parseInt(read[index], 10) === 0; }); - // Filter out topics that belong to categories that this user cannot access + async.filter(newtids, function(tid, next) { threadTools.privileges(tid, uid, function(err, privileges) { if (!err && privileges.read) { @@ -599,16 +595,23 @@ var async = require('async'), return callback(err); } - unreadTopics.topics = topicData; - unreadTopics.nextStart = stop + 1; - if (!topicData || topicData.length === 0) { - unreadTopics.no_topics_message = 'show'; - } - if (uid === 0 || topicData.length === 0) { - unreadTopics.show_markallread_button = 'hidden'; - } + db.sortedSetRevRank('topics:recent', topicData[topicData.length - 1].tid, function(err, rank) { + if(err) { + return callback(err); + } + + unreadTopics.topics = topicData; + unreadTopics.nextStart = parseInt(rank, 10) + 1; + + if (!topicData || topicData.length === 0) { + unreadTopics.no_topics_message = 'show'; + } + if (uid === 0 || topicData.length === 0) { + unreadTopics.show_markallread_button = 'hidden'; + } - callback(null, unreadTopics); + callback(null, unreadTopics); + }); }); } diff --git a/tests/categories.js b/tests/categories.js index ba9cf3b702..770ad0b498 100644 --- a/tests/categories.js +++ b/tests/categories.js @@ -43,9 +43,9 @@ describe('Categories', function() { describe('.getCategoryTopics', function() { it('should return a list of topics', function(done) { - Categories.getCategoryTopics(categoryObj.cid, 0, 10, 0, function(err, topics) { - assert(Array.isArray(topics)); - assert(topics.every(function(topic) { + Categories.getCategoryTopics(categoryObj.cid, 0, 10, 0, function(err, result) { + assert(Array.isArray(result.topics)); + assert(result.topics.every(function(topic) { return topic instanceof Object; })); From 877028466175e4a4667dbef7b1013f4e90b56c75 Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sun, 26 Jan 2014 17:23:28 -0500 Subject: [PATCH 04/18] removed console.log --- src/socket.io/categories.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index 4ccc949779..ddea33d2f3 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -20,7 +20,7 @@ SocketCategories.loadMore = function(socket, data, callback) { var start = parseInt(data.after, 10), end = start + topicsPerPage - 1; -console.log(start, end); + categories.getCategoryTopics(data.cid, start, end, socket.uid, callback); }; From 25c4648e2eb433bb00b4e26e6b1f7d6a1113ec6a Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sun, 26 Jan 2014 17:25:18 -0500 Subject: [PATCH 05/18] load 20 in recent --- src/routes/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/api.js b/src/routes/api.js index e2ed523160..08d4107f74 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -246,7 +246,7 @@ var path = require('path'), app.get('/recent/:term?', function (req, res, next) { var uid = (req.user) ? req.user.uid : 0; - topics.getLatestTopics(uid, 0, 9, req.params.term, function (err, data) { + topics.getLatestTopics(uid, 0, 19, req.params.term, function (err, data) { if(err) { return next(err); } From e7eab83d8fe96af9d72770d346c1d931799a5ce5 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 26 Jan 2014 17:26:56 -0500 Subject: [PATCH 06/18] removing facebook SSO from core --- public/templates/admin/facebook.tpl | 23 --------------- public/templates/admin/header.tpl | 1 - public/templates/config.json | 1 - src/login.js | 43 ----------------------------- src/routes/admin.js | 6 +--- src/routes/authentication.js | 24 ---------------- src/user.js | 9 ------ 7 files changed, 1 insertion(+), 106 deletions(-) delete mode 100644 public/templates/admin/facebook.tpl diff --git a/public/templates/admin/facebook.tpl b/public/templates/admin/facebook.tpl deleted file mode 100644 index 19137f8500..0000000000 --- a/public/templates/admin/facebook.tpl +++ /dev/null @@ -1,23 +0,0 @@ -

              Facebook Social Authentication

              -
              - -
              -
              -

              - Create a Facebook Application via the - Facebook Developers Page and - then paste your application details here. -

              -
              -
              -
              -
              -
              - - - - \ No newline at end of file diff --git a/public/templates/admin/header.tpl b/public/templates/admin/header.tpl index 2baa221059..5a2b08c0c1 100644 --- a/public/templates/admin/header.tpl +++ b/public/templates/admin/header.tpl @@ -116,7 +116,6 @@ +
              -

              Posts

              - - {post_matches} result(s) matching "{search_query}" - -
              No posts found!
              +
              +

              Posts

              + + + {post_matches} result(s) matching "{search_query}" + +
              No posts found!
              -
              +
          -
        +
From fb8fbb2372c5f290ffb6ac8c4faaf855becf45bf Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sun, 26 Jan 2014 18:40:28 -0500 Subject: [PATCH 10/18] removed console.log --- src/topics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topics.js b/src/topics.js index 580b1e15d3..b832817f88 100644 --- a/src/topics.js +++ b/src/topics.js @@ -753,7 +753,7 @@ var async = require('async'), if (isTopicVisible(topicData, topicInfo)) { retrieved_topics.push(topicData); - } else console.log('not visible'); + } next(null); }); From d54e2fba9ec0afc58f40fcc1b34905f95099d125 Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sun, 26 Jan 2014 21:32:53 -0500 Subject: [PATCH 11/18] closes #810 --- public/src/forum/admin/index.js | 24 +++++++++++++++------- src/routes/debug.js | 10 ++++----- src/socket.io/index.js | 36 +++++++++++++-------------------- src/socket.io/meta.js | 16 ++------------- 4 files changed, 38 insertions(+), 48 deletions(-) diff --git a/public/src/forum/admin/index.js b/public/src/forum/admin/index.js index c0806106dd..c99dd43cb9 100644 --- a/public/src/forum/admin/index.js +++ b/public/src/forum/admin/index.js @@ -18,6 +18,7 @@ define(function() { }; Admin.updateRoomUsage = function(err, data) { + function getUserCountIn(room) { var count = 0; for(var user in data[room]) { @@ -25,27 +26,36 @@ define(function() { } return count; } - var active_users = $('#active_users'), + + var active_users = $('#active_users').html(''), total = 0; if(!active_users.length) { return; } - active_users.html(''); - var usersHtml = ''; + var sortedData = []; for (var room in data) { if (room !== '') { - var count = getUserCountIn(room); - total += count; - usersHtml += "
" + room + " " + count + " active user" + (count > 1 ? "s" : "") + "
"; + sortedData.push({room: room, count: data[room].length}); + total += data[room].length; } } + sortedData.sort(function(a, b) { + return parseInt(b.count, 10) - parseInt(a.count, 10); + }); + + var usersHtml = ''; + for(var i=0; i " + + sortedData[i].count + " active user" + (sortedData[i].count > 1 ? "s" : "") + "
"; + } + active_users.html(usersHtml); - document.getElementById('connections').innerHTML = total; + $('#connections').html(total); }; return Admin; diff --git a/src/routes/debug.js b/src/routes/debug.js index b2a6e5c335..b25d00a894 100644 --- a/src/routes/debug.js +++ b/src/routes/debug.js @@ -75,12 +75,12 @@ var DebugRoute = function(app) { app.get('/test', function(req, res) { - /*topics.getTopicPosts2(2, 0, 10, 5, function(err, data) { - res.json(data); - })*/ - topics.getTopicWithPosts(2, 1, 0, -1, true, function (err, topicData) { - res.json(topicData); + var db = require('./../database'); + + db.getSortedSetRevRange('topics:recent', 0 , -1, function(err, tids) { + res.json(tids); }); + }); }); diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 90ff00d7f3..a0d89bc102 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -22,12 +22,11 @@ var SocketIO = require('socket.io'), /* === */ -var users = {}, - io; + +var io; Sockets.userSockets = {}; -Sockets.rooms = {}; Sockets.init = function(server) { @@ -59,9 +58,9 @@ Sockets.init = function(server) { sessionID = socket.handshake.signedCookies["express.sid"]; db.sessionStore.get(sessionID, function(err, sessionData) { if (!err && sessionData && sessionData.passport && sessionData.passport.user) { - uid = users[sessionID] = sessionData.passport.user; + uid = sessionData.passport.user; } else { - uid = users[sessionID] = 0; + uid = 0; } socket.uid = parseInt(uid, 10); @@ -110,8 +109,8 @@ Sockets.init = function(server) { } if (Sockets.userSockets[uid] && Sockets.userSockets[uid].length === 0) { - delete users[sessionID]; delete Sockets.userSockets[uid]; + if (uid) { db.sortedSetRemove('users:online', uid, function(err, data) { }); @@ -126,17 +125,10 @@ Sockets.init = function(server) { emitOnlineUserCount(); - for (var roomName in Sockets.rooms) { - if (Sockets.rooms.hasOwnProperty(roomName)) { - socket.leave(roomName); - - if (Sockets.rooms[roomName][socket.id]) { - delete Sockets.rooms[roomName][socket.id]; - } - - updateRoomBrowsingText(roomName); - } + for(var roomName in io.sockets.manager.roomClients[socket.id]) { + updateRoomBrowsingText(roomName.slice(1)); } + }); socket.on('*', function(payload, callback) { @@ -222,9 +214,10 @@ function updateRoomBrowsingText(roomName) { function getUidsInRoom(room) { var uids = []; - for (var socketId in room) { - if (uids.indexOf(room[socketId]) === -1) { - uids.push(room[socketId]); + var clients = io.sockets.clients(roomName); + for(var i=0; i Date: Sun, 26 Jan 2014 22:10:06 -0500 Subject: [PATCH 12/18] chats - isNew flag, and sending in userData.uid now --- src/messaging.js | 8 ++++++-- src/socket.io/modules.js | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/messaging.js b/src/messaging.js index f6cc6671c0..6f2c54de28 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -56,13 +56,16 @@ var db = require('./database'), var messages = []; + userData[0].uid = touid; + userData[1].uid = fromuid; + function getMessage(mid, next) { db.getObject('message:' + mid, function(err, message) { if (err) { return next(err); } - Messaging.parse(message.content, message.fromuid, fromuid, userData[1], userData[0], function(result) { + Messaging.parse(message.content, message.fromuid, fromuid, userData[1], userData[0], false, function(result) { message.content = result; messages.push(message); next(null); @@ -81,7 +84,7 @@ var db = require('./database'), }); }; - Messaging.parse = function (message, fromuid, myuid, toUserData, myUserData, callback) { + Messaging.parse = function (message, fromuid, myuid, toUserData, myUserData, isNew, callback) { plugins.fireHook('filter:post.parse', message, function(err, parsed) { if (err) { return callback(message); @@ -104,6 +107,7 @@ var db = require('./database'), myuid: myuid, toUserData: toUserData, myUserData: myUserData, + isNew: isNew, parsedMessage: picture + username + parsed }; diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index d59a18425b..4a89b32ff4 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -109,7 +109,11 @@ SocketModules.chats.send = function(socket, data) { }); }); } - Messaging.parse(msg, socket.uid, socket.uid, usersData[1], usersData[0], function(parsed) { + + usersData[0].uid = socket.uid; + usersData[1].uid = touid; + + Messaging.parse(msg, socket.uid, socket.uid, usersData[1], usersData[0], true, function(parsed) { Messaging.addMessage(socket.uid, touid, msg, function(err, message) { var numSockets = 0, x; From 31a57cf0dd19af817a2622ee83193b84f99456f6 Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sun, 26 Jan 2014 22:36:06 -0500 Subject: [PATCH 13/18] closes #885 --- public/src/utils.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/src/utils.js b/public/src/utils.js index e7916ef5f6..988253f3c1 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -106,6 +106,7 @@ collapseWhitespace : /\s+/g, collapseDash : /-+/g, trimTrailingDash : /-$/g, + trimLeadingDash : /^-/g, isLatin : /^[\w]+$/, //http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/ @@ -120,6 +121,7 @@ str = str.replace(utils.collapseWhitespace, '-') str = str.replace(utils.collapseDash, '-'); str = str.replace(utils.trimTrailingDash, ''); + str = str.replace(utils.trimLeadingDash, ''); return str; }, From c18788fbc9c27f1451bf72a2c4732ab60bad8470 Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sun, 26 Jan 2014 23:20:37 -0500 Subject: [PATCH 14/18] crash fix if topic has no posts, and check confirm obj --- src/feed.js | 10 +++++++--- src/user.js | 22 +++++++++++----------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/feed.js b/src/feed.js index 89828328e1..0b8fe46f49 100644 --- a/src/feed.js +++ b/src/feed.js @@ -38,13 +38,17 @@ } } + var description = topicData.posts.length ? topicData.posts[0].content : ''; + var image_url = topicData.posts.length ? topicData.posts[0].picture : ''; + var author = topicData.posts.length ? topicData.posts[0].username : ''; + var feed = new rss({ title: topicData.topic_name, - description: topicData.posts[0].content, + description: description, feed_url: Feed.defaults.baseUrl + '/topics/' + tid + '.rss', site_url: nconf.get('url') + '/topic/' + topicData.slug, - image_url: topicData.posts[0].picture, - author: topicData.posts[0].username, + image_url: image_url, + author: author, ttl: Feed.defaults.ttl }), dateStamp; diff --git a/src/user.js b/src/user.js index 4ae5e527dc..ffbf32a707 100644 --- a/src/user.js +++ b/src/user.js @@ -926,21 +926,21 @@ var bcrypt = require('bcryptjs'), confirm: function(code, callback) { db.getObject('confirm:' + code, function(err, confirmObj) { if (err) { - callback({ + return callback({ status:'error' }); - } else { - if (confirmObj.uid && confirmObj.email) { - db.setObjectField('email:confirmed', confirmObj.email, '1', function() { - callback({ - status: 'ok' - }); - }); - } else { + } + + if (confirmObj && confirmObj.uid && confirmObj.email) { + db.setObjectField('email:confirmed', confirmObj.email, '1', function() { callback({ - status: 'not_ok' + status: 'ok' }); - } + }); + } else { + callback({ + status: 'not_ok' + }); } }); } From ef39c128c289989d2b68227c1d7bbd33fbb13f84 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 26 Jan 2014 23:34:54 -0500 Subject: [PATCH 15/18] Removing Google Plus integration from core - adios! --- public/templates/admin/gplus.tpl | 23 ---------------- public/templates/admin/header.tpl | 1 - public/templates/config.json | 1 - src/login.js | 44 ------------------------------- src/routes/admin.js | 7 +---- src/routes/authentication.js | 24 ----------------- src/user.js | 9 ------- 7 files changed, 1 insertion(+), 108 deletions(-) delete mode 100644 public/templates/admin/gplus.tpl diff --git a/public/templates/admin/gplus.tpl b/public/templates/admin/gplus.tpl deleted file mode 100644 index d44041adee..0000000000 --- a/public/templates/admin/gplus.tpl +++ /dev/null @@ -1,23 +0,0 @@ -

Google Accounts Social Authentication

-
- -
-
-

- Create a Google Application via the - API Console and then paste - your application details here. -

-
-
-
-
-
- - - - \ No newline at end of file diff --git a/public/templates/admin/header.tpl b/public/templates/admin/header.tpl index e3db80e96d..9e3dc7f839 100644 --- a/public/templates/admin/header.tpl +++ b/public/templates/admin/header.tpl @@ -115,7 +115,6 @@