62 lines
2.9 KiB
JavaScript
62 lines
2.9 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.OnFindingCreated = void 0;
|
|
const SlackProvider_1 = require("../../infrastructure/providers/SlackProvider");
|
|
const GitHubIssuesProvider_1 = require("../../infrastructure/providers/GitHubIssuesProvider");
|
|
const JiraProvider_1 = require("../../infrastructure/providers/JiraProvider");
|
|
class OnFindingCreated {
|
|
constructor(integrationRepo, webhookRepo, dispatcher, logger) {
|
|
this.integrationRepo = integrationRepo;
|
|
this.webhookRepo = webhookRepo;
|
|
this.dispatcher = dispatcher;
|
|
this.logger = logger;
|
|
}
|
|
async handle(event) {
|
|
const payload = event.payload;
|
|
const finding = {
|
|
id: payload.findingId,
|
|
title: `${payload.type} finding`,
|
|
severity: payload.severity,
|
|
type: payload.type,
|
|
description: payload.description,
|
|
sessionId: payload.sessionId,
|
|
};
|
|
// Dispatch to custom webhooks
|
|
await this.dispatcher.dispatchFinding(finding);
|
|
// Dispatch to named integrations (Slack, GitHub, Jira)
|
|
const integrations = await this.integrationRepo.findEnabled();
|
|
for (const integration of integrations) {
|
|
try {
|
|
const minSev = integration.config.minSeverity ?? 'low';
|
|
if (!severityMeetsThreshold(payload.severity, minSev))
|
|
continue;
|
|
const type = integration.type.value;
|
|
if (type === 'slack' && integration.config.webhookUrl) {
|
|
const provider = new SlackProvider_1.SlackProvider(integration.config.webhookUrl);
|
|
await provider.sendFinding(finding);
|
|
}
|
|
else if (type === 'github' && integration.config.token && integration.config.repo) {
|
|
const provider = new GitHubIssuesProvider_1.GitHubIssuesProvider(integration.config.token, integration.config.repo);
|
|
await provider.sendFinding(finding);
|
|
}
|
|
else if (type === 'jira' &&
|
|
integration.config.host &&
|
|
integration.config.token &&
|
|
integration.config.username &&
|
|
integration.config.projectKey) {
|
|
const provider = new JiraProvider_1.JiraProvider(integration.config.host, integration.config.token, integration.config.username, integration.config.projectKey);
|
|
await provider.sendFinding(finding);
|
|
}
|
|
}
|
|
catch (err) {
|
|
this.logger.warn({ integrationId: integration.id.toString(), err }, 'Integration dispatch failed');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
exports.OnFindingCreated = OnFindingCreated;
|
|
const SEVERITY_ORDER = ['low', 'medium', 'high', 'critical'];
|
|
function severityMeetsThreshold(severity, min) {
|
|
return SEVERITY_ORDER.indexOf(severity) >= SEVERITY_ORDER.indexOf(min);
|
|
}
|