fix: dedupe catalogued artifact findings
This commit is contained in:
@@ -1553,14 +1553,14 @@ function visibleFindingsForRun(
|
||||
const artifactFindings = arrayRecords(artifactSummary.findings)
|
||||
.slice(0, limit)
|
||||
.map((item) => enrichFindingWithCheck(config, compactStoredFinding(item)));
|
||||
return mergeVisibleFindings(storedFindings, artifactFindings, limit);
|
||||
return mergeVisibleFindings(config, storedFindings, artifactFindings, limit);
|
||||
}
|
||||
|
||||
function mergeVisibleFindings(primary: readonly Record<string, unknown>[], artifact: readonly Record<string, unknown>[], limit: number): readonly Record<string, unknown>[] {
|
||||
function mergeVisibleFindings(config: WebProbeSentinelServiceConfig, primary: readonly Record<string, unknown>[], artifact: readonly Record<string, unknown>[], limit: number): readonly Record<string, unknown>[] {
|
||||
const merged: Record<string, unknown>[] = [];
|
||||
const seen = new Set<string>();
|
||||
for (const item of [...primary, ...artifact]) {
|
||||
const id = canonicalFindingIdentity(item);
|
||||
const id = canonicalFindingIdentity(config, item);
|
||||
const key = id ?? `${JSON.stringify(item).slice(0, 160)}:${stringOrNull(item.severity) ?? stringOrNull(item.level) ?? ""}`;
|
||||
if (seen.has(key)) continue;
|
||||
seen.add(key);
|
||||
@@ -1570,13 +1570,20 @@ function mergeVisibleFindings(primary: readonly Record<string, unknown>[], artif
|
||||
return merged;
|
||||
}
|
||||
|
||||
function canonicalFindingIdentity(item: Record<string, unknown>): string | null {
|
||||
function canonicalFindingIdentity(config: WebProbeSentinelServiceConfig, item: Record<string, unknown>): string | null {
|
||||
const check = record(item.check);
|
||||
return stringOrNull(item.checkCode)
|
||||
?? stringOrNull(check.code)
|
||||
?? stringOrNull(item.checkId)
|
||||
?? stringOrNull(check.id)
|
||||
?? findingIdentity(item);
|
||||
const explicitCheckCode = stringOrNull(item.checkCode) ?? stringOrNull(check.code);
|
||||
if (explicitCheckCode !== null) return explicitCheckCode;
|
||||
const catalog = checkCatalogById(config);
|
||||
const explicitCheckId = stringOrNull(item.checkId) ?? stringOrNull(check.id);
|
||||
if (explicitCheckId !== null) {
|
||||
const entry = catalog.get(explicitCheckId);
|
||||
return stringOrNull(entry?.code) ?? stringOrNull(entry?.id) ?? explicitCheckId;
|
||||
}
|
||||
const findingId = findingIdentity(item);
|
||||
if (findingId === null) return null;
|
||||
const entry = catalog.get(findingId);
|
||||
return stringOrNull(entry?.code) ?? stringOrNull(entry?.id) ?? findingId;
|
||||
}
|
||||
|
||||
function findingIdentity(item: Record<string, unknown>): string | null {
|
||||
|
||||
Reference in New Issue
Block a user