From 268aa12cc278894e5335c67a92a10df7f99f887b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 29 Feb 2016 10:36:20 +0200 Subject: [PATCH] closes #4275 --- src/messaging.js | 35 ++++++++++++++++------------------- src/socket.io/modules.js | 4 ++-- tests/messaging.js | 18 +++++++++--------- 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/messaging.js b/src/messaging.js index e39e9f0d3b..1974313c81 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -314,7 +314,7 @@ var async = require('async'), Messaging.canMessageUser = function(uid, toUid, callback) { if (parseInt(meta.config.disableChat) === 1 || !uid || uid === toUid) { - return callback(null, false); + return callback(new Error('[[error:chat-disabled]]')); } async.waterfall([ @@ -323,43 +323,40 @@ var async = require('async'), }, function (exists, next) { if (!exists) { - return callback(null, false); + return callback(new Error('[[error:no-user]]')); } user.getUserFields(uid, ['banned', 'email:confirmed'], next); }, function (userData, next) { if (parseInt(userData.banned, 10) === 1) { - return callback(null, false); + return callback(new Error('[[error:user-banned]]')); } if (parseInt(meta.config.requireEmailConfirmation, 10) === 1 && parseInt(userData['email:confirmed'], 10) !== 1) { - return callback(null, false); + return callback(new Error('[[error:email-not-confirmed-chat]]')); } - user.getSettings(toUid, next); + async.parallel({ + settings: async.apply(user.getSettings, toUid), + isAdmin: async.apply(user.isAdministrator, uid), + isFollowing: async.apply(user.isFollowing, toUid, uid) + }, next); }, - function(settings, next) { - if (!settings.restrictChat) { - return callback(null, true); + function(results, next) { + if (!results.settings.restrictChat || results.isAdmin || results.isFollowing) { + return next(); } - user.isAdministrator(uid, next); - }, - function(isAdmin, next) { - if (isAdmin) { - return callback(null, true); - } - user.isFollowing(toUid, uid, next); + next(new Error('[[error:chat-restricted]]')); } ], callback); - }; Messaging.canMessageRoom = function(uid, roomId, callback) { if (parseInt(meta.config.disableChat) === 1 || !uid) { return callback(new Error('[[error:chat-disabled]]')); } - + async.waterfall([ function (next) { Messaging.isUserInRoom(uid, roomId, next); @@ -368,14 +365,14 @@ var async = require('async'), if (!inRoom) { return next(new Error('[[error:not-in-room]]')); } - + Messaging.getUserCountInRoom(roomId, next); }, function(count, next) { if (count < 2) { return next(new Error('[[error:no-users-in-room]]')); } - + user.getUserFields(uid, ['banned', 'email:confirmed'], next); }, function (userData, next) { diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index 26426b9f9f..bcf8309a40 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -62,8 +62,8 @@ SocketModules.chats.newRoom = function(socket, data, callback) { } Messaging.canMessageUser(socket.uid, data.touid, function(err, allowed) { - if (err || !allowed) { - return callback(err || new Error('[[error:chat-restricted]]')); + if (err) { + return callback(err); } Messaging.newRoom(socket.uid, [data.touid], callback); diff --git a/tests/messaging.js b/tests/messaging.js index ae1db0952a..4758fde40b 100644 --- a/tests/messaging.js +++ b/tests/messaging.js @@ -27,39 +27,39 @@ describe('Messaging Library', function() { describe('.canMessage()', function() { it('should not error out', function(done) { - Messaging.canMessageUser(testUids[1], testUids[2], function(err, allowed) { + Messaging.canMessageUser(testUids[1], testUids[2], function(err) { assert.ifError(err); done(); }); }); it('should allow messages to be sent to an unrestricted user', function(done) { - Messaging.canMessageUser(testUids[1], testUids[2], function(err, allowed) { - assert.strictEqual(allowed, true, 'should be true, received ' + allowed); + Messaging.canMessageUser(testUids[1], testUids[2], function(err) { + assert.ifError(err); done(); }); }); it('should NOT allow messages to be sent to a restricted user', function(done) { User.setSetting(testUids[1], 'restrictChat', '1', function() { - Messaging.canMessageUser(testUids[2], testUids[1], function(err, allowed) { - assert.strictEqual(allowed, false, 'should be false, received ' + allowed); + Messaging.canMessageUser(testUids[2], testUids[1], function(err) { + assert.strictEqual(err.message, '[[error:chat-restricted]]'); done(); }); }); }); it('should always allow admins through', function(done) { - Messaging.canMessageUser(testUids[0], testUids[1], function(err, allowed) { - assert.strictEqual(allowed, true, 'should be true, received ' + allowed); + Messaging.canMessageUser(testUids[0], testUids[1], function(err) { + assert.ifError(err); done(); }); }); it('should allow messages to be sent to a restricted user if restricted user follows sender', function(done) { User.follow(testUids[1], testUids[2], function() { - Messaging.canMessageUser(testUids[2], testUids[1], function(err, allowed) { - assert.strictEqual(allowed, true, 'should be true, received ' + allowed); + Messaging.canMessageUser(testUids[2], testUids[1], function(err) { + assert.ifError(err); done(); }); });