seat: row 199 mutants M05 and M12 now die; a test reads git's argv through a PATH shim and finds no token and no userinfo; the 302 test's target shares the CA git trusts, so only http.followRedirects=false keeps git off it (sage-1563, #1697)
This commit is contained in:
1 parent
c6868ba413
commit
5fa7b25532
1 file changed
+24
-4
@@ -5,7 +5,7 @@
|
|||||||
import { test } from "node:test";
|
import { test } from "node:test";
|
||||||
import assert from "node:assert/strict";
|
import assert from "node:assert/strict";
|
||||||
import { spawnSync } from "node:child_process";
|
import { spawnSync } from "node:child_process";
|
||||||
import { chmodSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
import { chmodSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
||||||
import { tmpdir } from "node:os";
|
import { tmpdir } from "node:os";
|
||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
import { gitEnv } from "../src/checkout.mjs";
|
import { gitEnv } from "../src/checkout.mjs";
|
||||||
@@ -78,6 +78,23 @@ test("T3: publish pushes the work commit by oid to <user>/<branch> on the fork,
|
|||||||
assert.equal(spawnSync("git", [`--git-dir=${w.repo}`, "config", "--get-regexp", "^(remote|credential)\\."], { env: gitEnv() }).stdout.toString(), "");
|
assert.equal(spawnSync("git", [`--git-dir=${w.repo}`, "config", "--get-regexp", "^(remote|credential)\\."], { env: gitEnv() }).stdout.toString(), "");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("T3: the token is never in git's argv, the fork URL included; it reaches git on fd 3 only", async (t) => {
|
||||||
|
const w = await world(t);
|
||||||
|
// A git first on PATH that logs its argv and execs the real one; exec keeps fd 3.
|
||||||
|
const real = spawnSync("sh", ["-c", "command -v git"], { encoding: "utf8" }).stdout.trim();
|
||||||
|
const shim = join(w.dir, "shim");
|
||||||
|
mkdirSync(shim);
|
||||||
|
const log = join(w.dir, "argv.log");
|
||||||
|
writeFileSync(join(shim, "git"), `#!/bin/sh\nprintf '%s\\n' "$@" >> '${log}'\nexec '${real}' "$@"\n`);
|
||||||
|
chmodSync(join(shim, "git"), 0o755);
|
||||||
|
assert.deepEqual(await w.remote({ env: { PATH: `${shim}:${process.env.PATH}` } }), { ref: DST, commit: w.work, previous: null });
|
||||||
|
const argv = readFileSync(log, "utf8");
|
||||||
|
assert.match(argv, /^ls-remote$/m);
|
||||||
|
assert.match(argv, /^push$/m);
|
||||||
|
assert.equal(argv.includes(TOKEN), false);
|
||||||
|
assert.equal(argv.includes(`${USER}:`), false, "no userinfo in a URL");
|
||||||
|
});
|
||||||
|
|
||||||
test("T3: a moved fork branch refuses non-fast-forward; no + and no force", async (t) => {
|
test("T3: a moved fork branch refuses non-fast-forward; no + and no force", async (t) => {
|
||||||
const w = await world(t);
|
const w = await world(t);
|
||||||
const other = join(w.dir, "other");
|
const other = join(w.dir, "other");
|
||||||
@@ -127,11 +144,14 @@ test("T3: a wrong token refuses fork-unavailable; git's stderr isn't in the refu
|
|||||||
|
|
||||||
test("T3: a 302 is not followed: fork-unavailable, and the target sees no request", async (t) => {
|
test("T3: a 302 is not followed: fork-unavailable, and the target sees no request", async (t) => {
|
||||||
const w = await world(t);
|
const w = await world(t);
|
||||||
const target = await fakeGitea({ dir: join(w.dir, "target"), tls: scratchCa(join(w.dir, "ca2")), user: USER, token: TOKEN });
|
// One CA for both, which git trusts, so only http.followRedirects=false keeps git off the target;
|
||||||
|
// with a CA git doesn't trust, a followed redirect would fail at TLS and the target would see nothing anyway.
|
||||||
|
const ca = scratchCa(join(w.dir, "ca2"));
|
||||||
|
const target = await fakeGitea({ dir: join(w.dir, "target"), tls: ca, user: USER, token: TOKEN });
|
||||||
t.after(() => target.close());
|
t.after(() => target.close());
|
||||||
const bounce = await fakeGitea({ dir: join(w.dir, "bounce"), tls: scratchCa(join(w.dir, "ca3")), user: USER, token: TOKEN, redirect: target.origin });
|
const bounce = await fakeGitea({ dir: join(w.dir, "bounce"), tls: ca, user: USER, token: TOKEN, redirect: target.origin });
|
||||||
t.after(() => bounce.close());
|
t.after(() => bounce.close());
|
||||||
const tls = ["-c", `http.sslCAInfo=${join(w.dir, "ca3", "ca.pem")}`];
|
const tls = ["-c", `http.sslCAInfo=${ca.ca}`];
|
||||||
await rejects(w.remote({ fork: `${bounce.origin}/${USER}/stack`, tls }), "fork-unavailable");
|
await rejects(w.remote({ fork: `${bounce.origin}/${USER}/stack`, tls }), "fork-unavailable");
|
||||||
assert.ok(bounce.requests.length > 0);
|
assert.ok(bounce.requests.length > 0);
|
||||||
assert.equal(target.requests.length, 0);
|
assert.equal(target.requests.length, 0);
|
||||||
|
|||||||
Reference in new issue
Block a user