You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.9 KiB
137 lines
3.9 KiB
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = exports.connectionHandler = exports.getDefaultShell = void 0;
|
|
|
|
function _react() {
|
|
const data = _interopRequireDefault(require("react"));
|
|
|
|
_react = function _react() {
|
|
return data;
|
|
};
|
|
|
|
return data;
|
|
}
|
|
|
|
function _sockjs() {
|
|
const data = _interopRequireDefault(require("sockjs"));
|
|
|
|
_sockjs = function _sockjs() {
|
|
return data;
|
|
};
|
|
|
|
return data;
|
|
}
|
|
|
|
var _debug = require("./debug");
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
|
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
|
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
|
|
/**
|
|
* get user default shell
|
|
* /bin/zsh /bin/bash
|
|
*/
|
|
const getDefaultShell = () => {
|
|
if (process.platform === 'darwin') {
|
|
return process.env.SHELL || '/bin/bash';
|
|
}
|
|
|
|
if (process.platform === 'win32') {
|
|
return process.env.COMSPEC || 'cmd.exe';
|
|
}
|
|
|
|
return process.env.SHELL || '/bin/sh';
|
|
};
|
|
/**
|
|
* Security Check
|
|
*
|
|
*/
|
|
|
|
|
|
exports.getDefaultShell = getDefaultShell;
|
|
|
|
const securityCheck = conn => {
|
|
if (process.env.HOST === '0.0.0.0') {
|
|
conn.write('The current environment is not safe.');
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
const connectionHandler = (conn, opts) => {
|
|
const cwd = opts.cwd; // insecurity env to run shell
|
|
|
|
const safe = securityCheck(conn);
|
|
let spawn;
|
|
|
|
try {
|
|
// eslint-disable-next-line prefer-destructuring
|
|
spawn = require('node-pty').spawn;
|
|
} catch (e) {
|
|
conn.write('Failed to install or prebuild node-pty module, please see docs: https://umijs.org/guide/faq.html#terminal-need-node-pty-module');
|
|
return false;
|
|
}
|
|
|
|
if (safe) {
|
|
const defaultShell = getDefaultShell();
|
|
const defaultShellArgs = ['--login'];
|
|
const pty = spawn(defaultShell, defaultShellArgs, {
|
|
name: 'xterm-color',
|
|
cols: 80,
|
|
rows: 30,
|
|
cwd,
|
|
env: _objectSpread(_objectSpread({}, process.env), {}, {
|
|
// LANG: `${osLocaleSync()}.UTF-8`,
|
|
TERM: 'xterm-256color',
|
|
COLORTERM: 'truecolor'
|
|
})
|
|
});
|
|
/**
|
|
* stringify command shell string
|
|
* @param command ls/... shell commands
|
|
*/
|
|
|
|
pty.onData(chunk => {
|
|
(0, _debug.debugTerminal)('ptyProcess data', chunk);
|
|
conn.write(chunk);
|
|
});
|
|
pty.resize(100, 40); // === socket listener ===
|
|
|
|
conn.on('data', data => {
|
|
(0, _debug.debugTerminal)('terminal conn message', data);
|
|
pty.write(data);
|
|
});
|
|
conn.on('close', () => {
|
|
pty.kill();
|
|
});
|
|
}
|
|
};
|
|
/**
|
|
* export terminal socket init needs bind express app server
|
|
*/
|
|
|
|
|
|
exports.connectionHandler = connectionHandler;
|
|
|
|
var _default = (app, opts = {
|
|
cwd: process.cwd()
|
|
}) => {
|
|
const terminalSS = _sockjs().default.createServer();
|
|
|
|
terminalSS.on('connection', conn => connectionHandler(conn, opts));
|
|
terminalSS.installHandlers(app, {
|
|
prefix: '/terminal',
|
|
log: () => {}
|
|
});
|
|
};
|
|
|
|
exports.default = _default; |