mirror of
https://github.com/anthropics/claude-code-action.git
synced 2026-08-22 03:18:54 +08:00
fix(git-config): neutralize checkout credential in include-based config (#1526)
configureGitAuth() removed the actions/checkout auth header with `git config --unset-all http.<server>/.extraheader`, which only edits the repo-local config. Since actions/checkout v6.0.0 (backported to v5.0.1 and v4.3.1) the header is written to a separate file under RUNNER_TEMP and pulled in via include.path, so --unset-all on the local config is a no-op: the code logged "No existing authentication headers to remove" while the checkout credential (usually the workflow GITHUB_TOKEN) stayed usable by git for the rest of the job. Also clear the header from every included file, so it is neutralized under both the pre-v6 (local) and v6+ (include) layouts. Includes that do not define the header are left untouched. Fixes #1510
This commit is contained in:
@@ -56,6 +56,16 @@ export async function configureGitAuth(
|
|||||||
* action's own token instead (a credential helper when non-write users are
|
* action's own token instead (a credential helper when non-write users are
|
||||||
* allowed, otherwise the origin URL). This applies to every mode, including API
|
* allowed, otherwise the origin URL). This applies to every mode, including API
|
||||||
* commit signing where no other git configuration is needed.
|
* commit signing where no other git configuration is needed.
|
||||||
|
*
|
||||||
|
* actions/checkout < v6 stored the header directly in the repo-local config,
|
||||||
|
* where `git config --unset-all` removes it. Since v6.0.0 (backported to
|
||||||
|
* v5.0.1 and v4.3.1) the header is written to a separate file under
|
||||||
|
* RUNNER_TEMP that the repo config pulls in via `include.path`; `--unset-all`
|
||||||
|
* on the local config cannot touch an include-provided value, so the removal
|
||||||
|
* was a silent no-op and the checkout credential (typically the workflow
|
||||||
|
* GITHUB_TOKEN) stayed usable by git for the rest of the job. Clear the
|
||||||
|
* header from the local config AND from every included file so it can no
|
||||||
|
* longer authenticate while Claude runs.
|
||||||
*/
|
*/
|
||||||
export async function replaceCheckoutCredentials(
|
export async function replaceCheckoutCredentials(
|
||||||
githubToken: string,
|
githubToken: string,
|
||||||
@@ -65,12 +75,35 @@ export async function replaceCheckoutCredentials(
|
|||||||
|
|
||||||
// Remove the authorization header that actions/checkout sets
|
// Remove the authorization header that actions/checkout sets
|
||||||
console.log("Removing existing git authentication headers...");
|
console.log("Removing existing git authentication headers...");
|
||||||
|
const extraheaderKey = `http.${GITHUB_SERVER_URL}/.extraheader`;
|
||||||
|
let removedHeader = false;
|
||||||
try {
|
try {
|
||||||
await $`git config --unset-all http.${GITHUB_SERVER_URL}/.extraheader`;
|
await $`git config --unset-all ${extraheaderKey}`;
|
||||||
console.log("✓ Removed existing authentication headers");
|
removedHeader = true;
|
||||||
} catch (e) {
|
} catch {
|
||||||
console.log("No existing authentication headers to remove");
|
// No extraheader in the local config (expected on the v6+ include layout).
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
const includePaths =
|
||||||
|
await $`git config --local --get-all include.path`.text();
|
||||||
|
for (const includePath of includePaths.split("\n")) {
|
||||||
|
const path = includePath.trim();
|
||||||
|
if (!path) continue;
|
||||||
|
try {
|
||||||
|
await $`git config --file ${path} --unset-all ${extraheaderKey}`;
|
||||||
|
removedHeader = true;
|
||||||
|
} catch {
|
||||||
|
// This include does not define the header; leave it untouched.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// No include.path entries in the local config.
|
||||||
|
}
|
||||||
|
console.log(
|
||||||
|
removedHeader
|
||||||
|
? "✓ Removed existing authentication headers"
|
||||||
|
: "No existing authentication headers to remove",
|
||||||
|
);
|
||||||
|
|
||||||
if (process.env.ALLOWED_NON_WRITE_USERS) {
|
if (process.env.ALLOWED_NON_WRITE_USERS) {
|
||||||
// When processing content from non-write users, use a credential helper
|
// When processing content from non-write users, use a credential helper
|
||||||
|
|||||||
Reference in New Issue
Block a user