diff --git a/cve-vulner-manager/controllers/hook.go b/cve-vulner-manager/controllers/hook.go index 8f7e10543e51705adbf347c39aa41986ff5be25c..253e8e0726331546aca6a51a1a3953c2068fd21a 100644 --- a/cve-vulner-manager/controllers/hook.go +++ b/cve-vulner-manager/controllers/hook.go @@ -3339,13 +3339,14 @@ func AddIssueComment(token, owner, path, issueNum, assignee string, issueId int6 cveList := strings.Split(cveCenter.CveVersion, ",") if len(cveList) > 0 { for _, vl := range cveList { - ms := models.MindSporeYaml{PackageName: cveCenter.RepoName, Version: vl, Repo: cveCenter.PackName} - sporeErr := models.GetMindSporeYaml(&ms, "PackageName", "Version", "Repo") - if ms.Id > 0 { - path = ms.Repo - break + data, _ := models.GetMindSporeYamlAll(&models.MindSporeYaml{PackageName: cveCenter.RepoName}) + for _, v := range data { + version := strings.TrimSpace(string(util.Symbol.ReplaceAll([]byte(v.Version), []byte("")))) + if v.Repo == cveCenter.PackName && taskhandler.JudgeVersion(vl, version, v.Version) { + path = v.Repo + break + } } - logs.Info("GetMindSporeYaml, sporeErr: ", sporeErr) } } // Get branch information diff --git a/cve-vulner-manager/models/cve.go b/cve-vulner-manager/models/cve.go index 410620c127469383350979a439d3e251fb6e8a3c..f161ca72b3a24a227619d146ba3fd8860464cf65 100644 --- a/cve-vulner-manager/models/cve.go +++ b/cve-vulner-manager/models/cve.go @@ -236,13 +236,13 @@ func QueryCveByPackName(cveNum, packName string, organizateId int8) (vc []VulnCe return } -func QueryCveByNum(cveNum, packName string, organizateId int8) (VulnCenter, bool) { +func QueryCveByNum(cveNum, packName, pkgname string, organizateId int8) (VulnCenter, bool) { o := orm.NewOrm() var cve VulnCenter // binary : strictly case sensitive SQL search err := o.Raw("select * from cve_vuln_center where cve_num = ? and "+ - "binary pack_name = ? and organizate_id = ? order by cve_id desc limit 1", - cveNum, packName, organizateId).QueryRow(&cve) + "binary pack_name = ? and organizate_id = ? and repo_name = ? order by cve_id desc limit 1", + cveNum, packName, organizateId, pkgname).QueryRow(&cve) if err != nil || cve.CveId == 0 { logs.Error("QueryCveByNum, cve_vuln_center, cveNum: ", cveNum, ",packName: ", packName, ", err: ", err) diff --git a/cve-vulner-manager/models/uploadcve.go b/cve-vulner-manager/models/uploadcve.go index 2af55db38e10d4a865536eb711afb66d65345673..16d66cf182850b32c5ced03190f786ef4f040854 100644 --- a/cve-vulner-manager/models/uploadcve.go +++ b/cve-vulner-manager/models/uploadcve.go @@ -1184,6 +1184,14 @@ func GetMindSporeYaml(opy *MindSporeYaml, colName ...string) error { return err } } +func GetMindSporeYamlForids(ids []string) (msy []MindSporeYaml, err error) { + if len(ids) == 0 { + return + } + o := orm.NewOrm() + _, err = o.Raw(fmt.Sprintf("select * from cve_mind_spore_yaml where id in (%s) order by id asc", strings.Join(ids, ","))).QueryRows(&msy) + return +} func GetMindSporeYamlAll(opy *MindSporeYaml) (msy []MindSporeYaml, err error) { o := orm.NewOrm() diff --git a/cve-vulner-manager/task/issuetask.go b/cve-vulner-manager/task/issuetask.go index e23ba9afc0ea4fe2257e835fc1961eeb84e82de2..41617f0526930aedc97f7630061eb15f1067e188 100644 --- a/cve-vulner-manager/task/issuetask.go +++ b/cve-vulner-manager/task/issuetask.go @@ -12,6 +12,7 @@ import ( "cvevulner/common" "cvevulner/models" "cvevulner/taskhandler" + "cvevulner/util" "github.com/astaxie/beego" "github.com/astaxie/beego/config" @@ -715,14 +716,18 @@ func MindSporeIssue(issueValue models.VulnCenter, accessToken, owner, path, assi cveList := strings.Split(issueValue.CveVersion, ",") if len(cveList) > 0 { for _, vl := range cveList { - ms := models.MindSporeYaml{PackageName: issueValue.RepoName, Version: vl, Repo: issueValue.PackName} - sporeErr := models.GetMindSporeYaml(&ms, "PackageName", "Version", "Repo") - if ms.Id > 0 { - assignee = ms.Owner - flag = true + data, _ := models.GetMindSporeYamlAll(&models.MindSporeYaml{PackageName: issueValue.RepoName}) + for _, v := range data { + version := strings.TrimSpace(string(util.Symbol.ReplaceAll([]byte(v.Version), []byte("")))) + if v.Repo == issueValue.PackName && taskhandler.JudgeVersion(vl, version, v.Version) { + assignee = v.Owner + flag = true + break + } + } + if flag { break } - logs.Info("GetMindSporeYaml, sporeErr: ", sporeErr) } } if !flag || len(assignee) < 1 { diff --git a/cve-vulner-manager/taskhandler/common.go b/cve-vulner-manager/taskhandler/common.go index 7a55a1d745428642c0fdc4a3edc25db30dbdb70a..db2b8c944bfe690c622f571615735e9747f7705a 100644 --- a/cve-vulner-manager/taskhandler/common.go +++ b/cve-vulner-manager/taskhandler/common.go @@ -987,11 +987,13 @@ func CreateIssueBody(accessToken, owner, path, assignee string, cveList := strings.Split(cve.CveVersion, ",") if len(cveList) > 0 { for _, vl := range cveList { - ms := models.MindSporeYaml{PackageName: cve.RepoName, Version: vl, Repo: cve.PackName} - _ = models.GetMindSporeYaml(&ms, "PackageName", "Version", "Repo") - if ms.Id > 0 && ms.Milestone > 0 { - mile = ms.Milestone - break + data, _ := models.GetMindSporeYamlAll(&models.MindSporeYaml{PackageName: cve.RepoName}) + for _, v := range data { + version := strings.TrimSpace(string(util.Symbol.ReplaceAll([]byte(v.Version), []byte("")))) + if v.Repo == cve.PackName && JudgeVersion(vl, version, v.Version) { + mile = v.Milestone + break + } } } } diff --git a/cve-vulner-manager/taskhandler/cve.go b/cve-vulner-manager/taskhandler/cve.go index 44d67e2893aafefb1641b3101e7e587a5f0849d3..f62bb4f169621a3284346c64ab3515f67bd8531a 100644 --- a/cve-vulner-manager/taskhandler/cve.go +++ b/cve-vulner-manager/taskhandler/cve.go @@ -18,6 +18,7 @@ import ( "cvevulner/common" "cvevulner/cve-timed-task/tabletask" "cvevulner/models" + "cvevulner/util" "github.com/astaxie/beego" "github.com/astaxie/beego/config" @@ -46,6 +47,7 @@ type UpdateInfoXml struct { type PackageVersion struct { OrganizationID int8 VerionList []string + ids []string } func UpdateExcelCveGroups(cveData models.OriginExcel, @@ -884,6 +886,7 @@ func GenCveVuler(cveData models.OriginUpstream, cveRef string, openeulernum int) pvList := make([]PackageVersion, 0) openGausVersion := make([]string, 0) mindSporeVersion := make([]string, 0) + mindSporeids := make([]string, 0) openEulerVersion := make([]string, 0) openLooKengVersion := make([]string, 0) versionList := make([]string, 0) @@ -898,9 +901,8 @@ func GenCveVuler(cveData models.OriginUpstream, cveRef string, openeulernum int) openGausVersion = append(openGausVersion, ver) gaussFlag = true } - ms := models.MindSporeYaml{PackageName: key, Version: ver} - sporeErr := models.GetMindSporeYaml(&ms, "PackageName", "Version") - if sporeErr == nil && ms.Id > 0 { + if flag, ids := judgeSocpe(key, ver); flag && len(ids) > 0 { + mindSporeids = append(mindSporeids, ids...) mindSporeVersion = append(mindSporeVersion, ver) sporeFlag = true } @@ -944,7 +946,7 @@ func GenCveVuler(cveData models.OriginUpstream, cveRef string, openeulernum int) if sporeFlag { organizationID = int8(3) mindSporeVersion = common.RemoveDupString(mindSporeVersion) - pv := PackageVersion{OrganizationID: organizationID, VerionList: mindSporeVersion} + pv := PackageVersion{OrganizationID: organizationID, VerionList: mindSporeVersion, ids: mindSporeids} pvList = append(pvList, pv) } if looKengFlag { @@ -1010,19 +1012,14 @@ func AddOrSelectToCenter(packageName, cveRef, scopeType, value string, cveData m } } else if organizationID == 3 { mindSporeVersion := pv.VerionList - if len(mindSporeVersion) > 0 { + if len(pv.ids) > 0 && len(mindSporeVersion) > 0 { + list, err := models.GetMindSporeYamlForids(pv.ids) mindMap := make(map[string]string) - for _, ver := range mindSporeVersion { - ms := models.MindSporeYaml{PackageName: packageName, Version: ver} - msy, mErr := models.GetMindSporeYamlAll(&ms) - if len(msy) > 0 { - for _, my := range msy { - if _, ok := mindMap[my.Repo]; !ok { - mindMap[my.Repo] = packageName - } + if err == nil && len(list) > 0 { + for _, my := range list { + if _, ok := mindMap[my.Repo]; !ok { + mindMap[my.Repo] = packageName } - } else { - logs.Error("MindSpore, mErr: ", mErr) } } if len(mindMap) > 0 { @@ -1085,7 +1082,7 @@ func AddOrDataToCenter(repoNme, packageName, cveRef, scopeType, value string, cv if repoNme == "OpenSSL" && organizationID == 1 { return true, nil } - CveRes, err := models.QueryCveByNum(cveData.CveNum, repoNme, organizationID) + CveRes, err := models.QueryCveByNum(cveData.CveNum, repoNme, packageName, organizationID) if err { CveRes.RepoName = packageName if CveRes.DataSource == 1 || CveRes.DataSource == 5 { @@ -1211,9 +1208,13 @@ func SyncCveVuler(cveData models.OriginExcel, cveRef string, openeulerNum, manYe organizationID = 4 organizationList = append(organizationList, organizationID) } - ms := models.MindSporeYaml{PackageName: cveData.PackName, Version: cveData.CveVersion} - sporeErr := models.GetMindSporeYaml(&ms, "PackageName", "Version") - if sporeErr == nil && ms.Id > 0 { + //ms := models.MindSporeYaml{PackageName: cveData.PackName, Version: cveData.CveVersion} + //sporeErr := models.GetMindSporeYaml(&ms, "PackageName", "Version") + //if sporeErr == nil && ms.Id > 0 { + // organizationID = 3 + // organizationList = append(organizationList, organizationID) + //} + if flag, _ := judgeSocpe(cveData.PackName, cveData.CveVersion); flag { organizationID = 3 organizationList = append(organizationList, organizationID) } @@ -1289,19 +1290,20 @@ func AddExcelToCenter(cveData models.OriginExcel, cveRef string, openeulerNum in return false, mErr } } else if organizationID == 3 { - ms := models.MindSporeYaml{PackageName: cveData.PackName, Version: cveData.CveVersion} - msy, mErr := models.GetMindSporeYamlAll(&ms) - if len(msy) > 0 { - for _, my := range msy { - ok, dErr := AddExDataToCenter(cveData, cveRef, my.Repo, openeulerNum, goe, organizationID) - if !ok { - logs.Error("MindSpore, dErr: ", dErr) - return ok, dErr + if flag, ids := judgeSocpe(cveData.PackName, cveData.CveVersion); flag && len(ids) > 0 { + msy, mErr := models.GetMindSporeYamlForids(ids) + if len(msy) > 0 { + for _, my := range msy { + ok, dErr := AddExDataToCenter(cveData, cveRef, my.Repo, openeulerNum, goe, organizationID) + if !ok { + logs.Error("MindSpore, dErr: ", dErr) + return ok, dErr + } } + } else { + logs.Error("MindSpore, mErr: ", mErr) + return false, mErr } - } else { - logs.Error("MindSpore, mErr: ", mErr) - return false, mErr } } else if organizationID == 2 { opy := models.OpenGussYaml{PackageName: cveData.PackName, Version: cveData.CveVersion} @@ -1331,7 +1333,7 @@ func AddExcelToCenter(cveData models.OriginExcel, cveRef string, openeulerNum in func AddExDataToCenter(cveData models.OriginExcel, cveRef, repoName string, openeulerNum int, goe models.GitPackageInfo, organizationID int8) (bool, error) { - CveRes, err := models.QueryCveByNum(cveData.CveNum, repoName, organizationID) + CveRes, err := models.QueryCveByNum(cveData.CveNum, repoName, cveData.PackName, organizationID) if err { CveRes.RepoName = cveData.PackName retVersion := AddCveVersion(organizationID, []string{cveData.CveVersion}, CveRes.CveVersion) @@ -2233,7 +2235,7 @@ func GenCveVulerByIssue(cveData models.GiteOriginIssue, cveRef string, openeuler if cveData.State != "" && (strings.ToLower(cveData.State) == "rejected" || cveData.State == "已拒绝" || cveData.IssueState == "已拒绝" || cveData.IssueState == "已挂起") { logs.Info("Process data whose issue status is rejected:", cveData) - cvd, ok := models.QueryCveByNum(cveData.CveNumber, cveData.RepoPath, organizationID) + cvd, ok := models.QueryCveByNum(cveData.CveNumber, cveData.RepoPath, hole.Components, organizationID) if ok && cvd.CveNum != "" { lock.Lock() upOk, upError := UpdateIssueCveGroups(cveData, hole, cveRef, openeulernum, 2, goe, cvd, owner) @@ -2253,7 +2255,7 @@ func GenCveVulerByIssue(cveData models.GiteOriginIssue, cveRef string, openeuler return true, nil } else if cveData.State != "" && (strings.ToLower(cveData.State) == "closed" || cveData.State == "已完成") { logs.Info("Process data whose issue status is closed:", cveData) - cvd, ok := models.QueryCveByNum(cveData.CveNumber, cveData.RepoPath, organizationID) + cvd, ok := models.QueryCveByNum(cveData.CveNumber, cveData.RepoPath, hole.Components, organizationID) if ok && cvd.CveNum != "" { lock.Lock() upOk, upError := UpdateIssueCveGroups(cveData, hole, cveRef, openeulernum, 2, goe, cvd, owner) @@ -2273,7 +2275,7 @@ func GenCveVulerByIssue(cveData models.GiteOriginIssue, cveRef string, openeuler return true, nil } else { logs.Info("Process data whose issue status is open and processing:", cveData) - cvd, ok := models.QueryCveByNum(cveData.CveNumber, cveData.RepoPath, organizationID) + cvd, ok := models.QueryCveByNum(cveData.CveNumber, cveData.RepoPath, hole.Components, organizationID) if ok && len(cvd.CveNum) > 1 { if openFlag == 1 { lock.Lock() @@ -2723,3 +2725,44 @@ func GetIssuePriority(cveLevel string) (priority int) { } return } + +func judgeSocpe(pkgname, ver string) (flag bool, ids []string) { + list, sporeErr := models.GetMindSporeYamlAll(&models.MindSporeYaml{PackageName: pkgname}) + if sporeErr == nil && len(list) > 0 { + for _, v := range list { + version := strings.TrimSpace(string(util.Symbol.ReplaceAll([]byte(v.Version), []byte("")))) + if JudgeVersion(strings.TrimSpace(ver), version, v.Version) { + flag = true + ids = append(ids, strconv.Itoa(int(v.Id))) + } + } + } else { + return + } + return +} + +func JudgeVersion(ver1, ver2, sourceVer string) bool { + if strings.Contains(sourceVer, ">=") { + if ver1 >= ver2 { + return true + } + } else if strings.Contains(sourceVer, ">") { + if ver1 > ver2 { + return true + } + } else if strings.Contains(sourceVer, "<=") { + if ver1 <= ver2 { + return true + } + } else if strings.Contains(sourceVer, "<") { + if ver1 < ver2 { + return true + } + } else { + if ver1 == ver2 { + return true + } + } + return false +} diff --git a/cve-vulner-manager/taskhandler/issue.go b/cve-vulner-manager/taskhandler/issue.go index 3eba8e9fbf0cd20ceed7dc3cb29b824c6c195a14..e8559c213d53608f00957bbdc1e91c44556040e3 100644 --- a/cve-vulner-manager/taskhandler/issue.go +++ b/cve-vulner-manager/taskhandler/issue.go @@ -181,7 +181,7 @@ func CheckOriginUpstreamToCenter(ous []models.OriginUpstream, if len(versionList) > 0 { _, ok := common.FindSliceEm(versionList, packageVersion) if key == packageName && ok { - cveRes, cveOk := models.QueryCveByNum(ou.CveNum, repoName, organizationID) + cveRes, cveOk := models.QueryCveByNum(ou.CveNum, repoName, packageName, organizationID) if cveOk && cveRes.Status == 12 { continue } diff --git a/cve-vulner-manager/taskhandler/oricvecheck.go b/cve-vulner-manager/taskhandler/oricvecheck.go index 1cc08fa3e8dd3bd4392264b2feba5b8e498fcb8f..2983e8ada0adcd5056f965f2db110c149f6c7645 100644 --- a/cve-vulner-manager/taskhandler/oricvecheck.go +++ b/cve-vulner-manager/taskhandler/oricvecheck.go @@ -1,12 +1,14 @@ package taskhandler import ( - "cvevulner/common" - "cvevulner/models" - "github.com/astaxie/beego/logs" "strconv" "strings" "time" + + "cvevulner/common" + "cvevulner/models" + + "github.com/astaxie/beego/logs" ) func CheckCveOriginData(prcnum int) (string, error) { @@ -52,11 +54,9 @@ func CheckCveOriginData(prcnum int) (string, error) { logs.Info("Data added to the cve vulnerability: ", cveData, ", gits: ", gits) continue } - ms := models.MindSporeYaml{PackageName: pkList[0], Version: pkList[1]} - sporeErr := models.GetMindSporeYaml(&ms, "PackageName", "Version") - if ms.Id > 0 { + if flag, _ := judgeSocpe(pkList[0], pkList[1]); flag { models.UpdateOriginExist(common.GetCurTime(), cveData.PackName, cveData.Version, cveData.CveId, 1) - logs.Info("Correspondence between warehouse and version is wrong, restore: ", cveData, ", gits: ", gits, sporeErr) + logs.Info("Correspondence between warehouse and version is wrong, restore: ", cveData, ", gits: ", gits) continue } opky := models.OpenLookengYaml{PackageName: pkList[0], Version: pkList[1]} diff --git a/cve-vulner-manager/util/parsepayload.go b/cve-vulner-manager/util/parsepayload.go index ef63c8f67eb117895db0da546bd95563b0f965f1..e77f2bb3a079cbe59a476d3129798e3ba36024f5 100644 --- a/cve-vulner-manager/util/parsepayload.go +++ b/cve-vulner-manager/util/parsepayload.go @@ -1,13 +1,15 @@ package util import ( - "cvevulner/common" "fmt" - "github.com/astaxie/beego/logs" "regexp" "sort" "strings" "sync" + + "cvevulner/common" + + "github.com/astaxie/beego/logs" ) const ( @@ -113,6 +115,8 @@ var ( RegexpCveAbiNew = regexp.MustCompile(`[修复]?是否涉及abi变化\(是/否\)[::](?s:(.*?))$`) RegexpCveAbiFixNew = regexp.MustCompile(`[修复]?是否涉及abi变化\(是/否\)[::](?s:(.*?))三、漏洞修复`) RegMatchCve = regexp.MustCompile("^CVE-[0-9]+-[0-9]+$") + + Symbol = regexp.MustCompile(">|>=|<|<=|=") ) var (