Skip to content

Commit 70b4e18

Browse files
Treat invalid PMDs as error and stop processing if needed
* Improve how PMD validation result is used when searching for a valid PMD. We now stop if no PMD can be validated against the json schema.
1 parent 3bb8ea0 commit 70b4e18

4 files changed

Lines changed: 23 additions & 12 deletions

File tree

cmd/csaf_aggregator/processor.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ func (w *worker) locateProviderMetadata(domain string) error {
8585
"Looking for provider-metadata.json of '"+domain+"': "+format+"\n", args...)
8686
})
8787

88-
if lpmd == nil {
89-
return fmt.Errorf("no provider-metadata.json found for '%s'", domain)
88+
if !lpmd.Valid() {
89+
return fmt.Errorf("no valid provider-metadata.json found for '%s'", domain)
9090
}
9191

9292
w.metadataProvider = lpmd.Document

cmd/csaf_checker/processor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1062,7 +1062,7 @@ func (p *processor) checkProviderMetadata(domain string) error {
10621062

10631063
lpmd := csaf.LoadProviderMetadataForDomain(client, domain, p.badProviderMetadata.warn)
10641064

1065-
if lpmd == nil {
1065+
if !lpmd.Valid() {
10661066
p.badProviderMetadata.error("No valid provider-metadata.json found.")
10671067
p.badProviderMetadata.error("STOPPING here - cannot perform other checks.")
10681068
return errStop

cmd/csaf_downloader/downloader.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ func (d *downloader) download(domain string) error {
9393
"Looking for provider-metadata.json of '"+domain+"': "+format+"\n", args...)
9494
})
9595

96-
if lpmd == nil {
97-
return fmt.Errorf("no provider-metadata.json found for '%s'", domain)
96+
if !lpmd.Valid() {
97+
return fmt.Errorf("no valid provider-metadata.json found for '%s'", domain)
9898
}
9999

100100
base, err := url.Parse(lpmd.URL)

csaf/util.go

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ type LoadedProviderMetadata struct {
3434
Messages []string
3535
}
3636

37+
// Valid returns true if the loaded document is valid.
38+
func (lpm *LoadedProviderMetadata) Valid() bool {
39+
return lpm != nil && lpm.Document != nil && lpm.Hash != nil
40+
}
41+
3742
// defaultLogging generates a logging function if given is nil.
3843
func defaultLogging(
3944
logging func(format string, args ...interface{}),
@@ -80,15 +85,17 @@ func LoadProviderMetadataFromURL(
8085

8186
tee := io.TeeReader(res.Body, hash)
8287

83-
err = json.NewDecoder(tee).Decode(&result.Document)
88+
var doc interface{}
89+
90+
err = json.NewDecoder(tee).Decode(&doc)
8491
// Before checking the err lets check if we had the same
8592
// document before. If so it will have failed parsing before.
8693

87-
result.Hash = hash.Sum(nil)
94+
sum := hash.Sum(nil)
8895

8996
var key string
9097
if already != nil {
91-
key = string(result.Hash)
98+
key = string(sum)
9299
if r, ok := already[key]; ok {
93100
return r
94101
}
@@ -108,7 +115,7 @@ func LoadProviderMetadataFromURL(
108115
return &result
109116
}
110117

111-
switch errors, err := ValidateProviderMetadata(result.Document); {
118+
switch errors, err := ValidateProviderMetadata(doc); {
112119
case err != nil:
113120
result.Messages = []string{
114121
fmt.Sprintf("%s: Validating against JSON schema failed: %v", url, err)}
@@ -119,6 +126,10 @@ func LoadProviderMetadataFromURL(
119126
for _, msg := range errors {
120127
result.Messages = append(result.Messages, strings.ReplaceAll(msg, `%`, `%%`))
121128
}
129+
default:
130+
// Only store in result if validation passed.
131+
result.Document = doc
132+
result.Hash = sum
122133
}
123134

124135
storeLoaded()
@@ -164,7 +175,7 @@ func LoadProviderMetadatasFromSecurity(
164175
for _, url := range urls {
165176
if result := LoadProviderMetadataFromURL(
166177
client, url, already, logging,
167-
); result != nil {
178+
); result.Valid() {
168179
results = append(results, result)
169180
}
170181
}
@@ -224,7 +235,7 @@ func LoadProviderMetadataForDomain(
224235
lg(wellknownResult, wellknownURL)
225236

226237
// We have a candidate.
227-
if wellknownResult != nil {
238+
if wellknownResult.Valid() {
228239
wellknownGood = wellknownResult
229240
}
230241

@@ -233,7 +244,7 @@ func LoadProviderMetadataForDomain(
233244
secResults := LoadProviderMetadatasFromSecurity(
234245
client, secURL, already, logging)
235246

236-
if secResults == nil {
247+
if len(secResults) == 0 {
237248
logging("%s failed to load.", secURL)
238249
} else {
239250
// Filter out the results which are valid.

0 commit comments

Comments
 (0)