mirror of
				https://github.com/Ylianst/MeshCentral.git
				synced 2025-03-09 15:40:18 +00:00 
			
		
		
		
	Added CAPTCHA option when creating new accounts on login screen.
This commit is contained in:
		
							parent
							
								
									4382899468
								
							
						
					
					
						commit
						04fb1f2bf0
					
				
					 8 changed files with 102 additions and 22 deletions
				
			
		
							
								
								
									
										59
									
								
								webserver.js
									
										
									
									
									
								
							
							
						
						
									
										59
									
								
								webserver.js
									
										
									
									
									
								
							|  | @ -1359,6 +1359,26 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|         // If the email is the username, set this here.
 | ||||
|         if (domain.usernameisemail) { req.body.username = req.body.email; } | ||||
| 
 | ||||
|         // Check if there is domain.newAccountToken, check if supplied token is valid
 | ||||
|         if ((domain.newaccountspass != null) && (domain.newaccountspass != '') && (req.body.anewaccountpass != domain.newaccountspass)) { | ||||
|             parent.debug('web', 'handleCreateAccountRequest: Invalid account creation token'); | ||||
|             req.session.loginmode = 2; | ||||
|             req.session.messageid = 103; // Invalid account creation token.
 | ||||
|             if (direct === true) { handleRootRequestEx(req, res, domain); } else { res.redirect(domain.url + getQueryPortion(req)); } | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         // If needed, check the new account creation CAPTCHA
 | ||||
|         if ((domain.newaccountscaptcha != null) && (domain.newaccountscaptcha !== false)) { | ||||
|             const c = parent.decodeCookie(req.body.captchaargs, parent.loginCookieEncryptionKey, 10); // 10 minute timeout
 | ||||
|             if ((c == null) || (c.type != 'newAccount') || (typeof c.captcha != 'string') || (c.captcha.length < 5) || (c.captcha != req.body.anewaccountcaptcha)) { | ||||
|                 req.session.loginmode = 2; | ||||
|                 req.session.messageid = 117; // Invalid security check
 | ||||
|                 if (direct === true) { handleRootRequestEx(req, res, domain); } else { res.redirect(domain.url + getQueryPortion(req)); } | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // Accounts that start with ~ are not allowed
 | ||||
|         if ((typeof req.body.username != 'string') || (req.body.username.length < 1) || (req.body.username[0] == '~')) { | ||||
|             parent.debug('web', 'handleCreateAccountRequest: unable to create account (0)'); | ||||
|  | @ -1423,14 +1443,6 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|                             req.session.messageid = 102; // Existing account with this email address.
 | ||||
|                             if (direct === true) { handleRootRequestEx(req, res, domain); } else { res.redirect(domain.url + getQueryPortion(req)); } | ||||
|                         } else { | ||||
|                             // Check if there is domain.newAccountToken, check if supplied token is valid
 | ||||
|                             if ((domain.newaccountspass != null) && (domain.newaccountspass != '') && (req.body.anewaccountpass != domain.newaccountspass)) { | ||||
|                                 parent.debug('web', 'handleCreateAccountRequest: Invalid account creation token'); | ||||
|                                 req.session.loginmode = 2; | ||||
|                                 req.session.messageid = 103; // Invalid account creation token.
 | ||||
|                                 if (direct === true) { handleRootRequestEx(req, res, domain); } else { res.redirect(domain.url + getQueryPortion(req)); } | ||||
|                                 return; | ||||
|                             } | ||||
|                             // Check if user exists
 | ||||
|                             if (obj.users['user/' + domain.id + '/' + req.body.username.toLowerCase()]) { | ||||
|                                 parent.debug('web', 'handleCreateAccountRequest: Username already exists'); | ||||
|  | @ -3054,20 +3066,29 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|             twoFactorTimeout = domain.passwordrequirements.twofactortimeout * 1000; | ||||
|         } | ||||
| 
 | ||||
|         // Setup CAPTCHA if needed
 | ||||
|         var newAccountCaptcha = '', newAccountCaptchaImage = ''; | ||||
|         if ((domain.newaccountscaptcha != null) && (domain.newaccountscaptcha !== false)) { | ||||
|             newAccountCaptcha = obj.parent.encodeCookie({ type: 'newAccount', captcha: require('svg-captcha').randomText(5) }, obj.parent.loginCookieEncryptionKey); | ||||
|             newAccountCaptchaImage = 'newAccountCaptcha.ashx?x=' + newAccountCaptcha; | ||||
|         } | ||||
| 
 | ||||
|         // Render the login page
 | ||||
|         render(req, res, | ||||
|             getRenderPage((domain.sitestyle == 2) ? 'login2' : 'login', req, domain), | ||||
|             getRenderArgs({ | ||||
|                 loginmode: loginmode, | ||||
|                 rootCertLink: getRootCertLink(domain), | ||||
|                 newAccount: newAccountsAllowed, | ||||
|                 newAccountPass: (((domain.newaccountspass == null) || (domain.newaccountspass == '')) ? 0 : 1), | ||||
|                 newAccount: newAccountsAllowed, // True if new accounts are allowed from the login page
 | ||||
|                 newAccountPass: (((domain.newaccountspass == null) || (domain.newaccountspass == '')) ? 0 : 1), // 1 if new account creation requires password
 | ||||
|                 newAccountCaptcha: newAccountCaptcha, // If new account creation requires a CAPTCHA, this string will not be empty
 | ||||
|                 newAccountCaptchaImage: newAccountCaptchaImage, // Set to the URL of the CAPTCHA image
 | ||||
|                 serverDnsName: obj.getWebServerName(domain), | ||||
|                 serverPublicPort: httpsPort, | ||||
|                 passlogin: (typeof domain.showpasswordlogin == 'boolean') ? domain.showpasswordlogin : true, | ||||
|                 emailcheck: emailcheck, | ||||
|                 features: features, | ||||
|                 sessiontime: (args.sessiontime) ? args.sessiontime : 60, | ||||
|                 sessiontime: (args.sessiontime) ? args.sessiontime : 60, // Session time in minutes, 60 minutes is the default
 | ||||
|                 passRequirements: passRequirements, | ||||
|                 customui: customui, | ||||
|                 footer: (domain.loginfooter == null) ? '' : domain.loginfooter, | ||||
|  | @ -3195,6 +3216,17 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // Handle new account Captcha GET
 | ||||
|     function handleNewAccountCaptchaRequest(req, res) { | ||||
|         const domain = checkUserIpAddress(req, res); | ||||
|         if (domain == null) { return; } | ||||
|         if ((domain.newaccountscaptcha == null) || (domain.newaccountscaptcha === false) || (req.query.x == null)) { res.sendStatus(404); return; } | ||||
|         const c = obj.parent.decodeCookie(req.query.x, obj.parent.loginCookieEncryptionKey); | ||||
|         if ((c == null) || (c.type !== 'newAccount') || (typeof c.captcha != 'string')) { res.sendStatus(404); return; } | ||||
|         res.type('svg'); | ||||
|         res.status(200).end(require('svg-captcha')(c.captcha, {})); | ||||
|     } | ||||
| 
 | ||||
|     // Handle Captcha GET
 | ||||
|     function handleCaptchaGetRequest(req, res) { | ||||
|         const domain = checkUserIpAddress(req, res); | ||||
|  | @ -6104,6 +6136,11 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|                 obj.app.get(url + 'pluginHandler.js', obj.handlePluginJS); | ||||
|             } | ||||
| 
 | ||||
|             // New account CAPTCHA request
 | ||||
|             if ((domain.newaccountscaptcha != null) && (domain.newaccountscaptcha !== false)) { | ||||
|                 obj.app.get(url + 'newAccountCaptcha.ashx', handleNewAccountCaptchaRequest); | ||||
|             } | ||||
| 
 | ||||
|             // Check CrowdSec Bounser if configured
 | ||||
|             if (parent.crowdSecBounser != null) { | ||||
|                 obj.app.get(url + 'captcha.ashx', handleCaptchaGetRequest); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue