1
- from . base import Plugin
1
+ import logging
2
2
import 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
+
3
10
4
11
class 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 ):
6
17
if not self .config .get ("enabled" , False ):
7
18
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." )
9
27
return
10
28
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