mirror of
				https://github.com/Ylianst/MeshCentral.git
				synced 2025-03-09 15:40:18 +00:00 
			
		
		
		
	Web socket connection error, #
This commit is contained in:
		
							parent
							
								
									2215fab441
								
							
						
					
					
						commit
						4c3a82a552
					
				
					 4 changed files with 16430 additions and 12 deletions
				
			
		|  | @ -63,7 +63,7 @@ | |||
|         "certificatePrivateKeyPassword": { "type": "array", "default": null, "description": "List of passwords used to decrypt PKCK#8 .key files that are in the meshcentral-data folder." }, | ||||
|         "sessionTime": { "type": "integer", "default": 60, "description": "Duration of a session cookie in minutes. Changing this affects how often the session needs to be automatically refreshed." }, | ||||
|         "sessionKey": { "type": "string", "default": null, "description": "Password used to encrypt the MeshCentral web session cookies. If null, a random one is generated each time the server starts." }, | ||||
|         "cookieSameSite": { "type": "string", "default": "lax", "enum": ["strict", "lax", "none"] }, | ||||
|         "sessionSameSite": { "type": "string", "default": "lax", "enum": ["strict", "lax", "none"] }, | ||||
|         "dbEncryptKey": { "type": "string" }, | ||||
|         "dbRecordsEncryptKey": { "type": "string", "default": null }, | ||||
|         "dbRecordsDecryptKey": { "type": "string", "default": null }, | ||||
|  |  | |||
							
								
								
									
										8212
									
								
								webserver-broken.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8212
									
								
								webserver-broken.js
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										8205
									
								
								webserver-old.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8205
									
								
								webserver-old.js
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										23
									
								
								webserver.js
									
										
									
									
									
								
							
							
						
						
									
										23
									
								
								webserver.js
									
										
									
									
									
								
							|  | @ -1168,7 +1168,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|                                 var maxCookieAge = domain.twofactorcookiedurationdays; | ||||
|                                 if (typeof maxCookieAge != 'number') { maxCookieAge = 30; } | ||||
|                                 const twoFactorCookie = obj.parent.encodeCookie({ userid: user._id, expire: maxCookieAge * 24 * 60 /*, ip: req.clientIp*/ }, obj.parent.loginCookieEncryptionKey); | ||||
|                                 res.cookie('twofactor', twoFactorCookie, { maxAge: (maxCookieAge * 24 * 60 * 60 * 1000), httpOnly: true, sameSite: parent.config.settings.cookiesamesite, secure: true }); | ||||
|                                 res.cookie('twofactor', twoFactorCookie, { maxAge: (maxCookieAge * 24 * 60 * 60 * 1000), httpOnly: true, sameSite: parent.config.settings.sessionsamesite, secure: true }); | ||||
|                             } | ||||
| 
 | ||||
|                             // Check if email address needs to be confirmed
 | ||||
|  | @ -2625,7 +2625,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|             setSessionRandom(req); | ||||
|         } else if (req.query.login && (obj.parent.loginCookieEncryptionKey != null)) { | ||||
|             var loginCookie = obj.parent.decodeCookie(req.query.login, obj.parent.loginCookieEncryptionKey, 60); // 60 minute timeout
 | ||||
|             //if ((loginCookie != null) && (loginCookie.ip != null) && checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // If the cookie if binded to an IP address, check here.
 | ||||
|             //if ((loginCookie != null) && (loginCookie.ip != null) && !checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // If the cookie if binded to an IP address, check here.
 | ||||
|             if ((loginCookie != null) && (loginCookie.a == 3) && (loginCookie.u != null) && (loginCookie.u.split('/')[1] == domain.id)) { | ||||
|                 // If a login cookie was provided, setup the session here.
 | ||||
|                 parent.debug('web', 'handleRootRequestEx: cookie auth ok.'); | ||||
|  | @ -3087,7 +3087,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|                             var maxCookieAge = domain.twofactorcookiedurationdays; | ||||
|                             if (typeof maxCookieAge != 'number') { maxCookieAge = 30; } | ||||
|                             const twoFactorCookie = obj.parent.encodeCookie({ userid: cookie.u, expire: maxCookieAge * 24 * 60 /*, ip: req.clientIp*/ }, obj.parent.loginCookieEncryptionKey); | ||||
|                             res.cookie('twofactor', twoFactorCookie, { maxAge: (maxCookieAge * 24 * 60 * 60 * 1000), httpOnly: true, sameSite: parent.config.settings.cookiesamesite, secure: true }); | ||||
|                             res.cookie('twofactor', twoFactorCookie, { maxAge: (maxCookieAge * 24 * 60 * 60 * 1000), httpOnly: true, sameSite: parent.config.settings.sessionsamesite, secure: true }); | ||||
|                         } | ||||
| 
 | ||||
|                         handleRootRequestEx(req, res, domain); | ||||
|  | @ -3853,7 +3853,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|             // If an authentication cookie is embedded in the form, use that.
 | ||||
|             if ((fields != null) && (fields.auth != null) && (fields.auth.length == 1) && (typeof fields.auth[0] == 'string')) { | ||||
|                 var loginCookie = obj.parent.decodeCookie(fields.auth[0], obj.parent.loginCookieEncryptionKey, 60); // 60 minute timeout
 | ||||
|                 if ((loginCookie != null) && (loginCookie.ip != null) && checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // Check cookie IP binding.
 | ||||
|                 if ((loginCookie != null) && (loginCookie.ip != null) && !checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // Check cookie IP binding.
 | ||||
|                 if ((loginCookie != null) && (domain.id == loginCookie.domainid)) { authUserid = loginCookie.userid; } // Use cookie authentication
 | ||||
|             } | ||||
|             if (authUserid == null) { res.sendStatus(401); return; } | ||||
|  | @ -3896,7 +3896,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|             // If an authentication cookie is embedded in the form, use that.
 | ||||
|             if ((fields != null) && (fields.auth != null) && (fields.auth.length == 1) && (typeof fields.auth[0] == 'string')) { | ||||
|                 var loginCookie = obj.parent.decodeCookie(fields.auth[0], obj.parent.loginCookieEncryptionKey, 60); // 60 minute timeout
 | ||||
|                 if ((loginCookie != null) && (loginCookie.ip != null) && checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // Check cookie IP binding.
 | ||||
|                 if ((loginCookie != null) && (loginCookie.ip != null) && !checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // Check cookie IP binding.
 | ||||
|                 if ((loginCookie != null) && (domain.id == loginCookie.domainid)) { authUserid = loginCookie.userid; } // Use cookie authentication
 | ||||
|             } | ||||
|             if (authUserid == null) { res.sendStatus(401); return; } | ||||
|  | @ -3936,7 +3936,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|             // If an authentication cookie is embedded in the form, use that.
 | ||||
|             if ((fields != null) && (fields.auth != null) && (fields.auth.length == 1) && (typeof fields.auth[0] == 'string')) { | ||||
|                 var loginCookie = obj.parent.decodeCookie(fields.auth[0], obj.parent.loginCookieEncryptionKey, 60); // 60 minute timeout
 | ||||
|                 if ((loginCookie != null) && (loginCookie.ip != null) && checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // Check cookie IP binding.
 | ||||
|                 if ((loginCookie != null) && (loginCookie.ip != null) && !checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // Check cookie IP binding.
 | ||||
|                 if ((loginCookie != null) && (domain.id == loginCookie.domainid)) { authUserid = loginCookie.userid; } // Use cookie authentication
 | ||||
|             } | ||||
|             if (authUserid == null) { res.sendStatus(401); return; } | ||||
|  | @ -4036,7 +4036,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|             // If an authentication cookie is embedded in the form, use that.
 | ||||
|             if ((fields != null) && (fields.auth != null) && (fields.auth.length == 1) && (typeof fields.auth[0] == 'string')) { | ||||
|                 var loginCookie = obj.parent.decodeCookie(fields.auth[0], obj.parent.loginCookieEncryptionKey, 60); // 60 minute timeout
 | ||||
|                 if ((loginCookie != null) && (loginCookie.ip != null) && checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // Check cookie IP binding.
 | ||||
|                 if ((loginCookie != null) && (loginCookie.ip != null) && !checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // Check cookie IP binding.
 | ||||
|                 if ((loginCookie != null) && (domain.id == loginCookie.domainid)) { authUserid = loginCookie.userid; } // Use cookie authentication
 | ||||
|             } | ||||
|             if (authUserid == null) { res.sendStatus(401); return; } | ||||
|  | @ -4859,7 +4859,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|             // If an authentication cookie is embedded in the form, use that.
 | ||||
|             if ((fields != null) && (fields.auth != null) && (fields.auth.length == 1) && (typeof fields.auth[0] == 'string')) { | ||||
|                 var loginCookie = obj.parent.decodeCookie(fields.auth[0], obj.parent.loginCookieEncryptionKey, 60); // 60 minute timeout
 | ||||
|                 if ((loginCookie != null) && (loginCookie.ip != null) && checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // Check cookie IP binding.
 | ||||
|                 if ((loginCookie != null) && (loginCookie.ip != null) && !checkCookieIp(loginCookie.ip, req.clientIp)) { loginCookie = null; } // Check cookie IP binding.
 | ||||
|                 if ((loginCookie != null) && (domain.id == loginCookie.domainid)) { authUserid = loginCookie.userid; } // Use cookie authentication
 | ||||
|             } | ||||
|             if (authUserid == null) { res.sendStatus(401); return; } | ||||
|  | @ -5701,7 +5701,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|             httpOnly: true, | ||||
|             keys: [obj.args.sessionkey], // If multiple instances of this server are behind a load-balancer, this secret must be the same for all instances
 | ||||
|             secure: (obj.args.tlsoffload == null), // Use this cookie only over TLS (Check this: https://expressjs.com/en/guide/behind-proxies.html)
 | ||||
|             sameSite: obj.args.cookiesamesite | ||||
|             sameSite: obj.args.sessionsamesite | ||||
|         } | ||||
|         if (obj.args.sessiontime != null) { sessionOptions.maxAge = (obj.args.sessiontime * 60 * 1000); } | ||||
|         obj.app.use(obj.session(sessionOptions)); | ||||
|  | @ -5834,7 +5834,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|             res.set(headers); | ||||
| 
 | ||||
|             // Check the session if bound to the external IP address
 | ||||
|             if ((req.session.ip != null) && (req.clientIp != null) && checkCookieIp(req.session.ip, req.clientIp)) { req.session = {}; } | ||||
|             if ((req.session.ip != null) && (req.clientIp != null) && !checkCookieIp(req.session.ip, req.clientIp)) { req.session = {}; } | ||||
| 
 | ||||
|             // Extend the session time by forcing a change to the session every minute.
 | ||||
|             if (req.session.userid != null) { req.session.t = Math.floor(Date.now() / 60e3); } else { delete req.session.t; } | ||||
|  | @ -6817,7 +6817,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|                 // This is a encrypted cookie authentication
 | ||||
|                 var cookie = obj.parent.decodeCookie(req.query.auth, obj.parent.loginCookieEncryptionKey, 60); // Cookie with 1 hour timeout
 | ||||
|                 if ((cookie == null) && (obj.parent.multiServer != null)) { cookie = obj.parent.decodeCookie(req.query.auth, obj.parent.serverKey, 60); } // Try the server key
 | ||||
|                 if ((cookie != null) && (cookie.ip != null) && checkCookieIp(cookie.ip, req.clientIp)) { // If the cookie if binded to an IP address, check here.
 | ||||
|                 if ((cookie != null) && (cookie.ip != null) && !checkCookieIp(cookie.ip, req.clientIp)) { // If the cookie if binded to an IP address, check here.
 | ||||
|                     parent.debug('web', 'ERR: Invalid cookie IP address, got \"' + cookie.ip + '\", expected \"' + cleanRemoteAddr(req.clientIp) + '\".'); | ||||
|                     cookie = null; | ||||
|                 } | ||||
|  | @ -8201,6 +8201,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF | |||
|         return header + value + '\r\n'; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     // Check that a cookie IP is within the correct range depending on the active policy
 | ||||
|     function checkCookieIp(cookieip, ip) { | ||||
|         if (obj.args.cookieipcheck == 'none') return true; // 'none' - No IP address checking
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue