| 
									
										
										
										
											2013-04-22 16:51:32 +00:00
										 |  |  | var express = require('express'), | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 	express_namespace = require('express-namespace'), | 
					
						
							| 
									
										
										
										
											2013-04-22 15:17:41 -04:00
										 |  |  | 	WebServer = express(), | 
					
						
							|  |  |  | 	server = require('http').createServer(WebServer), | 
					
						
							| 
									
										
										
										
											2013-04-28 13:58:19 -04:00
										 |  |  | 	RedisStore = require('connect-redis')(express), | 
					
						
							|  |  |  | 	path = require('path'), | 
					
						
							| 
									
										
										
										
											2013-06-20 16:48:17 -04:00
										 |  |  | 	redis = require('redis'), | 
					
						
							| 
									
										
										
										
											2013-08-19 13:31:04 -04:00
										 |  |  | 	redisServer = redis.createClient(nconf.get('redis:port'), nconf.get('redis:host')), | 
					
						
							| 
									
										
										
										
											2013-05-23 13:29:21 -04:00
										 |  |  | 	utils = require('../public/src/utils.js'), | 
					
						
							| 
									
										
										
										
											2013-07-16 13:30:48 -04:00
										 |  |  | 	pkg = require('../package.json'), | 
					
						
							| 
									
										
										
										
											2013-05-22 21:43:01 -04:00
										 |  |  | 	fs = require('fs'), | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-04 18:20:22 -04:00
										 |  |  | 	user = require('./user.js'), | 
					
						
							| 
									
										
										
										
											2013-05-14 12:13:29 -04:00
										 |  |  | 	categories = require('./categories.js'), | 
					
						
							|  |  |  | 	posts = require('./posts.js'), | 
					
						
							|  |  |  | 	topics = require('./topics.js'), | 
					
						
							| 
									
										
										
										
											2013-05-22 21:43:01 -04:00
										 |  |  | 	notifications = require('./notifications.js'), | 
					
						
							| 
									
										
										
										
											2013-05-09 03:33:53 +00:00
										 |  |  | 	admin = require('./routes/admin.js'), | 
					
						
							| 
									
										
										
										
											2013-05-14 13:04:12 -04:00
										 |  |  | 	userRoute = require('./routes/user.js'), | 
					
						
							| 
									
										
										
										
											2013-07-31 15:17:03 -04:00
										 |  |  | 	apiRoute = require('./routes/api.js'), | 
					
						
							| 
									
										
										
										
											2013-07-05 14:47:00 -04:00
										 |  |  | 	testBed = require('./routes/testbed.js'), | 
					
						
							| 
									
										
										
										
											2013-05-25 20:32:22 -04:00
										 |  |  | 	auth = require('./routes/authentication.js'), | 
					
						
							| 
									
										
										
										
											2013-09-03 23:42:26 -04:00
										 |  |  | 	meta = require('./meta.js'), | 
					
						
							| 
									
										
										
										
											2013-09-13 11:10:17 -04:00
										 |  |  | 	feed = require('./feed'), | 
					
						
							|  |  |  | 	plugins = require('./plugins'); | 
					
						
							| 
									
										
										
										
											2013-05-02 15:57:43 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-22 16:51:32 +00:00
										 |  |  | (function(app) { | 
					
						
							| 
									
										
										
										
											2013-06-20 16:04:58 -04:00
										 |  |  | 	var templates = null; | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-24 18:54:14 -04:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 *	`options` object	requires:	req, res | 
					
						
							|  |  |  | 	 *						accepts:	metaTags | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	app.build_header = function(options, callback) { | 
					
						
							| 
									
										
										
										
											2013-07-23 17:21:44 -04:00
										 |  |  | 		var	defaultMetaTags = [ | 
					
						
							|  |  |  | 				{ name: 'viewport', content: 'width=device-width, initial-scale=1.0' }, | 
					
						
							|  |  |  | 				{ name: 'content-type', content: 'text/html; charset=UTF-8' }, | 
					
						
							| 
									
										
										
										
											2013-07-25 15:34:22 -04:00
										 |  |  | 				{ name: 'apple-mobile-web-app-capable', content: 'yes' }, | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 				{ property: 'og:site_name', content: meta.config.title || 'NodeBB' }, | 
					
						
							| 
									
										
										
										
											2013-07-23 17:21:44 -04:00
										 |  |  | 			], | 
					
						
							| 
									
										
										
										
											2013-07-24 15:19:26 -04:00
										 |  |  | 			metaString = utils.buildMetaTags(defaultMetaTags.concat(options.metaTags || [])), | 
					
						
							|  |  |  | 			templateValues = { | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 				cssSrc: meta.config['theme:src'] || nconf.get('relative_path') + '/vendor/bootstrap/css/bootstrap.min.css', | 
					
						
							|  |  |  | 				title: meta.config['title'] || 'NodeBB', | 
					
						
							|  |  |  | 				browserTitle: meta.config['title'] || 'NodeBB', | 
					
						
							| 
									
										
										
										
											2013-07-24 15:19:26 -04:00
										 |  |  | 				csrf: options.res.locals.csrf_token, | 
					
						
							| 
									
										
										
										
											2013-08-19 13:31:04 -04:00
										 |  |  | 				relative_path: nconf.get('relative_path'), | 
					
						
							| 
									
										
										
										
											2013-07-24 15:19:26 -04:00
										 |  |  | 				meta_tags: metaString | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-11 16:12:20 -04:00
										 |  |  | 		// meta.build_title(options.title, (options.req.user ? options.req.user.uid : 0), function(err, title) {
 | 
					
						
							|  |  |  | 		// 	if (!err) templateValues.browserTitle = title;
 | 
					
						
							| 
									
										
										
										
											2013-07-24 15:19:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-11 16:12:20 -04:00
										 |  |  | 		// 	callback(null, templates['header'].parse(templateValues));
 | 
					
						
							|  |  |  | 		// });
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		callback(null, templates['header'].parse(templateValues)); | 
					
						
							| 
									
										
										
										
											2013-06-20 16:04:58 -04:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-04-22 16:51:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-24 16:42:12 -04:00
										 |  |  | 	// Middlewares
 | 
					
						
							| 
									
										
										
										
											2013-06-28 15:56:44 -04:00
										 |  |  | 	app.use(express.favicon(path.join(__dirname, '../', 'public', 'favicon.ico'))); | 
					
						
							| 
									
										
										
										
											2013-09-01 15:21:28 -04:00
										 |  |  | 	app.use(require('less-middleware')({ src: path.join(__dirname, '../', 'public'), prefix:nconf.get('relative_path') })); | 
					
						
							| 
									
										
										
										
											2013-08-19 13:31:04 -04:00
										 |  |  | 	app.use(nconf.get('relative_path'), express.static(path.join(__dirname, '../', 'public'))); | 
					
						
							| 
									
										
										
										
											2013-04-24 16:42:12 -04:00
										 |  |  | 	app.use(express.bodyParser());	// Puts POST vars in request.body
 | 
					
						
							| 
									
										
										
										
											2013-09-09 14:29:40 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-24 16:42:12 -04:00
										 |  |  | 	app.use(express.cookieParser());	// If you want to parse cookies (res.cookies)
 | 
					
						
							| 
									
										
										
										
											2013-04-28 13:58:19 -04:00
										 |  |  | 	app.use(express.compress()); | 
					
						
							| 
									
										
										
										
											2013-04-25 11:15:03 -04:00
										 |  |  | 	app.use(express.session({ | 
					
						
							| 
									
										
										
										
											2013-04-25 12:59:31 -04:00
										 |  |  | 		store: new RedisStore({ | 
					
						
							| 
									
										
										
										
											2013-05-01 12:54:04 -04:00
										 |  |  | 			client: redisServer, | 
					
						
							| 
									
										
										
										
											2013-08-28 10:18:17 -04:00
										 |  |  | 			ttl: 60*60*24*30 | 
					
						
							| 
									
										
										
										
											2013-04-25 12:59:31 -04:00
										 |  |  | 		}), | 
					
						
							| 
									
										
										
										
											2013-08-19 13:31:04 -04:00
										 |  |  | 		secret: nconf.get('secret'), | 
					
						
							| 
									
										
										
										
											2013-08-26 14:56:00 -04:00
										 |  |  | 		key: 'express.sid', | 
					
						
							|  |  |  | 		cookie: { | 
					
						
							| 
									
										
										
										
											2013-08-27 23:40:38 -04:00
										 |  |  | 			maxAge: 60*60*24*30*1000	// 30 days
 | 
					
						
							| 
									
										
										
										
											2013-08-26 14:56:00 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-04-25 11:15:03 -04:00
										 |  |  | 	})); | 
					
						
							| 
									
										
										
										
											2013-06-20 12:41:22 -04:00
										 |  |  | 	app.use(express.csrf()); | 
					
						
							|  |  |  | 	app.use(function(req, res, next) { | 
					
						
							|  |  |  | 		res.locals.csrf_token = req.session._csrf; | 
					
						
							|  |  |  | 		next(); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2013-05-17 13:36:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-13 11:10:17 -04:00
										 |  |  | 	// Static Directories for NodeBB Plugins
 | 
					
						
							|  |  |  | 	app.configure(function() { | 
					
						
							|  |  |  | 		var	tailMiddlewares = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		plugins.ready(function() { | 
					
						
							|  |  |  | 			// Remove some middlewares until the router is gone
 | 
					
						
							|  |  |  | 			// This is not recommended behaviour: http://stackoverflow.com/a/13691542/122353
 | 
					
						
							|  |  |  | 			// Also: https://www.exratione.com/2013/03/nodejs-abusing-express-3-to-enable-late-addition-of-middleware/
 | 
					
						
							|  |  |  | 			tailMiddlewares.push(app.stack.pop()); | 
					
						
							|  |  |  | 			tailMiddlewares.push(app.stack.pop()); | 
					
						
							|  |  |  | 			tailMiddlewares.push(app.stack.pop()); | 
					
						
							|  |  |  | 			for(d in plugins.staticDirs) { | 
					
						
							|  |  |  | 				app.use(nconf.get('relative_path') + '/plugins/' + d, express.static(plugins.staticDirs[d])); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// Push the removed middlewares back onto the application stack
 | 
					
						
							|  |  |  | 			tailMiddlewares.reverse(); | 
					
						
							|  |  |  | 			app.stack.push(tailMiddlewares.shift()); | 
					
						
							|  |  |  | 			app.stack.push(tailMiddlewares.shift()); | 
					
						
							|  |  |  | 			app.stack.push(tailMiddlewares.shift()); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-17 13:36:35 -04:00
										 |  |  | 	module.exports.init = function() { | 
					
						
							|  |  |  | 		templates = global.templates; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 06:26:32 +00:00
										 |  |  | 	auth.initialize(app); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-25 12:59:31 -04:00
										 |  |  | 	app.use(function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-19 13:31:04 -04:00
										 |  |  | 		nconf.set('https', req.secure); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-28 13:58:19 -04:00
										 |  |  | 		// Don't bother with session handling for API requests
 | 
					
						
							| 
									
										
										
										
											2013-04-28 22:26:27 -04:00
										 |  |  | 		if (/^\/api\//.test(req.url)) return next(); | 
					
						
							| 
									
										
										
										
											2013-04-28 21:15:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-01 21:03:37 -04:00
										 |  |  | 		if (req.user && req.user.uid) { | 
					
						
							| 
									
										
										
										
											2013-05-14 12:13:29 -04:00
										 |  |  | 			user.session_ping(req.sessionID, req.user.uid); | 
					
						
							| 
									
										
										
										
											2013-04-25 12:59:31 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		next(); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-08 16:57:40 -04:00
										 |  |  | 	app.use(app.router); | 
					
						
							| 
									
										
										
										
											2013-07-08 16:02:54 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	app.use(function(req, res, next) { | 
					
						
							|  |  |  | 		res.status(404); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// respond with html page
 | 
					
						
							|  |  |  | 		if (req.accepts('html')) { | 
					
						
							|  |  |  | 			//res.json('404', { url: req.url });
 | 
					
						
							| 
									
										
										
										
											2013-08-19 13:31:04 -04:00
										 |  |  | 			res.redirect(nconf.get('relative_path') + '/404'); | 
					
						
							| 
									
										
										
										
											2013-07-08 16:02:54 -04:00
										 |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// respond with json
 | 
					
						
							|  |  |  | 		if (req.accepts('json')) { | 
					
						
							|  |  |  | 			res.send({ error: 'Not found' }); | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-08 16:02:54 -04:00
										 |  |  | 		// default to plain-text. send()
 | 
					
						
							|  |  |  | 		res.type('txt').send('Not found'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	app.use(function(err, req, res, next) { | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-08 16:02:54 -04:00
										 |  |  | 		// we may use properties of the error object
 | 
					
						
							|  |  |  | 		// here and next(err) appropriately, or if
 | 
					
						
							|  |  |  | 		// we possibly recovered from the error, simply next().
 | 
					
						
							|  |  |  | 		console.error(err.stack); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-08 16:02:54 -04:00
										 |  |  | 		res.status(err.status || 500); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-08 16:02:54 -04:00
										 |  |  | 		res.json('500', { error: err.message }); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-02 09:13:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 06:26:32 +00:00
										 |  |  | 	app.create_route = function(url, tpl) { // to remove
 | 
					
						
							| 
									
										
										
										
											2013-05-07 21:29:28 +00:00
										 |  |  | 		return '<script>templates.ready(function(){ajaxify.go("' + url + '", null, "' + tpl + '");});</script>'; | 
					
						
							| 
									
										
										
										
											2013-05-09 06:26:32 +00:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-10 21:31:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-19 13:31:04 -04:00
										 |  |  | 	app.namespace(nconf.get('relative_path'), function() { | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		auth.create_routes(app); | 
					
						
							|  |  |  | 		admin.create_routes(app); | 
					
						
							|  |  |  | 		userRoute.create_routes(app); | 
					
						
							|  |  |  | 		testBed.create_routes(app); | 
					
						
							| 
									
										
										
										
											2013-07-31 15:17:03 -04:00
										 |  |  | 		apiRoute.create_routes(app); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-10 21:31:58 -04:00
										 |  |  | 		// Basic Routes (entirely client-side parsed, goal is to move the rest of the crap in this file into this one section)
 | 
					
						
							|  |  |  | 		(function() { | 
					
						
							| 
									
										
										
										
											2013-07-28 18:27:49 -04:00
										 |  |  | 			var routes = ['login', 'register', 'account', 'recent', 'unread', 'popular', 'active', '403', '404']; | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-10 21:31:58 -04:00
										 |  |  | 			for (var i=0, ii=routes.length; i<ii; i++) { | 
					
						
							|  |  |  | 				(function(route) { | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-10 21:31:58 -04:00
										 |  |  | 					app.get('/' + route, function(req, res) { | 
					
						
							|  |  |  | 						if ((route === 'login' || route ==='register') && (req.user && req.user.uid > 0)) { | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-23 14:55:25 -04:00
										 |  |  | 							user.getUserField(req.user.uid, 'userslug', function(err, userslug) { | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 								res.redirect('/users/'+userslug); | 
					
						
							| 
									
										
										
										
											2013-07-10 21:31:58 -04:00
										 |  |  | 							}); | 
					
						
							|  |  |  | 							return; | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2013-07-24 15:19:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-24 18:54:14 -04:00
										 |  |  | 						app.build_header({ req: req, res: res }, function(err, header) { | 
					
						
							|  |  |  | 							res.send(header + app.create_route(route) + templates['footer']); | 
					
						
							|  |  |  | 						}); | 
					
						
							| 
									
										
										
										
											2013-07-10 21:31:58 -04:00
										 |  |  | 					}); | 
					
						
							|  |  |  | 				}(routes[i])); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}()); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		app.get('/', function(req, res) { | 
					
						
							| 
									
										
										
										
											2013-07-24 18:54:14 -04:00
										 |  |  | 			async.parallel({ | 
					
						
							|  |  |  | 				"header": function(next) { | 
					
						
							| 
									
										
										
										
											2013-07-25 15:34:22 -04:00
										 |  |  | 					app.build_header({ | 
					
						
							|  |  |  | 						req: req, | 
					
						
							|  |  |  | 						res: res, | 
					
						
							|  |  |  | 						metaTags: [ | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 							{ name: "title", content: meta.config.title || 'NodeBB' }, | 
					
						
							|  |  |  | 							{ name: "description", content: meta.config.description || '' }, | 
					
						
							|  |  |  | 							{ property: 'og:title', content: 'Index | ' + (meta.config.title || 'NodeBB') }, | 
					
						
							| 
									
										
										
										
											2013-07-25 15:34:22 -04:00
										 |  |  | 							{ property: "og:type", content: 'website' } | 
					
						
							|  |  |  | 						] | 
					
						
							|  |  |  | 					}, next); | 
					
						
							| 
									
										
										
										
											2013-07-24 18:54:14 -04:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 				"categories": function(next) { | 
					
						
							|  |  |  | 					categories.getAllCategories(function(returnData) { | 
					
						
							|  |  |  | 						next(null, returnData); | 
					
						
							|  |  |  | 					}, 0); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, function(err, data) { | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 				res.send( | 
					
						
							| 
									
										
										
										
											2013-07-24 18:54:14 -04:00
										 |  |  | 					data.header + | 
					
						
							|  |  |  | 					'\n\t<noscript>\n' + templates['noscript/header'] + templates['noscript/home'].parse(data.categories) + '\n\t</noscript>' + | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 					app.create_route('') + | 
					
						
							|  |  |  | 					templates['footer'] | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2013-07-24 18:54:14 -04:00
										 |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		app.get('/topic/:topic_id/:slug?', function(req, res) { | 
					
						
							|  |  |  | 			var tid = req.params.topic_id; | 
					
						
							| 
									
										
										
										
											2013-09-04 13:52:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-21 16:16:07 -04:00
										 |  |  | 			if (tid.match(/^\d+\.rss$/)) { | 
					
						
							| 
									
										
										
										
											2013-09-03 23:42:26 -04:00
										 |  |  | 				tid = tid.slice(0, -4); | 
					
						
							|  |  |  | 				var	rssPath = path.join(__dirname, '../', 'feeds/topics', tid + '.rss'), | 
					
						
							|  |  |  | 					loadFeed = function() { | 
					
						
							|  |  |  | 						fs.readFile(rssPath, function (err, data) { | 
					
						
							| 
									
										
										
										
											2013-09-04 13:52:28 -04:00
										 |  |  | 							if (err) res.type('text').send(404, "Unable to locate an rss feed at this location."); | 
					
						
							|  |  |  | 							else res.type('xml').set('Content-Length', data.length).send(data); | 
					
						
							| 
									
										
										
										
											2013-09-03 23:42:26 -04:00
										 |  |  | 						}); | 
					
						
							| 
									
										
										
										
											2013-09-04 13:52:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-03 23:42:26 -04:00
										 |  |  | 					}; | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-03 23:42:26 -04:00
										 |  |  | 				if (!fs.existsSync(rssPath)) { | 
					
						
							| 
									
										
										
										
											2013-09-15 07:58:02 -04:00
										 |  |  | 					feed.updateTopic(tid, function(err) { | 
					
						
							|  |  |  | 						if (err) res.redirect('/404'); | 
					
						
							|  |  |  | 						else loadFeed(); | 
					
						
							| 
									
										
										
										
											2013-09-03 23:42:26 -04:00
										 |  |  | 					}); | 
					
						
							|  |  |  | 				} else loadFeed(); | 
					
						
							| 
									
										
										
										
											2013-09-04 13:52:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-06-14 13:01:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-24 19:27:25 -04:00
										 |  |  | 			async.waterfall([ | 
					
						
							|  |  |  | 				function(next) { | 
					
						
							| 
									
										
										
										
											2013-09-03 13:11:21 -04:00
										 |  |  | 					topics.getTopicWithPosts(tid, ((req.user) ? req.user.uid : 0), 0, -1, function(err, topicData) { | 
					
						
							| 
									
										
										
										
											2013-08-24 18:51:24 -04:00
										 |  |  | 						if(topicData) { | 
					
						
							|  |  |  | 							if(topicData.deleted === '1' && topicData.expose_tools === 0) | 
					
						
							|  |  |  | 								return next(new Error('Topic deleted'), null); | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2013-08-24 18:47:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-24 19:27:25 -04:00
										 |  |  | 						next(err, topicData); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				function(topicData, next) { | 
					
						
							| 
									
										
										
										
											2013-09-03 12:36:48 -04:00
										 |  |  | 					var lastMod = 0, | 
					
						
							| 
									
										
										
										
											2013-07-25 15:34:22 -04:00
										 |  |  | 						timestamp; | 
					
						
							| 
									
										
										
										
											2013-08-16 17:04:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-25 15:34:22 -04:00
										 |  |  | 					for(var x=0,numPosts=topicData.posts.length;x<numPosts;x++) { | 
					
						
							|  |  |  | 						timestamp = parseInt(topicData.posts[x].timestamp, 10); | 
					
						
							|  |  |  | 						if (timestamp > lastMod) lastMod = timestamp; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-24 19:27:25 -04:00
										 |  |  | 					app.build_header({ | 
					
						
							|  |  |  | 						req: req, | 
					
						
							|  |  |  | 						res: res, | 
					
						
							|  |  |  | 						metaTags: [ | 
					
						
							| 
									
										
										
										
											2013-07-25 15:34:22 -04:00
										 |  |  | 							{ name: "title", content: topicData.topic_name }, | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 							{ property: 'og:title', content: topicData.topic_name + ' | ' + (meta.config.title || 'NodeBB') }, | 
					
						
							| 
									
										
										
										
											2013-07-25 15:34:22 -04:00
										 |  |  | 							{ property: "og:type", content: 'article' }, | 
					
						
							| 
									
										
										
										
											2013-08-19 13:31:04 -04:00
										 |  |  | 							{ property: "og:url", content: nconf.get('url') + 'topic/' + topicData.slug }, | 
					
						
							| 
									
										
										
										
											2013-07-25 15:49:55 -04:00
										 |  |  | 							{ property: 'og:image', content: topicData.main_posts[0].picture }, | 
					
						
							| 
									
										
										
										
											2013-07-25 15:34:22 -04:00
										 |  |  | 							{ 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 } | 
					
						
							| 
									
										
										
										
											2013-07-24 19:27:25 -04:00
										 |  |  | 						] | 
					
						
							|  |  |  | 					}, function(err, header) { | 
					
						
							|  |  |  | 						next(err, { | 
					
						
							|  |  |  | 							header: header, | 
					
						
							|  |  |  | 							topics: topicData | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			], function(err, data) { | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 				if (err) return res.redirect('404'); | 
					
						
							| 
									
										
										
										
											2013-07-24 19:27:25 -04:00
										 |  |  | 				var topic_url = tid + (req.params.slug ? '/' + req.params.slug : ''); | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-24 19:27:25 -04:00
										 |  |  | 				res.send( | 
					
						
							|  |  |  | 					data.header + | 
					
						
							|  |  |  | 					'\n\t<noscript>\n' + templates['noscript/header'] + templates['noscript/topic'].parse(data.topics) + '\n\t</noscript>' + | 
					
						
							|  |  |  | 					'\n\t<script>templates.ready(function(){ajaxify.go("topic/' + topic_url + '");});</script>' + | 
					
						
							|  |  |  | 					templates['footer'] | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		app.get('/category/:category_id/:slug?', function(req, res) { | 
					
						
							|  |  |  | 			var cid = req.params.category_id; | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-21 16:32:59 -04:00
										 |  |  | 			if (cid.match(/^\d+\.rss$/)) { | 
					
						
							| 
									
										
										
										
											2013-09-04 13:52:28 -04:00
										 |  |  | 				cid = cid.slice(0, -4); | 
					
						
							|  |  |  | 				var	rssPath = path.join(__dirname, '../', 'feeds/categories', cid + '.rss'), | 
					
						
							|  |  |  | 					loadFeed = function() { | 
					
						
							|  |  |  | 						fs.readFile(rssPath, function (err, data) { | 
					
						
							|  |  |  | 							if (err) res.type('text').send(404, "Unable to locate an rss feed at this location."); | 
					
						
							|  |  |  | 							else res.type('xml').set('Content-Length', data.length).send(data); | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (!fs.existsSync(rssPath)) { | 
					
						
							| 
									
										
										
										
											2013-09-15 07:58:02 -04:00
										 |  |  | 					feed.updateCategory(cid, function(err) { | 
					
						
							|  |  |  | 						if (err) res.redirect('/404'); | 
					
						
							|  |  |  | 						else loadFeed(); | 
					
						
							| 
									
										
										
										
											2013-09-04 13:52:28 -04:00
										 |  |  | 					}); | 
					
						
							|  |  |  | 				} else loadFeed(); | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-07-21 16:16:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-24 19:27:25 -04:00
										 |  |  | 			async.waterfall([ | 
					
						
							|  |  |  | 				function(next) { | 
					
						
							|  |  |  | 					categories.getCategoryById(cid, 0, function(err, categoryData) { | 
					
						
							| 
									
										
										
										
											2013-08-30 14:47:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 						if(categoryData) { | 
					
						
							|  |  |  | 							if(categoryData.disabled === '1') | 
					
						
							|  |  |  | 								return next(new Error('Category disabled'), null); | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2013-07-24 19:27:25 -04:00
										 |  |  | 						next(err, categoryData); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				function(categoryData, next) { | 
					
						
							|  |  |  | 					app.build_header({ | 
					
						
							|  |  |  | 						req: req, | 
					
						
							|  |  |  | 						res: res, | 
					
						
							|  |  |  | 						metaTags: [ | 
					
						
							|  |  |  | 							{ name: 'title', content: categoryData.category_name }, | 
					
						
							| 
									
										
										
										
											2013-07-25 15:34:22 -04:00
										 |  |  | 							{ name: 'description', content: categoryData.category_description }, | 
					
						
							|  |  |  | 							{ property: "og:type", content: 'website' } | 
					
						
							| 
									
										
										
										
											2013-07-24 19:27:25 -04:00
										 |  |  | 						] | 
					
						
							|  |  |  | 					}, function(err, header) { | 
					
						
							|  |  |  | 						next(err, { | 
					
						
							|  |  |  | 							header: header, | 
					
						
							|  |  |  | 							categories: categoryData | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			], function(err, data) { | 
					
						
							| 
									
										
										
										
											2013-07-22 20:29:51 -04:00
										 |  |  | 				if(err) return res.redirect('404'); | 
					
						
							| 
									
										
										
										
											2013-07-24 19:27:25 -04:00
										 |  |  | 				var category_url = cid + (req.params.slug ? '/' + req.params.slug : ''); | 
					
						
							| 
									
										
										
										
											2013-07-23 17:21:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-24 19:27:25 -04:00
										 |  |  | 				res.send( | 
					
						
							|  |  |  | 					data.header + | 
					
						
							|  |  |  | 					'\n\t<noscript>\n' + templates['noscript/header'] + templates['noscript/category'].parse(data.categories) + '\n\t</noscript>' + | 
					
						
							|  |  |  | 					'\n\t<script>templates.ready(function(){ajaxify.go("category/' + category_url + '");});</script>' + | 
					
						
							|  |  |  | 					templates['footer'] | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2013-05-30 16:02:13 -04:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-05-30 16:02:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 		app.get('/confirm/:code', function(req, res) { | 
					
						
							| 
									
										
										
										
											2013-08-04 14:08:05 -04:00
										 |  |  | 			app.build_header({ req: req, res: res }, function(err, header) { | 
					
						
							| 
									
										
										
										
											2013-07-24 18:54:14 -04:00
										 |  |  | 				res.send(header + '<script>templates.ready(function(){ajaxify.go("confirm/' + req.params.code + '");});</script>' + templates['footer']); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-05-30 16:02:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-17 22:35:16 -04:00
										 |  |  | 		app.get('/sitemap.xml', function(req, res) { | 
					
						
							|  |  |  | 			var	sitemap = require('./sitemap.js'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			sitemap.render(function(xml) { | 
					
						
							|  |  |  | 				res.type('xml').set('Content-Length', xml.length).send(xml); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-20 11:19:08 -04:00
										 |  |  | 		app.get('/robots.txt', function(req, res) { | 
					
						
							|  |  |  | 			res.set('Content-Type', 'text/plain'); | 
					
						
							|  |  |  | 			res.send(	"User-agent: *\n" + | 
					
						
							|  |  |  | 						"Disallow: \n" + | 
					
						
							|  |  |  | 						"Disallow: /admin/\n" + | 
					
						
							| 
									
										
										
										
											2013-08-19 13:31:04 -04:00
										 |  |  | 						"Sitemap: " + nconf.get('url') + "sitemap.xml"); | 
					
						
							| 
									
										
										
										
											2013-07-20 11:19:08 -04:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 		app.get('/cid/:cid', function(req, res) { | 
					
						
							| 
									
										
										
										
											2013-07-22 16:47:41 -04:00
										 |  |  | 			categories.getCategoryData(req.params.cid, function(err, data) { | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 				if(data) | 
					
						
							|  |  |  | 					res.send(data); | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					res.send(404, "Category doesn't exist!"); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-07-05 16:44:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 		app.get('/tid/:tid', function(req, res) { | 
					
						
							|  |  |  | 			topics.getTopicData(req.params.tid, function(data){ | 
					
						
							|  |  |  | 				if(data) | 
					
						
							|  |  |  | 					res.send(data); | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					res.send(404, "Topic doesn't exist!"); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-05-28 14:11:27 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-04-25 21:55:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-10 16:22:03 -04:00
										 |  |  | 		app.get('/pid/:pid', function(req, res) { | 
					
						
							|  |  |  | 			posts.getPostData(req.params.pid, function(data){ | 
					
						
							|  |  |  | 				if(data) | 
					
						
							|  |  |  | 					res.send(data); | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					res.send(404, "Post doesn't exist!"); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-23 03:07:27 +08:00
										 |  |  | 		app.get('/outgoing', function(req, res) { | 
					
						
							| 
									
										
										
										
											2013-08-08 15:04:22 -04:00
										 |  |  | 			if (!req.query.url) return res.redirect('/404'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			app.build_header({ req: req, res: res }, function(err, header) { | 
					
						
							|  |  |  | 				res.send( | 
					
						
							|  |  |  | 					header + | 
					
						
							| 
									
										
										
										
											2013-08-26 12:22:55 -04:00
										 |  |  | 					'\n\t<script>templates.ready(function(){ajaxify.go("outgoing?url=' + encodeURIComponent(req.query.url) + '", null, null, true);});</script>' + | 
					
						
							| 
									
										
										
										
											2013-08-08 15:04:22 -04:00
										 |  |  | 					templates['footer'] | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-08-03 20:54:16 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		app.get('/search', function(req, res) { | 
					
						
							|  |  |  | 			app.build_header({ req: req, res: res }, function(err, header) { | 
					
						
							|  |  |  | 				res.send(header + app.create_route("search", null, "search") + templates['footer']); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-03 20:54:16 -04:00
										 |  |  | 		app.get('/search/:term', function(req, res) { | 
					
						
							|  |  |  | 			app.build_header({ req: req, res: res }, function(err, header) { | 
					
						
							|  |  |  | 				res.send(header + app.create_route("search/"+req.params.term, null, "search") + templates['footer']); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 15:46:15 -04:00
										 |  |  | 		app.get('/reindex', function(req, res) { | 
					
						
							|  |  |  | 			topics.reIndexAll(function(err) { | 
					
						
							|  |  |  | 				if(err) { | 
					
						
							| 
									
										
										
										
											2013-08-29 13:40:04 -04:00
										 |  |  | 					return res.json(err); | 
					
						
							| 
									
										
										
										
											2013-08-06 15:46:15 -04:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-08-29 13:40:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				user.reIndexAll(function(err) { | 
					
						
							|  |  |  | 					if(err) { | 
					
						
							|  |  |  | 						return res.json(err); | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						res.send('Topics and users reindexed'); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2013-08-06 15:46:15 -04:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-05-05 13:05:05 -04:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2013-06-20 12:41:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-22 16:51:32 +00:00
										 |  |  | }(WebServer)); | 
					
						
							| 
									
										
										
										
											2013-04-22 15:17:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-15 09:09:13 -04:00
										 |  |  | server.listen(nconf.get('PORT') || nconf.get('port')); | 
					
						
							| 
									
										
										
										
											2013-07-05 11:39:14 -05:00
										 |  |  | global.server = server; |