ssh-config 4.1.6 → 4.2.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/index.js +23 -478
- package/package.json +9 -7
- package/src/glob.js +29 -35
- package/src/glob.js.map +1 -0
- package/src/glob.ts +45 -0
- package/src/ssh-config.js +459 -0
- package/src/ssh-config.js.map +1 -0
- package/src/ssh-config.ts +544 -0
- package/types/index.d.ts +0 -46
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.stringify = exports.parse = void 0;
|
|
7
|
+
const glob_1 = __importDefault(require("./glob"));
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const RE_SPACE = /\s/;
|
|
10
|
+
const RE_LINE_BREAK = /\r|\n/;
|
|
11
|
+
const RE_SECTION_DIRECTIVE = /^(Host|Match)$/i;
|
|
12
|
+
const RE_MULTI_VALUE_DIRECTIVE = /^(GlobalKnownHostsFile|Host|IPQoS|SendEnv|UserKnownHostsFile|ProxyCommand|Match)$/i;
|
|
13
|
+
const RE_QUOTE_DIRECTIVE = /^(?:CertificateFile|IdentityFile|IdentityAgent|User)$/i;
|
|
14
|
+
const RE_SINGLE_LINE_DIRECTIVE = /^(Include|IdentityFile)$/i;
|
|
15
|
+
var LineType;
|
|
16
|
+
(function (LineType) {
|
|
17
|
+
LineType[LineType["DIRECTIVE"] = 1] = "DIRECTIVE";
|
|
18
|
+
LineType[LineType["COMMENT"] = 2] = "COMMENT";
|
|
19
|
+
})(LineType || (LineType = {}));
|
|
20
|
+
const MULTIPLE_VALUE_PROPS = [
|
|
21
|
+
'IdentityFile',
|
|
22
|
+
'LocalForward',
|
|
23
|
+
'RemoteForward',
|
|
24
|
+
'DynamicForward',
|
|
25
|
+
'CertificateFile',
|
|
26
|
+
];
|
|
27
|
+
function compare(line, opts) {
|
|
28
|
+
return opts.hasOwnProperty(line.param) && opts[line.param] === line.value;
|
|
29
|
+
}
|
|
30
|
+
function getIndent(config) {
|
|
31
|
+
for (const line of config) {
|
|
32
|
+
if (line.type === LineType.DIRECTIVE && 'config' in line) {
|
|
33
|
+
for (const subline of line.config) {
|
|
34
|
+
if (subline.before) {
|
|
35
|
+
return subline.before;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return ' ';
|
|
41
|
+
}
|
|
42
|
+
function capitalize(str) {
|
|
43
|
+
if (typeof str !== 'string')
|
|
44
|
+
return str;
|
|
45
|
+
return str[0].toUpperCase() + str.slice(1);
|
|
46
|
+
}
|
|
47
|
+
function match(criteria, params) {
|
|
48
|
+
for (const key in criteria) {
|
|
49
|
+
const criterion = criteria[key];
|
|
50
|
+
const keyword = key.toLowerCase();
|
|
51
|
+
if (keyword === 'exec') {
|
|
52
|
+
const command = `function main {
|
|
53
|
+
${criterion}
|
|
54
|
+
}
|
|
55
|
+
main`;
|
|
56
|
+
const { status } = (0, child_process_1.spawnSync)(command, { shell: true });
|
|
57
|
+
if (status != 0)
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
else if (!(0, glob_1.default)(criterion, params[capitalize(keyword)])) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
class SSHConfig extends Array {
|
|
67
|
+
/**
|
|
68
|
+
* Query ssh config by host.
|
|
69
|
+
*/
|
|
70
|
+
compute(params) {
|
|
71
|
+
if (typeof params === 'string')
|
|
72
|
+
params = { Host: params };
|
|
73
|
+
const obj = {};
|
|
74
|
+
const setProperty = (name, value) => {
|
|
75
|
+
if (MULTIPLE_VALUE_PROPS.includes(name)) {
|
|
76
|
+
const list = obj[name] || (obj[name] = []);
|
|
77
|
+
list.push(value);
|
|
78
|
+
}
|
|
79
|
+
else if (obj[name] == null) {
|
|
80
|
+
obj[name] = value;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
for (const line of this) {
|
|
84
|
+
if (line.type !== LineType.DIRECTIVE)
|
|
85
|
+
continue;
|
|
86
|
+
if (line.param === 'Host' && (0, glob_1.default)(line.value, params.Host)) {
|
|
87
|
+
setProperty(line.param, line.value);
|
|
88
|
+
for (const subline of line.config) {
|
|
89
|
+
if (subline.type === LineType.DIRECTIVE) {
|
|
90
|
+
setProperty(subline.param, subline.value);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else if (line.param === 'Match' && 'criteria' in line && match(line.criteria, params)) {
|
|
95
|
+
for (const subline of line.config) {
|
|
96
|
+
if (subline.type === LineType.DIRECTIVE) {
|
|
97
|
+
setProperty(subline.param, subline.value);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
setProperty(line.param, line.value);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return obj;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* find section by Host / Match or function
|
|
109
|
+
*/
|
|
110
|
+
find(opts) {
|
|
111
|
+
if (typeof opts === 'function')
|
|
112
|
+
return super.find(opts);
|
|
113
|
+
if (!(opts && ('Host' in opts || 'Match' in opts))) {
|
|
114
|
+
throw new Error('Can only find by Host or Match');
|
|
115
|
+
}
|
|
116
|
+
return super.find(line => compare(line, opts));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Remove section by Host / Match or function
|
|
120
|
+
*/
|
|
121
|
+
remove(opts) {
|
|
122
|
+
let index;
|
|
123
|
+
if (typeof opts === 'function') {
|
|
124
|
+
index = super.findIndex(opts);
|
|
125
|
+
}
|
|
126
|
+
else if (!(opts && ('Host' in opts || 'Match' in opts))) {
|
|
127
|
+
throw new Error('Can only remove by Host or Match');
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
index = super.findIndex(line => compare(line, opts));
|
|
131
|
+
}
|
|
132
|
+
if (index >= 0)
|
|
133
|
+
return this.splice(index, 1);
|
|
134
|
+
}
|
|
135
|
+
toString() {
|
|
136
|
+
return stringify(this);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Append new section to existing ssh config.
|
|
140
|
+
* @param {Object} opts
|
|
141
|
+
*/
|
|
142
|
+
append(opts) {
|
|
143
|
+
const indent = getIndent(this);
|
|
144
|
+
const lastEntry = this.length > 0 ? this[this.length - 1] : null;
|
|
145
|
+
let config = lastEntry && lastEntry.config || this;
|
|
146
|
+
let configWas = this;
|
|
147
|
+
let lastLine = config.length > 0 ? config[config.length - 1] : lastEntry;
|
|
148
|
+
if (lastLine && !lastLine.after)
|
|
149
|
+
lastLine.after = '\n';
|
|
150
|
+
let sectionLineFound = config !== configWas;
|
|
151
|
+
for (const param in opts) {
|
|
152
|
+
const value = opts[param];
|
|
153
|
+
const line = {
|
|
154
|
+
type: LineType.DIRECTIVE,
|
|
155
|
+
param,
|
|
156
|
+
separator: ' ',
|
|
157
|
+
value,
|
|
158
|
+
before: sectionLineFound ? indent : indent.replace(/ |\t/, ''),
|
|
159
|
+
after: '\n',
|
|
160
|
+
};
|
|
161
|
+
if (RE_SECTION_DIRECTIVE.test(param)) {
|
|
162
|
+
sectionLineFound = true;
|
|
163
|
+
line.before = indent.replace(/ |\t/, '');
|
|
164
|
+
config = configWas;
|
|
165
|
+
// separate sections with an extra newline
|
|
166
|
+
// https://github.com/cyjake/ssh-config/issues/23#issuecomment-564768248
|
|
167
|
+
if (lastLine && lastLine.after === '\n')
|
|
168
|
+
lastLine.after += '\n';
|
|
169
|
+
config.push(line);
|
|
170
|
+
config = line.config = new SSHConfig();
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
config.push(line);
|
|
174
|
+
}
|
|
175
|
+
lastLine = line;
|
|
176
|
+
}
|
|
177
|
+
return configWas;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Prepend new section to existing ssh config.
|
|
181
|
+
* @param {Object} opts
|
|
182
|
+
*/
|
|
183
|
+
prepend(opts, beforeFirstSection = false) {
|
|
184
|
+
const indent = getIndent(this);
|
|
185
|
+
let config = this;
|
|
186
|
+
let i = 0;
|
|
187
|
+
// insert above known sections
|
|
188
|
+
if (beforeFirstSection) {
|
|
189
|
+
while (i < this.length && !('config' in this[i])) {
|
|
190
|
+
i += 1;
|
|
191
|
+
}
|
|
192
|
+
if (i >= this.length) { // No sections in original config
|
|
193
|
+
return this.append(opts);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Prepend new section above the first section
|
|
197
|
+
let sectionLineFound = false;
|
|
198
|
+
let processedLines = 0;
|
|
199
|
+
for (const param in opts) {
|
|
200
|
+
processedLines += 1;
|
|
201
|
+
const value = opts[param];
|
|
202
|
+
const line = {
|
|
203
|
+
type: LineType.DIRECTIVE,
|
|
204
|
+
param,
|
|
205
|
+
separator: ' ',
|
|
206
|
+
value,
|
|
207
|
+
before: '',
|
|
208
|
+
after: '\n',
|
|
209
|
+
};
|
|
210
|
+
if (RE_SECTION_DIRECTIVE.test(param)) {
|
|
211
|
+
line.before = indent.replace(/ |\t/, '');
|
|
212
|
+
config.splice(i, 0, line);
|
|
213
|
+
config = line.config = new SSHConfig();
|
|
214
|
+
sectionLineFound = true;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
// separate from previous sections with an extra newline
|
|
218
|
+
if (processedLines === Object.keys(opts).length) {
|
|
219
|
+
line.after += '\n';
|
|
220
|
+
}
|
|
221
|
+
if (!sectionLineFound) {
|
|
222
|
+
config.splice(i, 0, line);
|
|
223
|
+
i += 1;
|
|
224
|
+
// Add an extra newline if a single line directive like Include
|
|
225
|
+
if (RE_SINGLE_LINE_DIRECTIVE.test(param)) {
|
|
226
|
+
line.after += '\n';
|
|
227
|
+
}
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
line.before = indent;
|
|
231
|
+
config.push(line);
|
|
232
|
+
}
|
|
233
|
+
return config;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
SSHConfig.DIRECTIVE = LineType.DIRECTIVE;
|
|
237
|
+
SSHConfig.COMMENT = LineType.COMMENT;
|
|
238
|
+
/**
|
|
239
|
+
* Parse ssh config text into structured object.
|
|
240
|
+
*/
|
|
241
|
+
function parse(text) {
|
|
242
|
+
let i = 0;
|
|
243
|
+
let chr = next();
|
|
244
|
+
let config = new SSHConfig();
|
|
245
|
+
let configWas = config;
|
|
246
|
+
function next() {
|
|
247
|
+
return text[i++];
|
|
248
|
+
}
|
|
249
|
+
function space() {
|
|
250
|
+
let spaces = '';
|
|
251
|
+
while (RE_SPACE.test(chr)) {
|
|
252
|
+
spaces += chr;
|
|
253
|
+
chr = next();
|
|
254
|
+
}
|
|
255
|
+
return spaces;
|
|
256
|
+
}
|
|
257
|
+
function linebreak() {
|
|
258
|
+
let breaks = '';
|
|
259
|
+
while (RE_LINE_BREAK.test(chr)) {
|
|
260
|
+
breaks += chr;
|
|
261
|
+
chr = next();
|
|
262
|
+
}
|
|
263
|
+
return breaks;
|
|
264
|
+
}
|
|
265
|
+
function parameter() {
|
|
266
|
+
let param = '';
|
|
267
|
+
while (chr && /[^ \t=]/.test(chr)) {
|
|
268
|
+
param += chr;
|
|
269
|
+
chr = next();
|
|
270
|
+
}
|
|
271
|
+
return param;
|
|
272
|
+
}
|
|
273
|
+
function separator() {
|
|
274
|
+
let sep = space();
|
|
275
|
+
if (chr === '=') {
|
|
276
|
+
sep += chr;
|
|
277
|
+
chr = next();
|
|
278
|
+
}
|
|
279
|
+
return (sep + space());
|
|
280
|
+
}
|
|
281
|
+
function value() {
|
|
282
|
+
let val = '';
|
|
283
|
+
let quoted = false;
|
|
284
|
+
let escaped = false;
|
|
285
|
+
while (chr && !RE_LINE_BREAK.test(chr)) {
|
|
286
|
+
// backslash escapes only double quotes
|
|
287
|
+
if (escaped) {
|
|
288
|
+
val += chr === '"' ? chr : `\\${chr}`;
|
|
289
|
+
escaped = false;
|
|
290
|
+
}
|
|
291
|
+
// ProxyCommand ssh -W "%h:%p" firewall.example.org
|
|
292
|
+
else if (chr === '"' && (!val || quoted)) {
|
|
293
|
+
quoted = !quoted;
|
|
294
|
+
}
|
|
295
|
+
else if (chr === '\\') {
|
|
296
|
+
escaped = true;
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
val += chr;
|
|
300
|
+
}
|
|
301
|
+
chr = next();
|
|
302
|
+
}
|
|
303
|
+
if (quoted || escaped) {
|
|
304
|
+
throw new Error(`Unexpected line break at ${val}`);
|
|
305
|
+
}
|
|
306
|
+
return val.trim();
|
|
307
|
+
}
|
|
308
|
+
function comment() {
|
|
309
|
+
const type = LineType.COMMENT;
|
|
310
|
+
let content = '';
|
|
311
|
+
while (chr && !RE_LINE_BREAK.test(chr)) {
|
|
312
|
+
content += chr;
|
|
313
|
+
chr = next();
|
|
314
|
+
}
|
|
315
|
+
return { type, content, before: '', after: '' };
|
|
316
|
+
}
|
|
317
|
+
// Host *.co.uk
|
|
318
|
+
// Host * !local.dev
|
|
319
|
+
// Host "foo bar"
|
|
320
|
+
function values() {
|
|
321
|
+
const results = [];
|
|
322
|
+
let val = '';
|
|
323
|
+
let quoted = false;
|
|
324
|
+
let escaped = false;
|
|
325
|
+
while (chr && !RE_LINE_BREAK.test(chr)) {
|
|
326
|
+
if (escaped) {
|
|
327
|
+
val += chr === '"' ? chr : `\\${chr}`;
|
|
328
|
+
escaped = false;
|
|
329
|
+
}
|
|
330
|
+
else if (chr === '"') {
|
|
331
|
+
quoted = !quoted;
|
|
332
|
+
}
|
|
333
|
+
else if (chr === '\\') {
|
|
334
|
+
escaped = true;
|
|
335
|
+
}
|
|
336
|
+
else if (quoted) {
|
|
337
|
+
val += chr;
|
|
338
|
+
}
|
|
339
|
+
else if (/[ \t]/.test(chr)) {
|
|
340
|
+
if (val) {
|
|
341
|
+
results.push(val);
|
|
342
|
+
val = '';
|
|
343
|
+
}
|
|
344
|
+
// otherwise ignore the space
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
val += chr;
|
|
348
|
+
}
|
|
349
|
+
chr = next();
|
|
350
|
+
}
|
|
351
|
+
if (quoted || escaped) {
|
|
352
|
+
throw new Error(`Unexpected line break at ${results.concat(val).join(' ')}`);
|
|
353
|
+
}
|
|
354
|
+
if (val)
|
|
355
|
+
results.push(val);
|
|
356
|
+
return results.length > 1 ? results : results[0];
|
|
357
|
+
}
|
|
358
|
+
function directive() {
|
|
359
|
+
const type = LineType.DIRECTIVE;
|
|
360
|
+
const param = parameter();
|
|
361
|
+
// Host "foo bar" baz
|
|
362
|
+
const multiple = RE_MULTI_VALUE_DIRECTIVE.test(param);
|
|
363
|
+
const result = {
|
|
364
|
+
type,
|
|
365
|
+
param,
|
|
366
|
+
separator: separator(),
|
|
367
|
+
quoted: !multiple && chr === '"',
|
|
368
|
+
value: multiple ? values() : value(),
|
|
369
|
+
before: '',
|
|
370
|
+
after: '',
|
|
371
|
+
};
|
|
372
|
+
if (!result.quoted)
|
|
373
|
+
delete result.quoted;
|
|
374
|
+
if (/^Match$/i.test(param)) {
|
|
375
|
+
const criteria = {};
|
|
376
|
+
for (let i = 0; i < result.value.length; i += 2) {
|
|
377
|
+
const keyword = result.value[i];
|
|
378
|
+
const value = result.value[i + 1];
|
|
379
|
+
criteria[keyword] = value;
|
|
380
|
+
}
|
|
381
|
+
result.criteria = criteria;
|
|
382
|
+
}
|
|
383
|
+
return result;
|
|
384
|
+
}
|
|
385
|
+
function line() {
|
|
386
|
+
const before = space();
|
|
387
|
+
const node = chr === '#' ? comment() : directive();
|
|
388
|
+
const after = linebreak();
|
|
389
|
+
node.before = before;
|
|
390
|
+
node.after = after;
|
|
391
|
+
return node;
|
|
392
|
+
}
|
|
393
|
+
while (chr) {
|
|
394
|
+
let node = line();
|
|
395
|
+
if (node.type === LineType.DIRECTIVE && RE_SECTION_DIRECTIVE.test(node.param)) {
|
|
396
|
+
config = configWas;
|
|
397
|
+
config.push(node);
|
|
398
|
+
config = node.config = new SSHConfig();
|
|
399
|
+
}
|
|
400
|
+
else if (node.type === LineType.DIRECTIVE && !node.param) {
|
|
401
|
+
// blank lines at file end
|
|
402
|
+
config[config.length - 1].after += node.before;
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
config.push(node);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return configWas;
|
|
409
|
+
}
|
|
410
|
+
exports.parse = parse;
|
|
411
|
+
/**
|
|
412
|
+
* Stringify structured object into ssh config text
|
|
413
|
+
*/
|
|
414
|
+
function stringify(config) {
|
|
415
|
+
let str = '';
|
|
416
|
+
function formatValue(value, quoted) {
|
|
417
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
418
|
+
const result = [];
|
|
419
|
+
for (const key in value)
|
|
420
|
+
result.push(key, value[key]);
|
|
421
|
+
value = result;
|
|
422
|
+
}
|
|
423
|
+
if (Array.isArray(value)) {
|
|
424
|
+
return value.map(chunk => formatValue(chunk, RE_SPACE.test(chunk))).join(' ');
|
|
425
|
+
}
|
|
426
|
+
return quoted ? `"${value}"` : value;
|
|
427
|
+
}
|
|
428
|
+
function formatDirective(line) {
|
|
429
|
+
const quoted = line.quoted
|
|
430
|
+
|| (RE_QUOTE_DIRECTIVE.test(line.param) && RE_SPACE.test(line.value));
|
|
431
|
+
const value = formatValue(line.value, quoted);
|
|
432
|
+
return `${line.param}${line.separator}${value}`;
|
|
433
|
+
}
|
|
434
|
+
const format = line => {
|
|
435
|
+
str += line.before;
|
|
436
|
+
if (line.type === LineType.COMMENT) {
|
|
437
|
+
str += line.content;
|
|
438
|
+
}
|
|
439
|
+
else if (line.type === LineType.DIRECTIVE && MULTIPLE_VALUE_PROPS.includes(line.param)) {
|
|
440
|
+
[].concat(line.value).forEach(function (value, i, values) {
|
|
441
|
+
str += formatDirective({ ...line, value });
|
|
442
|
+
if (i < values.length - 1)
|
|
443
|
+
str += `\n${line.before}`;
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
else if (line.type === LineType.DIRECTIVE) {
|
|
447
|
+
str += formatDirective(line);
|
|
448
|
+
}
|
|
449
|
+
str += line.after;
|
|
450
|
+
if (line.config) {
|
|
451
|
+
line.config.forEach(format);
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
config.forEach(format);
|
|
455
|
+
return str;
|
|
456
|
+
}
|
|
457
|
+
exports.stringify = stringify;
|
|
458
|
+
exports.default = Object.assign(SSHConfig, { parse, stringify });
|
|
459
|
+
//# sourceMappingURL=ssh-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh-config.js","sourceRoot":"","sources":["ssh-config.ts"],"names":[],"mappings":"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"}
|