From bed44e5e87c304d38de910bc66777aa34dad0363 Mon Sep 17 00:00:00 2001 From: "Sascha L. Teichmann" Date: Tue, 26 Jul 2022 12:06:14 +0200 Subject: [PATCH] Do not silence errors when fetching a pmd --- csaf/util.go | 60 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/csaf/util.go b/csaf/util.go index b975bcc..dfcec06 100644 --- a/csaf/util.go +++ b/csaf/util.go @@ -34,18 +34,38 @@ type LoadedProviderMetadata struct { Messages []string } +// defaultLogging generates a logging function if given is nil. +func defaultLogging( + logging func(format string, args ...interface{}), + prefix, suffix string, +) func(format string, args ...interface{}) { + + if logging != nil { + return logging + } + return func(format string, args ...interface{}) { + log.Printf(prefix+format+suffix, args...) + } +} + // LoadProviderMetadataFromURL loads a provider metadata from a given URL. // Returns nil if the document was not found. func LoadProviderMetadataFromURL( client util.Client, url string, already map[string]*LoadedProviderMetadata, + logging func(format string, args ...interface{}), ) *LoadedProviderMetadata { - res, err := client.Get(url) + logging = defaultLogging(logging, "LoadProviderMetadataFromURL: ", "\n") - if err != nil || res.StatusCode != http.StatusOK { - // Treat as not found. + res, err := client.Get(url) + if err != nil { + logging("Fetching %q failed: %v", url, err) + return nil + } + if res.StatusCode != http.StatusOK { + logging("Fetching %q failed: %s (%d)", url, res.Status, res.StatusCode) return nil } @@ -112,12 +132,18 @@ func LoadProviderMetadatasFromSecurity( client util.Client, path string, already map[string]*LoadedProviderMetadata, + logging func(format string, args ...interface{}), ) []*LoadedProviderMetadata { - res, err := client.Get(path) + logging = defaultLogging(logging, "LoadProviderMetadataFromSecurity: ", "\n") - if err != nil || res.StatusCode != http.StatusOK { - // Treat as not found. + res, err := client.Get(path) + if err != nil { + logging("Fetching %q failed: %v", path, err) + return nil + } + if res.StatusCode != http.StatusOK { + logging("Fetching %q failed: %s (%d)", path, res.Status, res.StatusCode) return nil } @@ -136,7 +162,9 @@ func LoadProviderMetadatasFromSecurity( // Load the URLs for _, url := range urls { - if result := LoadProviderMetadataFromURL(client, url, already); result != nil { + if result := LoadProviderMetadataFromURL( + client, url, already, logging, + ); result != nil { results = append(results, result) } } @@ -155,11 +183,7 @@ func LoadProviderMetadataForDomain( logging func(format string, args ...interface{}), ) *LoadedProviderMetadata { - if logging == nil { - logging = func(format string, args ...interface{}) { - log.Printf("LoadProviderMetadataForDomain: "+format+"\n", args...) - } - } + logging = defaultLogging(logging, "LoadProviderMetadataForDomain: ", "\n") // As many URLs may lead to the same content only log once per content. alreadyLogged := map[*LoadedProviderMetadata]string{} @@ -184,7 +208,8 @@ func LoadProviderMetadataForDomain( // check direct path if strings.HasPrefix(domain, "https://") { - result := LoadProviderMetadataFromURL(client, domain, already) + result := LoadProviderMetadataFromURL( + client, domain, already, logging) lg(result, domain) return result } @@ -194,7 +219,8 @@ func LoadProviderMetadataForDomain( // First try well-know path wellknownURL := "https://" + domain + "/.well-known/csaf/provider-metadata.json" - wellknownResult := LoadProviderMetadataFromURL(client, wellknownURL, already) + wellknownResult := LoadProviderMetadataFromURL( + client, wellknownURL, already, logging) lg(wellknownResult, wellknownURL) // We have a candidate. @@ -204,7 +230,8 @@ func LoadProviderMetadataForDomain( // Next load the PMDs from security.txt secURL := "https://" + domain + "/.well-known/security.txt" - secResults := LoadProviderMetadatasFromSecurity(client, secURL, already) + secResults := LoadProviderMetadatasFromSecurity( + client, secURL, already, logging) if secResults == nil { logging("%s failed to load.", secURL) @@ -259,7 +286,8 @@ func LoadProviderMetadataForDomain( // Last resort: fall back to DNS. dnsURL := "https://csaf.data.security." + domain - dnsResult := LoadProviderMetadataFromURL(client, dnsURL, already) + dnsResult := LoadProviderMetadataFromURL( + client, dnsURL, already, logging) lg(dnsResult, dnsURL) return dnsResult }