diff --git a/Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz b/Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz index 03f21f3..8c0acb6 100644 Binary files a/Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz and b/Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz differ diff --git a/Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz.sha256 b/Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz.sha256 index 9af6467..b998142 100644 --- a/Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz.sha256 +++ b/Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz.sha256 @@ -1 +1 @@ -b5d91410538e7aac2c2ba1e28a2d965e2586492954c12a97817c7737c4f4c327 Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz +67e73a170ca3c03ddf5d8a4ed5e106bdd4bda61d8c78c36c1c5ec56feb5f81b2 Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz diff --git a/ChangeLog.md b/ChangeLog.md index 25e7247..a5f17d0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,5 @@ # Change Log -## [0.2.8] TBD +## [0.2.8] 2019-05-25 ### Changes - Fixes issue if no password is entered, browser must be closed and restart to attempt to re-auth. See issue [#118](../../issues/118). Thanks @smilesm2 for the idea. - fixes broken `npm run (build|builddev)` @@ -7,6 +7,9 @@ - update webpack and dependancies - update xterm to 3.8.0 +### Fixes +- ILX workspace may not always import properly due to symbolic links (specifically ./node_modules/.bin). This is removed from the ILX package + ## [0.2.7] 2018-11-11 ### Changes - `config.reauth` was not respected if initial auth presented was incorrect, regardless of `reauth` setting in `config.json` reauth would always be attempted. fixes [#117](../../issues/117) diff --git a/app/config.json b/app/config.json.sample similarity index 100% rename from app/config.json rename to app/config.json.sample diff --git a/app/server/app.js b/app/server/app.js index 26fcfff..939618b 100644 --- a/app/server/app.js +++ b/app/server/app.js @@ -3,14 +3,102 @@ // app.js var path = require('path') -// configPath = path.join(__dirname, 'config.json') var nodeRoot = path.dirname(require.main.filename) var configPath = path.join(nodeRoot, 'config.json') var publicPath = path.join(nodeRoot, 'client', 'public') console.log('WebSSH2 service reading config from: ' + configPath) -var config = require('read-config')(configPath) var express = require('express') var logger = require('morgan') + +// sane defaults if config.json or parts are missing +let config = { + 'listen': { + 'ip': '0.0.0.0', + 'port': 2222 + }, + 'user': { + 'name': null, + 'password': null + }, + 'ssh': { + 'host': null, + 'port': 22, + 'term': 'xterm-color', + 'readyTimeout': 20000, + 'keepaliveInterval': 120000, + 'keepaliveCountMax': 10 + }, + 'terminal': { + 'cursorBlink': true, + 'scrollback': 10000, + 'tabStopWidth': 8, + 'bellStyle': 'sound' + }, + 'header': { + 'text': null, + 'background': 'green' + }, + 'session': { + 'name': 'WebSSH2', + 'secret': 'mysecret' + }, + 'options': { + 'challengeButton': true, + 'allowreauth': true + }, + 'algorithms': { + 'kex': [ + 'ecdh-sha2-nistp256', + 'ecdh-sha2-nistp384', + 'ecdh-sha2-nistp521', + 'diffie-hellman-group-exchange-sha256', + 'diffie-hellman-group14-sha1' + ], + 'cipher': [ + 'aes128-ctr', + 'aes192-ctr', + 'aes256-ctr', + 'aes128-gcm', + 'aes128-gcm@openssh.com', + 'aes256-gcm', + 'aes256-gcm@openssh.com', + 'aes256-cbc' + ], + 'hmac': [ + 'hmac-sha2-256', + 'hmac-sha2-512', + 'hmac-sha1' + ], + 'compress': [ + 'none', + 'zlib@openssh.com', + 'zlib' + ] + }, + 'serverlog': { + 'client': false, + 'server': false + }, + 'accesslog': false, + 'verify': false +} + +// test if config.json exists, if not provide error message but try to run +// anyway +try { + if (fs.existsSync(configPath)) { + console.log('ephemeral_auth service reading config from: ' + configPath) + config = require('read-config')(configPath) + } else { + console.error('\n\nERROR: Missing config.json for webssh. Current config: ' + JSON.stringify(config)) + console.error('\n See config.json.sample for details\n\n') + } +} catch (err) { + console.error('\n\nERROR: Missing config.json for webssh. Current config: ' + JSON.stringify(config)) + console.error('\n See config.json.sample for details\n\n') + console.error('ERROR:\n\n ' + err) +} + var session = require('express-session')({ secret: config.session.secret, name: config.session.name, diff --git a/bin/BIG-IP-ILX-WebSSH2-current.tgz b/bin/BIG-IP-ILX-WebSSH2-current.tgz index 03f21f3..8c0acb6 100644 Binary files a/bin/BIG-IP-ILX-WebSSH2-current.tgz and b/bin/BIG-IP-ILX-WebSSH2-current.tgz differ diff --git a/bin/BIG-IP-ILX-WebSSH2-current.tgz.sha256 b/bin/BIG-IP-ILX-WebSSH2-current.tgz.sha256 index 9af6467..b998142 100644 --- a/bin/BIG-IP-ILX-WebSSH2-current.tgz.sha256 +++ b/bin/BIG-IP-ILX-WebSSH2-current.tgz.sha256 @@ -1 +1 @@ -b5d91410538e7aac2c2ba1e28a2d965e2586492954c12a97817c7737c4f4c327 Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz +67e73a170ca3c03ddf5d8a4ed5e106bdd4bda61d8c78c36c1c5ec56feb5f81b2 Build/Release/BIG-IP-ILX-WebSSH2-0.2.8.tgz diff --git a/scripts/env.sh b/scripts/env.sh index 68a0dbc..5d77b45 100755 --- a/scripts/env.sh +++ b/scripts/env.sh @@ -1,6 +1,7 @@ #!/bin/sh webssh_ilxhost=root@192.168.30.209 +#webssh_ilxhost=root@192.168.30.203 webssh_workspace_name=webssh2 webssh_package_name=BIG-IP-ILX-WebSSH2 -webssh_pua_location=./bin +webssh_pua_location=./bin \ No newline at end of file diff --git a/scripts/push.sh b/scripts/push.sh index 03d0269..7a6cff6 100755 --- a/scripts/push.sh +++ b/scripts/push.sh @@ -70,6 +70,11 @@ if [ $result -ne 0 ]; then exit 255 fi +echo -e "\n" +echo "Deleting $webssh_workspace_name/node_modules/.bin on $webssh_ilxhost" +output=$(ssh -o ClearAllForwardings=yes $webssh_ilxhost "cd /var/ilx/workspaces/Common/$webssh_workspace_name/extensions/webssh2; rm -rf node_modules/.bin" 2>&1) +result="$?" 2>&1 + echo "Switching plugin to new workspace..." # switch plugin to new workspace output=$(ssh -o ClearAllForwardings=yes $webssh_ilxhost tmsh modify ilx plugin WebSSH_plugin from-workspace $webssh_workspace_name 2>&1) diff --git a/workspace/extensions/webssh2/config.json.sample b/workspace/extensions/webssh2/config.json.sample new file mode 100644 index 0000000..90e1214 --- /dev/null +++ b/workspace/extensions/webssh2/config.json.sample @@ -0,0 +1,71 @@ +{ + "listen": { + "ip": "0.0.0.0", + "port": 2222 + }, + "user": { + "name": null, + "password": null + }, + "ssh": { + "host": null, + "port": 22, + "term": "xterm-color", + "readyTimeout": 20000, + "keepaliveInterval": 120000, + "keepaliveCountMax": 10 + }, + "terminal": { + "cursorBlink": true, + "scrollback": 10000, + "tabStopWidth": 8, + "bellStyle": "sound" + }, + "header": { + "text": null, + "background": "green" + }, + "session": { + "name": "WebSSH2", + "secret": "mysecret" + }, + "options": { + "challengeButton": true, + "allowreauth": true + }, + "algorithms": { + "kex": [ + "ecdh-sha2-nistp256", + "ecdh-sha2-nistp384", + "ecdh-sha2-nistp521", + "diffie-hellman-group-exchange-sha256", + "diffie-hellman-group14-sha1" + ], + "cipher": [ + "aes128-ctr", + "aes192-ctr", + "aes256-ctr", + "aes128-gcm", + "aes128-gcm@openssh.com", + "aes256-gcm", + "aes256-gcm@openssh.com", + "aes256-cbc" + ], + "hmac": [ + "hmac-sha2-256", + "hmac-sha2-512", + "hmac-sha1" + ], + "compress": [ + "none", + "zlib@openssh.com", + "zlib" + ] + }, + "serverlog": { + "client": false, + "server": false + }, + "accesslog": false, + "verify": false +} \ No newline at end of file diff --git a/workspace/extensions/webssh2/server/app.js b/workspace/extensions/webssh2/server/app.js index bd4ffe1..939618b 100644 --- a/workspace/extensions/webssh2/server/app.js +++ b/workspace/extensions/webssh2/server/app.js @@ -3,14 +3,102 @@ // app.js var path = require('path') -// configPath = path.join(__dirname, 'config.json') var nodeRoot = path.dirname(require.main.filename) var configPath = path.join(nodeRoot, 'config.json') var publicPath = path.join(nodeRoot, 'client', 'public') console.log('WebSSH2 service reading config from: ' + configPath) -var config = require('read-config')(configPath) var express = require('express') var logger = require('morgan') + +// sane defaults if config.json or parts are missing +let config = { + 'listen': { + 'ip': '0.0.0.0', + 'port': 2222 + }, + 'user': { + 'name': null, + 'password': null + }, + 'ssh': { + 'host': null, + 'port': 22, + 'term': 'xterm-color', + 'readyTimeout': 20000, + 'keepaliveInterval': 120000, + 'keepaliveCountMax': 10 + }, + 'terminal': { + 'cursorBlink': true, + 'scrollback': 10000, + 'tabStopWidth': 8, + 'bellStyle': 'sound' + }, + 'header': { + 'text': null, + 'background': 'green' + }, + 'session': { + 'name': 'WebSSH2', + 'secret': 'mysecret' + }, + 'options': { + 'challengeButton': true, + 'allowreauth': true + }, + 'algorithms': { + 'kex': [ + 'ecdh-sha2-nistp256', + 'ecdh-sha2-nistp384', + 'ecdh-sha2-nistp521', + 'diffie-hellman-group-exchange-sha256', + 'diffie-hellman-group14-sha1' + ], + 'cipher': [ + 'aes128-ctr', + 'aes192-ctr', + 'aes256-ctr', + 'aes128-gcm', + 'aes128-gcm@openssh.com', + 'aes256-gcm', + 'aes256-gcm@openssh.com', + 'aes256-cbc' + ], + 'hmac': [ + 'hmac-sha2-256', + 'hmac-sha2-512', + 'hmac-sha1' + ], + 'compress': [ + 'none', + 'zlib@openssh.com', + 'zlib' + ] + }, + 'serverlog': { + 'client': false, + 'server': false + }, + 'accesslog': false, + 'verify': false +} + +// test if config.json exists, if not provide error message but try to run +// anyway +try { + if (fs.existsSync(configPath)) { + console.log('ephemeral_auth service reading config from: ' + configPath) + config = require('read-config')(configPath) + } else { + console.error('\n\nERROR: Missing config.json for webssh. Current config: ' + JSON.stringify(config)) + console.error('\n See config.json.sample for details\n\n') + } +} catch (err) { + console.error('\n\nERROR: Missing config.json for webssh. Current config: ' + JSON.stringify(config)) + console.error('\n See config.json.sample for details\n\n') + console.error('ERROR:\n\n ' + err) +} + var session = require('express-session')({ secret: config.session.secret, name: config.session.name, @@ -28,7 +116,7 @@ var socket = require('./socket') var expressOptions = require('./expressOptions') // express -app.use(compression({level: 9})) +app.use(compression({ level: 9 })) app.use(session) app.use(myutil.basicAuth) if (config.accesslog) app.use(logger('common')) @@ -50,7 +138,7 @@ app.get('/ssh/host/:host?', function (req, res, next) { (validator.isFQDN(req.params.host) && req.params.host) || (/^(([a-z]|[A-Z]|[0-9]|[!^(){}\-_~])+)?\w$/.test(req.params.host) && req.params.host) || config.ssh.host, - port: (validator.isInt(req.query.port + '', {min: 1, max: 65535}) && + port: (validator.isInt(req.query.port + '', { min: 1, max: 65535 }) && req.query.port) || config.ssh.port, header: { name: req.query.header || config.header.text, @@ -63,8 +151,8 @@ app.get('/ssh/host/:host?', function (req, res, next) { req.query.sshterm) || config.ssh.term, terminal: { cursorBlink: (validator.isBoolean(req.query.cursorBlink + '') ? myutil.parseBool(req.query.cursorBlink) : config.terminal.cursorBlink), - scrollback: (validator.isInt(req.query.scrollback + '', {min: 1, max: 200000}) && req.query.scrollback) ? req.query.scrollback : config.terminal.scrollback, - tabStopWidth: (validator.isInt(req.query.tabStopWidth + '', {min: 1, max: 100}) && req.query.tabStopWidth) ? req.query.tabStopWidth : config.terminal.tabStopWidth, + scrollback: (validator.isInt(req.query.scrollback + '', { min: 1, max: 200000 }) && req.query.scrollback) ? req.query.scrollback : config.terminal.scrollback, + tabStopWidth: (validator.isInt(req.query.tabStopWidth + '', { min: 1, max: 100 }) && req.query.tabStopWidth) ? req.query.tabStopWidth : config.terminal.tabStopWidth, bellStyle: ((req.query.bellStyle) && (['sound', 'none'].indexOf(req.query.bellStyle) > -1)) ? req.query.bellStyle : config.terminal.bellStyle }, allowreplay: config.options.challengeButton || (validator.isBoolean(req.headers.allowreplay + '') ? myutil.parseBool(req.headers.allowreplay) : false), @@ -74,7 +162,7 @@ app.get('/ssh/host/:host?', function (req, res, next) { client: config.serverlog.client || false, server: config.serverlog.server || false }, - readyTimeout: (validator.isInt(req.query.readyTimeout + '', {min: 1, max: 300000}) && + readyTimeout: (validator.isInt(req.query.readyTimeout + '', { min: 1, max: 300000 }) && req.query.readyTimeout) || config.ssh.readyTimeout } if (req.session.ssh.header.name) validator.escape(req.session.ssh.header.name) @@ -101,4 +189,4 @@ io.use(function (socket, next) { // bring up socket io.on('connection', socket) -module.exports = {server: server, config: config} +module.exports = { server: server, config: config }