@novnc/novnc 1.3.0-gbfb6ac2 → 1.3.0-gcdfb336
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -2
- package/core/decoders/jpeg.js +141 -0
- package/core/decoders/raw.js +1 -1
- package/core/encodings.js +4 -0
- package/core/ra2.js +567 -0
- package/core/rfb.js +219 -5
- package/core/util/md5.js +79 -0
- package/docs/API.md +36 -3
- package/lib/base64.js +1 -1
- package/lib/decoders/copyrect.js +1 -1
- package/lib/decoders/hextile.js +2 -2
- package/lib/decoders/jpeg.js +188 -0
- package/lib/decoders/raw.js +2 -2
- package/lib/decoders/rre.js +1 -1
- package/lib/decoders/tight.js +2 -2
- package/lib/decoders/tightpng.js +3 -3
- package/lib/decoders/zrle.js +1 -1
- package/lib/deflator.js +1 -1
- package/lib/des.js +1 -1
- package/lib/display.js +2 -2
- package/lib/encodings.js +8 -0
- package/lib/inflator.js +1 -1
- package/lib/input/gesturehandler.js +1 -1
- package/lib/input/keyboard.js +2 -2
- package/lib/input/util.js +1 -1
- package/lib/ra2.js +1257 -0
- package/lib/rfb.js +370 -24
- package/lib/util/browser.js +1 -1
- package/lib/util/cursor.js +1 -1
- package/lib/util/eventtarget.js +1 -1
- package/lib/util/md5.js +103 -0
- package/lib/vendor/pako/lib/zlib/deflate.js +1 -1
- package/lib/vendor/pako/lib/zlib/inflate.js +1 -1
- package/lib/vendor/pako/lib/zlib/inftrees.js +1 -1
- package/lib/vendor/pako/lib/zlib/trees.js +1 -1
- package/lib/websock.js +2 -2
- package/package.json +2 -5
package/README.md
CHANGED
|
@@ -128,13 +128,17 @@ Running the command below will install the latest release of noVNC from Snap:
|
|
|
128
128
|
|
|
129
129
|
`sudo snap install novnc`
|
|
130
130
|
|
|
131
|
-
#### Running noVNC
|
|
131
|
+
#### Running noVNC from Snap Directly
|
|
132
132
|
|
|
133
133
|
You can run the Snap-package installed novnc directly with, for example:
|
|
134
134
|
|
|
135
135
|
`novnc --listen 6081 --vnc localhost:5901 # /snap/bin/novnc if /snap/bin is not in your PATH`
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
If you want to use certificate files, due to standard Snap confinement restrictions you need to have them in the /home/\<user\>/snap/novnc/current/ directory. If your username is jsmith an example command would be:
|
|
138
|
+
|
|
139
|
+
`novnc --listen 8443 --cert ~jsmith/snap/novnc/current/self.crt --key ~jsmith/snap/novnc/current/self.key --vnc ubuntu.example.com:5901`
|
|
140
|
+
|
|
141
|
+
#### Running noVNC from Snap as a Service (Daemon)
|
|
138
142
|
The Snap package also has the capability to run a 'novnc' service which can be
|
|
139
143
|
configured to listen on multiple ports connecting to multiple VNC servers
|
|
140
144
|
(effectively a service runing multiple instances of novnc).
|
|
@@ -208,6 +212,7 @@ that list and you think you should be, feel free to send a PR to fix that.
|
|
|
208
212
|
* UI and Icons : Pierre Ossman, Chris Gordon
|
|
209
213
|
* Original Logo : Michael Sersen
|
|
210
214
|
* tight encoding : Michael Tinglof (Mercuri.ca)
|
|
215
|
+
* RealVNC RSA AES authentication : USTC Vlab Team
|
|
211
216
|
|
|
212
217
|
* Included libraries:
|
|
213
218
|
* base64 : Martijn Pieters (Digital Creations 2), Samuel Sieb (sieb.net)
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* noVNC: HTML5 VNC client
|
|
3
|
+
* Copyright (C) 2019 The noVNC Authors
|
|
4
|
+
* Licensed under MPL 2.0 (see LICENSE.txt)
|
|
5
|
+
*
|
|
6
|
+
* See README.md for usage and integration instructions.
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export default class JPEGDecoder {
|
|
11
|
+
constructor() {
|
|
12
|
+
// RealVNC will reuse the quantization tables
|
|
13
|
+
// and Huffman tables, so we need to cache them.
|
|
14
|
+
this._quantTables = [];
|
|
15
|
+
this._huffmanTables = [];
|
|
16
|
+
this._cachedQuantTables = [];
|
|
17
|
+
this._cachedHuffmanTables = [];
|
|
18
|
+
|
|
19
|
+
this._jpegLength = 0;
|
|
20
|
+
this._segments = [];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
decodeRect(x, y, width, height, sock, display, depth) {
|
|
24
|
+
// A rect of JPEG encodings is simply a JPEG file
|
|
25
|
+
if (!this._parseJPEG(sock.rQslice(0))) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const data = sock.rQshiftBytes(this._jpegLength);
|
|
29
|
+
if (this._quantTables.length != 0 && this._huffmanTables.length != 0) {
|
|
30
|
+
// If there are quantization tables and Huffman tables in the JPEG
|
|
31
|
+
// image, we can directly render it.
|
|
32
|
+
display.imageRect(x, y, width, height, "image/jpeg", data);
|
|
33
|
+
return true;
|
|
34
|
+
} else {
|
|
35
|
+
// Otherwise we need to insert cached tables.
|
|
36
|
+
const sofIndex = this._segments.findIndex(
|
|
37
|
+
x => x[1] == 0xC0 || x[1] == 0xC2
|
|
38
|
+
);
|
|
39
|
+
if (sofIndex == -1) {
|
|
40
|
+
throw new Error("Illegal JPEG image without SOF");
|
|
41
|
+
}
|
|
42
|
+
let segments = this._segments.slice(0, sofIndex);
|
|
43
|
+
segments = segments.concat(this._quantTables.length ?
|
|
44
|
+
this._quantTables :
|
|
45
|
+
this._cachedQuantTables);
|
|
46
|
+
segments.push(this._segments[sofIndex]);
|
|
47
|
+
segments = segments.concat(this._huffmanTables.length ?
|
|
48
|
+
this._huffmanTables :
|
|
49
|
+
this._cachedHuffmanTables,
|
|
50
|
+
this._segments.slice(sofIndex + 1));
|
|
51
|
+
let length = 0;
|
|
52
|
+
for (let i = 0; i < segments.length; i++) {
|
|
53
|
+
length += segments[i].length;
|
|
54
|
+
}
|
|
55
|
+
const data = new Uint8Array(length);
|
|
56
|
+
length = 0;
|
|
57
|
+
for (let i = 0; i < segments.length; i++) {
|
|
58
|
+
data.set(segments[i], length);
|
|
59
|
+
length += segments[i].length;
|
|
60
|
+
}
|
|
61
|
+
display.imageRect(x, y, width, height, "image/jpeg", data);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
_parseJPEG(buffer) {
|
|
67
|
+
if (this._quantTables.length != 0) {
|
|
68
|
+
this._cachedQuantTables = this._quantTables;
|
|
69
|
+
}
|
|
70
|
+
if (this._huffmanTables.length != 0) {
|
|
71
|
+
this._cachedHuffmanTables = this._huffmanTables;
|
|
72
|
+
}
|
|
73
|
+
this._quantTables = [];
|
|
74
|
+
this._huffmanTables = [];
|
|
75
|
+
this._segments = [];
|
|
76
|
+
let i = 0;
|
|
77
|
+
let bufferLength = buffer.length;
|
|
78
|
+
while (true) {
|
|
79
|
+
let j = i;
|
|
80
|
+
if (j + 2 > bufferLength) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (buffer[j] != 0xFF) {
|
|
84
|
+
throw new Error("Illegal JPEG marker received (byte: " +
|
|
85
|
+
buffer[j] + ")");
|
|
86
|
+
}
|
|
87
|
+
const type = buffer[j+1];
|
|
88
|
+
j += 2;
|
|
89
|
+
if (type == 0xD9) {
|
|
90
|
+
this._jpegLength = j;
|
|
91
|
+
this._segments.push(buffer.slice(i, j));
|
|
92
|
+
return true;
|
|
93
|
+
} else if (type == 0xDA) {
|
|
94
|
+
// start of scan
|
|
95
|
+
let hasFoundEndOfScan = false;
|
|
96
|
+
for (let k = j + 3; k + 1 < bufferLength; k++) {
|
|
97
|
+
if (buffer[k] == 0xFF && buffer[k+1] != 0x00 &&
|
|
98
|
+
!(buffer[k+1] >= 0xD0 && buffer[k+1] <= 0xD7)) {
|
|
99
|
+
j = k;
|
|
100
|
+
hasFoundEndOfScan = true;
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (!hasFoundEndOfScan) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
this._segments.push(buffer.slice(i, j));
|
|
108
|
+
i = j;
|
|
109
|
+
continue;
|
|
110
|
+
} else if (type >= 0xD0 && type < 0xD9 || type == 0x01) {
|
|
111
|
+
// No length after marker
|
|
112
|
+
this._segments.push(buffer.slice(i, j));
|
|
113
|
+
i = j;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (j + 2 > bufferLength) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
const length = (buffer[j] << 8) + buffer[j+1] - 2;
|
|
120
|
+
if (length < 0) {
|
|
121
|
+
throw new Error("Illegal JPEG length received (length: " +
|
|
122
|
+
length + ")");
|
|
123
|
+
}
|
|
124
|
+
j += 2;
|
|
125
|
+
if (j + length > bufferLength) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
j += length;
|
|
129
|
+
const segment = buffer.slice(i, j);
|
|
130
|
+
if (type == 0xC4) {
|
|
131
|
+
// Huffman tables
|
|
132
|
+
this._huffmanTables.push(segment);
|
|
133
|
+
} else if (type == 0xDB) {
|
|
134
|
+
// Quantization tables
|
|
135
|
+
this._quantTables.push(segment);
|
|
136
|
+
}
|
|
137
|
+
this._segments.push(segment);
|
|
138
|
+
i = j;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
package/core/decoders/raw.js
CHANGED
package/core/encodings.js
CHANGED
|
@@ -12,7 +12,9 @@ export const encodings = {
|
|
|
12
12
|
encodingRRE: 2,
|
|
13
13
|
encodingHextile: 5,
|
|
14
14
|
encodingTight: 7,
|
|
15
|
+
encodingZRLE: 16,
|
|
15
16
|
encodingTightPNG: -260,
|
|
17
|
+
encodingJPEG: 21,
|
|
16
18
|
|
|
17
19
|
pseudoEncodingQualityLevel9: -23,
|
|
18
20
|
pseudoEncodingQualityLevel0: -32,
|
|
@@ -38,7 +40,9 @@ export function encodingName(num) {
|
|
|
38
40
|
case encodings.encodingRRE: return "RRE";
|
|
39
41
|
case encodings.encodingHextile: return "Hextile";
|
|
40
42
|
case encodings.encodingTight: return "Tight";
|
|
43
|
+
case encodings.encodingZRLE: return "ZRLE";
|
|
41
44
|
case encodings.encodingTightPNG: return "TightPNG";
|
|
45
|
+
case encodings.encodingJPEG: return "JPEG";
|
|
42
46
|
default: return "[unknown encoding " + num + "]";
|
|
43
47
|
}
|
|
44
48
|
}
|