From 89c025d102e7379c12389c743162a7ac6f3caa4e Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Wed, 28 Nov 2018 20:23:42 -0700 Subject: [PATCH] feat: close #7002, console message if mismatched origins --- public/src/sockets.js | 12 ++++++++++++ src/controllers/api.js | 1 + src/socket.io/index.js | 22 +++++++++------------- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/public/src/sockets.js b/public/src/sockets.js index 63ef91f8cf..4407bb3b22 100644 --- a/public/src/sockets.js +++ b/public/src/sockets.js @@ -150,4 +150,16 @@ app.isConnected = false; }, }); } + + if ( + config.socketioOrigins + && config.socketioOrigins !== '*' + && config.socketioOrigins.indexOf(location.hostname) === -1 + ) { + console.error( + 'You are accessing the forum from an unknown origin. This will likely result in websockets failing to connect. \n' + + 'To fix this, set the `"url"` value in `config.json` to the URL at which you access the site. \n' + + 'For more information, see this FAQ topic: https://community.nodebb.org/topic/13388' + ); + } }()); diff --git a/src/controllers/api.js b/src/controllers/api.js index 3def1aff1f..b53e0d0ad1 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -40,6 +40,7 @@ apiController.loadConfig = function (req, callback) { config.disableChatMessageEditing = meta.config.disableChatMessageEditing === 1; config.maximumChatMessageLength = meta.config.maximumChatMessageLength || 1000; config.socketioTransports = nconf.get('socket.io:transports') || ['polling', 'websocket']; + config.socketioOrigins = nconf.get('socket.io:origins'); config.websocketAddress = nconf.get('socket.io:address') || ''; config.maxReconnectionAttempts = meta.config.maxReconnectionAttempts || 5; config.reconnectionDelay = meta.config.reconnectionDelay || 1500; diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 1919fb1ad8..1ced452877 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -46,20 +46,16 @@ Sockets.init = function (server) { * Can be overridden via config (socket.io:origins) */ if (process.env.NODE_ENV !== 'development') { - var domain = nconf.get('cookieDomain'); - var parsedUrl = url.parse(nconf.get('url')); - var override = nconf.get('socket.io:origins'); - if (!domain) { - domain = parsedUrl.hostname; // cookies don't provide isolation by port: http://stackoverflow.com/a/16328399/122353 - } + const parsedUrl = url.parse(nconf.get('url')); - if (!override) { - io.origins(parsedUrl.protocol + '//' + domain + ':*'); - winston.info('[socket.io] Restricting access to origin: ' + parsedUrl.protocol + '//' + domain + ':*'); - } else { - io.origins(override); - winston.info('[socket.io] Restricting access to origin: ' + override); - } + // cookies don't provide isolation by port: http://stackoverflow.com/a/16328399/122353 + const domain = nconf.get('cookieDomain') || parsedUrl.hostname; + + const origins = nconf.get('socket.io:origins') || `${parsedUrl.protocol}//${domain}:*`; + nconf.set('socket.io:origins', origins); + + io.origins(origins); + winston.info('[socket.io] Restricting access to origin: ' + origins); } io.listen(server, {