tabby-rdp 0.5.2 → 0.5.3
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/CHANGELOG.md +49 -0
- package/README.md +2 -1
- package/TROUBLESHOOTING.md +7 -2
- package/dist/accounts.js +3 -0
- package/dist/connectionStatus.js +21 -4
- package/dist/desktop.service.js +241 -73
- package/dist/desktopForm.js +3 -3
- package/dist/ironrdp.js +26 -0
- package/dist/keyboard.js +12 -1
- package/dist/rdcleanpath.js +17 -4
- package/dist/rdpFile.js +13 -4
- package/dist/rdpProfile.js +44 -14
- package/dist/releases.js +3 -0
- package/dist/settingsPage.js +19 -14
- package/package.json +3 -3
- package/vendor/SHA256SUMS +1 -0
- package/vendor/ironrdp-factory.js +3237 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.3
|
|
4
|
+
|
|
5
|
+
**Added**
|
|
6
|
+
- **Each desktop connection has its own WebAssembly instance**, while sharing compiled IronRDP code. Reconnecting
|
|
7
|
+
or recovering from an instance fault creates a fresh backend for that desktop without replacing other desktops.
|
|
8
|
+
- **Instance lifecycle checks** cover independent memories, cleanup, reconnects and collection after disposal,
|
|
9
|
+
with a browser smoke test and a live two-desktop isolation suite.
|
|
10
|
+
|
|
11
|
+
**Security** (a review of 0.5.3-rc.1; all of these were in 0.5.2 too)
|
|
12
|
+
- **Moving the pointer over a desktop no longer gives it the keyboard and the clipboard.** IronRDP's canvas took the
|
|
13
|
+
focus without a click, so keys typed into the terminal next to it (a password at a prompt that doesn't echo
|
|
14
|
+
included) and this computer's clipboard went to that remote server; also from behind a maximized pane. A desktop
|
|
15
|
+
now takes the keyboard only in the pane in front, and gives it back to where it came from otherwise.
|
|
16
|
+
- **A desktop lets go of the keyboard when its tab is left by keyboard** for one that takes no focus (Settings, the
|
|
17
|
+
welcome tab): it went on taking the keys typed and the clipboard copied, view only included. Keys that reach a
|
|
18
|
+
desktop not in front now stop at the plugin. The shortcut's modifier, still down as the tab goes, is let go of on
|
|
19
|
+
the remote too, whichever tab is left for: its keyup goes where the user went, and IronRDP lets go of nothing as its
|
|
20
|
+
canvas loses the focus, so the modifier stayed held there until it was pressed again (a held Alt has the next key
|
|
21
|
+
open a menu on Windows).
|
|
22
|
+
- **A crafted .rdp file can't hang Tabby's window**: a line of whitespace took time that grew with the cube of its
|
|
23
|
+
length to parse (seconds for a few thousand spaces). Files over 1 MB are refused unread.
|
|
24
|
+
|
|
25
|
+
**Fixed**
|
|
26
|
+
- **Removing a profile without an address no longer forgets what was saved for 127.0.0.1:3389.**
|
|
27
|
+
- **The architecture document gives the update check's real limit** (4 MB for the version catalog, not 256 KB).
|
|
28
|
+
- **Tabby's window no longer crashes when a desktop reached directly is refused after TLS** (#69): on Linux, the
|
|
29
|
+
first connection to any desktop in a remote desktop tab (a profile, quick connect, an .rdp file), whose certificate
|
|
30
|
+
is asked about before anything of the sign-in goes to it, closed the window and left Tabby running in the
|
|
31
|
+
background. A changed certificate did the same. The plugin now closes TLS before the socket under it. Desktops
|
|
32
|
+
behind an SSH host were not affected.
|
|
33
|
+
- **Removing a saved gateway account keeps gateway credentials separate.** Inherited gateway uses are listed in
|
|
34
|
+
the removal confirmation; affected desktops and group defaults ask for a gateway account on the next connection.
|
|
35
|
+
Missing named gateway accounts also ask separately instead of silently using the destination credentials.
|
|
36
|
+
- **The desktop inventory shows effective profile settings**, including inherited gateway routing, gateway accounts,
|
|
37
|
+
SSH profiles, sign-in names and connection kinds.
|
|
38
|
+
- **Ended connections release their backend and browser resources**, including timers, global listeners, media,
|
|
39
|
+
and the statistics indicator's canvas hook, while retaining the last picture for the disconnected pane.
|
|
40
|
+
- **Profile Save validates the address and RD Gateway before committing either field.** Invalid edits keep the
|
|
41
|
+
editor open and focus the field to correct, instead of saving an invalid gateway or silently keeping an old address.
|
|
42
|
+
Blank destinations preserve custom and inherited default ports when saving unrelated changes.
|
|
43
|
+
|
|
44
|
+
**Changed**
|
|
45
|
+
- **The rollback minimum is 0.5.3.** Updates persists this minimum to protect saved separate gateway prompts
|
|
46
|
+
from older versions that would reuse desktop credentials, and records a target release's minimum on installation.
|
|
47
|
+
- **Preview publishing uses npm's beta tag** for both beta and release-candidate versions. GitHub release drafts
|
|
48
|
+
remain unpublished until the staged npm package is approved and verified.
|
|
49
|
+
|
|
50
|
+
Qualification and remaining stable-release checks are tracked in [#49](https://github.com/meanaverage/tabby-rdp/issues/49).
|
|
51
|
+
|
|
3
52
|
## 0.5.2
|
|
4
53
|
|
|
5
54
|
**Added**
|
package/README.md
CHANGED
|
@@ -86,7 +86,8 @@ Open **Settings › Remote Desktop › Updates** to manage the installed version
|
|
|
86
86
|
- **Stable** is the default. **Preview** also offers beta releases and release candidates when available.
|
|
87
87
|
- Automatic checks look for updates once a day. **Check now** checks manually; installation is always your choice.
|
|
88
88
|
- Choose an exact compatible version, **Return to stable**, or **Restore previous version** after an installation
|
|
89
|
-
from this page.
|
|
89
|
+
from this page. After running **0.5.3**, version changes require **0.5.3 or newer** to preserve separate
|
|
90
|
+
gateway sign-in prompts; returning to an older stable release is blocked.
|
|
90
91
|
- **Uninstall plugin…** removes the package. **Manage in Tabby…** opens Tabby's plugin controls to disable it.
|
|
91
92
|
Saved connections, settings, passwords and remote setup are kept.
|
|
92
93
|
|
package/TROUBLESHOOTING.md
CHANGED
|
@@ -64,12 +64,17 @@ In **0.5.2 or newer**, open **Settings › Remote Desktop › Updates**. **Stabl
|
|
|
64
64
|
|
|
65
65
|
The confirmation dialog stays open through progress and the verified result. If installation fails, the dialog shows the cause. After success, close remote desktops and restart Tabby; Updates shows the running version and the installed version waiting for restart until then.
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
After running **0.5.3**, use **0.5.3 or newer**, including after uninstalling and reinstalling. This version
|
|
68
|
+
can save a separate gateway sign-in prompt (`@ask`) in desktops, profiles and defaults, including when a saved gateway
|
|
69
|
+
account is removed. Versions **0.5.1 and 0.5.2** can silently use the desktop's credentials for that gateway instead.
|
|
70
|
+
Updates records this minimum on startup even if update checks are paused, and retains the highest recorded minimum.
|
|
71
|
+
The safeguard applies to this computer's Updates page; manual npm installation, Tabby's plugin controls and older
|
|
72
|
+
installations on other computers can bypass it. Use the same minimum wherever this configuration is copied or synced.
|
|
68
73
|
|
|
69
74
|
If the plugin cannot load:
|
|
70
75
|
|
|
71
76
|
1. Open **Tabby › Settings › Plugins**. Disable **tabby-rdp** to stop it loading, or uninstall and reinstall it there. Restart Tabby after changing plugins. Tabby’s [configuration locations](https://github.com/Eugeny/tabby/wiki/Config-file) help locate your profile when the application cannot open.
|
|
72
|
-
2. For a specific known compatible version, open a terminal in **Tabby's plugin folder** (the folder containing the plugin installation's `package.json`, with `node_modules/tabby-rdp` below it). Run `npm install tabby-rdp@0.5.
|
|
77
|
+
2. For a specific known compatible version, open a terminal in **Tabby's plugin folder** (the folder containing the plugin installation's `package.json`, with `node_modules/tabby-rdp` below it). Run `npm install tabby-rdp@0.5.3`, replacing `0.5.3` with your known compatible exact version at or above the minimum above. Do not run this in the tabby-rdp source checkout, the application bundle, or inside `node_modules/tabby-rdp` itself. Fully quit and reopen Tabby afterwards.
|
|
73
78
|
3. If a later version has migrated saved data, respect that version's documented minimum. Reinstall a compatible stable version or the last working preview; do not force an older version across a migration boundary.
|
|
74
79
|
|
|
75
80
|
Disabling or uninstalling keeps desktops, profiles, settings, remembered certificates and saved credentials. It also leaves any remote helpers and remote applications in place. To remove saved entries, use **Remote Desktop › Desktops** and **Accounts**, and **Profiles & connections** for profiles, before uninstalling. Unlock the credential store first if required; check any reported failure rather than assuming a credential was deleted. Data synced to other computers may need attention there too.
|
package/dist/accounts.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ASK_GATEWAY_ACCOUNT = void 0;
|
|
3
4
|
exports.accountsOf = accountsOf;
|
|
4
5
|
exports.newAccountId = newAccountId;
|
|
5
6
|
exports.signInName = signInName;
|
|
6
7
|
exports.accountKey = accountKey;
|
|
8
|
+
/** A separate gateway sign-in prompt. The '@' cannot occur in a saved account's id. */
|
|
9
|
+
exports.ASK_GATEWAY_ACCOUNT = '@ask';
|
|
7
10
|
/** The usable entries of `remoteDesktop.accounts` (hand-written ones may lack fields). */
|
|
8
11
|
function accountsOf(store) {
|
|
9
12
|
const list = Array.isArray(store?.accounts) ? store.accounts : [];
|
package/dist/connectionStatus.js
CHANGED
|
@@ -34,7 +34,7 @@ class ConnectionStatus {
|
|
|
34
34
|
this.ticks = 0;
|
|
35
35
|
this.last = null;
|
|
36
36
|
this.frames = 0;
|
|
37
|
-
this.
|
|
37
|
+
this.frameHook = null;
|
|
38
38
|
this.latency = null;
|
|
39
39
|
this.pinging = false;
|
|
40
40
|
this.active = false;
|
|
@@ -57,6 +57,9 @@ class ConnectionStatus {
|
|
|
57
57
|
if (active && canvas) {
|
|
58
58
|
this.countFrames(canvas);
|
|
59
59
|
}
|
|
60
|
+
else if (!active) {
|
|
61
|
+
this.releaseCanvas();
|
|
62
|
+
}
|
|
60
63
|
if (active === this.active) {
|
|
61
64
|
return;
|
|
62
65
|
}
|
|
@@ -90,13 +93,16 @@ class ConnectionStatus {
|
|
|
90
93
|
*/
|
|
91
94
|
countFrames(canvas) {
|
|
92
95
|
const ctx = canvas.getContext('2d');
|
|
93
|
-
if (
|
|
96
|
+
if (ctx === this.frameHook?.context) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.releaseCanvas();
|
|
100
|
+
if (!ctx) {
|
|
94
101
|
return;
|
|
95
102
|
}
|
|
96
|
-
this.hooked = ctx;
|
|
97
103
|
const original = ctx.putImageData;
|
|
98
104
|
let batch = false;
|
|
99
|
-
|
|
105
|
+
const wrapped = ((...args) => {
|
|
100
106
|
if (!batch) {
|
|
101
107
|
batch = true;
|
|
102
108
|
this.frames++;
|
|
@@ -104,6 +110,17 @@ class ConnectionStatus {
|
|
|
104
110
|
}
|
|
105
111
|
return original.apply(ctx, args);
|
|
106
112
|
});
|
|
113
|
+
ctx.putImageData = wrapped;
|
|
114
|
+
this.frameHook = { context: ctx, original, wrapped };
|
|
115
|
+
}
|
|
116
|
+
/** A detached canvas's handlers retain its backend, even after its component has been removed. */
|
|
117
|
+
releaseCanvas() {
|
|
118
|
+
const hook = this.frameHook;
|
|
119
|
+
this.frameHook = null;
|
|
120
|
+
// Leave a later owner's replacement alone.
|
|
121
|
+
if (hook && hook.context.putImageData === hook.wrapped) {
|
|
122
|
+
hook.context.putImageData = hook.original;
|
|
123
|
+
}
|
|
107
124
|
}
|
|
108
125
|
tick() {
|
|
109
126
|
const now = performance.now();
|