diff --git a/mods/websocket-telnet-service.js b/mods/websocket-telnet-service.js index 7dc6dae15e4bf3b559c45ee241b1a84b5668d48c..b3c2d6c47e7a5c48dfd512d19fe594709c1754c1 100644 --- a/mods/websocket-telnet-service.js +++ b/mods/websocket-telnet-service.js @@ -1,5 +1,6 @@ load('sbbsdefs.js'); load('websocket-proxy.js'); +load('modopts.js'); function log_err(msg) { log(LOG_DEBUG, msg); @@ -235,8 +236,21 @@ try { } var wss = new WebSocketProxy(client); - log(LOG_DEBUG, 'WSTS Connecting to ' + telnet_addr + ':' + ini.TelnetPort); - var telnet = new TelnetClient(telnet_addr, ini.TelnetPort); + var wsspath = wss.headers.Path.split('/'); + if (wsspath.length < 3 || isNaN(parseInt(wsspath[2]))) { + var telnet = new TelnetClient(telnet_addr, ini.TelnetPort); + } else { + var _settings = get_mod_options('web'); + if (typeof _settings.allowed_ftelnet_targets !== 'string') { + throw 'Client supplied Path but no allowed_ftelnet_targets supplied in modopts.ini [web] section.'; + } + var targets = _settings.allowed_ftelnet_targets.split(','); + if (!targets.some(function (e) { var target = e.split(':'); return target[0] === wsspath[1] && target[1] === wsspath[2]; })) { + throw 'Client supplied Path is not in allowed_ftelnet_targets list.'; + } + log('Using client-supplied target ' + wsspath[1] + ':' + wsspath[2]); + var telnet = new TelnetClient(wsspath[1], parseInt(wsspath[2])); + } while (client.socket.is_connected && telnet.connected) { @@ -265,4 +279,4 @@ try { client.socket.close(); -} \ No newline at end of file +}