From 209af5923255a6576ddc96f15877875984e5da0a Mon Sep 17 00:00:00 2001 From: James Houlahan Date: Thu, 13 Aug 2020 11:27:42 +0200 Subject: [PATCH] refactor: make cookie architecture less crazy --- cmd/Desktop-Bridge/main.go | 2 +- internal/cookies/jar.go | 27 ++++++++++------- internal/cookies/jar_test.go | 8 ++--- internal/cookies/{persister.go => pantry.go} | 31 ++++++-------------- 4 files changed, 31 insertions(+), 37 deletions(-) rename internal/cookies/{persister.go => pantry.go} (73%) diff --git a/cmd/Desktop-Bridge/main.go b/cmd/Desktop-Bridge/main.go index c0b6f9df..bf1bc376 100644 --- a/cmd/Desktop-Bridge/main.go +++ b/cmd/Desktop-Bridge/main.go @@ -275,7 +275,7 @@ func run(context *cli.Context) (contextError error) { // nolint[funlen] cm.SetRoundTripper(cfg.GetRoundTripper(cm, eventListener)) // Cookies must be persisted across restarts. - jar, err := cookies.NewCookieJar(cookies.NewPersister(pref)) + jar, err := cookies.NewCookieJar(pref) if err != nil { logrus.WithError(err).Warn("Could not create cookie jar") } else { diff --git a/internal/cookies/jar.go b/internal/cookies/jar.go index 029bda73..5260f42d 100644 --- a/internal/cookies/jar.go +++ b/internal/cookies/jar.go @@ -30,18 +30,25 @@ import ( // Jar implements http.CookieJar by wrapping the standard library's cookiejar.Jar. // The jar uses a Persister to load cookies at startup and save cookies when set. type Jar struct { - jar *cookiejar.Jar - persister *Persister - locker sync.Locker + jar *cookiejar.Jar + pantry *pantry + locker sync.Locker } -func NewCookieJar(persister *Persister) (*Jar, error) { - jar, err := cookiejar.New(nil) +type GetterSetter interface { + Get(string) string + Set(string, string) +} + +func NewCookieJar(getterSetter GetterSetter) (*Jar, error) { + pantry := &pantry{prefs: getterSetter} + + cookies, err := pantry.loadCookies() if err != nil { return nil, err } - cookies, err := persister.Load() + jar, err := cookiejar.New(nil) if err != nil { return nil, err } @@ -56,9 +63,9 @@ func NewCookieJar(persister *Persister) (*Jar, error) { } return &Jar{ - jar: jar, - persister: persister, - locker: &sync.Mutex{}, + jar: jar, + pantry: pantry, + locker: &sync.Mutex{}, }, nil } @@ -68,7 +75,7 @@ func (j *Jar) SetCookies(u *url.URL, cookies []*http.Cookie) { j.jar.SetCookies(u, cookies) - if err := j.persister.Persist(u.String(), cookies); err != nil { + if err := j.pantry.persistCookies(u.String(), cookies); err != nil { logrus.WithError(err).Warn("Failed to persist cookie") } } diff --git a/internal/cookies/jar_test.go b/internal/cookies/jar_test.go index 0006a496..330aacb7 100644 --- a/internal/cookies/jar_test.go +++ b/internal/cookies/jar_test.go @@ -36,7 +36,7 @@ func TestJar(t *testing.T) { ts := getTestServer(t, testCookies...) defer ts.Close() - jar, err := NewCookieJar(NewPersister(make(testPersister))) + jar, err := NewCookieJar(make(testGetterSetter)) require.NoError(t, err) client := &http.Client{Jar: jar} @@ -86,12 +86,12 @@ func getTestServer(t *testing.T, wantCookies ...testCookie) *httptest.Server { return httptest.NewServer(mux) } -type testPersister map[string]string +type testGetterSetter map[string]string -func (p testPersister) Set(key, value string) { +func (p testGetterSetter) Set(key, value string) { p[key] = value } -func (p testPersister) Get(key string) string { +func (p testGetterSetter) Get(key string) string { return p[key] } diff --git a/internal/cookies/persister.go b/internal/cookies/pantry.go similarity index 73% rename from internal/cookies/persister.go rename to internal/cookies/pantry.go index 84e3f4c9..fccd5e0a 100644 --- a/internal/cookies/persister.go +++ b/internal/cookies/pantry.go @@ -24,39 +24,30 @@ import ( "github.com/ProtonMail/proton-bridge/internal/preferences" ) -type Persister struct { +type pantry struct { prefs GetterSetter } -type GetterSetter interface { - Get(string) string - Set(string, string) -} - -func NewPersister(prefs GetterSetter) *Persister { - return &Persister{prefs: prefs} -} - -func (p *Persister) Persist(url string, cookies []*http.Cookie) error { +func (p *pantry) persistCookies(url string, cookies []*http.Cookie) error { b, err := json.Marshal(cookies) if err != nil { return err } - val, err := p.load() + val, err := p.loadFromJSON() if err != nil { return err } val[url] = string(b) - return p.save(val) + return p.saveToJSON(val) } -func (p *Persister) Load() (map[string][]*http.Cookie, error) { +func (p *pantry) loadCookies() (map[string][]*http.Cookie, error) { res := make(map[string][]*http.Cookie) - val, err := p.load() + val, err := p.loadFromJSON() if err != nil { return nil, err } @@ -76,15 +67,11 @@ func (p *Persister) Load() (map[string][]*http.Cookie, error) { type dataStructure map[string]string -func (p *Persister) load() (dataStructure, error) { +func (p *pantry) loadFromJSON() (dataStructure, error) { b := p.prefs.Get(preferences.CookiesKey) if b == "" { - if err := p.save(make(dataStructure)); err != nil { - return nil, err - } - - return p.load() + return make(dataStructure), nil } var val dataStructure @@ -96,7 +83,7 @@ func (p *Persister) load() (dataStructure, error) { return val, nil } -func (p *Persister) save(val dataStructure) error { +func (p *pantry) saveToJSON(val dataStructure) error { b, err := json.Marshal(val) if err != nil { return err