noVNC/vnc_auto.html

328 lines
14 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<!--
noVNC example: simple example using default UI
Copyright (C) 2012 Joel Martin
Copyright (C) 2013 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&true_color=1
or the fragment:
http://example.com/#host=HOST&port=PORT&encrypt=1&true_color=1
-->
<title>Coyote</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">
<!-- 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" />
<!-- App Start Icon -->
<link rel="apple-touch-startup-image" href="images/screen_320x460.png" />
<!-- For iOS devices set the icon to use if user bookmarks app on their homescreen -->
<link rel="apple-touch-icon" href="images/screen_57x57.png">
<!--
<link rel="apple-touch-icon-precomposed" href="images/screen_57x57.png" />
-->
<!-- Stylesheets -->
<link rel="stylesheet" href="include/base.css?cachebust=1" title="plain">
<script src="include/util.js"></script>
<script type="application/javascript">
window.setTimeout(function() {
location.href = "https://www.priceyak.com/expired";
}, 1000 * 3600 * 12);
</script>
</head>
<body style="margin: 0px;">
<div id="noVNC_container">
<div id="noVNC_status_bar" class="noVNC_status_bar" style="margin-top: 0px;">
<table border=0 width="100%"><tr>
<td><div id="noVNC_status" style="position: relative; height: auto;">
Loading
</div></td>
<td width="1%"><div id="noVNC_buttons">
<!--<input type=button value="Send CtrlAltDel"
id="sendCtrlAltDelButton">-->
<span id="noVNC_xvp_buttons">
<!--
<input type=button value="Shutdown"
id="xvpShutdownButton">
<input type=button value="Reboot"
id="xvpRebootButton">
<input type=button value="Reset"
id="xvpResetButton">
-->
</span>
</div></td>
</tr></table>
</div>
<div style="display: flex;">
<div id="vnc-input" tabindex="-1" style="margin:2px; width:1280px; height:800px; background-color:black; overflow:visible;">
<canvas id="noVNC_canvas">
Canvas not supported.
</canvas>
</div>
<div style="margin:10px; flex: 1; display: flex; align-self:stretch; flex-direction: column;">
<h3 style="color:white; margin-top:0px; margin-bottom:5px;">Remote Clipboard</h3>
<p id="use-yakpal" style="color:white; font-size:14px; margin-top:1px; margin-bottom:1px;">Make copy &amp; paste better by installing
<a style="color:white;" href="https://chrome.google.com/webstore/detail/yakpal/gcjaibancpkbofjlkgihljhdheaokifb?hl=en">YakPal</a>
</p>
<textarea id="copyBox" style="width:100%;overflow:scroll;flex:1;"></textarea>
</div>
</div>
<div>
<a target="_blank" id="zn-download-link" style="display: none; color:white; padding-left: 5px; font-size: 20px;" href="#">Access your downloaded files here</a>
</div>
</div>
<script>
/*jslint white: false */
/*global window, $, Util, RFB, */
"use strict";
// Load supporting scripts
Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js",
"keysymdef.js", "keyboard.js", "input.js", "display.js",
"inflator.js", "rfb.js", "keysym.js"]);
var rfb;
var resizeTimeout;
function UIresize() {
if (WebUtil.getConfigVar('resize', false)) {
var innerW = window.innerWidth;
var innerH = window.innerHeight;
var controlbarH = $D('noVNC_status_bar').offsetHeight;
var padding = 5;
if (innerW !== undefined && innerH !== undefined)
rfb.requestDesktopSize(innerW, innerH - controlbarH - padding);
}
}
function FBUComplete(rfb, fbu) {
UIresize();
rfb.set_onFBUComplete(function() { });
}
function passwordRequired(rfb) {
var msg;
msg = '<form onsubmit="return setPassword();"';
msg += ' style="margin-bottom: 0px">';
msg += 'Password Required: ';
msg += '<input type=password size=10 id="password_input" class="noVNC_status">';
msg += '<\/form>';
$D('noVNC_status_bar').setAttribute("class", "noVNC_status_warn");
$D('noVNC_status').innerHTML = msg;
}
function setPassword() {
rfb.sendPassword($D('password_input').value);
return false;
}
function sendCtrlAltDel() {
rfb.sendCtrlAltDel();
return false;
}
function xvpShutdown() {
rfb.xvpShutdown();
return false;
}
function xvpReboot() {
rfb.xvpReboot();
return false;
}
function xvpReset() {
rfb.xvpReset();
return false;
}
function updateState(rfb, state, oldstate, msg) {
var s, sb, cad, level;
s = $D('noVNC_status');
sb = $D('noVNC_status_bar');
//cad = $D('sendCtrlAltDelButton');
switch (state) {
case 'failed': level = "error"; break;
case 'fatal': level = "error"; break;
case 'normal': level = "normal"; break;
case 'disconnected': level = "normal"; break;
case 'loaded': level = "normal"; break;
default: level = "warn"; break;
}
if (state === "normal") {
//cad.disabled = false;
} else {
//cad.disabled = true;
xvpInit(0);
}
if (typeof(msg) !== 'undefined') {
sb.setAttribute("class", "noVNC_status_" + level);
s.innerHTML = msg;
}
}
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 xvpInit(ver) {
var xvpbuttons;
xvpbuttons = $D('noVNC_xvp_buttons');
if (ver >= 1) {
xvpbuttons.style.display = 'inline';
} else {
xvpbuttons.style.display = 'none';
}
}
function onClipboard(rfb, text){
$D('copyBox').value = text
if(window['yakpal'] && window.yakpal.setClipboard){
yakpal.setClipboard(text);
}
}
window.onscriptsload = function () {
var host, port, password, path, token, lastClipboard;
// Expire any old (>4h) entries from localStorage
Object.keys(localStorage)
.filter((x)=>x.indexOf('coyote-url-') === 0)
.map((x)=>[x, JSON.parse(localStorage.getItem(x))])
.filter((x)=>!x[1].timestamp || (new Date() - new Date(x[1].timestamp)) > 1000 * 3600 * 4)
.map((x)=>localStorage.removeItem(x[0]));
// If we have an RID, try to load the real URL from session storage
var rid = WebUtil.getConfigVar('rid', '');
var url = localStorage.getItem('coyote-url-' + rid);
if (rid && url)
window.history.replaceState({}, document.title, url.url);
//$D('sendCtrlAltDelButton').style.display = "inline";
//$D('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
//$D('xvpShutdownButton').onclick = xvpShutdown;
//$D('xvpRebootButton').onclick = xvpReboot;
//$D('xvpResetButton').onclick = xvpReset;
$D('noVNC_canvas').addEventListener('click',function(){
$D('vnc-input').focus();
});
function updateClipboard(){
lastClipboard = $D('copyBox').value;
rfb.clipboardPasteFrom($D('copyBox').value);
}
$D('copyBox').addEventListener('change', updateClipboard);
$D('copyBox').addEventListener('paste', updateClipboard);
setInterval(function(){
if(!window['yakpal'] || !window.yakpal.getClipboard) return;
//hide use-yakpal if they have it
try{
document.getElementById('use-yakpal').style.display = 'none';
} catch(e){ console.log(e); }
//update clipboard
window.yakpal.getClipboard().then((result)=>{
if(result !== lastClipboard){
$D('copyBox').value = result;
updateClipboard();
}
})
}, 100)
WebUtil.init_logging(WebUtil.getConfigVar('logging', 'warn'));
document.title = unescape(WebUtil.getConfigVar('title', 'noVNC'));
// By default, use the host and port of server that served this file
host = WebUtil.getConfigVar('host', window.location.hostname);
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;
}
}
password = WebUtil.getConfigVar('password', '');
path = WebUtil.getConfigVar('path', 'websockify');
// If a token variable is passed in, set the parameter in a cookie.
// This is used by nova-novncproxy.
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)
}
if ((!host) || (!port)) {
updateState(null, 'fatal', null, 'Must specify host and port in URL');
return;
}
try {
rfb = new RFB({'target': $D('noVNC_canvas'),
'focusContainer': $D("vnc-input"),
'encrypt': WebUtil.getConfigVar('encrypt',(window.location.protocol === "https:")),
'repeaterID': WebUtil.getConfigVar('repeaterID', ''),
'true_color': WebUtil.getConfigVar('true_color', false),
'local_cursor': WebUtil.getConfigVar('cursor', true),
'shared': WebUtil.getConfigVar('shared', true),
'view_only': WebUtil.getConfigVar('view_only', false),
'onUpdateState': updateState,
'onXvpInit': xvpInit,
'onPasswordRequired': passwordRequired,
'onFBUComplete': FBUComplete,
'onClipboard': onClipboard
});
} catch (exc) {
updateState(null, 'fatal', null, 'Unable to create RFB client -- ' + exc);
return; // don't continue trying to connect
}
var coyoteName = WebUtil.getConfigVar('name', '');
var elm = document.getElementById('zn-download-link');
elm.href = '/download/' + coyoteName;
elm.style.display = '';
// Scrub the query params from the URL so that it can be safely copy/pasted
// However, to support F5 or Ctrl-Shift-T, save the real URL in localstorage
// under a magic ID. The credentials are only valid for ~30 minutes after
// the user disconnects anyway, so this isn't a huge security issue.
console.log("Pushing new URL. Original: " + window.location.href);
if (!rid) {
rid = ("" + Math.random()).replace("0.", "");
}
localStorage.setItem("coyote-url-" + rid, JSON.stringify({url: window.location.href, timestamp: new Date()}));
window.history.replaceState({}, document.title, window.location.pathname + "?rid=" + rid);
rfb.connect(host, port, password, path);
};
</script>
</body>
</html>