diff --git a/src/messaging.js b/src/messaging.js index 33ec97f9b4..3e7f7abf63 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -298,7 +298,32 @@ var db = require('./database'), }; Messaging.canMessage = function(fromUid, toUid, callback) { + if (parseInt(meta.config.disableChat) === 1) { + return callback(new Error('[[error:chat-disabled]]')); + } else if (toUid === fromUid) { + return callback(new Error('[[error:cant-chat-with-yourself]]')); + } else if (fromUid === 0) { + return callback(new Error('[[error:not-logged-in]]')); + } + async.waterfall([ + function(next) { + user.getUserFields(fromUid, ['banned', 'email:confirmed'], function(err, userData) { + if (err) { + return callback(err); + } + + if (parseInt(userData.banned, 10) === 1) { + return callback(new Error('[[error:user-banned]]')); + } + + if (parseInt(meta.config.requireEmailConfirmation, 10) === 1 && parseInt(userData['email:confirmed'], 10) !== 1) { + return callback(new Error('[[error:email-not-confirmed-chat]]')); + } + + next(); + }); + }, function(next) { user.getSettings(toUid, next); }, diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index a7ff0a9dfd..7e90e8fa38 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -139,67 +139,46 @@ SocketModules.chats.send = function(socket, data, callback) { return callback(new Error('[[error:invalid-data]]')); } - if (parseInt(meta.config.disableChat) === 1) { - return callback(new Error('[[error:chat-disabled]]')); - } + var now = Date.now(), + touid = parseInt(data.touid, 10); - var touid = parseInt(data.touid, 10); - if (touid === socket.uid || socket.uid === 0) { - return; - } - - var now = Date.now(); + // Websocket rate limiting socket.lastChatMessageTime = socket.lastChatMessageTime || 0; - if (now - socket.lastChatMessageTime < 200) { return callback(new Error('[[error:too-many-messages]]')); + } else { + socket.lastChatMessageTime = now; } - socket.lastChatMessageTime = now; - - user.getUserFields(socket.uid, ['banned', 'email:confirmed'], function(err, userData) { - if (err) { - return callback(err); - } - - if (parseInt(userData.banned, 10) === 1) { - return callback(new Error('[[error:user-banned]]')); - } - - if (parseInt(meta.config.requireEmailConfirmation, 10) === 1 && parseInt(userData['email:confirmed'], 10) !== 1) { - return callback(new Error('[[error:email-not-confirmed-chat]]')); + Messaging.canMessage(socket.uid, touid, function(err, allowed) { + if (err || !allowed) { + return callback(err || new Error('[[error:chat-restricted]]')); } - Messaging.canMessage(socket.uid, touid, function(err, allowed) { - if (err || !allowed) { - return callback(err || new Error('[[error:chat-restricted]]')); + Messaging.addMessage(socket.uid, touid, data.message, function(err, message) { + if (err) { + return callback(err); } - Messaging.addMessage(socket.uid, touid, data.message, function(err, message) { - if (err) { - return callback(err); - } - - Messaging.notifyUser(socket.uid, touid, message); - - // Recipient - SocketModules.chats.pushUnreadCount(touid); - server.in('uid_' + touid).emit('event:chats.receive', { - withUid: socket.uid, - message: message, - self: 0 - }); + Messaging.notifyUser(socket.uid, touid, message); - // Sender - SocketModules.chats.pushUnreadCount(socket.uid); - server.in('uid_' + socket.uid).emit('event:chats.receive', { - withUid: touid, - message: message, - self: 1 - }); + // Recipient + SocketModules.chats.pushUnreadCount(touid); + server.in('uid_' + touid).emit('event:chats.receive', { + withUid: socket.uid, + message: message, + self: 0 + }); - callback(); + // Sender + SocketModules.chats.pushUnreadCount(socket.uid); + server.in('uid_' + socket.uid).emit('event:chats.receive', { + withUid: touid, + message: message, + self: 1 }); + + callback(); }); }); };