diff --git a/go.mod b/go.mod index 3fc2529d..ecbed56c 100644 --- a/go.mod +++ b/go.mod @@ -22,8 +22,8 @@ require ( github.com/cenkalti/backoff v2.2.1+incompatible github.com/google/subcommands v1.2.0 github.com/gosuri/uitable v0.0.4 + github.com/hashicorp/go-uuid v1.0.2 github.com/hashicorp/go-version v1.2.0 - github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c github.com/jesseduffield/gocui v0.3.0 github.com/k0kubun/pp v3.0.1+incompatible diff --git a/go.sum b/go.sum index a4a91214..f6f6b444 100644 --- a/go.sum +++ b/go.sum @@ -313,6 +313,8 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= diff --git a/report/report.go b/report/report.go index 1c82786a..0d5983f3 100644 --- a/report/report.go +++ b/report/report.go @@ -25,7 +25,7 @@ import ( "github.com/future-architect/vuls/oval" "github.com/future-architect/vuls/util" "github.com/future-architect/vuls/wordpress" - "github.com/hashicorp/uuid" + "github.com/hashicorp/go-uuid" gostdb "github.com/knqyf263/gost/db" cvedb "github.com/kotakanbe/go-cve-dictionary/db" cvemodels "github.com/kotakanbe/go-cve-dictionary/models" @@ -506,21 +506,25 @@ const reUUID = "[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}" // Scanning with the -containers-only, -images-only flag at scan time, the UUID of Container Host may not be generated, // so check it. Otherwise create a UUID of the Container Host and set it. -func getOrCreateServerUUID(r models.ScanResult, server c.ServerInfo) (serverUUID string) { +func getOrCreateServerUUID(r models.ScanResult, server c.ServerInfo) (serverUUID string, err error) { if id, ok := server.UUIDs[r.ServerName]; !ok { - serverUUID = uuid.GenerateUUID() + if serverUUID, err = uuid.GenerateUUID(); err != nil { + return "", xerrors.Errorf("Failed to generate UUID: %w", err) + } } else { matched, err := regexp.MatchString(reUUID, id) if !matched || err != nil { - serverUUID = uuid.GenerateUUID() + if serverUUID, err = uuid.GenerateUUID(); err != nil { + return "", xerrors.Errorf("Failed to generate UUID: %w", err) + } } } - return serverUUID + return serverUUID, nil } // EnsureUUIDs generate a new UUID of the scan target server if UUID is not assigned yet. // And then set the generated UUID to config.toml and scan results. -func EnsureUUIDs(configPath string, results models.ScanResults) error { +func EnsureUUIDs(configPath string, results models.ScanResults) (err error) { // Sort Host->Container sort.Slice(results, func(i, j int) bool { if results[i].ServerName == results[j].ServerName { @@ -538,13 +542,21 @@ func EnsureUUIDs(configPath string, results models.ScanResults) error { name := "" if r.IsContainer() { name = fmt.Sprintf("%s@%s", r.Container.Name, r.ServerName) - if uuid := getOrCreateServerUUID(r, server); uuid != "" { - server.UUIDs[r.ServerName] = uuid + serverUUID, err := getOrCreateServerUUID(r, server) + if err != nil { + return err + } + if serverUUID != "" { + server.UUIDs[r.ServerName] = serverUUID } } else if r.IsImage() { name = fmt.Sprintf("%s%s@%s", r.Image.Tag, r.Image.Digest, r.ServerName) - if uuid := getOrCreateServerUUID(r, server); uuid != "" { - server.UUIDs[r.ServerName] = uuid + serverUUID, err := getOrCreateServerUUID(r, server) + if err != nil { + return err + } + if serverUUID != "" { + server.UUIDs[r.ServerName] = serverUUID } } else { name = r.ServerName @@ -567,16 +579,19 @@ func EnsureUUIDs(configPath string, results models.ScanResults) error { } // Generate a new UUID and set to config and scan result - id := uuid.GenerateUUID() - server.UUIDs[name] = id + serverUUID, err := uuid.GenerateUUID() + if err != nil { + return err + } + server.UUIDs[name] = serverUUID server = cleanForTOMLEncoding(server, c.Conf.Default) c.Conf.Servers[r.ServerName] = server if r.IsContainer() { - results[i].Container.UUID = id + results[i].Container.UUID = serverUUID results[i].ServerUUID = server.UUIDs[r.ServerName] } else { - results[i].ServerUUID = id + results[i].ServerUUID = serverUUID } } diff --git a/report/report_test.go b/report/report_test.go index 57323f3c..5a58556a 100644 --- a/report/report_test.go +++ b/report/report_test.go @@ -42,7 +42,10 @@ func TestGetOrCreateServerUUID(t *testing.T) { } for testcase, v := range cases { - uuid := getOrCreateServerUUID(v.scanResult, v.server) + uuid, err := getOrCreateServerUUID(v.scanResult, v.server) + if err != nil { + t.Errorf("%s", err) + } if (uuid == defaultUUID) != v.isDefault { t.Errorf("%s : expected isDefault %t got %s", testcase, v.isDefault, uuid) }