Skip to content

Commit 0dddf96

Browse files
committed
refactor GitHub and GitLab issues handling
Signed-off-by: Rafi <refaei.shikho@hotmail.com>
1 parent df5403e commit 0dddf96

2 files changed

Lines changed: 26 additions & 38 deletions

File tree

internal/core/integrations/github_integration.go

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -739,10 +739,11 @@ func (g *githubIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
739739
return nil
740740
}
741741

742+
// check if the dependencyVuln is open, if not we need to close the issue
742743
if dependencyVuln.State != models.VulnStateOpen {
743744
if dependencyVuln.TicketState == models.TicketStateOpen {
744745
dependencyVuln.TicketState = models.TicketStateClosed
745-
vulnEvent := models.NewTicketClosedEvent(dependencyVuln.ID, "User", "This issue is closed")
746+
vulnEvent := models.NewTicketClosedEvent(dependencyVuln.ID, "system", "This issue is closed")
746747

747748
// save the event
748749
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
@@ -763,24 +764,17 @@ func (g *githubIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
763764
return err
764765
}
765766

766-
assetSlug := asset.Slug
767-
768767
project, err := g.projectRepository.GetProjectByAssetID(asset.ID)
769768
if err != nil {
770769
slog.Error("could not get project by asset id", "err", err)
771770
return err
772771
}
773-
projectSlug := project.Slug
774772

775-
orgID := project.OrganizationID
776-
org, err := g.orgRepository.GetOrgByID(orgID)
773+
org, err := g.orgRepository.GetOrgByID(project.OrganizationID)
777774
if err != nil {
778775
slog.Error("could not get org by id", "err", err)
779776
return err
780777
}
781-
orgSlug := org.Slug
782-
783-
assetVersionName := dependencyVuln.AssetVersionName
784778

785779
riskMetrics, vector := risk.RiskCalculation(*dependencyVuln.CVE, core.GetEnvironmentalFromAsset(asset))
786780

@@ -791,7 +785,7 @@ func (g *githubIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
791785
labels := getLabels(&dependencyVuln, "open")
792786
issueRequest := &github.IssueRequest{
793787
Title: github.String(fmt.Sprintf("%s found in %s", utils.SafeDereference(dependencyVuln.CVEID), utils.SafeDereference(dependencyVuln.ComponentPurl))),
794-
Body: github.String(exp.Markdown(g.frontendUrl, orgSlug, projectSlug, assetSlug, assetVersionName) + "\n\n------\n\n" + "Risk exceeds predefined threshold"),
788+
Body: github.String(exp.Markdown(g.frontendUrl, org.Slug, project.Slug, asset.Slug, dependencyVuln.AssetVersionName) + "\n\n------\n\n" + "Risk exceeds predefined threshold"),
795789
Labels: &labels,
796790
}
797791

@@ -803,7 +797,7 @@ func (g *githubIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
803797
// the issue was deleted - we need to set the ticket state to deleted
804798
dependencyVuln.TicketState = models.TicketStateDeleted
805799
// we can not reopen the issue - it is deleted
806-
vulnEvent := models.NewTicketDeletedEvent(dependencyVuln.ID, "Unknown", "This issue is deleted")
800+
vulnEvent := models.NewTicketDeletedEvent(dependencyVuln.ID, "user", "This issue is deleted")
807801
// save the event
808802
err = g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
809803
if err != nil {
@@ -814,14 +808,15 @@ func (g *githubIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
814808
return err
815809
}
816810

811+
//check if the ticket state in devguard is different from the ticket state in gitlab, if so we need to update the ticket state in devguard
817812
ticketState := issue.State
818813
devguardTicketState := dependencyVuln.TicketState
819814
if *ticketState == "closed" {
820815
if devguardTicketState == models.TicketStateOpen {
821816
// the issue was closed - we need to set the ticket state to closed
822817
dependencyVuln.TicketState = models.TicketStateClosed
823818
// create a new event
824-
vulnEvent := models.NewTicketClosedEvent(dependencyVuln.ID, "User", "This issue is closed")
819+
vulnEvent := models.NewTicketClosedEvent(dependencyVuln.ID, "user", "This issue is closed")
825820

826821
// save the event
827822
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
@@ -839,7 +834,7 @@ func (g *githubIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
839834
dependencyVuln.TicketState = models.TicketStateOpen
840835

841836
// create a new event
842-
vulnEvent := models.NewReopenedEvent(dependencyVuln.ID, "User", "This issue is reopened")
837+
vulnEvent := models.NewReopenedEvent(dependencyVuln.ID, "user", "This issue is reopened")
843838
// save the event
844839
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
845840
if err != nil {

internal/core/integrations/gitlab_integration.go

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,7 @@ func (g *gitlabIntegration) HandleWebhook(ctx core.Context) error {
211211
switch event := event.(type) {
212212
case *gitlab.IssueEvent:
213213
issueId := event.ObjectAttributes.IID
214-
// check if the user is a bot - we do not want to handle bot comments
215-
// if event.Comment.User.GetType() == "Bot" {
216-
// return nil
217-
// }
214+
218215
// look for a dependencyVuln with such a github ticket id
219216
vuln, err := g.aggregatedVulnRepository.FindByTicketID(nil, fmt.Sprintf("gitlab:%d/%d", event.Project.ID, issueId))
220217
if err != nil {
@@ -1054,10 +1051,11 @@ func (g *gitlabIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
10541051
return nil
10551052
}
10561053

1054+
// check if the dependencyVuln is open, if not we need to close the issue
10571055
if dependencyVuln.State != models.VulnStateOpen {
10581056
if dependencyVuln.TicketState == models.TicketStateOpen {
10591057
dependencyVuln.TicketState = models.TicketStateClosed
1060-
vulnEvent := models.NewTicketClosedEvent(dependencyVuln.ID, "User", "This issue is closed")
1058+
vulnEvent := models.NewTicketClosedEvent(dependencyVuln.ID, "system", "This issue is closed")
10611059

10621060
// save the event
10631061
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
@@ -1068,39 +1066,32 @@ func (g *gitlabIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
10681066
}
10691067
}
10701068

1071-
assetSlug := asset.Slug
1072-
1073-
project, err := g.projectRepository.GetProjectByAssetID(asset.ID)
1069+
integrationUUID, err := extractIntegrationIdFromRepoId(repoId)
10741070
if err != nil {
1075-
slog.Error("could not get project by asset id", "err", err)
1071+
slog.Error("failed to extract integration id from repo id", "err", err, "repoId", repoId)
10761072
return err
10771073
}
1078-
projectSlug := project.Slug
10791074

1080-
orgID := project.OrganizationID
1081-
org, err := g.orgRepository.GetOrgByID(orgID)
1075+
projectId, err := extractProjectIdFromRepoId(repoId)
10821076
if err != nil {
1083-
slog.Error("could not get org by id", "err", err)
1077+
slog.Error("failed to extract project id from repo id", "err", err, "repoId", repoId)
10841078
return err
10851079
}
1086-
orgSlug := org.Slug
1087-
1088-
assetVersionName := dependencyVuln.AssetVersionName
10891080

1090-
integrationUUID, err := extractIntegrationIdFromRepoId(repoId)
1081+
client, err := g.gitlabClientFactory(integrationUUID)
10911082
if err != nil {
1092-
slog.Error("failed to extract integration id from repo id", "err", err, "repoId", repoId)
10931083
return err
10941084
}
10951085

1096-
projectId, err := extractProjectIdFromRepoId(repoId)
1086+
project, err := g.projectRepository.GetProjectByAssetID(asset.ID)
10971087
if err != nil {
1098-
slog.Error("failed to extract project id from repo id", "err", err, "repoId", repoId)
1088+
slog.Error("could not get project by asset id", "err", err)
10991089
return err
11001090
}
11011091

1102-
client, err := g.gitlabClientFactory(integrationUUID)
1092+
org, err := g.orgRepository.GetOrgByID(project.OrganizationID)
11031093
if err != nil {
1094+
slog.Error("could not get org by id", "err", err)
11041095
return err
11051096
}
11061097

@@ -1117,7 +1108,7 @@ func (g *gitlabIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
11171108

11181109
issue, _, err := client.EditIssue(ctx, projectId, gitlabTicketIDInt, &gitlab.UpdateIssueOptions{
11191110
Title: gitlab.Ptr(fmt.Sprintf("%s found in %s", utils.SafeDereference(dependencyVuln.CVEID), utils.SafeDereference(dependencyVuln.ComponentPurl))),
1120-
Description: gitlab.Ptr(exp.Markdown(g.frontendUrl, orgSlug, projectSlug, assetSlug, assetVersionName) + "\n\n------\n\n" + "Risk exceeds predefined threshold"),
1111+
Description: gitlab.Ptr(exp.Markdown(g.frontendUrl, org.Slug, project.Slug, asset.Slug, dependencyVuln.AssetVersionName) + "\n\n------\n\n" + "Risk exceeds predefined threshold"),
11211112
Labels: gitlab.Ptr(gitlab.LabelOptions(labels)),
11221113
})
11231114
if err != nil {
@@ -1126,7 +1117,7 @@ func (g *gitlabIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
11261117
// the issue was deleted - we need to set the ticket state to deleted
11271118
dependencyVuln.TicketState = models.TicketStateDeleted
11281119
// we can not reopen the issue - it is deleted
1129-
vulnEvent := models.NewTicketDeletedEvent(dependencyVuln.ID, "Unknown", "This issue is deleted")
1120+
vulnEvent := models.NewTicketDeletedEvent(dependencyVuln.ID, "user", "This issue is deleted")
11301121
// save the event
11311122
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
11321123
if err != nil {
@@ -1137,14 +1128,16 @@ func (g *gitlabIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
11371128
}
11381129
return err
11391130
}
1131+
1132+
//check if the ticket state in devguard is different from the ticket state in gitlab, if so we need to update the ticket state in devguard
11401133
ticketState := issue.State
11411134
devguardTicketState := dependencyVuln.TicketState
11421135
if ticketState == "closed" {
11431136
if devguardTicketState == models.TicketStateOpen {
11441137
// the issue was closed - we need to set the ticket state to closed
11451138
dependencyVuln.TicketState = models.TicketStateClosed
11461139
// create a new event
1147-
vulnEvent := models.NewTicketClosedEvent(dependencyVuln.ID, "User", "This issue is closed")
1140+
vulnEvent := models.NewTicketClosedEvent(dependencyVuln.ID, "user", "This issue is closed")
11481141

11491142
// save the event
11501143
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
@@ -1162,7 +1155,7 @@ func (g *gitlabIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
11621155
dependencyVuln.TicketState = models.TicketStateOpen
11631156

11641157
// create a new event
1165-
vulnEvent := models.NewReopenedEvent(dependencyVuln.ID, "User", "This issue is reopened")
1158+
vulnEvent := models.NewReopenedEvent(dependencyVuln.ID, "user", "This issue is reopened")
11661159
// save the event
11671160
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
11681161
if err != nil {

0 commit comments

Comments
 (0)