tabby-rdp 0.5.0 → 0.5.2
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 +516 -0
- package/README.md +216 -58
- package/TROUBLESHOOTING.md +77 -0
- package/dist/accountForm.js +0 -1
- package/dist/accountRevisions.js +46 -0
- package/dist/accounts.js +2 -2
- package/dist/audio.js +0 -1
- package/dist/authorities.js +331 -0
- package/dist/byteQueue.js +102 -0
- package/dist/clipboard.js +106 -0
- package/dist/connectionStatus.js +0 -1
- package/dist/desk.js +16 -47
- package/dist/deskScript.js +196 -6
- package/dist/desktop.service.js +1499 -269
- package/dist/desktopForm.js +53 -18
- package/dist/desktops.js +232 -24
- package/dist/diskStorage.js +212 -0
- package/dist/drives.js +271 -30
- package/dist/fileTransfer.js +960 -132
- package/dist/gateway.js +216 -57
- package/dist/header.js +76 -5
- package/dist/help.js +16 -47
- package/dist/hostCompat.js +86 -0
- package/dist/hyperv.js +65 -15
- package/dist/index.js +7 -4
- package/dist/keyboard.js +0 -1
- package/dist/microphone.js +57 -13
- package/dist/ntlm.js +0 -1
- package/dist/osd.js +56 -15
- package/dist/packageChangeDialog.js +186 -0
- package/dist/probe.js +15 -3
- package/dist/rdcleanpath.js +319 -44
- package/dist/rdpFile.js +22 -7
- package/dist/rdpProfile.js +39 -21
- package/dist/releaseSettings.js +72 -0
- package/dist/releases.js +408 -0
- package/dist/remoteSetup.js +103 -23
- package/dist/sessionLog.js +53 -0
- package/dist/settingsPage.js +148 -122
- package/dist/signin.js +478 -48
- package/dist/ssh.js +99 -18
- package/dist/sshChannelStream.js +40 -6
- package/dist/targets.js +194 -40
- package/dist/ui.js +88 -20
- package/dist/unshowable.js +41 -0
- package/dist/updates.js +79 -56
- package/dist/vms.js +17 -3
- package/dist/wake.js +15 -8
- package/docs/desk.md +157 -0
- package/package.json +14 -4
- package/remote/trd-pty.py +74 -13
- package/vendor/SHA256SUMS +26 -0
- package/vendor/ironrdp_web_bg.wasm +0 -0
- package/dist/accountForm.js.map +0 -1
- package/dist/accounts.js.map +0 -1
- package/dist/audio.js.map +0 -1
- package/dist/connectionStatus.js.map +0 -1
- package/dist/desk.js.map +0 -1
- package/dist/deskScript.js.map +0 -1
- package/dist/desktop.service.js.map +0 -1
- package/dist/desktopForm.js.map +0 -1
- package/dist/desktops.js.map +0 -1
- package/dist/drives.js.map +0 -1
- package/dist/fileTransfer.js.map +0 -1
- package/dist/gateway.js.map +0 -1
- package/dist/header.js.map +0 -1
- package/dist/help.js.map +0 -1
- package/dist/hyperv.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/keyboard.js.map +0 -1
- package/dist/microphone.js.map +0 -1
- package/dist/ntlm.js.map +0 -1
- package/dist/osd.js.map +0 -1
- package/dist/probe.js.map +0 -1
- package/dist/rdcleanpath.js.map +0 -1
- package/dist/rdpFile.js.map +0 -1
- package/dist/rdpProfile.js.map +0 -1
- package/dist/remoteSetup.js.map +0 -1
- package/dist/settingsPage.js.map +0 -1
- package/dist/signin.js.map +0 -1
- package/dist/ssh.js.map +0 -1
- package/dist/sshChannelStream.js.map +0 -1
- package/dist/targets.js.map +0 -1
- package/dist/ui.js.map +0 -1
- package/dist/updates.js.map +0 -1
- package/dist/vms.js.map +0 -1
- package/dist/wake.js.map +0 -1
package/docs/desk.md
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# `desk`: the console, on the desktop
|
|
2
|
+
|
|
3
|
+
Type `desk` in an SSH console and the tab switches to that machine's desktop, where a maximized terminal is attached
|
|
4
|
+
to the *same* shell: same scrollback, working directory, jobs and running program. Typing on either side shows on
|
|
5
|
+
both. The hotkey or the header button takes you back to the console.
|
|
6
|
+
|
|
7
|
+
`desk` is off by default, because it changes how SSH logins start on the remote. Turn it on in
|
|
8
|
+
the menu's **Remote Desktop › Settings**, or Tabby's Settings › Remote Desktop (the `remoteDesktop.desk` setting).
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<img src="images/console.png" width="49%" alt="A console before desk">
|
|
12
|
+
<img src="images/desk.png" width="49%" alt="The same shell in a terminal on the desktop">
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
## How it fits together
|
|
16
|
+
|
|
17
|
+
| Step | What happens | Code |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| Setup | With `desk` on, the next desktop connect installs `~/.local/share/tabby-rdp/` (`login.sh`, `bin/desk`, `bin/trd-pty`, `tmux.conf`, `backend`, `desk-key`) and one line in `~/.bashrc` / `~/.zshrc`, and tells the plugin desk's key. Turning `desk` off removes exactly that line and those files on the next connect: the rest of each rc file is written back into it byte for byte (a last line without its newline gets one), so links to it, its other names, its mode and its owner stay. A read-only rc file is left as it is, and the desktop's log says so; should writing one fail part way (a full disk), what it should hold stays in `~/.local/share/tabby-rdp/`, and the log says where. | `src/remoteSetup.ts` |
|
|
20
|
+
| Login | Interactive SSH logins start inside a shareable session: `trd-pty` (default) or tmux. | `login.sh` |
|
|
21
|
+
| `desk` | `bin/desk` prints an OSC 7777 sequence (session, socket, working directory, kind, machine, host name, desk's key). | `login.sh`, `bin/desk` |
|
|
22
|
+
| Interception | A `SessionMiddleware` on every terminal session strips the sequence and, if it carries a key a host gave, asks the plugin to open the console on the desktop. | `src/desk.ts`, `src/deskScript.ts` |
|
|
23
|
+
| Desktop | The host's own desktop opens over the pane (or the one already open for that account is shown). | `src/desktop.service.ts` |
|
|
24
|
+
| Terminal | Over an SSH exec channel, in the headless session: `gnome-terminal --maximize -- trd-pty attach <id>` (or `tmux attach`). | `src/deskScript.ts` |
|
|
25
|
+
|
|
26
|
+
`TABBY_NO_SESSION=1` skips the shared session for one login. `desk` outside a shared session opens a terminal in the
|
|
27
|
+
same folder. Logins that started before the hook was installed need to reconnect.
|
|
28
|
+
|
|
29
|
+
## Which requests count
|
|
30
|
+
|
|
31
|
+
`desk` reaches Tabby the way any program's output does, so a file shown with `cat`, a log, or another machine's output
|
|
32
|
+
could print the same sequence. What tells them apart is the key `bin/desk` adds: 128 random bits in
|
|
33
|
+
`~/.local/share/tabby-rdp/desk-key` (0600, in the plugin's 0700 folder), which only the user's own processes on that
|
|
34
|
+
host can read. The setup reports it to the plugin (`RD_DESK`), which keeps its SHA-256 per host account in
|
|
35
|
+
`remoteDesktop.deskKeys` (never the key itself), so `desk` keeps working after Tabby restarts.
|
|
36
|
+
|
|
37
|
+
- **A request counts only with the key of the host it is for:** the tab's host, or the machine `ssh` typed in its
|
|
38
|
+
console went to. A request without a key (a `desk` from before keys) or with one no host gave is dropped as the
|
|
39
|
+
output is read, before anything runs, here or there, and without a word in Tabby's window, `desk` on or off; the
|
|
40
|
+
developer console counts them, once per 2 s. A request with a key known for another host shows a note saying so.
|
|
41
|
+
- **So `desk` works on hosts whose desktop this Tabby opened with `desk` on:** the setup that runs as the desktop opens
|
|
42
|
+
reports the key, whether or not the connection that follows gets through (for a machine reached with `ssh` typed in a
|
|
43
|
+
console, its desktop opened through that host, under whose key it is kept). A setup run with `desk` off gives no key,
|
|
44
|
+
whatever the host prints, and has Tabby forget the one it had for that host as it starts (so also when the setup then
|
|
45
|
+
fails or never finishes); one during which `desk` is turned off gives none either, and has Tabby forget it when it
|
|
46
|
+
ends or fails with `desk` still off; with `desk` on again by then, it changes nothing, so that what a setup since kept
|
|
47
|
+
(a new key, or none) stays. A setup that finds xrdp or Windows there instead of GNOME has Tabby forget it too. After
|
|
48
|
+
updating from an earlier version, open each host's desktop once: that installs the new `bin/desk` there and tells
|
|
49
|
+
Tabby its key. The same goes for a host set up from another computer, unless that computer's Tabby shares this one's
|
|
50
|
+
config (config sync): the keys' fingerprints are part of it.
|
|
51
|
+
- **Only in the pane in front.** A request from a pane that isn't the focused pane of the active tab, or that stops
|
|
52
|
+
being it by the time the desktop would show (the plugin first asks the machine which one it is), gets a note in that
|
|
53
|
+
pane instead of the desktop: shown there, the desktop would take the keyboard, and this computer's clipboard with
|
|
54
|
+
it, from the pane in use, even from another tab (Tabby keeps those in the page, off screen). A desktop that
|
|
55
|
+
finishes connecting, a sign-in form or a question that shows up, or the first connection's tip as it closes, takes
|
|
56
|
+
the keyboard only in the pane in front too.
|
|
57
|
+
- **One at a time:** of the requests with a known key, a terminal passes on one every 2 s (the last one in its chunk
|
|
58
|
+
of output), and a pane handles one at a time, then none for 2 s. Output full of look-alikes costs about what any
|
|
59
|
+
output of its size does. With `desk` off, a request with a known key from the pane in front says that `desk` is off,
|
|
60
|
+
as often as that; from another pane, nothing.
|
|
61
|
+
- **Only sessions of the user's own** get a desktop terminal attached: a trd-pty session by its id (the client checks
|
|
62
|
+
that the session runs as the same user), or a tmux server whose socket the user owns, in tmux's folder for them
|
|
63
|
+
(`tmux-<uid>`, no access for others), with no symbolic link on the way and every folder above it root's or the
|
|
64
|
+
user's and one other users can't write to (or sticky, like `/tmp`), so that nobody else can swap the path before the
|
|
65
|
+
attach. Anything else opens a terminal in the folder instead.
|
|
66
|
+
- Turning `desk` off and on again (opening the desktop in between) makes a new key.
|
|
67
|
+
- The key tells `desk` apart from look-alike output, not from the host itself, which can always read it: a host
|
|
68
|
+
whose desktop you opened with `desk` on can open that desktop again from its console, while you are in its pane.
|
|
69
|
+
Nor from a recording of `desk`'s output (`script`, asciinema, a terminal log), which holds the key: shown again in a
|
|
70
|
+
pane connected to that machine, it counts as `desk`. Open the desktop of a host you don't trust with `desk` off.
|
|
71
|
+
|
|
72
|
+
## `trd-pty`: a shared terminal session, not a multiplexer
|
|
73
|
+
|
|
74
|
+
The shared session only has to do a few things, which is why it isn't tmux by default:
|
|
75
|
+
|
|
76
|
+
- own the shell's PTY, so the shell survives SSH disconnects;
|
|
77
|
+
- let several terminals attach at once, with output to all of them and input from any;
|
|
78
|
+
- show the current screen to a terminal that attaches late;
|
|
79
|
+
- follow one terminal's size at a time, without flapping;
|
|
80
|
+
- end like a plain SSH login when its last terminal goes.
|
|
81
|
+
|
|
82
|
+
tmux does all of that, but also takes Ctrl-B, re-renders output (so the terminal's own scrollback needs overrides),
|
|
83
|
+
needs passthrough for OSC sequences such as working-directory reporting, clipboard and `desk` itself, and nests with a
|
|
84
|
+
tmux of your own. `remote/trd-pty.py` (Python 3 standard library, about 510 lines of code) does only the list above:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
┌── trd-pty client ◀─▶ Tabby console (SSH PTY → xterm.js)
|
|
88
|
+
login shell ◀─▶ PTY ◀─▶ session owner ──┤
|
|
89
|
+
└── trd-pty client ◀─▶ GNOME Terminal on the desktop
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- **One owner process per session** holds the PTY (login shell, `TRD_SESSION` / `TRD_SOCKET` in its environment),
|
|
93
|
+
detached with `setsid`.
|
|
94
|
+
- **Access:** a Unix socket in `$XDG_RUNTIME_DIR/trd-pty/` (directory `0700`, checked; socket `0600`), or
|
|
95
|
+
`/tmp/trd-pty-<uid>/` without a runtime directory, only while `/tmp` has its sticky bit (otherwise another user
|
|
96
|
+
could swap the folder). Both ends check that the other runs as the same user (`SO_PEERCRED` on Linux,
|
|
97
|
+
`LOCAL_PEERCRED` on macOS and the BSDs): a session doesn't take another user's keystrokes, and a terminal doesn't
|
|
98
|
+
send its own to another user's session. Where the system can't say, neither end goes on, and `trd-pty new` starts
|
|
99
|
+
no session. No network listener.
|
|
100
|
+
- **Protocol:** framed messages (hello, input, resize, claim, query; output, exit). A malformed or oversized frame drops
|
|
101
|
+
that client, never the session; a client more than 8 MB behind is dropped.
|
|
102
|
+
- **Output** goes to every terminal byte for byte: colors, titles, OSC sequences and scrollback stay native.
|
|
103
|
+
- **Size:** one terminal at a time is the *controller* and sets the PTY size: the one that attached, typed or got
|
|
104
|
+
focus last. Clients turn on focus reporting in their own terminal to notice focus; the program only sees focus
|
|
105
|
+
reports if it asked for them.
|
|
106
|
+
- **Late attach:** the last 256 KB of output is replayed (from a line boundary), then a SIGWINCH makes full-screen
|
|
107
|
+
programs repaint. Input from the new terminal is ignored for 300 ms, which swallows its automatic answers to
|
|
108
|
+
replayed queries.
|
|
109
|
+
- **Lifetime:** the shell exiting ends the session. When the last terminal detaches, the shell gets SIGHUP, like a
|
|
110
|
+
dropped SSH login (`TRD_PTY_LINGER=<seconds>` keeps it for a reattach). `trd-pty ls` lists sessions and removes
|
|
111
|
+
sockets whose owner is gone.
|
|
112
|
+
- **Fallbacks:** if `trd-pty` can't start a session (no `python3`; or exit code 3: no safe folder for its sockets,
|
|
113
|
+
one it can't make, or no way to check who is at the other end of a socket), the login falls back to tmux, then to a
|
|
114
|
+
plain shell. The `remoteDesktop.sessionBackend: tmux` setting uses tmux throughout.
|
|
115
|
+
|
|
116
|
+
### Alternatives considered
|
|
117
|
+
|
|
118
|
+
- **dtach / abduco:** multiple attach and raw passthrough, but no size policy or late-attach redraw, and another
|
|
119
|
+
package to install.
|
|
120
|
+
- **Keeping screen state on the server** (pyte, libvterm, a headless xterm.js): exact late attach, at the cost of a
|
|
121
|
+
terminal emulator on every host. Replay plus a repaint covers shells and full-screen programs.
|
|
122
|
+
- **Moving the PTY (reptyr):** needs ptrace, which hardened hosts restrict.
|
|
123
|
+
|
|
124
|
+
## Tests
|
|
125
|
+
|
|
126
|
+
- `test/unit/trd-pty.py`, run on a Linux host (`npm test -- trd-pty`): creating, attaching and reattaching; output to
|
|
127
|
+
two views and each keystroke exactly once; the controller following input and focus; Ctrl-C, job control, UTF-8,
|
|
128
|
+
colors and titles; the alternate screen and repaint on late attach; malformed clients, no network listener, another
|
|
129
|
+
user refused; shell exit, SIGHUP on last detach, linger, and stale-socket cleanup; another user's session socket
|
|
130
|
+
neither counted nor attached; neither end going on without peer credentials; the socket folder's checks, and exit
|
|
131
|
+
code 3 when it is unsafe, can't be made, or no peer can be checked.
|
|
132
|
+
- `test/unit/desk.ts`, `test/unit/desk-service.ts` and `test/unit/remote-scripts.ts` (`npm run test:unit`): requests
|
|
133
|
+
taken out of the output and their key, the last one with a known key, floods over one chunk or many, one at a time;
|
|
134
|
+
the terminal's listener with `desk` off; which keys the plugin keeps from which setups, and what a request with no
|
|
135
|
+
key, another host's, desk off, a machine reached with `ssh` typed in the console or a pane not in front gets; a
|
|
136
|
+
sign-in form leaving the keyboard in the pane in front; the setup, `bin/desk`, the terminal script and the idle
|
|
137
|
+
watcher run under `/bin/sh` against a fake host, checking that no command line carries the password or the key, that
|
|
138
|
+
the login hook is added and removed exactly (through a linked, hard-linked or read-only rc file too, with bytes that
|
|
139
|
+
aren't text, and when writing fails part way), that two setups at once agree on the key, and which sockets a desktop
|
|
140
|
+
terminal may attach to.
|
|
141
|
+
- `test/suites/desk.ts` (`npm test -- desk`, with `TRD_TEST_BACKEND=native` or `tmux`): logins inside the session,
|
|
142
|
+
`desk` to the desktop with the same session attached, typing reaching the shell once, requests without the key
|
|
143
|
+
ignored, RDP and SSH disconnects keeping the session, and turning `desk` off and on leaving `~/.bashrc` as it was.
|
|
144
|
+
|
|
145
|
+
Typical timings on a local network: `desk` to the desktop about 0.4 s; the terminal attached after about 1 s, mostly
|
|
146
|
+
GNOME Terminal starting.
|
|
147
|
+
|
|
148
|
+
## Limitations
|
|
149
|
+
|
|
150
|
+
- A late attach replays output rather than restoring exact screen state. A program that ignores SIGWINCH shows the
|
|
151
|
+
replay until it next redraws.
|
|
152
|
+
- Terminals that aren't the controller draw the stream at their own width, so long lines wrap differently there until
|
|
153
|
+
that terminal takes over.
|
|
154
|
+
- Typing in the first 300 ms after a late attach is dropped.
|
|
155
|
+
- Tabby keeps a closed tab's remote shell while other tabs share its SSH connection, so that terminal stays attached
|
|
156
|
+
until the connection closes.
|
|
157
|
+
- Needs `python3` on the remote (for `trd-pty`) and GNOME Terminal on the desktop.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tabby-rdp",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "Remote desktops in Tabby's SSH tabs: Linux (GNOME) and Windows, through the SSH connection, with clipboard, files and sound. Built on IronRDP.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"tabby-plugin",
|
|
@@ -26,35 +26,45 @@
|
|
|
26
26
|
"main": "dist/index.js",
|
|
27
27
|
"files": [
|
|
28
28
|
"dist",
|
|
29
|
+
"!dist/**/*.map",
|
|
29
30
|
"vendor",
|
|
30
31
|
"remote",
|
|
31
32
|
"LICENSE",
|
|
32
|
-
"CHANGELOG.md"
|
|
33
|
+
"CHANGELOG.md",
|
|
34
|
+
"TROUBLESHOOTING.md",
|
|
35
|
+
"docs/desk.md"
|
|
33
36
|
],
|
|
34
37
|
"engines": {
|
|
35
38
|
"node": ">=18"
|
|
36
39
|
},
|
|
37
40
|
"scripts": {
|
|
38
41
|
"build": "tsc -p tsconfig.json",
|
|
39
|
-
"watch": "tsc -p tsconfig.json --watch",
|
|
42
|
+
"watch": "tsc -p tsconfig.json --watch --sourceMap",
|
|
40
43
|
"typecheck": "tsc -p tsconfig.json --noEmit && npm run typecheck:test",
|
|
41
44
|
"typecheck:test": "tsc -p tsconfig.test.json",
|
|
42
45
|
"test": "tsx test/run.ts",
|
|
46
|
+
"test:smoke": "tsx test/run.ts --packed --hidden smoke-host smoke-rdp",
|
|
43
47
|
"test:unit": "tsx --test test/unit/*.ts",
|
|
44
48
|
"build:ironrdp": "scripts/build-ironrdp.sh",
|
|
45
49
|
"prepublishOnly": "npm run build"
|
|
46
50
|
},
|
|
47
51
|
"dependencies": {
|
|
48
|
-
"
|
|
52
|
+
"semver": "^7.8.5",
|
|
53
|
+
"ws": "^8.21.1"
|
|
49
54
|
},
|
|
50
55
|
"devDependencies": {
|
|
51
56
|
"@angular/core": "15.2.10",
|
|
52
57
|
"@types/node": "^20.19.0",
|
|
58
|
+
"@types/semver": "^7.8.0",
|
|
53
59
|
"rxjs": "7.8.2",
|
|
54
60
|
"tabby-core": "1.0.231-nightly.0",
|
|
55
61
|
"tabby-settings": "1.0.231-nightly.0",
|
|
56
62
|
"tabby-terminal": "1.0.231-nightly.0",
|
|
57
63
|
"tsx": "^4.23.15",
|
|
58
64
|
"typescript": "~5.9.3"
|
|
65
|
+
},
|
|
66
|
+
"tabbyRdp": {
|
|
67
|
+
"minimumTabbyVersion": "1.0.236",
|
|
68
|
+
"rollbackFloor": "0.5.1"
|
|
59
69
|
}
|
|
60
70
|
}
|
package/remote/trd-pty.py
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"""trd-pty: a shell session that outlives its terminals and can be shown in several at once.
|
|
3
3
|
|
|
4
4
|
A session is one small process that owns a PTY running the user's login shell and listens on a Unix
|
|
5
|
-
socket in a private per-user directory (0700;
|
|
6
|
-
`trd-pty attach`:
|
|
5
|
+
socket in a private per-user directory (0700; both ends check that the other has the same uid).
|
|
6
|
+
Terminals attach with `trd-pty attach`:
|
|
7
7
|
|
|
8
8
|
- output from the shell goes, byte for byte, to every attached terminal;
|
|
9
9
|
- input from any attached terminal goes to the shell;
|
|
@@ -30,6 +30,7 @@ import secrets
|
|
|
30
30
|
import selectors
|
|
31
31
|
import signal
|
|
32
32
|
import socket
|
|
33
|
+
import stat
|
|
33
34
|
import struct
|
|
34
35
|
import sys
|
|
35
36
|
import termios
|
|
@@ -48,23 +49,66 @@ SIZE = struct.Struct('!HH')
|
|
|
48
49
|
# session -> client: o output | x exit(status) | q query answer (json)
|
|
49
50
|
|
|
50
51
|
|
|
52
|
+
def unsafe(message):
|
|
53
|
+
sys.stderr.write(f'trd-pty: {message}\n')
|
|
54
|
+
sys.exit(3) # for `new`: no session could be started, so the login falls back to tmux
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def safe_base(path, owners):
|
|
58
|
+
"""Whether no other user can rename or replace what is in `path`: a directory of one of `owners` that others
|
|
59
|
+
can't write to, or only for their own entries (sticky, like /tmp)."""
|
|
60
|
+
try:
|
|
61
|
+
st = os.stat(path)
|
|
62
|
+
except OSError:
|
|
63
|
+
return False
|
|
64
|
+
return (stat.S_ISDIR(st.st_mode) and st.st_uid in owners
|
|
65
|
+
and (not st.st_mode & 0o022 or bool(st.st_mode & stat.S_ISVTX)))
|
|
66
|
+
|
|
67
|
+
|
|
51
68
|
def runtime_dir():
|
|
52
69
|
"""Private per-user directory for session sockets; refuses anything another user could touch."""
|
|
53
70
|
uid = os.getuid()
|
|
54
71
|
base = os.environ.get('XDG_RUNTIME_DIR')
|
|
55
|
-
if not base or not
|
|
72
|
+
if not base or not safe_base(base, (uid,)):
|
|
56
73
|
base = '/tmp'
|
|
74
|
+
if not safe_base(base, (0, uid)):
|
|
75
|
+
unsafe(f'{base} lets other users replace what is in it (no sticky bit)')
|
|
57
76
|
path = os.path.join(base, 'trd-pty' if base != '/tmp' else f'trd-pty-{uid}')
|
|
58
77
|
try:
|
|
59
78
|
os.mkdir(path, 0o700)
|
|
60
79
|
except FileExistsError:
|
|
61
80
|
pass
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
81
|
+
except OSError as e: # a base that can't be written to, say: no session here either
|
|
82
|
+
unsafe(f'cannot create the session directory {path} ({e.strerror})')
|
|
83
|
+
try:
|
|
84
|
+
st = os.lstat(path)
|
|
85
|
+
except OSError as e:
|
|
86
|
+
unsafe(f'cannot check the session directory {path} ({e.strerror})')
|
|
87
|
+
if not stat.S_ISDIR(st.st_mode) or st.st_uid != uid or st.st_mode & 0o077:
|
|
88
|
+
unsafe(f'unsafe session directory {path}')
|
|
65
89
|
return path
|
|
66
90
|
|
|
67
91
|
|
|
92
|
+
def peer_uid(sock):
|
|
93
|
+
"""The uid of the process at the other end of a connected Unix socket, as the system tells it; None where it
|
|
94
|
+
can't (OSError if it fails)."""
|
|
95
|
+
if hasattr(socket, 'SO_PEERCRED'): # Linux: struct ucred (pid, uid, gid); uid_t is unsigned, as os.getuid() has it
|
|
96
|
+
return struct.unpack('iII', sock.getsockopt(socket.SOL_SOCKET, socket.SO_PEERCRED, 12))[1]
|
|
97
|
+
if hasattr(socket, 'LOCAL_PEERCRED'): # macOS, BSD: struct xucred (version, uid, …) at level SOL_LOCAL, 0
|
|
98
|
+
return struct.unpack_from('=II', sock.getsockopt(0, socket.LOCAL_PEERCRED, 256))[1]
|
|
99
|
+
return None
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def serves_me(sock):
|
|
103
|
+
"""Whether the session at the other end of `sock` runs as this user. The directory is private, but what answers
|
|
104
|
+
is checked too: the client is about to send it this terminal's keystrokes. Only the system's word about the
|
|
105
|
+
connection counts (who owns the socket's path now says nothing about who answered), so without it, no."""
|
|
106
|
+
try:
|
|
107
|
+
return peer_uid(sock) == os.getuid()
|
|
108
|
+
except OSError:
|
|
109
|
+
return False
|
|
110
|
+
|
|
111
|
+
|
|
68
112
|
def socket_path(session_id):
|
|
69
113
|
if not session_id or not all(c in '0123456789abcdef' for c in session_id):
|
|
70
114
|
sys.exit(f'trd-pty: bad session id {session_id!r}')
|
|
@@ -212,11 +256,14 @@ class Session:
|
|
|
212
256
|
sock, _ = self.listener.accept()
|
|
213
257
|
except OSError:
|
|
214
258
|
return
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
259
|
+
# Only a client the system says runs as this user: without that word (no peer credentials here), nobody.
|
|
260
|
+
try:
|
|
261
|
+
uid = peer_uid(sock)
|
|
262
|
+
except OSError:
|
|
263
|
+
uid = None
|
|
264
|
+
if uid != os.getuid():
|
|
265
|
+
sock.close()
|
|
266
|
+
return
|
|
220
267
|
sock.setblocking(False)
|
|
221
268
|
client = Client(sock)
|
|
222
269
|
self.clients[sock] = client
|
|
@@ -416,11 +463,15 @@ FOCUS_IN, FOCUS_OUT = b'\x1b[I', b'\x1b[O'
|
|
|
416
463
|
|
|
417
464
|
def attach(session_id, claim=True):
|
|
418
465
|
"""Relays this terminal to a session until the session ends (0) or the connection breaks (1)."""
|
|
466
|
+
path = socket_path(session_id)
|
|
419
467
|
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
420
468
|
try:
|
|
421
|
-
sock.connect(
|
|
469
|
+
sock.connect(path)
|
|
422
470
|
except OSError as e:
|
|
423
471
|
sys.exit(f'trd-pty: no session {session_id} ({e.strerror})')
|
|
472
|
+
if not serves_me(sock):
|
|
473
|
+
sock.close()
|
|
474
|
+
sys.exit(f'trd-pty: session {session_id} is not yours')
|
|
424
475
|
fd_in, fd_out = sys.stdin.fileno(), sys.stdout.fileno()
|
|
425
476
|
rows, cols = term_size(fd_in)
|
|
426
477
|
sock.sendall(frame(b'h', struct.pack('!HHB', rows, cols, 1 if claim else 0)))
|
|
@@ -507,6 +558,9 @@ def query(path):
|
|
|
507
558
|
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
508
559
|
sock.settimeout(2)
|
|
509
560
|
sock.connect(path)
|
|
561
|
+
if not serves_me(sock):
|
|
562
|
+
sock.close()
|
|
563
|
+
raise PermissionError(f'{path} is not a session of yours')
|
|
510
564
|
sock.sendall(frame(b'q'))
|
|
511
565
|
frames = Frames()
|
|
512
566
|
while True:
|
|
@@ -529,7 +583,11 @@ def list_sessions():
|
|
|
529
583
|
try:
|
|
530
584
|
sessions.append(query(path))
|
|
531
585
|
except ConnectionRefusedError:
|
|
532
|
-
|
|
586
|
+
try:
|
|
587
|
+
if stat.S_ISSOCK(os.lstat(path).st_mode):
|
|
588
|
+
os.unlink(path) # its owner is gone (killed, or before a reboot's tmpfs wipe)
|
|
589
|
+
except OSError:
|
|
590
|
+
pass
|
|
533
591
|
except OSError:
|
|
534
592
|
pass
|
|
535
593
|
return sessions
|
|
@@ -540,6 +598,9 @@ def main(argv):
|
|
|
540
598
|
if cmd == 'new':
|
|
541
599
|
if not os.isatty(0):
|
|
542
600
|
sys.exit('trd-pty: new needs a terminal')
|
|
601
|
+
if not hasattr(socket, 'SO_PEERCRED') and not hasattr(socket, 'LOCAL_PEERCRED'):
|
|
602
|
+
# Both ends check who is at the other one, and here they can't: no session (the login falls back to tmux).
|
|
603
|
+
unsafe('this system does not say which user is at the other end of a socket')
|
|
543
604
|
return attach(start_session(*term_size(0)))
|
|
544
605
|
if cmd == 'attach' and len(argv) == 3:
|
|
545
606
|
return attach(argv[2])
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# vendor/ is IronRDP 9b151c4c2e47c6014e1e8e55909d4180aa8bdb99 with the patches below, built by scripts/build-ironrdp.sh with
|
|
2
|
+
# rustc 1.94.1 (e408947bf 2026-03-25), wasm-pack 0.15.0 (wasm-bindgen 0.2.126, binaryen version_117) and
|
|
3
|
+
# Node.js v26.8.2, on aarch64-apple-darwin. Check from the repository's root: sha256sum -c vendor/SHA256SUMS
|
|
4
|
+
# (or shasum -a 256 -c vendor/SHA256SUMS).
|
|
5
|
+
965bc4a29f18bd6d766fe397c96dbe1483b23607ae8dd5a7458149d3625c2023 ironrdp/BASE_COMMIT
|
|
6
|
+
315f1de9185945c1bf248706353758ef0af9f94a2bcd01d9709454f5da752dca ironrdp/patches/0001-fix-dvc-drop-data-for-a-channel-that-is-not-open-ins.patch
|
|
7
|
+
637157633fc962bdd4f300477134d42106dc606aaad933f74d70f9f2fc90cecd ironrdp/patches/0002-fix-web-fit-the-canvas-to-the-host-element-not-the-w.patch
|
|
8
|
+
81b3ea3fd8d339cf982f1dfb10fa765aae0beec9aa1333b2c918c3f57a89eccb ironrdp/patches/0003-fix-web-dispatch-the-ready-event-after-clipboard-ini.patch
|
|
9
|
+
30c1202263bd6654b2617e787ca3385f15361eb26d809ebc9ad9aef52c7b98cf ironrdp/patches/0004-fix-rdpsnd-echo-the-Training-PDU-s-wPackSize-in-the-.patch
|
|
10
|
+
f6193b9fcc3d9be6442f7ad906a1a586c842459952ed201dabee0364e6437ae0 ironrdp/patches/0005-feat-web-graphics-pipeline-EGFX-per-connection-and-f.patch
|
|
11
|
+
4b8d33f188be91d478886fd2f1ee58c8ae86ac7594ca682b7b3f54de2fe57839 ironrdp/patches/0006-feat-web-audio-playback-RDPSND-through-an-audioPlayb.patch
|
|
12
|
+
ebe7d796727f9855c32ba1b8d5b5d2429483be54cb6654a130bfb9c57bbab2c1 ironrdp/patches/0007-feat-web-microphone-redirection-AUDIO_INPUT-through-.patch
|
|
13
|
+
8859fbb775635beaef4d558fe8512ad47dac4b9610b31e44fa99987d8d4cbe76 ironrdp/patches/0008-feat-web-H.264-in-the-graphics-pipeline-decoded-by-W.patch
|
|
14
|
+
f597cc1fa3e8c4fce560b55024f6e4f3ea58d469c4f775da7abd0e6555a7c2ef ironrdp/patches/0009-feat-web-let-the-host-hand-init-the-WebAssembly-modu.patch
|
|
15
|
+
c7f82ac4b382e478a135734e7864ba83bcb2ba715b27cf40b17ad90342a936f3 ironrdp/patches/0010-fix-graphics-read-Progressive-SRL-code-words-as-valu.patch
|
|
16
|
+
92237eed373c3b597fea0dd6e5548052ac13ad34f6b3276d0ce53dd667a1c0d7 ironrdp/patches/0011-feat-web-let-the-host-send-key-events-to-a-session.patch
|
|
17
|
+
4c843f724d8f348297b5d17174c0c2d1dbc611a57f7eb2bb5cba633ebf8c5ba3 ironrdp/patches/0012-fix-web-keep-clipboard-monitoring-and-focus-writes-p.patch
|
|
18
|
+
48e697ea31969259faebc743026f91995b33af1e9cbc6af6970861c7c59c671c ironrdp/patches/0013-fix-web-sync-the-clipboard-automatically-for-the-foc.patch
|
|
19
|
+
a9029bbb677deb208eda1202daec144b6a9e033fc987480eab4bf8b8e0ac70d6 ironrdp/patches/0014-fix-web-read-H.264-pictures-correctly-where-WebKit-i.patch
|
|
20
|
+
459b08a00dc1e0341e1e80c0dab9b724b952b886964042ebe6ed9d80be5880c4 ironrdp/patches/0015-feat-web-drive-redirection-through-a-JavaScript-file.patch
|
|
21
|
+
d67aa6029edb142daa1e5069fa79ab1917687474a89a61bd221081f204ba8e12 ironrdp/patches/0016-fix-svc-send-chunked-messages-without-CHANNEL_FLAG_S.patch
|
|
22
|
+
35a592496b2c735d78450cf417e16a260143af2490817e57cd6a13b5f5b340c4 ironrdp/patches/0017-perf-web-read-H.264-regions-that-are-far-apart-one-b.patch
|
|
23
|
+
08ccf512db2cfe21b16f958eda6fa4b23e052a0c0e91829a4fc2657f8bd8dd4d vendor/IRONRDP-LICENSE
|
|
24
|
+
538641d863e52972074b032c111a67cfa02d06290bff0601423f3dfd25ad563b vendor/iron-remote-desktop-rdp.js
|
|
25
|
+
5a6363b9140a5a2abf0218aa39edb38f10445e8d7e9c5a798c321772e1f07c11 vendor/iron-remote-desktop.js
|
|
26
|
+
31f961cc5fc60f6a3dc580333f871bf9b380950dc849395465844dcc90f871f3 vendor/ironrdp_web_bg.wasm
|
|
Binary file
|
package/dist/accountForm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accountForm.js","sourceRoot":"","sources":["../src/accountForm.ts"],"names":[],"mappings":"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"}
|
package/dist/accounts.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":";;AAoBA,gCAaC;AAGD,oCAOC;AAGD,gCAEC;AAGD,gCAEC;AAlCD,0FAA0F;AAC1F,SAAgB,UAAU,CAAE,KAAU;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;IACjE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAM,EAAkB,EAAE;QAC3C,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACzE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5D,OAAO,EAAE,CAAA;QACb,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACZ,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QAC5F,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAChK,CAAC,CAAC,CAAA;AACN,CAAC;AAED,+DAA+D;AAC/D,SAAgB,YAAY,CAAE,KAAqB;IAC/C,SAAS,CAAC;QACN,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACjE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAA;QACb,CAAC;IACL,CAAC;AACL,CAAC;AAED,4GAA4G;AAC5G,SAAgB,UAAU,CAAE,OAAkD;IAC1E,OAAO,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAA;AAC1H,CAAC;AAED,kHAAkH;AAClH,SAAgB,UAAU,CAAE,EAAU;IAClC,OAAO,WAAW,EAAE,EAAE,CAAA;AAC1B,CAAC"}
|
package/dist/audio.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connectionStatus.js","sourceRoot":"","sources":["../src/connectionStatus.ts"],"names":[],"mappings":"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"}
|
package/dist/desk.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"desk.js","sourceRoot":"","sources":["../src/desk.ts"],"names":[],"mappings":"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"}
|
package/dist/deskScript.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deskScript.js","sourceRoot":"","sources":["../src/deskScript.ts"],"names":[],"mappings":";;;AAuBA,kBAEC;AAMD,sCA8BC;AA1CD,8DAA8D;AACjD,QAAA,kBAAkB,GAAG,6CAA6C,CAAA;AAE/E,oCAAoC;AACpC,SAAgB,GAAG,CAAE,KAAa;IAC9B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAA;AAC9C,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAE,OAAoB;IAC/C,OAAO,QAAQ,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;OAChC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;MACpB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;OACf,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;CACvB,GAAG,MAAM,CAAC,GAAG,CAAA;;;yBAGW,GAAG;;;;;;;;;;;;;;;;;;;;;CAqB3B,CAAA;AACD,CAAC"}
|