|
|
@ -17,7 +17,7 @@ const distDir = path.join(__dirname, 'client'); |
|
|
|
const trim = (str: string): string => str.replace(/\/*$/, ''); |
|
|
|
|
|
|
|
export default function createServer( |
|
|
|
{ base, port, host, title }: Server, |
|
|
|
{ base, port, host, title, bypasshelmet }: Server, |
|
|
|
{ key, cert }: SSLBuffer |
|
|
|
): SocketIO.Server { |
|
|
|
const basePath = trim(base); |
|
|
@ -39,6 +39,7 @@ export default function createServer( |
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> |
|
|
|
<title>${title}</title> |
|
|
|
<link rel="stylesheet" href="${resourcePath}public/index.css" /> |
|
|
|
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous"> |
|
|
|
</head> |
|
|
|
<body> |
|
|
|
<div id="overlay"> |
|
|
@ -47,6 +48,12 @@ export default function createServer( |
|
|
|
<input type="button" onclick="location.reload();" value="reconnect" /> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div id="options"> |
|
|
|
<a class="toggler" |
|
|
|
href="#" |
|
|
|
alt="Toggle options"><i class="fas fa-cogs"></i></a> |
|
|
|
<textarea class="editor"></textarea> |
|
|
|
</div> |
|
|
|
<div id="terminal"></div> |
|
|
|
<script src="${resourcePath}public/index.js"></script> |
|
|
|
</body> |
|
|
@ -56,16 +63,22 @@ export default function createServer( |
|
|
|
const app = express(); |
|
|
|
app |
|
|
|
.use(morgan('combined', { stream: logger.stream })) |
|
|
|
.use(helmet()) |
|
|
|
.use(compression()) |
|
|
|
.use(favicon(path.join(distDir, 'favicon.ico'))) |
|
|
|
.use(`${basePath}/public`, express.static(distDir)) |
|
|
|
.use((req, res, next) => { |
|
|
|
if (req.url === basePath) res.redirect(301, req.url + '/'); |
|
|
|
else next(); |
|
|
|
}) |
|
|
|
.get(basePath, html) |
|
|
|
.get(`${basePath}/ssh/:user`, html); |
|
|
|
}); |
|
|
|
|
|
|
|
// Allow helmet to be bypassed.
|
|
|
|
// Unfortunately, order matters with middleware
|
|
|
|
// which is why this is thrown in the middle
|
|
|
|
if (!bypasshelmet) { |
|
|
|
app.use(helmet()); |
|
|
|
} |
|
|
|
|
|
|
|
app.get(basePath, html).get(`${basePath}/ssh/:user`, html); |
|
|
|
|
|
|
|
return socket( |
|
|
|
!isUndefined(key) && !isUndefined(cert) |
|
|
|