docker-client-mx 1.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +233 -0
- package/bin/docker-client-mx.js +42 -0
- package/build/icons/icon-1024.png +0 -0
- package/build/icons/icon-128.png +0 -0
- package/build/icons/icon-16.png +0 -0
- package/build/icons/icon-256.png +0 -0
- package/build/icons/icon-32.png +0 -0
- package/build/icons/icon-48.png +0 -0
- package/build/icons/icon-512.png +0 -0
- package/build/icons/icon-64.png +0 -0
- package/build/icons/icon.ico +0 -0
- package/build/icons/icon.iconset/icon_128x128.png +0 -0
- package/build/icons/icon.iconset/icon_128x128@2x.png +0 -0
- package/build/icons/icon.iconset/icon_16x16.png +0 -0
- package/build/icons/icon.iconset/icon_16x16@2x.png +0 -0
- package/build/icons/icon.iconset/icon_256x256.png +0 -0
- package/build/icons/icon.iconset/icon_256x256@2x.png +0 -0
- package/build/icons/icon.iconset/icon_32x32.png +0 -0
- package/build/icons/icon.iconset/icon_32x32@2x.png +0 -0
- package/build/icons/icon.iconset/icon_512x512.png +0 -0
- package/build/icons/icon.iconset/icon_512x512@2x.png +0 -0
- package/build/icons/icon.png +0 -0
- package/dist/docker-desktop-mx/browser/chunk-64WWLMUP.js +39 -0
- package/dist/docker-desktop-mx/browser/chunk-N4VBBC4W.js +1 -0
- package/dist/docker-desktop-mx/browser/favicon.ico +0 -0
- package/dist/docker-desktop-mx/browser/index.html +14 -0
- package/dist/docker-desktop-mx/browser/main-CTIRTSOI.js +5 -0
- package/dist/docker-desktop-mx/browser/styles-JS3HDDI4.css +1 -0
- package/dist-electron/api.js +10 -0
- package/dist-electron/api.js.map +1 -0
- package/dist-electron/assistant-key.js +70 -0
- package/dist-electron/assistant-key.js.map +1 -0
- package/dist-electron/assistant-models.js +19 -0
- package/dist-electron/assistant-models.js.map +1 -0
- package/dist-electron/assistant-tools.js +335 -0
- package/dist-electron/assistant-tools.js.map +1 -0
- package/dist-electron/assistant.js +302 -0
- package/dist-electron/assistant.js.map +1 -0
- package/dist-electron/attention.js +75 -0
- package/dist-electron/attention.js.map +1 -0
- package/dist-electron/channels.js +113 -0
- package/dist-electron/channels.js.map +1 -0
- package/dist-electron/compose-files.js +104 -0
- package/dist-electron/compose-files.js.map +1 -0
- package/dist-electron/compose.js +271 -0
- package/dist-electron/compose.js.map +1 -0
- package/dist-electron/container-events.js +188 -0
- package/dist-electron/container-events.js.map +1 -0
- package/dist-electron/containers.js +165 -0
- package/dist-electron/containers.js.map +1 -0
- package/dist-electron/context-menu.js +56 -0
- package/dist-electron/context-menu.js.map +1 -0
- package/dist-electron/contexts.js +346 -0
- package/dist-electron/contexts.js.map +1 -0
- package/dist-electron/crash.js +129 -0
- package/dist-electron/crash.js.map +1 -0
- package/dist-electron/diagnosis.js +338 -0
- package/dist-electron/diagnosis.js.map +1 -0
- package/dist-electron/docker-client.js +284 -0
- package/dist-electron/docker-client.js.map +1 -0
- package/dist-electron/engine.js +145 -0
- package/dist-electron/engine.js.map +1 -0
- package/dist-electron/event-store.js +146 -0
- package/dist-electron/event-store.js.map +1 -0
- package/dist-electron/events.js +132 -0
- package/dist-electron/events.js.map +1 -0
- package/dist-electron/exec.js +138 -0
- package/dist-electron/exec.js.map +1 -0
- package/dist-electron/files.js +407 -0
- package/dist-electron/files.js.map +1 -0
- package/dist-electron/health.js +92 -0
- package/dist-electron/health.js.map +1 -0
- package/dist-electron/host-overview.js +50 -0
- package/dist-electron/host-overview.js.map +1 -0
- package/dist-electron/host-shell.js +196 -0
- package/dist-electron/host-shell.js.map +1 -0
- package/dist-electron/i18n.js +58 -0
- package/dist-electron/i18n.js.map +1 -0
- package/dist-electron/image-history.js +87 -0
- package/dist-electron/image-history.js.map +1 -0
- package/dist-electron/images.js +141 -0
- package/dist-electron/images.js.map +1 -0
- package/dist-electron/ipc.js +783 -0
- package/dist-electron/ipc.js.map +1 -0
- package/dist-electron/links.js +46 -0
- package/dist-electron/links.js.map +1 -0
- package/dist-electron/logs.js +153 -0
- package/dist-electron/logs.js.map +1 -0
- package/dist-electron/main.js +494 -0
- package/dist-electron/main.js.map +1 -0
- package/dist-electron/merged-logs.js +127 -0
- package/dist-electron/merged-logs.js.map +1 -0
- package/dist-electron/navigation.js +37 -0
- package/dist-electron/navigation.js.map +1 -0
- package/dist-electron/ndjson.js +30 -0
- package/dist-electron/ndjson.js.map +1 -0
- package/dist-electron/networks.js +507 -0
- package/dist-electron/networks.js.map +1 -0
- package/dist-electron/port-conflicts.js +106 -0
- package/dist-electron/port-conflicts.js.map +1 -0
- package/dist-electron/preload.js +257 -0
- package/dist-electron/preload.js.map +1 -0
- package/dist-electron/pull.js +220 -0
- package/dist-electron/pull.js.map +1 -0
- package/dist-electron/redact.js +129 -0
- package/dist-electron/redact.js.map +1 -0
- package/dist-electron/registry-auth.js +150 -0
- package/dist-electron/registry-auth.js.map +1 -0
- package/dist-electron/renew.js +162 -0
- package/dist-electron/renew.js.map +1 -0
- package/dist-electron/restart-policy.js +58 -0
- package/dist-electron/restart-policy.js.map +1 -0
- package/dist-electron/run-command.js +146 -0
- package/dist-electron/run-command.js.map +1 -0
- package/dist-electron/run.js +151 -0
- package/dist-electron/run.js.map +1 -0
- package/dist-electron/self-update.js +163 -0
- package/dist-electron/self-update.js.map +1 -0
- package/dist-electron/servers.js +108 -0
- package/dist-electron/servers.js.map +1 -0
- package/dist-electron/settings.js +146 -0
- package/dist-electron/settings.js.map +1 -0
- package/dist-electron/ssh.js +574 -0
- package/dist-electron/ssh.js.map +1 -0
- package/dist-electron/stats.js +209 -0
- package/dist-electron/stats.js.map +1 -0
- package/dist-electron/streams.js +63 -0
- package/dist-electron/streams.js.map +1 -0
- package/dist-electron/system.js +123 -0
- package/dist-electron/system.js.map +1 -0
- package/dist-electron/terminal-transcript.js +55 -0
- package/dist-electron/terminal-transcript.js.map +1 -0
- package/dist-electron/updates.js +136 -0
- package/dist-electron/updates.js.map +1 -0
- package/dist-electron/volume-backup.js +203 -0
- package/dist-electron/volume-backup.js.map +1 -0
- package/dist-electron/volume-files.js +124 -0
- package/dist-electron/volume-files.js.map +1 -0
- package/dist-electron/volumes.js +253 -0
- package/dist-electron/volumes.js.map +1 -0
- package/dist-electron/wiring-watch.js +93 -0
- package/dist-electron/wiring-watch.js.map +1 -0
- package/dist-electron/wiring.js +71 -0
- package/dist-electron/wiring.js.map +1 -0
- package/dist-electron/wsl.js +167 -0
- package/dist-electron/wsl.js.map +1 -0
- package/package.json +125 -0
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SshAgent = exports.SshDialer = void 0;
|
|
37
|
+
exports.parseSshHost = parseSshHost;
|
|
38
|
+
exports.sshEndpoint = sshEndpoint;
|
|
39
|
+
exports.knownHostName = knownHostName;
|
|
40
|
+
exports.checkHostKey = checkHostKey;
|
|
41
|
+
exports.hostKeyAlgorithms = hostKeyAlgorithms;
|
|
42
|
+
exports.fingerprint = fingerprint;
|
|
43
|
+
exports.hostKeyType = hostKeyType;
|
|
44
|
+
exports.appendKnownHost = appendKnownHost;
|
|
45
|
+
exports.authMethods = authMethods;
|
|
46
|
+
exports.deniedHostKey = deniedHostKey;
|
|
47
|
+
exports.describeSshProblem = describeSshProblem;
|
|
48
|
+
exports.describeDialProblem = describeDialProblem;
|
|
49
|
+
exports.sshDockerOptions = sshDockerOptions;
|
|
50
|
+
const node_crypto_1 = require("node:crypto");
|
|
51
|
+
const node_fs_1 = require("node:fs");
|
|
52
|
+
const node_http_1 = require("node:http");
|
|
53
|
+
const node_os_1 = require("node:os");
|
|
54
|
+
const path = __importStar(require("node:path"));
|
|
55
|
+
const ssh2_1 = require("ssh2");
|
|
56
|
+
const i18n_1 = require("./i18n");
|
|
57
|
+
/**
|
|
58
|
+
* Docker via `ssh://`, zoals de CLI het doet: inloggen op de server en daar
|
|
59
|
+
* `docker system dial-stdio` starten. Dat commando koppelt zijn stdin en stdout aan de socket
|
|
60
|
+
* van de daemon, dus elk ssh-kanaal is voor dockerode gewoon een verbinding met de daemon.
|
|
61
|
+
*
|
|
62
|
+
* Niet via docker-modem's eigen ssh-ondersteuning: die zet voor elk verzoek een nieuwe
|
|
63
|
+
* ssh-verbinding op, met handshake en al, en controleert de hostsleutel niet. Hier delen de
|
|
64
|
+
* verzoeken een paar verbindingen, en een server die we niet kennen weigeren we.
|
|
65
|
+
*/
|
|
66
|
+
const DIAL_COMMAND = 'docker system dial-stdio';
|
|
67
|
+
/** sshd staat standaard tien kanalen per verbinding toe (`MaxSessions`); wat marge eronder. */
|
|
68
|
+
const CHANNELS_PER_CONNECTION = 8;
|
|
69
|
+
const READY_TIMEOUT_MS = 10_000;
|
|
70
|
+
const KEEPALIVE_MS = 15_000;
|
|
71
|
+
/** Meer stderr van dial-stdio bewaren heeft geen zin: de eerste regel zegt wat er mis is. */
|
|
72
|
+
const MAX_STDERR = 2_000;
|
|
73
|
+
const DEFAULT_KEYS = ['id_ed25519', 'id_ecdsa', 'id_rsa'];
|
|
74
|
+
/** De agent van Windows' eigen OpenSSH, als `SSH_AUTH_SOCK` niets anders zegt. */
|
|
75
|
+
const WINDOWS_AGENT = '\\\\.\\pipe\\openssh-ssh-agent';
|
|
76
|
+
/** Wat ssh2 aankan, in de volgorde waarin we het de server aanbieden. */
|
|
77
|
+
const HOST_KEY_ALGORITHMS = [
|
|
78
|
+
'ssh-ed25519',
|
|
79
|
+
'ecdsa-sha2-nistp256',
|
|
80
|
+
'ecdsa-sha2-nistp384',
|
|
81
|
+
'ecdsa-sha2-nistp521',
|
|
82
|
+
'rsa-sha2-512',
|
|
83
|
+
'rsa-sha2-256',
|
|
84
|
+
'ssh-rsa',
|
|
85
|
+
];
|
|
86
|
+
/**
|
|
87
|
+
* Leest `ssh://gebruiker@host:poort`. Zonder gebruiker nemen we die van dit account, zoals
|
|
88
|
+
* `ssh` dat ook doet; `~/.ssh/config` lezen we niet.
|
|
89
|
+
*/
|
|
90
|
+
function parseSshHost(host, fallbackUser = localUser()) {
|
|
91
|
+
let url;
|
|
92
|
+
try {
|
|
93
|
+
url = new URL(host);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
throw new Error((0, i18n_1.t)({
|
|
97
|
+
en: `Not a valid ssh address: ${host}`,
|
|
98
|
+
nl: `Geen geldig ssh-adres: ${host}`,
|
|
99
|
+
de: `Keine gültige ssh-Adresse: ${host}`,
|
|
100
|
+
fr: `Adresse ssh non valide : ${host}`,
|
|
101
|
+
es: `No es una dirección ssh válida: ${host}`,
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
if (url.protocol !== 'ssh:' || url.hostname === '') {
|
|
105
|
+
throw new Error((0, i18n_1.t)({
|
|
106
|
+
en: `Not a valid ssh address: ${host}`,
|
|
107
|
+
nl: `Geen geldig ssh-adres: ${host}`,
|
|
108
|
+
de: `Keine gültige ssh-Adresse: ${host}`,
|
|
109
|
+
fr: `Adresse ssh non valide : ${host}`,
|
|
110
|
+
es: `No es una dirección ssh válida: ${host}`,
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
host: url.hostname.replace(/^\[|\]$/g, ''),
|
|
115
|
+
port: Number(url.port) || 22,
|
|
116
|
+
username: url.username === '' ? fallbackUser : decodeURIComponent(url.username),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/** Het adres in leesbare vorm, voor de statusbalk en in foutmeldingen. */
|
|
120
|
+
function sshEndpoint(target) {
|
|
121
|
+
const host = target.host.includes(':') ? `[${target.host}]` : target.host;
|
|
122
|
+
const port = target.port === 22 ? '' : `:${String(target.port)}`;
|
|
123
|
+
return `ssh://${target.username}@${host}${port}`;
|
|
124
|
+
}
|
|
125
|
+
function localUser() {
|
|
126
|
+
try {
|
|
127
|
+
return (0, node_os_1.userInfo)().username;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return 'root';
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Hoe de host in known_hosts staat: kaal op poort 22, anders als `[host]:poort`. */
|
|
134
|
+
function knownHostName(host, port) {
|
|
135
|
+
return port === 22 ? host : `[${host}]:${String(port)}`;
|
|
136
|
+
}
|
|
137
|
+
function globMatches(pattern, name) {
|
|
138
|
+
const source = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*').replace(/\?/g, '.');
|
|
139
|
+
return new RegExp(`^${source}$`).test(name);
|
|
140
|
+
}
|
|
141
|
+
/** `|1|salt|hash`: de host gehasht met HMAC-SHA1, zoals `HashKnownHosts yes` hem opschrijft. */
|
|
142
|
+
function hashedMatches(pattern, name) {
|
|
143
|
+
const [, , salt, hash] = pattern.split('|');
|
|
144
|
+
if (salt === undefined || hash === undefined) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
return (0, node_crypto_1.createHmac)('sha1', Buffer.from(salt, 'base64')).update(name).digest('base64') === hash;
|
|
148
|
+
}
|
|
149
|
+
/** Of het hostveld van een regel over deze host gaat. Een `!patroon` dat past sluit hem uit. */
|
|
150
|
+
function hostFieldMatches(field, name) {
|
|
151
|
+
let matched = false;
|
|
152
|
+
for (const pattern of field.split(',')) {
|
|
153
|
+
// Een hash is base64 en dus hoofdlettergevoelig; alleen een leesbare naam maken we klein.
|
|
154
|
+
if (pattern.startsWith('|1|')) {
|
|
155
|
+
matched ||= hashedMatches(pattern, name);
|
|
156
|
+
}
|
|
157
|
+
else if (pattern.startsWith('!')) {
|
|
158
|
+
if (globMatches(pattern.slice(1).toLowerCase(), name.toLowerCase())) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
matched ||= globMatches(pattern.toLowerCase(), name.toLowerCase());
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return matched;
|
|
167
|
+
}
|
|
168
|
+
/** Het sleuteltype staat vooraan in de sleutel zelf, als string met een lengte ervoor. */
|
|
169
|
+
function keyType(blob) {
|
|
170
|
+
if (blob.length < 4) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
const length = blob.readUInt32BE(0);
|
|
174
|
+
return blob.length < 4 + length ? null : blob.subarray(4, 4 + length).toString('latin1');
|
|
175
|
+
}
|
|
176
|
+
/** De sleutels die known_hosts voor deze host kent. `@cert-authority` slaan we over. */
|
|
177
|
+
function keysFor(knownHosts, name) {
|
|
178
|
+
const keys = [];
|
|
179
|
+
for (const line of knownHosts.split(/\r?\n/)) {
|
|
180
|
+
const fields = line.trim().split(/\s+/);
|
|
181
|
+
if (fields[0] === '' || fields[0].startsWith('#')) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const marker = fields[0].startsWith('@') ? fields.shift() : undefined;
|
|
185
|
+
const [hosts, , base64] = fields;
|
|
186
|
+
if (marker === '@cert-authority' || hosts === undefined || base64 === undefined || !hostFieldMatches(hosts, name)) {
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
keys.push({ revoked: marker === '@revoked', key: Buffer.from(base64, 'base64') });
|
|
190
|
+
}
|
|
191
|
+
return keys;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Zoekt de hostsleutel op, zoals `ssh` met `StrictHostKeyChecking yes`: alleen een sleutel die
|
|
195
|
+
* er al staat is goed. Een nieuwe host accepteren laten we aan `ssh` in een terminal, waar je
|
|
196
|
+
* de vingerafdruk te zien krijgt; een app die dat stilletjes doet beschermt je nergens tegen.
|
|
197
|
+
*/
|
|
198
|
+
function checkHostKey(knownHosts, name, key) {
|
|
199
|
+
const keys = keysFor(knownHosts, name);
|
|
200
|
+
if (keys.some((entry) => entry.revoked && entry.key.equals(key))) {
|
|
201
|
+
return 'revoked';
|
|
202
|
+
}
|
|
203
|
+
if (keys.some((entry) => !entry.revoked && entry.key.equals(key))) {
|
|
204
|
+
return 'known';
|
|
205
|
+
}
|
|
206
|
+
const type = keyType(key);
|
|
207
|
+
return keys.some((entry) => !entry.revoked && keyType(entry.key) === type) ? 'changed' : 'unknown';
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Welke soorten hostsleutel we de server vragen. Staat de host al in known_hosts, dan precies
|
|
211
|
+
* die soorten: anders kiest de server misschien ed25519 terwijl wij alleen zijn ecdsa-sleutel
|
|
212
|
+
* kennen, en dan lijkt een bekende server onbekend.
|
|
213
|
+
*/
|
|
214
|
+
function hostKeyAlgorithms(knownHosts, name) {
|
|
215
|
+
const types = new Set(keysFor(knownHosts, name).filter((entry) => !entry.revoked).map((entry) => keyType(entry.key)));
|
|
216
|
+
const wanted = HOST_KEY_ALGORITHMS.filter((algorithm) => types.has(algorithm.startsWith('rsa-sha2-') ? 'ssh-rsa' : algorithm));
|
|
217
|
+
return wanted.length === 0 ? undefined : wanted;
|
|
218
|
+
}
|
|
219
|
+
/** De vingerafdruk zoals `ssh` hem laat zien: `SHA256:` en base64 zonder opvulling. */
|
|
220
|
+
function fingerprint(key) {
|
|
221
|
+
return `SHA256:${(0, node_crypto_1.createHash)('sha256').update(key).digest('base64').replace(/=+$/, '')}`;
|
|
222
|
+
}
|
|
223
|
+
/** Het sleuteltype, zoals het in known_hosts komt te staan. */
|
|
224
|
+
function hostKeyType(key) {
|
|
225
|
+
return keyType(key) ?? 'unknown';
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Zet een hostsleutel in `~/.ssh/known_hosts`, in dezelfde vorm als `ssh` dat doet. Alleen
|
|
229
|
+
* aanroepen nadat iemand de vingerafdruk gezien en goedgekeurd heeft.
|
|
230
|
+
*/
|
|
231
|
+
function appendKnownHost(name, key, home = (0, node_os_1.homedir)()) {
|
|
232
|
+
const dir = path.join(home, '.ssh');
|
|
233
|
+
const file = path.join(dir, 'known_hosts');
|
|
234
|
+
let existing = '';
|
|
235
|
+
try {
|
|
236
|
+
existing = (0, node_fs_1.readFileSync)(file, 'utf8');
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
240
|
+
}
|
|
241
|
+
const separator = existing === '' || existing.endsWith('\n') ? '' : '\n';
|
|
242
|
+
(0, node_fs_1.appendFileSync)(file, `${separator}${name} ${hostKeyType(key)} ${key.toString('base64')}\n`, 'utf8');
|
|
243
|
+
}
|
|
244
|
+
function readKnownHosts(home, platform) {
|
|
245
|
+
const files = [path.join(home, '.ssh', 'known_hosts'), path.join(home, '.ssh', 'known_hosts2')];
|
|
246
|
+
if (platform !== 'win32') {
|
|
247
|
+
files.push('/etc/ssh/ssh_known_hosts');
|
|
248
|
+
}
|
|
249
|
+
return files
|
|
250
|
+
.map((file) => {
|
|
251
|
+
try {
|
|
252
|
+
return (0, node_fs_1.readFileSync)(file, 'utf8');
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
return '';
|
|
256
|
+
}
|
|
257
|
+
})
|
|
258
|
+
.join('\n');
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Eerst de agent, dan de standaardsleutels. Een sleutel met wachtwoord slaat ssh2 zelf over:
|
|
262
|
+
* vragen kunnen we er niet om, dus die hoort in de agent.
|
|
263
|
+
*/
|
|
264
|
+
function authMethods(username, env = process.env, platform = process.platform, home = (0, node_os_1.homedir)()) {
|
|
265
|
+
const methods = [];
|
|
266
|
+
const agent = env['SSH_AUTH_SOCK'] ?? (platform === 'win32' ? WINDOWS_AGENT : undefined);
|
|
267
|
+
if (agent !== undefined && agent !== '') {
|
|
268
|
+
methods.push({ type: 'agent', username, agent });
|
|
269
|
+
}
|
|
270
|
+
for (const name of DEFAULT_KEYS) {
|
|
271
|
+
try {
|
|
272
|
+
methods.push({ type: 'publickey', username, key: (0, node_fs_1.readFileSync)(path.join(home, '.ssh', name)) });
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
// Deze sleutel is er niet; de volgende dan.
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return methods;
|
|
279
|
+
}
|
|
280
|
+
/** De geweigerde hostsleutel uit een fout, als die er is. */
|
|
281
|
+
function deniedHostKey(err) {
|
|
282
|
+
return err?.hostKey ?? null;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Maakt van een ssh2-fout iets waar je wat mee kunt. Netwerkfouten houden hun code.
|
|
286
|
+
*
|
|
287
|
+
* `denied` is waarom wij de hostsleutel weigerden, of `null` als we dat niet deden: ssh2 zelf
|
|
288
|
+
* meldt dan alleen "Host denied (verification failed)", en dat zegt niet wat je moet doen.
|
|
289
|
+
*/
|
|
290
|
+
function describeSshProblem(err, denied, target) {
|
|
291
|
+
const endpoint = sshEndpoint(target);
|
|
292
|
+
const login = `ssh ${target.port === 22 ? '' : `-p ${String(target.port)} `}${target.username}@${target.host}`;
|
|
293
|
+
if (err.level === 'client-timeout') {
|
|
294
|
+
return Object.assign(err, { code: 'ETIMEDOUT' });
|
|
295
|
+
}
|
|
296
|
+
if (denied === 'unknown') {
|
|
297
|
+
return new Error((0, i18n_1.t)({
|
|
298
|
+
en: `${target.host} is not in your known_hosts yet. Connect once with '${login}' in a terminal to check and store its host key.`,
|
|
299
|
+
nl: `${target.host} staat nog niet in je known_hosts. Verbind één keer met '${login}' in een terminal om de hostsleutel te controleren en te bewaren.`,
|
|
300
|
+
de: `${target.host} steht noch nicht in Ihren known_hosts. Verbinden Sie sich einmal mit '${login}' in einem Terminal, um den Hostschlüssel zu prüfen und zu speichern.`,
|
|
301
|
+
fr: `${target.host} n’est pas encore dans votre known_hosts. Connectez-vous une fois avec '${login}' dans un terminal pour vérifier et enregistrer sa clé d’hôte.`,
|
|
302
|
+
es: `${target.host} todavía no está en tu known_hosts. Conéctate una vez con '${login}' en una terminal para comprobar y guardar su clave de host.`,
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
if (denied === 'changed') {
|
|
306
|
+
return new Error((0, i18n_1.t)({
|
|
307
|
+
en: `The host key of ${target.host} differs from the one in known_hosts. That can be a reinstall, but also someone posing as the server. ` +
|
|
308
|
+
`Check it before removing the old key with 'ssh-keygen -R ${target.host}'.`,
|
|
309
|
+
nl: `De hostsleutel van ${target.host} wijkt af van die in known_hosts. Dat kan een herinstallatie zijn, maar ook iemand die zich voordoet als de server. ` +
|
|
310
|
+
`Controleer dat voordat je de oude sleutel weghaalt met 'ssh-keygen -R ${target.host}'.`,
|
|
311
|
+
de: `Der Hostschlüssel von ${target.host} weicht von dem in known_hosts ab. Das kann eine Neuinstallation sein, aber auch jemand, der sich als der Server ausgibt. ` +
|
|
312
|
+
`Prüfen Sie das, bevor Sie den alten Schlüssel mit 'ssh-keygen -R ${target.host}' entfernen.`,
|
|
313
|
+
fr: `La clé d’hôte de ${target.host} diffère de celle dans known_hosts. Cela peut être une réinstallation, mais aussi quelqu’un qui se fait passer pour le serveur. ` +
|
|
314
|
+
`Vérifiez-le avant de retirer l’ancienne clé avec 'ssh-keygen -R ${target.host}'.`,
|
|
315
|
+
es: `La clave de host de ${target.host} no coincide con la de known_hosts. Puede ser una reinstalación, pero también alguien haciéndose pasar por el servidor. ` +
|
|
316
|
+
`Compruébalo antes de quitar la clave antigua con 'ssh-keygen -R ${target.host}'.`,
|
|
317
|
+
}));
|
|
318
|
+
}
|
|
319
|
+
if (denied === 'revoked') {
|
|
320
|
+
return new Error((0, i18n_1.t)({
|
|
321
|
+
en: `The host key of ${target.host} is marked as revoked.`,
|
|
322
|
+
nl: `De hostsleutel van ${target.host} staat als ingetrokken gemarkeerd.`,
|
|
323
|
+
de: `Der Hostschlüssel von ${target.host} ist als widerrufen markiert.`,
|
|
324
|
+
fr: `La clé d’hôte de ${target.host} est marquée comme révoquée.`,
|
|
325
|
+
es: `La clave de host de ${target.host} está marcada como revocada.`,
|
|
326
|
+
}));
|
|
327
|
+
}
|
|
328
|
+
if (err.level === 'client-authentication') {
|
|
329
|
+
return new Error((0, i18n_1.t)({
|
|
330
|
+
en: `Could not log in to ${endpoint}. The app uses your ssh agent and ~/.ssh/id_ed25519, id_ecdsa or id_rsa without a passphrase; ` +
|
|
331
|
+
`a key with a passphrase belongs in the agent (ssh-add).`,
|
|
332
|
+
nl: `Inloggen op ${endpoint} lukte niet. De app gebruikt je ssh-agent en ~/.ssh/id_ed25519, id_ecdsa of id_rsa zonder wachtwoord; ` +
|
|
333
|
+
`een sleutel met wachtwoord hoort in de agent (ssh-add).`,
|
|
334
|
+
de: `Die Anmeldung an ${endpoint} ist fehlgeschlagen. Die App benutzt Ihren ssh-Agenten und ~/.ssh/id_ed25519, id_ecdsa oder id_rsa ohne Passphrase; ` +
|
|
335
|
+
`ein Schlüssel mit Passphrase gehört in den Agenten (ssh-add).`,
|
|
336
|
+
fr: `La connexion à ${endpoint} a échoué. L’application utilise votre agent ssh et ~/.ssh/id_ed25519, id_ecdsa ou id_rsa sans phrase secrète ; ` +
|
|
337
|
+
`une clé avec phrase secrète a sa place dans l’agent (ssh-add).`,
|
|
338
|
+
es: `No se ha podido iniciar sesión en ${endpoint}. La aplicación usa tu agente ssh y ~/.ssh/id_ed25519, id_ecdsa o id_rsa sin contraseña; ` +
|
|
339
|
+
`una clave con contraseña va en el agente (ssh-add).`,
|
|
340
|
+
}));
|
|
341
|
+
}
|
|
342
|
+
return err;
|
|
343
|
+
}
|
|
344
|
+
/** Wat dial-stdio op stderr zei toen hij stopte, als fout voor het lopende verzoek. */
|
|
345
|
+
function describeDialProblem(code, stderr, target) {
|
|
346
|
+
if (code === 127) {
|
|
347
|
+
return new Error((0, i18n_1.t)({
|
|
348
|
+
en: `There is no 'docker' command on ${target.host} for ${target.username}.`,
|
|
349
|
+
nl: `Er is geen 'docker'-commando op ${target.host} voor ${target.username}.`,
|
|
350
|
+
de: `Auf ${target.host} gibt es für ${target.username} keinen Befehl 'docker'.`,
|
|
351
|
+
fr: `Il n’y a pas de commande 'docker' sur ${target.host} pour ${target.username}.`,
|
|
352
|
+
es: `En ${target.host} no hay ningún comando 'docker' para ${target.username}.`,
|
|
353
|
+
}));
|
|
354
|
+
}
|
|
355
|
+
const said = stderr.trim().split(/\r?\n/)[0] ?? '';
|
|
356
|
+
// Inloggen lukte, maar de daemon laat deze gebruiker niet toe. Het vaakst voorkomende geval.
|
|
357
|
+
if (/permission denied/i.test(said) && said.includes('docker.sock')) {
|
|
358
|
+
return new Error((0, i18n_1.t)({
|
|
359
|
+
en: `${target.username} may not use Docker on ${target.host}. Add them to the docker group there ` +
|
|
360
|
+
`('sudo usermod -aG docker ${target.username}') and log in again.`,
|
|
361
|
+
nl: `${target.username} mag Docker op ${target.host} niet gebruiken. Zet de gebruiker daar in de groep docker ` +
|
|
362
|
+
`('sudo usermod -aG docker ${target.username}') en log opnieuw in.`,
|
|
363
|
+
de: `${target.username} darf Docker auf ${target.host} nicht benutzen. Nehmen Sie den Benutzer dort in die Gruppe docker auf ` +
|
|
364
|
+
`('sudo usermod -aG docker ${target.username}') und melden Sie sich neu an.`,
|
|
365
|
+
fr: `${target.username} n’a pas le droit d’utiliser Docker sur ${target.host}. Ajoutez cet utilisateur au groupe docker là-bas ` +
|
|
366
|
+
`('sudo usermod -aG docker ${target.username}') et reconnectez-vous.`,
|
|
367
|
+
es: `${target.username} no puede usar Docker en ${target.host}. Añade allí ese usuario al grupo docker ` +
|
|
368
|
+
`('sudo usermod -aG docker ${target.username}') y vuelve a iniciar sesión.`,
|
|
369
|
+
}));
|
|
370
|
+
}
|
|
371
|
+
return new Error(said === ''
|
|
372
|
+
? (0, i18n_1.t)({
|
|
373
|
+
en: `'${DIAL_COMMAND}' on ${target.host} stopped with code ${String(code)}.`,
|
|
374
|
+
nl: `'${DIAL_COMMAND}' op ${target.host} stopte met code ${String(code)}.`,
|
|
375
|
+
de: `'${DIAL_COMMAND}' auf ${target.host} ist mit Code ${String(code)} beendet worden.`,
|
|
376
|
+
fr: `'${DIAL_COMMAND}' sur ${target.host} s’est arrêté avec le code ${String(code)}.`,
|
|
377
|
+
es: `'${DIAL_COMMAND}' en ${target.host} ha terminado con el código ${String(code)}.`,
|
|
378
|
+
})
|
|
379
|
+
: said);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* http zet op zijn socket soms een time-out of keep-alive; een ssh-kanaal kent die methodes
|
|
383
|
+
* niet. Niets doen is hier juist: de ssh-verbinding heeft zijn eigen keep-alive.
|
|
384
|
+
*/
|
|
385
|
+
function asSocket(channel) {
|
|
386
|
+
const socket = channel;
|
|
387
|
+
for (const method of ['setTimeout', 'setNoDelay', 'setKeepAlive', 'ref', 'unref']) {
|
|
388
|
+
if (typeof socket[method] !== 'function') {
|
|
389
|
+
socket[method] = () => socket;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return channel;
|
|
393
|
+
}
|
|
394
|
+
/** Deelt een paar ssh-verbindingen over alle verzoeken en streams van één context. */
|
|
395
|
+
class SshDialer {
|
|
396
|
+
target;
|
|
397
|
+
env;
|
|
398
|
+
platform;
|
|
399
|
+
home;
|
|
400
|
+
links = [];
|
|
401
|
+
closed = false;
|
|
402
|
+
constructor(target, env = process.env, platform = process.platform, home = (0, node_os_1.homedir)()) {
|
|
403
|
+
this.target = target;
|
|
404
|
+
this.env = env;
|
|
405
|
+
this.platform = platform;
|
|
406
|
+
this.home = home;
|
|
407
|
+
}
|
|
408
|
+
/** Een nieuw kanaal naar de daemon. */
|
|
409
|
+
async dial() {
|
|
410
|
+
if (this.closed) {
|
|
411
|
+
throw new Error((0, i18n_1.t)({
|
|
412
|
+
en: 'This ssh connection has been closed.',
|
|
413
|
+
nl: 'Deze ssh-verbinding is gesloten.',
|
|
414
|
+
de: 'Diese ssh-Verbindung ist geschlossen.',
|
|
415
|
+
fr: 'Cette connexion ssh a été fermée.',
|
|
416
|
+
es: 'Esta conexión ssh se ha cerrado.',
|
|
417
|
+
}));
|
|
418
|
+
}
|
|
419
|
+
// De plek meteen reserveren: gelijktijdige verzoeken zouden anders allemaal dezelfde
|
|
420
|
+
// verbinding kiezen en samen over MaxSessions heen gaan.
|
|
421
|
+
const link = this.links.find((candidate) => !candidate.closed && candidate.open < CHANNELS_PER_CONNECTION) ?? this.connect();
|
|
422
|
+
link.open += 1;
|
|
423
|
+
try {
|
|
424
|
+
await link.ready;
|
|
425
|
+
return await this.exec(link);
|
|
426
|
+
}
|
|
427
|
+
catch (err) {
|
|
428
|
+
this.release(link);
|
|
429
|
+
throw err;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/** Sluit alle verbindingen; hoort bij omschakelen naar een andere context. */
|
|
433
|
+
close() {
|
|
434
|
+
this.closed = true;
|
|
435
|
+
for (const link of this.links.splice(0)) {
|
|
436
|
+
link.client.end();
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
connect() {
|
|
440
|
+
const client = new ssh2_1.Client();
|
|
441
|
+
const name = knownHostName(this.target.host, this.target.port);
|
|
442
|
+
const knownHosts = readKnownHosts(this.home, this.platform);
|
|
443
|
+
let denied = null;
|
|
444
|
+
let deniedKey = null;
|
|
445
|
+
const ready = new Promise((resolve, reject) => {
|
|
446
|
+
client.on('ready', () => resolve());
|
|
447
|
+
client.on('error', (err) => {
|
|
448
|
+
// Een agent die niet draait is geen reden om op te geven: dan de sleutels nog.
|
|
449
|
+
if (err.level !== 'agent') {
|
|
450
|
+
const problem = describeSshProblem(err, denied, this.target);
|
|
451
|
+
if (denied !== null && deniedKey !== null) {
|
|
452
|
+
const hostKey = { verdict: denied, name, key: deniedKey };
|
|
453
|
+
Object.assign(problem, { hostKey });
|
|
454
|
+
}
|
|
455
|
+
reject(problem);
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
client.on('close', () => {
|
|
459
|
+
link.closed = true;
|
|
460
|
+
this.forget(link);
|
|
461
|
+
reject(new Error((0, i18n_1.t)({
|
|
462
|
+
en: `The ssh connection to ${this.target.host} closed.`,
|
|
463
|
+
nl: `De ssh-verbinding met ${this.target.host} is gesloten.`,
|
|
464
|
+
de: `Die ssh-Verbindung zu ${this.target.host} wurde geschlossen.`,
|
|
465
|
+
fr: `La connexion ssh vers ${this.target.host} s’est fermée.`,
|
|
466
|
+
es: `La conexión ssh con ${this.target.host} se ha cerrado.`,
|
|
467
|
+
})));
|
|
468
|
+
});
|
|
469
|
+
try {
|
|
470
|
+
client.connect({
|
|
471
|
+
host: this.target.host,
|
|
472
|
+
port: this.target.port,
|
|
473
|
+
username: this.target.username,
|
|
474
|
+
readyTimeout: READY_TIMEOUT_MS,
|
|
475
|
+
keepaliveInterval: KEEPALIVE_MS,
|
|
476
|
+
authHandler: authMethods(this.target.username, this.env, this.platform, this.home),
|
|
477
|
+
algorithms: { serverHostKey: hostKeyAlgorithms(knownHosts, name) },
|
|
478
|
+
hostVerifier: (key) => {
|
|
479
|
+
const verdict = checkHostKey(knownHosts, name, key);
|
|
480
|
+
denied = verdict === 'known' ? null : verdict;
|
|
481
|
+
deniedKey = verdict === 'known' ? null : key;
|
|
482
|
+
return verdict === 'known';
|
|
483
|
+
},
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
catch (err) {
|
|
487
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
488
|
+
}
|
|
489
|
+
});
|
|
490
|
+
const link = { client, ready, open: 0, closed: false };
|
|
491
|
+
// Wie de verbinding opende wacht erop en krijgt de fout; dit voorkomt alleen dat een
|
|
492
|
+
// afwijzing die niemand meer afwacht als onafgehandeld wordt gemeld.
|
|
493
|
+
ready.catch(() => undefined);
|
|
494
|
+
this.links.push(link);
|
|
495
|
+
return link;
|
|
496
|
+
}
|
|
497
|
+
exec(link) {
|
|
498
|
+
return new Promise((resolve, reject) => {
|
|
499
|
+
link.client.exec(DIAL_COMMAND, (err, channel) => {
|
|
500
|
+
if (err !== undefined && err !== null) {
|
|
501
|
+
reject(err);
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
let stderr = '';
|
|
505
|
+
let failure = null;
|
|
506
|
+
// Zonder dit ziet het verzoek alleen "socket hang up". De exit-code komt vaak al binnen
|
|
507
|
+
// voordat http naar het kanaal luistert, dus geven we de fout pas door als er iemand
|
|
508
|
+
// luistert, en uiterlijk bij 'end': die komt pas als http het kanaal leest.
|
|
509
|
+
const fail = () => {
|
|
510
|
+
if (failure !== null && channel.listenerCount('error') > 0) {
|
|
511
|
+
const err = failure;
|
|
512
|
+
failure = null;
|
|
513
|
+
channel.emit('error', err);
|
|
514
|
+
}
|
|
515
|
+
};
|
|
516
|
+
channel.stderr.on('data', (chunk) => {
|
|
517
|
+
stderr = (stderr + chunk.toString('utf8')).slice(0, MAX_STDERR);
|
|
518
|
+
});
|
|
519
|
+
channel.on('exit', (code) => {
|
|
520
|
+
if (code !== null && code !== 0) {
|
|
521
|
+
failure = describeDialProblem(code, stderr, this.target);
|
|
522
|
+
fail();
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
channel.prependListener('end', fail);
|
|
526
|
+
channel.once('close', () => {
|
|
527
|
+
fail();
|
|
528
|
+
this.release(link);
|
|
529
|
+
});
|
|
530
|
+
resolve(asSocket(channel));
|
|
531
|
+
});
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Een kanaal is dicht. Een verbinding waar niets meer over loopt sluiten we, zolang er een
|
|
536
|
+
* andere over is: één houden we open, anders betaalt het volgende verzoek weer de handshake.
|
|
537
|
+
*/
|
|
538
|
+
release(link) {
|
|
539
|
+
link.open = Math.max(0, link.open - 1);
|
|
540
|
+
if (link.open === 0 && !link.closed && this.links.some((other) => other !== link && !other.closed)) {
|
|
541
|
+
this.forget(link);
|
|
542
|
+
link.client.end();
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
forget(link) {
|
|
546
|
+
const index = this.links.indexOf(link);
|
|
547
|
+
if (index !== -1) {
|
|
548
|
+
this.links.splice(index, 1);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
exports.SshDialer = SshDialer;
|
|
553
|
+
/**
|
|
554
|
+
* Wat dockerode meekrijgt voor ssh. docker-modem geeft `agent` door aan elk http-verzoek, maar
|
|
555
|
+
* de typering van dockerode kent die optie niet.
|
|
556
|
+
*/
|
|
557
|
+
function sshDockerOptions(target, dialer) {
|
|
558
|
+
const options = { protocol: 'http', host: target.host, port: target.port, agent: new SshAgent(dialer) };
|
|
559
|
+
return options;
|
|
560
|
+
}
|
|
561
|
+
/** Een http-agent die elke verbinding als ssh-kanaal opent. Die geven we dockerode mee. */
|
|
562
|
+
class SshAgent extends node_http_1.Agent {
|
|
563
|
+
dialer;
|
|
564
|
+
constructor(dialer) {
|
|
565
|
+
super();
|
|
566
|
+
this.dialer = dialer;
|
|
567
|
+
}
|
|
568
|
+
createConnection(_options, callback) {
|
|
569
|
+
this.dialer.dial().then((stream) => callback?.(null, stream), (err) => callback?.(err instanceof Error ? err : new Error(String(err)), undefined));
|
|
570
|
+
return undefined;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
exports.SshAgent = SshAgent;
|
|
574
|
+
//# sourceMappingURL=ssh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../electron/ssh.ts"],"names":[],"mappings":"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"}
|