| 
									
										
										
										
											2014-02-26 21:04:20 -05:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-21 20:56:12 -07:00
										 |  |  | var bcrypt = require('bcryptjs'), | 
					
						
							| 
									
										
										
										
											2013-08-29 13:40:04 -04:00
										 |  |  | 	async = require('async'), | 
					
						
							| 
									
										
										
										
											2013-09-17 15:38:50 -04:00
										 |  |  | 	nconf = require('nconf'), | 
					
						
							| 
									
										
										
										
											2013-11-18 16:22:43 -05:00
										 |  |  | 	winston = require('winston'), | 
					
						
							| 
									
										
										
										
											2013-11-30 13:13:18 -05:00
										 |  |  | 	gravatar = require('gravatar'), | 
					
						
							| 
									
										
										
										
											2013-12-26 21:10:26 -05:00
										 |  |  | 	S = require('string'), | 
					
						
							| 
									
										
										
										
											2013-12-01 16:21:19 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-18 16:22:43 -05:00
										 |  |  | 	utils = require('./../public/src/utils'), | 
					
						
							| 
									
										
										
										
											2013-12-01 10:52:50 -05:00
										 |  |  | 	plugins = require('./plugins'), | 
					
						
							| 
									
										
										
										
											2013-12-02 17:10:26 -05:00
										 |  |  | 	db = require('./database'), | 
					
						
							| 
									
										
										
										
											2013-11-18 16:22:43 -05:00
										 |  |  | 	meta = require('./meta'), | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 	groups = require('./groups'), | 
					
						
							| 
									
										
										
										
											2013-12-10 22:05:37 -05:00
										 |  |  | 	topics = require('./topics'), | 
					
						
							| 
									
										
										
										
											2013-12-21 19:42:07 -05:00
										 |  |  | 	events = require('./events'), | 
					
						
							| 
									
										
										
										
											2014-03-17 17:27:42 -04:00
										 |  |  | 	emitter = require('./emitter'), | 
					
						
							| 
									
										
										
										
											2014-01-09 20:13:17 -05:00
										 |  |  | 	Emailer = require('./emailer'); | 
					
						
							| 
									
										
										
										
											2013-11-22 14:08:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | (function(User) { | 
					
						
							| 
									
										
										
										
											2014-02-26 21:04:20 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 	User.email = require('./user/email'); | 
					
						
							|  |  |  | 	User.notifications = require('./user/notifications'); | 
					
						
							|  |  |  | 	User.reset = require('./user/reset'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-11 11:45:20 -04:00
										 |  |  | 	require('./user/auth')(User); | 
					
						
							| 
									
										
										
										
											2014-03-17 21:47:37 -04:00
										 |  |  | 	require('./user/create')(User); | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 	require('./user/follow')(User); | 
					
						
							|  |  |  | 	require('./user/profile')(User); | 
					
						
							|  |  |  | 	require('./user/admin')(User); | 
					
						
							| 
									
										
										
										
											2014-03-15 15:09:54 -04:00
										 |  |  | 	require('./user/delete')(User); | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 	require('./user/settings')(User); | 
					
						
							| 
									
										
										
										
											2014-03-12 22:11:48 -04:00
										 |  |  | 	require('./user/search')(User); | 
					
						
							| 
									
										
										
										
											2014-03-18 15:35:48 -04:00
										 |  |  | 	require('./user/jobs')(User); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 	User.getUserField = function(uid, field, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 		User.getUserFields(uid, [field], function(err, user) { | 
					
						
							|  |  |  | 			callback(err, user ? user[field] : null); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-05 16:37:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 	User.getUserFields = function(uid, fields, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 		User.getMultipleUserFields([uid], fields, function(err, users) { | 
					
						
							|  |  |  | 			callback(err, users ? users[0] : null); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	User.getMultipleUserFields = function(uids, fields, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 		var fieldsToRemove = []; | 
					
						
							|  |  |  | 		function addField(field) { | 
					
						
							|  |  |  | 			if (fields.indexOf(field) === -1) { | 
					
						
							|  |  |  | 				fields.push(field); | 
					
						
							|  |  |  | 				fieldsToRemove.push(field); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (!Array.isArray(uids) || !uids.length) { | 
					
						
							| 
									
										
										
										
											2013-09-11 12:49:54 -04:00
										 |  |  | 			return callback(null, []); | 
					
						
							| 
									
										
										
										
											2013-05-16 13:13:46 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 		var keys = uids.map(function(uid) { | 
					
						
							|  |  |  | 			return 'user:' + uid; | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-07-05 19:08:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 		addField('uid'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (fields.indexOf('picture') !== -1) { | 
					
						
							|  |  |  | 			addField('email'); | 
					
						
							|  |  |  | 			addField('gravatarpicture'); | 
					
						
							|  |  |  | 			addField('uploadedpicture'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		db.getObjectsFields(keys, fields, function(err, users) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			callback(null, modifyUserData(users, fieldsToRemove)); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	User.getUserData = function(uid, callback) { | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 		User.getUsersData([uid], function(err, users) { | 
					
						
							|  |  |  | 			callback(err, users ? users[0] : null); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	User.getUsersData = function(uids, callback) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!Array.isArray(uids) || !uids.length) { | 
					
						
							|  |  |  | 			return callback(null, []); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var keys = uids.map(function(uid) { | 
					
						
							|  |  |  | 			return 'user:' + uid; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		db.getObjects(keys, function(err, users) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							| 
									
										
										
										
											2013-12-02 17:10:26 -05:00
										 |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-09-11 13:02:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 			callback(null, modifyUserData(users, [])); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-03-12 16:11:33 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 	function modifyUserData(users, fieldsToRemove) { | 
					
						
							|  |  |  | 		users.forEach(function(user) { | 
					
						
							|  |  |  | 			if (!user) { | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			user.hasPassword = !!user.password; | 
					
						
							|  |  |  | 			if (user.password) { | 
					
						
							|  |  |  | 				user.password = null; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-10 18:41:28 -04:00
										 |  |  | 			if (!parseInt(user.uid, 10)) { | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 				user.username = '[[global:guest]]'; | 
					
						
							|  |  |  | 				user.userslug = ''; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (user.picture) { | 
					
						
							|  |  |  | 				if (user.picture === user.uploadedpicture) { | 
					
						
							|  |  |  | 					user.picture = nconf.get('relative_path') + user.picture; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					user.picture = User.createGravatarURLFromEmail(user.email); | 
					
						
							| 
									
										
										
										
											2014-03-06 15:32:06 -05:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				user.picture = User.createGravatarURLFromEmail(''); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 			for(var i=0; i<fieldsToRemove.length; ++i) { | 
					
						
							|  |  |  | 				user[fieldsToRemove[i]] = undefined; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 		return users; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-12 17:16:16 -05:00
										 |  |  | 	User.updateLastOnlineTime = function(uid, callback) { | 
					
						
							|  |  |  | 		User.getUserField(uid, 'status', function(err, status) { | 
					
						
							|  |  |  | 			function cb(err) { | 
					
						
							|  |  |  | 				if(typeof callback === 'function') { | 
					
						
							|  |  |  | 					callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(err || status === 'offline') { | 
					
						
							|  |  |  | 				return cb(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-12 17:30:49 -05:00
										 |  |  | 			User.setUserField(uid, 'lastonline', Date.now(), cb); | 
					
						
							| 
									
										
										
										
											2014-02-12 17:16:16 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 19:01:30 -05:00
										 |  |  | 	User.isReadyToPost = function(uid, callback) { | 
					
						
							| 
									
										
										
										
											2014-04-01 12:01:11 -04:00
										 |  |  | 		async.parallel({ | 
					
						
							|  |  |  | 			banned: function(next) { | 
					
						
							| 
									
										
										
										
											2014-04-19 20:12:54 -04:00
										 |  |  | 				User.getUserField(uid, 'banned', next); | 
					
						
							| 
									
										
										
										
											2014-04-01 12:01:11 -04:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			exists: function(next) { | 
					
						
							|  |  |  | 				db.exists('user:' + uid, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			lastposttime: function(next) { | 
					
						
							|  |  |  | 				User.getUserField(uid, 'lastposttime', next); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}, function(err, results) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							| 
									
										
										
										
											2014-01-23 19:01:30 -05:00
										 |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-04-01 12:02:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-01 12:01:11 -04:00
										 |  |  | 			if (parseInt(results.banned, 10) === 1) { | 
					
						
							| 
									
										
										
										
											2014-04-09 22:26:23 -04:00
										 |  |  | 				return callback(new Error('[[error:user-banned]]')); | 
					
						
							| 
									
										
										
										
											2014-04-01 12:01:11 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-01-23 19:01:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-01 12:01:11 -04:00
										 |  |  | 			if (!results.exists) { | 
					
						
							| 
									
										
										
										
											2014-04-09 22:26:23 -04:00
										 |  |  | 				return callback(new Error('[[error:no-user]]')); | 
					
						
							| 
									
										
										
										
											2014-04-01 12:01:11 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-04-08 17:21:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-01 12:01:11 -04:00
										 |  |  | 			var lastposttime = results.lastposttime; | 
					
						
							|  |  |  | 			if (!lastposttime) { | 
					
						
							| 
									
										
										
										
											2014-01-23 19:01:30 -05:00
										 |  |  | 				lastposttime = 0; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (Date.now() - parseInt(lastposttime, 10) < parseInt(meta.config.postDelay, 10) * 1000) { | 
					
						
							| 
									
										
										
										
											2014-04-09 14:12:46 -04:00
										 |  |  | 				return callback(new Error('[[error:too-many-posts, ' + meta.config.postDelay + ']]')); | 
					
						
							| 
									
										
										
										
											2014-01-23 19:01:30 -05:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			callback(); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-02-26 21:04:20 -05:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-01-23 19:01:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-14 13:32:07 -04:00
										 |  |  | 	User.setUserField = function(uid, field, value, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-01 14:37:26 -04:00
										 |  |  | 		plugins.fireHook('action:user.set', field, value, 'set'); | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 		db.setObjectField('user:' + uid, field, value, callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-27 15:02:09 -05:00
										 |  |  | 	User.setUserFields = function(uid, data, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-01 14:37:26 -04:00
										 |  |  | 		for (var field in data) { | 
					
						
							|  |  |  | 			if (data.hasOwnProperty(field)) { | 
					
						
							|  |  |  | 				plugins.fireHook('action:user.set', field, data[field], 'set'); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 		db.setObject('user:' + uid, data, callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-24 13:12:56 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 14:32:56 -04:00
										 |  |  | 	User.incrementUserFieldBy = function(uid, field, value, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-01 14:30:53 -04:00
										 |  |  | 		db.incrObjectFieldBy('user:' + uid, field, value, function(err, value) { | 
					
						
							| 
									
										
										
										
											2014-05-01 14:37:26 -04:00
										 |  |  | 			plugins.fireHook('action:user.set', field, value, 'increment'); | 
					
						
							| 
									
										
										
										
											2014-05-01 14:30:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			if (typeof callback === 'function') { | 
					
						
							|  |  |  | 				callback(err, value); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 14:32:56 -04:00
										 |  |  | 	User.decrementUserFieldBy = function(uid, field, value, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-01 14:30:53 -04:00
										 |  |  | 		db.incrObjectFieldBy('user:' + uid, field, -value, function(err, value) { | 
					
						
							| 
									
										
										
										
											2014-05-01 14:37:26 -04:00
										 |  |  | 			plugins.fireHook('action:user.set', field, value, 'decrement'); | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-01 14:30:53 -04:00
										 |  |  | 			if (typeof callback === 'function') { | 
					
						
							|  |  |  | 				callback(err, value); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-19 10:59:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-19 21:32:13 -04:00
										 |  |  | 	User.getUsersFromSet = function(set, start, stop, callback) { | 
					
						
							|  |  |  | 		async.waterfall([ | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							|  |  |  | 				db.getSortedSetRevRange(set, start, stop, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function(uids, next) { | 
					
						
							|  |  |  | 				User.getUsers(uids, next); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	User.getUsers = function(uids, callback) { | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 		function loadUserInfo(user, callback) { | 
					
						
							|  |  |  | 			if (!user) { | 
					
						
							|  |  |  | 				return callback(null, user); | 
					
						
							| 
									
										
										
										
											2013-08-12 14:32:56 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 			async.waterfall([ | 
					
						
							|  |  |  | 				function(next) { | 
					
						
							|  |  |  | 					User.isAdministrator(user.uid, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				function(isAdmin, next) { | 
					
						
							| 
									
										
										
										
											2014-03-14 19:07:50 -04:00
										 |  |  | 					user.status = !user.status ? 'online' : user.status; | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 					user.administrator = isAdmin; | 
					
						
							|  |  |  | 					user.banned = parseInt(user.banned, 10) === 1; | 
					
						
							| 
									
										
										
										
											2014-03-19 21:32:13 -04:00
										 |  |  | 					db.isSortedSetMember('users:online', user.uid, next); | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2014-03-19 21:32:13 -04:00
										 |  |  | 				function(isMember, next) { | 
					
						
							|  |  |  | 					if (!isMember) { | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 						user.status = 'offline'; | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 					next(null, user); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			], callback); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-19 21:32:13 -04:00
										 |  |  | 		User.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'postcount', 'reputation'], function(err, usersData) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-03-19 21:32:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			async.map(usersData, loadUserInfo, callback); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	User.createGravatarURLFromEmail = function(email) { | 
					
						
							| 
									
										
										
										
											2014-05-11 19:39:52 -04:00
										 |  |  | 		var customGravatarDefaultImage = meta.config.customGravatarDefaultImage; | 
					
						
							|  |  |  | 		if (customGravatarDefaultImage && customGravatarDefaultImage.indexOf('http') === -1) { | 
					
						
							|  |  |  | 			customGravatarDefaultImage = nconf.get('url') + meta.config.customGravatarDefaultImage; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-04-26 15:53:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-12 16:23:35 -04:00
										 |  |  | 		var options = { | 
					
						
							|  |  |  | 			size: '128', | 
					
						
							| 
									
										
										
										
											2014-05-22 11:42:37 -04:00
										 |  |  | 			default: customGravatarDefaultImage || meta.config.defaultGravatarImage || 'identicon', | 
					
						
							| 
									
										
										
										
											2013-07-12 16:23:35 -04:00
										 |  |  | 			rating: 'pg' | 
					
						
							| 
									
										
										
										
											2014-01-25 12:05:48 -05:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-05 15:55:58 -05:00
										 |  |  | 		if (!email) { | 
					
						
							| 
									
										
										
										
											2013-07-12 16:23:35 -04:00
										 |  |  | 			email = ''; | 
					
						
							| 
									
										
										
										
											2013-07-05 15:55:58 -05:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-07-12 16:23:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 12:05:48 -05:00
										 |  |  | 		return gravatar.url(email, options, true); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	User.hashPassword = function(password, callback) { | 
					
						
							| 
									
										
										
										
											2013-09-17 13:09:37 -04:00
										 |  |  | 		if (!password) { | 
					
						
							| 
									
										
										
										
											2014-03-17 21:47:37 -04:00
										 |  |  | 			return callback(null, password); | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-07-05 15:55:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 		bcrypt.genSalt(nconf.get('bcrypt_rounds'), function(err, salt) { | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 			if (err) { | 
					
						
							| 
									
										
										
										
											2014-02-26 21:04:20 -05:00
										 |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 			bcrypt.hash(password, salt, callback); | 
					
						
							| 
									
										
										
										
											2014-01-07 14:01:32 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-02-26 21:04:20 -05:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-01-07 14:01:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-17 17:27:42 -04:00
										 |  |  | 	User.onNewPostMade = function(postData) { | 
					
						
							|  |  |  | 		User.addPostIdToUser(postData.uid, postData.pid, postData.timestamp); | 
					
						
							| 
									
										
										
										
											2013-07-05 16:25:51 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-02 16:54:57 -04:00
										 |  |  | 		User.incrementUserPostCountBy(postData.uid, 1); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-17 17:27:42 -04:00
										 |  |  | 		User.setUserField(postData.uid, 'lastposttime', postData.timestamp); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-02 16:24:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-17 17:38:47 -04:00
										 |  |  | 	emitter.on('event:newpost', User.onNewPostMade); | 
					
						
							| 
									
										
										
										
											2014-03-17 17:27:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-02 16:54:57 -04:00
										 |  |  | 	User.incrementUserPostCountBy = function(uid, value, callback) { | 
					
						
							|  |  |  | 		User.incrementUserFieldBy(uid, 'postcount', value, function(err, newpostcount) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				if(typeof callback === 'function') { | 
					
						
							|  |  |  | 					callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			db.sortedSetAdd('users:postcount', newpostcount, uid, callback); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 17:30:29 -05:00
										 |  |  | 	User.addPostIdToUser = function(uid, pid, timestamp) { | 
					
						
							|  |  |  | 		db.sortedSetAdd('uid:' + uid + ':posts', timestamp, pid); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-02 16:24:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 17:30:29 -05:00
										 |  |  | 	User.addTopicIdToUser = function(uid, tid, timestamp) { | 
					
						
							|  |  |  | 		db.sortedSetAdd('uid:' + uid + ':topics', timestamp, tid); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-02 16:24:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 	User.getPostIds = function(uid, start, stop, callback) { | 
					
						
							| 
									
										
										
										
											2014-01-07 17:30:29 -05:00
										 |  |  | 		db.getSortedSetRevRange('uid:' + uid + ':posts', start, stop, function(err, pids) { | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 			callback(err, Array.isArray(pids) ? pids : []); | 
					
						
							| 
									
										
										
										
											2013-05-15 11:46:41 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-15 14:30:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-24 16:16:50 -04:00
										 |  |  | 	User.exists = function(userslug, callback) { | 
					
						
							| 
									
										
										
										
											2013-10-30 18:31:36 -04:00
										 |  |  | 		User.getUidByUserslug(userslug, function(err, exists) { | 
					
						
							| 
									
										
										
										
											2014-01-16 16:50:41 -05:00
										 |  |  | 			callback(err, !! exists); | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-05 16:37:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-09 21:27:50 -05:00
										 |  |  | 	User.count = function(callback) { | 
					
						
							| 
									
										
										
										
											2013-12-02 21:33:35 -05:00
										 |  |  | 		db.getObjectField('global', 'userCount', function(err, count) { | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 			callback(err, count ? count : 0); | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-05 16:37:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 18:31:36 -04:00
										 |  |  | 	User.getUidByUsername = function(username, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 		db.getObjectField('username:uid', username, callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 18:31:36 -04:00
										 |  |  | 	User.getUidByUserslug = function(userslug, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 		db.getObjectField('userslug:uid', userslug, callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-06-24 14:33:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 18:31:36 -04:00
										 |  |  | 	User.getUsernamesByUids = function(uids, callback) { | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 		User.getMultipleUserFields(uids, ['username'], function(err, users) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-05-17 13:28:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 			users = users.map(function(user) { | 
					
						
							|  |  |  | 				return user.username; | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-07-05 18:19:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 			callback(null, users); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-27 12:19:25 -05:00
										 |  |  | 	User.getUsernameByUserslug = function(slug, callback) { | 
					
						
							|  |  |  | 		async.waterfall([ | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							|  |  |  | 				User.getUidByUserslug(slug, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function(uid, next) { | 
					
						
							|  |  |  | 				User.getUserField(uid, 'username', next); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 18:31:36 -04:00
										 |  |  | 	User.getUidByEmail = function(email, callback) { | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 		db.getObjectField('email:uid', email, callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-17 15:38:06 -04:00
										 |  |  | 	User.getUsernameByEmail = function(email, callback) { | 
					
						
							|  |  |  | 		db.getObjectField('email:uid', email, function(err, uid) { | 
					
						
							| 
									
										
										
										
											2014-03-17 15:46:53 -04:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-03-17 15:38:06 -04:00
										 |  |  | 			User.getUserField(uid, 'username', callback); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-16 12:49:39 -04:00
										 |  |  | 	User.isModerator = function(uid, cid, callback) { | 
					
						
							| 
									
										
										
										
											2014-03-20 09:12:49 -04:00
										 |  |  | 		groups.isMember(uid, 'cid:' + cid + ':privileges:mods', callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-17 21:14:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	User.isAdministrator = function(uid, callback) { | 
					
						
							| 
									
										
										
										
											2014-03-20 09:12:49 -04:00
										 |  |  | 		groups.isMember(uid, 'administrators', callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-06-20 14:45:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-17 16:27:56 -04:00
										 |  |  | 	User.isOnline = function(uid, callback) { | 
					
						
							| 
									
										
										
										
											2014-04-24 16:19:31 -04:00
										 |  |  | 		User.getUserFields(uid, ['username', 'userslug', 'picture', 'status'] , function(err, data) { | 
					
						
							| 
									
										
										
										
											2014-03-17 16:27:56 -04:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-05-26 14:49:04 -04:00
										 |  |  | 			var websockets = require('./socket.io'); | 
					
						
							|  |  |  | 			var online = websockets.isUserOnline(uid); | 
					
						
							| 
									
										
										
										
											2014-03-17 16:27:56 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-24 16:19:31 -04:00
										 |  |  | 			data.status = online ? (data.status || 'online') : 'offline'; | 
					
						
							| 
									
										
										
										
											2014-03-17 16:27:56 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-24 16:19:31 -04:00
										 |  |  | 			if(data.status === 'offline') { | 
					
						
							| 
									
										
										
										
											2014-03-17 16:27:56 -04:00
										 |  |  | 				online = false; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-24 16:19:31 -04:00
										 |  |  | 			data.online = online; | 
					
						
							|  |  |  | 			data.uid = uid; | 
					
						
							|  |  |  | 			data.timestamp = Date.now(); | 
					
						
							| 
									
										
										
										
											2014-05-26 14:49:04 -04:00
										 |  |  | 			data.rooms = websockets.getUserRooms(uid); | 
					
						
							| 
									
										
										
										
											2014-05-26 14:52:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-24 16:19:31 -04:00
										 |  |  | 			callback(null, data); | 
					
						
							| 
									
										
										
										
											2014-03-17 16:27:56 -04:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-11 23:38:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-30 13:13:18 -05:00
										 |  |  | }(exports)); |