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 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. Version changes currently support **0.5.1 or newer**.
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
 
@@ -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
- Use **0.5.1 or newer** with current account and certificate settings, and respect any higher minimum documented by a later data migration.
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.1`, replacing `0.5.1` with your known compatible exact version. 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.
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 : [];
@@ -34,7 +34,7 @@ class ConnectionStatus {
34
34
  this.ticks = 0;
35
35
  this.last = null;
36
36
  this.frames = 0;
37
- this.hooked = null;
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 (!ctx || ctx === this.hooked) {
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
- ctx.putImageData = ((...args) => {
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();