| 
									
										
										
										
											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'), | 
					
						
							| 
									
										
										
										
											2014-02-21 20:05:44 -05:00
										 |  |  | 	validator = require('validator'), | 
					
						
							| 
									
										
										
										
											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-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'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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-12 18:00:27 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 	User.create = function(userData, callback) { | 
					
						
							|  |  |  | 		userData = userData || {}; | 
					
						
							|  |  |  | 		userData.userslug = utils.slugify(userData.username); | 
					
						
							| 
									
										
										
										
											2013-07-07 16:31:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 		userData.username = userData.username.trim(); | 
					
						
							|  |  |  | 		if (userData.email !== undefined) { | 
					
						
							|  |  |  | 			userData.email = userData.email.trim(); | 
					
						
							| 
									
										
										
										
											2014-02-24 20:19:31 -05:00
										 |  |  | 			userData.email = validator.escape(userData.email); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-07-22 00:24:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		async.parallel([ | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 				if (userData.email) { | 
					
						
							|  |  |  | 					next(!utils.isEmailValid(userData.email) ? new Error('Invalid Email!') : null); | 
					
						
							| 
									
										
										
										
											2013-11-04 23:30:30 +02:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 					next(); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-07-22 00:24:37 -04:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 				next((!utils.isUserNameValid(userData.username) || !userData.userslug) ? new Error('Invalid Username!') : null); | 
					
						
							| 
									
										
										
										
											2013-07-22 00:24:37 -04:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 				if (userData.password) { | 
					
						
							|  |  |  | 					next(!utils.isPasswordValid(userData.password) ? new Error('Invalid Password!') : null); | 
					
						
							| 
									
										
										
										
											2013-11-04 23:30:30 +02:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 					next(); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-07-22 00:24:37 -04:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 				User.exists(userData.userslug, function(err, exists) { | 
					
						
							| 
									
										
										
										
											2014-01-16 16:50:41 -05:00
										 |  |  | 					if (err) { | 
					
						
							|  |  |  | 						return next(err); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2013-07-22 00:24:37 -04:00
										 |  |  | 					next(exists ? new Error('Username taken!') : null); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 				if (userData.email) { | 
					
						
							| 
									
										
										
										
											2014-03-05 21:21:53 -05:00
										 |  |  | 					User.email.available(userData.email, function(err, available) { | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 						if (err) { | 
					
						
							| 
									
										
										
										
											2013-09-11 15:24:01 -04:00
										 |  |  | 							return next(err); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2013-07-24 12:04:32 -04:00
										 |  |  | 						next(!available ? new Error('Email taken!') : null); | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 				} else { | 
					
						
							|  |  |  | 					next(); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							|  |  |  | 				plugins.fireHook('filter:user.create', userData, function(err, filteredUserData){ | 
					
						
							|  |  |  | 					next(err, utils.merge(userData, filteredUserData)); | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2013-07-07 16:31:37 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-07-22 00:24:37 -04:00
										 |  |  | 		], function(err, results) { | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 			if (err) { | 
					
						
							| 
									
										
										
										
											2013-12-02 17:10:26 -05:00
										 |  |  | 				return callback(err); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-16 11:13:37 -05:00
										 |  |  | 			userData = results[results.length - 1]; | 
					
						
							| 
									
										
										
										
											2013-07-07 16:31:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 21:58:37 -05:00
										 |  |  | 			db.incrObjectField('global', 'nextUid', function(err, uid) { | 
					
						
							| 
									
										
										
										
											2013-12-02 17:10:26 -05:00
										 |  |  | 				if(err) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-07-07 16:31:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 				var gravatar = User.createGravatarURLFromEmail(userData.email); | 
					
						
							| 
									
										
										
										
											2013-08-12 14:32:56 -04:00
										 |  |  | 				var timestamp = Date.now(); | 
					
						
							| 
									
										
										
										
											2014-01-20 16:29:46 -05:00
										 |  |  | 				var password = userData.password; | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 				userData = { | 
					
						
							| 
									
										
										
										
											2013-07-22 00:24:37 -04:00
										 |  |  | 					'uid': uid, | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 					'username': userData.username, | 
					
						
							|  |  |  | 					'userslug': userData.userslug, | 
					
						
							| 
									
										
										
										
											2013-07-22 00:24:37 -04:00
										 |  |  | 					'fullname': '', | 
					
						
							| 
									
										
										
										
											2013-09-17 13:09:37 -04:00
										 |  |  | 					'location': '', | 
					
						
							|  |  |  | 					'birthday': '', | 
					
						
							|  |  |  | 					'website': '', | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 					'email': userData.email || '', | 
					
						
							| 
									
										
										
										
											2013-09-17 13:09:37 -04:00
										 |  |  | 					'signature': '', | 
					
						
							|  |  |  | 					'joindate': timestamp, | 
					
						
							| 
									
										
										
										
											2013-07-22 00:24:37 -04:00
										 |  |  | 					'picture': gravatar, | 
					
						
							| 
									
										
										
										
											2013-09-17 13:09:37 -04:00
										 |  |  | 					'gravatarpicture': gravatar, | 
					
						
							| 
									
										
										
										
											2013-07-22 00:24:37 -04:00
										 |  |  | 					'uploadedpicture': '', | 
					
						
							| 
									
										
										
										
											2013-08-16 13:03:56 -04:00
										 |  |  | 					'profileviews': 0, | 
					
						
							| 
									
										
										
										
											2013-07-22 00:24:37 -04:00
										 |  |  | 					'reputation': 0, | 
					
						
							|  |  |  | 					'postcount': 0, | 
					
						
							|  |  |  | 					'lastposttime': 0, | 
					
						
							| 
									
										
										
										
											2013-08-14 13:32:07 -04:00
										 |  |  | 					'banned': 0, | 
					
						
							| 
									
										
										
										
											2014-02-20 15:25:39 -05:00
										 |  |  | 					'status': 'online' | 
					
						
							| 
									
										
										
										
											2014-01-20 12:41:35 -05:00
										 |  |  | 				}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:53:35 -05:00
										 |  |  | 				db.setObject('user:' + uid, userData, function(err) { | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:53:35 -05:00
										 |  |  | 					if(err) { | 
					
						
							|  |  |  | 						return callback(err); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					db.setObjectField('username:uid', userData.username, uid); | 
					
						
							|  |  |  | 					db.setObjectField('userslug:uid', userData.userslug, uid); | 
					
						
							| 
									
										
										
										
											2013-07-07 16:31:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:53:35 -05:00
										 |  |  | 					if (userData.email !== undefined) { | 
					
						
							|  |  |  | 						db.setObjectField('email:uid', userData.email, uid); | 
					
						
							|  |  |  | 						if (parseInt(uid, 10) !== 1) { | 
					
						
							|  |  |  | 							User.email.verify(uid, userData.email); | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2014-01-22 19:47:55 -05:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2013-07-07 16:31:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:53:35 -05:00
										 |  |  | 					plugins.fireHook('action:user.create', userData); | 
					
						
							|  |  |  | 					db.incrObjectField('global', 'userCount'); | 
					
						
							| 
									
										
										
										
											2013-07-07 16:31:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:53:35 -05:00
										 |  |  | 					db.sortedSetAdd('users:joindate', timestamp, uid); | 
					
						
							|  |  |  | 					db.sortedSetAdd('users:postcount', 0, uid); | 
					
						
							|  |  |  | 					db.sortedSetAdd('users:reputation', 0, uid); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:53:35 -05:00
										 |  |  | 					groups.joinByGroupName('registered-users', uid); | 
					
						
							| 
									
										
										
										
											2014-01-13 13:32:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:53:35 -05:00
										 |  |  | 					if (password) { | 
					
						
							|  |  |  | 						User.hashPassword(password, function(err, hash) { | 
					
						
							|  |  |  | 							if(err) { | 
					
						
							|  |  |  | 								return callback(err); | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2014-02-16 11:13:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:53:35 -05:00
										 |  |  | 							User.setUserField(uid, 'password', hash); | 
					
						
							|  |  |  | 							callback(null, uid); | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 					} else { | 
					
						
							| 
									
										
										
										
											2013-09-06 22:22:42 -04:00
										 |  |  | 						callback(null, uid); | 
					
						
							| 
									
										
										
										
											2014-02-20 14:53:35 -05:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2013-07-07 16:31:37 -04:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 	User.getUserField = function(uid, field, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-02 17:10:26 -05:00
										 |  |  | 		db.getObjectField('user:' + uid, field, callback); | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											2013-12-02 17:10:26 -05:00
										 |  |  | 		db.getObjectFields('user:' + uid, fields, callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	User.getMultipleUserFields = function(uids, fields, callback) { | 
					
						
							| 
									
										
										
										
											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-03-11 03:39:41 -04:00
										 |  |  | 		db.getObjectsFields(keys, fields, callback); | 
					
						
							| 
									
										
										
										
											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-03-11 03:39:41 -04:00
										 |  |  | 			users.forEach(function(user) { | 
					
						
							|  |  |  | 				if (user) { | 
					
						
							|  |  |  | 					if (user.password) { | 
					
						
							|  |  |  | 						user.password = null; | 
					
						
							|  |  |  | 						user.hasPassword = true; | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						user.hasPassword = false; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-03-12 16:11:33 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					if (user.picture === user.uploadedpicture) { | 
					
						
							|  |  |  | 						user.picture = nconf.get('relative_path') + user.picture; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-03-06 15:32:06 -05:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			callback(null, users); | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							|  |  |  | 		User.getUserField(uid, 'lastposttime', function(err, lastposttime) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(!lastposttime) { | 
					
						
							|  |  |  | 				lastposttime = 0; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (Date.now() - parseInt(lastposttime, 10) < parseInt(meta.config.postDelay, 10) * 1000) { | 
					
						
							|  |  |  | 				return callback(new Error('too-many-posts')); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			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) { | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 		db.incrObjectFieldBy('user:' + uid, field, value, callback); | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 		db.incrObjectFieldBy('user:' + uid, field, -value, callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-19 10:59:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 14:32:56 -04:00
										 |  |  | 	User.getUsers = function(set, start, stop, 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-03-12 20:53:42 -04:00
										 |  |  | 					user.administrator = isAdmin ? '1':'0'; | 
					
						
							|  |  |  | 					if (set === 'users:online') { | 
					
						
							|  |  |  | 						return callback(null, user); | 
					
						
							| 
									
										
										
										
											2014-02-02 14:51:02 -05:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 					db.sortedSetScore('users:online', user.uid, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				function(score, next) { | 
					
						
							|  |  |  | 					if (!score) { | 
					
						
							|  |  |  | 						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-12 20:53:42 -04:00
										 |  |  | 		async.waterfall([ | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							|  |  |  | 				db.getSortedSetRevRange(set, start, stop, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function(uids, next) { | 
					
						
							|  |  |  | 				User.getUsersData(uids, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function(users, next) { | 
					
						
							|  |  |  | 				async.map(users, loadUserInfo, next); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	User.createGravatarURLFromEmail = function(email) { | 
					
						
							| 
									
										
										
										
											2013-07-12 16:23:35 -04:00
										 |  |  | 		var options = { | 
					
						
							|  |  |  | 			size: '128', | 
					
						
							|  |  |  | 			default: 'identicon', | 
					
						
							|  |  |  | 			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 = ''; | 
					
						
							|  |  |  | 			options.forcedefault = 'y'; | 
					
						
							| 
									
										
										
										
											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-12 20:53:42 -04:00
										 |  |  | 			return callback(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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-02 16:24:13 -04:00
										 |  |  | 	User.onNewPostMade = function(uid, tid, pid, timestamp) { | 
					
						
							| 
									
										
										
										
											2014-01-07 17:30:29 -05:00
										 |  |  | 		User.addPostIdToUser(uid, pid, timestamp); | 
					
						
							| 
									
										
										
										
											2013-07-05 16:25:51 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 14:32:56 -04:00
										 |  |  | 		User.incrementUserFieldBy(uid, 'postcount', 1, function(err, newpostcount) { | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 			db.sortedSetAdd('users:postcount', newpostcount, uid); | 
					
						
							| 
									
										
										
										
											2013-08-12 14:32:56 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-02 16:24:13 -04:00
										 |  |  | 		User.setUserField(uid, 'lastposttime', timestamp); | 
					
						
							| 
									
										
										
										
											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.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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-16 12:49:39 -04:00
										 |  |  | 	User.isModerator = function(uid, cid, callback) { | 
					
						
							| 
									
										
										
										
											2014-03-11 15:51:25 -04:00
										 |  |  | 		groups.isMemberByGroupName(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-02-26 21:04:20 -05:00
										 |  |  | 		groups.isMemberByGroupName(uid, 'administrators', callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-06-20 14:45:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-11 23:38:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-30 13:13:18 -05:00
										 |  |  | }(exports)); |