mirror of
https://github.com/lunchcat/sif.git
synced 2026-06-12 11:01:24 -07:00
8078978a44
ship findings to chat/webhook sinks after a scan so continuous recon can alert on what it turns up. each provider is one POST through httpx.Client, so the global proxy/rate-limit/header config applies and there's no extra http stack. config resolves env-first (SLACK_WEBHOOK_URL, DISCORD_WEBHOOK_URL, TELEGRAM_BOT_TOKEN/TELEGRAM_CHAT_ID, NOTIFY_WEBHOOK_URL), overridable by a notify-compatible yaml file so existing projectdiscovery/notify configs port over. -notify enables it, -notify-severity gates on the finding severity ladder (default medium), -notify-config points at the yaml. wired after the scan loop on the severity-filtered finding set; no provider configured is a silent no-op.
46 lines
2.1 KiB
Go
46 lines
2.1 KiB
Go
/*
|
|
·━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━·
|
|
: :
|
|
: █▀ █ █▀▀ · Blazing-fast pentesting suite :
|
|
: ▄█ █ █▀ · BSD 3-Clause License :
|
|
: :
|
|
: (c) 2022-2026 vmfunc, xyzeva, :
|
|
: lunchcat alumni & contributors :
|
|
: :
|
|
·━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━·
|
|
*/
|
|
|
|
package notify
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
|
|
"github.com/dropalldatabases/sif/internal/finding"
|
|
)
|
|
|
|
// slackProvider posts to a slack incoming webhook. the webhook url already pins
|
|
// the channel, so the payload is just the rendered text in slack's mrkdwn-aware
|
|
// "text" field wrapped in a code block to keep the fixed-width finding lines.
|
|
type slackProvider struct {
|
|
webhook string
|
|
}
|
|
|
|
func (s *slackProvider) name() string { return "slack" }
|
|
|
|
// slackPayload is the minimal incoming-webhook body: a single text field.
|
|
type slackPayload struct {
|
|
Text string `json:"text"`
|
|
}
|
|
|
|
func (s *slackProvider) send(ctx context.Context, client *http.Client, findings []finding.Finding) error {
|
|
payload := slackPayload{Text: codeBlock(renderFindings(findings))}
|
|
return postJSON(ctx, client, s.webhook, payload)
|
|
}
|
|
|
|
// codeBlock wraps body in a triple-backtick fence; both slack and discord render
|
|
// it fixed-width, which preserves the column-aligned finding lines.
|
|
func codeBlock(body string) string {
|
|
return "```\n" + body + "```"
|
|
}
|