bdy 1.9.48 → 1.9.50-dev
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/distTs/package.json +1 -1
- package/distTs/src/server/ssh.js +43 -26
- package/package.json +1 -1
package/distTs/package.json
CHANGED
package/distTs/src/server/ssh.js
CHANGED
|
@@ -10,6 +10,18 @@ const crypto_1 = require("crypto");
|
|
|
10
10
|
const child_process_1 = require("child_process");
|
|
11
11
|
const sftp_1 = __importDefault(require("./sftp"));
|
|
12
12
|
const buddy_1 = __importDefault(require("../api/buddy"));
|
|
13
|
+
const pipeStreamToChannel = (stream, channel) => {
|
|
14
|
+
channel.once('exit', (code, signal) => {
|
|
15
|
+
logger_js_1.default.debug(`shell channel exit: ${code}, signal: ${signal}`);
|
|
16
|
+
if (stream.exit)
|
|
17
|
+
stream.exit(signal || code);
|
|
18
|
+
});
|
|
19
|
+
channel.on('close', () => {
|
|
20
|
+
stream.end();
|
|
21
|
+
});
|
|
22
|
+
channel.pipe(stream, { end: false }).pipe(channel);
|
|
23
|
+
channel.stderr.pipe(stream.stderr);
|
|
24
|
+
};
|
|
13
25
|
class ServerSsh extends events_1.default {
|
|
14
26
|
constructor(agent, login, password, hostKey) {
|
|
15
27
|
super();
|
|
@@ -148,6 +160,7 @@ class ServerSsh extends events_1.default {
|
|
|
148
160
|
let pty;
|
|
149
161
|
let x11;
|
|
150
162
|
const closeSession = () => {
|
|
163
|
+
logger_js_1.default.debug('ssh close session');
|
|
151
164
|
env = null;
|
|
152
165
|
pty = null;
|
|
153
166
|
x11 = null;
|
|
@@ -161,13 +174,15 @@ class ServerSsh extends events_1.default {
|
|
|
161
174
|
channel.removeAllListeners();
|
|
162
175
|
channel = null;
|
|
163
176
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
177
|
+
client.removeListener('close', closeSession);
|
|
178
|
+
client = null;
|
|
167
179
|
};
|
|
180
|
+
client.on('close', closeSession);
|
|
168
181
|
session.on('close', closeSession);
|
|
169
182
|
session.on('end', closeSession);
|
|
170
183
|
session.on('pty', (accept, reject, info) => {
|
|
184
|
+
logger_js_1.default.debug('ssh pty');
|
|
185
|
+
logger_js_1.default.debug(info);
|
|
171
186
|
if (!proxyClient) {
|
|
172
187
|
if (reject)
|
|
173
188
|
reject();
|
|
@@ -178,6 +193,8 @@ class ServerSsh extends events_1.default {
|
|
|
178
193
|
accept();
|
|
179
194
|
});
|
|
180
195
|
session.on('window-change', (accept, reject, info) => {
|
|
196
|
+
logger_js_1.default.debug('ssh window-change');
|
|
197
|
+
logger_js_1.default.debug(info);
|
|
181
198
|
if (!proxyClient) {
|
|
182
199
|
if (reject)
|
|
183
200
|
reject();
|
|
@@ -195,6 +212,7 @@ class ServerSsh extends events_1.default {
|
|
|
195
212
|
accept();
|
|
196
213
|
});
|
|
197
214
|
session.on('shell', (accept, reject) => {
|
|
215
|
+
logger_js_1.default.debug('ssh shell');
|
|
198
216
|
if (!proxyClient || !accept) {
|
|
199
217
|
if (reject)
|
|
200
218
|
reject();
|
|
@@ -210,16 +228,12 @@ class ServerSsh extends events_1.default {
|
|
|
210
228
|
reject();
|
|
211
229
|
return;
|
|
212
230
|
}
|
|
213
|
-
|
|
214
|
-
channel.once('exit', (code) => {
|
|
215
|
-
if (stream && stream.exit)
|
|
216
|
-
stream.exit(code);
|
|
217
|
-
});
|
|
218
|
-
stream.pipe(channel);
|
|
219
|
-
channel.pipe(stream);
|
|
231
|
+
pipeStreamToChannel(stream, c);
|
|
220
232
|
});
|
|
221
233
|
});
|
|
222
234
|
session.on('signal', (accept, reject, info) => {
|
|
235
|
+
logger_js_1.default.debug('ssh signal');
|
|
236
|
+
logger_js_1.default.debug(info);
|
|
223
237
|
const { name } = info;
|
|
224
238
|
if (!proxyClient || !name || !channel || !channel.signal) {
|
|
225
239
|
if (reject)
|
|
@@ -231,6 +245,8 @@ class ServerSsh extends events_1.default {
|
|
|
231
245
|
accept();
|
|
232
246
|
});
|
|
233
247
|
session.on('subsystem', (accept, reject, info) => {
|
|
248
|
+
logger_js_1.default.debug('ssh subsystem');
|
|
249
|
+
logger_js_1.default.debug(info);
|
|
234
250
|
const { name } = info;
|
|
235
251
|
if (!proxyClient || !accept || !name) {
|
|
236
252
|
if (reject)
|
|
@@ -244,16 +260,12 @@ class ServerSsh extends events_1.default {
|
|
|
244
260
|
reject();
|
|
245
261
|
return;
|
|
246
262
|
}
|
|
247
|
-
|
|
248
|
-
channel.once('exit', (code) => {
|
|
249
|
-
if (stream && stream.exit)
|
|
250
|
-
stream.exit(code);
|
|
251
|
-
});
|
|
252
|
-
stream.pipe(channel);
|
|
253
|
-
channel.pipe(stream);
|
|
263
|
+
pipeStreamToChannel(stream, c);
|
|
254
264
|
});
|
|
255
265
|
});
|
|
256
266
|
session.on('x11', (accept, reject, info) => {
|
|
267
|
+
logger_js_1.default.debug('ssh x11');
|
|
268
|
+
logger_js_1.default.debug(info);
|
|
257
269
|
if (!proxyClient) {
|
|
258
270
|
if (reject)
|
|
259
271
|
reject();
|
|
@@ -264,6 +276,8 @@ class ServerSsh extends events_1.default {
|
|
|
264
276
|
accept();
|
|
265
277
|
});
|
|
266
278
|
session.on('exec', (accept, reject, info) => {
|
|
279
|
+
logger_js_1.default.debug('ssh exec');
|
|
280
|
+
logger_js_1.default.debug(info);
|
|
267
281
|
if (!info.command || !accept) {
|
|
268
282
|
if (reject)
|
|
269
283
|
reject();
|
|
@@ -284,16 +298,12 @@ class ServerSsh extends events_1.default {
|
|
|
284
298
|
reject();
|
|
285
299
|
return;
|
|
286
300
|
}
|
|
287
|
-
|
|
288
|
-
channel.once('exit', (code) => {
|
|
289
|
-
if (stream && stream.exit)
|
|
290
|
-
stream.exit(code);
|
|
291
|
-
});
|
|
292
|
-
stream.pipe(channel);
|
|
293
|
-
channel.pipe(stream);
|
|
301
|
+
pipeStreamToChannel(stream, c);
|
|
294
302
|
});
|
|
295
303
|
});
|
|
296
304
|
session.on('env', (accept, reject, info) => {
|
|
305
|
+
logger_js_1.default.debug('ssh env');
|
|
306
|
+
logger_js_1.default.debug(info);
|
|
297
307
|
Object.keys(info || {}).forEach((key) => {
|
|
298
308
|
env[key] = info[key];
|
|
299
309
|
});
|
|
@@ -301,6 +311,7 @@ class ServerSsh extends events_1.default {
|
|
|
301
311
|
accept();
|
|
302
312
|
});
|
|
303
313
|
session.on('sftp', (accept, reject) => {
|
|
314
|
+
logger_js_1.default.debug('sftp');
|
|
304
315
|
if (!sftp && accept) {
|
|
305
316
|
sftp = new sftp_1.default(accept());
|
|
306
317
|
}
|
|
@@ -310,14 +321,15 @@ class ServerSsh extends events_1.default {
|
|
|
310
321
|
});
|
|
311
322
|
}
|
|
312
323
|
processClient(client) {
|
|
324
|
+
logger_js_1.default.debug('new ssh client');
|
|
313
325
|
let proxyClient;
|
|
314
326
|
client.setNoDelay();
|
|
315
327
|
client.on('authentication', async (ctx) => {
|
|
316
328
|
proxyClient = await this.authenticateClient(ctx);
|
|
329
|
+
logger_js_1.default.debug('ssh authentication', !!proxyClient);
|
|
317
330
|
});
|
|
318
331
|
client.on('close', () => {
|
|
319
|
-
|
|
320
|
-
client = null;
|
|
332
|
+
logger_js_1.default.debug('ssh close');
|
|
321
333
|
if (proxyClient) {
|
|
322
334
|
try {
|
|
323
335
|
proxyClient.removeAllListeners();
|
|
@@ -328,6 +340,10 @@ class ServerSsh extends events_1.default {
|
|
|
328
340
|
}
|
|
329
341
|
proxyClient = null;
|
|
330
342
|
}
|
|
343
|
+
setTimeout(() => {
|
|
344
|
+
client.removeAllListeners();
|
|
345
|
+
client = null;
|
|
346
|
+
}, 1000);
|
|
331
347
|
});
|
|
332
348
|
client.on('error', (err) => {
|
|
333
349
|
logger_js_1.default.debug('Error on ssh server client');
|
|
@@ -335,6 +351,7 @@ class ServerSsh extends events_1.default {
|
|
|
335
351
|
client.end();
|
|
336
352
|
});
|
|
337
353
|
client.on('session', (accept) => {
|
|
354
|
+
logger_js_1.default.debug('ssh session');
|
|
338
355
|
this.clientSession(accept(), client, proxyClient);
|
|
339
356
|
});
|
|
340
357
|
}
|