tabby-rdp 0.4.0 → 0.5.0

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,123 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.0
4
+
5
+ Shared folders, desktops behind an RD Gateway, Hyper-V VMs' consoles, more of what an .rdp file says, text sent as
6
+ typed; more care with addresses that come from someone else; and fixes from a review of the code.
7
+
8
+ **New**
9
+ - **Shared folders** ([#26](https://github.com/meanaverage/tabby-rdp/issues/26)): folders from this computer appear as
10
+ drives on the remote desktop, under `\\tsclient` in Explorer, like mstsc's drive redirection. Settings › Remote
11
+ Desktop › Settings › Shared folders: **Share a folder…**, each one read-write or read-only. Every desktop you connect
12
+ to sees them; applies on the next connection. Windows mounts them (xrdp can, with FUSE); GNOME Remote Desktop
13
+ doesn't serve drives. Files move at the drive's pace through the RDP connection, so this is for working with files
14
+ in place rather than copying gigabytes; the clipboard still carries files either way. The remote gets the folder
15
+ and nothing else: `..` and symbolic links that lead out of it don't resolve, and only files and folders are served.
16
+ File operations run in the background (Node's thread pool), one request at a time, so a slow disk or network
17
+ folder slows the drive, not Tabby's window.
18
+ - **Hyper-V VMs** ([#28](https://github.com/meanaverage/tabby-rdp/issues/28)): on a Windows SSH host that runs
19
+ Hyper-V, its VMs are listed among the host's desktops (`Get-VM`, with PowerShell over the SSH connection), and one
20
+ that is off is started when opened. What opens is the VM's console, through the host (port 2179), as Hyper-V
21
+ Manager's Connect does: no network or Remote Desktop needed in the VM. A Windows guest that is up gets an enhanced
22
+ session; otherwise it is the basic console. The sign-in is the host's, asked once per host; an account the host
23
+ signs in but doesn't let open the console (it ends the connection at once) brings the form back, saying so.
24
+ - **RD Gateway** ([#29](https://github.com/meanaverage/tabby-rdp/issues/29)): a remote desktop profile, or a desktop
25
+ behind an SSH host, can name a Remote Desktop Gateway (**RD Gateway**: `rdgw.example.com`, or `host:port`). The
26
+ connection then goes to the gateway over HTTPS (its WebSocket transport, Windows Server 2012 R2 and later), signs in
27
+ there with a user name and password, and is connected on to the desktop, whose address is as the gateway sees it.
28
+ The desktop's sign-in is the gateway's too unless the profile picks a saved account for the gateway. A sign-in the
29
+ gateway refuses brings the form back saying it was the gateway, before anything goes to the desktop; a desktop its
30
+ policy doesn't allow, or that it can't reach, is an error saying which. The gateway's certificate is accepted when
31
+ valid for its name and otherwise remembered on first use; a changed one stops the connection until it is trusted.
32
+ The sign-in (NTLMv2) is bound to the gateway's TLS certificate, which gateways require by default. Smart cards,
33
+ sign-in pages and one-time codes at the gateway aren't supported.
34
+ - **.rdp files** ([#27](https://github.com/meanaverage/tabby-rdp/issues/27)): an import applies the file's display
35
+ scale (`desktopscalefactor` 150 or more becomes the desktop's Retina sharpness) and its RD Gateway
36
+ (`gatewayhostname`, unless the file turns it off), and says which of its other settings the plugin doesn't apply
37
+ (sound left on the remote or off, a fixed window size, its own drives (shared folders are a setting here), printer,
38
+ smart card or USB redirection, several monitors, RemoteApp, an account of its own or a smart card at the gateway),
39
+ instead of ignoring them silently.
40
+ - **Send text as typed** ([#31](https://github.com/meanaverage/tabby-rdp/issues/31)), a setting: the characters the
41
+ keyboard produces go to the desktop rather than key positions, so dead keys and a layout the remote doesn't have
42
+ come out right; keys with Ctrl, Alt or ⌘ still go by position, so shortcuts keep working. Off by default. Windows
43
+ types any character; a GNOME desktop only those its own layout has. Input methods (Chinese, Japanese, Korean) need
44
+ more than this and stay open in #31.
45
+ - IronRDP's web client gains drive redirection (MS-RDPEFS) through a JavaScript file system (patch 15), and its
46
+ static channels send multi-chunk messages Windows accepts (patch 16): a response over 1600 bytes was flagged for the
47
+ receiver to keep the channel header, which Windows' drive redirector didn't expect and dropped the channel on.
48
+
49
+ **Safer with addresses that come from someone else**
50
+ - **Importing an .rdp file asks first**, naming the address, the gateway and the account the file leads to, with
51
+ **Add and connect**, **Add only** and **Cancel**. It used to add the profile and connect at once. Nothing in a file
52
+ runs on this computer (and a program it names for the remote isn't asked for), but a file decides where your
53
+ sign-in goes.
54
+ - **A Windows desktop whose server doesn't use Network Level Authentication stops before the password is sent.**
55
+ Without it the password goes to the server as it is (encrypted on the way, readable to whatever answered), which a
56
+ server posing as a Windows machine can ask for; the first certificate being trusted on sight, nothing stood in the
57
+ way. The connection now stops when the server's answer says so, before TLS, and asks: **Send the password anyway**
58
+ (remembered for that desktop, shown and forgotten with its certificate under Settings › Remote Desktop ›
59
+ Certificates) or **Cancel**. xrdp signs in this way by design: desktops of the xrdp kind aren't asked about.
60
+
61
+ **Fixed**
62
+ - **Save to Downloads** couldn't be led elsewhere by the remote's file names alone, but could by a link already in
63
+ Downloads with a name the remote chose (a folder name, say). Folders are now made one at a time and must stay inside
64
+ the folder once links are followed, and each file is created new: an existing name, link or not, gets a number.
65
+ - **Large files copied from the remote** were held in memory, twice over while being saved. They now arrive in a
66
+ private temporary file and are moved into place.
67
+ - **The plugin's local proxy** (loopback, one per desktop) kept whatever a local program sent before showing the
68
+ session's token, with no limit or deadline, and an error on such a connection wasn't handled. The first message is
69
+ now capped at a request's size and has ten seconds to arrive, at most four clients connect at once, and messages
70
+ are capped at 32 MB. Reaching the server has a deadline too.
71
+ - **A connection given up while the server was being reached** (the tab closed, Cancel) left that connection open
72
+ until it finished; closing a desktop could leave an idle proxy connection behind. Both end at once now.
73
+ - **Data waiting for a slow side** was buffered without limit. The proxy now pauses the side it reads from while the
74
+ other has more than 8 MB waiting, and a desktop reached through SSH whose data isn't being read at all is closed at
75
+ 64 MB rather than growing.
76
+ - **Dropping files on a desktop after a reconnect** (a wrong password first, a certificate question) offered them
77
+ once per connection attempt, through handlers the earlier attempts left behind.
78
+ - **Shortcut modifiers could stay held on the remote:** turning on view only, or turning off typing into all
79
+ desktops, by a shortcut sent the modifiers' key-down to the remote but not their release. Keys held at that moment
80
+ are released first.
81
+ - **H.264: small changes far apart** (a clock in one corner, a cursor in another) read back everything between them:
82
+ 33 MB for a 4K picture to get a few pixels. Regions far apart are read one by one (IronRDP patch 17).
83
+ - **A desktop whose server went away could stay on screen, frozen.** Through an SSH host, a server that closes the
84
+ connection (a machine shut down, a VM stopped) is reported as the end of what it sends, and not always as closed;
85
+ the plugin waited for "closed", so the desktop sometimes stayed up, still marked connected, with no reconnect. The
86
+ end of the server's side now ends the desktop, and reconnecting takes over as for any drop.
87
+ - **Linux without an unlocked keyring: Tabby could stop opening connections.** A keychain call there never returns
88
+ and keeps one of Node's four worker threads waiting. The plugin gave the keychain up after the first such call, but
89
+ calls started together (the settings page asking whether each saved account has a password, a desktop signing in
90
+ meanwhile) each kept a thread first, and with all four taken, Tabby's file access and name lookups waited forever:
91
+ a new SSH tab stayed at "Connecting". Keychain calls now go one at a time, so at most one thread is ever kept.
92
+
93
+ ## 0.4.1
94
+
95
+ Fixes from a review of 0.4.0.
96
+
97
+ **Fixed**
98
+ - **Two desktops saving a password at the same moment** could lose one of them: Tabby's Vault rewrites its whole
99
+ contents per change. The plugin's Vault changes now go one after another.
100
+ - **A saved account took the desktop's old domain:** an account with a plain user name and no domain was signed in with
101
+ the domain the desktop had been given before, a field the form hides once an account is chosen. The account's domain
102
+ (also none) is what is used.
103
+ - **A profile group's account didn't reach profiles reached through an SSH profile** in that host's tab menu; it does
104
+ now, as it did when opening the profile itself.
105
+ - **"Ask for the account" on a new profile from the settings page** could be overridden by the "Remote desktops"
106
+ group's default, since the group was assigned after the editor closed. The profile is in the group before the editor
107
+ opens.
108
+ - **Removing an account** also clears a profile group default that named it, and says so when the password itself
109
+ couldn't be removed. A desktop whose account is gone asks for one, rather than signing in with a login of its own
110
+ saved earlier. A sign-in prompt left open while its account was removed or renamed no longer saves under it.
111
+ - **Editing an account's user name** keeps the old name when the old password couldn't be removed, so the two never
112
+ disagree; a password kept for an account's earlier user name isn't used for the new one. A new account whose password
113
+ couldn't be saved isn't added.
114
+ - **Hotkey collisions** are found among all of Tabby's bindings, per-profile and per-group hotkeys included, and named
115
+ by the profile or group; the note says only one of the two would act.
116
+ - The settings page checks the accounts' passwords one after another, and not at all once the keychain has stopped
117
+ answering, so a Linux keyring that doesn't answer can't hold every keychain worker.
118
+ - Cancelling or finishing **New account…** brings the user name fields back; the Vault lists a saved account's
119
+ password by the account's name, as intended.
120
+
3
121
  ## 0.4.0
4
122
 
5
123
  **New**
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
 
3
- <img src="docs/images/logo.svg" width="96" height="96" alt="">
3
+ <img src="docs/images/logo.png" width="150" height="150" alt="tabby-rdp: a Tabby window with a GNOME desktop, a Windows desktop and two terminals side by side">
4
4
 
5
5
  # tabby-rdp
6
6
 
@@ -54,6 +54,7 @@ Making it work with GNOME took fixes in IronRDP, which we contribute upstream ([
54
54
  - [Windows and other desktops behind a host](#windows-and-other-desktops-behind-a-host)
55
55
  - [Remote desktop profiles](#remote-desktop-profiles)
56
56
  - [Saved accounts](#saved-accounts)
57
+ - [Shared folders](#shared-folders)
57
58
  - [Several desktops in one tab](#several-desktops-in-one-tab)
58
59
  - [VMs on a host](#vms-on-a-host)
59
60
  - [desk: the console on the desktop](#desk-the-console-on-the-desktop)
@@ -62,6 +63,7 @@ Making it work with GNOME took fixes in IronRDP, which we contribute upstream ([
62
63
  - [Built on IronRDP](#built-on-ironrdp)
63
64
  - [Development](#development)
64
65
  - [Limitations](#limitations)
66
+ - [Questions and problems](#questions-and-problems)
65
67
  - [License](#license)
66
68
 
67
69
  ## Install
@@ -109,7 +111,9 @@ connecting again.
109
111
  |---|---|
110
112
  | **Clipboard** | Copy and paste text and images in both directions. |
111
113
  | **Files** | Copy files or folders in Finder and press ⌘V on the desktop, or drop them onto it, or use **Remote Desktop › Send files…** in the pane's menu; they paste in Files or Explorer. Files copied on the remote offer **Save to Downloads**. |
114
+ | **Shared folders** | Folders from this computer as drives on the remote desktop (`\\tsclient\<name>` in Explorer), read-write or read-only, for working with files in place: [below](#shared-folders). Windows (and xrdp with FUSE). |
112
115
  | **Several desktops in one tab** | Paste to all of them, type into all of them, and see which is which: [below](#several-desktops-in-one-tab). |
116
+ | **RD Gateway** | Desktops behind a Remote Desktop Gateway: the profile names the gateway, and the connection goes through it over HTTPS: [below](#through-an-rd-gateway). |
113
117
  | **VMs on a host** | The host's VMs with a desktop, ready to open: [below](#vms-on-a-host). |
114
118
  | **Sound** | The remote desktop's sound plays locally. |
115
119
  | **Microphone** | Optional (off by default): an app on the remote desktop that records, such as a call, gets your microphone. It is only captured while the app records, with an indicator in the corner of the desktop. |
@@ -124,6 +128,7 @@ connecting again.
124
128
  | **Sign-in** | GNOME desktops need none: the plugin manages their credentials. Windows and xrdp desktops ask for the account once and can remember it, in Tabby's Vault when that is on and in the system keychain otherwise; **Sign in again…** in the menu replaces it. Desktops that share an account can use a [saved account](#saved-accounts), whose password is kept once. |
125
129
  | **Shortcuts** | Switching between the desktop and the console, view only, a screenshot, Ctrl+Alt+Del, typing into or pasting to all desktops of a tab, the connection status and Disconnect each have a hotkey, set on the settings page or in Tabby's Hotkeys. They work while the desktop has the keyboard; a key another hotkey has is refused. |
126
130
  | **Certificates** | GNOME desktops accept only the certificate the plugin made for them. Windows and xrdp desktops remember theirs on first use and ask before accepting a different one. |
131
+ | **Passwords stay with servers that know them** | Windows signs in with Network Level Authentication: a proof both ways, where the password only reaches a server that knows it already. A Windows desktop whose server doesn't use it would get the password as it is, so the connection stops and asks first, before anything is sent. xrdp signs in that way by design, so desktops of the xrdp kind aren't asked about. |
127
132
 
128
133
  <p align="center"><img src="docs/images/files.png" width="760" alt="A file copied on the remote desktop, offered for saving"></p>
129
134
 
@@ -193,8 +198,13 @@ also type `user@host:port` and pick **Quick connect (REMOTE DESKTOP (RDP))**.
193
198
 
194
199
  **Import an .rdp file…** (in the menu's **Settings**, or **Remote desktop: import an .rdp file…** in Tabby's
195
200
  command palette) makes such a profile from a file saved by Remote Desktop Connection or handed out by an admin: its
196
- address, port, user name and domain, named after the file. Other settings in the file (screen size, drives, gateway)
197
- are ignored.
201
+ address, port, user name and domain, named after the file, and its [RD Gateway](#through-an-rd-gateway) when it
202
+ connects through one; a `desktopscalefactor` of 150 or more sets that desktop's sharpness to Retina. Settings the
203
+ plugin doesn't apply (sound left on the remote, a fixed window size, drive or printer redirection, several monitors)
204
+ are named in a note on import, so the desktop's behaviour isn't a surprise. Nothing in a file runs here, and a
205
+ program it names to start on the remote isn't asked for. What a file does decide is where you connect, so importing
206
+ asks first, naming the address, the gateway and the account it leads to: what you sign in with goes there, and once
207
+ signed in that desktop gets the clipboard and the folders you share. **Add only** adds the profile without connecting.
198
208
 
199
209
  Its **Connect** setting can name an SSH profile instead of connecting directly. The address is then as that host sees
200
210
  it, and opening the profile opens that SSH tab and shows the desktop over it once SSH is connected. Such a desktop is
@@ -213,12 +223,40 @@ profiles:
213
223
  kind: windows # or xrdp, or gnome
214
224
  username: alice # optional
215
225
  via: '' # or the id of an SSH profile to go through
226
+ gateway: '' # or an RD Gateway to go through: rdgw.example.com, or host:port
227
+ gatewayAccount: '' # or a saved account's id, for a gateway that takes another account
216
228
  ```
217
229
 
218
230
  A direct connection is a plain TCP connection from this computer, encrypted with TLS like any RDP client's. The
219
231
  server's certificate is remembered on the first connection and checked on every later one, as for desktops behind a
220
232
  host (above).
221
233
 
234
+ ### Through an RD Gateway
235
+
236
+ Where desktops sit behind a Remote Desktop Gateway (the HTTPS front door many companies put before their Windows
237
+ machines), give the profile the gateway's address in **RD Gateway**: `rdgw.example.com`, or `host:port` when it
238
+ isn't on 443. The profile's address is then the desktop as the gateway sees it (`pc17.corp.example`). The connection
239
+ goes to the gateway over HTTPS, signs in there, and the gateway connects it on; the desktop then asks for its own
240
+ sign-in as usual, inside that tunnel.
241
+
242
+ - **One sign-in by default.** The account you enter for the desktop also signs in to the gateway, as with Remote
243
+ Desktop Connection's "use my RD Gateway credentials for the remote computer". A gateway that takes another account:
244
+ pick a [saved account](#saved-accounts) under **Gateway account**; its password is asked for once and kept with the
245
+ account.
246
+ - **A refused sign-in says who refused it.** When it was the gateway (a wrong password, or its policy doesn't let the
247
+ account in), the form comes back saying so, and nothing has gone to the desktop. A desktop the gateway's policy
248
+ doesn't let the account reach, or that the gateway can't reach, is an error with that reason.
249
+ - **The gateway's certificate** is accepted when it is valid for the gateway's name (issued by an authority this
250
+ computer trusts), and otherwise remembered on first use like a desktop's; either way a later change to one that
251
+ isn't valid stops the connection, before the sign-in goes out, until you trust the new one. Remembered ones are
252
+ listed under Settings › Remote Desktop › Certificates.
253
+ - **Behind an SSH host too.** A desktop added behind an SSH host takes a gateway the same way (the **RD Gateway**
254
+ field of its form): the gateway is then reached from that host.
255
+
256
+ It speaks the gateway's WebSocket transport (Windows Server 2012 R2 and later) and signs in with a user name and
257
+ password (NTLM, bound to the gateway's TLS certificate as gateways require by default). Smart cards, sign-in pages
258
+ and one-time codes at the gateway are not supported.
259
+
222
260
  ## Saved accounts
223
261
 
224
262
  Several desktops often share one account: a domain admin, a lab user. A saved account keeps that user name (and
@@ -238,6 +276,27 @@ The accounts' names and user names are in Tabby's config (`remoteDesktop.account
238
276
  Vault when it is enabled (encrypted, and carried by Tabby's config sync), else in the system keychain. Removing an
239
277
  account removes its password and sets its desktops back to asking.
240
278
 
279
+ ## Shared folders
280
+
281
+ A folder on this computer can appear as a drive on the remote desktop, as mstsc's drive redirection does: in
282
+ **Settings › Remote Desktop › Settings › Shared folders**, **Share a folder…** picks one. On the remote it is
283
+ `\\tsclient\<name>` ("<name> on <this computer>" under This PC in Explorer), named after the folder; **Read-only**
284
+ keeps the remote from changing, adding or removing anything in it. Every remote desktop you connect to sees the shared
285
+ folders, so share only what each of them may have, and remove a folder to stop sharing it. Changes apply on the next
286
+ connection.
287
+
288
+ <p align="center"><img src="docs/images/shared-folders.png" width="548" alt="Shared folders in Settings › Remote Desktop: two folders, one read-only, and Share a folder…"></p>
289
+
290
+ Files are served through the RDP connection as the remote reads and writes them, which suits opening and saving
291
+ documents in place; for moving large files, copying through the clipboard is just as quick. They are read and written
292
+ in the background, so a slow disk or network folder slows the drive down, not Tabby.
293
+
294
+ The remote gets the shared folder and nothing else: a symbolic link works when it points inside the folder, and one
295
+ that leads out of it isn't shown, read or written through. Only files and folders are served (no devices or pipes).
296
+
297
+ Windows mounts shared folders (tested); xrdp can when built with FUSE (under `~/thinclient_drives`); GNOME Remote
298
+ Desktop doesn't serve drives, so there the clipboard is the way.
299
+
241
300
  ## Several desktops in one tab
242
301
 
243
302
  Split a tab (Tabby's **Split** in the tab's menu, or drag one tab onto another) and each pane can show a desktop: one
@@ -258,7 +317,7 @@ preview. Desktops are named after their SSH profile's name.
258
317
  ## VMs on a host
259
318
 
260
319
  When you right-click an SSH host, the plugin looks at the host's libvirt VMs (`virsh`, as your SSH user; read-only, at
261
- most once a minute) and lists the ones with a desktop under **Desktops**, with nothing to set up:
320
+ most once a minute; on a Windows host, [Hyper-V's](#hyper-v)) and lists the ones with a desktop under **Desktops**, with nothing to set up:
262
321
 
263
322
  - a running VM whose RDP port answers: Windows, or Linux with xrdp;
264
323
  - a Windows VM that's shut off: **Start and open**, which starts it (`virsh start`) and connects as soon as it answers.
@@ -275,6 +334,23 @@ host, it asks the VM to shut down (`virsh shutdown`, with a key press first, sin
275
334
  screen sleeps), then ends. VMs that were already running are never touched, and neither are machines woken over the
276
335
  network.
277
336
 
337
+ ### Hyper-V
338
+
339
+ A Windows SSH host that runs Hyper-V gets the same: its VMs (`Get-VM`, with PowerShell over the SSH connection) are
340
+ listed under **Desktops**, and one that is off is started when opened (`Start-VM`). What opens is the VM's console, as
341
+ Hyper-V Manager's **Connect** shows it: reached through the host (its port 2179), so the VM needs no network, no
342
+ Remote Desktop turned on, not even an operating system. A Windows guest that is up is asked for an enhanced session
343
+ (its own sign-in screen, the clipboard, sound, shared folders, resizing); before that, and for other guests, it is the
344
+ basic console: the picture, keyboard and mouse. The basic console is what has been tested so far; enhanced sessions
345
+ take the same path but haven't been tried against a running Windows guest yet.
346
+
347
+ The sign-in is the **host's**, not the guest's: an account that may open the VM's console there, which the plugin
348
+ asks for once per host (the SSH user is filled in). That is an administrator, a member of the host's Hyper-V
349
+ Administrators group, or an account given access with `Grant-VMConnectAccess`. A local administrator other than the
350
+ built-in one can list VMs over SSH and still be refused the console, since Windows gives it a reduced token over the
351
+ network; Hyper-V refuses by ending the connection at once, and the plugin then asks again, saying so. Listing VMs
352
+ takes an account Hyper-V lets do that (an administrator of the host, in practice).
353
+
278
354
  ## desk: the console on the desktop
279
355
 
280
356
  Type `desk` in an SSH console, and the tab switches to that machine's desktop with a terminal attached to the very same
@@ -304,10 +380,12 @@ They are stored in Tabby's config under `remoteDesktop`:
304
380
  | Sound (`sound`) | On | Applies on the next connection. |
305
381
  | Video decoding (`h264`) | On | H.264 decoded by Tabby's browser engine (hardware-accelerated where available), for what the remote sends as video; applies on the next connection. |
306
382
  | Microphone (`microphone`) | Off | Send your microphone while an app on the remote desktop records. Applies on the next connection. |
383
+ | Shared folders (`sharedFolders`) | None | `[{ path, name, readOnly }]`: folders shared as drives with every remote desktop ([Shared folders](#shared-folders)). Applies on the next connection. |
307
384
  | Show connection status (`connectionStatus`) | Off | The indicator in the desktop's corner; fades when the pointer comes near. |
308
385
  | Mac shortcuts (`macShortcuts`) | On | macOS. Off: ⌘ is the Windows key. |
386
+ | Send text as typed (`unicodeKeys`) | Off | Sends the characters the keyboard produces rather than key positions, so dead keys and a layout the remote doesn't have come out right; keys with Ctrl, Alt or ⌘ still go by position. Windows types any character; GNOME only those its own layout has (mutter has no keycode for the others). Input methods (CJK) are not supported yet. |
309
387
  | Shortcuts (`hotkeys.remote-desktop-*`) | ⌘⇧G / Ctrl+Shift+G for the switch; the rest unbound | Tabby's hotkeys: the switch between desktop and console, view only, screenshot, Ctrl+Alt+Del, type into all, paste to all, connection status, disconnect. Changed on the settings page (Getting started › Shortcuts) or in Settings › Hotkeys. |
310
- | Saved accounts (`accounts`) | None | `[{ id, name, username, domain }]`; see [Saved accounts](#saved-accounts). The passwords are not in the config. |
388
+ | Saved accounts (`accounts`) | None | `[{ id, name, username, domain }]`; see [Saved accounts](#saved-accounts). The passwords are in the Vault (encrypted, part of the config) or the keychain, never in plaintext in the config. |
311
389
  | Bring the console along with `desk` (`desk`) | Off | Installs `desk` and a login line on each machine you open a desktop on; applies on the next connection there. |
312
390
  | Session backend (`sessionBackend`) | `native` | For `desk`: `native` (trd-pty) or `tmux`. Config file only. |
313
391
  | Find virtual machines on SSH hosts (`discoverVMs`) | On | Lists a host's libvirt VMs with a desktop in its menu ([VMs on a host](#vms-on-a-host)). |
@@ -357,6 +435,8 @@ tabby-rdp ships IronRDP with a short series of patches ([ironrdp/](ironrdp)). Th
357
435
  | Microphone in the web client | Not submitted yet: waits for #2020 |
358
436
  | Keep clipboard sync working for the other desktops when one closes | Not submitted yet |
359
437
  | Sync the clipboard only for the desktop that has the focus | Not submitted yet |
438
+ | Drive redirection in the web client, through a JavaScript file system | Not submitted yet |
439
+ | Send chunked static-channel messages without CHANNEL_FLAG_SHOW_PROTOCOL, as Windows' drive redirector expects | Not submitted yet |
360
440
 
361
441
  The aim is to make IronRDP's browser client work well with both Linux and Windows desktops, for everyone who embeds
362
442
  it, not just this plugin.
@@ -407,9 +487,18 @@ npm run build:ironrdp # rebuild vendor/ from IronRDP and ironrdp/patches:
407
487
  far as that xrdp version supports them), sound through the PipeWire or PulseAudio module. Live resize needs xrdp
408
488
  0.10 or newer; with 0.9 (Ubuntu 24.04), the desktop keeps its size, scaled to fit, or choose **Reconnect at the new
409
489
  size**. xrdp's standard RDP security without TLS (`security_layer=rdp`) isn't supported. `desk` needs GNOME.
490
+ - **RD Gateways** are signed in to with a user name and password; ones that ask for a smart card, a sign-in page or
491
+ a one-time code, or that only take Kerberos, can't be used. Gateways before Windows Server 2012 R2 (no WebSocket
492
+ transport) can't either. A desktop behind a gateway isn't started when it is off.
410
493
  - **Waking a desktop** over the network (Wake-on-LAN) starts it but never shuts it down again; for VMs, see
411
494
  [Shut down VMs it started](#vms-on-a-host).
412
495
 
496
+ ## Questions and problems
497
+
498
+ Questions ("how do I…", "is this expected?") go to [Discussions › Q&A](https://github.com/meanaverage/tabby-rdp/discussions/categories/q-a);
499
+ bugs and feature requests to the [issues](https://github.com/meanaverage/tabby-rdp/issues). A bug report is most useful
500
+ with the connection log: **Settings › Remote Desktop › Troubleshooting › Open desktops › Copy log**.
501
+
413
502
  ## License
414
503
 
415
504
  [MIT](LICENSE). The bundled IronRDP build is MIT or Apache-2.0 ([vendor/IRONRDP-LICENSE](vendor/IRONRDP-LICENSE)).
@@ -59,6 +59,8 @@ function newAccountOption(select, label, save, onChange) {
59
59
  field('cancel').addEventListener('click', () => {
60
60
  close();
61
61
  select.value = last;
62
+ // As a choice made by hand: the form around it follows (its user name fields show again).
63
+ select.dispatchEvent(new Event('change'));
62
64
  });
63
65
  form.addEventListener('submit', async (event) => {
64
66
  event.preventDefault();
@@ -73,10 +75,9 @@ function newAccountOption(select, label, save, onChange) {
73
75
  const account = await save({ name: field('name').value.trim(), username, domain: field('domain').value.trim(), password: field('password').value });
74
76
  const option = new Option(label(account), account.id);
75
77
  select.insertBefore(option, select.querySelector(`option[value="${exports.NEW_ACCOUNT}"]`));
76
- select.value = account.id;
77
- last = account.id;
78
78
  close();
79
- onChange(account.id);
79
+ select.value = account.id;
80
+ select.dispatchEvent(new Event('change'));
80
81
  }
81
82
  catch (e) {
82
83
  error.textContent = `Couldn't save it: ${e?.message ?? e}`;
@@ -1 +1 @@
1
- {"version":3,"file":"accountForm.js","sourceRoot":"","sources":["../src/accountForm.ts"],"names":[],"mappings":";;;AAyBA,4CA0EC;AAhGY,QAAA,WAAW,GAAG,SAAS,CAAA;AAEvB,QAAA,KAAK,GAAG;;;;;;CAMpB,CAAA;AASD;;;;GAIG;AACH,SAAgB,gBAAgB,CAC5B,MAAyB,EACzB,KAAkC,EAClC,IAAuD,EACvD,QAA8B;IAE9B,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE,mBAAW,CAAC,CAAC,CAAA;IACtD,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,CAAA;IACvB,IAAI,IAAI,GAA2B,IAAI,CAAA;IACvC,MAAM,KAAK,GAAG,GAAG,EAAE;QACf,IAAI,EAAE,MAAM,EAAE,CAAA;QACd,IAAI,GAAG,IAAI,CAAA;IACf,CAAC,CAAA;IACD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;QACnC,IAAI,MAAM,CAAC,KAAK,KAAK,mBAAW,EAAE,CAAC;YAC/B,KAAK,EAAE,CAAA;YACP,IAAI,GAAG,MAAM,CAAC,KAAK,CAAA;YACnB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtB,OAAM;QACV,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACP,OAAM;QACV,CAAC;QACD,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QACrC,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAA;QAClC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;QACzB,IAAI,CAAC,SAAS,GAAG;;;;;;;;;mBASN,CAAA;QACX,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAK,CAAC,aAAa,CAAC,UAAU,IAAI,IAAI,CAAqB,CAAA;QAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAE,CAAA;QAC3D,8EAA8E;QAC9E,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;YACrC,KAAK,CAAC,eAAe,EAAE,CAAA;YACvB,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACzB,KAAK,CAAC,cAAc,EAAE,CAAA;gBACtB,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAA;YAC3B,CAAC;QACL,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YAC3C,KAAK,EAAE,CAAA;YACP,MAAM,CAAC,KAAK,GAAG,IAAI,CAAA;QACvB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;YAC1C,KAAK,CAAC,cAAc,EAAE,CAAA;YACtB,KAAK,CAAC,eAAe,EAAE,CAAA;YACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;YAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,KAAK,CAAC,WAAW,GAAG,sBAAsB,CAAA;gBAC1C,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAA;gBACzB,OAAM;YACV,CAAC;YACD,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;gBACnJ,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;gBACrD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,iBAAiB,mBAAW,IAAI,CAAC,CAAC,CAAA;gBACnF,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,EAAE,CAAA;gBACzB,IAAI,GAAG,OAAO,CAAC,EAAE,CAAA;gBACjB,KAAK,EAAE,CAAA;gBACP,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACxB,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,KAAK,CAAC,WAAW,GAAG,qBAAqB,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAA;YAC9D,CAAC;QACL,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;IACzB,CAAC,CAAC,CAAA;AACN,CAAC"}
1
+ {"version":3,"file":"accountForm.js","sourceRoot":"","sources":["../src/accountForm.ts"],"names":[],"mappings":"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"}