1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2025-07-30 04:01:09 +00:00

fix console password & sendkey & css fixes & add scale vb

This commit is contained in:
catborise 2020-06-24 12:39:32 +03:00
parent 48f9ba6d73
commit 4f8a1fd50d
9 changed files with 767 additions and 886 deletions
static/js/spice-html5

View file

@ -24,7 +24,7 @@ import { SpiceCursorConn } from './cursor.js';
import { SpiceConn } from './spiceconn.js';
import { DEBUG } from './utils.js';
import { SpiceFileXferTask } from './filexfer.js';
import { SpiceInputsConn, sendCtrlAltDel } from './inputs.js';
import { SpiceInputsConn, sendCtrlAltDel, sendCtrlAltFN } from './inputs.js';
import { SpiceDisplayConn } from './display.js';
import { SpicePlaybackConn } from './playback.js';
import { SpicePortConn } from './port.js';
@ -63,8 +63,7 @@ import { resize_helper, handle_resize } from './resize.js';
** browser, including WebSocket and WebSocket.binaryType == arraybuffer
**
**--------------------------------------------------------------------------*/
function SpiceMainConn()
{
function SpiceMainConn() {
if (typeof WebSocket === "undefined")
throw new Error("WebSocket unavailable. You need to use a different browser.");
@ -78,47 +77,42 @@ function SpiceMainConn()
}
SpiceMainConn.prototype = Object.create(SpiceConn.prototype);
SpiceMainConn.prototype.process_channel_message = function(msg)
{
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_BEGIN)
{
SpiceMainConn.prototype.process_channel_message = function (msg) {
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_BEGIN) {
this.known_unimplemented(msg.type, "Main Migrate Begin");
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_CANCEL)
{
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_CANCEL) {
this.known_unimplemented(msg.type, "Main Migrate Cancel");
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_INIT)
{
if (msg.type == Constants.SPICE_MSG_MAIN_INIT) {
this.log_info("Connected to " + this.ws.url);
this.report_success("Connected")
this.main_init = new Messages.SpiceMsgMainInit(msg.data);
this.connection_id = this.main_init.session_id;
this.agent_tokens = this.main_init.agent_tokens;
if (DEBUG > 0)
{
if (DEBUG > 0) {
// FIXME - there is a lot here we don't handle; mouse modes, agent,
// ram_hint, multi_media_time
this.log_info("session id " + this.main_init.session_id +
" ; display_channels_hint " + this.main_init.display_channels_hint +
" ; supported_mouse_modes " + this.main_init.supported_mouse_modes +
" ; current_mouse_mode " + this.main_init.current_mouse_mode +
" ; agent_connected " + this.main_init.agent_connected +
" ; agent_tokens " + this.main_init.agent_tokens +
" ; multi_media_time " + this.main_init.multi_media_time +
" ; ram_hint " + this.main_init.ram_hint);
this.log_info("session id " + this.main_init.session_id +
" ; display_channels_hint " + this.main_init.display_channels_hint +
" ; supported_mouse_modes " + this.main_init.supported_mouse_modes +
" ; current_mouse_mode " + this.main_init.current_mouse_mode +
" ; agent_connected " + this.main_init.agent_connected +
" ; agent_tokens " + this.main_init.agent_tokens +
" ; multi_media_time " + this.main_init.multi_media_time +
" ; ram_hint " + this.main_init.ram_hint);
}
this.our_mm_time = Date.now();
this.mm_time = this.main_init.multi_media_time;
this.handle_mouse_mode(this.main_init.current_mouse_mode,
this.main_init.supported_mouse_modes);
this.main_init.supported_mouse_modes);
if (this.main_init.agent_connected)
this.connect_agent();
@ -130,45 +124,39 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_MOUSE_MODE)
{
if (msg.type == Constants.SPICE_MSG_MAIN_MOUSE_MODE) {
var mode = new Messages.SpiceMsgMainMouseMode(msg.data);
DEBUG > 0 && this.log_info("Mouse supported modes " + mode.supported_modes + "; current " + mode.current_mode);
this.handle_mouse_mode(mode.current_mode, mode.supported_modes);
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_MULTI_MEDIA_TIME)
{
if (msg.type == Constants.SPICE_MSG_MAIN_MULTI_MEDIA_TIME) {
this.known_unimplemented(msg.type, "Main Multi Media Time");
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_CHANNELS_LIST)
{
if (msg.type == Constants.SPICE_MSG_MAIN_CHANNELS_LIST) {
var i;
var chans;
DEBUG > 0 && console.log("channels");
chans = new Messages.SpiceMsgChannels(msg.data);
for (i = 0; i < chans.channels.length; i++)
{
for (i = 0; i < chans.channels.length; i++) {
var conn = {
uri: this.ws.url,
parent: this,
connection_id : this.connection_id,
type : chans.channels[i].type,
chan_id : chans.channels[i].id
};
if (chans.channels[i].type == Constants.SPICE_CHANNEL_DISPLAY)
{
uri: this.ws.url,
parent: this,
connection_id: this.connection_id,
type: chans.channels[i].type,
chan_id: chans.channels[i].id
};
if (chans.channels[i].type == Constants.SPICE_CHANNEL_DISPLAY) {
if (chans.channels[i].id == 0) {
this.display = new SpiceDisplayConn(conn);
} else {
this.log_warn("The spice-html5 client does not handle multiple heads.");
}
}
else if (chans.channels[i].type == Constants.SPICE_CHANNEL_INPUTS)
{
else if (chans.channels[i].type == Constants.SPICE_CHANNEL_INPUTS) {
this.inputs = new SpiceInputsConn(conn);
this.inputs.mouse_mode = this.mouse_mode;
}
@ -178,9 +166,8 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
this.cursor = new SpicePlaybackConn(conn);
else if (chans.channels[i].type == Constants.SPICE_CHANNEL_PORT)
this.ports.push(new SpicePortConn(conn));
else
{
if (! ("extra_channels" in this))
else {
if (!("extra_channels" in this))
this.extra_channels = [];
this.extra_channels[i] = new SpiceConn(conn);
this.log_err("Channel type " + this.extra_channels[i].channel_type() + " not implemented");
@ -191,29 +178,25 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_CONNECTED)
{
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_CONNECTED) {
this.connect_agent();
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS)
{
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS) {
var connected_tokens = new Messages.SpiceMsgMainAgentTokens(msg.data);
this.agent_tokens = connected_tokens.num_tokens;
this.connect_agent();
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_TOKEN)
{
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_TOKEN) {
var remaining_tokens, tokens = new Messages.SpiceMsgMainAgentTokens(msg.data);
this.agent_tokens += tokens.num_tokens;
this.send_agent_message_queue();
remaining_tokens = this.agent_tokens;
while (remaining_tokens > 0 && this.file_xfer_read_queue.length > 0)
{
while (remaining_tokens > 0 && this.file_xfer_read_queue.length > 0) {
var xfer_task = this.file_xfer_read_queue.shift();
this.file_xfer_read(xfer_task, xfer_task.read_bytes);
remaining_tokens--;
@ -221,24 +204,20 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_DISCONNECTED)
{
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_DISCONNECTED) {
this.agent_connected = false;
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_DATA)
{
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_DATA) {
var agent_data = new Messages.SpiceMsgMainAgentData(msg.data);
if (agent_data.type == Constants.VD_AGENT_ANNOUNCE_CAPABILITIES)
{
if (agent_data.type == Constants.VD_AGENT_ANNOUNCE_CAPABILITIES) {
var agent_caps = new Messages.VDAgentAnnounceCapabilities(agent_data.data);
if (agent_caps.request)
this.announce_agent_capabilities(0);
return true;
}
else if (agent_data.type == Constants.VD_AGENT_FILE_XFER_STATUS)
{
else if (agent_data.type == Constants.VD_AGENT_FILE_XFER_STATUS) {
this.handle_file_xfer_status(new Messages.VDAgentFileXferStatusMessage(agent_data.data));
return true;
}
@ -246,44 +225,37 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
return false;
}
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST)
{
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST) {
this.known_unimplemented(msg.type, "Main Migrate Switch Host");
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_END)
{
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_END) {
this.known_unimplemented(msg.type, "Main Migrate End");
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_NAME)
{
if (msg.type == Constants.SPICE_MSG_MAIN_NAME) {
this.known_unimplemented(msg.type, "Main Name");
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_UUID)
{
if (msg.type == Constants.SPICE_MSG_MAIN_UUID) {
this.known_unimplemented(msg.type, "Main UUID");
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS)
{
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS) {
this.known_unimplemented(msg.type, "Main Migrate Begin Seamless");
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK)
{
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK) {
this.known_unimplemented(msg.type, "Main Migrate Dst Seamless ACK");
return true;
}
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK)
{
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK) {
this.known_unimplemented(msg.type, "Main Migrate Dst Seamless NACK");
return true;
}
@ -291,24 +263,20 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
return false;
}
SpiceMainConn.prototype.stop = function(msg)
{
SpiceMainConn.prototype.stop = function (msg) {
this.state = "closing";
if (this.inputs)
{
if (this.inputs) {
this.inputs.cleanup();
this.inputs = undefined;
}
if (this.cursor)
{
if (this.cursor) {
this.cursor.cleanup();
this.cursor = undefined;
}
if (this.display)
{
if (this.display) {
this.display.cleanup();
this.display.destroy_surfaces();
this.display = undefined;
@ -322,30 +290,26 @@ SpiceMainConn.prototype.stop = function(msg)
this.extra_channels = undefined;
}
SpiceMainConn.prototype.send_agent_message_queue = function(message)
{
SpiceMainConn.prototype.send_agent_message_queue = function (message) {
if (!this.agent_connected)
return;
if (message)
this.agent_msg_queue.push(message);
while (this.agent_tokens > 0 && this.agent_msg_queue.length > 0)
{
while (this.agent_tokens > 0 && this.agent_msg_queue.length > 0) {
var mr = this.agent_msg_queue.shift();
this.send_msg(mr);
this.agent_tokens--;
}
}
SpiceMainConn.prototype.send_agent_message = function(type, message)
{
SpiceMainConn.prototype.send_agent_message = function (type, message) {
var agent_data = new Messages.SpiceMsgcMainAgentData(type, message);
var sb = 0, maxsize = Constants.VD_AGENT_MAX_DATA_SIZE - Messages.SpiceMiniData.prototype.buffer_size();
var data = new ArrayBuffer(agent_data.buffer_size());
agent_data.to_buffer(data);
while (sb < agent_data.buffer_size())
{
while (sb < agent_data.buffer_size()) {
var eb = Math.min(sb + maxsize, agent_data.buffer_size());
var mr = new Messages.SpiceMiniData();
mr.type = Constants.SPICE_MSGC_MAIN_AGENT_DATA;
@ -356,22 +320,19 @@ SpiceMainConn.prototype.send_agent_message = function(type, message)
}
}
SpiceMainConn.prototype.announce_agent_capabilities = function(request)
{
SpiceMainConn.prototype.announce_agent_capabilities = function (request) {
var caps = new Messages.VDAgentAnnounceCapabilities(request, (1 << Constants.VD_AGENT_CAP_MOUSE_STATE) |
(1 << Constants.VD_AGENT_CAP_MONITORS_CONFIG) |
(1 << Constants.VD_AGENT_CAP_REPLY));
(1 << Constants.VD_AGENT_CAP_MONITORS_CONFIG) |
(1 << Constants.VD_AGENT_CAP_REPLY));
this.send_agent_message(Constants.VD_AGENT_ANNOUNCE_CAPABILITIES, caps);
}
SpiceMainConn.prototype.resize_window = function(flags, width, height, depth, x, y)
{
SpiceMainConn.prototype.resize_window = function (flags, width, height, depth, x, y) {
var monitors_config = new Messages.VDAgentMonitorsConfig(flags, width, height, depth, x, y);
this.send_agent_message(Constants.VD_AGENT_MONITORS_CONFIG, monitors_config);
}
SpiceMainConn.prototype.file_xfer_start = function(file)
{
SpiceMainConn.prototype.file_xfer_start = function (file) {
var task_id, xfer_start, task;
task_id = this.file_xfer_task_id++;
@ -382,16 +343,13 @@ SpiceMainConn.prototype.file_xfer_start = function(file)
this.send_agent_message(Constants.VD_AGENT_FILE_XFER_START, xfer_start);
}
SpiceMainConn.prototype.handle_file_xfer_status = function(file_xfer_status)
{
SpiceMainConn.prototype.handle_file_xfer_status = function (file_xfer_status) {
var xfer_error, xfer_task;
if (!this.file_xfer_tasks[file_xfer_status.id])
{
if (!this.file_xfer_tasks[file_xfer_status.id]) {
return;
}
xfer_task = this.file_xfer_tasks[file_xfer_status.id];
switch (file_xfer_status.result)
{
switch (file_xfer_status.result) {
case Constants.VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA:
this.file_xfer_read(xfer_task);
return;
@ -411,8 +369,7 @@ SpiceMainConn.prototype.handle_file_xfer_status = function(file_xfer_status)
this.file_xfer_completed(xfer_task, xfer_error)
}
SpiceMainConn.prototype.file_xfer_read = function(file_xfer_task, start_byte)
{
SpiceMainConn.prototype.file_xfer_read = function (file_xfer_task, start_byte) {
var FILE_XFER_CHUNK_SIZE = 32 * Constants.VD_AGENT_MAX_DATA_SIZE;
var _this = this;
var sb, eb;
@ -420,36 +377,32 @@ SpiceMainConn.prototype.file_xfer_read = function(file_xfer_task, start_byte)
if (!file_xfer_task ||
!this.file_xfer_tasks[file_xfer_task.id] ||
(start_byte > 0 && start_byte == file_xfer_task.file.size))
{
(start_byte > 0 && start_byte == file_xfer_task.file.size)) {
return;
}
if (file_xfer_task.cancelled)
{
if (file_xfer_task.cancelled) {
var xfer_status = new Messages.VDAgentFileXferStatusMessage(file_xfer_task.id,
Constants.VD_AGENT_FILE_XFER_STATUS_CANCELLED);
Constants.VD_AGENT_FILE_XFER_STATUS_CANCELLED);
this.send_agent_message(Constants.VD_AGENT_FILE_XFER_STATUS, xfer_status);
delete this.file_xfer_tasks[file_xfer_task.id];
return;
}
sb = start_byte || 0,
eb = Math.min(sb + FILE_XFER_CHUNK_SIZE, file_xfer_task.file.size);
eb = Math.min(sb + FILE_XFER_CHUNK_SIZE, file_xfer_task.file.size);
if (!this.agent_tokens)
{
if (!this.agent_tokens) {
file_xfer_task.read_bytes = sb;
this.file_xfer_read_queue.push(file_xfer_task);
return;
}
reader = new FileReader();
reader.onload = function(e)
{
reader.onload = function (e) {
var xfer_data = new Messages.VDAgentFileXferDataMessage(file_xfer_task.id,
e.target.result.byteLength,
e.target.result);
e.target.result.byteLength,
e.target.result);
_this.send_agent_message(Constants.VD_AGENT_FILE_XFER_DATA, xfer_data);
_this.file_xfer_read(file_xfer_task, eb);
file_xfer_task.update_progressbar(eb);
@ -459,20 +412,18 @@ SpiceMainConn.prototype.file_xfer_read = function(file_xfer_task, start_byte)
reader.readAsArrayBuffer(slice);
}
SpiceMainConn.prototype.file_xfer_completed = function(file_xfer_task, error)
{
SpiceMainConn.prototype.file_xfer_completed = function (file_xfer_task, error) {
if (error)
this.log_err(error);
else
this.log_info("transfer of '" + file_xfer_task.file.name +"' was successful");
this.log_info("transfer of '" + file_xfer_task.file.name + "' was successful");
file_xfer_task.remove_progressbar();
delete this.file_xfer_tasks[file_xfer_task.id];
}
SpiceMainConn.prototype.connect_agent = function()
{
SpiceMainConn.prototype.connect_agent = function () {
this.agent_connected = true;
var agent_start = new Messages.SpiceMsgcMainAgentStart(~0);
@ -487,11 +438,9 @@ SpiceMainConn.prototype.connect_agent = function()
}
SpiceMainConn.prototype.handle_mouse_mode = function(current, supported)
{
SpiceMainConn.prototype.handle_mouse_mode = function (current, supported) {
this.mouse_mode = current;
if (current != Constants.SPICE_MOUSE_MODE_CLIENT && (supported & Constants.SPICE_MOUSE_MODE_CLIENT))
{
if (current != Constants.SPICE_MOUSE_MODE_CLIENT && (supported & Constants.SPICE_MOUSE_MODE_CLIENT)) {
var mode_request = new Messages.SpiceMsgcMainMouseModeRequest(Constants.SPICE_MOUSE_MODE_CLIENT);
var mr = new Messages.SpiceMiniData();
mr.build_msg(Constants.SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST, mode_request);
@ -503,17 +452,17 @@ SpiceMainConn.prototype.handle_mouse_mode = function(current, supported)
}
/* Shift current time to attempt to get a time matching that of the server */
SpiceMainConn.prototype.relative_now = function()
{
SpiceMainConn.prototype.relative_now = function () {
var ret = (Date.now() - this.our_mm_time) + this.mm_time;
return ret;
}
export {
SpiceMainConn,
handle_file_dragover,
handle_file_drop,
resize_helper,
handle_resize,
sendCtrlAltDel,
SpiceMainConn,
handle_file_dragover,
handle_file_drop,
resize_helper,
handle_resize,
sendCtrlAltDel,
sendCtrlAltFN,
};