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

"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;