| 
									
										
										
										
											2017-02-18 01:56:23 -07:00
										 |  |  | 'use strict'; | 
					
						
							| 
									
										
										
										
											2014-03-02 22:12:08 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | const nconf = require('nconf'); | 
					
						
							|  |  |  | const validator = require('validator'); | 
					
						
							| 
									
										
										
										
											2016-01-06 12:49:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | const meta = require('../meta'); | 
					
						
							|  |  |  | const user = require('../user'); | 
					
						
							|  |  |  | const plugins = require('../plugins'); | 
					
						
							|  |  |  | const privileges = require('../privileges'); | 
					
						
							|  |  |  | const helpers = require('./helpers'); | 
					
						
							| 
									
										
										
										
											2014-02-27 14:56:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | const Controllers = module.exports; | 
					
						
							| 
									
										
										
										
											2017-03-02 14:57:33 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-25 11:50:33 -05:00
										 |  |  | Controllers.ping = require('./ping'); | 
					
						
							| 
									
										
										
										
											2017-11-04 08:51:44 -06:00
										 |  |  | Controllers.home = require('./home'); | 
					
						
							| 
									
										
										
										
											2017-03-02 14:57:33 +03:00
										 |  |  | Controllers.topics = require('./topics'); | 
					
						
							|  |  |  | Controllers.posts = require('./posts'); | 
					
						
							|  |  |  | Controllers.categories = require('./categories'); | 
					
						
							|  |  |  | Controllers.category = require('./category'); | 
					
						
							|  |  |  | Controllers.unread = require('./unread'); | 
					
						
							|  |  |  | Controllers.recent = require('./recent'); | 
					
						
							|  |  |  | Controllers.popular = require('./popular'); | 
					
						
							| 
									
										
										
										
											2017-12-08 19:58:12 -05:00
										 |  |  | Controllers.top = require('./top'); | 
					
						
							| 
									
										
										
										
											2017-03-02 14:57:33 +03:00
										 |  |  | Controllers.tags = require('./tags'); | 
					
						
							|  |  |  | Controllers.search = require('./search'); | 
					
						
							| 
									
										
										
										
											2017-03-02 16:11:11 +03:00
										 |  |  | Controllers.user = require('./user'); | 
					
						
							| 
									
										
										
										
											2017-03-02 14:57:33 +03:00
										 |  |  | Controllers.users = require('./users'); | 
					
						
							|  |  |  | Controllers.groups = require('./groups'); | 
					
						
							|  |  |  | Controllers.accounts = require('./accounts'); | 
					
						
							|  |  |  | Controllers.authentication = require('./authentication'); | 
					
						
							|  |  |  | Controllers.api = require('./api'); | 
					
						
							|  |  |  | Controllers.admin = require('./admin'); | 
					
						
							|  |  |  | Controllers.globalMods = require('./globalmods'); | 
					
						
							|  |  |  | Controllers.mods = require('./mods'); | 
					
						
							|  |  |  | Controllers.sitemap = require('./sitemap'); | 
					
						
							| 
									
										
										
										
											2017-03-06 21:00:20 +01:00
										 |  |  | Controllers.osd = require('./osd'); | 
					
						
							| 
									
										
										
										
											2017-03-02 14:57:33 +03:00
										 |  |  | Controllers['404'] = require('./404'); | 
					
						
							|  |  |  | Controllers.errors = require('./errors'); | 
					
						
							| 
									
										
										
										
											2017-11-05 14:05:21 -05:00
										 |  |  | Controllers.composer = require('./composer'); | 
					
						
							| 
									
										
										
										
											2014-02-27 14:56:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 13:16:29 -04:00
										 |  |  | Controllers.write = require('./write'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-14 20:18:47 -05:00
										 |  |  | Controllers.reset = async function (req, res) { | 
					
						
							| 
									
										
										
										
											2019-05-09 15:51:36 -04:00
										 |  |  | 	if (meta.config['password:disableEdit']) { | 
					
						
							|  |  |  | 		return helpers.notAllowed(req, res); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-27 17:10:56 -04:00
										 |  |  | 	res.locals.metaTags = { | 
					
						
							|  |  |  | 		...res.locals.metaTags, | 
					
						
							|  |  |  | 		name: 'robots', | 
					
						
							|  |  |  | 		content: 'noindex', | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 09:52:20 -04:00
										 |  |  | 	const renderReset = function (code, valid) { | 
					
						
							|  |  |  | 		res.render('reset_code', { | 
					
						
							|  |  |  | 			valid: valid, | 
					
						
							|  |  |  | 			displayExpiryNotice: req.session.passwordExpired, | 
					
						
							|  |  |  | 			code: code, | 
					
						
							| 
									
										
										
										
											2018-10-21 16:47:51 -04:00
										 |  |  | 			minimumPasswordLength: meta.config.minimumPasswordLength, | 
					
						
							|  |  |  | 			minimumPasswordStrength: meta.config.minimumPasswordStrength, | 
					
						
							| 
									
										
										
										
											2018-07-04 09:52:20 -04:00
										 |  |  | 			breadcrumbs: helpers.buildBreadcrumbs([ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					text: '[[reset_password:reset_password]]', | 
					
						
							|  |  |  | 					url: '/reset', | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					text: '[[reset_password:update_password]]', | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			]), | 
					
						
							|  |  |  | 			title: '[[pages:reset]]', | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		delete req.session.passwordExpired; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-29 01:06:48 -05:00
										 |  |  | 	if (req.params.code) { | 
					
						
							| 
									
										
										
										
											2018-07-04 09:52:20 -04:00
										 |  |  | 		req.session.reset_code = req.params.code; | 
					
						
							| 
									
										
										
										
											2019-03-20 16:30:33 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (req.session.reset_code) { | 
					
						
							| 
									
										
										
										
											2018-07-04 09:52:20 -04:00
										 |  |  | 		// Validate and save to local variable before removing from session
 | 
					
						
							| 
									
										
										
										
											2020-11-14 20:18:47 -05:00
										 |  |  | 		const valid = await user.reset.validate(req.session.reset_code); | 
					
						
							|  |  |  | 		renderReset(req.session.reset_code, valid); | 
					
						
							|  |  |  | 		delete req.session.reset_code; | 
					
						
							| 
									
										
										
										
											2015-01-29 01:06:48 -05:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		res.render('reset', { | 
					
						
							| 
									
										
										
										
											2016-10-18 15:32:28 +03:00
										 |  |  | 			code: null, | 
					
						
							| 
									
										
										
										
											2017-04-07 20:57:00 +00:00
										 |  |  | 			breadcrumbs: helpers.buildBreadcrumbs([{ | 
					
						
							|  |  |  | 				text: '[[reset_password:reset_password]]', | 
					
						
							|  |  |  | 			}]), | 
					
						
							| 
									
										
										
										
											2017-02-17 19:31:21 -07:00
										 |  |  | 			title: '[[pages:reset]]', | 
					
						
							| 
									
										
										
										
											2015-01-29 01:06:48 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-03-03 17:16:53 -05:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-02-27 14:56:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-14 20:18:47 -05:00
										 |  |  | Controllers.login = async function (req, res) { | 
					
						
							|  |  |  | 	const data = { loginFormEntry: [] }; | 
					
						
							|  |  |  | 	const loginStrategies = require('../routes/authentication').getLoginStrategies(); | 
					
						
							|  |  |  | 	const registrationType = meta.config.registrationType || 'normal'; | 
					
						
							|  |  |  | 	const allowLoginWith = (meta.config.allowLoginWith || 'username-email'); | 
					
						
							| 
									
										
										
										
											2015-06-27 21:26:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-14 20:18:47 -05:00
										 |  |  | 	let errorText; | 
					
						
							| 
									
										
										
										
											2016-05-09 11:40:42 -04:00
										 |  |  | 	if (req.query.error === 'csrf-invalid') { | 
					
						
							|  |  |  | 		errorText = '[[error:csrf-invalid]]'; | 
					
						
							| 
									
										
										
										
											2016-07-25 12:15:02 -04:00
										 |  |  | 	} else if (req.query.error) { | 
					
						
							| 
									
										
										
										
											2016-08-30 13:19:04 +03:00
										 |  |  | 		errorText = validator.escape(String(req.query.error)); | 
					
						
							| 
									
										
										
										
											2016-05-09 11:40:42 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-04 10:16:16 -05:00
										 |  |  | 	if (req.headers['x-return-to']) { | 
					
						
							|  |  |  | 		req.session.returnTo = req.headers['x-return-to']; | 
					
						
							| 
									
										
										
										
											2016-10-25 16:52:03 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-08 14:03:22 -05:00
										 |  |  | 	// Occasionally, x-return-to is passed a full url.
 | 
					
						
							| 
									
										
										
										
											2021-03-04 10:58:27 -05:00
										 |  |  | 	req.session.returnTo = req.session.returnTo && req.session.returnTo.replace(nconf.get('base_url'), '').replace(nconf.get('relative_path'), ''); | 
					
						
							| 
									
										
										
										
											2021-03-04 10:16:16 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-12 16:15:44 -05:00
										 |  |  | 	data.alternate_logins = loginStrategies.length > 0; | 
					
						
							|  |  |  | 	data.authentication = loginStrategies; | 
					
						
							| 
									
										
										
										
											2019-06-04 11:10:20 -04:00
										 |  |  | 	data.allowRegistration = registrationType === 'normal'; | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 	data.allowLoginWith = `[[login:${allowLoginWith}]]`; | 
					
						
							| 
									
										
										
										
											2017-04-07 20:57:00 +00:00
										 |  |  | 	data.breadcrumbs = helpers.buildBreadcrumbs([{ | 
					
						
							|  |  |  | 		text: '[[global:login]]', | 
					
						
							|  |  |  | 	}]); | 
					
						
							| 
									
										
										
										
											2016-05-09 11:40:42 -04:00
										 |  |  | 	data.error = req.flash('error')[0] || errorText; | 
					
						
							| 
									
										
										
										
											2015-08-26 15:54:54 -04:00
										 |  |  | 	data.title = '[[pages:login]]'; | 
					
						
							| 
									
										
										
										
											2019-05-09 15:51:36 -04:00
										 |  |  | 	data.allowPasswordReset = !meta.config['password:disableEdit']; | 
					
						
							| 
									
										
										
										
											2014-02-27 16:52:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-14 20:18:47 -05:00
										 |  |  | 	const hasLoginPrivilege = await privileges.global.canGroup('local:login', 'registered-users'); | 
					
						
							|  |  |  | 	data.allowLocalLogin = hasLoginPrivilege || parseInt(req.query.local, 10) === 1; | 
					
						
							| 
									
										
										
										
											2018-09-29 06:49:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-14 20:18:47 -05:00
										 |  |  | 	if (!data.allowLocalLogin && !data.allowRegistration && data.alternate_logins && data.authentication.length === 1) { | 
					
						
							| 
									
										
										
										
											2020-12-03 10:29:18 -05:00
										 |  |  | 		return helpers.redirect(res, { external: data.authentication[0].url }); | 
					
						
							| 
									
										
										
										
											2020-11-14 20:18:47 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (req.loggedIn) { | 
					
						
							|  |  |  | 		const userData = await user.getUserFields(req.uid, ['username', 'email']); | 
					
						
							|  |  |  | 		data.username = allowLoginWith === 'email' ? userData.email : userData.username; | 
					
						
							|  |  |  | 		data.alternate_logins = false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	res.render('login', data); | 
					
						
							| 
									
										
										
										
											2014-02-27 16:52:46 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | Controllers.register = async function (req, res, next) { | 
					
						
							|  |  |  | 	const registrationType = meta.config.registrationType || 'normal'; | 
					
						
							| 
									
										
										
										
											2015-06-27 21:26:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (registrationType === 'disabled') { | 
					
						
							| 
									
										
										
										
											2019-06-04 11:10:20 -04:00
										 |  |  | 		return setImmediate(next); | 
					
						
							| 
									
										
										
										
											2014-09-25 11:29:53 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-03-11 04:10:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | 	let errorText; | 
					
						
							| 
									
										
										
										
											2021-02-05 11:05:21 -05:00
										 |  |  | 	const returnTo = (req.headers['x-return-to'] || '').replace(nconf.get('base_url') + nconf.get('relative_path'), ''); | 
					
						
							| 
									
										
										
										
											2016-05-09 11:40:42 -04:00
										 |  |  | 	if (req.query.error === 'csrf-invalid') { | 
					
						
							|  |  |  | 		errorText = '[[error:csrf-invalid]]'; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | 	try { | 
					
						
							|  |  |  | 		if (registrationType === 'invite-only' || registrationType === 'admin-invite-only') { | 
					
						
							| 
									
										
										
										
											2021-01-24 13:59:00 -05:00
										 |  |  | 			try { | 
					
						
							|  |  |  | 				await user.verifyInvitation(req.query); | 
					
						
							|  |  |  | 			} catch (e) { | 
					
						
							| 
									
										
										
										
											2021-01-24 14:01:16 -05:00
										 |  |  | 				return res.render('400', { | 
					
						
							| 
									
										
										
										
											2021-01-24 13:59:00 -05:00
										 |  |  | 					error: e.message, | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-09-12 10:21:18 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 11:05:21 -05:00
										 |  |  | 		if (returnTo) { | 
					
						
							|  |  |  | 			req.session.returnTo = returnTo; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | 		const loginStrategies = require('../routes/authentication').getLoginStrategies(); | 
					
						
							|  |  |  | 		res.render('register', { | 
					
						
							|  |  |  | 			'register_window:spansize': loginStrategies.length ? 'col-md-6' : 'col-md-12', | 
					
						
							|  |  |  | 			alternate_logins: !!loginStrategies.length, | 
					
						
							|  |  |  | 			authentication: loginStrategies, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			minimumUsernameLength: meta.config.minimumUsernameLength, | 
					
						
							|  |  |  | 			maximumUsernameLength: meta.config.maximumUsernameLength, | 
					
						
							|  |  |  | 			minimumPasswordLength: meta.config.minimumPasswordLength, | 
					
						
							|  |  |  | 			minimumPasswordStrength: meta.config.minimumPasswordStrength, | 
					
						
							|  |  |  | 			breadcrumbs: helpers.buildBreadcrumbs([{ | 
					
						
							| 
									
										
										
										
											2017-11-05 14:05:21 -05:00
										 |  |  | 				text: '[[register:register]]', | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | 			}]), | 
					
						
							|  |  |  | 			regFormEntry: [], | 
					
						
							|  |  |  | 			error: req.flash('error')[0] || errorText, | 
					
						
							|  |  |  | 			title: '[[pages:register]]', | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} catch (err) { | 
					
						
							|  |  |  | 		next(err); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-27 16:52:46 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | Controllers.registerInterstitial = async function (req, res, next) { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:05:40 -04:00
										 |  |  | 	if (!req.session.hasOwnProperty('registration')) { | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 		return res.redirect(`${nconf.get('relative_path')}/register`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:05:40 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | 	try { | 
					
						
							| 
									
										
										
										
											2020-11-20 16:06:26 -05:00
										 |  |  | 		const data = await plugins.hooks.fire('filter:register.interstitial', { | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | 			userData: req.session.registration, | 
					
						
							|  |  |  | 			interstitials: [], | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:05:40 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | 		if (!data.interstitials.length) { | 
					
						
							|  |  |  | 			// No interstitials, redirect to home
 | 
					
						
							|  |  |  | 			const returnTo = req.session.returnTo || req.session.registration.returnTo; | 
					
						
							|  |  |  | 			delete req.session.registration; | 
					
						
							|  |  |  | 			return helpers.redirect(res, returnTo || '/'); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-08-16 19:46:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 02:07:29 -07:00
										 |  |  | 		const renders = data.interstitials.map( | 
					
						
							|  |  |  | 			interstitial => req.app.renderAsync(interstitial.template, interstitial.data || {}) | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | 		const sections = await Promise.all(renders); | 
					
						
							| 
									
										
										
										
											2017-02-28 16:42:10 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-21 23:02:50 -04:00
										 |  |  | 		res.render('registerComplete', { | 
					
						
							|  |  |  | 			title: '[[pages:registration-complete]]', | 
					
						
							|  |  |  | 			errors: req.flash('errors'), | 
					
						
							|  |  |  | 			sections: sections, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} catch (err) { | 
					
						
							|  |  |  | 		next(err); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-06-08 16:05:40 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | Controllers.confirmEmail = function (req, res) { | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	user.email.confirmByCode(req.params.code, (err) => { | 
					
						
							| 
									
										
										
										
											2015-02-25 14:10:00 -05:00
										 |  |  | 		res.render('confirm', { | 
					
						
							| 
									
										
										
										
											2016-02-25 23:04:19 -05:00
										 |  |  | 			error: err ? err.message : '', | 
					
						
							|  |  |  | 			title: '[[pages:confirm]]', | 
					
						
							| 
									
										
										
										
											2015-02-25 14:10:00 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-02-27 17:04:41 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-02-27 15:06:39 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 17:16:06 -05:00
										 |  |  | Controllers.robots = function (req, res) { | 
					
						
							|  |  |  | 	res.set('Content-Type', 'text/plain'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 14:55:57 -04:00
										 |  |  | 	if (meta.config['robots:txt']) { | 
					
						
							|  |  |  | 		res.send(meta.config['robots:txt']); | 
					
						
							| 
									
										
										
										
											2014-02-27 17:16:06 -05:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 		res.send(`${'User-agent: *\n' + | 
					
						
							|  |  |  | 			'Disallow: '}${nconf.get('relative_path')}/admin/\n` +
 | 
					
						
							|  |  |  | 			`Disallow: ${nconf.get('relative_path')}/reset/\n` + | 
					
						
							|  |  |  | 			`Disallow: ${nconf.get('relative_path')}/compose\n` + | 
					
						
							|  |  |  | 			`Sitemap: ${nconf.get('url')}/sitemap.xml`); | 
					
						
							| 
									
										
										
										
											2014-02-27 17:16:06 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-14 20:18:47 -05:00
										 |  |  | Controllers.manifest = async function (req, res) { | 
					
						
							|  |  |  | 	const manifest = { | 
					
						
							| 
									
										
										
										
											2016-10-18 15:32:28 +03:00
										 |  |  | 		name: meta.config.title || 'NodeBB', | 
					
						
							| 
									
										
										
										
											2020-04-19 19:32:49 +02:00
										 |  |  | 		short_name: meta.config['title:short'] || meta.config.title || 'NodeBB', | 
					
						
							| 
									
										
										
										
											2020-09-28 17:06:25 -04:00
										 |  |  | 		start_url: nconf.get('url'), | 
					
						
							| 
									
										
										
										
											2016-10-18 15:32:28 +03:00
										 |  |  | 		display: 'standalone', | 
					
						
							|  |  |  | 		orientation: 'portrait', | 
					
						
							| 
									
										
										
										
											2020-04-19 19:32:49 +02:00
										 |  |  | 		theme_color: meta.config.themeColor || '#ffffff', | 
					
						
							|  |  |  | 		background_color: meta.config.backgroundColor || '#ffffff', | 
					
						
							| 
									
										
										
										
											2017-02-17 19:31:21 -07:00
										 |  |  | 		icons: [], | 
					
						
							| 
									
										
										
										
											2016-10-18 15:32:28 +03:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (meta.config['brand:touchIcon']) { | 
					
						
							|  |  |  | 		manifest.icons.push({ | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-36.png`, | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 			sizes: '36x36', | 
					
						
							|  |  |  | 			type: 'image/png', | 
					
						
							| 
									
										
										
										
											2017-02-17 19:31:21 -07:00
										 |  |  | 			density: 0.75, | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 		}, { | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-48.png`, | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 			sizes: '48x48', | 
					
						
							|  |  |  | 			type: 'image/png', | 
					
						
							| 
									
										
										
										
											2017-02-17 19:31:21 -07:00
										 |  |  | 			density: 1.0, | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 		}, { | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-72.png`, | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 			sizes: '72x72', | 
					
						
							|  |  |  | 			type: 'image/png', | 
					
						
							| 
									
										
										
										
											2017-02-17 19:31:21 -07:00
										 |  |  | 			density: 1.5, | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 		}, { | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-96.png`, | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 			sizes: '96x96', | 
					
						
							|  |  |  | 			type: 'image/png', | 
					
						
							| 
									
										
										
										
											2017-02-17 19:31:21 -07:00
										 |  |  | 			density: 2.0, | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 		}, { | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-144.png`, | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 			sizes: '144x144', | 
					
						
							|  |  |  | 			type: 'image/png', | 
					
						
							| 
									
										
										
										
											2017-02-17 19:31:21 -07:00
										 |  |  | 			density: 3.0, | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 		}, { | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-192.png`, | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 			sizes: '192x192', | 
					
						
							|  |  |  | 			type: 'image/png', | 
					
						
							| 
									
										
										
										
											2017-02-17 19:31:21 -07:00
										 |  |  | 			density: 4.0, | 
					
						
							| 
									
										
										
										
											2020-04-19 19:32:49 +02:00
										 |  |  | 		}, { | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-512.png`, | 
					
						
							| 
									
										
										
										
											2020-04-19 19:32:49 +02:00
										 |  |  | 			sizes: '512x512', | 
					
						
							|  |  |  | 			type: 'image/png', | 
					
						
							|  |  |  | 			density: 10.0, | 
					
						
							| 
									
										
										
										
											2016-01-06 12:49:14 +02:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-09-29 07:49:21 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (meta.config['brand:maskableIcon']) { | 
					
						
							|  |  |  | 		manifest.icons.push({ | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			src: `${nconf.get('relative_path')}/assets/uploads/system/maskableicon-orig.png`, | 
					
						
							| 
									
										
										
										
											2020-09-29 07:49:21 -04:00
										 |  |  | 			type: 'image/png', | 
					
						
							|  |  |  | 			purpose: 'maskable', | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} else if (meta.config['brand:touchIcon']) { | 
					
						
							|  |  |  | 		manifest.icons.push({ | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-orig.png`, | 
					
						
							| 
									
										
										
										
											2020-09-29 07:49:21 -04:00
										 |  |  | 			type: 'image/png', | 
					
						
							|  |  |  | 			purpose: 'maskable', | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 16:06:26 -05:00
										 |  |  | 	const data = await plugins.hooks.fire('filter:manifest.build', { | 
					
						
							| 
									
										
										
										
											2020-11-14 20:18:47 -05:00
										 |  |  | 		req: req, | 
					
						
							|  |  |  | 		res: res, | 
					
						
							|  |  |  | 		manifest: manifest, | 
					
						
							| 
									
										
										
										
											2019-08-07 17:20:37 +02:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2020-11-14 20:18:47 -05:00
										 |  |  | 	res.status(200).json(data.manifest); | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-02 14:57:33 +03:00
										 |  |  | Controllers.outgoing = function (req, res, next) { | 
					
						
							| 
									
										
										
										
											2020-11-14 20:18:47 -05:00
										 |  |  | 	const url = req.query.url || ''; | 
					
						
							|  |  |  | 	const allowedProtocols = [ | 
					
						
							|  |  |  | 		'http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', | 
					
						
							|  |  |  | 		'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', 'webcal', | 
					
						
							|  |  |  | 	]; | 
					
						
							|  |  |  | 	const parsed = require('url').parse(url); | 
					
						
							| 
									
										
										
										
											2017-03-02 14:57:33 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-28 14:20:16 -05:00
										 |  |  | 	if (!url || !parsed.protocol || !allowedProtocols.includes(parsed.protocol.slice(0, -1))) { | 
					
						
							| 
									
										
										
										
											2017-03-02 14:57:33 +03:00
										 |  |  | 		return next(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res.render('outgoing', { | 
					
						
							| 
									
										
										
										
											2016-09-05 22:12:02 +03:00
										 |  |  | 		outgoing: validator.escape(String(url)), | 
					
						
							| 
									
										
										
										
											2016-04-25 21:53:56 +03:00
										 |  |  | 		title: meta.config.title, | 
					
						
							| 
									
										
										
										
											2017-04-07 20:57:00 +00:00
										 |  |  | 		breadcrumbs: helpers.buildBreadcrumbs([{ | 
					
						
							|  |  |  | 			text: '[[notifications:outgoing_link]]', | 
					
						
							|  |  |  | 		}]), | 
					
						
							| 
									
										
										
										
											2017-03-02 14:57:33 +03:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:04:21 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-12 10:21:18 -04:00
										 |  |  | Controllers.termsOfUse = async function (req, res, next) { | 
					
						
							| 
									
										
										
										
											2014-11-14 12:17:24 -05:00
										 |  |  | 	if (!meta.config.termsOfUse) { | 
					
						
							| 
									
										
										
										
											2015-08-28 14:31:35 -04:00
										 |  |  | 		return next(); | 
					
						
							| 
									
										
										
										
											2014-11-14 12:17:24 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-11-20 16:06:26 -05:00
										 |  |  | 	const termsOfUse = await plugins.hooks.fire('filter:parse.post', { | 
					
						
							| 
									
										
										
										
											2019-09-12 10:21:18 -04:00
										 |  |  | 		postData: { | 
					
						
							|  |  |  | 			content: meta.config.termsOfUse || '', | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2017-04-07 20:57:00 +00:00
										 |  |  | 	res.render('tos', { | 
					
						
							| 
									
										
										
										
											2019-09-12 10:21:18 -04:00
										 |  |  | 		termsOfUse: termsOfUse.postData.content, | 
					
						
							| 
									
										
										
										
											2017-04-07 20:57:00 +00:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2014-11-14 12:17:24 -05:00
										 |  |  | }; |