-
Notifications
You must be signed in to change notification settings - Fork 66
/
slack.go
108 lines (95 loc) · 2.83 KB
/
slack.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package plugins
import (
"bytes"
"encoding/json"
"github.com/aquasecurity/postee/data"
"github.com/aquasecurity/postee/formatting"
"github.com/aquasecurity/postee/layout"
"github.com/aquasecurity/postee/settings"
"log"
"strings"
slackAPI "github.com/aquasecurity/postee/slack"
)
const (
slackBlockLimit = 49
)
type SlackPlugin struct {
Url string
SlackSettings *settings.Settings
slackLayout layout.LayoutProvider
}
func (slack *SlackPlugin) Init() error {
slack.slackLayout = new(formatting.SlackMrkdwnProvider)
log.Printf("Starting Slack plugin %q....", slack.SlackSettings.PluginName)
return nil
}
func clearSlackText(text string) string {
s := strings.ReplaceAll(text, "&", "&")
s = strings.ReplaceAll(s, "<", "<")
s = strings.ReplaceAll(s, ">", ">")
return s
}
func buildSlackBlock(title string, data []byte) []byte {
var content bytes.Buffer
content.WriteByte('{')
content.WriteString("\"blocks\":")
content.WriteByte('[')
content.WriteString(title)
content.Write(data)
content.WriteByte(']')
content.WriteByte('}')
return content.Bytes()
}
func (slack *SlackPlugin) Send(input map[string]string) error {
log.Printf("Sending via Slack %q", slack.SlackSettings.PluginName)
title := clearSlackText(slack.slackLayout.TitleH2(input["title"]))
var body string
if strings.HasSuffix(input["description"], ",") {
body = strings.TrimSuffix(input["description"], ",")
} else {
body = input["description"]
}
body = "[" + clearSlackText(body) + "]"
rawBlock := make([]data.SlackBlock, 0)
err := json.Unmarshal([]byte(body), &rawBlock)
if err != nil {
log.Printf("Unmarshal slack sending error: %v", err)
return err
}
length := len(rawBlock)
if length >= slackBlockLimit {
message := buildShortMessage(slack.SlackSettings.AquaServer, input["url"], slack.slackLayout)
if err := slackAPI.SendToUrl(slack.Url, buildSlackBlock(title, []byte(message))); err != nil {
log.Printf("Slack Sending Error: %v", err)
}
log.Printf("Sending via Slack %q was successful!", slack.SlackSettings.PluginName)
} else {
for n := 0; n < length; {
d := length - n
if d >= 49 {
d = 49
}
cutData, _ := json.Marshal(rawBlock[n : n+d])
cutData = cutData[1 : len(cutData)-1]
if err := slackAPI.SendToUrl(slack.Url, buildSlackBlock(title, cutData)); err != nil {
log.Printf("Slack Sending Error: %v", err)
} else {
log.Printf("Sending [%d/%d part] to %q was successful!",
int(n/49)+1, int(length/49)+1,
slack.SlackSettings.PluginName)
}
n += d
}
}
return nil
}
func (slack *SlackPlugin) Terminate() error {
log.Printf("Slack plugin %q terminated", slack.SlackSettings.PluginName)
return nil
}
func (slack *SlackPlugin) GetLayoutProvider() layout.LayoutProvider {
return slack.slackLayout
}
func (slack *SlackPlugin) GetSettings() *settings.Settings {
return slack.SlackSettings
}