diff --git a/cve-vulner-manager/controllers/cve.go b/cve-vulner-manager/controllers/cve.go index b2e0542d84d78a5cbc2f59eccc5259c9755d815f..ac39ff1e8f8256e8397d1edb25bff2909d103265 100644 --- a/cve-vulner-manager/controllers/cve.go +++ b/cve-vulner-manager/controllers/cve.go @@ -6,7 +6,12 @@ import ( "strings" "time" + "github.com/astaxie/beego" + "github.com/astaxie/beego/orm" + "k8s.io/apimachinery/pkg/util/sets" + "cvevulner/common" + "cvevulner/errcode" "cvevulner/models" "cvevulner/taskhandler" @@ -378,3 +383,111 @@ func (u *KanbanCveAllIssueController) Get() { u.noData(resp, nil) } + +type UpdateAffectedBranchController struct { + BaseController +} + +func (u *UpdateAffectedBranchController) Post() { + branch := u.Ctx.Request.Form.Get("branch") + date := u.Ctx.Request.Form.Get("date") + cveNum := u.Ctx.Request.Form.Get("cve_num") + token := u.Ctx.Request.Header.Get("token") + + resp := make(map[string]interface{}) + + if token == "" || !models.CheckToken(token) { + resp["errno"] = errcode.RecodeSessionErr + resp["errmsg"] = errcode.RecodeText(errcode.RecodeSessionErr) + u.response(resp) + } + + affectedBranchs := beego.AppConfig.String("cve::affected_branchs") + affectedBranchsSet := sets.NewString(strings.Split(affectedBranchs, ",")...) + if !affectedBranchsSet.Has(branch) { + u.paramError(resp) + } + + _, err := time.Parse("2006-01-02", date) + if err != nil { + u.paramError(resp) + } + + issues, err := models.QueryIssueToUpdateAffected(date, cveNum) + if err != nil { + resp["errno"] = errcode.RecodeDbErr + resp["errmsg"] = errcode.RecodeText(errcode.RecodeDbErr) + u.response(resp) + } + + o := orm.NewOrm() + for _, issue := range issues { + if strings.Contains(issue.AffectedVersion, branch) { + continue + } + + appendStr := fmt.Sprintf(",%s:", branch) + issue.AffectedVersion += appendStr + issue.AbiVersion += appendStr + + var vuln models.VulnCenter + err = models.GetVulnCenterByCVEID(&vuln, issue.CveId) + if err != nil { + updateAffectedLog("get vuln", err) + continue + } + + _, err = taskhandler.UpdateIssueToGit("", "", vuln.PackName, vuln, issue) + if err != nil { + updateAffectedLog("update gitee", err) + continue + } + + err = models.UpdateIssueTemplate(&issue, "AffectedVersion", "AbiVersion") + if err != nil { + updateAffectedLog("update issue template", err) + continue + } + + o.Insert(&models.UpdatedAffectedBranch{ + IssueNum: issue.IssueNum, + CveNum: issue.CveNum, + Package: vuln.PackName, + Branch: branch, + CreateTime: time.Now().Format(common.DATE_FORMAT), + UpdateTime: time.Now().Format(common.DATE_FORMAT), + }) + } + + resp["errno"] = errcode.RecodeOk + resp["errmsg"] = errcode.RecodeText(errcode.RecodeOk) + u.response(resp) +} + +func updateAffectedLog(t string, err error) { + logs.Error("update affected, %s err: %s", t, err.Error()) +} + +func (u *UpdateAffectedBranchController) Get() { + resp := make(map[string]interface{}) + + page, err := u.GetInt("page", 1) + if err != nil { + u.paramError(resp) + } + + pageSize, err := u.GetInt("page_size", 10) + if err != nil { + u.paramError(resp) + } + + data, err := models.QueryUpdatedAffected(page, pageSize) + if err != nil { + resp["errno"] = errcode.RecodeDbErr + resp["errmsg"] = errcode.RecodeText(errcode.RecodeDbErr) + u.response(resp) + } + + resp["body"] = data + u.success(resp) +} diff --git a/cve-vulner-manager/go.mod b/cve-vulner-manager/go.mod index b4af9191be47aa724e8f6fdf2daf66fd7ff6b021..8b93be2e5cb47c6bd77dfd9e11a4182af0319433 100644 --- a/cve-vulner-manager/go.mod +++ b/cve-vulner-manager/go.mod @@ -17,6 +17,7 @@ require ( golang.org/x/net v0.19.0 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/yaml.v2 v2.4.0 + k8s.io/apimachinery v0.25.3 ) require ( @@ -24,7 +25,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.1 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.5.0 // indirect + github.com/golang/protobuf v1.5.2 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect diff --git a/cve-vulner-manager/go.sum b/cve-vulner-manager/go.sum index 03f2bbf29145101c2bbb34ed1392b9a3e715a583..d5f84d5d92f0603b85f67001dc6dac211dc8b350 100644 --- a/cve-vulner-manager/go.sum +++ b/cve-vulner-manager/go.sum @@ -66,8 +66,9 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= @@ -291,6 +292,7 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -316,5 +318,7 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.25.3 h1:7o9ium4uyUOM76t6aunP0nZuex7gDf8VGwkR5RcJnQc= +k8s.io/apimachinery v0.25.3/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cve-vulner-manager/models/cve.go b/cve-vulner-manager/models/cve.go index b80673427b8f1c084b1b7d24d8dfd0aaa988a6e3..eea28a46784ce4065b1b5fdb60db0de7ff3daf05 100644 --- a/cve-vulner-manager/models/cve.go +++ b/cve-vulner-manager/models/cve.go @@ -1427,3 +1427,26 @@ func QueryCveIssueForSbom(pkgname, version string) (data []sbomIssue, err error) _, err = o.Raw(fmt.Sprintf(sql, pkgname, version)).QueryRows(&data) return } + +func QueryIssueToUpdateAffected(date, cveNum string) (data []IssueTemplate, err error) { + o := orm.NewOrm() + var sql string + if cveNum != "" { + sql = fmt.Sprintf(`select * from cve_issue_template where owner = "%s" and status < 3 and cve_num = "%s"`, "src-openeuler", cveNum) + } else { + sql = fmt.Sprintf(`select * from cve_issue_template where owner = "%s" and status < 3 and create_time > "%s"`, "src-openeuler", date) + } + + _, err = o.Raw(sql).QueryRows(&data) + + return +} + +func QueryUpdatedAffected(page, pageSize int) (data []UpdatedAffectedBranch, err error) { + qs := orm.NewOrm().QueryTable("cve_updated_affected_branch") + offset := (page - 1) * pageSize + + _, err = qs.Limit(pageSize, offset).All(&data) + + return +} diff --git a/cve-vulner-manager/models/modeldb.go b/cve-vulner-manager/models/modeldb.go index 6e4245cb18726c4debce3a1b74cf5964ca11bb3a..e7ef2f74b1354c882584f23e8c23be410e902606 100644 --- a/cve-vulner-manager/models/modeldb.go +++ b/cve-vulner-manager/models/modeldb.go @@ -1076,6 +1076,16 @@ type HotPatch struct { UpdateTime string `orm:"size(32);column(updated_at);null"` } +type UpdatedAffectedBranch struct { + Id int64 `orm:"pk;auto;column(id)"` + IssueNum string `orm:"size(256);column(issue_num);unique"` + CveNum string `orm:"size(256);column(cve_num)"` + Package string `orm:"size(256);column(package)"` + Branch string `orm:"size(256);column(branch)"` + CreateTime string `orm:"size(32);column(created_at)"` + UpdateTime string `orm:"size(32);column(updated_at);null"` +} + func CreateDb() bool { BConfig, err := config.NewConfig("ini", "conf/app.conf") if err != nil { @@ -1117,7 +1127,7 @@ func CreateDb() bool { new(OpenLookengSecurityReviewer), new(OpenLookengYaml), new(IssueCommunityStatistics), new(CommunityYamlConfig), new(IssueDeleteRecord), new(AuthTokenInfo), new(OriginUpstreamPatch), new(OriginUpstreamPackageUrl), - new(Reviewer), new(HotPatch), new(OriginUpstreamPatchFirstTime), + new(Reviewer), new(HotPatch), new(OriginUpstreamPatchFirstTime), new(UpdatedAffectedBranch), ) logs.Info("table create success!") errosyn := orm.RunSyncdb("default", false, true) diff --git a/cve-vulner-manager/routers/commentsRouter_controllers.go b/cve-vulner-manager/routers/commentsRouter_controllers.go index 62fb9e632fe594199dda3b8d9a6ed1187e3fc09f..39da061193df113327fdaefde5d3f63da27a03fb 100644 --- a/cve-vulner-manager/routers/commentsRouter_controllers.go +++ b/cve-vulner-manager/routers/commentsRouter_controllers.go @@ -328,4 +328,22 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["cvevulner/controllers:UpdateAffectedBranchController"] = append(beego.GlobalControllerRouter["cvevulner/controllers:UpdateAffectedBranchController"], + beego.ControllerComments{ + Method: "Post", + Router: "/", + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + + beego.GlobalControllerRouter["cvevulner/controllers:UpdateAffectedBranchController"] = append(beego.GlobalControllerRouter["cvevulner/controllers:UpdateAffectedBranchController"], + beego.ControllerComments{ + Method: "Get", + Router: "/", + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + } diff --git a/cve-vulner-manager/routers/router.go b/cve-vulner-manager/routers/router.go index 1a218a1295f394956b4b0c33898e1da088af09e3..71e92d08f14660917265d82ba78b3464b19e3f41 100644 --- a/cve-vulner-manager/routers/router.go +++ b/cve-vulner-manager/routers/router.go @@ -8,8 +8,9 @@ package routers import ( - "cvevulner/controllers" "github.com/astaxie/beego" + + "cvevulner/controllers" ) func init() { @@ -50,8 +51,7 @@ func init() { ), ), beego.NSNamespace("/issue/hook/event", - beego.NSInclude(&controllers.HookEventControllers{}, - ), + beego.NSInclude(&controllers.HookEventControllers{}), ), beego.NSNamespace("/download/excel", beego.NSInclude( @@ -91,6 +91,12 @@ func init() { &controllers.KanbanCveAllIssueController{}, ), ), + // Update new affected branch to issue + beego.NSNamespace("/update/affected/branch", + beego.NSInclude( + &controllers.UpdateAffectedBranchController{}, + ), + ), // openGauss generates a summary of Sa data, and manually triggers the data at regular intervals beego.NSNamespace("/gauss/triggerCveData", beego.NSInclude(