1- from . base import Plugin
1+ import logging
22import requests
3+ from config import CliConfig
4+ from .base import Plugin
5+ from socketsecurity .core .classes import Diff
6+ from socketsecurity .core .messages import Messages
7+
8+ logger = logging .getLogger (__name__ )
9+
310
411class SlackPlugin (Plugin ):
5- def send (self , message , level ):
12+ @staticmethod
13+ def get_name ():
14+ return "slack"
15+
16+ def send (self , diff , config : CliConfig ):
617 if not self .config .get ("enabled" , False ):
718 return
8- if level not in self .config .get ("levels" , ["block" , "warn" ]):
19+ if not self .config .get ("url" ):
20+ logger .warning ("Slack webhook URL not configured." )
21+ return
22+ else :
23+ url = self .config .get ("url" )
24+
25+ if not diff .new_alerts :
26+ logger .debug ("No new alerts to notify via Slack." )
927 return
1028
11- payload = {"text" : message .get ("title" , "No title" )}
12- requests .post (self .config ["webhook_url" ], json = payload )
29+ logger .debug ("Slack Plugin Enabled" )
30+ logger .debug ("Alert levels: %s" , self .config .get ("levels" ))
31+
32+ message = self .create_slack_blocks_from_diff (diff , config )
33+ logger .debug (f"Sending message to { url } " )
34+ response = requests .post (
35+ url ,
36+ json = {"blocks" : message }
37+ )
38+
39+ if response .status_code >= 400 :
40+ logger .error ("Slack error %s: %s" , response .status_code , response .text )
41+
42+ @staticmethod
43+ def create_slack_blocks_from_diff (diff : Diff , config : CliConfig ):
44+ pr = getattr (config , "pr_number" , None )
45+ sha = getattr (config , "commit_sha" , None )
46+ scan_link = getattr (diff , "diff_url" , "" )
47+ scan = f"<{ scan_link } |scan>"
48+ title_part = ""
49+ if pr :
50+ title_part += f" for PR { pr } "
51+ if sha :
52+ title_part += f" - { sha [:8 ]} "
53+ blocks = [
54+ {
55+ "type" : "section" ,
56+ "text" : {
57+ "type" : "mrkdwn" ,
58+ "text" : f"*Socket Security issues were found in this *{ scan } *{ title_part } *"
59+ }
60+ },
61+ {"type" : "divider" }
62+ ]
63+
64+ for alert in diff .new_alerts :
65+ manifest_str , source_str = Messages .create_sources (alert , "plain" )
66+ manifest_str = manifest_str .lstrip ("• " )
67+ source_str = source_str .lstrip ("• " )
68+ blocks .append ({
69+ "type" : "section" ,
70+ "text" : {
71+ "type" : "mrkdwn" ,
72+ "text" : (
73+ f"*{ alert .title } *\n "
74+ f"<{ alert .url } |{ alert .purl } >\n "
75+ f"*Introduced by:* `{ source_str } `\n "
76+ f"*Manifest:* `{ manifest_str } `\n "
77+ f"*CI Status:* { 'Block' if alert .error else 'Warn' } "
78+ )
79+ }
80+ })
81+ blocks .append ({"type" : "divider" })
82+
83+ return blocks
0 commit comments