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 +118 -0
- package/README.md +94 -5
- package/dist/accountForm.js +4 -3
- package/dist/accountForm.js.map +1 -1
- package/dist/desktop.service.js +454 -54
- package/dist/desktop.service.js.map +1 -1
- package/dist/desktopForm.js +26 -1
- package/dist/desktopForm.js.map +1 -1
- package/dist/desktops.js +17 -1
- package/dist/desktops.js.map +1 -1
- package/dist/drives.js +284 -0
- package/dist/drives.js.map +1 -0
- package/dist/fileTransfer.js +128 -11
- package/dist/fileTransfer.js.map +1 -1
- package/dist/gateway.js +492 -0
- package/dist/gateway.js.map +1 -0
- package/dist/hyperv.js +79 -0
- package/dist/hyperv.js.map +1 -0
- package/dist/ntlm.js +226 -0
- package/dist/ntlm.js.map +1 -0
- package/dist/rdcleanpath.js +167 -26
- package/dist/rdcleanpath.js.map +1 -1
- package/dist/rdpFile.js +34 -0
- package/dist/rdpFile.js.map +1 -1
- package/dist/rdpProfile.js +39 -4
- package/dist/rdpProfile.js.map +1 -1
- package/dist/settingsPage.js +107 -17
- package/dist/settingsPage.js.map +1 -1
- package/dist/signin.js +48 -17
- package/dist/signin.js.map +1 -1
- package/dist/sshChannelStream.js +11 -1
- package/dist/sshChannelStream.js.map +1 -1
- package/dist/ui.js +10 -0
- package/dist/ui.js.map +1 -1
- package/dist/vms.js +20 -3
- package/dist/vms.js.map +1 -1
- package/dist/wake.js +16 -4
- package/dist/wake.js.map +1 -1
- package/package.json +1 -1
- package/vendor/iron-remote-desktop-rdp.js +418 -390
- package/vendor/ironrdp_web_bg.wasm +0 -0
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.
|
|
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
|
|
197
|
-
|
|
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
|
|
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)).
|
package/dist/accountForm.js
CHANGED
|
@@ -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
|
-
|
|
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}`;
|
package/dist/accountForm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accountForm.js","sourceRoot":"","sources":["../src/accountForm.ts"],"names":[],"mappings":";;;AAyBA,
|
|
1
|
+
{"version":3,"file":"accountForm.js","sourceRoot":"","sources":["../src/accountForm.ts"],"names":[],"mappings":"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"}
|