Port changes from #2334

I'm not sure I follow, but I trust @lifenjoiner

Fixes #2334
This commit is contained in:
Frank Denis 2023-08-11 00:17:46 +02:00
parent 5085a22903
commit 2675d73b13
4 changed files with 32 additions and 36 deletions

View File

@ -631,7 +631,7 @@ func ConfigLoad(proxy *Proxy, flags *ConfigFlags) error {
proxy.anonDirectCertFallback = config.AnonymizedDNS.DirectCertFallback proxy.anonDirectCertFallback = config.AnonymizedDNS.DirectCertFallback
if len(config.TLSKeyLogFile) > 0 { if len(config.TLSKeyLogFile) > 0 {
f, err := os.OpenFile(config.TLSKeyLogFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) f, err := os.OpenFile(config.TLSKeyLogFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600)
if err != nil { if err != nil {
dlog.Fatalf("Unable to create key log file [%s]: [%s]", config.TLSKeyLogFile, err) dlog.Fatalf("Unable to create key log file [%s]: [%s]", config.TLSKeyLogFile, err)
} }
@ -892,8 +892,8 @@ func (config *Config) loadSource(proxy *Proxy, cfgSourceName string, cfgSource *
if cfgSource.FormatStr == "" { if cfgSource.FormatStr == "" {
cfgSource.FormatStr = "v2" cfgSource.FormatStr = "v2"
} }
if cfgSource.RefreshDelay <= 0 { if cfgSource.RefreshDelay < 24 {
cfgSource.RefreshDelay = 72 cfgSource.RefreshDelay = 24
} else if cfgSource.RefreshDelay > 168 { } else if cfgSource.RefreshDelay > 168 {
cfgSource.RefreshDelay = 168 cfgSource.RefreshDelay = 168
} }

View File

@ -696,9 +696,9 @@ format = 'tsv'
## If the `urls` property is missing, cache files and valid signatures ## If the `urls` property is missing, cache files and valid signatures
## must already be present. This doesn't prevent these cache files from ## must already be present. This doesn't prevent these cache files from
## expiring after `refresh_delay` hours. ## expiring after `refresh_delay` hours.
## Cache freshness is checked every 24 hours, so values for 'refresh_delay' ## `refreshed_delay` must be in the [24..168] interval.
## of less than 24 hours will have no effect. ## The minimum delay of 24 hours (1 day) avoids unnecessary requests to servers.
## A maximum delay of 168 hours (1 week) is imposed to ensure cache freshness. ## The maximum delay of 168 hours (1 week) ensures cache freshness.
[sources] [sources]

View File

@ -23,21 +23,18 @@ const (
SourceFormatV2 = iota SourceFormatV2 = iota
) )
const ( const MinimumPrefetchInterval time.Duration = 10 * time.Minute
DefaultPrefetchDelay time.Duration = 24 * time.Hour
MinimumPrefetchInterval time.Duration = 10 * time.Minute
)
type Source struct { type Source struct {
name string name string
urls []*url.URL urls []*url.URL
bin []byte // copy of the file content - there's something wrong in our logic, we shouldn't need to keep that in memory bin []byte // copy of the file content - there's something wrong in our logic, we shouldn't need to keep that in memory
minisignKey *minisign.PublicKey minisignKey *minisign.PublicKey
cacheFile string cacheFile string
prefix string prefix string
cacheTTL, prefetchDelay time.Duration cacheTTL time.Duration
refresh time.Time refresh time.Time
format SourceFormat format SourceFormat
} }
func (source *Source) checkSignature(bin, sig []byte) (err error) { func (source *Source) checkSignature(bin, sig []byte) (err error) {
@ -68,8 +65,8 @@ func (source *Source) fetchFromCache(now time.Time) (remaining time.Duration, er
return return
} }
if elapsed := now.Sub(fi.ModTime()); elapsed < source.cacheTTL { if elapsed := now.Sub(fi.ModTime()); elapsed < source.cacheTTL {
remaining = source.prefetchDelay - elapsed remaining = source.cacheTTL - elapsed
dlog.Debugf("Source [%s] cache file [%s] is still fresh, next update: %v min", source.name, source.cacheFile, math.Round(remaining.Minutes())) dlog.Debugf("Source [%s] cache file [%s] is still fresh, next update in %v min", source.name, source.cacheFile, math.Round(remaining.Minutes()))
} else { } else {
dlog.Debugf("Source [%s] cache file [%s] needs to be refreshed", source.name, source.cacheFile) dlog.Debugf("Source [%s] cache file [%s] needs to be refreshed", source.name, source.cacheFile)
} }
@ -174,7 +171,7 @@ func (source *Source) fetchWithCache(xTransport *XTransport, now time.Time) (tim
return MinimumPrefetchInterval, err return MinimumPrefetchInterval, err
} }
source.updateCache(bin, sig, now) source.updateCache(bin, sig, now)
remaining = source.prefetchDelay remaining = source.cacheTTL
source.refresh = now.Add(remaining) source.refresh = now.Add(remaining)
return remaining, nil return remaining, nil
} }
@ -190,16 +187,12 @@ func NewSource(
refreshDelay time.Duration, refreshDelay time.Duration,
prefix string, prefix string,
) (source *Source, err error) { ) (source *Source, err error) {
if refreshDelay < DefaultPrefetchDelay {
refreshDelay = DefaultPrefetchDelay
}
source = &Source{ source = &Source{
name: name, name: name,
urls: []*url.URL{}, urls: []*url.URL{},
cacheFile: cacheFile, cacheFile: cacheFile,
cacheTTL: refreshDelay, cacheTTL: refreshDelay,
prefetchDelay: DefaultPrefetchDelay, prefix: prefix,
prefix: prefix,
} }
if formatStr == "v2" { if formatStr == "v2" {
source.format = SourceFormatV2 source.format = SourceFormatV2

View File

@ -42,6 +42,8 @@ const (
TestStatePathErr // unparseable path to files (download only) TestStatePathErr // unparseable path to files (download only)
) )
const DefaultPrefetchDelay time.Duration = 24 * time.Hour
type SourceTestData struct { type SourceTestData struct {
n int // subtest counter n int // subtest counter
xTransport *XTransport xTransport *XTransport
@ -350,7 +352,7 @@ func prepSourceTestDownload(
} }
if e.success { if e.success {
e.err = "" e.err = ""
e.delay = DefaultPrefetchDelay e.delay = e.Source.cacheTTL
} else { } else {
e.delay = MinimumPrefetchInterval e.delay = MinimumPrefetchInterval
} }
@ -371,7 +373,7 @@ func setupSourceTestCase(t *testing.T, d *SourceTestData, i int,
} }
e.Source = &Source{ e.Source = &Source{
name: id, urls: []*url.URL{}, format: SourceFormatV2, minisignKey: d.key, name: id, urls: []*url.URL{}, format: SourceFormatV2, minisignKey: d.key,
cacheFile: e.cachePath, cacheTTL: DefaultPrefetchDelay * 3, prefetchDelay: DefaultPrefetchDelay, cacheFile: e.cachePath, cacheTTL: DefaultPrefetchDelay * 3,
} }
if cacheTest != nil { if cacheTest != nil {
prepSourceTestCache(t, d, e, d.sources[i], *cacheTest) prepSourceTestCache(t, d, e, d.sources[i], *cacheTest)
@ -405,9 +407,9 @@ func TestNewSource(t *testing.T) {
refreshDelay time.Duration refreshDelay time.Duration
e *SourceTestExpect e *SourceTestExpect
}{ }{
{"", "", 0, &SourceTestExpect{err: " ", Source: &Source{name: "short refresh delay", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay, prefetchDelay: DefaultPrefetchDelay, prefix: ""}}}, {"", "", 0, &SourceTestExpect{err: " ", Source: &Source{name: "short refresh delay", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay, prefix: ""}}},
{"v1", d.keyStr, DefaultPrefetchDelay * 2, &SourceTestExpect{err: "Unsupported source format", Source: &Source{name: "old format", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 2, prefetchDelay: DefaultPrefetchDelay}}}, {"v1", d.keyStr, DefaultPrefetchDelay * 2, &SourceTestExpect{err: "Unsupported source format", Source: &Source{name: "old format", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 2}}},
{"v2", "", DefaultPrefetchDelay * 3, &SourceTestExpect{err: "Invalid encoded public key", Source: &Source{name: "invalid public key", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 3, prefetchDelay: DefaultPrefetchDelay}}}, {"v2", "", DefaultPrefetchDelay * 3, &SourceTestExpect{err: "Invalid encoded public key", Source: &Source{name: "invalid public key", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 3}}},
} { } {
t.Run(tt.e.Source.name, func(t *testing.T) { t.Run(tt.e.Source.name, func(t *testing.T) {
got, err := NewSource( got, err := NewSource(
@ -478,6 +480,7 @@ func TestPrefetchSources(t *testing.T) {
s := &Source{} s := &Source{}
*s = *e.Source *s = *e.Source
s.bin = nil s.bin = nil
s.refresh = d.timeNow
sources = append(sources, s) sources = append(sources, s)
expects = append(expects, e) expects = append(expects, e)
} }