mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 02:55:58 +01:00 
			
		
		
		
	fixed conflicts
This commit is contained in:
		| @@ -1,8 +1,4 @@ | ||||
| root = true | ||||
|  | ||||
| [*] | ||||
| end_of_line = lf | ||||
| insert_final_newline = true | ||||
|  | ||||
| [*.js, *.css, *.tpl] | ||||
| indent_style = tab | ||||
							
								
								
									
										17
									
								
								.jsbeautifyrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								.jsbeautifyrc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| { | ||||
|     "indent_size": 4, | ||||
|     "indent_char": " ", | ||||
|     "indent_level": 0, | ||||
|     "indent_with_tabs": false, | ||||
|     "preserve_newlines": true, | ||||
|     "max_preserve_newlines": 10, | ||||
|     "jslint_happy": false, | ||||
|     "brace_style": "collapse", | ||||
|     "keep_array_indentation": false, | ||||
|     "keep_function_indentation": false, | ||||
|     "space_before_conditional": true, | ||||
|     "break_chained_methods": false, | ||||
|     "eval_code": false, | ||||
|     "unescape_strings": false, | ||||
|     "wrap_line_length": 0 | ||||
| } | ||||
							
								
								
									
										86
									
								
								.jshintrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								.jshintrc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| { | ||||
|     // JSHint Default Configuration File (as on JSHint website) | ||||
|     // See http://jshint.com/docs/ for more details | ||||
|  | ||||
|     "maxerr" : 50, // {int} Maximum error before stopping | ||||
|  | ||||
|     // Enforcing | ||||
|     "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) | ||||
|     "camelcase" : false, // true: Identifiers must be in camelCase | ||||
|     "curly" : true, // true: Require {} for every new block or scope | ||||
|     "eqeqeq" : true, // true: Require triple equals (===) for comparison | ||||
|     "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() | ||||
|     "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` | ||||
|     "indent" : 4, // {int} Number of spaces to use for indentation | ||||
|     "latedef" : false, // true: Require variables/functions to be defined before being used | ||||
|     "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()` | ||||
|     "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` | ||||
|     "noempty" : true, // true: Prohibit use of empty blocks | ||||
|     "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) | ||||
|     "plusplus" : false, // true: Prohibit use of `++` & `--` | ||||
|     "quotmark" : false, // Quotation mark consistency: | ||||
|                                 // false : do nothing (default) | ||||
|                                 // true : ensure whatever is used is consistent | ||||
|                                 // "single" : require single quotes | ||||
|                                 // "double" : require double quotes | ||||
|     "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) | ||||
|     "unused" : true, // true: Require all defined variables be used | ||||
|     "strict" : true, // true: Requires all functions run in ES5 Strict Mode | ||||
|     "trailing" : false, // true: Prohibit trailing whitespaces | ||||
|     "maxparams" : false, // {int} Max number of formal params allowed per function | ||||
|     "maxdepth" : false, // {int} Max depth of nested blocks (within functions) | ||||
|     "maxstatements" : false, // {int} Max number statements per function | ||||
|     "maxcomplexity" : false, // {int} Max cyclomatic complexity per function | ||||
|     "maxlen" : false, // {int} Max number of characters per line | ||||
|  | ||||
|     // Relaxing | ||||
|     "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) | ||||
|     "boss" : false, // true: Tolerate assignments where comparisons would be expected | ||||
|     "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. | ||||
|     "eqnull" : false, // true: Tolerate use of `== null` | ||||
|     "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) | ||||
|     "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) | ||||
|     "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) | ||||
|                                  // (ex: `for each`, multiple try/catch, function expression…) | ||||
|     "evil" : false, // true: Tolerate use of `eval` and `new Function()` | ||||
|     "expr" : false, // true: Tolerate `ExpressionStatement` as Programs | ||||
|     "funcscope" : false, // true: Tolerate defining variables inside control statements" | ||||
|     "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict') | ||||
|     "iterator" : false, // true: Tolerate using the `__iterator__` property | ||||
|     "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block | ||||
|     "laxbreak" : false, // true: Tolerate possibly unsafe line breakings | ||||
|     "laxcomma" : false, // true: Tolerate comma-first style coding | ||||
|     "loopfunc" : false, // true: Tolerate functions being defined in loops | ||||
|     "multistr" : false, // true: Tolerate multi-line strings | ||||
|     "proto" : false, // true: Tolerate using the `__proto__` property | ||||
|     "scripturl" : false, // true: Tolerate script-targeted URLs | ||||
|     "smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment | ||||
|     "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` | ||||
|     "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation | ||||
|     "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` | ||||
|     "validthis" : false, // true: Tolerate using this in a non-constructor function | ||||
|  | ||||
|     // Environments | ||||
|     "browser" : true, // Web Browser (window, document, etc) | ||||
|     "couch" : false, // CouchDB | ||||
|     "devel" : true, // Development/debugging (alert, confirm, etc) | ||||
|     "dojo" : false, // Dojo Toolkit | ||||
|     "jquery" : true, // jQuery | ||||
|     "mootools" : false, // MooTools | ||||
|     "node" : true, // Node.js | ||||
|     "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) | ||||
|     "prototypejs" : false, // Prototype and Scriptaculous | ||||
|     "rhino" : false, // Rhino | ||||
|     "worker" : false, // Web Workers | ||||
|     "wsh" : false, // Windows Scripting Host | ||||
|     "yui" : false, // Yahoo User Interface | ||||
|  | ||||
|     // Legacy | ||||
|     "nomen" : false, // true: Prohibit dangling `_` in variables | ||||
|     "onevar" : false, // true: Allow only one `var` statement per function | ||||
|     "passfail" : false, // true: Stop on first error | ||||
|     "white" : false, // true: Check against strict whitespace and indentation rules | ||||
|  | ||||
|     // Custom Globals | ||||
|     "globals" : {} // additional predefined global variables | ||||
| } | ||||
							
								
								
									
										8
									
								
								app.js
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								app.js
									
									
									
									
									
								
							| @@ -53,7 +53,9 @@ winston.info(''); | ||||
|  | ||||
| if (fs.existsSync(__dirname + '/config.json') && (!nconf.get('setup') && !nconf.get('upgrade'))) { | ||||
| 	// Load server-side config | ||||
| 	nconf.file({ file: __dirname + '/config.json'}); | ||||
| 	nconf.file({ | ||||
| 		file: __dirname + '/config.json' | ||||
| 	}); | ||||
|  | ||||
| 	var meta = require('./src/meta.js'); | ||||
|  | ||||
| @@ -93,7 +95,9 @@ if (fs.existsSync(__dirname + '/config.json') && (!nconf.get('setup') && !nconf. | ||||
| 	}); | ||||
|  | ||||
| } else if (nconf.get('upgrade')) { | ||||
| 	nconf.file({ file: __dirname + '/config.json'}); | ||||
| 	nconf.file({ | ||||
| 		file: __dirname + '/config.json' | ||||
| 	}); | ||||
| 	var meta = require('./src/meta.js'); | ||||
|  | ||||
| 	meta.configs.init(function() { | ||||
|   | ||||
| @@ -43,7 +43,9 @@ var socket, | ||||
| 						}, 1000); | ||||
| 						reconnecting = false; | ||||
| 						reconnectTries = 0; | ||||
| 						socket.emit('api:updateHeader', { fields: ['username', 'picture', 'userslug'] }); | ||||
| 						socket.emit('api:updateHeader', { | ||||
| 							fields: ['username', 'picture', 'userslug'] | ||||
| 						}); | ||||
| 					} | ||||
| 				}); | ||||
|  | ||||
| @@ -165,8 +167,7 @@ var socket, | ||||
|  | ||||
| 			clearTimeout(alert.attr('timeoutId')); | ||||
| 			startTimeout(alert, params.timeout); | ||||
| 		} | ||||
| 		else { | ||||
| 		} else { | ||||
| 			var div = document.createElement('div'), | ||||
| 				button = document.createElement('button'), | ||||
| 				strong = document.createElement('strong'), | ||||
|   | ||||
| @@ -26,7 +26,9 @@ | ||||
| 		} | ||||
|  | ||||
| 		followBtn.on('click', function() { | ||||
| 			socket.emit('api:user.follow', {uid: theirid}, function(success) { | ||||
| 			socket.emit('api:user.follow', { | ||||
| 				uid: theirid | ||||
| 			}, function(success) { | ||||
| 				if (success) { | ||||
| 					followBtn.hide(); | ||||
| 					unfollowBtn.show(); | ||||
| @@ -39,7 +41,9 @@ | ||||
| 		}); | ||||
|  | ||||
| 		unfollowBtn.on('click', function() { | ||||
| 			socket.emit('api:user.unfollow', {uid: theirid}, function(success) { | ||||
| 			socket.emit('api:user.unfollow', { | ||||
| 				uid: theirid | ||||
| 			}, function(success) { | ||||
| 				if (success) { | ||||
| 					followBtn.show(); | ||||
| 					unfollowBtn.hide(); | ||||
|   | ||||
| @@ -1,5 +1,3 @@ | ||||
|  | ||||
|  | ||||
| var gravatarPicture = templates.get('gravatarpicture'); | ||||
| var uploadedPicture = templates.get('uploadedpicture'); | ||||
|  | ||||
| @@ -51,7 +49,9 @@ $(document).ready(function() { | ||||
| 					$('#upload-picture-modal').modal('hide'); | ||||
| 				}, 750); | ||||
|  | ||||
| 				socket.emit('api:updateHeader', { fields: ['username', 'picture', 'userslug'] }); | ||||
| 				socket.emit('api:updateHeader', { | ||||
| 					fields: ['username', 'picture', 'userslug'] | ||||
| 				}); | ||||
| 				success('File uploaded successfully!'); | ||||
| 			} | ||||
| 		}); | ||||
| @@ -131,15 +131,13 @@ $(document).ready(function() { | ||||
| 		if (gravatarPicture) { | ||||
| 			$('#user-gravatar-picture').attr('src', gravatarPicture); | ||||
| 			$('#gravatar-box').show(); | ||||
| 		} | ||||
| 		else | ||||
| 		} else | ||||
| 			$('#gravatar-box').hide(); | ||||
|  | ||||
| 		if (uploadedPicture) { | ||||
| 			$('#user-uploaded-picture').attr('src', uploadedPicture); | ||||
| 			$('#uploaded-box').show(); | ||||
| 		} | ||||
| 		else | ||||
| 		} else | ||||
| 			$('#uploaded-box').hide(); | ||||
|  | ||||
|  | ||||
| @@ -263,7 +261,10 @@ $(document).ready(function() { | ||||
| 		$('#changePasswordBtn').on('click', function() { | ||||
|  | ||||
| 			if (passwordvalid && passwordsmatch && currentPassword.val()) { | ||||
| 				socket.emit('api:user.changePassword', {'currentPassword': currentPassword.val(),'newPassword': password.val()	}, function(err) { | ||||
| 				socket.emit('api:user.changePassword', { | ||||
| 					'currentPassword': currentPassword.val(), | ||||
| 					'newPassword': password.val() | ||||
| 				}, function(err) { | ||||
|  | ||||
| 					currentPassword.val(''); | ||||
| 					password.val(''); | ||||
|   | ||||
| @@ -1,6 +1,3 @@ | ||||
|  | ||||
|  | ||||
|  | ||||
| $(document).ready(function() { | ||||
|  | ||||
| 	$('#submitBtn').on('click', function() { | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
|  | ||||
| var modified_categories = {}; | ||||
|  | ||||
| function modified(el) { | ||||
| @@ -73,7 +72,9 @@ jQuery('.blockclass').each(function() { | ||||
| 					timeout: 2000 | ||||
| 				}); | ||||
|  | ||||
| 				var html = templates.prepare(templates['admin/categories'].blocks['categories']).parse({categories:[data]}); | ||||
| 				var html = templates.prepare(templates['admin/categories'].blocks['categories']).parse({ | ||||
| 					categories: [data] | ||||
| 				}); | ||||
| 				$('#entry-container').append(html); | ||||
|  | ||||
| 				$('#new-category-modal').modal('hide'); | ||||
|   | ||||
| @@ -1,6 +1,3 @@ | ||||
|  | ||||
|  | ||||
|  | ||||
| var nodebb_admin = (function(nodebb_admin) { | ||||
|  | ||||
| 	nodebb_admin.config = undefined; | ||||
| @@ -63,7 +60,10 @@ var nodebb_admin = (function(nodebb_admin) { | ||||
| 					value = fields[x].value; | ||||
| 				} | ||||
|  | ||||
| 				socket.emit('api:config.set', { key: key, value: value }); | ||||
| 				socket.emit('api:config.set', { | ||||
| 					key: key, | ||||
| 					value: value | ||||
| 				}); | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
| @@ -119,4 +119,3 @@ var nodebb_admin = (function(nodebb_admin) { | ||||
| 	return nodebb_admin; | ||||
|  | ||||
| }(nodebb_admin || {})); | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,3 @@ | ||||
|  | ||||
|  | ||||
| var nodebb_admin = (function(nodebb_admin) { | ||||
|  | ||||
| 	var themes = {}; | ||||
| @@ -58,10 +56,12 @@ var nodebb_admin = (function(nodebb_admin) { | ||||
| 							cssSrc = parentEl.attr('data-css'), | ||||
| 							cssName = parentEl.attr('data-theme'); | ||||
| 						socket.emit('api:config.set', { | ||||
| 							key: 'theme:id', value: 'bootswatch:' + cssName | ||||
| 							key: 'theme:id', | ||||
| 							value: 'bootswatch:' + cssName | ||||
| 						}); | ||||
| 						socket.emit('api:config.set', { | ||||
| 							key: 'theme:src', value: cssSrc | ||||
| 							key: 'theme:src', | ||||
| 							value: cssSrc | ||||
| 						}); | ||||
| 						break; | ||||
| 				} | ||||
|   | ||||
| @@ -9,16 +9,28 @@ $(document).ready(function() { | ||||
|  | ||||
| 		switch (action) { | ||||
| 			case 'pin': | ||||
| 				if (!$this.hasClass('active')) socket.emit('api:topic.pin', { tid: tid }); | ||||
| 				else socket.emit('api:topic.unpin', { tid: tid }); | ||||
| 				if (!$this.hasClass('active')) socket.emit('api:topic.pin', { | ||||
| 					tid: tid | ||||
| 				}); | ||||
| 				else socket.emit('api:topic.unpin', { | ||||
| 					tid: tid | ||||
| 				}); | ||||
| 				break; | ||||
| 			case 'lock': | ||||
| 				if (!$this.hasClass('active')) socket.emit('api:topic.lock', { tid: tid }); | ||||
| 				else socket.emit('api:topic.unlock', { tid: tid }); | ||||
| 				if (!$this.hasClass('active')) socket.emit('api:topic.lock', { | ||||
| 					tid: tid | ||||
| 				}); | ||||
| 				else socket.emit('api:topic.unlock', { | ||||
| 					tid: tid | ||||
| 				}); | ||||
| 				break; | ||||
| 			case 'delete': | ||||
| 				if (!$this.hasClass('active')) socket.emit('api:topic.delete', { tid: tid }); | ||||
| 				else socket.emit('api:topic.restore', { tid: tid }); | ||||
| 				if (!$this.hasClass('active')) socket.emit('api:topic.delete', { | ||||
| 					tid: tid | ||||
| 				}); | ||||
| 				else socket.emit('api:topic.restore', { | ||||
| 					tid: tid | ||||
| 				}); | ||||
| 				break; | ||||
| 		} | ||||
| 	}); | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
|  | ||||
| (function() { | ||||
|  | ||||
| 	var yourid = templates.get('yourid'); | ||||
| @@ -179,8 +178,7 @@ | ||||
| 					.show() | ||||
| 					.addClass('label-danger') | ||||
| 					.removeClass('label-success'); | ||||
| 			} | ||||
| 			else { | ||||
| 			} else { | ||||
| 				$('#user-notfound-notify').html(data.length + ' user' + (data.length > 1 ? 's' : '') + ' found!') | ||||
| 					.show() | ||||
| 					.addClass('label-success') | ||||
| @@ -191,7 +189,9 @@ | ||||
| 		}); | ||||
|  | ||||
| 		function onUsersLoaded(users) { | ||||
| 			var html = templates.prepare(templates['admin/users'].blocks['users']).parse({ users: users }); | ||||
| 			var html = templates.prepare(templates['admin/users'].blocks['users']).parse({ | ||||
| 				users: users | ||||
| 			}); | ||||
| 			$('#users-container').append(html); | ||||
| 			updateUserButtons(); | ||||
| 		} | ||||
|   | ||||
| @@ -36,7 +36,9 @@ | ||||
| 	]); | ||||
|  | ||||
| 	function onNewTopic(data) { | ||||
| 		var html = templates.prepare(templates['category'].blocks['topics']).parse({ topics: [data] }), | ||||
| 		var html = templates.prepare(templates['category'].blocks['topics']).parse({ | ||||
| 			topics: [data] | ||||
| 		}), | ||||
| 			topic = document.createElement('div'), | ||||
| 			container = document.getElementById('topics-container'), | ||||
| 			topics = document.querySelectorAll('#topics-container a'), | ||||
| @@ -98,7 +100,9 @@ | ||||
|  | ||||
| 	function onTopicsLoaded(topics) { | ||||
|  | ||||
| 		var html = templates.prepare(templates['category'].blocks['topics']).parse({ topics: topics }), | ||||
| 		var html = templates.prepare(templates['category'].blocks['topics']).parse({ | ||||
| 			topics: topics | ||||
| 		}), | ||||
| 			container = $('#topics-container'); | ||||
|  | ||||
| 		jQuery('#topics-container, .category-sidebar').removeClass('hidden'); | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| (function() { | ||||
|  | ||||
| 	$(document).ready(function() { | ||||
|  | ||||
| 		$('.user-favourite-posts .topic-row').on('click', function() { | ||||
| 			ajaxify.go($(this).attr('topic-url')); | ||||
| 		}); | ||||
|  | ||||
| 	}); | ||||
|  | ||||
| }()); | ||||
| @@ -13,13 +13,14 @@ | ||||
|  | ||||
| 		if (yourid !== theirid) { | ||||
| 			$('.unfollow-btn').hide(); | ||||
| 		} | ||||
| 		else { | ||||
| 		} else { | ||||
| 			$('.unfollow-btn').on('click', function() { | ||||
| 				var unfollowBtn = $(this); | ||||
| 				var followingUid = $(this).attr('followingUid'); | ||||
|  | ||||
| 				socket.emit('api:user.unfollow', {uid: followingUid}, function(success) { | ||||
| 				socket.emit('api:user.unfollow', { | ||||
| 					uid: followingUid | ||||
| 				}, function(success) { | ||||
| 					var username = unfollowBtn.attr('data-username'); | ||||
| 					if (success) { | ||||
| 						unfollowBtn.parent().remove(); | ||||
|   | ||||
| @@ -22,7 +22,9 @@ | ||||
| 		stats_online.innerHTML = data.users; | ||||
| 	}); | ||||
|  | ||||
| 	socket.emit('api:updateHeader', { fields: ['username', 'picture', 'userslug'] }); | ||||
| 	socket.emit('api:updateHeader', { | ||||
| 		fields: ['username', 'picture', 'userslug'] | ||||
| 	}); | ||||
| 	socket.on('api:updateHeader', function(data) { | ||||
|  | ||||
| 		jQuery('#search-button').on('click', function() { | ||||
| @@ -134,9 +136,15 @@ | ||||
| 	notifList.addEventListener('click', function(e) { | ||||
| 		var target; | ||||
| 		switch (e.target.nodeName) { | ||||
| 			case 'SPAN': target = e.target.parentNode.parentNode; break; | ||||
| 			case 'A': target = e.target.parentNode; break; | ||||
| 			case 'li': target = e.target; break; | ||||
| 			case 'SPAN': | ||||
| 				target = e.target.parentNode.parentNode; | ||||
| 				break; | ||||
| 			case 'A': | ||||
| 				target = e.target.parentNode; | ||||
| 				break; | ||||
| 			case 'li': | ||||
| 				target = e.target; | ||||
| 				break; | ||||
| 		} | ||||
| 		if (target) { | ||||
| 			var nid = parseInt(target.getAttribute('data-nid')); | ||||
|   | ||||
| @@ -1,13 +1,15 @@ | ||||
|  | ||||
|  | ||||
| (function() { | ||||
| 	// Alternate Logins | ||||
| 	var altLoginEl = document.querySelector('.alt-logins'); | ||||
| 	altLoginEl.addEventListener('click', function(e) { | ||||
| 		var target; | ||||
| 		switch (e.target.nodeName) { | ||||
| 			case 'LI': target = e.target; break; | ||||
| 			case 'I': target = e.target.parentNode; break; | ||||
| 			case 'LI': | ||||
| 				target = e.target; | ||||
| 				break; | ||||
| 			case 'I': | ||||
| 				target = e.target.parentNode; | ||||
| 				break; | ||||
| 		} | ||||
| 		if (target) { | ||||
| 			document.location.href = target.getAttribute('data-url'); | ||||
|   | ||||
| @@ -8,7 +8,8 @@ | ||||
| 		'event:new_post' | ||||
| 	]); | ||||
|  | ||||
| 	var newTopicCount = 0, newPostCount = 0; | ||||
| 	var newTopicCount = 0, | ||||
| 		newPostCount = 0; | ||||
|  | ||||
| 	$('#new-topics-alert').on('click', function() { | ||||
| 		$(this).hide(); | ||||
| @@ -50,7 +51,9 @@ | ||||
|  | ||||
| 	function onTopicsLoaded(topics) { | ||||
|  | ||||
| 		var html = templates.prepare(templates['recent'].blocks['topics']).parse({ topics: topics }), | ||||
| 		var html = templates.prepare(templates['recent'].blocks['topics']).parse({ | ||||
| 			topics: topics | ||||
| 		}), | ||||
| 			container = $('#topics-container'); | ||||
|  | ||||
| 		$('#category-no-topics').remove(); | ||||
| @@ -60,7 +63,9 @@ | ||||
|  | ||||
| 	function loadMoreTopics() { | ||||
| 		loadingMoreTopics = true; | ||||
| 		socket.emit('api:topics.loadMoreRecentTopics', {after:$('#topics-container').children().length}, function(data) { | ||||
| 		socket.emit('api:topics.loadMoreRecentTopics', { | ||||
| 			after: $('#topics-container').children().length | ||||
| 		}, function(data) { | ||||
| 			if (data.topics && data.topics.length) { | ||||
| 				onTopicsLoaded(data.topics); | ||||
| 			} | ||||
|   | ||||
| @@ -36,9 +36,10 @@ | ||||
|  | ||||
| 		if (!utils.isEmailValid(emailEl.val())) { | ||||
| 			showError(email_notify, 'Invalid email address.'); | ||||
| 		} | ||||
| 		else | ||||
| 			socket.emit('user.email.exists', { email: emailEl.val() }); | ||||
| 		} else | ||||
| 			socket.emit('user.email.exists', { | ||||
| 				email: emailEl.val() | ||||
| 			}); | ||||
| 	} | ||||
|  | ||||
| 	emailEl.on('blur', function() { | ||||
| @@ -58,7 +59,9 @@ | ||||
| 		} else if (!utils.isUserNameValid(username.val())) { | ||||
| 			showError(username_notify, 'Invalid username!'); | ||||
| 		} else { | ||||
| 			socket.emit('user.exists', {username: username.val()}); | ||||
| 			socket.emit('user.exists', { | ||||
| 				username: username.val() | ||||
| 			}); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,9 @@ | ||||
|  | ||||
| 	document.getElementById('reset').onclick = function() { | ||||
| 		if (inputEl.value.length > 0 && inputEl.value.indexOf('@') !== -1) { | ||||
| 			socket.emit('user:reset.send', { email: inputEl.value }); | ||||
| 			socket.emit('user:reset.send', { | ||||
| 				email: inputEl.value | ||||
| 			}); | ||||
| 		} else { | ||||
| 			jQuery('#success').hide(); | ||||
| 			jQuery(errorEl).show(); | ||||
|   | ||||
| @@ -18,12 +18,17 @@ | ||||
| 			noticeEl.querySelector('p').innerHTML = 'The two passwords you\'ve entered do not match.'; | ||||
| 			noticeEl.style.display = 'block'; | ||||
| 		} else { | ||||
| 			socket.emit('user:reset.commit', { code: reset_code, password: password.value }); | ||||
| 			socket.emit('user:reset.commit', { | ||||
| 				code: reset_code, | ||||
| 				password: password.value | ||||
| 			}); | ||||
| 		} | ||||
| 	}, false); | ||||
|  | ||||
| 	// Enable the form if the code is valid | ||||
| 	socket.emit('user:reset.valid', { code: reset_code }); | ||||
| 	socket.emit('user:reset.valid', { | ||||
| 		code: reset_code | ||||
| 	}); | ||||
|  | ||||
|  | ||||
| 	ajaxify.register_events(['user:reset.valid', 'user:reset.commit']); | ||||
|   | ||||
| @@ -34,11 +34,15 @@ | ||||
| 			$('#delete_thread').on('click', function(e) { | ||||
| 				if (thread_state.deleted !== '1') { | ||||
| 					bootbox.confirm('Are you sure you want to delete this thread?', function(confirm) { | ||||
| 						if (confirm) socket.emit('api:topic.delete', { tid: tid }); | ||||
| 						if (confirm) socket.emit('api:topic.delete', { | ||||
| 							tid: tid | ||||
| 						}); | ||||
| 					}); | ||||
| 				} else { | ||||
| 					bootbox.confirm('Are you sure you want to restore this thread?', function(confirm) { | ||||
| 						if (confirm) socket.emit('api:topic.restore', { tid: tid }); | ||||
| 						if (confirm) socket.emit('api:topic.restore', { | ||||
| 							tid: tid | ||||
| 						}); | ||||
| 					}); | ||||
| 				} | ||||
| 				return false; | ||||
| @@ -46,18 +50,26 @@ | ||||
|  | ||||
| 			$('#lock_thread').on('click', function(e) { | ||||
| 				if (thread_state.locked !== '1') { | ||||
| 					socket.emit('api:topic.lock', { tid: tid }); | ||||
| 					socket.emit('api:topic.lock', { | ||||
| 						tid: tid | ||||
| 					}); | ||||
| 				} else { | ||||
| 					socket.emit('api:topic.unlock', { tid: tid }); | ||||
| 					socket.emit('api:topic.unlock', { | ||||
| 						tid: tid | ||||
| 					}); | ||||
| 				} | ||||
| 				return false; | ||||
| 			}); | ||||
|  | ||||
| 			$('#pin_thread').on('click', function(e) { | ||||
| 				if (thread_state.pinned !== '1') { | ||||
| 					socket.emit('api:topic.pin', { tid: tid }); | ||||
| 					socket.emit('api:topic.pin', { | ||||
| 						tid: tid | ||||
| 					}); | ||||
| 				} else { | ||||
| 					socket.emit('api:topic.unpin', { tid: tid }); | ||||
| 					socket.emit('api:topic.unpin', { | ||||
| 						tid: tid | ||||
| 					}); | ||||
| 				} | ||||
| 				return false; | ||||
| 			}); | ||||
| @@ -132,7 +144,10 @@ | ||||
| 										}); | ||||
| 									} | ||||
| 								}); | ||||
| 								socket.emit('api:topic.move', { tid: tid, cid: targetCid }); | ||||
| 								socket.emit('api:topic.move', { | ||||
| 									tid: tid, | ||||
| 									cid: targetCid | ||||
| 								}); | ||||
| 							} | ||||
| 						}); | ||||
| 					}); | ||||
| @@ -242,7 +257,9 @@ | ||||
| 					cmp.push(tid, null, null, quoted); | ||||
| 				}); | ||||
| 			}); | ||||
| 			socket.emit('api:posts.getRawPost', { pid: pid }); | ||||
| 			socket.emit('api:posts.getRawPost', { | ||||
| 				pid: pid | ||||
| 			}); | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| @@ -252,10 +269,15 @@ | ||||
|  | ||||
| 		var element = $(this).find('i'); | ||||
| 		if (element.attr('class') == 'icon-star-empty') { | ||||
| 			socket.emit('api:posts.favourite', {pid: pid, room_id: app.current_room}); | ||||
| 		} | ||||
| 		else { | ||||
| 			socket.emit('api:posts.unfavourite', {pid: pid, room_id: app.current_room}); | ||||
| 			socket.emit('api:posts.favourite', { | ||||
| 				pid: pid, | ||||
| 				room_id: app.current_room | ||||
| 			}); | ||||
| 		} else { | ||||
| 			socket.emit('api:posts.unfavourite', { | ||||
| 				pid: pid, | ||||
| 				room_id: app.current_room | ||||
| 			}); | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| @@ -276,8 +298,12 @@ | ||||
|  | ||||
| 		if (confirmDel) { | ||||
| 			deleteAction ? | ||||
| 			socket.emit('api:posts.delete', { pid: pid }) : | ||||
| 			socket.emit('api:posts.restore', { pid: pid }); | ||||
| 				socket.emit('api:posts.delete', { | ||||
| 					pid: pid | ||||
| 				}) : | ||||
| 				socket.emit('api:posts.restore', { | ||||
| 					pid: pid | ||||
| 				}); | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| @@ -644,8 +670,7 @@ | ||||
| 			var height = Math.floor(el.height()); | ||||
| 			var elBottom = elTop + (height < 300 ? height : 300); | ||||
|  | ||||
| 			var inView = ((elBottom >= scrollTop) && (elTop <= scrollBottom) | ||||
| 					&& (elBottom <= scrollBottom) &&  (elTop >= scrollTop)); | ||||
| 			var inView = ((elBottom >= scrollTop) && (elTop <= scrollBottom) && (elBottom <= scrollBottom) && (elTop >= scrollTop)); | ||||
|  | ||||
|  | ||||
| 			if (inView) { | ||||
|   | ||||
| @@ -8,7 +8,8 @@ | ||||
| 		'event:new_post' | ||||
| 	]); | ||||
|  | ||||
| 	var newTopicCount = 0, newPostCount = 0; | ||||
| 	var newTopicCount = 0, | ||||
| 		newPostCount = 0; | ||||
|  | ||||
| 	$('#new-topics-alert').on('click', function() { | ||||
| 		$(this).hide(); | ||||
| @@ -68,7 +69,9 @@ | ||||
|  | ||||
| 	function onTopicsLoaded(topics) { | ||||
|  | ||||
| 		var html = templates.prepare(templates['unread'].blocks['topics']).parse({ topics: topics }), | ||||
| 		var html = templates.prepare(templates['unread'].blocks['topics']).parse({ | ||||
| 			topics: topics | ||||
| 		}), | ||||
| 			container = $('#topics-container'); | ||||
|  | ||||
| 		$('#category-no-topics').remove(); | ||||
| @@ -78,7 +81,9 @@ | ||||
|  | ||||
| 	function loadMoreTopics() { | ||||
| 		loadingMoreTopics = true; | ||||
| 		socket.emit('api:topics.loadMoreUnreadTopics', {after:parseInt($('#topics-container').attr('data-next-start'), 10)}, function(data) { | ||||
| 		socket.emit('api:topics.loadMoreUnreadTopics', { | ||||
| 			after: parseInt($('#topics-container').attr('data-next-start'), 10) | ||||
| 		}, function(data) { | ||||
| 			if (data.topics && data.topics.length) { | ||||
| 				onTopicsLoaded(data.topics); | ||||
| 				$('#topics-container').attr('data-next-start', data.nextStart); | ||||
|   | ||||
| @@ -67,8 +67,7 @@ | ||||
| 			if (data && data.length === 0) { | ||||
| 				$('#user-notfound-notify').html('User not found!'); | ||||
| 				$('#user-notfound-notify').parent().addClass('btn-warning label-warning'); | ||||
| 			} | ||||
| 			else { | ||||
| 			} else { | ||||
| 				$('#user-notfound-notify').html(data.length + ' user' + (data.length > 1 ? 's' : '') + ' found!'); | ||||
| 				$('#user-notfound-notify').parent().addClass('btn-success label-success'); | ||||
| 			} | ||||
| @@ -78,7 +77,9 @@ | ||||
|  | ||||
|  | ||||
| 		function onUsersLoaded(users) { | ||||
| 			var html = templates.prepare(templates['users'].blocks['users']).parse({ users: users }); | ||||
| 			var html = templates.prepare(templates['users'].blocks['users']).parse({ | ||||
| 				users: users | ||||
| 			}); | ||||
| 			$('#users-container').append(html); | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,3 @@ | ||||
|  | ||||
|  | ||||
| (function(module) { | ||||
|  | ||||
| 	var config = {}, | ||||
| @@ -252,7 +250,8 @@ | ||||
| 			return template.replace(regex, block); | ||||
| 		} | ||||
|  | ||||
| 		var template = this.html, regex, block; | ||||
| 		var template = this.html, | ||||
| 			regex, block; | ||||
|  | ||||
| 		return (function parse(data, namespace, template) { | ||||
| 			if (!data || data.length == 0) { | ||||
| @@ -274,7 +273,9 @@ | ||||
| 							continue; | ||||
| 						} | ||||
|  | ||||
| 						var numblocks = data[d].length - 1, i = 0, result = ""; | ||||
| 						var numblocks = data[d].length - 1, | ||||
| 							i = 0, | ||||
| 							result = ""; | ||||
|  | ||||
| 						do { | ||||
| 							result += parse(data[d][i], namespace, block); | ||||
| @@ -312,7 +313,8 @@ | ||||
| 		templates.init(); | ||||
| 	} | ||||
|  | ||||
| })('undefined' === typeof module ? {module:{exports:{}}} : module) | ||||
|  | ||||
|  | ||||
|  | ||||
| })('undefined' === typeof module ? { | ||||
| 	module: { | ||||
| 		exports: {} | ||||
| 	} | ||||
| } : module) | ||||
| @@ -10,7 +10,8 @@ | ||||
| 	module.exports = utils = { | ||||
| 		generateUUID: function() { | ||||
| 			return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { | ||||
| 				var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); | ||||
| 				var r = Math.random() * 16 | 0, | ||||
| 					v = c == 'x' ? r : (r & 0x3 | 0x8); | ||||
| 				return v.toString(16); | ||||
| 			}); | ||||
| 		}, | ||||
| @@ -150,8 +151,7 @@ | ||||
| 					badge | ||||
| 						.removeClass('badge-inverse') | ||||
| 						.addClass('badge-important') | ||||
| 				} | ||||
| 				else { | ||||
| 				} else { | ||||
| 					badge | ||||
| 						.removeClass('badge-important') | ||||
| 						.addClass('badge-inverse') | ||||
| @@ -167,19 +167,27 @@ | ||||
|  | ||||
|  | ||||
| 	if (!String.prototype.trim) { | ||||
| 		String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g, '');}; | ||||
| 		String.prototype.trim = function() { | ||||
| 			return this.replace(/^\s+|\s+$/g, ''); | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| 	if (!String.prototype.ltrim) { | ||||
| 		String.prototype.ltrim=function(){return this.replace(/^\s+/,'');}; | ||||
| 		String.prototype.ltrim = function() { | ||||
| 			return this.replace(/^\s+/, ''); | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| 	if (!String.prototype.rtrim) { | ||||
| 		String.prototype.rtrim=function(){return this.replace(/\s+$/,'');}; | ||||
| 		String.prototype.rtrim = function() { | ||||
| 			return this.replace(/\s+$/, ''); | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| 	if (!String.prototype.fulltrim) { | ||||
| 		String.prototype.fulltrim=function(){return this.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' ');}; | ||||
| 		String.prototype.fulltrim = function() { | ||||
| 			return this.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g, '').replace(/\s+/g, ' '); | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| @@ -187,4 +195,8 @@ | ||||
| 		window.utils = module.exports; | ||||
| 	} | ||||
|  | ||||
| })('undefined' === typeof module ? {module:{exports:{}}} : module) | ||||
| })('undefined' === typeof module ? { | ||||
| 	module: { | ||||
| 		exports: {} | ||||
| 	} | ||||
| } : module) | ||||
| @@ -1,6 +1,9 @@ | ||||
|  | ||||
| 		</div> | ||||
| 	</div> | ||||
|  | ||||
| 	<div id="alert_window"></div> | ||||
|  | ||||
| 	<div id="footer" class="container" style="padding-top: 50px; display:none;"> | ||||
| 		<footer class="footer">Copyright © 2013 <a target="_blank" href="http://www.nodebb.com">NodeBB</a> by <a target="_blank" href="https://github.com/psychobunny">psychobunny</a>, <a href="https://github.com/julianlam" target="_blank">julianlam</a>, <a href="https://github.com/barisusakli" target="_blank">barisusakli</a> from <a target="_blank" href="http://www.designcreateplay.com">designcreateplay</a></footer> | ||||
| 	</div> | ||||
|   | ||||
| @@ -63,8 +63,6 @@ | ||||
| 		</div> | ||||
| 	</div> | ||||
|  | ||||
| 	<div id="alert_window"></div> | ||||
|  | ||||
| 	<div class="container"> | ||||
| 		<div class="row"> | ||||
| 			<div class="col-md-3"> | ||||
|   | ||||
| @@ -57,7 +57,7 @@ | ||||
|  | ||||
| 						<div id="content_{main_posts.pid}" class="post-content">{main_posts.content}</div> | ||||
| 						<div class="post-signature">{main_posts.signature}</div> | ||||
| 						<div class="profile-block"> | ||||
| 						<div class="post-info"> | ||||
| 							<span class="pull-right"> | ||||
| 								posted <span class="relativeTimeAgo">{main_posts.relativeTime} ago</span> | ||||
| 								<span class="{main_posts.edited-class}">| last edited by <strong><a href="/users/{main_posts.editorslug}">{main_posts.editorname}</a></strong> {main_posts.relativeEditTime} ago</span> | ||||
| @@ -112,7 +112,7 @@ | ||||
|  | ||||
| 						<div id="content_{posts.pid}" class="post-content">{posts.content}</div> | ||||
| 						<div class="post-signature">{posts.signature}</div> | ||||
| 						<div class="profile-block"> | ||||
| 						<div class="post-info"> | ||||
| 							<span class="pull-right"> | ||||
| 								posted <span class="relativeTimeAgo">{posts.relativeTime} ago</span> | ||||
| 								<span class="{posts.edited-class}">| last edited by <strong><a href="/users/{posts.editorslug}">{posts.editorname}</a></strong> {posts.relativeEditTime} ago</span> | ||||
|   | ||||
| @@ -35,15 +35,16 @@ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	.profile-block { | ||||
| 	.main-post, .sub-posts { | ||||
| 		.post-info { | ||||
| 			background: rgba(0, 0, 0, 0.02); | ||||
| 			margin: 15px -11px -11px -11px; | ||||
| 			border-radius: 0 0 5px 5px; | ||||
| 			font-size: 10px; | ||||
| 		line-height: 15px; | ||||
| 		padding: 5px 8px 5px 5px; | ||||
| 			color: #777; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	.active-users { | ||||
| 		color: rgb(153,153,153); | ||||
|   | ||||
| @@ -42,10 +42,10 @@ | ||||
| 	} | ||||
|  | ||||
| 	.main-post, .sub-posts { | ||||
| 		.profile-block, .post-block { | ||||
| 		.post-info, .post-block { | ||||
| 			position: relative; | ||||
| 			border: 1px solid rgba(0, 0, 0, 0.06); | ||||
| 			border-radius: 5px; | ||||
| 			border-radius: 0 0 5px 5px; | ||||
| 			padding: 10px; | ||||
|  | ||||
| 			.post-signature { | ||||
| @@ -64,6 +64,8 @@ | ||||
| 		} | ||||
|  | ||||
| 		.post-block { | ||||
| 			border-radius: 5px; | ||||
|  | ||||
| 			.topic-buttons { | ||||
| 				background: rgba(0, 0, 0, 0.02); | ||||
| 				border: 1px solid rgba(0, 0, 0, 0.06); | ||||
|   | ||||
| @@ -106,4 +106,3 @@ var	RDB = require('../redis'), | ||||
| 	}; | ||||
|  | ||||
| }(exports)); | ||||
|  | ||||
|   | ||||
| @@ -312,7 +312,9 @@ var	RDB = require('./redis.js'), | ||||
|  | ||||
| 	Categories.getCategories = function(cids, callback, current_user) { | ||||
| 		if (!cids || !Array.isArray(cids) || cids.length === 0) { | ||||
| 			callback({'categories' : []}); | ||||
| 			callback({ | ||||
| 				'categories': [] | ||||
| 			}); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| @@ -342,7 +344,9 @@ var	RDB = require('./redis.js'), | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			callback({'categories': categories}); | ||||
| 			callback({ | ||||
| 				'categories': categories | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 	}; | ||||
|   | ||||
| @@ -32,7 +32,10 @@ var	RDB = require('./redis.js'), | ||||
| 					} | ||||
|  | ||||
| 					if (room_id) { | ||||
| 						io.sockets.in(room_id).emit('event:rep_up', {uid: uid !== postData.uid ? postData.uid : 0, pid: pid}); | ||||
| 						io.sockets. in (room_id).emit('event:rep_up', { | ||||
| 							uid: uid !== postData.uid ? postData.uid : 0, | ||||
| 							pid: pid | ||||
| 						}); | ||||
| 					} | ||||
|  | ||||
| 					socket.emit('api:posts.favourite', { | ||||
| @@ -71,7 +74,10 @@ var	RDB = require('./redis.js'), | ||||
| 					} | ||||
|  | ||||
| 					if (room_id) { | ||||
| 						io.sockets.in(room_id).emit('event:rep_down', {uid: uid !== uid_of_poster ? uid_of_poster : 0, pid: pid}); | ||||
| 						io.sockets. in (room_id).emit('event:rep_down', { | ||||
| 							uid: uid !== uid_of_poster ? uid_of_poster : 0, | ||||
| 							pid: pid | ||||
| 						}); | ||||
| 					} | ||||
|  | ||||
| 					socket.emit('api:posts.unfavourite', { | ||||
|   | ||||
| @@ -1,5 +1,3 @@ | ||||
|  | ||||
|  | ||||
| var request = require('request'); | ||||
|  | ||||
|  | ||||
| @@ -22,7 +20,10 @@ var request = require('request'); | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
| 		var upload = post.form({type:type, image:image}); | ||||
| 		var upload = post.form({ | ||||
| 			type: type, | ||||
| 			image: image | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	imgur.setClientID = function(id) { | ||||
| @@ -30,4 +31,3 @@ var request = require('request'); | ||||
| 	} | ||||
|  | ||||
| }(exports)); | ||||
|  | ||||
|   | ||||
| @@ -8,46 +8,38 @@ var	async = require('async'), | ||||
| 	reds = require('reds'), | ||||
|  | ||||
| 	install = { | ||||
| 		questions: [ | ||||
| 			{ | ||||
| 		questions: [{ | ||||
| 			name: 'base_url', | ||||
| 			description: 'URL of this installation', | ||||
| 			'default': 'http://localhost', | ||||
| 			pattern: /^http(?:s)?:\/\//, | ||||
| 			message: 'Base URL must begin with \'http://\' or \'https://\'', | ||||
| 			}, | ||||
| 			{ | ||||
| 		}, { | ||||
| 			name: 'port', | ||||
| 			description: 'Port number of your NodeBB', | ||||
| 			'default': 4567 | ||||
| 			}, | ||||
| 			{ | ||||
| 		}, { | ||||
| 			name: 'use_port', | ||||
| 			description: 'Use a port number to access NodeBB?', | ||||
| 			'default': 'y', | ||||
| 			pattern: /y[es]*|n[o]?/, | ||||
| 			message: 'Please enter \'yes\' or \'no\'', | ||||
| 			}, | ||||
| 			{ | ||||
| 		}, { | ||||
| 			name: 'secret', | ||||
| 			description: 'Please enter a NodeBB secret', | ||||
| 			'default': utils.generateUUID() | ||||
| 			}, | ||||
| 			{ | ||||
| 		}, { | ||||
| 			name: 'redis:host', | ||||
| 			description: 'Host IP or address of your Redis instance', | ||||
| 			'default': '127.0.0.1' | ||||
| 			}, | ||||
| 			{ | ||||
| 		}, { | ||||
| 			name: 'redis:port', | ||||
| 			description: 'Host port of your Redis instance', | ||||
| 			'default': 6379 | ||||
| 			}, | ||||
| 			{ | ||||
| 		}, { | ||||
| 			name: 'redis:password', | ||||
| 			description: 'Password of your Redis database' | ||||
| 			} | ||||
| 		], | ||||
| 		}], | ||||
| 		setup: function(callback) { | ||||
| 			async.series([ | ||||
| 				function(next) { | ||||
| @@ -97,15 +89,28 @@ var	async = require('async'), | ||||
| 					// Applying default database configs | ||||
| 					winston.info('Populating database with default configs, if not already set...') | ||||
| 					var meta = require('./meta'), | ||||
| 						defaults = [ | ||||
| 							{ field: 'postDelay', value: 10000 }, | ||||
| 							{ field: 'minimumPostLength', value: 8 }, | ||||
| 							{ field: 'minimumTitleLength', value: 3 }, | ||||
| 							{ field: 'minimumUsernameLength', value: 2 }, | ||||
| 							{ field: 'maximumUsernameLength', value: 16 }, | ||||
| 							{ field: 'minimumPasswordLength', value: 6 }, | ||||
| 							{ field: 'imgurClientID', value: '' } | ||||
| 						]; | ||||
| 						defaults = [{ | ||||
| 							field: 'postDelay', | ||||
| 							value: 10000 | ||||
| 						}, { | ||||
| 							field: 'minimumPostLength', | ||||
| 							value: 8 | ||||
| 						}, { | ||||
| 							field: 'minimumTitleLength', | ||||
| 							value: 3 | ||||
| 						}, { | ||||
| 							field: 'minimumUsernameLength', | ||||
| 							value: 2 | ||||
| 						}, { | ||||
| 							field: 'maximumUsernameLength', | ||||
| 							value: 16 | ||||
| 						}, { | ||||
| 							field: 'minimumPasswordLength', | ||||
| 							value: 6 | ||||
| 						}, { | ||||
| 							field: 'imgurClientID', | ||||
| 							value: '' | ||||
| 						}]; | ||||
|  | ||||
| 					async.each(defaults, function(configObj, next) { | ||||
| 						meta.configs.setOnEmpty(configObj.field, configObj.value, next); | ||||
| @@ -189,27 +194,23 @@ var	async = require('async'), | ||||
| 				Groups = require('./groups'); | ||||
|  | ||||
| 			winston.warn('No administrators have been detected, running initial user setup'); | ||||
| 			var	questions = [ | ||||
| 					{ | ||||
| 			var questions = [{ | ||||
| 				name: 'username', | ||||
| 				description: 'Administrator username', | ||||
| 				required: true, | ||||
| 				type: 'string' | ||||
| 					}, | ||||
| 					{ | ||||
| 			}, { | ||||
| 				name: 'email', | ||||
| 				description: 'Administrator email address', | ||||
| 				pattern: /.+@.+/, | ||||
| 				required: true | ||||
| 					}, | ||||
| 					{ | ||||
| 			}, { | ||||
| 				name: 'password', | ||||
| 				description: 'Password', | ||||
| 				required: true, | ||||
| 				hidden: true, | ||||
| 				type: 'string' | ||||
| 					} | ||||
| 				], | ||||
| 			}], | ||||
| 				getAdminInfo = function(callback) { | ||||
| 					prompt.get(questions, function(err, results) { | ||||
| 						if (!results) return callback(new Error('aborted')); | ||||
| @@ -251,7 +252,9 @@ var	async = require('async'), | ||||
| 			], function(err) { | ||||
| 				winston.info('Configuration Saved OK'); | ||||
|  | ||||
| 				nconf.file({ file: path.join(__dirname, '..', 'config.json') }); | ||||
| 				nconf.file({ | ||||
| 					file: path.join(__dirname, '..', 'config.json') | ||||
| 				}); | ||||
|  | ||||
| 				var RDB = require('./redis'); | ||||
| 				reds.createClient = function() { | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
|  | ||||
| var user = require('./user.js'), | ||||
| 	bcrypt = require('bcrypt'), | ||||
| 	RDB = require('./redis.js'), | ||||
| @@ -41,7 +40,11 @@ var user = require('./user.js'), | ||||
| 						} | ||||
|  | ||||
| 						if (res) { | ||||
| 							next(null, { user: { uid: uid } }); | ||||
| 							next(null, { | ||||
| 								user: { | ||||
| 									uid: uid | ||||
| 								} | ||||
| 							}); | ||||
| 						} else { | ||||
| 							next(new Error('invalid-password')); | ||||
| 						} | ||||
| @@ -158,4 +161,3 @@ var user = require('./user.js'), | ||||
| 	} | ||||
|  | ||||
| }(exports)); | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
|  | ||||
| var RDB = require('./redis'), | ||||
| 	async = require('async'); | ||||
|  | ||||
|   | ||||
| @@ -130,4 +130,3 @@ var utils = require('./../public/src/utils.js'), | ||||
|  | ||||
|  | ||||
| }(exports)); | ||||
|  | ||||
|   | ||||
| @@ -56,6 +56,7 @@ var	RDB = require('./redis.js'), | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	PostTools.edit = function(uid, pid, title, content) { | ||||
| 		var	success = function() { | ||||
| 			posts.setPostField(pid, 'content', content); | ||||
| @@ -77,7 +78,10 @@ var	RDB = require('./redis.js'), | ||||
| 								}); | ||||
| 							} | ||||
|  | ||||
| 							next(null, {tid:tid, isMainPost:isMainPost}); | ||||
| 							next(null, { | ||||
| 								tid: tid, | ||||
| 								isMainPost: isMainPost | ||||
| 							}); | ||||
| 						}); | ||||
| 					}); | ||||
| 				}, | ||||
| @@ -85,12 +89,12 @@ var	RDB = require('./redis.js'), | ||||
| 					PostTools.toHTML(content, next); | ||||
| 				} | ||||
| 			], function(err, results) { | ||||
| 				console.log("TEEEST"); | ||||
| 				io.sockets.in('topic_' + results[0].tid).emit('event:post_edited', { | ||||
| 					pid: pid, | ||||
| 					title: title, | ||||
| 					isMainPost: results[0].isMainPost, | ||||
| 					content: results[1] | ||||
|  | ||||
| 				}); | ||||
| 			}); | ||||
| 		}; | ||||
|   | ||||
							
								
								
									
										16
									
								
								src/posts.js
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								src/posts.js
									
									
									
									
									
								
							| @@ -124,8 +124,7 @@ var	RDB = require('./redis.js'), | ||||
| 				plugins.fireHook('filter:post.get', data, function(data) { | ||||
| 					callback(data); | ||||
| 				}); | ||||
| 			} | ||||
| 			else | ||||
| 			} else | ||||
| 				console.log(err); | ||||
| 		}); | ||||
| 	} | ||||
| @@ -134,8 +133,7 @@ var	RDB = require('./redis.js'), | ||||
| 		RDB.hmgetObject('post:' + pid, fields, function(err, data) { | ||||
| 			if (err === null) { | ||||
| 				callback(data); | ||||
| 			} | ||||
| 			else { | ||||
| 			} else { | ||||
| 				console.log(err); | ||||
| 			} | ||||
| 		}); | ||||
| @@ -245,7 +243,9 @@ var	RDB = require('./redis.js'), | ||||
| 					threadTools.notify_followers(tid, uid); | ||||
|  | ||||
| 					Posts.addUserInfoToPost(postData, function() { | ||||
| 						var	socketData = { posts: [postData] }; | ||||
| 						var socketData = { | ||||
| 							posts: [postData] | ||||
| 						}; | ||||
| 						io.sockets. in ('topic_' + tid).emit('event:new_post', socketData); | ||||
| 						io.sockets. in ('recent_posts').emit('event:new_post', socketData); | ||||
| 						io.sockets. in ('users/' + uid).emit('event:new_post', socketData); | ||||
| @@ -374,8 +374,7 @@ var	RDB = require('./redis.js'), | ||||
| 				Posts.getPostsByPids(pids, function(err, posts) { | ||||
| 					callback(posts); | ||||
| 				}); | ||||
| 			} | ||||
| 			else | ||||
| 			} else | ||||
| 				callback([]); | ||||
| 		}); | ||||
| 	} | ||||
| @@ -389,8 +388,7 @@ var	RDB = require('./redis.js'), | ||||
| 				}; | ||||
|  | ||||
| 				socket.emit('post.stats', stats); | ||||
| 			} | ||||
| 			else | ||||
| 			} else | ||||
| 				console.log(err); | ||||
| 		}); | ||||
| 	} | ||||
|   | ||||
| @@ -45,8 +45,7 @@ | ||||
| 				} | ||||
|  | ||||
| 				callback(null, returnData); | ||||
| 			} | ||||
| 			else { | ||||
| 			} else { | ||||
| 				console.log(err); | ||||
| 				callback(err, null); | ||||
| 			} | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
|  | ||||
| var user = require('./../user.js'), | ||||
| 	Groups = require('../groups'), | ||||
| 	topics = require('./../topics.js'), | ||||
| @@ -62,34 +61,59 @@ var user = require('./../user.js'), | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/api/admin/index', function(req, res) { | ||||
| 			res.json({version:pkg.version}); | ||||
| 			res.json({ | ||||
| 				version: pkg.version | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/api/admin/users/search', function(req, res) { | ||||
| 			res.json({search_display: 'block', loadmore_display:'none', users: []}); | ||||
| 			res.json({ | ||||
| 				search_display: 'block', | ||||
| 				loadmore_display: 'none', | ||||
| 				users: [] | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/api/admin/users/latest', function(req, res) { | ||||
| 			user.getUsers('users:joindate', 0, 49, function(err, data) { | ||||
| 				res.json({ search_display: 'none', loadmore_display:'block', users:data, yourid:req.user.uid }); | ||||
| 				res.json({ | ||||
| 					search_display: 'none', | ||||
| 					loadmore_display: 'block', | ||||
| 					users: data, | ||||
| 					yourid: req.user.uid | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/api/admin/users/sort-posts', function(req, res) { | ||||
| 			user.getUsers('users:postcount', 0, 49, function(err, data) { | ||||
| 				res.json({ search_display: 'none', loadmore_display:'block', users:data, yourid:req.user.uid }); | ||||
| 				res.json({ | ||||
| 					search_display: 'none', | ||||
| 					loadmore_display: 'block', | ||||
| 					users: data, | ||||
| 					yourid: req.user.uid | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/api/admin/users/sort-reputation', function(req, res) { | ||||
| 			user.getUsers('users:reputation', 0, 49, function(err, data) { | ||||
| 				res.json({ search_display: 'none', loadmore_display:'block', users:data, yourid:req.user.uid }); | ||||
| 				res.json({ | ||||
| 					search_display: 'none', | ||||
| 					loadmore_display: 'block', | ||||
| 					users: data, | ||||
| 					yourid: req.user.uid | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/api/admin/users', function(req, res) { | ||||
| 			user.getUsers('users:joindate', 0, 49, function(err, data) { | ||||
| 				res.json({ search_display: 'none', users:data, yourid:req.user.uid }); | ||||
| 				res.json({ | ||||
| 					search_display: 'none', | ||||
| 					users: data, | ||||
| 					yourid: req.user.uid | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
|   | ||||
| @@ -247,7 +247,9 @@ var user = require('./../user.js'), | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/api/reset/:code', function(req, res) { | ||||
| 			res.json({ reset_code: req.params.code }); | ||||
| 			res.json({ | ||||
| 				reset_code: req.params.code | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/api/404', function(req, res) { | ||||
|   | ||||
| @@ -25,7 +25,9 @@ | ||||
| 			callbackURL: nconf.get('url') + 'auth/twitter/callback' | ||||
| 		}, function(token, tokenSecret, profile, done) { | ||||
| 			login_module.loginViaTwitter(profile.id, profile.username, profile.photos, function(err, user) { | ||||
| 				if (err) { return done(err); } | ||||
| 				if (err) { | ||||
| 					return done(err); | ||||
| 				} | ||||
| 				done(null, user); | ||||
| 			}); | ||||
| 		})); | ||||
| @@ -40,7 +42,9 @@ | ||||
| 			callbackURL: nconf.get('url') + 'auth/google/callback' | ||||
| 		}, function(accessToken, refreshToken, profile, done) { | ||||
| 			login_module.loginViaGoogle(profile.id, profile.displayName, profile.emails[0].value, function(err, user) { | ||||
| 				if (err) { return done(err); } | ||||
| 				if (err) { | ||||
| 					return done(err); | ||||
| 				} | ||||
| 				done(null, user); | ||||
| 			}); | ||||
| 		})); | ||||
| @@ -55,7 +59,9 @@ | ||||
| 			callbackURL: nconf.get('url') + 'auth/facebook/callback' | ||||
| 		}, function(accessToken, refreshToken, profile, done) { | ||||
| 			login_module.loginViaFacebook(profile.id, profile.displayName, profile.emails[0].value, function(err, user) { | ||||
| 				if (err) { return done(err); } | ||||
| 				if (err) { | ||||
| 					return done(err); | ||||
| 				} | ||||
| 				done(null, user); | ||||
| 			}); | ||||
| 		})); | ||||
| @@ -90,7 +96,10 @@ | ||||
| 				winston.info('[Auth] Session ' + req.sessionID + ' logout (uid: ' + req.user.uid + ')'); | ||||
| 				login_module.logout(req.sessionID, function(logout) { | ||||
| 					req.logout(); | ||||
| 					app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 					app.build_header({ | ||||
| 						req: req, | ||||
| 						res: res | ||||
| 					}, function(err, header) { | ||||
| 						res.send(header + templates['logout'] + templates['footer']); | ||||
| 					}); | ||||
| 				}); | ||||
| @@ -107,7 +116,9 @@ | ||||
| 		} | ||||
|  | ||||
| 		if (login_strategies.indexOf('google') !== -1) { | ||||
| 			app.get('/auth/google', passport.authenticate('google', { scope: 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email' })); | ||||
| 			app.get('/auth/google', passport.authenticate('google', { | ||||
| 				scope: 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email' | ||||
| 			})); | ||||
|  | ||||
| 			app.get('/auth/google/callback', passport.authenticate('google', { | ||||
| 				successRedirect: '/', | ||||
| @@ -116,7 +127,9 @@ | ||||
| 		} | ||||
|  | ||||
| 		if (login_strategies.indexOf('facebook') !== -1) { | ||||
| 			app.get('/auth/facebook', passport.authenticate('facebook', { scope: 'email' })); | ||||
| 			app.get('/auth/facebook', passport.authenticate('facebook', { | ||||
| 				scope: 'email' | ||||
| 			})); | ||||
|  | ||||
| 			app.get('/auth/facebook/callback', passport.authenticate('facebook', { | ||||
| 				successRedirect: '/', | ||||
| @@ -127,13 +140,19 @@ | ||||
|  | ||||
|  | ||||
| 		app.get('/reset/:code', function(req, res) { | ||||
| 			app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 			app.build_header({ | ||||
| 				req: req, | ||||
| 				res: res | ||||
| 			}, function(err, header) { | ||||
| 				res.send(header + app.create_route('reset/' + req.params.code) + templates['footer']); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/reset', function(req, res) { | ||||
| 			app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 			app.build_header({ | ||||
| 				req: req, | ||||
| 				res: res | ||||
| 			}, function(err, header) { | ||||
| 				res.send(header + app.create_route('reset') + templates['footer']); | ||||
| 			}); | ||||
| 		}); | ||||
| @@ -144,12 +163,18 @@ | ||||
| 					return next(err); | ||||
| 				} | ||||
| 				if (!user) { | ||||
| 					return res.send({ success : false, message : info.message }); | ||||
| 					return res.send({ | ||||
| 						success: false, | ||||
| 						message: info.message | ||||
| 					}); | ||||
| 				} | ||||
| 				req.login({ | ||||
| 					uid: user.uid | ||||
| 				}, function() { | ||||
| 					res.send({ success : true, message : 'authentication succeeded' }); | ||||
| 					res.send({ | ||||
| 						success: true, | ||||
| 						message: 'authentication succeeded' | ||||
| 					}); | ||||
| 				}); | ||||
| 			})(req, res, next); | ||||
| 		}); | ||||
|   | ||||
| @@ -1,5 +1,3 @@ | ||||
|  | ||||
|  | ||||
| (function(TestBed) { | ||||
| 	TestBed.create_routes = function(app) { | ||||
|  | ||||
|   | ||||
| @@ -18,38 +18,55 @@ var user = require('./../user.js'), | ||||
| 				if (data) { | ||||
| 					res.send(data); | ||||
| 				} else { | ||||
| 					res.json(404, {error:"User doesn't exist!"}); | ||||
| 					res.json(404, { | ||||
| 						error: "User doesn't exist!" | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
|  | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/users', function(req, res) { | ||||
| 			app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 			app.build_header({ | ||||
| 				req: req, | ||||
| 				res: res | ||||
| 			}, function(err, header) { | ||||
| 				res.send(header + app.create_route("users", "users") + templates['footer']); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/users-latest', function(req, res) { | ||||
| 			app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 			app.build_header({ | ||||
| 				req: req, | ||||
| 				res: res | ||||
| 			}, function(err, header) { | ||||
| 				res.send(header + app.create_route("users-latest", "users") + templates['footer']); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/users-sort-posts', function(req, res) { | ||||
| 			app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 			app.build_header({ | ||||
| 				req: req, | ||||
| 				res: res | ||||
| 			}, function(err, header) { | ||||
| 				res.send(header + app.create_route("users-sort-posts", "users") + templates['footer']); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/users-sort-reputation', function(req, res) { | ||||
| 			app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 			app.build_header({ | ||||
| 				req: req, | ||||
| 				res: res | ||||
| 			}, function(err, header) { | ||||
| 				res.send(header + app.create_route("users-sort-reputation", "users") + templates['footer']); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/users-search', function(req, res) { | ||||
| 			app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 			app.build_header({ | ||||
| 				req: req, | ||||
| 				res: res | ||||
| 			}, function(err, header) { | ||||
| 				res.send(header + app.create_route("users-search", "users") + templates['footer']); | ||||
| 			}); | ||||
| 		}); | ||||
| @@ -66,7 +83,10 @@ var user = require('./../user.js'), | ||||
| 					return next(); | ||||
| 				} | ||||
|  | ||||
| 				app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 				app.build_header({ | ||||
| 					req: req, | ||||
| 					res: res | ||||
| 				}, function(err, header) { | ||||
| 					res.send(header + app.create_route('users/' + req.params.userslug, 'account') + templates['footer']); | ||||
| 				}); | ||||
|  | ||||
| @@ -80,7 +100,10 @@ var user = require('./../user.js'), | ||||
|  | ||||
| 			user.getUserField(req.user.uid, 'userslug', function(err, userslug) { | ||||
| 				if (req.params.userslug && userslug === req.params.userslug) { | ||||
| 					app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 					app.build_header({ | ||||
| 						req: req, | ||||
| 						res: res | ||||
| 					}, function(err, header) { | ||||
| 						res.send(header + app.create_route('users/' + req.params.userslug + '/edit', 'accountedit') + templates['footer']); | ||||
| 					}); | ||||
| 				} else { | ||||
| @@ -96,7 +119,10 @@ var user = require('./../user.js'), | ||||
|  | ||||
| 			user.getUserField(req.user.uid, 'userslug', function(err, userslug) { | ||||
| 				if (req.params.userslug && userslug === req.params.userslug) { | ||||
| 					app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 					app.build_header({ | ||||
| 						req: req, | ||||
| 						res: res | ||||
| 					}, function(err, header) { | ||||
| 						res.send(header + app.create_route('users/' + req.params.userslug + '/settings', 'accountsettings') + templates['footer']); | ||||
| 					}) | ||||
| 				} else { | ||||
| @@ -177,7 +203,9 @@ var user = require('./../user.js'), | ||||
| 						winston.err(err); | ||||
| 					} | ||||
|  | ||||
| 					res.json({ path: imageUrl }); | ||||
| 					res.json({ | ||||
| 						path: imageUrl | ||||
| 					}); | ||||
| 				}); | ||||
| 			}); | ||||
|  | ||||
| @@ -200,7 +228,10 @@ var user = require('./../user.js'), | ||||
| 					return; | ||||
| 				} | ||||
|  | ||||
| 				app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 				app.build_header({ | ||||
| 					req: req, | ||||
| 					res: res | ||||
| 				}, function(err, header) { | ||||
| 					res.send(header + app.create_route('users/' + req.params.userslug + '/following', 'following') + templates['footer']); | ||||
| 				}); | ||||
| 			}); | ||||
| @@ -216,7 +247,10 @@ var user = require('./../user.js'), | ||||
| 					res.redirect('/404'); | ||||
| 					return; | ||||
| 				} | ||||
| 				app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 				app.build_header({ | ||||
| 					req: req, | ||||
| 					res: res | ||||
| 				}, function(err, header) { | ||||
| 					res.send(header + app.create_route('users/' + req.params.userslug + '/followers', 'followers') + templates['footer']); | ||||
| 				}); | ||||
| 			}); | ||||
| @@ -232,7 +266,10 @@ var user = require('./../user.js'), | ||||
| 					res.redirect('/404'); | ||||
| 					return; | ||||
| 				} | ||||
| 				app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 				app.build_header({ | ||||
| 					req: req, | ||||
| 					res: res | ||||
| 				}, function(err, header) { | ||||
| 					res.send(header + app.create_route('users/' + req.params.userslug + '/favourites', 'favourites') + templates['footer']); | ||||
| 				}); | ||||
| 			}); | ||||
| @@ -250,7 +287,9 @@ var user = require('./../user.js'), | ||||
| 					}); | ||||
|  | ||||
| 				} else { | ||||
| 					res.json(404, { error: 'User not found!' })	; | ||||
| 					res.json(404, { | ||||
| 						error: 'User not found!' | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
| 		}); | ||||
| @@ -266,7 +305,9 @@ var user = require('./../user.js'), | ||||
| 						res.json(userData); | ||||
| 					}); | ||||
| 				} else { | ||||
| 					res.json(404, { error: 'User not found!' })	; | ||||
| 					res.json(404, { | ||||
| 						error: 'User not found!' | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
| 		}); | ||||
| @@ -284,12 +325,16 @@ var user = require('./../user.js'), | ||||
|  | ||||
| 			user.get_uid_by_userslug(req.params.userslug, function(err, uid) { | ||||
| 				if (!uid) { | ||||
| 					res.json(404, { error: 'User not found!' })	; | ||||
| 					res.json(404, { | ||||
| 						error: 'User not found!' | ||||
| 					}); | ||||
| 					return; | ||||
| 				} | ||||
|  | ||||
| 				if (uid !== callerUID || callerUID === "0") { | ||||
| 					res.json(403, { error: 'Not allowed!' }); | ||||
| 					res.json(403, { | ||||
| 						error: 'Not allowed!' | ||||
| 					}); | ||||
| 					return; | ||||
| 				} | ||||
| 				user.getUserFields(uid, ['username', 'userslug', 'showemail'], function(err, userData) { | ||||
| @@ -303,7 +348,9 @@ var user = require('./../user.js'), | ||||
| 							userData.showemail = ""; | ||||
| 						res.json(userData); | ||||
| 					} else { | ||||
| 						res.json(404, { error: 'User not found!' })	; | ||||
| 						res.json(404, { | ||||
| 							error: 'User not found!' | ||||
| 						}); | ||||
| 					} | ||||
| 				}); | ||||
| 			}); | ||||
| @@ -314,12 +361,16 @@ var user = require('./../user.js'), | ||||
|  | ||||
| 			user.get_uid_by_userslug(req.params.userslug, function(err, uid) { | ||||
| 				if (!uid) { | ||||
| 					res.json(404, { error: 'User not found!' })	; | ||||
| 					res.json(404, { | ||||
| 						error: 'User not found!' | ||||
| 					}); | ||||
| 					return; | ||||
| 				} | ||||
|  | ||||
| 				if (uid !== callerUID || callerUID === "0") { | ||||
| 					res.json(403, { error: 'Not allowed!' }); | ||||
| 					res.json(403, { | ||||
| 						error: 'Not allowed!' | ||||
| 					}); | ||||
| 					return; | ||||
| 				} | ||||
|  | ||||
| @@ -336,7 +387,9 @@ var user = require('./../user.js'), | ||||
| 							res.json(userData); | ||||
| 						}); | ||||
| 					} else { | ||||
| 						res.json(404, { error: 'User not found!' })	; | ||||
| 						res.json(404, { | ||||
| 							error: 'User not found!' | ||||
| 						}); | ||||
| 					} | ||||
| 				}); | ||||
| 			}); | ||||
| @@ -350,7 +403,9 @@ var user = require('./../user.js'), | ||||
| 					user.isFollowing(callerUID, userData.theirid, function(isFollowing) { | ||||
| 						posts.getPostsByUid(userData.theirid, 0, 9, function(posts) { | ||||
|  | ||||
| 							userData.posts = posts.filter(function(p) {return p.deleted !== "1";}); | ||||
| 							userData.posts = posts.filter(function(p) { | ||||
| 								return p.deleted !== "1"; | ||||
| 							}); | ||||
| 							userData.isFollowing = isFollowing; | ||||
| 							if (!userData.profileviews) | ||||
| 								userData.profileviews = 1; | ||||
| @@ -364,7 +419,9 @@ var user = require('./../user.js'), | ||||
| 						}); | ||||
| 					}); | ||||
| 				} else { | ||||
| 					res.json(404, { error: 'User not found!' })	; | ||||
| 					res.json(404, { | ||||
| 						error: 'User not found!' | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
| 		}); | ||||
| @@ -378,24 +435,40 @@ var user = require('./../user.js'), | ||||
|  | ||||
| 		function getUsersSortedByJoinDate(req, res) { | ||||
| 			user.getUsers('users:joindate', 0, 49, function(err, data) { | ||||
| 				res.json({ search_display: 'none', loadmore_display:'block', users:data }); | ||||
| 				res.json({ | ||||
| 					search_display: 'none', | ||||
| 					loadmore_display: 'block', | ||||
| 					users: data | ||||
| 				}); | ||||
| 			}); | ||||
| 		} | ||||
|  | ||||
| 		function getUsersSortedByPosts(req, res) { | ||||
| 			user.getUsers('users:postcount', 0, 49, function(err, data) { | ||||
| 				res.json({ search_display: 'none', loadmore_display:'block', users:data }); | ||||
| 				res.json({ | ||||
| 					search_display: 'none', | ||||
| 					loadmore_display: 'block', | ||||
| 					users: data | ||||
| 				}); | ||||
| 			}); | ||||
| 		} | ||||
|  | ||||
| 		function getUsersSortedByReputation(req, res) { | ||||
| 			user.getUsers('users:reputation', 0, 49, function(err, data) { | ||||
| 				res.json({ search_display: 'none', loadmore_display:'block', users:data }); | ||||
| 				res.json({ | ||||
| 					search_display: 'none', | ||||
| 					loadmore_display: 'block', | ||||
| 					users: data | ||||
| 				}); | ||||
| 			}); | ||||
| 		} | ||||
|  | ||||
| 		function getUsersForSearch(req, res) { | ||||
| 			res.json({ search_display: 'block', loadmore_display:'none', users: [] }); | ||||
| 			res.json({ | ||||
| 				search_display: 'block', | ||||
| 				loadmore_display: 'none', | ||||
| 				users: [] | ||||
| 			}); | ||||
| 		} | ||||
|  | ||||
| 		function getUserDataByUserSlug(userslug, callerUID, callback) { | ||||
|   | ||||
| @@ -6,11 +6,19 @@ var	path = require('path'), | ||||
| 	topics = require('./topics'), | ||||
| 	sitemap = { | ||||
| 		getStaticUrls: function(callback) { | ||||
| 			callback(null, [ | ||||
| 				{ url: '', changefreq: 'weekly', priority: '0.6' }, | ||||
| 				{ url: 'recent', changefreq: 'daily', priority: '0.4' }, | ||||
| 				{ url: 'users', changefreq: 'daily', priority: '0.4' } | ||||
| 			]); | ||||
| 			callback(null, [{ | ||||
| 				url: '', | ||||
| 				changefreq: 'weekly', | ||||
| 				priority: '0.6' | ||||
| 			}, { | ||||
| 				url: 'recent', | ||||
| 				changefreq: 'daily', | ||||
| 				priority: '0.4' | ||||
| 			}, { | ||||
| 				url: 'users', | ||||
| 				changefreq: 'daily', | ||||
| 				priority: '0.4' | ||||
| 			}]); | ||||
| 		}, | ||||
| 		getDynamicUrls: function(callback) { | ||||
| 			var returnUrls = []; | ||||
|   | ||||
| @@ -240,7 +240,9 @@ var	RDB = require('./redis.js'), | ||||
| 								status: 'ok', | ||||
| 								follow: true | ||||
| 							}); | ||||
| 						} else callback({ status: 'error' }); | ||||
| 						} else callback({ | ||||
| 							status: 'error' | ||||
| 						}); | ||||
| 					} | ||||
| 				}); | ||||
| 			} else { | ||||
| @@ -251,7 +253,9 @@ var	RDB = require('./redis.js'), | ||||
| 								status: 'ok', | ||||
| 								follow: false | ||||
| 							}); | ||||
| 						} else callback({ status: 'error' }); | ||||
| 						} else callback({ | ||||
| 							status: 'error' | ||||
| 						}); | ||||
| 					} | ||||
| 				}); | ||||
| 			} | ||||
|   | ||||
| @@ -129,7 +129,9 @@ var	RDB = require('./redis.js') | ||||
| 			done = false; | ||||
|  | ||||
| 		async.whilst( | ||||
| 			function () { return unreadTids.length < 21 && !done; }, | ||||
| 			function() { | ||||
| 				return unreadTids.length < 21 && !done; | ||||
| 			}, | ||||
| 			function(callback) { | ||||
| 				RDB.zrevrange('topics:recent', start, stop, function(err, tids) { | ||||
|  | ||||
| @@ -197,7 +199,9 @@ var	RDB = require('./redis.js') | ||||
| 			done = false; | ||||
|  | ||||
| 		async.whilst( | ||||
| 			function () { return unreadTids.length < 20 && !done; }, | ||||
| 			function() { | ||||
| 				return unreadTids.length < 20 && !done; | ||||
| 			}, | ||||
| 			function(callback) { | ||||
| 				RDB.zrevrange('topics:recent', start, stop, function(err, tids) { | ||||
| 					if (err) | ||||
| @@ -266,6 +270,7 @@ var	RDB = require('./redis.js') | ||||
| 			} | ||||
|  | ||||
| 			// temporary. I don't think this call should belong here | ||||
|  | ||||
| 			function getPrivileges(next) { | ||||
| 				categories.privileges(category_id, current_user, function(user_privs) { | ||||
| 					next(null, user_privs); | ||||
| @@ -438,7 +443,9 @@ var	RDB = require('./redis.js') | ||||
| 				numTids, x; | ||||
|  | ||||
| 			// Sort into ascending order | ||||
| 			tids.sort(function(a, b) { return a - b; }); | ||||
| 			tids.sort(function(a, b) { | ||||
| 				return a - b; | ||||
| 			}); | ||||
|  | ||||
| 			// Eliminate everything after the "after" tid | ||||
| 			if (after) { | ||||
| @@ -457,7 +464,9 @@ var	RDB = require('./redis.js') | ||||
| 			} | ||||
|  | ||||
| 			// Sort into descending order | ||||
| 			tids.sort(function(a, b) { return b - a; }); | ||||
| 			tids.sort(function(a, b) { | ||||
| 				return b - a; | ||||
| 			}); | ||||
|  | ||||
| 			async.each(tids, function(tid, next) { | ||||
| 				Topics.getTopicDataWithUsername(tid, function(topicData) { | ||||
| @@ -688,7 +697,9 @@ var	RDB = require('./redis.js') | ||||
| 						Topics.getTopicForCategoryView(tid, uid, function(topicData) { | ||||
| 							io.sockets. in ('category_' + category_id).emit('event:new_topic', topicData); | ||||
| 							io.sockets. in ('recent_posts').emit('event:new_topic', topicData); | ||||
| 							io.sockets.in('users/' + uid).emit('event:new_post', {posts:postData}); | ||||
| 							io.sockets. in ('users/' + uid).emit('event:new_post', { | ||||
| 								posts: postData | ||||
| 							}); | ||||
| 						}); | ||||
|  | ||||
| 						callback(null, postData); | ||||
|   | ||||
| @@ -24,8 +24,7 @@ function upgradeCategory(cid, callback) { | ||||
| 					if (!err) { | ||||
| 						RDB.rename('temp_categories:' + cid + ':tid', 'categories:' + cid + ':tid'); | ||||
| 						callback(null); | ||||
| 					} | ||||
| 					else | ||||
| 					} else | ||||
| 						callback(err); | ||||
| 				}); | ||||
|  | ||||
|   | ||||
							
								
								
									
										94
									
								
								src/user.js
									
									
									
									
									
								
							
							
						
						
									
										94
									
								
								src/user.js
									
									
									
									
									
								
							| @@ -87,7 +87,9 @@ var utils = require('./../public/src/utils.js'), | ||||
| 				RDB.incr('usercount', function(err, count) { | ||||
| 					RDB.handle(err); | ||||
|  | ||||
| 					if (typeof io !== 'undefined') io.sockets.emit('user.count', {count: count}); | ||||
| 					if (typeof io !== 'undefined') io.sockets.emit('user.count', { | ||||
| 						count: count | ||||
| 					}); | ||||
| 				}); | ||||
|  | ||||
| 				RDB.zadd('users:joindate', timestamp, uid); | ||||
| @@ -96,7 +98,10 @@ var utils = require('./../public/src/utils.js'), | ||||
|  | ||||
| 				userSearch.index(username, uid); | ||||
|  | ||||
| 				if (typeof io !== 'undefined') io.sockets.emit('user.latest', {userslug: userslug, username: username}); | ||||
| 				if (typeof io !== 'undefined') io.sockets.emit('user.latest', { | ||||
| 					userslug: userslug, | ||||
| 					username: username | ||||
| 				}); | ||||
|  | ||||
| 				if (password !== undefined) { | ||||
| 					User.hashPassword(password, function(err, hash) { | ||||
| @@ -195,11 +200,15 @@ var utils = require('./../public/src/utils.js'), | ||||
| 	User.updateProfile = function(uid, data, callback) { | ||||
|  | ||||
| 		var fields = ['email', 'fullname', 'website', 'location', 'birthday', 'signature']; | ||||
| 		var returnData = {success:false}; | ||||
| 		var returnData = { | ||||
| 			success: false | ||||
| 		}; | ||||
|  | ||||
| 		function isSignatureValid(next) { | ||||
| 			if (data['signature'] !== undefined && data['signature'].length > 150) { | ||||
| 				next({error:'Signature can\'t be longer than 150 characters!'}, false); | ||||
| 				next({ | ||||
| 					error: 'Signature can\'t be longer than 150 characters!' | ||||
| 				}, false); | ||||
| 			} else { | ||||
| 				next(null, true); | ||||
| 			} | ||||
| @@ -216,7 +225,9 @@ var utils = require('./../public/src/utils.js'), | ||||
| 						if (err) | ||||
| 							return next(err, null); | ||||
| 						if (!available) { | ||||
| 							next({error:'Email not available!'}, false); | ||||
| 							next({ | ||||
| 								error: 'Email not available!' | ||||
| 							}, false); | ||||
| 						} else { | ||||
| 							next(null, true); | ||||
| 						} | ||||
| @@ -283,7 +294,9 @@ var utils = require('./../public/src/utils.js'), | ||||
|  | ||||
| 	User.changePassword = function(uid, data, callback) { | ||||
| 		if (!utils.isPasswordValid(data.newPassword)) { | ||||
| 			return callback({error:'Invalid password!'}); | ||||
| 			return callback({ | ||||
| 				error: 'Invalid password!' | ||||
| 			}); | ||||
| 		} | ||||
|  | ||||
| 		User.getUserField(uid, 'password', function(err, user_password) { | ||||
| @@ -299,7 +312,9 @@ var utils = require('./../public/src/utils.js'), | ||||
| 						callback(null); | ||||
| 					}); | ||||
| 				} else { | ||||
| 					callback({error:'Your current password is not correct!'}); | ||||
| 					callback({ | ||||
| 						error: 'Your current password is not correct!' | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
| 		}); | ||||
| @@ -448,8 +463,12 @@ var utils = require('./../public/src/utils.js'), | ||||
| 		if (meta.config['email:host'] && meta.config['email:port'] && meta.config['email:from']) { | ||||
| 			var confirm_code = utils.generateUUID(), | ||||
| 				confirm_link = nconf.get('url') + 'confirm/' + confirm_code, | ||||
| 				confirm_email = global.templates['emails/header'] + global.templates['emails/email_confirm'].parse({'CONFIRM_LINK': confirm_link}) + global.templates['emails/footer'], | ||||
| 				confirm_email_plaintext = global.templates['emails/email_confirm_plaintext'].parse({ 'CONFIRM_LINK': confirm_link }); | ||||
| 				confirm_email = global.templates['emails/header'] + global.templates['emails/email_confirm'].parse({ | ||||
| 					'CONFIRM_LINK': confirm_link | ||||
| 				}) + global.templates['emails/footer'], | ||||
| 				confirm_email_plaintext = global.templates['emails/email_confirm_plaintext'].parse({ | ||||
| 					'CONFIRM_LINK': confirm_link | ||||
| 				}); | ||||
|  | ||||
| 			// Email confirmation code | ||||
| 			var expiry_time = 60 * 60 * 2, // Expire after 2 hours | ||||
| @@ -467,12 +486,10 @@ var utils = require('./../public/src/utils.js'), | ||||
| 				from: meta.config.mailer.from, | ||||
| 				to: email, | ||||
| 				subject: '[NodeBB] Registration Email Verification', | ||||
| 				attachment: [ | ||||
| 					{ | ||||
| 				attachment: [{ | ||||
| 					data: confirm_email, | ||||
| 					alternative: true | ||||
| 					} | ||||
| 				] | ||||
| 				}] | ||||
| 			}); | ||||
|  | ||||
| 			emailjsServer.send(message, function(err, success) { | ||||
| @@ -612,7 +629,9 @@ var utils = require('./../public/src/utils.js'), | ||||
| 		RDB.get('usercount', function(err, count) { | ||||
| 			RDB.handle(err); | ||||
|  | ||||
| 			socket.emit('user.count', { count: count ? count : 0 }); | ||||
| 			socket.emit('user.count', { | ||||
| 				count: count ? count : 0 | ||||
| 			}); | ||||
| 		}); | ||||
| 	}; | ||||
|  | ||||
| @@ -622,7 +641,10 @@ var utils = require('./../public/src/utils.js'), | ||||
|  | ||||
| 			User.getUserFields(uid, ['username', 'userslug'], function(err, userData) { | ||||
| 				if (!err && userData) | ||||
| 					socket.emit('user.latest', {userslug: userData.userslug, username: userData.username}); | ||||
| 					socket.emit('user.latest', { | ||||
| 						userslug: userData.userslug, | ||||
| 						username: userData.username | ||||
| 					}); | ||||
| 			}); | ||||
| 		}); | ||||
| 	} | ||||
| @@ -771,7 +793,9 @@ var utils = require('./../public/src/utils.js'), | ||||
|  | ||||
| 						if (expiry >= +Date.now() / 1000 | 0) { | ||||
| 							if (!callback) { | ||||
| 								socket.emit('user:reset.valid', { valid: true }); | ||||
| 								socket.emit('user:reset.valid', { | ||||
| 									valid: true | ||||
| 								}); | ||||
| 							} else { | ||||
| 								callback(true); | ||||
| 							} | ||||
| @@ -780,7 +804,9 @@ var utils = require('./../public/src/utils.js'), | ||||
| 							RDB.del('reset:' + code + ':uid'); | ||||
| 							RDB.del('reset:' + code + ':expiry'); | ||||
| 							if (!callback) { | ||||
| 								socket.emit('user:reset.valid', { valid: false }); | ||||
| 								socket.emit('user:reset.valid', { | ||||
| 									valid: false | ||||
| 								}); | ||||
| 							} else { | ||||
| 								callback(false); | ||||
| 							} | ||||
| @@ -788,7 +814,9 @@ var utils = require('./../public/src/utils.js'), | ||||
| 					}); | ||||
| 				} else { | ||||
| 					if (!callback) { | ||||
| 						socket.emit('user:reset.valid', { valid: false }); | ||||
| 						socket.emit('user:reset.valid', { | ||||
| 							valid: false | ||||
| 						}); | ||||
| 					} else { | ||||
| 						callback(false); | ||||
| 					} | ||||
| @@ -804,20 +832,22 @@ var utils = require('./../public/src/utils.js'), | ||||
| 					RDB.set('reset:' + reset_code + ':expiry', (60 * 60) + new Date() / 1000 | 0); // Active for one hour | ||||
|  | ||||
| 					var reset_link = nconf.get('url') + 'reset/' + reset_code, | ||||
| 						reset_email = global.templates['emails/reset'].parse({'RESET_LINK': reset_link}), | ||||
| 						reset_email_plaintext = global.templates['emails/reset_plaintext'].parse({ 'RESET_LINK': reset_link }); | ||||
| 						reset_email = global.templates['emails/reset'].parse({ | ||||
| 							'RESET_LINK': reset_link | ||||
| 						}), | ||||
| 						reset_email_plaintext = global.templates['emails/reset_plaintext'].parse({ | ||||
| 							'RESET_LINK': reset_link | ||||
| 						}); | ||||
|  | ||||
| 					var message = emailjs.message.create({ | ||||
| 						text: reset_email_plaintext, | ||||
| 						from: meta.config.mailer ? meta.config.mailer.from : 'localhost@example.org', | ||||
| 						to: email, | ||||
| 						subject: 'Password Reset Requested', | ||||
| 						attachment: [ | ||||
| 							{ | ||||
| 						attachment: [{ | ||||
| 							data: reset_email, | ||||
| 							alternative: true | ||||
| 							} | ||||
| 						] | ||||
| 						}] | ||||
| 					}); | ||||
|  | ||||
| 					emailjsServer.send(message, function(err, success) { | ||||
| @@ -860,7 +890,9 @@ var utils = require('./../public/src/utils.js'), | ||||
| 						RDB.del('reset:' + code + ':uid'); | ||||
| 						RDB.del('reset:' + code + ':expiry'); | ||||
|  | ||||
| 						socket.emit('user:reset.commit', { status: 'ok' }); | ||||
| 						socket.emit('user:reset.commit', { | ||||
| 							status: 'ok' | ||||
| 						}); | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
| @@ -872,7 +904,9 @@ var utils = require('./../public/src/utils.js'), | ||||
| 			User.get_uid_by_email(email, function(exists) { | ||||
| 				exists = !! exists; | ||||
| 				if (typeof callback !== 'function') { | ||||
| 					socket.emit('user.email.exists', { exists: exists }); | ||||
| 					socket.emit('user.email.exists', { | ||||
| 						exists: exists | ||||
| 					}); | ||||
| 				} else { | ||||
| 					callback(exists); | ||||
| 				} | ||||
| @@ -887,9 +921,13 @@ var utils = require('./../public/src/utils.js'), | ||||
| 				if (email !== null) { | ||||
| 					RDB.set('email:' + email + ':confirm', true); | ||||
| 					RDB.del('confirm:' + code + ':email'); | ||||
| 					callback({ status: 'ok' }); | ||||
| 					callback({ | ||||
| 						status: 'ok' | ||||
| 					}); | ||||
| 				} else { | ||||
| 					callback({ status: 'not_ok' }); | ||||
| 					callback({ | ||||
| 						status: 'not_ok' | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
| 		} | ||||
|   | ||||
							
								
								
									
										126
									
								
								src/webserver.js
									
									
									
									
									
								
							
							
						
						
									
										126
									
								
								src/webserver.js
									
									
									
									
									
								
							| @@ -31,12 +31,19 @@ var express = require('express'), | ||||
| 	 *						accepts:	metaTags | ||||
| 	 */ | ||||
| 	app.build_header = function(options, callback) { | ||||
| 		var	defaultMetaTags = [ | ||||
| 				{ name: 'viewport', content: 'width=device-width, initial-scale=1.0' }, | ||||
| 				{ name: 'content-type', content: 'text/html; charset=UTF-8' }, | ||||
| 				{ name: 'apple-mobile-web-app-capable', content: 'yes' }, | ||||
| 				{ property: 'og:site_name', content: meta.config.title || 'NodeBB' }, | ||||
| 			], | ||||
| 		var defaultMetaTags = [{ | ||||
| 			name: 'viewport', | ||||
| 			content: 'width=device-width, initial-scale=1.0' | ||||
| 		}, { | ||||
| 			name: 'content-type', | ||||
| 			content: 'text/html; charset=UTF-8' | ||||
| 		}, { | ||||
| 			name: 'apple-mobile-web-app-capable', | ||||
| 			content: 'yes' | ||||
| 		}, { | ||||
| 			property: 'og:site_name', | ||||
| 			content: meta.config.title || 'NodeBB' | ||||
| 		}, ], | ||||
| 			metaString = utils.buildMetaTags(defaultMetaTags.concat(options.metaTags || [])), | ||||
| 			templateValues = { | ||||
| 				cssSrc: meta.config['theme:src'] || nconf.get('relative_path') + '/vendor/bootstrap/css/bootstrap.min.css', | ||||
| @@ -58,7 +65,10 @@ var express = require('express'), | ||||
|  | ||||
| 	// Middlewares | ||||
| 	app.use(express.favicon(path.join(__dirname, '../', 'public', 'favicon.ico'))); | ||||
| 	app.use(require('less-middleware')({ src: path.join(__dirname, '../', 'public'), prefix:nconf.get('relative_path') })); | ||||
| 	app.use(require('less-middleware')({ | ||||
| 		src: path.join(__dirname, '../', 'public'), | ||||
| 		prefix: nconf.get('relative_path') | ||||
| 	})); | ||||
| 	app.use(nconf.get('relative_path'), express.static(path.join(__dirname, '../', 'public'))); | ||||
| 	app.use(express.bodyParser()); // Puts POST vars in request.body | ||||
|  | ||||
| @@ -138,7 +148,9 @@ var express = require('express'), | ||||
|  | ||||
| 		// respond with json | ||||
| 		if (req.accepts('json')) { | ||||
| 			res.send({ error: 'Not found' }); | ||||
| 			res.send({ | ||||
| 				error: 'Not found' | ||||
| 			}); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| @@ -155,7 +167,9 @@ var express = require('express'), | ||||
|  | ||||
| 		res.status(err.status || 500); | ||||
|  | ||||
| 		res.json('500', { error: err.message }); | ||||
| 		res.json('500', { | ||||
| 			error: err.message | ||||
| 		}); | ||||
| 	}); | ||||
|  | ||||
|  | ||||
| @@ -189,7 +203,10 @@ var express = require('express'), | ||||
| 							return; | ||||
| 						} | ||||
|  | ||||
| 						app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 						app.build_header({ | ||||
| 							req: req, | ||||
| 							res: res | ||||
| 						}, function(err, header) { | ||||
| 							res.send(header + app.create_route(route) + templates['footer']); | ||||
| 						}); | ||||
| 					}); | ||||
| @@ -204,12 +221,19 @@ var express = require('express'), | ||||
| 					app.build_header({ | ||||
| 						req: req, | ||||
| 						res: res, | ||||
| 						metaTags: [ | ||||
| 							{ name: "title", content: meta.config.title || 'NodeBB' }, | ||||
| 							{ name: "description", content: meta.config.description || '' }, | ||||
| 							{ property: 'og:title', content: 'Index | ' + (meta.config.title || 'NodeBB') }, | ||||
| 							{ property: "og:type", content: 'website' } | ||||
| 						] | ||||
| 						metaTags: [{ | ||||
| 							name: "title", | ||||
| 							content: meta.config.title || 'NodeBB' | ||||
| 						}, { | ||||
| 							name: "description", | ||||
| 							content: meta.config.description || '' | ||||
| 						}, { | ||||
| 							property: 'og:title', | ||||
| 							content: 'Index | ' + (meta.config.title || 'NodeBB') | ||||
| 						}, { | ||||
| 							property: "og:type", | ||||
| 							content: 'website' | ||||
| 						}] | ||||
| 					}, next); | ||||
| 				}, | ||||
| 				"categories": function(next) { | ||||
| @@ -275,16 +299,31 @@ var express = require('express'), | ||||
| 					app.build_header({ | ||||
| 						req: req, | ||||
| 						res: res, | ||||
| 						metaTags: [ | ||||
| 							{ name: "title", content: topicData.topic_name }, | ||||
| 							{ property: 'og:title', content: topicData.topic_name + ' | ' + (meta.config.title || 'NodeBB') }, | ||||
| 							{ property: "og:type", content: 'article' }, | ||||
| 							{ property: "og:url", content: nconf.get('url') + 'topic/' + topicData.slug }, | ||||
| 							{ property: 'og:image', content: topicData.main_posts[0].picture }, | ||||
| 							{ property: "article:published_time", content: new Date(parseInt(topicData.main_posts[0].timestamp, 10)).toISOString() }, | ||||
| 							{ property: 'article:modified_time', content: new Date(lastMod).toISOString() }, | ||||
| 							{ property: 'article:section', content: topicData.category_name } | ||||
| 						] | ||||
| 						metaTags: [{ | ||||
| 							name: "title", | ||||
| 							content: topicData.topic_name | ||||
| 						}, { | ||||
| 							property: 'og:title', | ||||
| 							content: topicData.topic_name + ' | ' + (meta.config.title || 'NodeBB') | ||||
| 						}, { | ||||
| 							property: "og:type", | ||||
| 							content: 'article' | ||||
| 						}, { | ||||
| 							property: "og:url", | ||||
| 							content: nconf.get('url') + 'topic/' + topicData.slug | ||||
| 						}, { | ||||
| 							property: 'og:image', | ||||
| 							content: topicData.main_posts[0].picture | ||||
| 						}, { | ||||
| 							property: "article:published_time", | ||||
| 							content: new Date(parseInt(topicData.main_posts[0].timestamp, 10)).toISOString() | ||||
| 						}, { | ||||
| 							property: 'article:modified_time', | ||||
| 							content: new Date(lastMod).toISOString() | ||||
| 						}, { | ||||
| 							property: 'article:section', | ||||
| 							content: topicData.category_name | ||||
| 						}] | ||||
| 					}, function(err, header) { | ||||
| 						next(err, { | ||||
| 							header: header, | ||||
| @@ -344,11 +383,16 @@ var express = require('express'), | ||||
| 					app.build_header({ | ||||
| 						req: req, | ||||
| 						res: res, | ||||
| 						metaTags: [ | ||||
| 							{ name: 'title', content: categoryData.category_name }, | ||||
| 							{ name: 'description', content: categoryData.category_description }, | ||||
| 							{ property: "og:type", content: 'website' } | ||||
| 						] | ||||
| 						metaTags: [{ | ||||
| 							name: 'title', | ||||
| 							content: categoryData.category_name | ||||
| 						}, { | ||||
| 							name: 'description', | ||||
| 							content: categoryData.category_description | ||||
| 						}, { | ||||
| 							property: "og:type", | ||||
| 							content: 'website' | ||||
| 						}] | ||||
| 					}, function(err, header) { | ||||
| 						next(err, { | ||||
| 							header: header, | ||||
| @@ -370,7 +414,10 @@ var express = require('express'), | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/confirm/:code', function(req, res) { | ||||
| 			app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 			app.build_header({ | ||||
| 				req: req, | ||||
| 				res: res | ||||
| 			}, function(err, header) { | ||||
| 				res.send(header + '<script>templates.ready(function(){ajaxify.go("confirm/' + req.params.code + '");});</script>' + templates['footer']); | ||||
| 			}); | ||||
| 		}); | ||||
| @@ -421,7 +468,10 @@ var express = require('express'), | ||||
| 		app.get('/outgoing', function(req, res) { | ||||
| 			if (!req.query.url) return res.redirect('/404'); | ||||
|  | ||||
| 			app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 			app.build_header({ | ||||
| 				req: req, | ||||
| 				res: res | ||||
| 			}, function(err, header) { | ||||
| 				res.send( | ||||
| 					header + | ||||
| 					'\n\t<script>templates.ready(function(){ajaxify.go("outgoing?url=' + encodeURIComponent(req.query.url) + '", null, null, true);});</script>' + | ||||
| @@ -431,13 +481,19 @@ var express = require('express'), | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/search', function(req, res) { | ||||
| 			app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 			app.build_header({ | ||||
| 				req: req, | ||||
| 				res: res | ||||
| 			}, function(err, header) { | ||||
| 				res.send(header + app.create_route("search", null, "search") + templates['footer']); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		app.get('/search/:term', function(req, res) { | ||||
| 			app.build_header({ req: req, res: res }, function(err, header) { | ||||
| 			app.build_header({ | ||||
| 				req: req, | ||||
| 				res: res | ||||
| 			}, function(err, header) { | ||||
| 				res.send(header + app.create_route("search/" + req.params.term, null, "search") + templates['footer']); | ||||
| 			}); | ||||
| 		}); | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
|  | ||||
| var SocketIO = require('socket.io').listen(global.server, { | ||||
| 	log: false, | ||||
| 	transports: ['websocket', 'xhr-polling', 'jsonp-polling', 'flashsocket'] | ||||
| @@ -58,7 +57,11 @@ var SocketIO = require('socket.io').listen(global.server, { | ||||
| 					io.sockets. in ('global').emit('api:user.isOnline', isUserOnline(uid)); | ||||
|  | ||||
| 					user.getUserField(uid, 'username', function(err, username) { | ||||
| 						socket.emit('event:connect', {status: 1, username:username, uid:uid}); | ||||
| 						socket.emit('event:connect', { | ||||
| 							status: 1, | ||||
| 							username: username, | ||||
| 							uid: uid | ||||
| 						}); | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
| @@ -191,13 +194,14 @@ var SocketIO = require('socket.io').listen(global.server, { | ||||
| 						socket.emit('api:updateHeader', fields); | ||||
| 					} | ||||
| 				}); | ||||
| 			} | ||||
| 			else { | ||||
| 			} else { | ||||
| 				socket.emit('api:updateHeader', { | ||||
| 					uid: 0, | ||||
| 					username: "Anonymous User", | ||||
| 					email: '', | ||||
| 					picture: require('gravatar').url('', {s:'24'}, https=nconf.get('https')) | ||||
| 					picture: require('gravatar').url('', { | ||||
| 						s: '24' | ||||
| 					}, https = nconf.get('https')) | ||||
| 				}); | ||||
| 			} | ||||
|  | ||||
| @@ -206,7 +210,9 @@ var SocketIO = require('socket.io').listen(global.server, { | ||||
| 		socket.on('user.exists', function(data) { | ||||
| 			if (data.username) { | ||||
| 				user.exists(utils.slugify(data.username), function(exists) { | ||||
| 					socket.emit('user.exists', {exists: exists}); | ||||
| 					socket.emit('user.exists', { | ||||
| 						exists: exists | ||||
| 					}); | ||||
| 				}); | ||||
| 			} | ||||
| 		}); | ||||
| @@ -257,7 +263,10 @@ var SocketIO = require('socket.io').listen(global.server, { | ||||
| 		}); | ||||
|  | ||||
| 		socket.on('api:user.isOnline', function(uid, callback) { | ||||
| 			callback({online:isUserOnline(uid), timestamp:Date.now()}); | ||||
| 			callback({ | ||||
| 				online: isUserOnline(uid), | ||||
| 				timestamp: Date.now() | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		socket.on('api:user.changePassword', function(data, callback) { | ||||
| @@ -483,7 +492,9 @@ var SocketIO = require('socket.io').listen(global.server, { | ||||
|  | ||||
| 		socket.on('api:posts.getRawPost', function(data) { | ||||
| 			posts.getPostField(data.pid, 'content', function(raw) { | ||||
| 				socket.emit('api:posts.getRawPost', { post: raw }); | ||||
| 				socket.emit('api:posts.getRawPost', { | ||||
| 					post: raw | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| @@ -566,7 +577,12 @@ var SocketIO = require('socket.io').listen(global.server, { | ||||
| 						numSockets = userSockets[touid].length; | ||||
|  | ||||
| 						for (var x = 0; x < numSockets; ++x) { | ||||
| 							userSockets[touid][x].emit('chatMessage', {fromuid:uid, username:username, message: finalMessage, timestamp: Date.now()}); | ||||
| 							userSockets[touid][x].emit('chatMessage', { | ||||
| 								fromuid: uid, | ||||
| 								username: username, | ||||
| 								message: finalMessage, | ||||
| 								timestamp: Date.now() | ||||
| 							}); | ||||
| 						} | ||||
| 					} | ||||
|  | ||||
| @@ -575,7 +591,12 @@ var SocketIO = require('socket.io').listen(global.server, { | ||||
| 						numSockets = userSockets[uid].length; | ||||
|  | ||||
| 						for (var x = 0; x < numSockets; ++x) { | ||||
| 							userSockets[uid][x].emit('chatMessage', {fromuid:touid, username:username, message:'You : ' + msg, timestamp: Date.now()}); | ||||
| 							userSockets[uid][x].emit('chatMessage', { | ||||
| 								fromuid: touid, | ||||
| 								username: username, | ||||
| 								message: 'You : ' + msg, | ||||
| 								timestamp: Date.now() | ||||
| 							}); | ||||
| 						} | ||||
| 					} | ||||
| 				}); | ||||
| @@ -590,7 +611,9 @@ var SocketIO = require('socket.io').listen(global.server, { | ||||
|  | ||||
| 		socket.on('api:config.set', function(data) { | ||||
| 			meta.configs.set(data.key, data.value, function(err) { | ||||
| 				if (!err) socket.emit('api:config.set', { status: 'ok' }); | ||||
| 				if (!err) socket.emit('api:config.set', { | ||||
| 					status: 'ok' | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| @@ -692,7 +715,9 @@ var SocketIO = require('socket.io').listen(global.server, { | ||||
| 				end = start + 9; | ||||
|  | ||||
| 			topics.getTopicPosts(data.tid, start, end, uid, function(posts) { | ||||
| 				callback({posts:posts}); | ||||
| 				callback({ | ||||
| 					posts: posts | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| @@ -701,7 +726,9 @@ var SocketIO = require('socket.io').listen(global.server, { | ||||
| 				end = start + 9; | ||||
|  | ||||
| 			categories.getCategoryTopics(data.cid, start, end, uid, function(topics) { | ||||
| 				callback({topics:topics}); | ||||
| 				callback({ | ||||
| 					topics: topics | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| @@ -731,7 +758,9 @@ var SocketIO = require('socket.io').listen(global.server, { | ||||
| 				if (err) { | ||||
| 					winston.err(err); | ||||
| 				} else { | ||||
| 					callback({users:data}); | ||||
| 					callback({ | ||||
| 						users: data | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
| 		}); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user