@cefense-npm/cefense-cli 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.md +21 -0
- package/dist/commands/auth.d.ts +9 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +190 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/fix.d.ts +3 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +146 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/fixactions.d.ts +12 -0
- package/dist/commands/fixactions.d.ts.map +1 -0
- package/dist/commands/fixactions.js +176 -0
- package/dist/commands/fixactions.js.map +1 -0
- package/dist/commands/link.d.ts +8 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +0 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/observed.d.ts +18 -0
- package/dist/commands/observed.d.ts.map +1 -0
- package/dist/commands/observed.js +254 -0
- package/dist/commands/observed.js.map +1 -0
- package/dist/commands/pick.d.ts +3 -0
- package/dist/commands/pick.d.ts.map +1 -0
- package/dist/commands/pick.js +18 -0
- package/dist/commands/pick.js.map +1 -0
- package/dist/commands/repo.d.ts +12 -0
- package/dist/commands/repo.d.ts.map +1 -0
- package/dist/commands/repo.js +330 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/scan.d.ts +9 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +98 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +250 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/client.d.ts +87 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +235 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/config.d.ts +24 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +85 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/credentials.d.ts +17 -0
- package/dist/core/credentials.d.ts.map +1 -0
- package/dist/core/credentials.js +139 -0
- package/dist/core/credentials.js.map +1 -0
- package/dist/core/discovery.d.ts +8 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +62 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/errors.d.ts +32 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +56 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/oauth.d.ts +20 -0
- package/dist/core/oauth.d.ts.map +1 -0
- package/dist/core/oauth.js +218 -0
- package/dist/core/oauth.js.map +1 -0
- package/dist/core/repo.d.ts +24 -0
- package/dist/core/repo.d.ts.map +1 -0
- package/dist/core/repo.js +101 -0
- package/dist/core/repo.js.map +1 -0
- package/dist/core/session.d.ts +24 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +32 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/types.d.ts +309 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +148 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/browser.d.ts +30 -0
- package/dist/ui/browser.d.ts.map +1 -0
- package/dist/ui/browser.js +350 -0
- package/dist/ui/browser.js.map +1 -0
- package/dist/ui/format.d.ts +15 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +131 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/output.d.ts +16 -0
- package/dist/ui/output.d.ts.map +1 -0
- package/dist/ui/output.js +63 -0
- package/dist/ui/output.js.map +1 -0
- package/dist/ui/prompts.d.ts +39 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +76 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/screen.d.ts +27 -0
- package/dist/ui/screen.d.ts.map +1 -0
- package/dist/ui/screen.js +120 -0
- package/dist/ui/screen.js.map +1 -0
- package/dist/ui/spinner.d.ts +8 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +98 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/table.d.ts +14 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +47 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/theme.d.ts +44 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +85 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +17 -0
- package/dist/version.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import open from "open";
|
|
2
|
+
import { openSession } from "../core/session.js";
|
|
3
|
+
import { readRepoDefault } from "../core/config.js";
|
|
4
|
+
import { defaultScope } from "../core/repo.js";
|
|
5
|
+
import { browse } from "../ui/browser.js";
|
|
6
|
+
import * as out from "../ui/output.js";
|
|
7
|
+
import { keyValue, renderTable } from "../ui/table.js";
|
|
8
|
+
import { elapsed, padEnd, progressBar, relativeTime, terminalWidth } from "../ui/format.js";
|
|
9
|
+
import { c, glyph, scanStatusLabel } from "../ui/theme.js";
|
|
10
|
+
import { confirmByTyping } from "../ui/prompts.js";
|
|
11
|
+
import { observedCommand } from "./observed.js";
|
|
12
|
+
import { watchScan } from "./scan.js";
|
|
13
|
+
function isActive(project) {
|
|
14
|
+
return project.scan?.status === "queued" || project.scan?.status === "running";
|
|
15
|
+
}
|
|
16
|
+
function scanCell(project) {
|
|
17
|
+
const scan = project.scan;
|
|
18
|
+
if (!scan)
|
|
19
|
+
return c.dim("never");
|
|
20
|
+
if (scan.status === "running" || scan.status === "queued") {
|
|
21
|
+
const done = scan.filesScanned ?? 0;
|
|
22
|
+
const total = scan.fileCount ?? 0;
|
|
23
|
+
return total > 0 ? `${scan.stage ?? "running"} ${done}/${total}` : (scan.stage ?? "queued");
|
|
24
|
+
}
|
|
25
|
+
if (scan.status === "failed")
|
|
26
|
+
return c.red(scan.error ?? "failed");
|
|
27
|
+
return relativeTime(scan.finishedAt ?? scan.createdAt);
|
|
28
|
+
}
|
|
29
|
+
function headerLines(github, projects, email, apiUrl) {
|
|
30
|
+
const scanning = projects.filter(isActive).length;
|
|
31
|
+
const summary = [
|
|
32
|
+
`${projects.length} connected`,
|
|
33
|
+
scanning > 0 ? c.cyan(`${scanning} scanning`) : "",
|
|
34
|
+
]
|
|
35
|
+
.filter(Boolean)
|
|
36
|
+
.join(c.dim(" · "));
|
|
37
|
+
return [
|
|
38
|
+
"",
|
|
39
|
+
` ${c.bold("Cefense")} ${c.dim(`${email} · ${apiUrl.replace(/^https?:\/\//, "")}`)}`,
|
|
40
|
+
"",
|
|
41
|
+
` ${c.dim(padEnd("GitHub", 10))}${github?.connected ? `connected as ${github.login}` : c.yellow("not connected")}`,
|
|
42
|
+
` ${c.dim(padEnd("Repos", 10))}${summary}`,
|
|
43
|
+
"",
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
function projectDetail(project, width) {
|
|
47
|
+
const lines = [];
|
|
48
|
+
const push = (value = "") => lines.push(value ? ` ${value}` : "");
|
|
49
|
+
const scan = project.scan;
|
|
50
|
+
push();
|
|
51
|
+
push(`${c.bold(project.fullName)} ${c.dim(`${project.private ? "private" : "public"} · ${project.defaultBranch ?? "default branch"}`)}`);
|
|
52
|
+
push();
|
|
53
|
+
const facts = [
|
|
54
|
+
["Scan", scan ? `${scanStatusLabel(scan.status)} ${c.dim(relativeTime(scan.createdAt))}` : c.dim("never scanned")],
|
|
55
|
+
];
|
|
56
|
+
if (scan) {
|
|
57
|
+
if (scan.stage)
|
|
58
|
+
facts.push(["Stage", scan.stage]);
|
|
59
|
+
if (scan.fileCount) {
|
|
60
|
+
const done = scan.filesScanned ?? 0;
|
|
61
|
+
facts.push([
|
|
62
|
+
"Files",
|
|
63
|
+
`${progressBar(done, scan.fileCount, Math.min(24, width - 30))} ${done} / ${scan.fileCount}`,
|
|
64
|
+
]);
|
|
65
|
+
}
|
|
66
|
+
facts.push(["Findings", String(scan.findingCount)]);
|
|
67
|
+
if (scan.finishedAt)
|
|
68
|
+
facts.push(["Duration", elapsed(scan.createdAt, scan.finishedAt)]);
|
|
69
|
+
if (scan.error)
|
|
70
|
+
facts.push(["Error", c.red(scan.error)]);
|
|
71
|
+
}
|
|
72
|
+
facts.push(["Connected", relativeTime(project.connectedAt)]);
|
|
73
|
+
for (const row of keyValue(facts, 10))
|
|
74
|
+
push(row);
|
|
75
|
+
const languages = project.profile?.languages ?? [];
|
|
76
|
+
const frameworks = project.profile?.frameworks ?? [];
|
|
77
|
+
if (languages.length > 0 || frameworks.length > 0) {
|
|
78
|
+
push();
|
|
79
|
+
push(c.dim("DETECTED STACK"));
|
|
80
|
+
push();
|
|
81
|
+
if (languages.length > 0)
|
|
82
|
+
push(`${c.dim(padEnd("Languages", 12))}${languages.join(", ")}`);
|
|
83
|
+
if (frameworks.length > 0)
|
|
84
|
+
push(`${c.dim(padEnd("Frameworks", 12))}${frameworks.join(", ")}`);
|
|
85
|
+
}
|
|
86
|
+
if (project.htmlUrl) {
|
|
87
|
+
push();
|
|
88
|
+
push(c.dim(project.htmlUrl));
|
|
89
|
+
}
|
|
90
|
+
push();
|
|
91
|
+
return lines;
|
|
92
|
+
}
|
|
93
|
+
export async function statusCommand(globals, options = {}) {
|
|
94
|
+
const session = await openSession(globals, { auth: true });
|
|
95
|
+
const [me, github, listing, initial] = await Promise.all([
|
|
96
|
+
session.client.me(),
|
|
97
|
+
session.client.githubStatus().catch(() => null),
|
|
98
|
+
session.client.githubRepos().catch(() => null),
|
|
99
|
+
session.client.projects(),
|
|
100
|
+
]);
|
|
101
|
+
let projects = initial.projects;
|
|
102
|
+
const available = (listing?.repos ?? []).filter((repo) => !repo.connected);
|
|
103
|
+
if (out.isJsonMode()) {
|
|
104
|
+
out.json({ apiUrl: session.apiUrl, user: me.user, github, projects, available: available.length });
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
if (out.isPiped()) {
|
|
108
|
+
out.lines(headerLines(github, projects, me.user.email, session.apiUrl));
|
|
109
|
+
if (projects.length > 0) {
|
|
110
|
+
out.lines(renderTable(projects, [
|
|
111
|
+
{ header: "repository", value: (project) => project.fullName, min: 16 },
|
|
112
|
+
{ header: "status", value: (project) => scanStatusLabel(project.scan?.status), min: 8 },
|
|
113
|
+
{
|
|
114
|
+
header: "findings",
|
|
115
|
+
value: (project) => (project.scan ? String(project.scan.findingCount) : "-"),
|
|
116
|
+
align: "right",
|
|
117
|
+
min: 5,
|
|
118
|
+
},
|
|
119
|
+
{ header: "last scan", value: scanCell, min: 10 },
|
|
120
|
+
], { width: terminalWidth() - 4 }).map((row) => ` ${row}`));
|
|
121
|
+
}
|
|
122
|
+
out.line();
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
125
|
+
const scope = defaultScope();
|
|
126
|
+
const fallback = readRepoDefault(scope);
|
|
127
|
+
const buildRows = (list) => {
|
|
128
|
+
const rows = list.map((project) => ({ kind: "project", project }));
|
|
129
|
+
if (available.length > 0) {
|
|
130
|
+
rows.push({ kind: "divider" });
|
|
131
|
+
for (const repo of available.slice(0, 8))
|
|
132
|
+
rows.push({ kind: "available", repo });
|
|
133
|
+
}
|
|
134
|
+
return rows;
|
|
135
|
+
};
|
|
136
|
+
let followUp = null;
|
|
137
|
+
await browse(buildRows(projects), {
|
|
138
|
+
header: () => headerLines(github, projects, me.user.email, session.apiUrl),
|
|
139
|
+
renderRow: (row, selected, width) => {
|
|
140
|
+
if (row.kind === "divider") {
|
|
141
|
+
return ["", ` ${c.dim(glyph.rule.repeat(Math.max(8, width - 4)))}`];
|
|
142
|
+
}
|
|
143
|
+
const marker = selected ? c.cyan(glyph.arrow) : " ";
|
|
144
|
+
if (row.kind === "available") {
|
|
145
|
+
return [`${marker} ${c.dim(padEnd(row.repo.fullName, 34))}${c.dim("not connected")}`];
|
|
146
|
+
}
|
|
147
|
+
const project = row.project;
|
|
148
|
+
const isDefault = fallback?.githubRepoId === project.githubRepoId;
|
|
149
|
+
const name = selected ? c.bold(project.fullName) : project.fullName;
|
|
150
|
+
const findings = project.scan ? String(project.scan.findingCount) : "-";
|
|
151
|
+
return [
|
|
152
|
+
`${marker} ${padEnd(name + (isDefault ? c.cyan(" *") : ""), 34)}${padEnd(scanStatusLabel(project.scan?.status), 12)}${padEnd(findings, 10)}${c.dim(scanCell(project))}`,
|
|
153
|
+
];
|
|
154
|
+
},
|
|
155
|
+
renderDetail: (row, width) => row.kind === "project"
|
|
156
|
+
? projectDetail(row.project, width)
|
|
157
|
+
: row.kind === "available"
|
|
158
|
+
? ["", ` ${c.bold(row.repo.fullName)} is not connected.`, "", ` ${c.dim("Press c to connect it.")}`, ""]
|
|
159
|
+
: [""],
|
|
160
|
+
filterText: (row) => row.kind === "project" ? row.project.fullName : row.kind === "available" ? row.repo.fullName : "",
|
|
161
|
+
emptyMessage: "No repositories are connected. Run cf repo connect.",
|
|
162
|
+
refresh: async () => {
|
|
163
|
+
const next = await session.client.projects();
|
|
164
|
+
projects = next.projects;
|
|
165
|
+
return buildRows(projects);
|
|
166
|
+
},
|
|
167
|
+
refreshIntervalMs: 2000,
|
|
168
|
+
shouldKeepRefreshing: () => options.watch === true || projects.some(isActive),
|
|
169
|
+
actions: [
|
|
170
|
+
{
|
|
171
|
+
key: "f",
|
|
172
|
+
label: "findings",
|
|
173
|
+
run: (row, context) => {
|
|
174
|
+
if (row?.kind !== "project")
|
|
175
|
+
return;
|
|
176
|
+
followUp = { action: "findings", project: row.project };
|
|
177
|
+
context.close();
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
key: "r",
|
|
182
|
+
label: "rescan",
|
|
183
|
+
run: async (row, context) => {
|
|
184
|
+
if (row?.kind !== "project")
|
|
185
|
+
return;
|
|
186
|
+
followUp = { action: "scan", project: row.project };
|
|
187
|
+
context.close();
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
key: "o",
|
|
192
|
+
label: "open",
|
|
193
|
+
run: (row) => {
|
|
194
|
+
const url = row?.kind === "project" ? row.project.htmlUrl : row?.kind === "available" ? row.repo.htmlUrl : null;
|
|
195
|
+
if (url)
|
|
196
|
+
void open(url).catch(() => undefined);
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
key: "d",
|
|
201
|
+
label: "disconnect",
|
|
202
|
+
run: async (row, context) => {
|
|
203
|
+
if (row?.kind !== "project")
|
|
204
|
+
return;
|
|
205
|
+
const project = row.project;
|
|
206
|
+
const confirmed = await context.suspend(async () => {
|
|
207
|
+
out.line();
|
|
208
|
+
out.warn(`Disconnecting ${c.bold(project.fullName)} removes its scan history from Cefense.`);
|
|
209
|
+
out.line();
|
|
210
|
+
return confirmByTyping({
|
|
211
|
+
message: `Type ${project.fullName} to confirm`,
|
|
212
|
+
expected: project.fullName,
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
if (!confirmed) {
|
|
216
|
+
context.setStatus("Left connected.");
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
await session.client.disconnectRepo(project.githubRepoId);
|
|
220
|
+
await context.refresh();
|
|
221
|
+
context.setStatus(`Disconnected ${project.fullName}`);
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
key: "c",
|
|
226
|
+
label: "connect",
|
|
227
|
+
run: async (row, context) => {
|
|
228
|
+
if (row?.kind !== "available")
|
|
229
|
+
return;
|
|
230
|
+
const repo = row.repo;
|
|
231
|
+
await session.client.connectRepo(repo);
|
|
232
|
+
await context.refresh();
|
|
233
|
+
context.setStatus(`Connected ${repo.fullName}. A first scan has started.`);
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
],
|
|
237
|
+
});
|
|
238
|
+
const pending = followUp;
|
|
239
|
+
if (pending?.action === "findings") {
|
|
240
|
+
return observedCommand({ ...globals, repo: pending.project.fullName }, {});
|
|
241
|
+
}
|
|
242
|
+
if (pending?.action === "scan") {
|
|
243
|
+
await session.client.startScan(pending.project.githubRepoId);
|
|
244
|
+
out.line();
|
|
245
|
+
await watchScan(session.client, pending.project.githubRepoId, pending.project.fullName);
|
|
246
|
+
out.line();
|
|
247
|
+
}
|
|
248
|
+
return 0;
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { Article, ArticleDetail, ArticlesResponse, BillingCatalog, BillingFeature, BillingMe, CefenseProfile, CliConfigResponse, Fix, FindingsResponse, GithubRepo, GithubReposResponse, GithubStatus, HealthResponse, MeResponse, ProfileResponse, Project, ReferralsResponse, StoredCredentials } from "./types.js";
|
|
2
|
+
interface RequestOptions {
|
|
3
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
4
|
+
body?: unknown;
|
|
5
|
+
signal?: AbortSignal;
|
|
6
|
+
allowUnauthenticated?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class CefenseClient {
|
|
9
|
+
readonly apiUrl: string;
|
|
10
|
+
readonly config: CliConfigResponse | null;
|
|
11
|
+
private credentials;
|
|
12
|
+
private refreshing;
|
|
13
|
+
constructor(options: {
|
|
14
|
+
apiUrl: string;
|
|
15
|
+
config?: CliConfigResponse | null;
|
|
16
|
+
credentials?: StoredCredentials | null;
|
|
17
|
+
});
|
|
18
|
+
get authenticated(): boolean;
|
|
19
|
+
get token(): string | null;
|
|
20
|
+
get refreshToken(): string | null;
|
|
21
|
+
private renew;
|
|
22
|
+
request<T>(method: string, path: string, options?: RequestOptions): Promise<T>;
|
|
23
|
+
private toError;
|
|
24
|
+
health(): Promise<HealthResponse>;
|
|
25
|
+
me(): Promise<MeResponse>;
|
|
26
|
+
githubStatus(): Promise<GithubStatus>;
|
|
27
|
+
githubRepos(): Promise<GithubReposResponse>;
|
|
28
|
+
projects(): Promise<{
|
|
29
|
+
projects: Project[];
|
|
30
|
+
}>;
|
|
31
|
+
connectRepo(repo: GithubRepo): Promise<{
|
|
32
|
+
project: Project;
|
|
33
|
+
scanId: string;
|
|
34
|
+
}>;
|
|
35
|
+
disconnectRepo(githubRepoId: string): Promise<{
|
|
36
|
+
ok: boolean;
|
|
37
|
+
}>;
|
|
38
|
+
disconnectGithubAccount(): Promise<{
|
|
39
|
+
ok: boolean;
|
|
40
|
+
}>;
|
|
41
|
+
startScan(githubRepoId: string): Promise<{
|
|
42
|
+
scanId: string;
|
|
43
|
+
}>;
|
|
44
|
+
findings(githubRepoId: string, query?: {
|
|
45
|
+
limit?: number;
|
|
46
|
+
offset?: number;
|
|
47
|
+
severity?: string;
|
|
48
|
+
category?: string;
|
|
49
|
+
matched?: boolean;
|
|
50
|
+
}): Promise<FindingsResponse>;
|
|
51
|
+
fixForFinding(findingId: string): Promise<{
|
|
52
|
+
fix: Fix | null;
|
|
53
|
+
}>;
|
|
54
|
+
fixesForScan(scanId: string): Promise<{
|
|
55
|
+
fixes: Fix[];
|
|
56
|
+
}>;
|
|
57
|
+
generateFix(findingId: string): Promise<{
|
|
58
|
+
fix: Fix;
|
|
59
|
+
}>;
|
|
60
|
+
publishFix(findingId: string): Promise<{
|
|
61
|
+
fix: Fix;
|
|
62
|
+
}>;
|
|
63
|
+
articles(query?: {
|
|
64
|
+
limit?: number;
|
|
65
|
+
offset?: number;
|
|
66
|
+
githubRepoId?: string;
|
|
67
|
+
}): Promise<ArticlesResponse>;
|
|
68
|
+
article(id: string): Promise<{
|
|
69
|
+
article: ArticleDetail;
|
|
70
|
+
}>;
|
|
71
|
+
profile(): Promise<ProfileResponse>;
|
|
72
|
+
saveProfile(body: Partial<CefenseProfile>): Promise<{
|
|
73
|
+
profile: CefenseProfile;
|
|
74
|
+
}>;
|
|
75
|
+
billing(): Promise<BillingMe>;
|
|
76
|
+
billingCatalog(): Promise<BillingCatalog>;
|
|
77
|
+
checkout(feature: BillingFeature): Promise<{
|
|
78
|
+
url: string;
|
|
79
|
+
}>;
|
|
80
|
+
billingPortal(): Promise<{
|
|
81
|
+
url: string;
|
|
82
|
+
}>;
|
|
83
|
+
referrals(): Promise<ReferralsResponse>;
|
|
84
|
+
redeem(code: string): Promise<unknown>;
|
|
85
|
+
}
|
|
86
|
+
export type { Article, Project, Fix };
|
|
87
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { CefenseError, AuthRequiredError, FeatureRequiredError } from "./errors.js";
|
|
2
|
+
import { refreshCredentials } from "./oauth.js";
|
|
3
|
+
import { saveCredentials } from "./credentials.js";
|
|
4
|
+
import { USER_AGENT } from "../version.js";
|
|
5
|
+
const RETRYABLE = new Set([429, 502, 503, 504]);
|
|
6
|
+
const MAX_ATTEMPTS = 3;
|
|
7
|
+
function sleep(ms) {
|
|
8
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
9
|
+
}
|
|
10
|
+
function backoffDelay(attempt, retryAfter) {
|
|
11
|
+
if (retryAfter) {
|
|
12
|
+
const seconds = Number.parseInt(retryAfter, 10);
|
|
13
|
+
if (Number.isFinite(seconds) && seconds >= 0)
|
|
14
|
+
return Math.min(seconds * 1000, 15_000);
|
|
15
|
+
}
|
|
16
|
+
return Math.min(2 ** attempt * 250, 4000) + Math.floor(Math.random() * 200);
|
|
17
|
+
}
|
|
18
|
+
export class CefenseClient {
|
|
19
|
+
apiUrl;
|
|
20
|
+
config;
|
|
21
|
+
credentials;
|
|
22
|
+
refreshing = null;
|
|
23
|
+
constructor(options) {
|
|
24
|
+
this.apiUrl = options.apiUrl;
|
|
25
|
+
this.config = options.config ?? null;
|
|
26
|
+
this.credentials = options.credentials ?? null;
|
|
27
|
+
}
|
|
28
|
+
get authenticated() {
|
|
29
|
+
return Boolean(this.credentials?.accessToken);
|
|
30
|
+
}
|
|
31
|
+
get token() {
|
|
32
|
+
return this.credentials?.accessToken ?? null;
|
|
33
|
+
}
|
|
34
|
+
get refreshToken() {
|
|
35
|
+
return this.credentials?.refreshToken ?? null;
|
|
36
|
+
}
|
|
37
|
+
async renew() {
|
|
38
|
+
if (!this.config || !this.credentials?.refreshToken) {
|
|
39
|
+
throw new AuthRequiredError("Your session has expired.");
|
|
40
|
+
}
|
|
41
|
+
if (!this.refreshing) {
|
|
42
|
+
const refreshToken = this.credentials.refreshToken;
|
|
43
|
+
this.refreshing = refreshCredentials(this.config, refreshToken)
|
|
44
|
+
.then(async (next) => {
|
|
45
|
+
const merged = {
|
|
46
|
+
...next,
|
|
47
|
+
subject: this.credentials?.subject ?? null,
|
|
48
|
+
email: this.credentials?.email ?? null,
|
|
49
|
+
};
|
|
50
|
+
this.credentials = merged;
|
|
51
|
+
await saveCredentials(this.apiUrl, merged);
|
|
52
|
+
return merged;
|
|
53
|
+
})
|
|
54
|
+
.finally(() => {
|
|
55
|
+
this.refreshing = null;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return this.refreshing;
|
|
59
|
+
}
|
|
60
|
+
async request(method, path, options = {}) {
|
|
61
|
+
const url = new URL(path, this.apiUrl);
|
|
62
|
+
for (const [key, value] of Object.entries(options.query ?? {})) {
|
|
63
|
+
if (value !== undefined)
|
|
64
|
+
url.searchParams.set(key, String(value));
|
|
65
|
+
}
|
|
66
|
+
if (!options.allowUnauthenticated && !this.credentials?.accessToken) {
|
|
67
|
+
throw new AuthRequiredError();
|
|
68
|
+
}
|
|
69
|
+
let renewed = false;
|
|
70
|
+
for (let attempt = 0;; attempt += 1) {
|
|
71
|
+
const headers = {
|
|
72
|
+
accept: "application/json",
|
|
73
|
+
"user-agent": USER_AGENT,
|
|
74
|
+
};
|
|
75
|
+
if (this.credentials?.accessToken) {
|
|
76
|
+
headers.authorization = `Bearer ${this.credentials.accessToken}`;
|
|
77
|
+
}
|
|
78
|
+
if (options.body !== undefined)
|
|
79
|
+
headers["content-type"] = "application/json";
|
|
80
|
+
let response;
|
|
81
|
+
try {
|
|
82
|
+
response = await fetch(url, {
|
|
83
|
+
method,
|
|
84
|
+
headers,
|
|
85
|
+
body: options.body === undefined ? undefined : JSON.stringify(options.body),
|
|
86
|
+
signal: options.signal ?? AbortSignal.timeout(60_000),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (cause) {
|
|
90
|
+
if (method === "GET" && attempt + 1 < MAX_ATTEMPTS) {
|
|
91
|
+
await sleep(backoffDelay(attempt, null));
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
throw new CefenseError(`Could not reach ${url.origin}.`, {
|
|
95
|
+
remedy: "Check your connection, or point somewhere else with --api-url.",
|
|
96
|
+
cause,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (response.status === 401 && !renewed && this.credentials?.refreshToken && this.config) {
|
|
100
|
+
renewed = true;
|
|
101
|
+
await this.renew();
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (RETRYABLE.has(response.status) && method === "GET" && attempt + 1 < MAX_ATTEMPTS) {
|
|
105
|
+
await sleep(backoffDelay(attempt, response.headers.get("retry-after")));
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (response.ok) {
|
|
109
|
+
if (response.status === 204)
|
|
110
|
+
return undefined;
|
|
111
|
+
const text = await response.text();
|
|
112
|
+
return (text ? JSON.parse(text) : undefined);
|
|
113
|
+
}
|
|
114
|
+
throw await this.toError(response, url);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async toError(response, url) {
|
|
118
|
+
let payload = {};
|
|
119
|
+
try {
|
|
120
|
+
payload = (await response.json());
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
payload = {};
|
|
124
|
+
}
|
|
125
|
+
const message = typeof payload.error === "string" ? payload.error : null;
|
|
126
|
+
const webUrl = this.config?.webUrl ?? this.apiUrl;
|
|
127
|
+
if (response.status === 401) {
|
|
128
|
+
return new AuthRequiredError("Your session has expired.");
|
|
129
|
+
}
|
|
130
|
+
if (response.status === 403 && payload.code === "feature_required") {
|
|
131
|
+
return new FeatureRequiredError(String(payload.feature ?? "required"), typeof payload.pricingUrl === "string" ? payload.pricingUrl : null, webUrl);
|
|
132
|
+
}
|
|
133
|
+
if (response.status === 404) {
|
|
134
|
+
return new CefenseError(message ?? "Not found.", {
|
|
135
|
+
remedy: "Check the repository is connected with cf repo list.",
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
if (response.status === 409) {
|
|
139
|
+
return new CefenseError(message ?? "The request conflicted with the current state.", {
|
|
140
|
+
remedy: /github/i.test(message ?? "")
|
|
141
|
+
? `Reconnect GitHub at ${webUrl}/app/repositories.`
|
|
142
|
+
: null,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
if (response.status === 503) {
|
|
146
|
+
return new CefenseError(message ?? "The Cefense API is not fully configured.", {
|
|
147
|
+
remedy: "Run cf doctor to see what is missing.",
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return new CefenseError(message ?? `${url.pathname} returned ${response.status}.`);
|
|
151
|
+
}
|
|
152
|
+
health() {
|
|
153
|
+
return this.request("GET", "/health", { allowUnauthenticated: true });
|
|
154
|
+
}
|
|
155
|
+
me() {
|
|
156
|
+
return this.request("GET", "/api/me");
|
|
157
|
+
}
|
|
158
|
+
githubStatus() {
|
|
159
|
+
return this.request("GET", "/api/github/status");
|
|
160
|
+
}
|
|
161
|
+
githubRepos() {
|
|
162
|
+
return this.request("GET", "/api/github/repos");
|
|
163
|
+
}
|
|
164
|
+
projects() {
|
|
165
|
+
return this.request("GET", "/api/github/projects");
|
|
166
|
+
}
|
|
167
|
+
connectRepo(repo) {
|
|
168
|
+
return this.request("POST", "/api/github/repos/connect", {
|
|
169
|
+
body: {
|
|
170
|
+
githubRepoId: repo.githubRepoId,
|
|
171
|
+
fullName: repo.fullName,
|
|
172
|
+
name: repo.name,
|
|
173
|
+
owner: repo.owner,
|
|
174
|
+
private: repo.private,
|
|
175
|
+
defaultBranch: repo.defaultBranch,
|
|
176
|
+
htmlUrl: repo.htmlUrl,
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
disconnectRepo(githubRepoId) {
|
|
181
|
+
return this.request("POST", "/api/github/repos/disconnect", { body: { githubRepoId } });
|
|
182
|
+
}
|
|
183
|
+
disconnectGithubAccount() {
|
|
184
|
+
return this.request("POST", "/api/github/account/disconnect");
|
|
185
|
+
}
|
|
186
|
+
startScan(githubRepoId) {
|
|
187
|
+
return this.request("POST", `/api/github/projects/${encodeURIComponent(githubRepoId)}/scan`);
|
|
188
|
+
}
|
|
189
|
+
findings(githubRepoId, query = {}) {
|
|
190
|
+
return this.request("GET", `/api/github/projects/${encodeURIComponent(githubRepoId)}/findings`, { query });
|
|
191
|
+
}
|
|
192
|
+
fixForFinding(findingId) {
|
|
193
|
+
return this.request("GET", `/api/fix/findings/${encodeURIComponent(findingId)}`);
|
|
194
|
+
}
|
|
195
|
+
fixesForScan(scanId) {
|
|
196
|
+
return this.request("GET", `/api/fix/scans/${encodeURIComponent(scanId)}`);
|
|
197
|
+
}
|
|
198
|
+
generateFix(findingId) {
|
|
199
|
+
return this.request("POST", `/api/fix/findings/${encodeURIComponent(findingId)}/generate`);
|
|
200
|
+
}
|
|
201
|
+
publishFix(findingId) {
|
|
202
|
+
return this.request("POST", `/api/fix/findings/${encodeURIComponent(findingId)}/publish`);
|
|
203
|
+
}
|
|
204
|
+
articles(query = {}) {
|
|
205
|
+
return this.request("GET", "/api/articles", { query });
|
|
206
|
+
}
|
|
207
|
+
article(id) {
|
|
208
|
+
return this.request("GET", `/api/articles/${encodeURIComponent(id)}`);
|
|
209
|
+
}
|
|
210
|
+
profile() {
|
|
211
|
+
return this.request("GET", "/api/profile");
|
|
212
|
+
}
|
|
213
|
+
saveProfile(body) {
|
|
214
|
+
return this.request("POST", "/api/profile", { body });
|
|
215
|
+
}
|
|
216
|
+
billing() {
|
|
217
|
+
return this.request("GET", "/api/billing/me");
|
|
218
|
+
}
|
|
219
|
+
billingCatalog() {
|
|
220
|
+
return this.request("GET", "/api/billing/catalog", { allowUnauthenticated: true });
|
|
221
|
+
}
|
|
222
|
+
checkout(feature) {
|
|
223
|
+
return this.request("POST", "/api/billing/checkout", { body: { feature } });
|
|
224
|
+
}
|
|
225
|
+
billingPortal() {
|
|
226
|
+
return this.request("POST", "/api/billing/portal");
|
|
227
|
+
}
|
|
228
|
+
referrals() {
|
|
229
|
+
return this.request("GET", "/api/referrals/me");
|
|
230
|
+
}
|
|
231
|
+
redeem(code) {
|
|
232
|
+
return this.request("POST", "/api/referrals/redeem", { body: { code } });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CliConfigResponse } from "./types.js";
|
|
2
|
+
export declare const DEFAULT_API_URL = "https://cefense.com";
|
|
3
|
+
export interface CliPreferences {
|
|
4
|
+
apiUrl?: string;
|
|
5
|
+
colour?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface RepoDefault {
|
|
8
|
+
githubRepoId: string;
|
|
9
|
+
fullName: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function dataDir(): string;
|
|
12
|
+
export declare function ensureDataDir(): string;
|
|
13
|
+
export declare function readPreferences(): CliPreferences;
|
|
14
|
+
export declare function writePreferences(preferences: CliPreferences): void;
|
|
15
|
+
export declare function normaliseApiUrl(value: string): string;
|
|
16
|
+
export declare function resolveApiUrl(flag?: string): string;
|
|
17
|
+
export declare function readRepoDefault(scope: string): RepoDefault | null;
|
|
18
|
+
export declare function writeRepoDefault(scope: string, value: RepoDefault): void;
|
|
19
|
+
export declare function clearRepoDefault(scope: string): boolean;
|
|
20
|
+
export declare function readCachedDiscovery(apiUrl: string): CliConfigResponse | null;
|
|
21
|
+
export declare function writeCachedDiscovery(apiUrl: string, config: CliConfigResponse): void;
|
|
22
|
+
export declare function credentialsFilePath(): string;
|
|
23
|
+
export declare function removeCredentialsFile(): void;
|
|
24
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,eAAe,wBAAwB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAmBD,wBAAgB,eAAe,IAAI,cAAc,CAEhD;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,cAAc,GAAG,IAAI,CAElE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAID,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAEjE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAIxE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAMvD;AAMD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAK5E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAIpF;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAM5C"}
|