The API allowed strings to be passed from the RFB module to the application using the disconnect reason. This caused problems since the application didn't have control over translations for these strings. Most of the information being passed using this string was very technical and not helpful to the end user. One exception to this was the security result information regarding for example authentication failures. The protocol allows the VNC server to pass a string directly to the user in the security result. So the disconnect reason is replaced by a boolean saying if the disconnection was clean or not. And for the security result information from the server, a new event has been added.
287 lines
12 KiB
HTML
287 lines
12 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
|
|
<!--
|
|
noVNC example: lightweight example using minimal UI and features
|
|
Copyright (C) 2012 Joel Martin
|
|
Copyright (C) 2017 Samuel Mannehed for Cendio AB
|
|
noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
|
|
This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
|
|
|
|
Connect parameters are provided in query string:
|
|
http://example.com/?host=HOST&port=PORT&encrypt=1
|
|
or the fragment:
|
|
http://example.com/#host=HOST&port=PORT&encrypt=1
|
|
-->
|
|
<title>noVNC</title>
|
|
|
|
<meta charset="utf-8">
|
|
|
|
<!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
|
|
Remove this if you use the .htaccess -->
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
|
|
|
<!-- Icons (see Makefile for what the sizes are for) -->
|
|
<link rel="icon" sizes="16x16" type="image/png" href="app/images/icons/novnc-16x16.png">
|
|
<link rel="icon" sizes="24x24" type="image/png" href="app/images/icons/novnc-24x24.png">
|
|
<link rel="icon" sizes="32x32" type="image/png" href="app/images/icons/novnc-32x32.png">
|
|
<link rel="icon" sizes="48x48" type="image/png" href="app/images/icons/novnc-48x48.png">
|
|
<link rel="icon" sizes="60x60" type="image/png" href="app/images/icons/novnc-60x60.png">
|
|
<link rel="icon" sizes="64x64" type="image/png" href="app/images/icons/novnc-64x64.png">
|
|
<link rel="icon" sizes="72x72" type="image/png" href="app/images/icons/novnc-72x72.png">
|
|
<link rel="icon" sizes="76x76" type="image/png" href="app/images/icons/novnc-76x76.png">
|
|
<link rel="icon" sizes="96x96" type="image/png" href="app/images/icons/novnc-96x96.png">
|
|
<link rel="icon" sizes="120x120" type="image/png" href="app/images/icons/novnc-120x120.png">
|
|
<link rel="icon" sizes="144x144" type="image/png" href="app/images/icons/novnc-144x144.png">
|
|
<link rel="icon" sizes="152x152" type="image/png" href="app/images/icons/novnc-152x152.png">
|
|
<link rel="icon" sizes="192x192" type="image/png" href="app/images/icons/novnc-192x192.png">
|
|
<link rel="icon" sizes="any" type="image/svg+xml" href="app/images/icons/novnc-icon.svg">
|
|
<!-- Repeated last so that legacy handling will pick this -->
|
|
<link rel="icon" sizes="16x16" type="image/png" href="app/images/icons/novnc-16x16.png">
|
|
|
|
<!-- Apple iOS Safari settings -->
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
<!-- Home Screen Icons (favourites and bookmarks use the normal icons) -->
|
|
<link rel="apple-touch-icon" sizes="60x60" type="image/png" href="app/images/icons/novnc-60x60.png">
|
|
<link rel="apple-touch-icon" sizes="76x76" type="image/png" href="app/images/icons/novnc-76x76.png">
|
|
<link rel="apple-touch-icon" sizes="120x120" type="image/png" href="app/images/icons/novnc-120x120.png">
|
|
<link rel="apple-touch-icon" sizes="152x152" type="image/png" href="app/images/icons/novnc-152x152.png">
|
|
|
|
<!-- Stylesheets -->
|
|
<link rel="stylesheet" href="app/styles/lite.css">
|
|
|
|
<!--
|
|
<script type='text/javascript'
|
|
src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
|
|
-->
|
|
|
|
<!-- promise polyfills promises for IE11 -->
|
|
<script src="vendor/promise.js"></script>
|
|
<!-- ES2015/ES6 modules polyfill -->
|
|
<script type="module">
|
|
window._noVNC_has_module_support = true;
|
|
</script>
|
|
<script>
|
|
window.addEventListener("load", function() {
|
|
if (window._noVNC_has_module_support) return;
|
|
var loader = document.createElement("script");
|
|
loader.src = "vendor/browser-es-module-loader/dist/browser-es-module-loader.js";
|
|
document.head.appendChild(loader);
|
|
});
|
|
</script>
|
|
|
|
<!-- actual script modules -->
|
|
<script type="module" crossorigin="anonymous">
|
|
// Load supporting scripts
|
|
import * as WebUtil from './app/webutil.js';
|
|
import RFB from './core/rfb.js';
|
|
|
|
var rfb;
|
|
var doneInitialResize;
|
|
var resizeTimeout;
|
|
var desktopName;
|
|
|
|
function UIresize() {
|
|
if (WebUtil.getConfigVar('resize', false)) {
|
|
var innerW = window.innerWidth;
|
|
var innerH = window.innerHeight;
|
|
var controlbarH = document.getElementById('noVNC_status_bar').offsetHeight;
|
|
if (innerW !== undefined && innerH !== undefined)
|
|
rfb.requestDesktopSize(innerW, innerH - controlbarH);
|
|
}
|
|
}
|
|
function initialResize() {
|
|
if (doneInitialResize) return;
|
|
UIresize();
|
|
doneInitialResize = true;
|
|
}
|
|
function updateDesktopName(e) {
|
|
desktopName = e.detail.name;
|
|
}
|
|
function credentials(e) {
|
|
var html;
|
|
|
|
var form = document.createElement('form');
|
|
form.innerHTML = '<label></label>';
|
|
form.innerHTML += '<input type=password size=10 id="password_input">';
|
|
form.onsubmit = setPassword;
|
|
|
|
// bypass status() because it sets text content
|
|
document.getElementById('noVNC_status_bar').setAttribute("class", "noVNC_status_warn");
|
|
document.getElementById('noVNC_status').innerHTML = '';
|
|
document.getElementById('noVNC_status').appendChild(form);
|
|
document.getElementById('noVNC_status').querySelector('label').textContent = 'Password Required: ';
|
|
}
|
|
function setPassword() {
|
|
rfb.sendCredentials({ password: document.getElementById('password_input').value });
|
|
return false;
|
|
}
|
|
function sendCtrlAltDel() {
|
|
rfb.sendCtrlAltDel();
|
|
return false;
|
|
}
|
|
function machineShutdown() {
|
|
rfb.machineShutdown();
|
|
return false;
|
|
}
|
|
function machineReboot() {
|
|
rfb.machineReboot();
|
|
return false;
|
|
}
|
|
function machineReset() {
|
|
rfb.machineReset();
|
|
return false;
|
|
}
|
|
function status(text, level) {
|
|
switch (level) {
|
|
case 'normal':
|
|
case 'warn':
|
|
case 'error':
|
|
break;
|
|
default:
|
|
level = "warn";
|
|
}
|
|
document.getElementById('noVNC_status_bar').className = "noVNC_status_" + level;
|
|
document.getElementById('noVNC_status').textContent = text;
|
|
}
|
|
|
|
function connected(e) {
|
|
document.getElementById('sendCtrlAltDelButton').disabled = false;
|
|
doneInitialResize = false;
|
|
if (WebUtil.getConfigVar('encrypt',
|
|
(window.location.protocol === "https:"))) {
|
|
status("Connected (encrypted) to " + desktopName, "normal");
|
|
} else {
|
|
status("Connected (unencrypted) to " + desktopName, "normal");
|
|
}
|
|
}
|
|
|
|
function disconnected(e) {
|
|
document.getElementById('sendCtrlAltDelButton').disabled = true;
|
|
updatePowerButtons();
|
|
if (e.detail.clean) {
|
|
status("Disconnected", "normal");
|
|
} else {
|
|
status("Something went wrong, connection is closed", "error");
|
|
}
|
|
}
|
|
|
|
window.onresize = function () {
|
|
// When the window has been resized, wait until the size remains
|
|
// the same for 0.5 seconds before sending the request for changing
|
|
// the resolution of the session
|
|
clearTimeout(resizeTimeout);
|
|
resizeTimeout = setTimeout(function(){
|
|
UIresize();
|
|
}, 500);
|
|
};
|
|
|
|
function updatePowerButtons() {
|
|
var powerbuttons;
|
|
powerbuttons = document.getElementById('noVNC_power_buttons');
|
|
if (rfb.capabilities.power) {
|
|
xvpbuttons.className= "noVNC_shown";
|
|
} else {
|
|
xvpbuttons.className = "noVNC_hidden";
|
|
}
|
|
}
|
|
|
|
document.getElementById('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
|
|
document.getElementById('machineShutdownButton').onclick = machineShutdown;
|
|
document.getElementById('machineRebootButton').onclick = machineReboot;
|
|
document.getElementById('machineResetButton').onclick = machineReset;
|
|
|
|
WebUtil.init_logging(WebUtil.getConfigVar('logging', 'warn'));
|
|
document.title = WebUtil.getConfigVar('title', 'noVNC');
|
|
// By default, use the host and port of server that served this file
|
|
var host = WebUtil.getConfigVar('host', window.location.hostname);
|
|
var port = WebUtil.getConfigVar('port', window.location.port);
|
|
|
|
// if port == 80 (or 443) then it won't be present and should be
|
|
// set manually
|
|
if (!port) {
|
|
if (window.location.protocol.substring(0,5) == 'https') {
|
|
port = 443;
|
|
}
|
|
else if (window.location.protocol.substring(0,4) == 'http') {
|
|
port = 80;
|
|
}
|
|
}
|
|
|
|
var password = WebUtil.getConfigVar('password', '');
|
|
var path = WebUtil.getConfigVar('path', 'websockify');
|
|
|
|
// If a token variable is passed in, set the parameter in a cookie.
|
|
// This is used by nova-novncproxy.
|
|
var token = WebUtil.getConfigVar('token', null);
|
|
if (token) {
|
|
// if token is already present in the path we should use it
|
|
path = WebUtil.injectParamIfMissing(path, "token", token);
|
|
|
|
WebUtil.createCookie('token', token, 1)
|
|
}
|
|
|
|
(function() {
|
|
|
|
status("Connecting", "normal");
|
|
|
|
if ((!host) || (!port)) {
|
|
status('Must specify host and port in URL', 'error');
|
|
}
|
|
|
|
var url;
|
|
|
|
if (WebUtil.getConfigVar('encrypt',
|
|
(window.location.protocol === "https:"))) {
|
|
url = 'wss';
|
|
} else {
|
|
url = 'ws';
|
|
}
|
|
|
|
url += '://' + host;
|
|
if(port) {
|
|
url += ':' + port;
|
|
}
|
|
url += '/' + path;
|
|
|
|
rfb = new RFB(document.getElementById('noVNC_canvas'), url,
|
|
{ repeaterID: WebUtil.getConfigVar('repeaterID', ''),
|
|
shared: WebUtil.getConfigVar('shared', true),
|
|
credentials: { password: password } });
|
|
rfb.viewOnly = WebUtil.getConfigVar('view_only', false);
|
|
rfb.addEventListener("connect", connected);
|
|
rfb.addEventListener("disconnect", disconnected);
|
|
rfb.addEventListener("capabilities", function () { updatePowerButtons(); initialResize(); });
|
|
rfb.addEventListener("credentialsrequired", credentials);
|
|
rfb.addEventListener("desktopname", updateDesktopName);
|
|
})();
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
<div id="noVNC_status_bar">
|
|
<div id="noVNC_left_dummy_elem"></div>
|
|
<div id="noVNC_status">Loading</div>
|
|
<div id="noVNC_buttons">
|
|
<input type=button value="Send CtrlAltDel"
|
|
id="sendCtrlAltDelButton" class="noVNC_shown">
|
|
<span id="noVNC_power_buttons" class="noVNC_hidden">
|
|
<input type=button value="Shutdown"
|
|
id="machineShutdownButton">
|
|
<input type=button value="Reboot"
|
|
id="machineRebootButton">
|
|
<input type=button value="Reset"
|
|
id="machineResetButton">
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<canvas id="noVNC_canvas" width="0" height="0">
|
|
Canvas not supported.
|
|
</canvas>
|
|
|
|
</body>
|
|
</html>
|