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.
- package/CHANGELOG.md +72 -2
- package/README.md +182 -21
- package/dist/connectionStatus.js +140 -0
- package/dist/connectionStatus.js.map +1 -0
- package/dist/desk.js +21 -10
- package/dist/desk.js.map +1 -1
- package/dist/deskScript.js +3 -0
- package/dist/deskScript.js.map +1 -1
- package/dist/desktop.service.js +994 -53
- package/dist/desktop.service.js.map +1 -1
- package/dist/desktopForm.js +64 -19
- package/dist/desktopForm.js.map +1 -1
- package/dist/desktops.js +60 -21
- package/dist/desktops.js.map +1 -1
- package/dist/fileTransfer.js +152 -5
- package/dist/fileTransfer.js.map +1 -1
- package/dist/header.js +22 -7
- package/dist/header.js.map +1 -1
- package/dist/help.js +241 -0
- package/dist/help.js.map +1 -0
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/keyboard.js +142 -5
- package/dist/keyboard.js.map +1 -1
- package/dist/microphone.js +295 -0
- package/dist/microphone.js.map +1 -0
- package/dist/osd.js +79 -0
- package/dist/osd.js.map +1 -0
- package/dist/probe.js +33 -0
- package/dist/probe.js.map +1 -0
- package/dist/rdcleanpath.js +132 -7
- package/dist/rdcleanpath.js.map +1 -1
- package/dist/rdpFile.js +47 -0
- package/dist/rdpFile.js.map +1 -0
- package/dist/rdpProfile.js +367 -0
- package/dist/rdpProfile.js.map +1 -0
- package/dist/remoteSetup.js +90 -11
- package/dist/remoteSetup.js.map +1 -1
- package/dist/settingsPage.js +554 -0
- package/dist/settingsPage.js.map +1 -0
- package/dist/signin.js +21 -2
- package/dist/signin.js.map +1 -1
- package/dist/ssh.js +28 -0
- package/dist/ssh.js.map +1 -1
- package/dist/targets.js +148 -8
- package/dist/targets.js.map +1 -1
- package/dist/ui.js +163 -24
- package/dist/ui.js.map +1 -1
- package/dist/updates.js +123 -0
- package/dist/updates.js.map +1 -0
- package/dist/vms.js +90 -0
- package/dist/vms.js.map +1 -0
- package/dist/wake.js +124 -0
- package/dist/wake.js.map +1 -0
- package/package.json +2 -1
- package/vendor/IRONRDP-LICENSE +3 -3
- package/vendor/iron-remote-desktop-rdp.js +698 -451
- package/vendor/iron-remote-desktop.js +87 -81
- 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:
|
|
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: { [
|
|
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: { [
|
|
59
|
-
[tabby_core_1.Platform.Windows]: { hotkeys: { [
|
|
60
|
-
[tabby_core_1.Platform.Linux]: { hotkeys: { [
|
|
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
|
-
/**
|
|
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)`
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
|
|
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.
|
|
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":";;;;;;;;;;;;AAoDA,kCAUC;AAMD,wCAUC;AAqCD,oCA8DC;AAjLD,wCAAkD;AAClD,2CAGmB;AACnB,mDAA4E;AAC5E,uDAAyE;AACzE,+BAAgC;AAChC,uCAAqE;AAExD,QAAA,aAAa,GAAG,uBAAuB,CAAA;AAEpD,oGAAoG;AAE7F,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,2BAAc;IACpD,KAAK,CAAC,OAAO;QACT,OAAO,CAAC,EAAE,EAAE,EAAE,qBAAa,EAAE,IAAI,EAAE,yFAAyF,EAAE,CAAC,CAAA;IACnI,CAAC;CACJ,CAAA;AAJY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,iBAAU,GAAE;GACA,oBAAoB,CAIhC;AAGM,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,2BAAc;IAAhD;;QACM,aAAQ,GAAG;YAChB,OAAO,EAAE,EAAE,CAAC,qBAAa,CAAC,EAAE,EAAE,EAAE;YAChC,aAAa,EAAE;gBACX,2FAA2F;gBAC3F,cAAc,EAAE,QAAQ;gBACxB,4DAA4D;gBAC5D,MAAM,EAAE,MAAM;gBACd,8EAA8E;gBAC9E,SAAS,EAAE,UAAU;gBACrB,0FAA0F;gBAC1F,IAAI,EAAE,KAAK;gBACX,mFAAmF;gBACnF,YAAY,EAAE,IAAI;gBAClB,iEAAiE;gBACjE,KAAK,EAAE,IAAI;gBACX,wGAAwG;gBACxG,QAAQ,EAAE,EAAE;gBACZ,sGAAsG;gBACtG,gBAAgB,EAAE,EAAE;aACvB;SACJ,CAAA;QAEQ,qBAAgB,GAAG;YACxB,CAAC,qBAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,qBAAa,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE;YACjE,CAAC,qBAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,qBAAa,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE;YACtE,CAAC,qBAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,qBAAa,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE;SACvE,CAAA;IACL,CAAC;CAAA,CAAA;AA5BY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,iBAAU,GAAE;GACA,mBAAmB,CA4B/B;AAED,sGAAsG;AACtG,SAAgB,WAAW,CAAE,OAA6B,EAAE,IAAiB;IACzE,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,iBAAiB,CAAA;IAC5B,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAA;IAC1E,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,QAAQ,IAAI,EAAE,CAAA;IACzB,CAAC;IACD,OAAO,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,wBAAwB,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAA;AACrG,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAE,OAA6B,EAAE,IAAiB,EAAE,WAAoB;IAClG,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAClD,MAAM,KAAK,GAAsB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxF,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,IAAI,wBAAwB,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE;QACjH,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;KAClD,CAAC,CAAC,CAAA;IACH,IAAI,WAAW,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,WAAW,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACxG,CAAC;IACD,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,sFAAsF;AAE/E,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,uCAA0B;IAGpE,YAAqB,OAA6B,EAAU,OAAsB;QAC9E,KAAK,EAAE,CAAA;QADU,YAAO,GAAP,OAAO,CAAsB;QAAU,YAAO,GAAP,OAAO,CAAe;QAFzE,WAAM,GAAG,CAAC,CAAA;IAInB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAE,GAAqB,EAAE,SAAmB;QACtD,gGAAgG;QAChG,IAAI,SAAS,IAAI,GAAG,CAAC,MAAM,YAAY,8BAAiB,EAAE,CAAC;YACvD,OAAO,EAAE,CAAA;QACb,CAAC;QACD,MAAM,IAAI,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAA;QAC/B,mDAAmD;QACnD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzE,OAAO,EAAE,CAAA;QACb,CAAC;QACD,MAAM,KAAK,GAAsB,CAAC;gBAC9B,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;gBACtC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;aACzC,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;QAC3E,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mCAAmC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACzG,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClG,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;QAC3F,OAAO,KAAK,CAAA;IAChB,CAAC;CACJ,CAAA;AA9BY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,iBAAU,GAAE;qCAIqB,sCAAoB,EAAmB,uBAAa;GAHzE,wBAAwB,CA8BpC;AAED,uGAAuG;AACvG,SAAgB,YAAY,CAAE,OAA6B,EAAE,IAAyB;IAClF,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;IAClC,MAAM,KAAK,GAAG,CAAkC,GAAM,EAAE,KAAyB,EAAE,KAAa,EAAmB,EAAE,CAAC,CAAC;QACnH,IAAI,EAAE,OAAO;QACb,KAAK;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK;QAC/B,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAA8B,CAAC;KACpF,CAAC,CAAA;IACF,mGAAmG;IACnG,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpD,MAAM,QAAQ,GAAG,CAAC,KAA0C,EAAE,KAAa,EAAmB,EAAE,CAAC,CAAC;QAC9F,IAAI,EAAE,OAAO;QACb,KAAK;QACL,OAAO,EAAE,GAAG,KAAK,KAAK;QACtB,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,IAAK,EAAE,KAAK,CAAC;KACrD,CAAC,CAAA;IACF,MAAM,YAAY,GAAsB,IAAI,CAAC,CAAC,CAAC;QAC3C,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,IAAI,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;QAClD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;QAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;QAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAC/B,CAAC,CAAC,CAAC,EAAE,CAAA;IACN,OAAO;QACH,EAAE,KAAK,EAAE,0BAA0B,EAAE,OAAO,EAAE,KAAK,EAAE;QACrD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,kCAAkC,CAAC;QAC3D,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,2BAA2B,CAAC;QACzD,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,oCAAoC,CAAC;QAC5D,EAAE,IAAI,EAAE,WAAW,EAAE;QACrB,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE;QACtC,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC;QAC1C,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,gDAAgD,CAAC;QAC9E,GAAG,YAAY;QACf,EAAE,IAAI,EAAE,WAAW,EAAE;QACrB;YACI,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,kGAAkG;YACzG,OAAO,EAAE,OAAO,CAAC,IAAI;YACrB,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SAC/D;QACD;YACI,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,gEAAgE;YACvE,OAAO,EAAE,OAAO,CAAC,KAAK;YACtB,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;SACjE;QACD,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,EAAE,UAAmB;gBACzB,KAAK,EAAE,qGAAqG;gBAC5G,OAAO,EAAE,OAAO,CAAC,YAAY;gBAC7B,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;aAC/E,CAAC,CAAC,CAAC,CAAC,EAAE;QACP,EAAE,IAAI,EAAE,WAAW,EAAE;QACrB;YACI,KAAK,EAAE,kBAAkB;YACzB,OAAO,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,GAAG,CAAC;YAChD,OAAO,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjD,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,GAAG,GAAG;gBAC7D,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;aACxC,CAAC,CAAC;SACN;KACJ,CAAA;AACL,CAAC;AAED,mGAAmG;AAE5F,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,kCAAiB;IAC7D,YAAqB,OAA6B,EAAU,IAAY;QACpE,KAAK,EAAE,CAAA;QADU,YAAO,GAAP,OAAO,CAAsB;QAAU,SAAI,GAAJ,IAAI,CAAQ;IAExE,CAAC;IAEQ,MAAM,CAAE,QAAuC;QACpD,IAAI,CAAC,IAAA,cAAQ,EAAC,QAAQ,CAAC,EAAE,CAAC;YACtB,OAAM;QACV,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAA;QACpB,MAAM,IAAI,GAAgB,GAAG,CAAC,OAAO,CAAC,aAAa,CAAA;QACnD,MAAM,MAAM,GAAG,GAAG,EAAE;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAA;YACtD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAC3D,OAAO,CAAC,CAAC,OAAO,CAAA;YACpB,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;YAC/C,MAAM,CAAC,SAAS,GAAG,6CAA6C,CAAA;YAChE,MAAM,CAAC,KAAK,GAAG,mDAAmD,CAAA;YAClE,MAAM,CAAC,SAAS,GAAG,oDAAoD,CAAA;YACvE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACrF,2FAA2F;YAC3F,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;YAC7G,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAA;YAChB,CAAC;YACD,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACjD,OAAO,IAAI,CAAA;QACf,CAAC,CAAA;QACD,IAAI,MAAM,EAAE,EAAE,CAAC;YACX,OAAM;QACV,CAAC;QACD,iGAAiG;QACjG,sEAAsE;QACtE,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE;YAC7B,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;gBACvC,IAAI,MAAM,EAAE,EAAE,CAAC;oBACX,QAAQ,CAAC,UAAU,EAAE,CAAA;gBACzB,CAAC;YACL,CAAC,CAAC,CAAA;YACF,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YAC1D,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAA;YAC9C,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;IACN,CAAC;CACJ,CAAA;AA7CY,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,iBAAU,GAAE;qCAEqB,sCAAoB,EAAgB,aAAM;GAD/D,0BAA0B,CA6CtC"}
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|
package/dist/updates.js
ADDED
|
@@ -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
|
package/dist/vms.js.map
ADDED
|
@@ -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"}
|