tabby-rdp 0.2.7 → 0.3.1

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.
Files changed (59) hide show
  1. package/CHANGELOG.md +72 -2
  2. package/README.md +182 -21
  3. package/dist/connectionStatus.js +140 -0
  4. package/dist/connectionStatus.js.map +1 -0
  5. package/dist/desk.js +21 -10
  6. package/dist/desk.js.map +1 -1
  7. package/dist/deskScript.js +3 -0
  8. package/dist/deskScript.js.map +1 -1
  9. package/dist/desktop.service.js +994 -53
  10. package/dist/desktop.service.js.map +1 -1
  11. package/dist/desktopForm.js +64 -19
  12. package/dist/desktopForm.js.map +1 -1
  13. package/dist/desktops.js +60 -21
  14. package/dist/desktops.js.map +1 -1
  15. package/dist/fileTransfer.js +152 -5
  16. package/dist/fileTransfer.js.map +1 -1
  17. package/dist/header.js +22 -7
  18. package/dist/header.js.map +1 -1
  19. package/dist/help.js +241 -0
  20. package/dist/help.js.map +1 -0
  21. package/dist/index.js +16 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/keyboard.js +142 -5
  24. package/dist/keyboard.js.map +1 -1
  25. package/dist/microphone.js +295 -0
  26. package/dist/microphone.js.map +1 -0
  27. package/dist/osd.js +79 -0
  28. package/dist/osd.js.map +1 -0
  29. package/dist/probe.js +33 -0
  30. package/dist/probe.js.map +1 -0
  31. package/dist/rdcleanpath.js +132 -7
  32. package/dist/rdcleanpath.js.map +1 -1
  33. package/dist/rdpFile.js +47 -0
  34. package/dist/rdpFile.js.map +1 -0
  35. package/dist/rdpProfile.js +367 -0
  36. package/dist/rdpProfile.js.map +1 -0
  37. package/dist/remoteSetup.js +90 -11
  38. package/dist/remoteSetup.js.map +1 -1
  39. package/dist/settingsPage.js +554 -0
  40. package/dist/settingsPage.js.map +1 -0
  41. package/dist/signin.js +21 -2
  42. package/dist/signin.js.map +1 -1
  43. package/dist/ssh.js +28 -0
  44. package/dist/ssh.js.map +1 -1
  45. package/dist/targets.js +148 -8
  46. package/dist/targets.js.map +1 -1
  47. package/dist/ui.js +163 -24
  48. package/dist/ui.js.map +1 -1
  49. package/dist/updates.js +123 -0
  50. package/dist/updates.js.map +1 -0
  51. package/dist/vms.js +90 -0
  52. package/dist/vms.js.map +1 -0
  53. package/dist/wake.js +124 -0
  54. package/dist/wake.js.map +1 -0
  55. package/package.json +2 -1
  56. package/vendor/IRONRDP-LICENSE +3 -3
  57. package/vendor/iron-remote-desktop-rdp.js +698 -451
  58. package/vendor/iron-remote-desktop.js +87 -81
  59. package/vendor/ironrdp_web_bg.wasm +0 -0
package/dist/ui.js CHANGED
@@ -12,18 +12,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.RemoteDesktopToolbarButton = exports.RemoteDesktopContextMenu = exports.RemoteDesktopConfig = exports.RemoteDesktopHotkeys = exports.TOGGLE_HOTKEY = void 0;
13
13
  exports.toggleLabel = toggleLabel;
14
14
  exports.desktopChoices = desktopChoices;
15
+ exports.desktopActions = desktopActions;
15
16
  exports.settingsMenu = settingsMenu;
16
17
  const core_1 = require("@angular/core");
17
18
  const tabby_core_1 = require("tabby-core");
18
19
  const tabby_terminal_1 = require("tabby-terminal");
19
20
  const desktop_service_1 = require("./desktop.service");
21
+ const help_1 = require("./help");
22
+ Object.defineProperty(exports, "TOGGLE_HOTKEY", { enumerable: true, get: function () { return help_1.TOGGLE_HOTKEY; } });
23
+ const keyboard_1 = require("./keyboard");
24
+ const updates_1 = require("./updates");
20
25
  const ssh_1 = require("./ssh");
21
26
  const targets_1 = require("./targets");
22
- exports.TOGGLE_HOTKEY = 'remote-desktop-toggle';
23
27
  /** Listed in Settings > Hotkeys, where it can be rebound. Works while the desktop has focus too. */
24
28
  let RemoteDesktopHotkeys = class RemoteDesktopHotkeys extends tabby_core_1.HotkeyProvider {
25
29
  async provide() {
26
- return [{ id: exports.TOGGLE_HOTKEY, name: 'Remote desktop: switch between desktop and console (SSH tabs and terminals running ssh)' }];
30
+ return [{ id: help_1.TOGGLE_HOTKEY, name: 'Remote desktop: switch between desktop and console (SSH tabs and terminals running ssh)' }];
27
31
  }
28
32
  };
29
33
  exports.RemoteDesktopHotkeys = RemoteDesktopHotkeys;
@@ -34,7 +38,7 @@ let RemoteDesktopConfig = class RemoteDesktopConfig extends tabby_core_1.ConfigP
34
38
  constructor() {
35
39
  super(...arguments);
36
40
  this.defaults = {
37
- hotkeys: { [exports.TOGGLE_HOTKEY]: [] },
41
+ hotkeys: { [help_1.TOGGLE_HOTKEY]: [] },
38
42
  remoteDesktop: {
39
43
  // Shareable session for SSH logins ('desk'): 'native' (trd-pty) or 'tmux' (earlier setup).
40
44
  sessionBackend: 'native',
@@ -48,16 +52,36 @@ let RemoteDesktopConfig = class RemoteDesktopConfig extends tabby_core_1.ConfigP
48
52
  macShortcuts: true,
49
53
  // Play the remote desktop's sound (applies on the next connect).
50
54
  sound: true,
55
+ // H.264 in the graphics pipeline, decoded by the browser, where it can (applies on the next connect).
56
+ h264: true,
57
+ // With resize 'off': 'fit' (scaled to the pane) | 'actual' (1:1, scrolling).
58
+ zoom: 'fit',
59
+ // A small indicator on the desktop: throughput, frames per second, SSH round trip, connection path.
60
+ connectionStatus: false,
61
+ // Send the microphone to the remote desktop while an application there records (applies on the next connect).
62
+ microphone: false,
51
63
  // More desktops behind SSH hosts (e.g. a Windows VM whose RDP port the host forwards); see desktops.ts.
52
64
  desktops: [],
53
65
  // Sharpness for particular desktops, overriding `sharpness`: [{ desktop: <session key>, sharpness }].
54
66
  desktopSharpness: [],
67
+ // Certificates of desktops behind hosts, trusted on first use: [{ desktop: <session key>, sha256 }].
68
+ trustedCertificates: [],
69
+ // The on-screen display naming a desktop for a moment (see osd.ts).
70
+ osd: { show: 'auto', font: 'condensed', size: 'medium', position: 'top-right', color: '', seconds: 2.5 },
71
+ // Look for VMs with a desktop on SSH hosts (libvirt) and offer them in the menus (see vms.ts).
72
+ discoverVMs: true,
73
+ // Ask npm once a day whether a newer tabby-rdp is out, and say so (see updates.ts).
74
+ checkUpdates: true,
75
+ // The newer version a note was shown for (once per version).
76
+ updateNoted: '',
77
+ // The tip shown the first time a desktop connects (see help.ts) has been shown.
78
+ tipShown: false,
55
79
  },
56
80
  };
57
81
  this.platformDefaults = {
58
- [tabby_core_1.Platform.macOS]: { hotkeys: { [exports.TOGGLE_HOTKEY]: ['⌘-Shift-G'] } },
59
- [tabby_core_1.Platform.Windows]: { hotkeys: { [exports.TOGGLE_HOTKEY]: ['Ctrl-Shift-G'] } },
60
- [tabby_core_1.Platform.Linux]: { hotkeys: { [exports.TOGGLE_HOTKEY]: ['Ctrl-Shift-G'] } },
82
+ [tabby_core_1.Platform.macOS]: { hotkeys: { [help_1.TOGGLE_HOTKEY]: ['⌘-Shift-G'] } },
83
+ [tabby_core_1.Platform.Windows]: { hotkeys: { [help_1.TOGGLE_HOTKEY]: ['Ctrl-Shift-G'] } },
84
+ [tabby_core_1.Platform.Linux]: { hotkeys: { [help_1.TOGGLE_HOTKEY]: ['Ctrl-Shift-G'] } },
61
85
  };
62
86
  }
63
87
  };
@@ -65,10 +89,13 @@ exports.RemoteDesktopConfig = RemoteDesktopConfig;
65
89
  exports.RemoteDesktopConfig = RemoteDesktopConfig = __decorate([
66
90
  (0, core_1.Injectable)()
67
91
  ], RemoteDesktopConfig);
68
- /** What switching does for this pane right now. Names the desktop when the host has more than one. */
92
+ /**
93
+ * What switching does for this pane right now. Names the desktop when the host has more than one. Null in a remote
94
+ * desktop tab while its desktop shows: there is no console to switch to.
95
+ */
69
96
  function toggleLabel(desktop, pane) {
70
97
  if (desktop.isVisible(pane)) {
71
- return 'Back to console';
98
+ return desktop.hasConsole(pane) ? 'Back to console' : null;
72
99
  }
73
100
  const { specs, current } = desktop.choicesOf(pane);
74
101
  const what = specs.length > 1 && current ? current.name : 'remote desktop';
@@ -84,20 +111,49 @@ function toggleLabel(desktop, pane) {
84
111
  function desktopChoices(desktop, pane, targetLabel) {
85
112
  const { specs, current } = desktop.choicesOf(pane);
86
113
  const items = specs.filter(spec => spec.id !== current?.id).map(spec => ({
87
- label: desktop.isOpenElsewhere(pane, spec) ? `Switch to ${spec.name} (open in another tab)` : `Open ${spec.name}`,
114
+ label: desktop.isOpenElsewhere(pane, spec) ? `Switch to ${spec.name} (open in another tab)`
115
+ // Found on the host (see vms.ts): say so, and that opening one that's off starts it.
116
+ : spec.found === 'off' ? `Start and open ${spec.name} (VM, shut off)` : spec.found ? `Open ${spec.name} (VM)` : `Open ${spec.name}`,
88
117
  click: () => desktop.showDesktop(pane, spec.id),
89
118
  }));
90
- if (targetLabel) {
119
+ // Not in a remote desktop tab: it isn't an SSH host.
120
+ if (targetLabel && desktop.hasConsole(pane)) {
91
121
  items.push({ label: `Add a desktop behind ${targetLabel}…`, click: () => desktop.addDesktop(pane) });
92
122
  }
93
123
  return items;
94
124
  }
125
+ /** What can be done with the pane's connected desktop: send keys, view only, a screenshot. Shared by the menus. */
126
+ function desktopActions(desktop, keyboard, pane) {
127
+ const spec = desktop.desktopOf(pane);
128
+ if (!spec || !desktop.isConnected(pane)) {
129
+ return [];
130
+ }
131
+ const viewOnly = desktop.isViewOnly(pane);
132
+ return [
133
+ {
134
+ label: 'Send keys',
135
+ enabled: !viewOnly,
136
+ submenu: keyboard_1.SEND_KEYS[spec.kind].map(combo => ({ label: combo.label, click: () => keyboard.send(pane, combo) })),
137
+ },
138
+ {
139
+ type: 'checkbox',
140
+ label: 'View only (no keyboard or mouse input)',
141
+ checked: viewOnly,
142
+ click: () => desktop.setViewOnly(pane, !viewOnly),
143
+ },
144
+ { label: 'Save a screenshot (to Downloads and the clipboard)', click: () => desktop.saveScreenshot(pane) },
145
+ ];
146
+ }
95
147
  /** Tab header menu (whole tab: its focused pane) and in-terminal menu (that pane). */
96
148
  let RemoteDesktopContextMenu = class RemoteDesktopContextMenu extends tabby_core_1.TabContextMenuItemProvider {
97
- constructor(desktop, targets) {
149
+ constructor(desktop, targets, keyboard, help, app, updates) {
98
150
  super();
99
151
  this.desktop = desktop;
100
152
  this.targets = targets;
153
+ this.keyboard = keyboard;
154
+ this.help = help;
155
+ this.app = app;
156
+ this.updates = updates;
101
157
  this.weight = 6;
102
158
  }
103
159
  async getItems(tab, tabHeader) {
@@ -107,30 +163,73 @@ let RemoteDesktopContextMenu = class RemoteDesktopContextMenu extends tabby_core
107
163
  }
108
164
  const pane = (0, targets_1.desktopPaneOf)(tab);
109
165
  // Local terminals qualify only while they run ssh.
110
- if (!pane || !this.desktop.has(pane) && !await this.targets.targetOf(pane)) {
166
+ const target = pane && (this.targets.cached(pane) ?? await this.targets.targetOf(pane));
167
+ if (!pane || !this.desktop.has(pane) && !target) {
111
168
  return [];
112
169
  }
113
- const items = [{
114
- label: toggleLabel(this.desktop, pane),
115
- click: () => this.desktop.toggle(pane),
116
- }, ...desktopChoices(this.desktop, pane, this.targets.cached(pane)?.label)];
170
+ // VMs on the host: wait a moment for a fresh look, else show what's known.
171
+ if (target) {
172
+ await Promise.race([this.desktop.discoverVMs(target), new Promise(resolve => setTimeout(resolve, 1200))]);
173
+ }
174
+ // A heading, so the items below read as this plugin's rather than Tabby's.
175
+ const connectedTo = this.desktop.isConnected(pane) ? this.desktop.desktopOf(pane)?.name : undefined;
176
+ const toggle = toggleLabel(this.desktop, pane);
177
+ const items = [
178
+ { label: connectedTo ? `Remote Desktop — connected to ${connectedTo}` : 'Remote Desktop', enabled: false },
179
+ // A newer tabby-rdp: where to get it (Tabby shows plugin upgrades only on its Plugins page).
180
+ ...this.updates.available ? [{ label: `Update available: ${this.updates.available}…`, click: () => this.updates.upgrade() }] : [],
181
+ ...toggle ? [{ label: toggle, click: () => this.desktop.toggle(pane) }] : [],
182
+ ];
183
+ // The host's other desktops (and VMs found there) and "Add a desktop behind…", one level down to keep the menu short.
184
+ const choices = desktopChoices(this.desktop, pane, this.targets.cached(pane)?.label);
185
+ if (choices.length) {
186
+ items.push({ label: 'Desktops', submenu: choices });
187
+ }
117
188
  if (this.desktop.isConnected(pane)) {
118
- items.push({ label: 'Send files to the remote desktop…', click: () => this.desktop.sendFiles(pane) });
189
+ items.push({ label: 'Send files…', click: () => this.desktop.sendFiles(pane) });
190
+ items.push(...desktopActions(this.desktop, this.keyboard, pane));
191
+ // Several desktops in this tab: paste on all of them, or type into all of them.
192
+ const all = this.desktop.desktopsInTab(pane);
193
+ if (all > 1) {
194
+ items.push({ label: `Paste to all ${all} desktops in this tab`, click: () => this.desktop.pasteToAll(pane) });
195
+ items.push({
196
+ type: 'checkbox',
197
+ label: `Type into all ${all} desktops in this tab`,
198
+ checked: this.desktop.isBroadcast(pane),
199
+ click: () => this.desktop.setBroadcast(pane, !this.desktop.isBroadcast(pane)),
200
+ });
201
+ }
202
+ }
203
+ if (this.desktop.desktopOf(pane)?.found) {
204
+ items.push({ label: `Save ${this.desktop.desktopOf(pane).name} to this host's desktops`, click: () => this.desktop.saveFoundDesktop(pane) });
205
+ }
206
+ if (this.desktop.canSignInAgain(pane)) {
207
+ items.push({ label: 'Sign in again…', click: () => this.desktop.signInAgain(pane) });
119
208
  }
120
209
  if (this.desktop.has(pane)) {
121
- items.push({ label: 'Disconnect remote desktop', click: () => this.desktop.disconnect(pane) });
210
+ items.push({ label: 'Disconnect', click: () => this.desktop.disconnect(pane) });
211
+ }
212
+ items.push({ label: 'Settings', submenu: settingsMenu(this.desktop, pane, this.help) });
213
+ // Tabby can even out a split's panes but offers it nowhere; a grid of desktops wants it.
214
+ const split = this.app.tabs.find(t => t instanceof tabby_core_1.SplitTabComponent && t.getAllTabs().includes(pane));
215
+ if (split && split.getAllTabs().length > 1) {
216
+ items.push({ label: 'Make panes even', click: () => { split.equalize(); split.layout(); } });
122
217
  }
123
- items.push({ label: 'Remote desktop settings', submenu: settingsMenu(this.desktop, pane) });
124
218
  return items;
125
219
  }
126
220
  };
127
221
  exports.RemoteDesktopContextMenu = RemoteDesktopContextMenu;
128
222
  exports.RemoteDesktopContextMenu = RemoteDesktopContextMenu = __decorate([
129
223
  (0, core_1.Injectable)(),
130
- __metadata("design:paramtypes", [desktop_service_1.RemoteDesktopService, targets_1.RemoteTargets])
224
+ __metadata("design:paramtypes", [desktop_service_1.RemoteDesktopService,
225
+ targets_1.RemoteTargets,
226
+ keyboard_1.DesktopKeyboard,
227
+ help_1.RemoteDesktopHelp,
228
+ tabby_core_1.AppService,
229
+ updates_1.UpdateCheck])
131
230
  ], RemoteDesktopContextMenu);
132
231
  /** Radio items for the `remoteDesktop` settings; shared by the context menus and the header button. */
133
- function settingsMenu(desktop, pane) {
232
+ function settingsMenu(desktop, pane, help) {
134
233
  const current = desktop.settings();
135
234
  const radio = (key, value, label) => ({
136
235
  type: 'radio',
@@ -138,6 +237,13 @@ function settingsMenu(desktop, pane) {
138
237
  checked: current[key] === value,
139
238
  click: () => desktop.updateSettings({ [key]: value }),
140
239
  });
240
+ // A fixed resolution, scaled to fit the pane or shown at actual size.
241
+ const fixed = (zoom, label) => ({
242
+ type: 'radio',
243
+ label,
244
+ checked: current.resize === 'off' && current.zoom === zoom,
245
+ click: () => desktop.updateSettings({ resize: 'off', zoom }),
246
+ });
141
247
  // The desktop open in this pane can have its own sharpness (for example, Retina for Windows only).
142
248
  const spec = pane ? desktop.desktopOf(pane) : null;
143
249
  const own = pane ? desktop.ownSharpness(pane) : null;
@@ -154,10 +260,15 @@ function settingsMenu(desktop, pane) {
154
260
  ownRadio('retina', 'Retina'),
155
261
  ] : [];
156
262
  return [
263
+ ...help ? [
264
+ { label: 'All settings, keys and help…', click: () => help.open() },
265
+ { type: 'separator' },
266
+ ] : [],
157
267
  { label: 'When the pane is resized', enabled: false },
158
268
  radio('resize', 'live', 'Resize the remote desktop to fit'),
159
269
  radio('resize', 'reconnect', 'Reconnect at the new size'),
160
- radio('resize', 'off', 'Keep the resolution (scale to fit)'),
270
+ fixed('fit', 'Keep the resolution (scale to fit)'),
271
+ fixed('actual', 'Keep the resolution (actual size, scroll)'),
161
272
  { type: 'separator' },
162
273
  { label: 'Sharpness', enabled: false },
163
274
  radio('sharpness', 'standard', 'Standard'),
@@ -176,6 +287,24 @@ function settingsMenu(desktop, pane) {
176
287
  checked: current.sound,
177
288
  click: () => desktop.updateSettings({ sound: !current.sound }),
178
289
  },
290
+ {
291
+ type: 'checkbox',
292
+ label: 'Video decoding (H.264, hardware-accelerated where available; applies on the next connect)',
293
+ checked: current.h264,
294
+ click: () => desktop.updateSettings({ h264: !current.h264 }),
295
+ },
296
+ {
297
+ type: 'checkbox',
298
+ label: 'Send the microphone while an app on the remote desktop records (applies on the next connect)',
299
+ checked: current.microphone,
300
+ click: () => desktop.updateSettings({ microphone: !current.microphone }),
301
+ },
302
+ {
303
+ type: 'checkbox',
304
+ label: 'Show connection status on the desktop (throughput, frames per second, round trip)',
305
+ checked: current.connectionStatus,
306
+ click: () => desktop.updateSettings({ connectionStatus: !current.connectionStatus }),
307
+ },
179
308
  ...process.platform === 'darwin' ? [{
180
309
  type: 'checkbox',
181
310
  label: 'Mac shortcuts on the remote desktop (⌘C, ⌘V, ⌘Z… act as Ctrl+C, Ctrl+V…; off: ⌘ is the Windows key)',
@@ -183,12 +312,22 @@ function settingsMenu(desktop, pane) {
183
312
  click: () => desktop.updateSettings({ macShortcuts: !current.macShortcuts }),
184
313
  }] : [],
185
314
  { type: 'separator' },
315
+ { label: 'Import an .rdp file…', click: () => desktop.importRdpFile() },
316
+ {
317
+ // The form shows over a console (a remote desktop tab edits its desktop in Tabby's profile settings).
318
+ label: 'Edit a desktop',
319
+ enabled: !!pane && desktop.hasConsole(pane) && desktop.configuredDesktops().length > 0,
320
+ submenu: desktop.configuredDesktops().map((d, i) => ({
321
+ label: `${d.name ?? `${d.host}:${d.port}`} (behind ${d.via})…`,
322
+ click: () => pane && desktop.editDesktop(pane, i),
323
+ })),
324
+ },
186
325
  {
187
326
  label: 'Remove a desktop',
188
327
  enabled: desktop.configuredDesktops().length > 0,
189
328
  submenu: desktop.configuredDesktops().map((d, i) => ({
190
- label: `${d.name ?? `${d.host}:${d.port}`} (behind ${d.via})`,
191
- click: () => desktop.removeDesktop(i),
329
+ label: `${d.name ?? `${d.host}:${d.port}`} (behind ${d.via})…`,
330
+ click: () => desktop.confirmRemoveDesktop(i),
192
331
  })),
193
332
  },
194
333
  ];
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.UpdateCheck = void 0;
13
+ exports.installedVersion = installedVersion;
14
+ exports.newer = newer;
15
+ const core_1 = require("@angular/core");
16
+ const rxjs_1 = require("rxjs");
17
+ const tabby_core_1 = require("tabby-core");
18
+ const help_1 = require("./help");
19
+ const targets_1 = require("./targets");
20
+ const REGISTRY = 'https://registry.npmjs.org/tabby-rdp/latest';
21
+ const RELEASES = 'https://github.com/meanaverage/tabby-rdp/releases';
22
+ const DAY = 24 * 60 * 60 * 1000;
23
+ /** This package's version. */
24
+ function installedVersion() {
25
+ try {
26
+ return require('../package.json').version;
27
+ }
28
+ catch {
29
+ return '0.0.0';
30
+ }
31
+ }
32
+ /** Whether `a` is a later release than `b` (x.y.z; a version with a pre-release part is never offered). */
33
+ function newer(a, b) {
34
+ const parse = (v) => /^(\d+)\.(\d+)\.(\d+)$/.exec(v.trim())?.slice(1).map(Number);
35
+ const x = parse(a), y = parse(b);
36
+ if (!x || !y) {
37
+ return false;
38
+ }
39
+ for (let i = 0; i < 3; i++) {
40
+ if (x[i] !== y[i]) {
41
+ return x[i] > y[i];
42
+ }
43
+ }
44
+ return false;
45
+ }
46
+ /**
47
+ * Tells about a newer tabby-rdp: Tabby only shows plugin upgrades while its Plugins page is open, and never on its own.
48
+ * Once a day (and a little after Tabby starts) it asks npm for the latest version, and nothing else: no identifier,
49
+ * no usage. A newer one gets a note, once per version, over the active pane; an "Update available" item in the
50
+ * menus and a line on the settings page until it's installed. `remoteDesktop.checkUpdates` turns it off.
51
+ */
52
+ let UpdateCheck = class UpdateCheck {
53
+ constructor(config, app, help, platform, zone) {
54
+ this.config = config;
55
+ this.app = app;
56
+ this.help = help;
57
+ this.platform = platform;
58
+ this.zone = zone;
59
+ /** The newer version, once one is known. */
60
+ this.available = null;
61
+ this.changed$ = new rxjs_1.Subject();
62
+ }
63
+ start() {
64
+ this.zone.runOutsideAngular(() => {
65
+ setTimeout(() => this.check().catch(() => null), 20000);
66
+ this.timer = setInterval(() => this.check().catch(() => null), DAY);
67
+ });
68
+ }
69
+ get enabled() {
70
+ return this.config.store.remoteDesktop?.checkUpdates !== false;
71
+ }
72
+ /** Asks npm for the latest version (or takes `latest`, for tests), and tells about it if it's newer. */
73
+ async check(latest) {
74
+ if (!this.enabled && latest === undefined) {
75
+ return null;
76
+ }
77
+ const version = latest ?? String((await (await fetch(REGISTRY, { cache: 'no-store' })).json())?.version ?? '');
78
+ this.zone.run(() => {
79
+ this.available = newer(version, installedVersion()) ? version : null;
80
+ this.changed$.next();
81
+ if (this.available) {
82
+ this.noteOnce(this.available);
83
+ }
84
+ });
85
+ return this.available;
86
+ }
87
+ /** Settings › Plugins, where Tabby's Upgrade button is. */
88
+ upgrade() {
89
+ this.help.openSettings('plugins');
90
+ }
91
+ /** The release notes of the newer version. */
92
+ whatsNew() {
93
+ this.platform.openExternal(`${RELEASES}/tag/v${this.available ?? ''}`);
94
+ }
95
+ /** A note over the active pane, once per version (then the menus and the settings page keep saying it). */
96
+ noteOnce(version) {
97
+ const store = this.config.store.remoteDesktop;
98
+ if (!store || store.updateNoted === version) {
99
+ return;
100
+ }
101
+ const pane = (0, targets_1.desktopPaneOf)(this.app.activeTab);
102
+ if (!pane) {
103
+ return; // shown the next time a pane is active and this runs
104
+ }
105
+ store.updateNoted = version;
106
+ this.config.save();
107
+ const note = this.help.note(pane.element.nativeElement, `tabby-rdp ${version} is available (you have ${installedVersion()}).`);
108
+ const button = document.createElement('button');
109
+ button.className = 'btn btn-secondary';
110
+ button.textContent = 'Upgrade';
111
+ button.addEventListener('click', () => {
112
+ note.remove();
113
+ this.upgrade();
114
+ });
115
+ note.insertBefore(button, note.querySelector('[data-ok]'));
116
+ }
117
+ };
118
+ exports.UpdateCheck = UpdateCheck;
119
+ exports.UpdateCheck = UpdateCheck = __decorate([
120
+ (0, core_1.Injectable)({ providedIn: 'root' }),
121
+ __metadata("design:paramtypes", [tabby_core_1.ConfigService, tabby_core_1.AppService, help_1.RemoteDesktopHelp, tabby_core_1.PlatformService, core_1.NgZone])
122
+ ], UpdateCheck);
123
+ //# sourceMappingURL=updates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updates.js","sourceRoot":"","sources":["../src/updates.ts"],"names":[],"mappings":"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"}
package/dist/vms.js ADDED
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scanVMs = scanVMs;
4
+ exports.vmSpec = vmSpec;
5
+ /**
6
+ * RDP security the server chose when offered TLS and NLA (RDP_NEG_RSP): Windows and GNOME Remote Desktop take NLA
7
+ * (2), xrdp only TLS (1). A Linux VM that takes NLA is GNOME's, whose sign-in the plugin manages over SSH to that VM:
8
+ * not one to offer here.
9
+ */
10
+ const XRDP_LIKE = '1';
11
+ // For each libvirt domain of the SSH user (system instance, then session), one line:
12
+ // TRD_VM <name>|<state>|<os id>|<address>|<rdp>. The address: live (guest agent, DHCP lease, ARP), else the DHCP
13
+ // reservation or lease for its MAC in its network. RDP: an X.224 connection request must get a TPKT reply (as in
14
+ // wake.ts) within a second; the protocol the server chose, or 0 without a negotiation response ('' if none).
15
+ // Read-only: starts nothing, changes nothing.
16
+ const SCAN_SCRIPT = String.raw `
17
+ command -v virsh >/dev/null 2>&1 || exit 0
18
+ probe () {
19
+ if command -v python3 >/dev/null 2>&1; then
20
+ python3 -c '
21
+ import socket, sys
22
+ try:
23
+ s = socket.create_connection((sys.argv[1], 3389), 1); s.settimeout(1)
24
+ s.sendall(bytes.fromhex("030000130ee000000000000100080003000000")); r = s.recv(64)
25
+ print("" if r[:2] != b"\x03\x00" else int.from_bytes(r[15:19], "little") if len(r) >= 19 and r[11] == 2 else 0)
26
+ except Exception:
27
+ print("")
28
+ ' "$1"
29
+ else
30
+ timeout 1 bash -c 'exec 3<>"/dev/tcp/$0/3389"' "$1" >/dev/null 2>&1 && echo 0
31
+ fi
32
+ }
33
+ for uri in qemu:///system qemu:///session; do
34
+ virsh -q -c "$uri" list --all --name 2>/dev/null | while IFS= read -r d; do
35
+ [ -n "$d" ] || continue
36
+ state=$(virsh -c "$uri" domstate "$d" 2>/dev/null | head -n 1)
37
+ os=$(virsh -c "$uri" dumpxml "$d" 2>/dev/null | sed -n 's/.*libosinfo:os id="\([^"]*\)".*/\1/p' | head -n 1)
38
+ ip=
39
+ if [ "$state" = running ]; then
40
+ for src in agent lease arp; do
41
+ ip=$(virsh -c "$uri" domifaddr "$d" --source "$src" 2>/dev/null | awk '$3 == "ipv4" { split($4, a, "/"); if (a[1] !~ /^(127|169\.254)\./) { print a[1]; exit } }')
42
+ [ -n "$ip" ] && break
43
+ done
44
+ fi
45
+ if [ -z "$ip" ]; then
46
+ set -- $(virsh -c "$uri" domiflist "$d" 2>/dev/null | awk '$2 == "network" { print $3, $5; exit }')
47
+ if [ -n "${"$"}{2:-}" ]; then
48
+ ip=$(virsh -c "$uri" net-dumpxml "$1" 2>/dev/null | tr -d '\n' | grep -o "<host [^>]*mac=.$2[^>]*>" | sed -n "s/.*ip=.\([0-9.]*\).*/\1/p" | head -n 1)
49
+ [ -n "$ip" ] || ip=$(virsh -c "$uri" net-dhcp-leases "$1" --mac "$2" 2>/dev/null | awk '$4 == "ipv4" { split($5, a, "/"); print a[1]; exit }')
50
+ fi
51
+ fi
52
+ rdp=
53
+ [ "$state" = running ] && [ -n "$ip" ] && rdp=$(probe "$ip")
54
+ printf 'TRD_VM %s|%s|%s|%s|%s\n' "$d" "$state" "$os" "$ip" "$rdp"
55
+ done
56
+ done
57
+ `;
58
+ /** The host's VMs that have (or, being off, may have) a desktop: running ones whose RDP answers, and Windows ones that are off. */
59
+ async function scanVMs(target) {
60
+ const out = await target.exec('sh -s', SCAN_SCRIPT);
61
+ const found = [];
62
+ for (const line of out.split('\n')) {
63
+ const m = /^TRD_VM ([^|]+)\|([^|]*)\|([^|]*)\|([^|]*)\|(\d*)\s*$/.exec(line.trim());
64
+ if (!m) {
65
+ continue;
66
+ }
67
+ const [, name, state, os, address, protocol] = m;
68
+ const windows = /microsoft\.com\/win/i.test(os);
69
+ // Windows: RDP answering, or off (started when opened). Others: only xrdp (see XRDP_LIKE).
70
+ const rdp = windows ? protocol !== '' : protocol === XRDP_LIKE;
71
+ const vm = { name, state: state === 'running' ? 'running' : 'off', windows, address, rdp };
72
+ if (vm.address && (vm.rdp || vm.state === 'off' && vm.windows) && !found.some(f => f.name === vm.name)) {
73
+ found.push(vm);
74
+ }
75
+ }
76
+ return found;
77
+ }
78
+ /** A found VM as a desktop behind its host: started by name when it's off (see wake.ts). */
79
+ function vmSpec(vm) {
80
+ return {
81
+ id: `${vm.address}:3389`,
82
+ name: vm.name,
83
+ kind: vm.windows ? 'windows' : 'xrdp',
84
+ host: vm.address,
85
+ port: 3389,
86
+ wake: { vm: vm.name },
87
+ found: vm.state,
88
+ };
89
+ }
90
+ //# sourceMappingURL=vms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vms.js","sourceRoot":"","sources":["../src/vms.ts"],"names":[],"mappings":";;AAuEA,0BAkBC;AAGD,wBAUC;AAvFD;;;;GAIG;AACH,MAAM,SAAS,GAAG,GAAG,CAAA;AAErB,qFAAqF;AACrF,iHAAiH;AACjH,iHAAiH;AACjH,6GAA6G;AAC7G,8CAA8C;AAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA+BP,GAAG;;;;;;;;;;CAUzB,CAAA;AAED,mIAAmI;AAC5H,KAAK,UAAU,OAAO,CAAE,MAAoB;IAC/C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACnD,MAAM,KAAK,GAAc,EAAE,CAAA;IAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QACnF,IAAI,CAAC,CAAC,EAAE,CAAC;YACL,SAAQ;QACZ,CAAC;QACD,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAA;QAChD,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC/C,2FAA2F;QAC3F,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAA;QAC9D,MAAM,EAAE,GAAY,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAA;QACnG,IAAI,EAAE,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACrG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClB,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,4FAA4F;AAC5F,SAAgB,MAAM,CAAE,EAAW;IAC/B,OAAO;QACH,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,OAAO;QACxB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;QACrC,IAAI,EAAE,EAAE,CAAC,OAAO;QAChB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE;QACrB,KAAK,EAAE,EAAE,CAAC,KAAK;KAClB,CAAA;AACL,CAAC"}