moved a number of sanity checks to also be in canMessage, so they are all consolidated into one exported method. (@barisusakli)

This commit is contained in:
Julian Lam
2015-04-16 20:32:16 -04:00
parent 078d76a11b
commit d40ca1e3c8
2 changed files with 53 additions and 49 deletions

View File

@@ -298,7 +298,32 @@ var db = require('./database'),
}; };
Messaging.canMessage = function(fromUid, toUid, callback) { 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([ 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) { function(next) {
user.getSettings(toUid, next); user.getSettings(toUid, next);
}, },

View File

@@ -139,67 +139,46 @@ SocketModules.chats.send = function(socket, data, callback) {
return callback(new Error('[[error:invalid-data]]')); return callback(new Error('[[error:invalid-data]]'));
} }
if (parseInt(meta.config.disableChat) === 1) { var now = Date.now(),
return callback(new Error('[[error:chat-disabled]]')); touid = parseInt(data.touid, 10);
}
var touid = parseInt(data.touid, 10); // Websocket rate limiting
if (touid === socket.uid || socket.uid === 0) {
return;
}
var now = Date.now();
socket.lastChatMessageTime = socket.lastChatMessageTime || 0; socket.lastChatMessageTime = socket.lastChatMessageTime || 0;
if (now - socket.lastChatMessageTime < 200) { if (now - socket.lastChatMessageTime < 200) {
return callback(new Error('[[error:too-many-messages]]')); return callback(new Error('[[error:too-many-messages]]'));
} else {
socket.lastChatMessageTime = now;
} }
socket.lastChatMessageTime = now; Messaging.canMessage(socket.uid, touid, function(err, allowed) {
if (err || !allowed) {
user.getUserFields(socket.uid, ['banned', 'email:confirmed'], function(err, userData) { return callback(err || new Error('[[error:chat-restricted]]'));
if (err) {
return callback(err);
} }
if (parseInt(userData.banned, 10) === 1) { Messaging.addMessage(socket.uid, touid, data.message, function(err, message) {
return callback(new Error('[[error:user-banned]]')); if (err) {
} return callback(err);
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.addMessage(socket.uid, touid, data.message, function(err, message) { Messaging.notifyUser(socket.uid, touid, message);
if (err) {
return callback(err);
}
Messaging.notifyUser(socket.uid, touid, message); // Recipient
SocketModules.chats.pushUnreadCount(touid);
// Recipient server.in('uid_' + touid).emit('event:chats.receive', {
SocketModules.chats.pushUnreadCount(touid); withUid: socket.uid,
server.in('uid_' + touid).emit('event:chats.receive', { message: message,
withUid: socket.uid, self: 0
message: message,
self: 0
});
// Sender
SocketModules.chats.pushUnreadCount(socket.uid);
server.in('uid_' + socket.uid).emit('event:chats.receive', {
withUid: touid,
message: message,
self: 1
});
callback();
}); });
// Sender
SocketModules.chats.pushUnreadCount(socket.uid);
server.in('uid_' + socket.uid).emit('event:chats.receive', {
withUid: touid,
message: message,
self: 1
});
callback();
}); });
}); });
}; };