action-pinner 0.1.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/LICENSE +21 -0
- package/README.md +406 -0
- package/action.yml +53 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/src/action-mode.d.ts +1 -0
- package/dist/src/action-mode.js +109 -0
- package/dist/src/action-mode.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +780 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +2 -0
- package/dist/src/config.js +291 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/dependabot.d.ts +1 -0
- package/dist/src/dependabot.js +11 -0
- package/dist/src/dependabot.js.map +1 -0
- package/dist/src/enforcement.d.ts +12 -0
- package/dist/src/enforcement.js +238 -0
- package/dist/src/enforcement.js.map +1 -0
- package/dist/src/github-app.d.ts +6 -0
- package/dist/src/github-app.js +4 -0
- package/dist/src/github-app.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +16 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logging.d.ts +8 -0
- package/dist/src/logging.js +38 -0
- package/dist/src/logging.js.map +1 -0
- package/dist/src/multi-repo-scanner.d.ts +69 -0
- package/dist/src/multi-repo-scanner.js +121 -0
- package/dist/src/multi-repo-scanner.js.map +1 -0
- package/dist/src/netrc-auth.d.ts +13 -0
- package/dist/src/netrc-auth.js +123 -0
- package/dist/src/netrc-auth.js.map +1 -0
- package/dist/src/org.d.ts +49 -0
- package/dist/src/org.js +162 -0
- package/dist/src/org.js.map +1 -0
- package/dist/src/pattern-match.d.ts +5 -0
- package/dist/src/pattern-match.js +59 -0
- package/dist/src/pattern-match.js.map +1 -0
- package/dist/src/pinner.d.ts +6 -0
- package/dist/src/pinner.js +148 -0
- package/dist/src/pinner.js.map +1 -0
- package/dist/src/pr.d.ts +87 -0
- package/dist/src/pr.js +165 -0
- package/dist/src/pr.js.map +1 -0
- package/dist/src/report.d.ts +10 -0
- package/dist/src/report.js +54 -0
- package/dist/src/report.js.map +1 -0
- package/dist/src/resolver.d.ts +44 -0
- package/dist/src/resolver.js +227 -0
- package/dist/src/resolver.js.map +1 -0
- package/dist/src/scanner.d.ts +8 -0
- package/dist/src/scanner.js +128 -0
- package/dist/src/scanner.js.map +1 -0
- package/dist/src/types.d.ts +170 -0
- package/dist/src/types.js +41 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +22 -0
- package/dist/src/version.js.map +1 -0
- package/dist/src/workflow-paths.d.ts +4 -0
- package/dist/src/workflow-paths.js +29 -0
- package/dist/src/workflow-paths.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforcement.js","sourceRoot":"","sources":["../../src/enforcement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-app.js","sourceRoot":"","sources":["../../src/github-app.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAwB;IAC7D,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runActionMode } from "./action-mode.js";
|
|
3
|
+
import { runCli } from "./cli.js";
|
|
4
|
+
async function main() {
|
|
5
|
+
if (process.env.GITHUB_ACTIONS === "true" && process.env.INPUT_MODE) {
|
|
6
|
+
await runActionMode();
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
await runCli();
|
|
10
|
+
}
|
|
11
|
+
main().catch((error) => {
|
|
12
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
13
|
+
console.error(message);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACpE,MAAM,aAAa,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,EAAE,CAAC;AACjB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface SafeLogRule {
|
|
2
|
+
name: string;
|
|
3
|
+
pattern: RegExp;
|
|
4
|
+
replacement: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const SAFE_LOG_RULES: SafeLogRule[];
|
|
7
|
+
export declare function redactToken(str: string): string;
|
|
8
|
+
export declare function safeLog(message: string): string;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export const SAFE_LOG_RULES = [
|
|
2
|
+
{
|
|
3
|
+
name: "token_parameter",
|
|
4
|
+
pattern: /token=[^\s&"']+/gi,
|
|
5
|
+
replacement: "token=***REDACTED***"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
name: "authorization_header",
|
|
9
|
+
pattern: /Authorization:\s*Bearer\s+[^\s]+/gi,
|
|
10
|
+
replacement: "Authorization: Bearer ***REDACTED***"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: "github_token_env",
|
|
14
|
+
pattern: /GITHUB_TOKEN=[^\s"']+/gi,
|
|
15
|
+
replacement: "GITHUB_TOKEN=***REDACTED***"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: "url_with_credentials",
|
|
19
|
+
pattern: /https?:\/\/[^:]+:[^\s@]+@/gi,
|
|
20
|
+
replacement: "https://***REDACTED***:***REDACTED***@"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "personal_access_token",
|
|
24
|
+
pattern: /gh[pousr]_[A-Za-z0-9_]+/g,
|
|
25
|
+
replacement: "***REDACTED_TOKEN***"
|
|
26
|
+
}
|
|
27
|
+
];
|
|
28
|
+
export function redactToken(str) {
|
|
29
|
+
let result = str;
|
|
30
|
+
for (const rule of SAFE_LOG_RULES) {
|
|
31
|
+
result = result.replace(rule.pattern, rule.replacement);
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
export function safeLog(message) {
|
|
36
|
+
return redactToken(message);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/logging.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,mBAAmB;QAC5B,WAAW,EAAE,sBAAsB;KACpC;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,oCAAoC;QAC7C,WAAW,EAAE,sCAAsC;KACpD;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,yBAAyB;QAClC,WAAW,EAAE,6BAA6B;KAC3C;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,6BAA6B;QACtC,WAAW,EAAE,wCAAwC;KACtD;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,0BAA0B;QACnC,WAAW,EAAE,sBAAsB;KACpC;CACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { ScanResult } from "./types.js";
|
|
2
|
+
export interface MultiRepoScanOptions {
|
|
3
|
+
includePatterns: string[];
|
|
4
|
+
excludePatterns: string[];
|
|
5
|
+
includeActions: string[];
|
|
6
|
+
excludeActions: string[];
|
|
7
|
+
token?: string;
|
|
8
|
+
githubApiUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface MultiRepoScanEntry {
|
|
11
|
+
repository: string;
|
|
12
|
+
defaultBranch: string;
|
|
13
|
+
scan: ScanResult;
|
|
14
|
+
}
|
|
15
|
+
export interface RepositoryScanTarget {
|
|
16
|
+
repository: string;
|
|
17
|
+
defaultBranch?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface MultiRepoScanResult {
|
|
20
|
+
repositories: MultiRepoScanEntry[];
|
|
21
|
+
consolidated: ScanResult;
|
|
22
|
+
summary: {
|
|
23
|
+
repositoriesScanned: number;
|
|
24
|
+
repositoriesWithUnpinned: number;
|
|
25
|
+
filesScanned: number;
|
|
26
|
+
referencesFound: number;
|
|
27
|
+
unpinnedFound: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
interface RepoClient {
|
|
31
|
+
repos: {
|
|
32
|
+
get: (params: {
|
|
33
|
+
owner: string;
|
|
34
|
+
repo: string;
|
|
35
|
+
}) => Promise<{
|
|
36
|
+
data: {
|
|
37
|
+
default_branch: string;
|
|
38
|
+
};
|
|
39
|
+
}>;
|
|
40
|
+
getContent: (params: {
|
|
41
|
+
owner: string;
|
|
42
|
+
repo: string;
|
|
43
|
+
path: string;
|
|
44
|
+
ref: string;
|
|
45
|
+
}) => Promise<{
|
|
46
|
+
data: {
|
|
47
|
+
content: string;
|
|
48
|
+
encoding: string;
|
|
49
|
+
} | unknown[];
|
|
50
|
+
}>;
|
|
51
|
+
};
|
|
52
|
+
git: {
|
|
53
|
+
getTree: (params: {
|
|
54
|
+
owner: string;
|
|
55
|
+
repo: string;
|
|
56
|
+
tree_sha: string;
|
|
57
|
+
recursive: "true";
|
|
58
|
+
}) => Promise<{
|
|
59
|
+
data: {
|
|
60
|
+
tree: Array<{
|
|
61
|
+
path?: string;
|
|
62
|
+
type?: string;
|
|
63
|
+
}>;
|
|
64
|
+
};
|
|
65
|
+
}>;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export declare function scanRepositories(repositories: Array<string | RepositoryScanTarget>, options: MultiRepoScanOptions, client?: RepoClient): Promise<MultiRepoScanResult>;
|
|
69
|
+
export {};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { Octokit } from "@octokit/rest";
|
|
3
|
+
import { matchesAnyPattern } from "./pattern-match.js";
|
|
4
|
+
import { normalizeGithubApiUrl } from "./resolver.js";
|
|
5
|
+
import { buildScanResult, extractActionReferences } from "./scanner.js";
|
|
6
|
+
import { resolveWorkflowPatterns } from "./workflow-paths.js";
|
|
7
|
+
export async function scanRepositories(repositories, options, client = createRepoClient(options)) {
|
|
8
|
+
const sortedRepositories = normalizeScanTargets(repositories);
|
|
9
|
+
const entries = [];
|
|
10
|
+
for (const repository of sortedRepositories) {
|
|
11
|
+
const scan = await scanSingleRepository(repository, options, client);
|
|
12
|
+
entries.push(scan);
|
|
13
|
+
}
|
|
14
|
+
const consolidated = buildScanResult(entries.flatMap((entry) => entry.scan.references), entries.reduce((sum, entry) => sum + entry.scan.summary.filesScanned, 0));
|
|
15
|
+
return {
|
|
16
|
+
repositories: entries,
|
|
17
|
+
consolidated,
|
|
18
|
+
summary: {
|
|
19
|
+
repositoriesScanned: entries.length,
|
|
20
|
+
repositoriesWithUnpinned: entries.filter((entry) => entry.scan.unpinned.length > 0).length,
|
|
21
|
+
filesScanned: consolidated.summary.filesScanned,
|
|
22
|
+
referencesFound: consolidated.summary.referencesFound,
|
|
23
|
+
unpinnedFound: consolidated.summary.unpinnedFound
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async function scanSingleRepository(target, options, client) {
|
|
28
|
+
const repository = target.repository;
|
|
29
|
+
const { owner, repo } = splitRepository(repository);
|
|
30
|
+
const defaultBranch = target.defaultBranch ?? (await client.repos.get({ owner, repo })).data.default_branch;
|
|
31
|
+
const tree = await client.git.getTree({
|
|
32
|
+
owner,
|
|
33
|
+
repo,
|
|
34
|
+
tree_sha: defaultBranch,
|
|
35
|
+
recursive: "true"
|
|
36
|
+
});
|
|
37
|
+
const includePatterns = resolveWorkflowPatterns(options.includePatterns);
|
|
38
|
+
const workflowPaths = tree.data.tree
|
|
39
|
+
.filter((entry) => entry.type === "blob" && typeof entry.path === "string")
|
|
40
|
+
.map((entry) => entry.path)
|
|
41
|
+
.filter((path) => path.endsWith(".yml") || path.endsWith(".yaml"))
|
|
42
|
+
.filter((path) => matchesAnyPattern(path, includePatterns, { caseInsensitive: true }))
|
|
43
|
+
.filter((path) => !(options.excludePatterns.length > 0 &&
|
|
44
|
+
matchesAnyPattern(path, options.excludePatterns, { caseInsensitive: true })))
|
|
45
|
+
.sort((left, right) => left.localeCompare(right));
|
|
46
|
+
const references = [];
|
|
47
|
+
for (const path of workflowPaths) {
|
|
48
|
+
const contentResponse = await client.repos.getContent({
|
|
49
|
+
owner,
|
|
50
|
+
repo,
|
|
51
|
+
path,
|
|
52
|
+
ref: defaultBranch
|
|
53
|
+
});
|
|
54
|
+
if (Array.isArray(contentResponse.data)) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const content = decodeContent(contentResponse.data.content, contentResponse.data.encoding);
|
|
58
|
+
const fileReferences = extractActionReferences(`${repository}/${path}`, content).filter((reference) => {
|
|
59
|
+
if (options.includeActions.length > 0 &&
|
|
60
|
+
!matchesActionPattern(reference.action, options.includeActions)) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
if (options.excludeActions.length > 0 &&
|
|
64
|
+
matchesActionPattern(reference.action, options.excludeActions)) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
});
|
|
69
|
+
references.push(...fileReferences);
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
repository,
|
|
73
|
+
defaultBranch,
|
|
74
|
+
scan: buildScanResult(references, workflowPaths.length)
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function decodeContent(content, encoding) {
|
|
78
|
+
if (encoding === "base64") {
|
|
79
|
+
return Buffer.from(content, "base64").toString("utf8");
|
|
80
|
+
}
|
|
81
|
+
throw new Error(`Unsupported content encoding: ${encoding}`);
|
|
82
|
+
}
|
|
83
|
+
function createRepoClient(options) {
|
|
84
|
+
return new Octokit({
|
|
85
|
+
auth: options.token,
|
|
86
|
+
baseUrl: normalizeGithubApiUrl(options.githubApiUrl)
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function normalizeScanTargets(repositories) {
|
|
90
|
+
const deduped = new Map();
|
|
91
|
+
for (const repository of repositories) {
|
|
92
|
+
const target = typeof repository === "string" ? { repository } : repository;
|
|
93
|
+
const normalized = splitRepository(target.repository);
|
|
94
|
+
const fullName = `${normalized.owner}/${normalized.repo}`;
|
|
95
|
+
const existing = deduped.get(fullName.toLowerCase());
|
|
96
|
+
deduped.set(fullName.toLowerCase(), {
|
|
97
|
+
repository: fullName,
|
|
98
|
+
defaultBranch: existing?.defaultBranch ?? target.defaultBranch
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return [...deduped.values()].sort((left, right) => left.repository.localeCompare(right.repository, "en", { sensitivity: "base" }));
|
|
102
|
+
}
|
|
103
|
+
function splitRepository(repository) {
|
|
104
|
+
const trimmed = repository.trim();
|
|
105
|
+
const parts = trimmed.split("/");
|
|
106
|
+
if (parts.length !== 2 || parts.some((part) => part.length === 0)) {
|
|
107
|
+
throw new Error(`Invalid repository '${repository}'. Expected format is 'owner/repo'.`);
|
|
108
|
+
}
|
|
109
|
+
return { owner: parts[0], repo: parts[1] };
|
|
110
|
+
}
|
|
111
|
+
function matchesActionPattern(action, patterns) {
|
|
112
|
+
return patterns.some((pattern) => {
|
|
113
|
+
const normalizedPattern = pattern.trim();
|
|
114
|
+
if (!normalizedPattern) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
const target = normalizedPattern.includes("/") ? action : action.split("/")[1] ?? action;
|
|
118
|
+
return matchesAnyPattern(target, [normalizedPattern], { caseInsensitive: true });
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=multi-repo-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-repo-scanner.js","sourceRoot":"","sources":["../../src/multi-repo-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface NetrcCredentials {
|
|
2
|
+
login: string;
|
|
3
|
+
password: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function loadNetrc(overridePath?: string): Promise<Map<string, NetrcCredentials>>;
|
|
6
|
+
export declare function getNetrcCredentials(host: string, overridePath?: string): Promise<NetrcCredentials | null>;
|
|
7
|
+
export declare function getNetrcPath(): string;
|
|
8
|
+
export declare function encodeNetrcAuth(login: string, password: string): string;
|
|
9
|
+
export interface OctokitAuth {
|
|
10
|
+
auth?: string | Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export declare function applyNetrcAuth(client: OctokitAuth, host: string): Promise<void>;
|
|
13
|
+
export declare function redactNetrcAuth(auth: string | undefined): string;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { statSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { resolve, join } from "node:path";
|
|
5
|
+
import { platform } from "node:os";
|
|
6
|
+
export async function loadNetrc(overridePath) {
|
|
7
|
+
const netrcPath = overridePath ?? getNetrcPath();
|
|
8
|
+
const credentials = new Map();
|
|
9
|
+
try {
|
|
10
|
+
const content = await readFile(netrcPath, "utf8");
|
|
11
|
+
// Warn if .netrc is world-readable (security issue)
|
|
12
|
+
try {
|
|
13
|
+
const stats = statSync(netrcPath);
|
|
14
|
+
// eslint-disable-next-line no-bitwise
|
|
15
|
+
if ((stats.mode & 0o077) !== 0) {
|
|
16
|
+
console.warn(`Warning: ${netrcPath} is readable by others. Fix with: chmod 600 ${netrcPath}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Ignore stat errors
|
|
21
|
+
}
|
|
22
|
+
const lines = content.split("\n");
|
|
23
|
+
let currentMachine = null;
|
|
24
|
+
let currentLogin = null;
|
|
25
|
+
let currentPassword = null;
|
|
26
|
+
for (const line of lines) {
|
|
27
|
+
const trimmed = line.trim();
|
|
28
|
+
if (!trimmed || trimmed.startsWith("#")) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const parts = trimmed.split(/\s+/);
|
|
32
|
+
let i = 0;
|
|
33
|
+
while (i < parts.length) {
|
|
34
|
+
const key = parts[i];
|
|
35
|
+
i += 1;
|
|
36
|
+
if (key === "machine") {
|
|
37
|
+
const value = parts[i];
|
|
38
|
+
if (value) {
|
|
39
|
+
if (currentMachine && currentLogin && currentPassword) {
|
|
40
|
+
credentials.set(currentMachine, {
|
|
41
|
+
login: currentLogin,
|
|
42
|
+
password: currentPassword
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
currentMachine = value;
|
|
46
|
+
currentLogin = null;
|
|
47
|
+
currentPassword = null;
|
|
48
|
+
}
|
|
49
|
+
i += 1;
|
|
50
|
+
}
|
|
51
|
+
else if (key === "login") {
|
|
52
|
+
currentLogin = parts[i] ?? null;
|
|
53
|
+
i += 1;
|
|
54
|
+
}
|
|
55
|
+
else if (key === "password") {
|
|
56
|
+
// Capture the rest of the line to handle passwords containing spaces
|
|
57
|
+
const passwordTokens = parts.slice(i);
|
|
58
|
+
currentPassword = passwordTokens.length > 0 ? passwordTokens.join(" ") : null;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (currentMachine && currentLogin && currentPassword) {
|
|
64
|
+
credentials.set(currentMachine, {
|
|
65
|
+
login: currentLogin,
|
|
66
|
+
password: currentPassword
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
72
|
+
if (!message.includes("ENOENT")) {
|
|
73
|
+
console.warn(`Failed to load netrc from ${netrcPath}: ${message}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return credentials;
|
|
77
|
+
}
|
|
78
|
+
export async function getNetrcCredentials(host, overridePath) {
|
|
79
|
+
const credentials = await loadNetrc(overridePath);
|
|
80
|
+
// Exact match
|
|
81
|
+
if (credentials.has(host)) {
|
|
82
|
+
return credentials.get(host) ?? null;
|
|
83
|
+
}
|
|
84
|
+
// Try wildcard matching for subdomains (e.g., *.github.com matches api.github.com)
|
|
85
|
+
for (const [machine, creds] of credentials.entries()) {
|
|
86
|
+
if (machine.startsWith("*.") && host.endsWith(machine.substring(1))) {
|
|
87
|
+
return creds;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
export function getNetrcPath() {
|
|
93
|
+
const home = homedir();
|
|
94
|
+
if (platform() === "win32") {
|
|
95
|
+
return join(home, "_netrc");
|
|
96
|
+
}
|
|
97
|
+
return resolve(home, ".netrc");
|
|
98
|
+
}
|
|
99
|
+
export function encodeNetrcAuth(login, password) {
|
|
100
|
+
const credentials = `${login}:${password}`;
|
|
101
|
+
return Buffer.from(credentials).toString("base64");
|
|
102
|
+
}
|
|
103
|
+
export async function applyNetrcAuth(client, host) {
|
|
104
|
+
const creds = await getNetrcCredentials(host);
|
|
105
|
+
if (creds) {
|
|
106
|
+
// Use login:password format as expected by Octokit's basic auth strategy
|
|
107
|
+
client.auth = `${creds.login}:${creds.password}`;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
export function redactNetrcAuth(auth) {
|
|
111
|
+
if (!auth) {
|
|
112
|
+
return "none";
|
|
113
|
+
}
|
|
114
|
+
if (auth.startsWith("Basic ")) {
|
|
115
|
+
return "netrc";
|
|
116
|
+
}
|
|
117
|
+
// Detect login:password format used by netrc/basic auth
|
|
118
|
+
if (auth.includes(":") && !auth.startsWith("token ")) {
|
|
119
|
+
return "netrc";
|
|
120
|
+
}
|
|
121
|
+
return "token (redacted)";
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=netrc-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"netrc-auth.js","sourceRoot":"","sources":["../../src/netrc-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOnC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,YAAqB;IACnD,MAAM,SAAS,GAAG,YAAY,IAAI,YAAY,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAElD,oDAAoD;QACpD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YAClC,sCAAsC;YACtC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,IAAI,CACV,YAAY,SAAS,+CAA+C,SAAS,EAAE,CAChF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,cAAc,GAAkB,IAAI,CAAC;QACzC,IAAI,YAAY,GAAkB,IAAI,CAAC;QACvC,IAAI,eAAe,GAAkB,IAAI,CAAC;QAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrB,CAAC,IAAI,CAAC,CAAC;gBAEP,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACvB,IAAI,KAAK,EAAE,CAAC;wBACV,IAAI,cAAc,IAAI,YAAY,IAAI,eAAe,EAAE,CAAC;4BACtD,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE;gCAC9B,KAAK,EAAE,YAAY;gCACnB,QAAQ,EAAE,eAAe;6BAC1B,CAAC,CAAC;wBACL,CAAC;wBACD,cAAc,GAAG,KAAK,CAAC;wBACvB,YAAY,GAAG,IAAI,CAAC;wBACpB,eAAe,GAAG,IAAI,CAAC;oBACzB,CAAC;oBACD,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;oBAC3B,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;oBAChC,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;oBAC9B,qEAAqE;oBACrE,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtC,eAAe,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC9E,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,cAAc,IAAI,YAAY,IAAI,eAAe,EAAE,CAAC;YACtD,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE;gBAC9B,KAAK,EAAE,YAAY;gBACnB,QAAQ,EAAE,eAAe;aAC1B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,6BAA6B,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAY,EACZ,YAAqB;IAErB,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;IAElD,cAAc;IACd,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACvC,CAAC;IAED,mFAAmF;IACnF,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,QAAgB;IAC7D,MAAM,WAAW,GAAG,GAAG,KAAK,IAAI,QAAQ,EAAE,CAAC;IAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrD,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAmB,EACnB,IAAY;IAEZ,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE9C,IAAI,KAAK,EAAE,CAAC;QACV,yEAAyE;QACzE,MAAM,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAwB;IACtD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,wDAAwD;IACxD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type RepositoryOwnerType = "org" | "user";
|
|
2
|
+
export interface RepositoryMetadata {
|
|
3
|
+
fullName: string;
|
|
4
|
+
defaultBranch: string;
|
|
5
|
+
archived: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface OrgScanOptions {
|
|
8
|
+
org: string;
|
|
9
|
+
includePrivate: boolean;
|
|
10
|
+
includeArchived: boolean;
|
|
11
|
+
githubApiUrl?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface OwnerScanOptions {
|
|
14
|
+
target: string;
|
|
15
|
+
targetType: RepositoryOwnerType;
|
|
16
|
+
includePrivate: boolean;
|
|
17
|
+
includeArchived: boolean;
|
|
18
|
+
githubApiUrl?: string;
|
|
19
|
+
}
|
|
20
|
+
interface RepositoryEnumerationClient {
|
|
21
|
+
paginate: <T>(route: unknown, params: Record<string, unknown>) => Promise<T[]>;
|
|
22
|
+
repos: {
|
|
23
|
+
listForOrg: unknown;
|
|
24
|
+
listForUser: unknown;
|
|
25
|
+
listForAuthenticatedUser: unknown;
|
|
26
|
+
};
|
|
27
|
+
users: {
|
|
28
|
+
getAuthenticated: () => Promise<{
|
|
29
|
+
data: {
|
|
30
|
+
login: string;
|
|
31
|
+
};
|
|
32
|
+
}>;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export declare function listOrgRepositories(options: OrgScanOptions, token?: string, client?: RepositoryEnumerationClient): Promise<string[]>;
|
|
36
|
+
export declare function listUserRepositories(options: Omit<OrgScanOptions, "org"> & {
|
|
37
|
+
user: string;
|
|
38
|
+
}, token?: string, client?: RepositoryEnumerationClient): Promise<string[]>;
|
|
39
|
+
export declare function listOwnerRepositories(options: OwnerScanOptions, token?: string, client?: RepositoryEnumerationClient): Promise<RepositoryMetadata[]>;
|
|
40
|
+
export declare function filterRepositories(repositories: string[], options?: {
|
|
41
|
+
includePatterns?: string[];
|
|
42
|
+
excludePatterns?: string[];
|
|
43
|
+
}): string[];
|
|
44
|
+
export declare function filterRepositoryMetadata(repositories: RepositoryMetadata[], options?: {
|
|
45
|
+
includePatterns?: string[];
|
|
46
|
+
excludePatterns?: string[];
|
|
47
|
+
}): RepositoryMetadata[];
|
|
48
|
+
export declare function normalizeAndSortRepositories(repositories: string[]): string[];
|
|
49
|
+
export {};
|