providers/idefense/schema/convertutils.go (122 lines of code) (raw):

// Copyright (c) Facebook, Inc. and its affiliates. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package schema import ( "time" "github.com/facebookincubator/flog" nvd "github.com/facebookincubator/nvdtools/cvefeed/nvd/schema" "github.com/facebookincubator/nvdtools/wfn" ) const ( timeLayout = "2006-01-02T15:04:05.000Z" ) type configuration struct { Cpe23Uri string // key Affected []affected HasFixedBy bool FixedByVersion string } type affected struct { Version string Prior bool } func convertTime(idefenseTime string) (string, error) { t, err := time.Parse(timeLayout, idefenseTime) if err != nil { // should be parsable return "", err } return t.Format(nvd.TimeLayout), nil } func (item *Vulnerability) findConfigurations() []configuration { configMap := make(map[string]configuration) if item.Affects == nil { return confMap2Slice(configMap) } // add affected vuln tech for _, vulnTech := range item.Affects.VulnTechs { attrs, err := createAttributes(vulnTech.Part, vulnTech.Vendor, vulnTech.Product) if err != nil { flog.Errorln(err) continue } cpe23Uri := attrs.BindToFmtString() config, ok := configMap[cpe23Uri] if !ok { config = configuration{Cpe23Uri: cpe23Uri} } config.Affected = append(config.Affected, affected{ Version: vulnTech.Version, Prior: vulnTech.AndPriorVersions, }) configMap[cpe23Uri] = config } // add affected packages for _, pkg := range item.Affects.Packages { attrs, err := createAttributes("a", "", pkg.PackageName) if err != nil { flog.Errorln(err) continue } cpe23Uri := attrs.BindToFmtString() config, ok := configMap[cpe23Uri] if !ok { config = configuration{Cpe23Uri: cpe23Uri} } config.Affected = append(config.Affected, affected{ Version: pkg.PackageVersion, Prior: pkg.AndPriorVersions, }) configMap[cpe23Uri] = config } if item.FixedBy == nil { return confMap2Slice(configMap) } // add vuln tech fixes for _, vulnTech := range item.FixedBy.VulnTechs { attrs, err := createAttributes(vulnTech.Part, vulnTech.Vendor, vulnTech.Product) if err != nil { flog.Errorln(err) continue } cpe23Uri := attrs.BindToFmtString() if config, ok := configMap[cpe23Uri]; ok { config.HasFixedBy = true config.FixedByVersion = vulnTech.Version configMap[cpe23Uri] = config } } // add package fixes for _, pkg := range item.FixedBy.Packages { attrs, err := createAttributes("a", "", pkg.PackageName) if err != nil { flog.Errorln(err) continue } cpe23Uri := attrs.BindToFmtString() if config, ok := configMap[cpe23Uri]; ok { config.HasFixedBy = true config.FixedByVersion = pkg.PackageVersion configMap[cpe23Uri] = config } } return confMap2Slice(configMap) } func confMap2Slice(m map[string]configuration) []configuration { s := make([]configuration, len(m)) for _, cfg := range m { s = append(s, cfg) } return s } func createAttributes(part, vendor, product string) (*wfn.Attributes, error) { var err error if part, err = wfn.WFNize(part); err != nil { return nil, err } if vendor, err = wfn.WFNize(vendor); err != nil { return nil, err } if product, err = wfn.WFNize(product); err != nil { return nil, err } v := wfn.Attributes{ Part: part, Vendor: vendor, Product: product, } return &v, nil }