From ce55d1c5bbbd1b048ea8564a0db6394b03f85f2c Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Fri, 11 Aug 2023 11:01:55 +0200 Subject: [PATCH] Get rid of named return parameters --- dnscrypt-proxy/sources.go | 64 +++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/dnscrypt-proxy/sources.go b/dnscrypt-proxy/sources.go index 1953dc35..fd5f4f61 100644 --- a/dnscrypt-proxy/sources.go +++ b/dnscrypt-proxy/sources.go @@ -40,60 +40,63 @@ type Source struct { prefix string } -func (source *Source) checkSignature(bin, sig []byte) (err error) { - var signature minisign.Signature - if signature, err = minisign.DecodeSignature(string(sig)); err == nil { +// timeNow() is replaced by tests to provide a static value +var timeNow = time.Now + +func (source *Source) checkSignature(bin, sig []byte) error { + signature, err := minisign.DecodeSignature(string(sig)) + if err == nil { _, err = source.minisignKey.Verify(bin, signature) } return err } -// timeNow() can be replaced by tests to provide a static value -var timeNow = time.Now - -func (source *Source) fetchFromCache(now time.Time) (ttl time.Duration, err error) { +func (source *Source) fetchFromCache(now time.Time) (time.Duration, error) { + var err error var bin, sig []byte if bin, err = os.ReadFile(source.cacheFile); err != nil { - return + return 0, err } if sig, err = os.ReadFile(source.cacheFile + ".minisig"); err != nil { - return + return 0, err } if err = source.checkSignature(bin, sig); err != nil { - return + return 0, err } source.bin = bin var fi os.FileInfo if fi, err = os.Stat(source.cacheFile); err != nil { - return + return 0, err } + var ttl time.Duration = 0 if elapsed := now.Sub(fi.ModTime()); elapsed < source.cacheTTL { ttl = source.prefetchDelay - elapsed dlog.Debugf("Source [%s] cache file [%s] is still fresh, next update: %v", source.name, source.cacheFile, ttl) } else { dlog.Debugf("Source [%s] cache file [%s] needs to be refreshed", source.name, source.cacheFile) } - return + return ttl, nil } -func writeSource(f string, bin, sig []byte) (err error) { +func writeSource(f string, bin, sig []byte) error { + var err error var fSrc, fSig *safefile.File if fSrc, err = safefile.Create(f, 0o644); err != nil { - return + return err } defer fSrc.Close() if fSig, err = safefile.Create(f+".minisig", 0o644); err != nil { - return + return err } defer fSig.Close() if _, err = fSrc.Write(bin); err != nil { - return + return err } if _, err = fSig.Write(sig); err != nil { - return + return err } if err = fSrc.Commit(); err != nil { - return + return err } return fSig.Commit() } @@ -129,16 +132,18 @@ func (source *Source) parseURLs(urls []string) { } } -func fetchFromURL(xTransport *XTransport, u *url.URL) (bin []byte, err error) { - bin, _, _, _, err = xTransport.Get(u, "", DefaultTimeout) +func fetchFromURL(xTransport *XTransport, u *url.URL) ([]byte, error) { + bin, _, _, _, err := xTransport.Get(u, "", DefaultTimeout) return bin, err } -func (source *Source) fetchWithCache(xTransport *XTransport, now time.Time) (ttl time.Duration, err error) { +func (source *Source) fetchWithCache(xTransport *XTransport, now time.Time) (time.Duration, error) { + var err error + var ttl time.Duration if ttl, err = source.fetchFromCache(now); err != nil { if len(source.urls) == 0 { dlog.Errorf("Source [%s] cache file [%s] not present and no valid URL", source.name, source.cacheFile) - return + return 0, err } dlog.Debugf("Source [%s] cache file [%s] not present", source.name, source.cacheFile) } @@ -148,7 +153,7 @@ func (source *Source) fetchWithCache(xTransport *XTransport, now time.Time) (ttl }() } if len(source.urls) == 0 || ttl > 0 { - return + return 0, err } ttl = MinimumPrefetchInterval var bin, sig []byte @@ -171,11 +176,11 @@ func (source *Source) fetchWithCache(xTransport *XTransport, now time.Time) (ttl dlog.Debugf("Source [%s] failed signature check using URL [%s]", source.name, srcURL) } if err != nil { - return + return 0, err } source.updateCache(bin, sig, now) ttl = source.prefetchDelay - return + return ttl, nil } // NewSource loads a new source using the given cacheFile and urls, ensuring it has a valid signature @@ -188,11 +193,11 @@ func NewSource( formatStr string, refreshDelay time.Duration, prefix string, -) (source *Source, err error) { +) (*Source, error) { if refreshDelay < DefaultPrefetchDelay { refreshDelay = DefaultPrefetchDelay } - source = &Source{ + source := &Source{ name: name, urls: []*url.URL{}, cacheFile: cacheFile, @@ -211,10 +216,11 @@ func NewSource( return source, err } source.parseURLs(urls) - if _, err = source.fetchWithCache(xTransport, timeNow()); err == nil { + _, err := source.fetchWithCache(xTransport, timeNow()) + if err == nil { dlog.Noticef("Source [%s] loaded", name) } - return + return source, err } // PrefetchSources downloads latest versions of given sources, ensuring they have a valid signature before caching