4
4
"context"
5
5
"fmt"
6
6
"os"
7
+ "path"
7
8
"strconv"
8
9
9
10
"github.com/jfrog/frogbot/icons"
@@ -23,15 +24,17 @@ import (
23
24
const (
24
25
frogbotVersion = "0.0.0"
25
26
// Env
26
- jfrogUser = "FROGBOT_JF_USER"
27
- jfrogUrl = "FROGBOT_JF_URL"
28
- jfrogPassword = "FROGBOT_JF_PASSWORD"
29
- jfrogToken = "FROGBOT_JF_TOKEN"
30
- gitRepoOwner = "FROGBOT_GIT_OWNER"
31
- gitRepo = "FROGBOT_GIT_REPO"
32
- gitToken = "FROGBOT_GIT_TOKEN"
33
- gitBaseBranch = "FROGBOT_GIT_BASE_BRANCH"
34
- prID = "FROGBOT_PR"
27
+ jfrogUser = "FROGBOT_JF_USER"
28
+ jfrogUrl = "FROGBOT_JF_URL"
29
+ jfrogXrayUrl = "FROGBOT_JF_XRAY_URL"
30
+ jfrogArtifactoryUrl = "FROGBOT_JF_ARTIFACTORY_URL"
31
+ jfrogPassword = "FROGBOT_JF_PASSWORD"
32
+ jfrogToken = "FROGBOT_JF_TOKEN"
33
+ gitRepoOwner = "FROGBOT_GIT_OWNER"
34
+ gitRepo = "FROGBOT_GIT_REPO"
35
+ gitToken = "FROGBOT_GIT_TOKEN"
36
+ gitBaseBranch = "FROGBOT_GIT_BASE_BRANCH"
37
+ prID = "FROGBOT_PR"
35
38
)
36
39
37
40
func main () {
@@ -79,61 +82,82 @@ func scanPullRequest(c *clitool.Context) error {
79
82
80
83
// Audit PR code
81
84
// TODO - fill contex according to env/flags
82
- xrayScanParams := services.XrayGraphScanParams {}
85
+ xrayScanParams := services.XrayGraphScanParams {IncludeVulnerabilities : true }
83
86
wd , err := os .Getwd ()
84
87
if err != nil {
85
88
return err
86
89
}
90
+ clientLog .Info ("Auditing " + wd )
87
91
currentScan , err := runAudit (xrayScanParams , & server , wd )
92
+ if err != nil {
93
+ return err
94
+ }
88
95
// Audit target code
96
+ clientLog .Info ("Auditing " + repo + " " + baseBranch )
89
97
previousScan , err := auditTarget (client , xrayScanParams , & server , repoOwner , repo , baseBranch )
90
98
if err != nil {
91
99
return err
92
100
}
93
101
// Get only the new issues added by this PR
94
- violations := getNewViolations (previousScan [0 ], currentScan [0 ]) // TODO - handle array of scan results!
102
+ var vulnerabilitiesRows []xrayutils.VulnerabilityRow
103
+ // TODO - handle array of scan results!
104
+ if len (currentScan [0 ].Violations ) > 0 {
105
+ vulnerabilitiesRows = getNewViolations (previousScan [0 ], currentScan [0 ])
106
+ } else if len (currentScan [0 ].Vulnerabilities ) > 0 {
107
+ vulnerabilitiesRows = getNewVulnerabilities (previousScan [0 ], currentScan [0 ])
108
+ }
95
109
// Comment frogbot message on the PR
96
- message := createPullRequestMessage (violations )
110
+ message := createPullRequestMessage (vulnerabilitiesRows )
97
111
return client .AddPullRequestComment (context .Background (), repoOwner , repo , message , pullRequestID )
98
112
99
113
}
100
114
101
115
func extractParamsFromEnv () (server coreconfig.ServerDetails , repoOwner , token , repo , baseBranch string , pullRequestID int , err error ) {
102
- url , exists := os .LookupEnv (jfrogUrl )
103
- if ! exists {
104
- err = fmt .Errorf ("%s is missing" , jfrogUrl )
105
- return
116
+ url := os .Getenv (jfrogUrl )
117
+ xrUrl := os .Getenv (jfrogXrayUrl )
118
+ rtUrl := os .Getenv (jfrogArtifactoryUrl )
119
+ if xrUrl != "" && rtUrl != "" {
120
+ server .XrayUrl = xrUrl
121
+ server .ArtifactoryUrl = rtUrl
122
+ } else {
123
+ if url == "" {
124
+ err = fmt .Errorf ("%s or %s and %s are missing" , url , xrUrl , rtUrl )
125
+ return
126
+ }
127
+ server .Url = url
128
+ server .XrayUrl = url + "/xray/"
129
+ server .ArtifactoryUrl = path .Join (url , "artifactory" ) + "/"
106
130
}
107
- server . Url = url
108
- password , passwordExists := os .LookupEnv (jfrogPassword )
109
- user , userExists := os .LookupEnv (jfrogUser )
110
- if passwordExists && userExists {
131
+
132
+ password := os .Getenv (jfrogPassword )
133
+ user := os .Getenv (jfrogUser )
134
+ if password != "" && user != "" {
111
135
server .User = user
112
136
server .Password = password
113
- } else if accessToken , exists := os .LookupEnv (jfrogToken ); exists {
137
+ } else if accessToken := os .Getenv (jfrogToken ); accessToken != "" {
114
138
server .AccessToken = accessToken
115
139
} else {
116
140
err = fmt .Errorf ("%s and %s or %s are missing" , jfrogUser , jfrogPassword , jfrogToken )
117
141
return
118
142
}
119
- if repoOwner , exists = os .LookupEnv (gitRepoOwner ); ! exists {
143
+ if repoOwner = os .Getenv (gitRepoOwner ); repoOwner == "" {
120
144
err = fmt .Errorf ("%s is missing" , gitRepoOwner )
121
145
return
122
146
}
123
- if repo , exists = os .LookupEnv (gitRepo ); ! exists {
147
+ if repo = os .Getenv (gitRepo ); repo == "" {
124
148
err = fmt .Errorf ("%s is missing" , gitRepo )
125
149
return
126
150
}
127
- if token , exists = os .LookupEnv (gitToken ); ! exists {
151
+ if token = os .Getenv (gitToken ); token == "" {
128
152
err = fmt .Errorf ("%s is missing" , gitToken )
129
153
return
130
154
}
131
- if baseBranch , exists = os .LookupEnv (gitBaseBranch ); ! exists {
155
+ if baseBranch = os .Getenv (gitBaseBranch ); baseBranch == "" {
132
156
err = fmt .Errorf ("%s is missing" , gitBaseBranch )
133
157
return
134
158
}
135
- pullRequestIDString , exists := os .LookupEnv (prID )
136
- if ! exists {
159
+ pullRequestIDString := os .Getenv (prID )
160
+ if pullRequestIDString == "" {
137
161
err = fmt .Errorf ("%s is missing" , prID )
138
162
return
139
163
}
@@ -169,8 +193,14 @@ func auditTarget(client vcsclient.VcsClient, xrayScanParams services.XrayGraphSc
169
193
if err != nil {
170
194
return
171
195
}
196
+ clientLog .Debug ("Created temp working directory: " + tempWorkdir )
172
197
defer fileutils .RemoveTempDir (tempWorkdir )
198
+ clientLog .Debug (fmt .Sprintf ("Downloading %s/%s , branch:%s to:%s" , owner , repo , branch , tempWorkdir ))
173
199
err = client .DownloadRepository (context .Background (), owner , repo , branch , tempWorkdir )
200
+ if err != nil {
201
+ return
202
+ }
203
+ clientLog .Debug ("Downloaded target repository" )
174
204
return runAudit (xrayScanParams , server , tempWorkdir )
175
205
}
176
206
@@ -218,22 +248,19 @@ func getNewVulnerabilities(previousScan, currentScan services.ScanResponse) (new
218
248
}
219
249
220
250
func GetUniqueID (vulnerability xrayutils.VulnerabilityRow ) string {
221
- return vulnerability .IssueId + vulnerability .Components [ 0 ]. Name
251
+ return vulnerability .ImpactedPackageName + vulnerability .ImpactedPackageVersion + vulnerability . IssueId
222
252
223
253
}
224
254
225
255
func createPullRequestMessage (vulnerabilitiesRows []xrayutils.VulnerabilityRow ) string {
226
256
if len (vulnerabilitiesRows ) == 0 {
227
257
return icons .GetIconTag (icons .NoVulnerabilityBannerSource )
228
258
}
229
- tableHeder := `| SEVERITY | IMPACTED PACKAGE | IMPACTED PACKAGE VERSION | FIXED VERSIONS | COMPONENT | COMPONENT VERSION | CVE
230
- :--: | -- | -- | -- | -- | :--: | --`
231
- tableContent := `
232
-
233
-
234
- `
259
+ tableHeder := "\n | SEVERITY | IMPACTED PACKAGE | IMPACTED PACKAGE VERSION | FIXED VERSIONS | COMPONENT | COMPONENT VERSION | CVE\n " +
260
+ ":--: | -- | -- | -- | -- | :--: | --"
261
+ var tableContent string
235
262
for _ , vulnerability := range vulnerabilitiesRows {
236
- tableContent += fmt .Sprintf ("| %s | %s | %s | %s | %s | %s | %s \n " , icons .GetIconTag (icons .GetIconSource (vulnerability .Severity )), vulnerability .ImpactedPackageName ,
263
+ tableContent += fmt .Sprintf ("\n | %s | %s | %s | %s | %s | %s | %s " , icons .GetIconTag (icons .GetIconSource (vulnerability .Severity )), vulnerability .ImpactedPackageName ,
237
264
vulnerability .ImpactedPackageVersion , vulnerability .FixedVersions , vulnerability .Components [0 ].Name , vulnerability .Components [0 ].Version , vulnerability .Cves [0 ].Id )
238
265
}
239
266
return icons .GetIconTag (icons .VulnerabilitiesBannerSource ) + tableHeder + tableContent
0 commit comments