Merge pull request #1204 from juanjoDiaz/small_improvements
Small improvements
This commit is contained in:
commit
9a823732a0
43
app/ui.js
43
app/ui.js
|
@ -39,22 +39,20 @@ const UI = {
|
||||||
reconnect_callback: null,
|
reconnect_callback: null,
|
||||||
reconnect_password: null,
|
reconnect_password: null,
|
||||||
|
|
||||||
prime(callback) {
|
prime() {
|
||||||
if (document.readyState === "interactive" || document.readyState === "complete") {
|
return WebUtil.initSettings().then(() => {
|
||||||
UI.load(callback);
|
if (document.readyState === "interactive" || document.readyState === "complete") {
|
||||||
} else {
|
return UI.start();
|
||||||
document.addEventListener('DOMContentLoaded', UI.load.bind(UI, callback));
|
}
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Setup rfb object, load settings from browser storage, then call
|
return new Promise((resolve, reject) => {
|
||||||
// UI.init to setup the UI/menus
|
document.addEventListener('DOMContentLoaded', () => UI.start().then(resolve).catch(reject));
|
||||||
load(callback) {
|
});
|
||||||
WebUtil.initSettings(UI.start, callback);
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
// Render default UI and initialize settings menu
|
// Render default UI and initialize settings menu
|
||||||
start(callback) {
|
start() {
|
||||||
|
|
||||||
UI.initSettings();
|
UI.initSettings();
|
||||||
|
|
||||||
|
@ -105,9 +103,7 @@ const UI = {
|
||||||
UI.openConnectPanel();
|
UI.openConnectPanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof callback === "function") {
|
return Promise.resolve(UI.rfb);
|
||||||
callback(UI.rfb);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
initFullscreen() {
|
initFullscreen() {
|
||||||
|
@ -1646,18 +1642,13 @@ const UI = {
|
||||||
// Set up translations
|
// Set up translations
|
||||||
const LINGUAS = ["cs", "de", "el", "es", "ko", "nl", "pl", "ru", "sv", "tr", "zh_CN", "zh_TW"];
|
const LINGUAS = ["cs", "de", "el", "es", "ko", "nl", "pl", "ru", "sv", "tr", "zh_CN", "zh_TW"];
|
||||||
l10n.setup(LINGUAS);
|
l10n.setup(LINGUAS);
|
||||||
if (l10n.language !== "en" && l10n.dictionary === undefined) {
|
if (l10n.language === "en" || l10n.dictionary !== undefined) {
|
||||||
WebUtil.fetchJSON('app/locale/' + l10n.language + '.json', (translations) => {
|
|
||||||
l10n.dictionary = translations;
|
|
||||||
|
|
||||||
// wait for translations to load before loading the UI
|
|
||||||
UI.prime();
|
|
||||||
}, (err) => {
|
|
||||||
Log.Error("Failed to load translations: " + err);
|
|
||||||
UI.prime();
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
UI.prime();
|
UI.prime();
|
||||||
|
} else {
|
||||||
|
WebUtil.fetchJSON('app/locale/' + l10n.language + '.json')
|
||||||
|
.then((translations) => { l10n.dictionary = translations; })
|
||||||
|
.catch(err => Log.Error("Failed to load translations: " + err))
|
||||||
|
.then(UI.prime);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default UI;
|
export default UI;
|
||||||
|
|
|
@ -114,22 +114,14 @@ export function eraseCookie(name) {
|
||||||
|
|
||||||
let settings = {};
|
let settings = {};
|
||||||
|
|
||||||
export function initSettings(callback /*, ...callbackArgs */) {
|
export function initSettings() {
|
||||||
"use strict";
|
if (!window.chrome || !window.chrome.storage) {
|
||||||
const callbackArgs = Array.prototype.slice.call(arguments, 1);
|
|
||||||
if (window.chrome && window.chrome.storage) {
|
|
||||||
window.chrome.storage.sync.get((cfg) => {
|
|
||||||
settings = cfg;
|
|
||||||
if (callback) {
|
|
||||||
callback.apply(this, callbackArgs);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
settings = {};
|
settings = {};
|
||||||
if (callback) {
|
return Promise.resolve();
|
||||||
callback.apply(this, callbackArgs);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return new Promise(resolve => window.chrome.storage.sync.get(resolve))
|
||||||
|
.then((cfg) => { settings = cfg; });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the settings cache, but do not write to permanent storage
|
// Update the settings cache, but do not write to permanent storage
|
||||||
|
@ -218,28 +210,30 @@ export function injectParamIfMissing(path, param, value) {
|
||||||
// IE11 support or polyfill promises and fetch in IE11.
|
// IE11 support or polyfill promises and fetch in IE11.
|
||||||
// resolve will receive an object on success, while reject
|
// resolve will receive an object on success, while reject
|
||||||
// will receive either an event or an error on failure.
|
// will receive either an event or an error on failure.
|
||||||
export function fetchJSON(path, resolve, reject) {
|
export function fetchJSON(path) {
|
||||||
// NB: IE11 doesn't support JSON as a responseType
|
return new Promise((resolve, reject) => {
|
||||||
const req = new XMLHttpRequest();
|
// NB: IE11 doesn't support JSON as a responseType
|
||||||
req.open('GET', path);
|
const req = new XMLHttpRequest();
|
||||||
|
req.open('GET', path);
|
||||||
|
|
||||||
req.onload = () => {
|
req.onload = () => {
|
||||||
if (req.status === 200) {
|
if (req.status === 200) {
|
||||||
let resObj;
|
let resObj;
|
||||||
try {
|
try {
|
||||||
resObj = JSON.parse(req.responseText);
|
resObj = JSON.parse(req.responseText);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
reject(err);
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(resObj);
|
||||||
|
} else {
|
||||||
|
reject(new Error("XHR got non-200 status while trying to load '" + path + "': " + req.status));
|
||||||
}
|
}
|
||||||
resolve(resObj);
|
};
|
||||||
} else {
|
|
||||||
reject(new Error("XHR got non-200 status while trying to load '" + path + "': " + req.status));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
req.onerror = evt => reject(new Error("XHR encountered an error while trying to load '" + path + "': " + evt.message));
|
req.onerror = evt => reject(new Error("XHR encountered an error while trying to load '" + path + "': " + evt.message));
|
||||||
|
|
||||||
req.ontimeout = evt => reject(new Error("XHR timed out while trying to load '" + path + "'"));
|
req.ontimeout = evt => reject(new Error("XHR timed out while trying to load '" + path + "'"));
|
||||||
|
|
||||||
req.send();
|
req.send();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,9 +56,7 @@ export default {
|
||||||
],
|
],
|
||||||
/* eslint-enable comma-spacing */
|
/* eslint-enable comma-spacing */
|
||||||
|
|
||||||
decode(data, offset) {
|
decode(data, offset = 0) {
|
||||||
offset = typeof(offset) !== 'undefined' ? offset : 0;
|
|
||||||
|
|
||||||
let data_length = data.indexOf('=') - offset;
|
let data_length = data.indexOf('=') - offset;
|
||||||
if (data_length < 0) { data_length = data.length - offset; }
|
if (data_length < 0) { data_length = data.length - offset; }
|
||||||
|
|
||||||
|
|
141
core/des.js
141
core/des.js
|
@ -77,67 +77,68 @@
|
||||||
|
|
||||||
/* eslint-disable comma-spacing */
|
/* eslint-disable comma-spacing */
|
||||||
|
|
||||||
export default function DES(passwd) {
|
// Tables, permutations, S-boxes, etc.
|
||||||
"use strict";
|
const PC2 = [13,16,10,23, 0, 4, 2,27,14, 5,20, 9,22,18,11, 3,
|
||||||
|
25, 7,15, 6,26,19,12, 1,40,51,30,36,46,54,29,39,
|
||||||
|
50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31 ],
|
||||||
|
totrot = [ 1, 2, 4, 6, 8,10,12,14,15,17,19,21,23,25,27,28];
|
||||||
|
|
||||||
// Tables, permutations, S-boxes, etc.
|
const z = 0x0;
|
||||||
const PC2 = [13,16,10,23, 0, 4, 2,27,14, 5,20, 9,22,18,11, 3,
|
let a,b,c,d,e,f;
|
||||||
25, 7,15, 6,26,19,12, 1,40,51,30,36,46,54,29,39,
|
a=1<<16; b=1<<24; c=a|b; d=1<<2; e=1<<10; f=d|e;
|
||||||
50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31 ],
|
const SP1 = [c|e,z|z,a|z,c|f,c|d,a|f,z|d,a|z,z|e,c|e,c|f,z|e,b|f,c|d,b|z,z|d,
|
||||||
totrot = [ 1, 2, 4, 6, 8,10,12,14,15,17,19,21,23,25,27,28],
|
z|f,b|e,b|e,a|e,a|e,c|z,c|z,b|f,a|d,b|d,b|d,a|d,z|z,z|f,a|f,b|z,
|
||||||
z = 0x0,
|
a|z,c|f,z|d,c|z,c|e,b|z,b|z,z|e,c|d,a|z,a|e,b|d,z|e,z|d,b|f,a|f,
|
||||||
keys = [];
|
c|f,a|d,c|z,b|f,b|d,z|f,a|f,c|e,z|f,b|e,b|e,z|z,a|d,a|e,z|z,c|d];
|
||||||
let a,b,c,d,e,f;
|
a=1<<20; b=1<<31; c=a|b; d=1<<5; e=1<<15; f=d|e;
|
||||||
|
const SP2 = [c|f,b|e,z|e,a|f,a|z,z|d,c|d,b|f,b|d,c|f,c|e,b|z,b|e,a|z,z|d,c|d,
|
||||||
|
a|e,a|d,b|f,z|z,b|z,z|e,a|f,c|z,a|d,b|d,z|z,a|e,z|f,c|e,c|z,z|f,
|
||||||
|
z|z,a|f,c|d,a|z,b|f,c|z,c|e,z|e,c|z,b|e,z|d,c|f,a|f,z|d,z|e,b|z,
|
||||||
|
z|f,c|e,a|z,b|d,a|d,b|f,b|d,a|d,a|e,z|z,b|e,z|f,b|z,c|d,c|f,a|e];
|
||||||
|
a=1<<17; b=1<<27; c=a|b; d=1<<3; e=1<<9; f=d|e;
|
||||||
|
const SP3 = [z|f,c|e,z|z,c|d,b|e,z|z,a|f,b|e,a|d,b|d,b|d,a|z,c|f,a|d,c|z,z|f,
|
||||||
|
b|z,z|d,c|e,z|e,a|e,c|z,c|d,a|f,b|f,a|e,a|z,b|f,z|d,c|f,z|e,b|z,
|
||||||
|
c|e,b|z,a|d,z|f,a|z,c|e,b|e,z|z,z|e,a|d,c|f,b|e,b|d,z|e,z|z,c|d,
|
||||||
|
b|f,a|z,b|z,c|f,z|d,a|f,a|e,b|d,c|z,b|f,z|f,c|z,a|f,z|d,c|d,a|e];
|
||||||
|
a=1<<13; b=1<<23; c=a|b; d=1<<0; e=1<<7; f=d|e;
|
||||||
|
const SP4 = [c|d,a|f,a|f,z|e,c|e,b|f,b|d,a|d,z|z,c|z,c|z,c|f,z|f,z|z,b|e,b|d,
|
||||||
|
z|d,a|z,b|z,c|d,z|e,b|z,a|d,a|e,b|f,z|d,a|e,b|e,a|z,c|e,c|f,z|f,
|
||||||
|
b|e,b|d,c|z,c|f,z|f,z|z,z|z,c|z,a|e,b|e,b|f,z|d,c|d,a|f,a|f,z|e,
|
||||||
|
c|f,z|f,z|d,a|z,b|d,a|d,c|e,b|f,a|d,a|e,b|z,c|d,z|e,b|z,a|z,c|e];
|
||||||
|
a=1<<25; b=1<<30; c=a|b; d=1<<8; e=1<<19; f=d|e;
|
||||||
|
const SP5 = [z|d,a|f,a|e,c|d,z|e,z|d,b|z,a|e,b|f,z|e,a|d,b|f,c|d,c|e,z|f,b|z,
|
||||||
|
a|z,b|e,b|e,z|z,b|d,c|f,c|f,a|d,c|e,b|d,z|z,c|z,a|f,a|z,c|z,z|f,
|
||||||
|
z|e,c|d,z|d,a|z,b|z,a|e,c|d,b|f,a|d,b|z,c|e,a|f,b|f,z|d,a|z,c|e,
|
||||||
|
c|f,z|f,c|z,c|f,a|e,z|z,b|e,c|z,z|f,a|d,b|d,z|e,z|z,b|e,a|f,b|d];
|
||||||
|
a=1<<22; b=1<<29; c=a|b; d=1<<4; e=1<<14; f=d|e;
|
||||||
|
const SP6 = [b|d,c|z,z|e,c|f,c|z,z|d,c|f,a|z,b|e,a|f,a|z,b|d,a|d,b|e,b|z,z|f,
|
||||||
|
z|z,a|d,b|f,z|e,a|e,b|f,z|d,c|d,c|d,z|z,a|f,c|e,z|f,a|e,c|e,b|z,
|
||||||
|
b|e,z|d,c|d,a|e,c|f,a|z,z|f,b|d,a|z,b|e,b|z,z|f,b|d,c|f,a|e,c|z,
|
||||||
|
a|f,c|e,z|z,c|d,z|d,z|e,c|z,a|f,z|e,a|d,b|f,z|z,c|e,b|z,a|d,b|f];
|
||||||
|
a=1<<21; b=1<<26; c=a|b; d=1<<1; e=1<<11; f=d|e;
|
||||||
|
const SP7 = [a|z,c|d,b|f,z|z,z|e,b|f,a|f,c|e,c|f,a|z,z|z,b|d,z|d,b|z,c|d,z|f,
|
||||||
|
b|e,a|f,a|d,b|e,b|d,c|z,c|e,a|d,c|z,z|e,z|f,c|f,a|e,z|d,b|z,a|e,
|
||||||
|
b|z,a|e,a|z,b|f,b|f,c|d,c|d,z|d,a|d,b|z,b|e,a|z,c|e,z|f,a|f,c|e,
|
||||||
|
z|f,b|d,c|f,c|z,a|e,z|z,z|d,c|f,z|z,a|f,c|z,z|e,b|d,b|e,z|e,a|d];
|
||||||
|
a=1<<18; b=1<<28; c=a|b; d=1<<6; e=1<<12; f=d|e;
|
||||||
|
const SP8 = [b|f,z|e,a|z,c|f,b|z,b|f,z|d,b|z,a|d,c|z,c|f,a|e,c|e,a|f,z|e,z|d,
|
||||||
|
c|z,b|d,b|e,z|f,a|e,a|d,c|d,c|e,z|f,z|z,z|z,c|d,b|d,b|e,a|f,a|z,
|
||||||
|
a|f,a|z,c|e,z|e,z|d,c|d,z|e,a|f,b|e,z|d,b|d,c|z,c|d,b|z,a|z,b|f,
|
||||||
|
z|z,c|f,a|d,b|d,c|z,b|e,b|f,z|z,c|f,a|e,a|e,z|f,z|f,a|d,b|z,c|e];
|
||||||
|
|
||||||
a=1<<16; b=1<<24; c=a|b; d=1<<2; e=1<<10; f=d|e;
|
/* eslint-enable comma-spacing */
|
||||||
const SP1 = [c|e,z|z,a|z,c|f,c|d,a|f,z|d,a|z,z|e,c|e,c|f,z|e,b|f,c|d,b|z,z|d,
|
|
||||||
z|f,b|e,b|e,a|e,a|e,c|z,c|z,b|f,a|d,b|d,b|d,a|d,z|z,z|f,a|f,b|z,
|
|
||||||
a|z,c|f,z|d,c|z,c|e,b|z,b|z,z|e,c|d,a|z,a|e,b|d,z|e,z|d,b|f,a|f,
|
|
||||||
c|f,a|d,c|z,b|f,b|d,z|f,a|f,c|e,z|f,b|e,b|e,z|z,a|d,a|e,z|z,c|d];
|
|
||||||
a=1<<20; b=1<<31; c=a|b; d=1<<5; e=1<<15; f=d|e;
|
|
||||||
const SP2 = [c|f,b|e,z|e,a|f,a|z,z|d,c|d,b|f,b|d,c|f,c|e,b|z,b|e,a|z,z|d,c|d,
|
|
||||||
a|e,a|d,b|f,z|z,b|z,z|e,a|f,c|z,a|d,b|d,z|z,a|e,z|f,c|e,c|z,z|f,
|
|
||||||
z|z,a|f,c|d,a|z,b|f,c|z,c|e,z|e,c|z,b|e,z|d,c|f,a|f,z|d,z|e,b|z,
|
|
||||||
z|f,c|e,a|z,b|d,a|d,b|f,b|d,a|d,a|e,z|z,b|e,z|f,b|z,c|d,c|f,a|e];
|
|
||||||
a=1<<17; b=1<<27; c=a|b; d=1<<3; e=1<<9; f=d|e;
|
|
||||||
const SP3 = [z|f,c|e,z|z,c|d,b|e,z|z,a|f,b|e,a|d,b|d,b|d,a|z,c|f,a|d,c|z,z|f,
|
|
||||||
b|z,z|d,c|e,z|e,a|e,c|z,c|d,a|f,b|f,a|e,a|z,b|f,z|d,c|f,z|e,b|z,
|
|
||||||
c|e,b|z,a|d,z|f,a|z,c|e,b|e,z|z,z|e,a|d,c|f,b|e,b|d,z|e,z|z,c|d,
|
|
||||||
b|f,a|z,b|z,c|f,z|d,a|f,a|e,b|d,c|z,b|f,z|f,c|z,a|f,z|d,c|d,a|e];
|
|
||||||
a=1<<13; b=1<<23; c=a|b; d=1<<0; e=1<<7; f=d|e;
|
|
||||||
const SP4 = [c|d,a|f,a|f,z|e,c|e,b|f,b|d,a|d,z|z,c|z,c|z,c|f,z|f,z|z,b|e,b|d,
|
|
||||||
z|d,a|z,b|z,c|d,z|e,b|z,a|d,a|e,b|f,z|d,a|e,b|e,a|z,c|e,c|f,z|f,
|
|
||||||
b|e,b|d,c|z,c|f,z|f,z|z,z|z,c|z,a|e,b|e,b|f,z|d,c|d,a|f,a|f,z|e,
|
|
||||||
c|f,z|f,z|d,a|z,b|d,a|d,c|e,b|f,a|d,a|e,b|z,c|d,z|e,b|z,a|z,c|e];
|
|
||||||
a=1<<25; b=1<<30; c=a|b; d=1<<8; e=1<<19; f=d|e;
|
|
||||||
const SP5 = [z|d,a|f,a|e,c|d,z|e,z|d,b|z,a|e,b|f,z|e,a|d,b|f,c|d,c|e,z|f,b|z,
|
|
||||||
a|z,b|e,b|e,z|z,b|d,c|f,c|f,a|d,c|e,b|d,z|z,c|z,a|f,a|z,c|z,z|f,
|
|
||||||
z|e,c|d,z|d,a|z,b|z,a|e,c|d,b|f,a|d,b|z,c|e,a|f,b|f,z|d,a|z,c|e,
|
|
||||||
c|f,z|f,c|z,c|f,a|e,z|z,b|e,c|z,z|f,a|d,b|d,z|e,z|z,b|e,a|f,b|d];
|
|
||||||
a=1<<22; b=1<<29; c=a|b; d=1<<4; e=1<<14; f=d|e;
|
|
||||||
const SP6 = [b|d,c|z,z|e,c|f,c|z,z|d,c|f,a|z,b|e,a|f,a|z,b|d,a|d,b|e,b|z,z|f,
|
|
||||||
z|z,a|d,b|f,z|e,a|e,b|f,z|d,c|d,c|d,z|z,a|f,c|e,z|f,a|e,c|e,b|z,
|
|
||||||
b|e,z|d,c|d,a|e,c|f,a|z,z|f,b|d,a|z,b|e,b|z,z|f,b|d,c|f,a|e,c|z,
|
|
||||||
a|f,c|e,z|z,c|d,z|d,z|e,c|z,a|f,z|e,a|d,b|f,z|z,c|e,b|z,a|d,b|f];
|
|
||||||
a=1<<21; b=1<<26; c=a|b; d=1<<1; e=1<<11; f=d|e;
|
|
||||||
const SP7 = [a|z,c|d,b|f,z|z,z|e,b|f,a|f,c|e,c|f,a|z,z|z,b|d,z|d,b|z,c|d,z|f,
|
|
||||||
b|e,a|f,a|d,b|e,b|d,c|z,c|e,a|d,c|z,z|e,z|f,c|f,a|e,z|d,b|z,a|e,
|
|
||||||
b|z,a|e,a|z,b|f,b|f,c|d,c|d,z|d,a|d,b|z,b|e,a|z,c|e,z|f,a|f,c|e,
|
|
||||||
z|f,b|d,c|f,c|z,a|e,z|z,z|d,c|f,z|z,a|f,c|z,z|e,b|d,b|e,z|e,a|d];
|
|
||||||
a=1<<18; b=1<<28; c=a|b; d=1<<6; e=1<<12; f=d|e;
|
|
||||||
const SP8 = [b|f,z|e,a|z,c|f,b|z,b|f,z|d,b|z,a|d,c|z,c|f,a|e,c|e,a|f,z|e,z|d,
|
|
||||||
c|z,b|d,b|e,z|f,a|e,a|d,c|d,c|e,z|f,z|z,z|z,c|d,b|d,b|e,a|f,a|z,
|
|
||||||
a|f,a|z,c|e,z|e,z|d,c|d,z|e,a|f,b|e,z|d,b|d,c|z,c|d,b|z,a|z,b|f,
|
|
||||||
z|z,c|f,a|d,b|d,c|z,b|e,b|f,z|z,c|f,a|e,a|e,z|f,z|f,a|d,b|z,c|e];
|
|
||||||
|
|
||||||
// Set the key.
|
export default class DES {
|
||||||
function setKeys(keyBlock) {
|
constructor(password) {
|
||||||
|
this.keys = [];
|
||||||
|
|
||||||
|
// Set the key.
|
||||||
const pc1m = [], pcr = [], kn = [];
|
const pc1m = [], pcr = [], kn = [];
|
||||||
|
|
||||||
for (let j = 0, l = 56; j < 56; ++j, l -= 8) {
|
for (let j = 0, l = 56; j < 56; ++j, l -= 8) {
|
||||||
l += l < -5 ? 65 : l < -3 ? 31 : l < -1 ? 63 : l === 27 ? 35 : 0; // PC1
|
l += l < -5 ? 65 : l < -3 ? 31 : l < -1 ? 63 : l === 27 ? 35 : 0; // PC1
|
||||||
const m = l & 0x7;
|
const m = l & 0x7;
|
||||||
pc1m[j] = ((keyBlock[l >>> 3] & (1<<m)) !== 0) ? 1: 0;
|
pc1m[j] = ((password[l >>> 3] & (1<<m)) !== 0) ? 1: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < 16; ++i) {
|
for (let i = 0; i < 16; ++i) {
|
||||||
|
@ -164,21 +165,21 @@ export default function DES(passwd) {
|
||||||
for (let i = 0, rawi = 0, KnLi = 0; i < 16; ++i) {
|
for (let i = 0, rawi = 0, KnLi = 0; i < 16; ++i) {
|
||||||
const raw0 = kn[rawi++];
|
const raw0 = kn[rawi++];
|
||||||
const raw1 = kn[rawi++];
|
const raw1 = kn[rawi++];
|
||||||
keys[KnLi] = (raw0 & 0x00fc0000) << 6;
|
this.keys[KnLi] = (raw0 & 0x00fc0000) << 6;
|
||||||
keys[KnLi] |= (raw0 & 0x00000fc0) << 10;
|
this.keys[KnLi] |= (raw0 & 0x00000fc0) << 10;
|
||||||
keys[KnLi] |= (raw1 & 0x00fc0000) >>> 10;
|
this.keys[KnLi] |= (raw1 & 0x00fc0000) >>> 10;
|
||||||
keys[KnLi] |= (raw1 & 0x00000fc0) >>> 6;
|
this.keys[KnLi] |= (raw1 & 0x00000fc0) >>> 6;
|
||||||
++KnLi;
|
++KnLi;
|
||||||
keys[KnLi] = (raw0 & 0x0003f000) << 12;
|
this.keys[KnLi] = (raw0 & 0x0003f000) << 12;
|
||||||
keys[KnLi] |= (raw0 & 0x0000003f) << 16;
|
this.keys[KnLi] |= (raw0 & 0x0000003f) << 16;
|
||||||
keys[KnLi] |= (raw1 & 0x0003f000) >>> 4;
|
this.keys[KnLi] |= (raw1 & 0x0003f000) >>> 4;
|
||||||
keys[KnLi] |= (raw1 & 0x0000003f);
|
this.keys[KnLi] |= (raw1 & 0x0000003f);
|
||||||
++KnLi;
|
++KnLi;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encrypt 8 bytes of text
|
// Encrypt 8 bytes of text
|
||||||
function enc8(text) {
|
enc8(text) {
|
||||||
const b = text.slice();
|
const b = text.slice();
|
||||||
let i = 0, l, r, x; // left, right, accumulator
|
let i = 0, l, r, x; // left, right, accumulator
|
||||||
|
|
||||||
|
@ -206,24 +207,24 @@ export default function DES(passwd) {
|
||||||
|
|
||||||
for (let i = 0, keysi = 0; i < 8; ++i) {
|
for (let i = 0, keysi = 0; i < 8; ++i) {
|
||||||
x = (r << 28) | (r >>> 4);
|
x = (r << 28) | (r >>> 4);
|
||||||
x ^= keys[keysi++];
|
x ^= this.keys[keysi++];
|
||||||
let fval = SP7[x & 0x3f];
|
let fval = SP7[x & 0x3f];
|
||||||
fval |= SP5[(x >>> 8) & 0x3f];
|
fval |= SP5[(x >>> 8) & 0x3f];
|
||||||
fval |= SP3[(x >>> 16) & 0x3f];
|
fval |= SP3[(x >>> 16) & 0x3f];
|
||||||
fval |= SP1[(x >>> 24) & 0x3f];
|
fval |= SP1[(x >>> 24) & 0x3f];
|
||||||
x = r ^ keys[keysi++];
|
x = r ^ this.keys[keysi++];
|
||||||
fval |= SP8[x & 0x3f];
|
fval |= SP8[x & 0x3f];
|
||||||
fval |= SP6[(x >>> 8) & 0x3f];
|
fval |= SP6[(x >>> 8) & 0x3f];
|
||||||
fval |= SP4[(x >>> 16) & 0x3f];
|
fval |= SP4[(x >>> 16) & 0x3f];
|
||||||
fval |= SP2[(x >>> 24) & 0x3f];
|
fval |= SP2[(x >>> 24) & 0x3f];
|
||||||
l ^= fval;
|
l ^= fval;
|
||||||
x = (l << 28) | (l >>> 4);
|
x = (l << 28) | (l >>> 4);
|
||||||
x ^= keys[keysi++];
|
x ^= this.keys[keysi++];
|
||||||
fval = SP7[x & 0x3f];
|
fval = SP7[x & 0x3f];
|
||||||
fval |= SP5[(x >>> 8) & 0x3f];
|
fval |= SP5[(x >>> 8) & 0x3f];
|
||||||
fval |= SP3[(x >>> 16) & 0x3f];
|
fval |= SP3[(x >>> 16) & 0x3f];
|
||||||
fval |= SP1[(x >>> 24) & 0x3f];
|
fval |= SP1[(x >>> 24) & 0x3f];
|
||||||
x = l ^ keys[keysi++];
|
x = l ^ this.keys[keysi++];
|
||||||
fval |= SP8[x & 0x0000003f];
|
fval |= SP8[x & 0x0000003f];
|
||||||
fval |= SP6[(x >>> 8) & 0x3f];
|
fval |= SP6[(x >>> 8) & 0x3f];
|
||||||
fval |= SP4[(x >>> 16) & 0x3f];
|
fval |= SP4[(x >>> 16) & 0x3f];
|
||||||
|
@ -259,11 +260,7 @@ export default function DES(passwd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encrypt 16 bytes of text using passwd as key
|
// Encrypt 16 bytes of text using passwd as key
|
||||||
function encrypt(t) {
|
encrypt(t) {
|
||||||
return enc8(t.slice(0, 8)).concat(enc8(t.slice(8, 16)));
|
return this.enc8(t.slice(0, 8)).concat(this.enc8(t.slice(8, 16)));
|
||||||
}
|
}
|
||||||
|
|
||||||
setKeys(passwd); // Setup keys
|
|
||||||
return {'encrypt': encrypt}; // Public interface
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,14 +8,7 @@
|
||||||
|
|
||||||
import * as Log from './util/logging.js';
|
import * as Log from './util/logging.js';
|
||||||
import Base64 from "./base64.js";
|
import Base64 from "./base64.js";
|
||||||
|
import { supportsImageMetadata } from './util/browser.js';
|
||||||
let SUPPORTS_IMAGEDATA_CONSTRUCTOR = false;
|
|
||||||
try {
|
|
||||||
new ImageData(new Uint8ClampedArray(4), 1, 1);
|
|
||||||
SUPPORTS_IMAGEDATA_CONSTRUCTOR = true;
|
|
||||||
} catch (ex) {
|
|
||||||
// ignore failure
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class Display {
|
export default class Display {
|
||||||
constructor(target) {
|
constructor(target) {
|
||||||
|
@ -573,7 +566,7 @@ export default class Display {
|
||||||
_rgbxImageData(x, y, width, height, arr, offset) {
|
_rgbxImageData(x, y, width, height, arr, offset) {
|
||||||
// NB(directxman12): arr must be an Type Array view
|
// NB(directxman12): arr must be an Type Array view
|
||||||
let img;
|
let img;
|
||||||
if (SUPPORTS_IMAGEDATA_CONSTRUCTOR) {
|
if (supportsImageMetadata) {
|
||||||
img = new ImageData(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4), width, height);
|
img = new ImageData(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4), width, height);
|
||||||
} else {
|
} else {
|
||||||
img = this._drawCtx.createImageData(width, height);
|
img = this._drawCtx.createImageData(width, height);
|
||||||
|
|
|
@ -238,43 +238,39 @@ export default class Mouse {
|
||||||
// ===== PUBLIC METHODS =====
|
// ===== PUBLIC METHODS =====
|
||||||
|
|
||||||
grab() {
|
grab() {
|
||||||
const c = this._target;
|
|
||||||
|
|
||||||
if (isTouchDevice) {
|
if (isTouchDevice) {
|
||||||
c.addEventListener('touchstart', this._eventHandlers.mousedown);
|
this._target.addEventListener('touchstart', this._eventHandlers.mousedown);
|
||||||
c.addEventListener('touchend', this._eventHandlers.mouseup);
|
this._target.addEventListener('touchend', this._eventHandlers.mouseup);
|
||||||
c.addEventListener('touchmove', this._eventHandlers.mousemove);
|
this._target.addEventListener('touchmove', this._eventHandlers.mousemove);
|
||||||
}
|
}
|
||||||
c.addEventListener('mousedown', this._eventHandlers.mousedown);
|
this._target.addEventListener('mousedown', this._eventHandlers.mousedown);
|
||||||
c.addEventListener('mouseup', this._eventHandlers.mouseup);
|
this._target.addEventListener('mouseup', this._eventHandlers.mouseup);
|
||||||
c.addEventListener('mousemove', this._eventHandlers.mousemove);
|
this._target.addEventListener('mousemove', this._eventHandlers.mousemove);
|
||||||
c.addEventListener('wheel', this._eventHandlers.mousewheel);
|
this._target.addEventListener('wheel', this._eventHandlers.mousewheel);
|
||||||
|
|
||||||
/* Prevent middle-click pasting (see above for why we bind to document) */
|
/* Prevent middle-click pasting (see above for why we bind to document) */
|
||||||
document.addEventListener('click', this._eventHandlers.mousedisable);
|
document.addEventListener('click', this._eventHandlers.mousedisable);
|
||||||
|
|
||||||
/* preventDefault() on mousedown doesn't stop this event for some
|
/* preventDefault() on mousedown doesn't stop this event for some
|
||||||
reason so we have to explicitly block it */
|
reason so we have to explicitly block it */
|
||||||
c.addEventListener('contextmenu', this._eventHandlers.mousedisable);
|
this._target.addEventListener('contextmenu', this._eventHandlers.mousedisable);
|
||||||
}
|
}
|
||||||
|
|
||||||
ungrab() {
|
ungrab() {
|
||||||
const c = this._target;
|
|
||||||
|
|
||||||
this._resetWheelStepTimers();
|
this._resetWheelStepTimers();
|
||||||
|
|
||||||
if (isTouchDevice) {
|
if (isTouchDevice) {
|
||||||
c.removeEventListener('touchstart', this._eventHandlers.mousedown);
|
this._target.removeEventListener('touchstart', this._eventHandlers.mousedown);
|
||||||
c.removeEventListener('touchend', this._eventHandlers.mouseup);
|
this._target.removeEventListener('touchend', this._eventHandlers.mouseup);
|
||||||
c.removeEventListener('touchmove', this._eventHandlers.mousemove);
|
this._target.removeEventListener('touchmove', this._eventHandlers.mousemove);
|
||||||
}
|
}
|
||||||
c.removeEventListener('mousedown', this._eventHandlers.mousedown);
|
this._target.removeEventListener('mousedown', this._eventHandlers.mousedown);
|
||||||
c.removeEventListener('mouseup', this._eventHandlers.mouseup);
|
this._target.removeEventListener('mouseup', this._eventHandlers.mouseup);
|
||||||
c.removeEventListener('mousemove', this._eventHandlers.mousemove);
|
this._target.removeEventListener('mousemove', this._eventHandlers.mousemove);
|
||||||
c.removeEventListener('wheel', this._eventHandlers.mousewheel);
|
this._target.removeEventListener('wheel', this._eventHandlers.mousewheel);
|
||||||
|
|
||||||
document.removeEventListener('click', this._eventHandlers.mousedisable);
|
document.removeEventListener('click', this._eventHandlers.mousedisable);
|
||||||
|
|
||||||
c.removeEventListener('contextmenu', this._eventHandlers.mousedisable);
|
this._target.removeEventListener('contextmenu', this._eventHandlers.mousedisable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1718,11 +1718,8 @@ export default class RFB extends EventTargetMixin {
|
||||||
}
|
}
|
||||||
|
|
||||||
static genDES(password, challenge) {
|
static genDES(password, challenge) {
|
||||||
const passwd = [];
|
const passwordChars = password.split('').map(c => c.charCodeAt(0));
|
||||||
for (let i = 0; i < password.length; i++) {
|
return (new DES(passwordChars)).encrypt(challenge);
|
||||||
passwd.push(password.charCodeAt(i));
|
|
||||||
}
|
|
||||||
return (new DES(passwd)).encrypt(challenge);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,30 +25,33 @@ window.addEventListener('touchstart', function onFirstTouch() {
|
||||||
// brings us a bit closer but is not optimal.
|
// brings us a bit closer but is not optimal.
|
||||||
export let dragThreshold = 10 * (window.devicePixelRatio || 1);
|
export let dragThreshold = 10 * (window.devicePixelRatio || 1);
|
||||||
|
|
||||||
let _cursor_uris_supported = null;
|
let _supportsCursorURIs = false;
|
||||||
|
|
||||||
export function supportsCursorURIs() {
|
try {
|
||||||
if (_cursor_uris_supported === null) {
|
const target = document.createElement('canvas');
|
||||||
try {
|
target.style.cursor = 'url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default';
|
||||||
const target = document.createElement('canvas');
|
|
||||||
target.style.cursor = 'url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default';
|
|
||||||
|
|
||||||
if (target.style.cursor) {
|
if (target.style.cursor) {
|
||||||
Log.Info("Data URI scheme cursor supported");
|
Log.Info("Data URI scheme cursor supported");
|
||||||
_cursor_uris_supported = true;
|
_supportsCursorURIs = true;
|
||||||
} else {
|
} else {
|
||||||
Log.Warn("Data URI scheme cursor not supported");
|
Log.Warn("Data URI scheme cursor not supported");
|
||||||
_cursor_uris_supported = false;
|
|
||||||
}
|
|
||||||
} catch (exc) {
|
|
||||||
Log.Error("Data URI scheme cursor test exception: " + exc);
|
|
||||||
_cursor_uris_supported = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} catch (exc) {
|
||||||
return _cursor_uris_supported;
|
Log.Error("Data URI scheme cursor test exception: " + exc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const supportsCursorURIs = _supportsCursorURIs;
|
||||||
|
|
||||||
|
let _supportsImageMetadata = false;
|
||||||
|
try {
|
||||||
|
new ImageData(new Uint8ClampedArray(4), 1, 1);
|
||||||
|
_supportsImageMetadata = true;
|
||||||
|
} catch (ex) {
|
||||||
|
// ignore failure
|
||||||
|
}
|
||||||
|
export const supportsImageMetadata = _supportsImageMetadata;
|
||||||
|
|
||||||
export function isMac() {
|
export function isMac() {
|
||||||
return navigator && !!(/mac/i).exec(navigator.platform);
|
return navigator && !!(/mac/i).exec(navigator.platform);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
|
|
||||||
import { supportsCursorURIs, isTouchDevice } from './browser.js';
|
import { supportsCursorURIs, isTouchDevice } from './browser.js';
|
||||||
|
|
||||||
const useFallback = !supportsCursorURIs() || isTouchDevice;
|
const useFallback = !supportsCursorURIs || isTouchDevice;
|
||||||
|
|
||||||
export default class Cursor {
|
export default class Cursor {
|
||||||
constructor(container) {
|
constructor() {
|
||||||
this._target = null;
|
this._target = null;
|
||||||
|
|
||||||
this._canvas = document.createElement('canvas');
|
this._canvas = document.createElement('canvas');
|
||||||
|
|
|
@ -29,7 +29,7 @@ export default class EventTargetMixin {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
this._listeners.get(event.type)
|
this._listeners.get(event.type)
|
||||||
.forEach(callback => callback.call(this, event), this);
|
.forEach(callback => callback.call(this, event));
|
||||||
return !event.defaultPrevented;
|
return !event.defaultPrevented;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ describe('WebUtil', function () {
|
||||||
window.localStorage.getItem = sinon.stub();
|
window.localStorage.getItem = sinon.stub();
|
||||||
window.localStorage.removeItem = sinon.stub();
|
window.localStorage.removeItem = sinon.stub();
|
||||||
|
|
||||||
WebUtil.initSettings();
|
return WebUtil.initSettings();
|
||||||
});
|
});
|
||||||
afterEach(function () {
|
afterEach(function () {
|
||||||
Object.defineProperty(window, "localStorage", origLocalStorage);
|
Object.defineProperty(window, "localStorage", origLocalStorage);
|
||||||
|
@ -132,7 +132,7 @@ describe('WebUtil', function () {
|
||||||
settings = {};
|
settings = {};
|
||||||
csSandbox.spy(window.chrome.storage.sync, 'set');
|
csSandbox.spy(window.chrome.storage.sync, 'set');
|
||||||
csSandbox.spy(window.chrome.storage.sync, 'remove');
|
csSandbox.spy(window.chrome.storage.sync, 'remove');
|
||||||
WebUtil.initSettings();
|
return WebUtil.initSettings();
|
||||||
});
|
});
|
||||||
afterEach(function () {
|
afterEach(function () {
|
||||||
csSandbox.restore();
|
csSandbox.restore();
|
||||||
|
|
Loading…
Reference in New Issue