/
dependencytrack.go
77 lines (61 loc) · 1.82 KB
/
dependencytrack.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
package actions
import (
"context"
"encoding/base64"
"encoding/json"
"fmt"
"log"
"strings"
dtrack "github.com/DependencyTrack/client-go"
"github.com/khulnasoft-lab/hooker/v2/formatting"
"github.com/khulnasoft-lab/hooker/v2/layout"
)
type DependencyTrackAction struct {
Name string
Url string
APIKey string
}
func (dta *DependencyTrackAction) GetName() string {
return dta.Name
}
func (dta *DependencyTrackAction) Init() error {
log.Printf("Starting Dependency Track action %s, for sending to %s", dta.Name, dta.Url)
return nil
}
func (dta *DependencyTrackAction) Send(content map[string]string) error {
project, ok := content["title"]
if !ok && project == "" {
return fmt.Errorf("title key not found")
}
projectAndVersion := strings.SplitN(project, ":", 2)
if len(projectAndVersion) != 2 {
return fmt.Errorf("title key has wrong format")
}
bom, err := json.Marshal(json.RawMessage(content["description"]))
if err != nil {
return fmt.Errorf("description key has wrong format: %w", err)
}
client, err := dtrack.NewClient(dta.Url, dtrack.WithAPIKey(dta.APIKey))
if err != nil {
return fmt.Errorf("failed to create dependency track client: %w", err)
}
ctx := context.Background()
_, err = client.BOM.Upload(ctx, dtrack.BOMUploadRequest{
ProjectName: projectAndVersion[0],
ProjectVersion: projectAndVersion[1],
AutoCreate: true,
BOM: base64.StdEncoding.EncodeToString(bom),
})
if err != nil {
return fmt.Errorf("failed to upload BOM: %w", err)
}
log.Printf("successfully sent: %q to Dependency Track", dta.Name)
return nil
}
func (dta *DependencyTrackAction) Terminate() error {
log.Printf("Dependency Track action %s terminated.", dta.Name)
return nil
}
func (dta *DependencyTrackAction) GetLayoutProvider() layout.LayoutProvider {
return new(formatting.HtmlProvider)
}