From e5fa1975222aa432d218b77f29d4e0a911d22fed Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Sat, 21 Nov 2020 18:11:17 +0800 Subject: [PATCH] 1. When the cve information has been filled in, anyone is allowed to close the issue without the need for maintainer review; 2. When the branch corresponding to the issue is not affected, the security group will no longer review it, and export it at a later time to manually fix the problem; --- common/common.go | 11 + conf/app.conf | 2 +- conf/product_app.conf | 2 +- controllers/hook.go | 826 +++++++++--------- .../11_whitelist_2020-11-11.xlsx | Bin 36133 -> 0 bytes .../21_whitelist_2020-11-21.xlsx | Bin 0 -> 52993 bytes taskhandler/createissue.go | 2 +- 7 files changed, 416 insertions(+), 427 deletions(-) delete mode 100644 cve-py/import_excels/11_whitelist_2020-11-11.xlsx create mode 100644 cve-py/import_excels/21_whitelist_2020-11-21.xlsx diff --git a/common/common.go b/common/common.go index 43774aa..37f54c4 100644 --- a/common/common.go +++ b/common/common.go @@ -343,7 +343,18 @@ func PraseTimeInt(stringTime time.Time) int64 { return 0 } +// Get current timestamp func CurTimestamp() int64 { timeStamp := time.Now().Unix() return timeStamp } + +// Does the string slice contain a certain value +func IsValueInList(value string, list []string) bool { + for _, v := range list { + if v == value { + return true + } + } + return false +} \ No newline at end of file diff --git a/conf/app.conf b/conf/app.conf index 292eb6d..ffe86d1 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -108,7 +108,7 @@ issue_whitelist = 2 # List of affected branches affected_branchs = openEuler-20.03-LTS # Close the highest privilege of issue -close_issue_privilege = 1 +close_issue_privilege = 2 [reflink] comment_cmd = https://gitee.com/openeuler/cve-manager/blob/master/doc/md/manual.md diff --git a/conf/product_app.conf b/conf/product_app.conf index 10d4340..b8ca6ed 100644 --- a/conf/product_app.conf +++ b/conf/product_app.conf @@ -104,7 +104,7 @@ issue_whitelist = 1 # List of affected branches affected_branchs = openEuler-20.03-LTS # Close the highest privilege of issue -close_issue_privilege = 1 +close_issue_privilege = 2 [reflink] diff --git a/controllers/hook.go b/controllers/hook.go index 3ade52c..493387d 100644 --- a/controllers/hook.go +++ b/controllers/hook.go @@ -2,6 +2,7 @@ package controllers import ( "bytes" + "cvevulner/common" "cvevulner/models" "cvevulner/taskhandler" "cvevulner/util" @@ -59,15 +60,15 @@ const ( // Content review tips ContentReview = "%v 请完成以下操作:\n" // Not filling in the correct format - IssueErroFormat = "@%v 经过 cve-manager 解析, 填写openEuler评分未通过安全组审核需要再次在评论区提交评分,通过审核后才能关闭issue." + IssueErroFormat = "%v 经过 cve-manager 解析, 填写openEuler评分未通过安全组成员审核需要再次在评论区提交评分,通过审核后才能关闭issue." // Remind the security group to review CommentReviewRemind = "%v 经过 cve-manager 解析 openEuler评分 已改变 需要您及时进行审核,以便maintainer进行后续操作." // Review private messages CommentPrivateReview = "%v 仓库的CVE和安全问题的ISSUE,需要您进行审核,CVE编号: %v" // Rating review failed - CommentPrivateOpenEuler = "%v 仓库的CVE和安全问题的ISSUE, CVE编号: %v, 填写openEuler评分未通过安全组审核需要再次在评论区提交评分,通过审核后才能关闭issue." + CommentPrivateOpenEuler = "%v 仓库的CVE和安全问题的ISSUE, CVE编号: %v, 填写openEuler评分未通过安全组成员审核需要再次在评论区提交评分,通过审核后才能关闭issue." // Review reminder - CommentReviewRemindMaintainer = "%v 经过 cve-manager 解析 openEuler评分 已改变 需要等待安全组审核通过以后, 才能进行后续操作." + CommentReviewRemindMaintainer = "@%v 经过 cve-manager 解析 openEuler评分 已改变 需要等待安全组成员审核通过以后, 才能进行后续操作." ) //HookEventControllers gitee hook callback @@ -173,20 +174,19 @@ func closeIssuePrivilage(issueHook *models.IssuePayload, issueTmp *models.IssueT if msg, tb, ok := checkIssueClosedAnalysisComplete(issueTmp); !ok { //send comment to issue issueTmp.IssueStatus = 1 - issueTmp.MtAuditFlag = 0 + issueTmp.MtAuditFlag = 1 issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) issueTmp.StatusName = "open" _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, *cveCenter, *issueTmp) if issueErr == nil { na := "\n**请确认分析内容的准确性,待分析内容请填写完整,否则将无法关闭当前issue.**" - cc := fmt.Sprintf(ContentReview, "@"+issueHook.User.Login) + tb + na + cc := fmt.Sprintf(ContentReview, "@"+issueHook.Sender.UserName) + tb + na taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) content := fmt.Sprintf("%v 仓库的CVE和安全问题的ISSUE,CVE编号: %v,", issueTmp.Repo, issueTmp.CveNum) taskhandler.SendPrivateLetters(token, content+msg, issueHook.Issue.Assignee.Login) } } else { - closePrBool = false issueTmp.StatusName = issueHook.Issue.StateName issueTmp.SaAuditFlag = 1 issueTmp.MtAuditFlag = 1 @@ -202,23 +202,167 @@ func closeIssuePrivilage(issueHook *models.IssuePayload, issueTmp *models.IssueT issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) } } + closePrBool = false } } return closePrBool } +func sigReviewSend(issueHook *models.IssuePayload, issueTmp *models.IssueTemplate, + token, owner, fixed, unFix, assignee string, cveCenter *models.VulnCenter) { + issueTmp.IssueStatus = 1 + issueTmp.Status = 1 + issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) + issueTmp.StatusName = "open" + _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, + *cveCenter, *issueTmp) + if issueErr == nil { + if issueTmp.OpAuditFlag == 2 { + cc := fmt.Sprintf(IssueErroFormat, assignee) + taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) + content := fmt.Sprintf(CommentPrivateOpenEuler, issueTmp.Repo, issueTmp.CveNum) + taskhandler.SendPrivateLetters(token, content, issueHook.Sender.UserName) + } else if issueTmp.OpAuditFlag == 0 { + list, revErr := models.GetSecurityReviewerList() + if revErr == nil && len(list) > 0 { + content := fmt.Sprintf(CommentPrivateReview, issueTmp.Repo, issueTmp.CveNum) + ns := make([]string, len(list)) + for k, v := range list { + ns[k] = "@" + v.NameSpace + " " + taskhandler.SendPrivateLetters(token, content, v.NameSpace) + } + if len(ns) > 0 { + cc := fmt.Sprintf(CommentReviewRemind, strings.Join(ns, ",")) + taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) + } + } else { + logs.Error(revErr) + } + } + } +} + +func getMaintainer(path, prSender, assignee string) string { + maintainerList, mainOk := models.QueryRepoAllMaintainer(path) + assList := []string{} + if mainOk && len(maintainerList) > 0 { + for _, v := range maintainerList { + assList = append(assList, "@"+v.MemberName+" ") + } + } + if prSender != "" && len(prSender) > 1 { + isListBool := common.IsValueInList("@"+prSender+" ", assList) + if !isListBool { + assList = append(assList, "@"+prSender+" ") + } + } + maintainerVaule := "" + if len(assList) > 0 { + maintainerVaule = strings.Join(assList, ",") + } else { + maintainerVaule = "@" + assignee + " " + } + return maintainerVaule +} + +func closeIssueProc(issueHook *models.IssuePayload, issueTmp *models.IssueTemplate, + token, owner, fixed, unFix string, cveCenter *models.VulnCenter) { + closePrBool := true + closeIssuePrFlag, closeOk := beego.AppConfig.Int64("cve::close_issue_privilege") + if closeOk == nil && closeIssuePrFlag == 1 { + closePrBool = closeIssuePrivilage(issueHook, issueTmp, + token, owner, fixed, unFix, cveCenter) + } + if closePrBool { + issueTmp.Status = 1 + cveCenter.IsExport = 0 + issueTmp.MtAuditFlag = 1 + assignee := getMaintainer(issueTmp.Repo, issueHook.Sender.UserName, issueTmp.Assignee) + openScoreFlag := true + if issueTmp.OpenEulerScore != issueTmp.NVDScore && issueTmp.NVDScore > 0 && + issueTmp.OpAuditFlag != 1 && issueTmp.OpenEulerScore > 0 { + //send comment to issue + openScoreFlag = false + sigReviewSend(issueHook, issueTmp, token, owner, fixed, unFix, assignee, cveCenter) + } + if openScoreFlag { + if msg, tb, ok := checkIssueClosedAnalysisComplete(issueTmp); !ok { + //send comment to issue + issueTmp.IssueStatus = 1 + issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) + issueTmp.StatusName = "open" + _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, + *cveCenter, *issueTmp) + if issueErr == nil { + na := "\n**请确认分析内容的准确性,待分析内容请填写完整,否则将无法关闭当前issue.**" + cc := fmt.Sprintf(ContentReview, assignee) + tb + na + taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) + content := fmt.Sprintf("%v 仓库的CVE和安全问题的ISSUE,CVE编号: %v,", issueTmp.Repo, issueTmp.CveNum) + taskhandler.SendPrivateLetters(token, content+msg, issueHook.Sender.UserName) + } + } else { + //1. change issue status + issueTmp.IssueStatus = 2 + //issueTmp.Status = 3 + cveCenter.IsExport = 3 + if issueTmp.MtAuditFlag == 0 { + issueTmp.IssueStatus = 1 + issueTmp.Status = 1 + cveCenter.IsExport = 0 + issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) + issueTmp.StatusName = "open" + _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, + *cveCenter, *issueTmp) + if issueErr == nil { + na := "\n**issue关闭前,请确认模板分析内容的准确性与完整性,确认无误后,请在评论区输入: /approve, 否则无法关闭当前issue.**" + cc := fmt.Sprintf(ContentReview, assignee) + tb + na + taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) + } + } + issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) + issueTmp.StatusName = "open" + issueTmp.Status = 1 + issuePrFlag := VerifyIssueAsPr(issueTmp, *cveCenter, false, + assignee, issueHook.Sender.UserName) + if issuePrFlag { + issueTmp.StatusName = issueHook.Issue.StateName + issueTmp.Status = 3 + if isNormalCloseIssue(issueTmp.CveId, issueTmp.IssueStatus) { + issueTmp.IssueStatus = 2 + cveCenter.IsExport = 3 + issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(unFix, fixed) + } else { + issueTmp.IssueStatus = 6 + cveCenter.IsExport = 2 + issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) + } + } else { + issueTmp.IssueStatus = 1 + issueTmp.Status = 1 + cveCenter.IsExport = 0 + } + } + } + } +} + func handleIssueStateChange(issueHook *models.IssuePayload) error { unFix := beego.AppConfig.String("labelUnFix") fixed := beego.AppConfig.String("labelFixed") - issueTmp := models.IssueTemplate{IssueNum: issueHook.Iid} - issueErr := models.GetIssueTemplateByColName(&issueTmp, "issue_num") - if issueErr != nil { - return issueErr - } - if issueTmp.Status == 3 { - // The issue has been closed and cannot be operated again - logs.Error("The issue has been closed and cannot be operated again,issuetmp: ", issueTmp) - return errors.New("The issue has been closed and cannot be operated again") + issueTmp := models.IssueTemplate{} + if issueHook.Issue.Repository.Path != "" && len(issueHook.Issue.Repository.Path) > 1 { + issueTmp.IssueNum = issueHook.Iid + issueTmp.OwnedComponent = issueHook.Issue.Repository.Path + issueErr := models.GetIssueTemplateByColName(&issueTmp, "issue_num", "owned_component") + if issueErr != nil { + return issueErr + } + } else { + issueTmp.IssueNum = issueHook.Iid + issueErr := models.GetIssueTemplateByColName(&issueTmp, "issue_num") + if issueErr != nil { + return issueErr + } } cveCenter := models.VulnCenter{CveId: issueTmp.CveId} cveErr := models.GetVulnCenterByCid(&cveCenter, "cve_id") @@ -228,6 +372,8 @@ func handleIssueStateChange(issueHook *models.IssuePayload) error { token := beego.AppConfig.String("gitee::git_token") owner := beego.AppConfig.String("gitee::owner") issueTmp.StatusName = issueHook.Issue.StateName + logs.Info("发起issue状态修改, 发起人: @", issueHook.Sender.UserName, ", 修改状态: ", + issueHook.Issue.StateName, ", data: ", issueHook) switch issueHook.State { case IssueOpenState: issueTmp.Status = 1 @@ -251,187 +397,28 @@ func handleIssueStateChange(issueHook *models.IssuePayload) error { } issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) case IssueCloseState: - closePrBool := true - closeIssuePrFlag, closeOk := beego.AppConfig.Int64("cve::close_issue_privilege") - if closeOk == nil && closeIssuePrFlag == 1 { - closePrBool = closeIssuePrivilage(issueHook, &issueTmp, - token, owner, fixed, unFix, &cveCenter) - } - if closePrBool { - issueTmp.Status = 1 - cveCenter.IsExport = 0 - maintainerList, mainOk := models.QueryRepoAllMaintainer(issueTmp.Repo) - assList := []string{} - if mainOk && len(maintainerList) > 0 { - for _, v := range maintainerList { - assList = append(assList, "@"+v.MemberName+" ") - } - } - assignee := "" - if len(assList) > 0 { - assignee = strings.Join(assList, ",") - } else { - assignee = "@" + issueTmp.Assignee - } - openScoreFlag := true - if issueTmp.OpenEulerScore != issueTmp.NVDScore && - issueTmp.OpAuditFlag != 1 && issueTmp.OpenEulerScore > 0 { - //send comment to issue - openScoreFlag = false - issueTmp.IssueStatus = 1 - issueTmp.Status = 1 - issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) - issueTmp.StatusName = "open" - _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, - cveCenter, issueTmp) - if issueErr == nil { - if issueTmp.OpAuditFlag == 2 { - cc := fmt.Sprintf(IssueErroFormat, assignee) - taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) - content := fmt.Sprintf(CommentPrivateOpenEuler, issueTmp.Repo, issueTmp.CveNum) - taskhandler.SendPrivateLetters(token, content, issueHook.Issue.Assignee.Login) - } else if issueTmp.OpAuditFlag == 0 { - list, revErr := models.GetSecurityReviewerList() - if revErr == nil && len(list) > 0 { - content := fmt.Sprintf(CommentPrivateReview, issueTmp.Repo, issueTmp.CveNum) - ns := make([]string, len(list)) - for k, v := range list { - ns[k] = "@" + v.NameSpace + " " - taskhandler.SendPrivateLetters(token, content, v.NameSpace) - } - if len(ns) > 0 { - cc := fmt.Sprintf(CommentReviewRemind, strings.Join(ns, ",")) - taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) - } - } else { - logs.Error(revErr) - } - } - } - } - if openScoreFlag { - if msg, tb, ok := checkIssueClosedAnalysisComplete(&issueTmp); !ok { - //send comment to issue - issueTmp.IssueStatus = 1 - issueTmp.MtAuditFlag = 0 - issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) - issueTmp.StatusName = "open" - _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, - cveCenter, issueTmp) - if issueErr == nil { - na := "\n**请确认分析内容的准确性,待分析内容请填写完整,否则将无法关闭当前issue.**" - cc := fmt.Sprintf(ContentReview, assignee) + tb + na - taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) - content := fmt.Sprintf("%v 仓库的CVE和安全问题的ISSUE,CVE编号: %v,", issueTmp.Repo, issueTmp.CveNum) - taskhandler.SendPrivateLetters(token, content+msg, issueHook.Issue.Assignee.Login) - } - } else { - //1. change issue status - issueTmp.IssueStatus = 2 - //issueTmp.Status = 3 - cveCenter.IsExport = 3 - if issueTmp.MtAuditFlag == 0 { - issueTmp.IssueStatus = 1 - issueTmp.Status = 1 - cveCenter.IsExport = 0 - issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) - issueTmp.StatusName = "open" - _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, - cveCenter, issueTmp) - if issueErr == nil { - na := "\n**issue关闭前,请确认模板分析内容的准确性与完整性,确认无误后,请在评论区输入: /approve, 否则无法关闭当前issue.**" - cc := fmt.Sprintf(ContentReview, assignee) + tb + na - taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) - } - } - if issueTmp.MtAuditFlag == 1 && issueTmp.SaAuditFlag == 0 { - issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) - issueTmp.StatusName = "open" - issueTmp.Status = 1 - issuePrFlag := VerifyIssueAsPr(&issueTmp, cveCenter, true) - if issuePrFlag { - issueTmp.StatusName = issueHook.Issue.StateName - issueTmp.SaAuditFlag = 1 - issueTmp.Status = 3 - if isNormalCloseIssue(issueTmp.CveId, issueTmp.IssueStatus) { - issueTmp.IssueStatus = 2 - cveCenter.IsExport = 3 - issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(unFix, fixed) - } else { - issueTmp.IssueStatus = 6 - cveCenter.IsExport = 2 - issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) - } - } else { - issueTmp.IssueStatus = 1 - issueTmp.Status = 1 - cveCenter.IsExport = 0 - } - } else { - issueTmp.StatusName = issueHook.Issue.StateName - issueTmp.Status = 3 - if isNormalCloseIssue(issueTmp.CveId, issueTmp.IssueStatus) { - issueTmp.IssueStatus = 2 - cveCenter.IsExport = 3 - issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(unFix, fixed) - } else { - issueTmp.IssueStatus = 6 - cveCenter.IsExport = 2 - issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) - } - } - } - } + if issueTmp.Status == 3 { + // The issue has been closed and cannot be operated again + logs.Error("The issue has been closed and cannot be operated again,issuetmp: ", issueTmp) + return errors.New("The issue has been closed and cannot be operated again") } + closeIssueProc(issueHook, &issueTmp, token, owner, fixed, unFix, &cveCenter) case IssueRejectState: issueTmp.Status = 4 issueTmp.IssueStatus = 6 cveCenter.IsExport = 2 issueTmp.IssueLabel = issueHook.Issue.ReplaceLabelToStr(fixed, unFix) } - appearErr := 0 - tempErr := models.UpdateIssueTemplate(&issueTmp, "status", "issue_status", - "status_name", "issue_label", "mt_audit_flag", "sa_audit_flag") - if tempErr != nil { - logs.Error(tempErr) - appearErr += 1 - } - update := models.UpdateVulnCenter(&cveCenter, "is_export") - if !update { - logs.Error("update vulnCenter fail ") - appearErr += 1 - } - update = ChangeIssueLabel(token, issueTmp.Repo, issueHook.Issue.Number, owner, issueTmp.IssueLabel) - if !update { - logs.Error("update gitee issue label fail ") - appearErr++ - } - sn := models.SecurityNotice{CveId: issueTmp.CveId} - secErr := sn.Read("cve_id") - if secErr != nil { - return secErr - } - switch issueTmp.IssueStatus { - case 2: - sn.AffectStatus = "Fixed" - case 6: - sn.AffectStatus = "UnAffected" - default: - sn.AffectStatus = "UnFixed" - } - err := sn.Update("affect_status") - if err != nil { - appearErr++ - logs.Error(err) - } - if appearErr > 0 { + updateBool := updateTempAndCenter(issueTmp, cveCenter, token, owner) + if !updateBool { return errors.New("handle issue state hook appear error maybe some step fail") } return nil } // When the issue status is complete, verify whether the pr is associated -func VerifyIssueAsPr(issueTmp *models.IssueTemplate, cveCenter models.VulnCenter, effectFlag bool) bool { +func VerifyIssueAsPr(issueTmp *models.IssueTemplate, cveCenter models.VulnCenter, + effectFlag bool, assignee, prSend string) bool { sn := models.SecurityNotice{CveId: issueTmp.CveId} secErr := sn.Read("cve_id") if secErr != nil { @@ -446,6 +433,7 @@ func VerifyIssueAsPr(issueTmp *models.IssueTemplate, cveCenter models.VulnCenter token := beego.AppConfig.String("gitee::git_token") owner := beego.AppConfig.String("gitee::owner") if sn.AffectProduct != "" && len(sn.AffectProduct) > 1 { + issueTmp.SaAuditFlag = 0 affectProductList := strings.Split(sn.AffectProduct, "/") var branchMaps = make(map[string]bool) for _, brands := range affectProductList { @@ -478,7 +466,7 @@ func VerifyIssueAsPr(issueTmp *models.IssueTemplate, cveCenter models.VulnCenter _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, cveCenter, *issueTmp) if issueErr == nil { - commentBody := "@" + issueTmp.Assignee + "\n" + + commentBody := assignee + "\n" + "关闭issue前,需要将受影响的分支在合并pr时关联上当前issue编号: #" + issueTmp.IssueNum + "\n" + "受影响分支: " + brandStr[:len(brandStr)-1] + "\n" + "具体操作参考: " + "https://gitee.com/help/articles/4142" + "\n" @@ -487,15 +475,12 @@ func VerifyIssueAsPr(issueTmp *models.IssueTemplate, cveCenter models.VulnCenter ",关闭issue前,需要将受影响的分支在合并pr时关联上当前issue编号: #" + issueTmp.IssueNum + ",受影响分支: " + brandStr[:len(brandStr)-1] + ",具体操作参考: " + "https://gitee.com/help/articles/4142." - taskhandler.SendPrivateLetters(token, content, issueTmp.Assignee) + taskhandler.SendPrivateLetters(token, content, prSend) } - issueTmp.SaAuditFlag = 0 return false - } else { - issueTmp.SaAuditFlag = 1 } } else { - if effectFlag { + if effectFlag && issueTmp.SaAuditFlag == 0 { unaffectedBranchList := []string{} if issueTmp.AffectedVersion != "" && len(issueTmp.AffectedVersion) > 1 { unaffectedBranchList = paraAffectBrands(issueTmp.AffectedVersion) @@ -517,10 +502,12 @@ func VerifyIssueAsPr(issueTmp *models.IssueTemplate, cveCenter models.VulnCenter list, err := models.GetSecurityReviewerList() if err != nil { logs.Error(err) + issueTmp.SaAuditFlag = 1 return true } if len(list) == 0 { logs.Error("list is null, issueTemp: ", issueTmp) + issueTmp.SaAuditFlag = 1 return true } anName := []string{} @@ -535,8 +522,8 @@ func VerifyIssueAsPr(issueTmp *models.IssueTemplate, cveCenter models.VulnCenter if issueErr == nil { assignee := strings.Join(anName, ",") commentBody := assignee + "\n" + - "关闭issue前,请确认分支: " + branchStrs + ": 受影响/不受影响, 如受影响,请联系maintainer: " + - issueTmp.Assignee + ",**进行处理后,或者按照模板格式在评论区填写内容,最后记得在评论区回复: /approve ,才能正常关闭issue.**" + "关闭issue前,请确认分支: " + branchStrs + ": 受影响/不受影响, 如受影响,请联系maintainer: @" + + issueTmp.Assignee + ", **进行处理后, 或者按照模板格式在评论区填写内容, 最后记得在评论区回复: /approve ,才能正常关闭issue.**" taskhandler.AddCommentToIssue(commentBody, issueTmp.IssueNum, owner, issueTmp.Repo, token) } return false @@ -760,6 +747,182 @@ func isNormalCloseIssue(cveID int64, issueState int8) bool { return true } +// update data +func updateTempAndCenter(issueTmp models.IssueTemplate, cveCenter models.VulnCenter, token, owner string) bool { + appearErr := 0 + err := models.UpdateIssueTemplate(&issueTmp, "status", "issue_status", + "status_name", "issue_label", "mt_audit_flag", "sa_audit_flag") + if err != nil { + logs.Error(err) + appearErr += 1 + } + update := models.UpdateVulnCenter(&cveCenter, "is_export") + if !update { + logs.Error("update vulnCenter fail ") + appearErr += 1 + } + update = ChangeIssueLabel(token, issueTmp.Repo, issueTmp.IssueNum, owner, issueTmp.IssueLabel) + if !update { + logs.Error("update gitee issue label fail ") + appearErr++ + } + sn := models.SecurityNotice{CveId: issueTmp.CveId} + err = sn.Read("cve_id") + if err != nil { + logs.Error("err: ", err) + return false + } + switch issueTmp.IssueStatus { + case 2: + sn.AffectStatus = "Fixed" + case 6: + sn.AffectStatus = "UnAffected" + default: + sn.AffectStatus = "UnFixed" + } + err = sn.Update("affect_status") + if err != nil { + appearErr++ + logs.Error(err) + } + if appearErr > 0 { + logs.Error("handle issue state hook appear error maybe some step "+ + "fail, appearErr: ", appearErr, ",issuetmp: ", issueTmp) + return false + } + return true +} + +func openEulerScoreReview(issueTmp *models.IssueTemplate, cuAccount, owner, token string) bool { + approveFlag := true + if isReviewer(cuAccount) { + issueTmp.OpAuditFlag = 1 + approveFlag = false + err := changeOpenEulerScoreStatus(issueTmp.CveId, 3) + if err != nil { + logs.Error(err) + } else { + err = models.UpdateIssueTemplate(issueTmp, "op_audit_flag") + if err != nil { + logs.Error(err) + } + taskhandler.AddCommentToIssue(fmt.Sprintf(ReviewApproveScore, issueTmp.Assignee, cuAccount), + issueTmp.IssueNum, owner, issueTmp.Repo, token) + } + } else { + taskhandler.AddCommentToIssue(fmt.Sprintf(CommentReviewRemindMaintainer, cuAccount), + issueTmp.IssueNum, owner, issueTmp.Repo, token) + } + return approveFlag +} + +func maintainerApprove(issueTmp *models.IssueTemplate, cuAccount, owner, token, fixed, unfixed string) { + if _, tb, ok := checkIssueClosedAnalysisComplete(issueTmp); !ok { + //send comment to issue + na := "\n**请确认分析内容的准确性,待分析内容请填写完整,否则将无法关闭当前issue.**" + cc := fmt.Sprintf(AnalysisComplete, cuAccount) + tb + na + taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) + return + } else { + issueTmp.MtAuditFlag = 1 + err := models.UpdateIssueTemplate(issueTmp, "mt_audit_flag") + if err != nil { + logs.Error(err) + return + } + cveCenter := models.VulnCenter{CveId: issueTmp.CveId} + err = models.GetVulnCenterByCid(&cveCenter, "cve_id") + if err != nil { + return + } + issueTmp.IssueLabel = unfixed + issueTmp.StatusName = "open" + assignee := getMaintainer(issueTmp.Repo, cuAccount, issueTmp.Assignee) + issuePrFlag := VerifyIssueAsPr(issueTmp, cveCenter, false, assignee, cuAccount) + if issuePrFlag { + issueTmp.IssueLabel = fixed + issueTmp.StatusName = "closed" + taskhandler.AddCommentToIssue(fmt.Sprintf(`@%v 你已审核模板内容, cve-manager 将关闭issue!`, + cuAccount), issueTmp.IssueNum, owner, issueTmp.Repo, token) + _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, + cveCenter, *issueTmp) + if issueErr == nil { + logs.Info("发起issue关闭,issuetmp: ", issueTmp) + } else { + logs.Error("issue关闭操作失败, issuetmp: ", issueTmp, ",issueErr: ", issueErr) + return + } + //issueTmp.SaAuditFlag = 1 + issueTmp.Status = 3 + if isNormalCloseIssue(issueTmp.CveId, issueTmp.IssueStatus) { + issueTmp.IssueStatus = 2 + cveCenter.IsExport = 3 + } else { + issueTmp.IssueStatus = 6 + cveCenter.IsExport = 2 + } + updateBool := updateTempAndCenter(*issueTmp, cveCenter, token, owner) + if !updateBool { + return + } + } + return + } +} + +func securityApprove(issueTmp *models.IssueTemplate, cuAccount, owner, token, fixed, unfixed string) { + if _, tb, ok := checkIssueClosedAnalysisComplete(issueTmp); !ok { + //send comment to issue + na := "\n**请确认分析内容的准确性,待分析内容请填写完整,否则将无法关闭当前issue.**" + cc := fmt.Sprintf(AnalysisComplete, cuAccount) + tb + na + taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) + return + } else { + if !isReviewer(cuAccount) { + taskhandler.AddCommentToIssue(fmt.Sprintf(`@%v maintainer具有通过/approve关闭issue, 请通过issue页面按钮关闭issue!`, + cuAccount), issueTmp.IssueNum, owner, issueTmp.Repo, token) + return + } + cveCenter := models.VulnCenter{CveId: issueTmp.CveId} + err := models.GetVulnCenterByCid(&cveCenter, "cve_id") + if err != nil { + return + } + issueTmp.IssueLabel = unfixed + issueTmp.StatusName = "open" + assignee := getMaintainer(issueTmp.Repo, cuAccount, issueTmp.Assignee) + issuePrFlag := VerifyIssueAsPr(issueTmp, cveCenter, false, assignee, cuAccount) + if issuePrFlag { + issueTmp.IssueLabel = fixed + issueTmp.StatusName = "closed" + taskhandler.AddCommentToIssue(fmt.Sprintf(`@%v 你已审核模板内容,cve-manager 将关闭issue!`, + cuAccount), issueTmp.IssueNum, owner, issueTmp.Repo, token) + _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, + cveCenter, *issueTmp) + if issueErr == nil { + logs.Info("发起issue关闭,issuetmp: ", issueTmp) + } else { + logs.Error("issue关闭操作失败, issuetmp: ", issueTmp, ",issueErr: ", issueErr) + return + } + issueTmp.SaAuditFlag = 1 + issueTmp.Status = 3 + if isNormalCloseIssue(issueTmp.CveId, issueTmp.IssueStatus) { + issueTmp.IssueStatus = 2 + cveCenter.IsExport = 3 + } else { + issueTmp.IssueStatus = 6 + cveCenter.IsExport = 2 + } + updateBool := updateTempAndCenter(*issueTmp, cveCenter, token, owner) + if !updateBool { + return + } + } + return + } +} + func handleIssueComment(payload models.CommentPayload) { if payload.Issue == nil || payload.Comment == nil { return @@ -768,8 +931,9 @@ func handleIssueComment(payload models.CommentPayload) { return } // The default timeout for receiving hooks - logs.Info("payload.Comment: ", payload.Comment) - issueNum := payload.Issue.Number //issue number + logs.Info("payload.Comment: ", payload.Comment, ", Number: ", payload.Issue.Number, "id: ", payload.Issue.Id) + issueNum := payload.Issue.Number //issue number string + issueId := payload.Issue.Id // issue id int64 cBody := payload.Comment.Body //Comment subject cuAccount := payload.Comment.User.UserName //gitee domain address cmdRej := beego.AppConfig.DefaultString("rejectCmd", "/reject") @@ -778,37 +942,37 @@ func handleIssueComment(payload models.CommentPayload) { if issueNum == "" || cuAccount == "" || cBody == "" { return } - if strings.HasPrefix(cBody, cmdRej) || strings.Contains(cBody, cmdRej) { + if strings.HasPrefix(cBody, cmdRej) { //Review rejected Add comment @Analyst if !isReviewer(cuAccount) { return } - issueTmp := models.IssueTemplate{IssueNum: issueNum} - err := models.GetIssueTemplateByColName(&issueTmp, "issue_num") + issueTmp := models.IssueTemplate{IssueNum: issueNum, IssueId: issueId} + err := models.GetIssueTemplateByColName(&issueTmp, "issue_num", "issue_id") if err != nil { logs.Error(err) return } - err = changeOpenEulerScoreStatus(issueTmp.CveId, 2) - if err != nil { - logs.Error(err) - } - issueTmp.OpAuditFlag = 2 - err = models.UpdateIssueTemplate(&issueTmp, "op_audit_flag") - if err != nil { - logs.Error(err) + if issueTmp.OpenEulerScore != issueTmp.NVDScore && issueTmp.NVDScore > 0 && + issueTmp.OpenEulerScore > 0 { + err = changeOpenEulerScoreStatus(issueTmp.CveId, 2) + if err != nil { + logs.Error(err) + } + issueTmp.OpAuditFlag = 2 + err = models.UpdateIssueTemplate(&issueTmp, "op_audit_flag") + if err != nil { + logs.Error(err) + } + accessToken := os.Getenv("GITEE_TOKEN") + owner := beego.AppConfig.String("gitee::owner") + path := issueTmp.Repo + taskhandler.AddCommentToIssue(fmt.Sprintf(ReviewRejectScore, issueTmp.Assignee, cuAccount), + issueTmp.IssueNum, owner, path, accessToken) } - accessToken := os.Getenv("GITEE_TOKEN") - owner := beego.AppConfig.String("gitee::owner") - //path := beego.AppConfig.String("gitee::path") - path := issueTmp.Repo - taskhandler.AddCommentToIssue(fmt.Sprintf(ReviewRejectScore, issueTmp.Assignee, cuAccount), - issueTmp.IssueNum, owner, path, accessToken) - // update gitee issue - //commentUpdateIssue(issueTmp) - } else if strings.HasPrefix(cBody, cmdApe) || strings.Contains(cBody, cmdApe) { - issueTmp := models.IssueTemplate{IssueNum: issueNum} - err := models.GetIssueTemplateByColName(&issueTmp, "issue_num") + } else if strings.HasPrefix(cBody, cmdApe) { + issueTmp := models.IssueTemplate{IssueNum: issueNum, IssueId: issueId} + err := models.GetIssueTemplateByColName(&issueTmp, "issue_num", "issue_id") if err != nil { logs.Error(err) return @@ -823,27 +987,10 @@ func handleIssueComment(payload models.CommentPayload) { fixed := beego.AppConfig.String("labelFixed") unfixed := beego.AppConfig.String("labelUnFix") approveFlag := true - if issueTmp.OpenEulerScore != issueTmp.NVDScore && + if issueTmp.OpenEulerScore != issueTmp.NVDScore && issueTmp.NVDScore > 0 && issueTmp.OpAuditFlag != 1 && issueTmp.OpenEulerScore > 0 { - issueTmp.OpAuditFlag = 1 //Approved to modify the rating status - if isReviewer(cuAccount) { - approveFlag = false - err = changeOpenEulerScoreStatus(issueTmp.CveId, 3) - if err != nil { - logs.Error(err) - } else { - err = models.UpdateIssueTemplate(&issueTmp, "op_audit_flag") - if err != nil { - logs.Error(err) - } - taskhandler.AddCommentToIssue(fmt.Sprintf(ReviewApproveScore, issueTmp.Assignee, cuAccount), - issueTmp.IssueNum, owner, issueTmp.Repo, token) - } - } else { - taskhandler.AddCommentToIssue(fmt.Sprintf(CommentReviewRemindMaintainer, cuAccount), - issueTmp.IssueNum, owner, issueTmp.Repo, token) - } + approveFlag = openEulerScoreReview(&issueTmp, cuAccount, owner, token) } if approveFlag { mtAuditFlag := false @@ -858,176 +1005,16 @@ func handleIssueComment(payload models.CommentPayload) { } } if mtAuditFlag { - if _, tb, ok := checkIssueClosedAnalysisComplete(&issueTmp); !ok { - //send comment to issue - na := "\n**请确认分析内容的准确性,待分析内容请填写完整,否则将无法关闭当前issue.**" - cc := fmt.Sprintf(AnalysisComplete, cuAccount) + tb + na - taskhandler.AddCommentToIssue(cc, issueTmp.IssueNum, owner, issueTmp.Repo, token) - return - } else { - issueTmp.MtAuditFlag = 1 - err = models.UpdateIssueTemplate(&issueTmp, "mt_audit_flag") - if err != nil { - logs.Error(err) - return - } - cveCenter := models.VulnCenter{CveId: issueTmp.CveId} - err = models.GetVulnCenterByCid(&cveCenter, "cve_id") - if err != nil { - return - } - issueTmp.IssueLabel = unfixed - issueTmp.StatusName = "open" - issuePrFlag := VerifyIssueAsPr(&issueTmp, cveCenter, true) - if issuePrFlag { - issueTmp.IssueLabel = fixed - issueTmp.StatusName = "closed" - taskhandler.AddCommentToIssue(fmt.Sprintf(`@%v 你已审核模板内容,cve-manager 将关闭issue!`, - cuAccount), issueTmp.IssueNum, owner, issueTmp.Repo, token) - _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, - cveCenter, issueTmp) - if issueErr == nil { - logs.Info("发起issue关闭,issuetmp: ", issueTmp) - } else { - logs.Error("issue关闭操作失败, issuetmp: ", issueTmp, ",issueErr: ", issueErr) - return - } - //issueTmp.SaAuditFlag = 1 - issueTmp.Status = 3 - if isNormalCloseIssue(issueTmp.CveId, issueTmp.IssueStatus) { - issueTmp.IssueStatus = 2 - cveCenter.IsExport = 3 - } else { - issueTmp.IssueStatus = 6 - cveCenter.IsExport = 2 - } - appearErr := 0 - err = models.UpdateIssueTemplate(&issueTmp, "status", "issue_status", - "status_name", "issue_label", "mt_audit_flag") - if err != nil { - logs.Error(err) - appearErr += 1 - } - update := models.UpdateVulnCenter(&cveCenter, "is_export") - if !update { - logs.Error("update vulnCenter fail ") - appearErr += 1 - } - update = ChangeIssueLabel(token, issueTmp.Repo, issueTmp.IssueNum, owner, issueTmp.IssueLabel) - if !update { - logs.Error("update gitee issue label fail ") - appearErr++ - } - sn := models.SecurityNotice{CveId: issueTmp.CveId} - err = sn.Read("cve_id") - if err != nil { - return - } - switch issueTmp.IssueStatus { - case 2: - sn.AffectStatus = "Fixed" - case 6: - sn.AffectStatus = "UnAffected" - default: - sn.AffectStatus = "UnFixed" - } - err = sn.Update("affect_status") - if err != nil { - appearErr++ - logs.Error(err) - } - if appearErr > 0 { - logs.Error("handle issue state hook appear error maybe some step "+ - "fail, appearErr: ", appearErr, ",issuetmp: ", issueTmp) - return - } - } - return - } + maintainerApprove(&issueTmp, cuAccount, owner, token, fixed, unfixed) } else { - if issueTmp.MtAuditFlag == 1 { - if !isReviewer(cuAccount) { - return - } - cveCenter := models.VulnCenter{CveId: issueTmp.CveId} - err = models.GetVulnCenterByCid(&cveCenter, "cve_id") - if err != nil { - return - } - issueTmp.IssueLabel = unfixed - issueTmp.StatusName = "open" - issuePrFlag := VerifyIssueAsPr(&issueTmp, cveCenter, false) - if issuePrFlag { - issueTmp.IssueLabel = fixed - issueTmp.StatusName = "closed" - taskhandler.AddCommentToIssue(fmt.Sprintf(`@%v 你已审核模板内容,cve-manager 将关闭issue!`, - cuAccount), issueTmp.IssueNum, owner, issueTmp.Repo, token) - _, issueErr := taskhandler.UpdateIssueToGit(token, owner, issueTmp.Repo, - cveCenter, issueTmp) - if issueErr == nil { - logs.Info("发起issue关闭,issuetmp: ", issueTmp) - } else { - logs.Error("issue关闭操作失败, issuetmp: ", issueTmp, ",issueErr: ", issueErr) - return - } - issueTmp.SaAuditFlag = 1 - issueTmp.Status = 3 - if isNormalCloseIssue(issueTmp.CveId, issueTmp.IssueStatus) { - issueTmp.IssueStatus = 2 - cveCenter.IsExport = 3 - } else { - issueTmp.IssueStatus = 6 - cveCenter.IsExport = 2 - } - appearErr := 0 - err = models.UpdateIssueTemplate(&issueTmp, "status", "issue_status", - "status_name", "issue_label", "mt_audit_flag", "sa_audit_flag") - if err != nil { - logs.Error(err) - appearErr += 1 - } - update := models.UpdateVulnCenter(&cveCenter, "is_export") - if !update { - logs.Error("update vulnCenter fail ") - appearErr += 1 - } - update = ChangeIssueLabel(token, issueTmp.Repo, issueTmp.IssueNum, owner, issueTmp.IssueLabel) - if !update { - logs.Error("update gitee issue label fail ") - appearErr++ - } - sn := models.SecurityNotice{CveId: issueTmp.CveId} - err = sn.Read("cve_id") - if err != nil { - return - } - switch issueTmp.IssueStatus { - case 2: - sn.AffectStatus = "Fixed" - case 6: - sn.AffectStatus = "UnAffected" - default: - sn.AffectStatus = "UnFixed" - } - err = sn.Update("affect_status") - if err != nil { - appearErr++ - logs.Error(err) - } - if appearErr > 0 { - logs.Error("handle issue state hook appear error maybe some step "+ - "fail, appearErr: ", appearErr, ",issuetmp: ", issueTmp) - return - } - } - return - } + securityApprove(&issueTmp, cuAccount, owner, token, fixed, unfixed) } } } else if strings.HasPrefix(cBody, cmdClose) { //close issue - issueTmp := models.IssueTemplate{IssueNum: issueNum} - err := models.GetIssueTemplateByColName(&issueTmp, "issue_num") + issueId := payload.Issue.Id + issueTmp := models.IssueTemplate{IssueNum: issueNum, IssueId: issueId} + err := models.GetIssueTemplateByColName(&issueTmp, "issue_num", "issue_id") if err != nil { logs.Error(err) return @@ -1064,8 +1051,9 @@ func isReviewer(path string) bool { } func analysisComment(issueNum string, cuAccount string, cBody string, payload *models.CommentPayload) { - issueTmp := models.IssueTemplate{IssueNum: issueNum} - err := models.GetIssueTemplateByColName(&issueTmp, "issue_num") + issueId := payload.Issue.Id + issueTmp := models.IssueTemplate{IssueNum: issueNum, IssueId: issueId} + err := models.GetIssueTemplateByColName(&issueTmp, "issue_num", "issue_id") if err != nil { logs.Error(err) return @@ -1076,22 +1064,7 @@ func analysisComment(issueNum string, cuAccount string, cBody string, payload *m return } canVerfy := false - issueTmp.MtAuditFlag = 0 - maintainerList, mainOk := models.QueryRepoAllMaintainer(issueTmp.Repo) - if mainOk && len(maintainerList) > 0 { - for _, v := range maintainerList { - if cuAccount == util.TrimString(v.MemberName) { - issueTmp.MtAuditFlag = 1 - break - } - } - } - - if issueTmp.MtAuditFlag != 1 { - if cuAccount == issueTmp.Assignee { - issueTmp.MtAuditFlag = 1 - } - } + issueTmp.MtAuditFlag = 1 accessToken := os.Getenv("GITEE_TOKEN") owner := beego.AppConfig.String("gitee::owner") path := issueTmp.Repo @@ -1113,6 +1086,10 @@ func analysisComment(issueNum string, cuAccount string, cBody string, payload *m case "openeuler_score": fv, err := strconv.ParseFloat(v, 64) if err == nil && fv > 0 { + if issueTmp.OpenEulerScore > 0 && issueTmp.OpenEulerScore != fv { + issueTmp.OpAuditFlag = 0 + cols = append(cols, "op_audit_flag") + } issueTmp.OpenEulerScore = fv cols = append(cols, k) } @@ -1181,8 +1158,8 @@ func analysisComment(issueNum string, cuAccount string, cBody string, payload *m logs.Error(err) } assignee := "" - if cuAccount != issueTmp.Assignee { - assignee = assignee + issueTmp.Assignee + " @" + cuAccount + if cuAccount != "" && len(cuAccount) > 1 { + assignee = cuAccount } else { assignee = issueTmp.Assignee } @@ -1193,7 +1170,8 @@ func analysisComment(issueNum string, cuAccount string, cBody string, payload *m issueTmp.IssueStatus = 3 //2. Are the cvsScore and openEuler score equal .If not equal, notify the auditor to review . var na string - if issueTmp.OpenEulerScore != issueTmp.NVDScore && issueTmp.OpenEulerScore > 0 && issueTmp.NVDScore > 0 { + if issueTmp.OpenEulerScore != issueTmp.NVDScore && issueTmp.OpenEulerScore > 0 && + issueTmp.NVDScore > 0 && issueTmp.OpAuditFlag == 0 { na = "\n**因OpenEulerScore与NvdScore不一致,分析内容需审核,请等待安全组审核!**" //Notify the responsible person for review notifyAuditorReview(payload, issueTmp) @@ -1229,10 +1207,10 @@ func analysisComment(issueNum string, cuAccount string, cBody string, payload *m logs.Error(err) } } - err := models.UpdateIssueTemplate(&issueTmp, "issue_status", "mt_audit_flag") - if err != nil { - logs.Error(err) - } + } + err := models.UpdateIssueTemplate(&issueTmp, "issue_status", "mt_audit_flag") + if err != nil { + logs.Error(err) } } } diff --git a/cve-py/import_excels/11_whitelist_2020-11-11.xlsx b/cve-py/import_excels/11_whitelist_2020-11-11.xlsx deleted file mode 100644 index 96e81753b97e4eb704a50773ed46933a66a2cb8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36133 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 E2O&7EH2?qr diff --git a/cve-py/import_excels/21_whitelist_2020-11-21.xlsx b/cve-py/import_excels/21_whitelist_2020-11-21.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..98b98e3761efd81dc098112c10f1450dfc6cd76c GIT binary patch literal 52993 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�>-K)`muu_KoUOThj! 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 ZB3XPr9co}kh?a~Kat_$9$ZF!d{{c3`V^9D9 literal 0 HcmV?d00001 diff --git a/taskhandler/createissue.go b/taskhandler/createissue.go index 5fcc8dc..d17d390 100644 --- a/taskhandler/createissue.go +++ b/taskhandler/createissue.go @@ -27,7 +27,7 @@ func CreateIssueData(issueTemp *models.IssueTemplate, cve models.VulnCenter, sc // issueTemp.SaAuditFlag = 0 //} if issueTemp.TemplateId == 0 { - issueTemp.MtAuditFlag = 0 + issueTemp.MtAuditFlag = 1 issueTemp.SaAuditFlag = 0 } issueTemp.NVDScore = sc.NVDScore -- Gitee