mirror of
https://github.com/yudai/gotty.git
synced 2025-09-22 05:50:48 +02:00

Safari doesn't support basic authentication for websocket sessions. This commit introduces a token-based authentication only for websocket connection. The token is shared by all clients and that might be not secure. However, basic authentication itself is insecure and the credential is already shared by clients, so don't mind.
90 lines
2.5 KiB
JavaScript
90 lines
2.5 KiB
JavaScript
(function() {
|
|
var httpsEnabled = window.location.protocol == "https:";
|
|
var url = (httpsEnabled ? 'wss://' : 'ws://') + window.location.host + window.location.pathname + 'ws';
|
|
var protocols = ["gotty"];
|
|
var autoReconnect = -1;
|
|
|
|
var openWs = function() {
|
|
var ws = new WebSocket(url, protocols);
|
|
|
|
var term;
|
|
|
|
ws.onopen = function(event) {
|
|
ws.send(gotty_auth_token);
|
|
|
|
hterm.defaultStorage = new lib.Storage.Local();
|
|
hterm.defaultStorage.clear();
|
|
|
|
term = new hterm.Terminal();
|
|
|
|
term.getPrefs().set("send-encoding", "raw");
|
|
|
|
term.onTerminalReady = function() {
|
|
var io = term.io.push();
|
|
|
|
io.onVTKeystroke = function(str) {
|
|
ws.send("0" + str);
|
|
};
|
|
|
|
io.sendString = io.onVTKeystroke;
|
|
|
|
io.onTerminalResize = function(columns, rows) {
|
|
ws.send(
|
|
"1" + JSON.stringify(
|
|
{
|
|
columns: columns,
|
|
rows: rows,
|
|
}
|
|
)
|
|
)
|
|
};
|
|
|
|
term.installKeyboard();
|
|
};
|
|
|
|
term.decorate(document.getElementById("terminal"));
|
|
};
|
|
|
|
ws.onmessage = function(event) {
|
|
data = event.data.slice(1);
|
|
switch(event.data[0]) {
|
|
case '0':
|
|
term.io.writeUTF16(data);
|
|
break;
|
|
case '1':
|
|
term.setWindowTitle(data);
|
|
break;
|
|
case '2':
|
|
preferences = JSON.parse(data);
|
|
Object.keys(preferences).forEach(function(key) {
|
|
console.log("Setting " + key + ": " + preferences[key]);
|
|
term.getPrefs().set(key, preferences[key]);
|
|
});
|
|
break;
|
|
case '3':
|
|
autoReconnect = JSON.parse(data);
|
|
break;
|
|
}
|
|
}
|
|
|
|
ws.onclose = function(event) {
|
|
if (term) {
|
|
term.uninstallKeyboard();
|
|
term.io.showOverlay("Connection Closed", null);
|
|
}
|
|
tryReconnect();
|
|
}
|
|
|
|
ws.onerror = function(error) {
|
|
tryReconnect();
|
|
}
|
|
}
|
|
|
|
openWs();
|
|
|
|
var tryReconnect = function() {
|
|
if (autoReconnect >= 0) {
|
|
setTimeout(openWs, autoReconnect * 1000);
|
|
}
|
|
}
|
|
})()
|